Initial checkin

Initial checkin, still pretty rough around the edges.
This commit is contained in:
Will Scullin 2013-10-10 11:03:07 -07:00
parent 55a0c68165
commit 4d80f9f28e
44 changed files with 26833 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.*~

11
Makefile Normal file
View File

@ -0,0 +1,11 @@
default:
$(MAKE) -C js
index:
./scripts/index.pl > json/disks/index.js
clean:
$(MAKE) -C js clean
lint:
$(MAKE) -C js lint

236
about.html Normal file
View File

@ -0,0 +1,236 @@
<!DOCTYPE html>
<!-- -*- mode: HTML; indent-tabs-mode: nil -*- -->
<!-- Copyright 2010 Will Scullin -->
<html>
<head>
<base href="/apple" />
<meta charset="utf-8" />
<meta name="keywords" content="apple2,apple,ii,javascript,emulator,html5" />
<link rel="shortcut icon" href="logoicon.png" />
<link rel="stylesheet" type="text/css" href="css/apple2.css" />
<title>About Apple ][js/Apple //jse</title>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-19205057-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<meta property="og:title" content="About Apple ][js" />
<meta property="og:type" content="website" />
<meta property="og:description" content="Apple ][js is an Apple ][ (or Apple II or Apple2) emulator written using only JavaScript and HTML5." />
<meta property="og:url" content="http://www.scullinsteel.com/apple2/about.html" />
<meta property="og:image" content="http://www.scullinsteel.com/apple2/img/image.png" />
<meta property="fb:admins" content="700585391" />
</head>
<body id="about">
<div style="text-align: center">
<span class="motter" style="font-size: 2em">Apple ][js and //jse</span>
</div>
<div style="max-width: 800px; margin: auto">
<h2>What is this?</h2>
<span class="motter"><a href="../apple2/">Apple ][js</a></span> and
<span class="motter"><a href="../apple//e">Apple //jse</a></span>
are Apple ][ and Apple //e emulators written entirely in JavaScript
and HTML5.
<h2>Updates (2013-07-04)</h2>
<ul>
<li><h3>RAMFactor Emulation (//jse)</h3>
I now simulate having a 1 Megabyte RAMFactor card in slot 2.
<li><h3>Thunderclock Emulation (//jse)</h3>
There is cursory emulation of the Thunderclock card, enough
to keep ProDOS applications from asking you to enter the date
all the time. ProDOS attempts to guess the year from the month,
the day and the day of the week, something that needs to be
patched every 6 years. This means newer versions think it's 1996,
older versions are stuck in the 80s.
<li><h3>Firefox Nightly Joystick Support</h3>
Joystick support has yet to officially land, but the latest
nightlies support the gamepad API.
</li>
</ul>
<h2>Updates (2013-03-20)</h2>
<ul>
<li><h3>Animation Frames</h3>
I've switched from using setInterval() to requestAnimationFrame() where
supported. This, in conjunction with the graphics re-write, seems
to smooth performance and provide a more stable CPU speed.
<li><h3>Graphics Re-Write</h3>
This (third) re-write of the graphics system should improve performance
with graphics intensive programs. Rather than rendering each graphics
update as it happens, updates are rendered each animation frame.
</li>
</ul>
<h2>Updates (2013-03-12)</h2>
<ul>
<li><h3>Apple //e</h3>
After much flailing, and much staring at MMU emulation code in
despair, I've finally published my Apple //e emulator. It's probably
a little more rough than I'd hoped, but it has a lot of features
that I really wanted to get into it, like basic double hires support,
and it uses the enhanced Apple //e ROMs.
</li>
</ul>
<h2>Updates (2013-02-25)</h2>
<ul>
<li><h3>Joystick Support</h3>
Chrome only so far, the nascent gamepad API has finally allowed me
to add basic joystick support. I can now re-live my glory days
of Skyfox.
</li>
<li><h3>Re-written CPU emulator</h3>
I finally got around to applying some of the many lessons I learned
along the way writing my first CPU emulator in Javascript. The
last re-working gave me about a 100% performance gain.
</li>
<li><h3>Finally Fixed Oregon Trail</h3>
This seems to have been a major disappointment for many people.
I was able to make it as a banker, but I'm embarassed to reveal my
score.
</li>
<li><h3>Competition</h3>
Now in addition to
<a href="http://www.megidish.net/apple2js/">Gil Megidish's</a>
Apple2JS, there's a couple of new kids on the block, including
<a href="http://porkrind.org/a2/">David Caldwell's</a> Apple II+
emulator where he's put a lot more thought into the graphics rendering
than I have, and
<a href="https://github.com/nicholasbs/appletoo">appletoo</a>,
which I just stumbled across while looking for David's emulator and
haven't had much time to look at.
</li>
</ul>
<h2>Requirements</h2>
<ul>
<li><h3>A Browser with HTML5 Support</h3>
The most recent versions of
<a href="http://www.google.com/chrome/" target="_blank">
Google Chrome</a>,
<a href="http://www.apple.com/safari/" target="_blank">
Safari</a>,
<a href="http://www.firefox.com/" target="_blank" >
Firefox</a>, and
<a href="http://www.opera.com/" target="_blank">
Opera</a>
all seem to work reasonably well these days, although
variations in HTML5 support pop up, and occasionally a major release
will move things around out from under me.
IE prior to 9 lacks canvas tag support and is unsupported.
<a href="http://windows.microsoft.com/ie9">IE 9+</a> renders nicely on
a modern machine.<br/>
<br />
In updating this section I realized just how long
I've been doing this, since I used to have to specify Firefox 3+ and
Google Chrome 5+, and I'm now running Chrome 23 and Firefox 19.
</li>
<li><h3>Basic Knowledge of the Apple ][</h3>
If you don't know how to use an Apple ][, this won't be much fun for
you.
</li>
</ul>
<h2>Known Limitations</h2>
<ul>
<li><h3>Lame Audio</h3>
<span class="motter">Apple ][js</span>
is written entirely using HTML5 and JavaScript, so I've avoiding using
any Flash audio plugins. Most reputable browsers
now provide some sort of audio API, but no standard really seems to have
emerged. I should probably add a volume control.
</li>
<li><h3>Poor Printer Support</h3>
I currently only support sending text characters to a separate window.
</li>
</ul>
<h2>Acknowlegements</h2>
<ul>
<li>
<h3>I'm using the following libraries:</h3>
<ul>
<li>
<a href="http://jquery.com">jQuery</a> and
<a href="http://jqueryui.com">jQuery UI</a>
</li>
<li>
Base64 Utilities via
<a href="http://kevin.vanzonneveld.net/">KvZ</a>
</li>
<li>
LED graphics from <a href="http://modernl.com/">Modern Life</a>.
</li>
</ul>
</li>
<li>
<h3>I heavily referenced:</h3>
<ul>
<li>
<a href="http://www.scribd.com/doc/200679/Beneath-Apple-DOS-By-Don-Worth-and-Pieter-Lechner">
<i>Beneath Apple DOS</i>
</a>
by Don Worth and Pieter Lechner
</li>
<li>
<i>Inside the Apple //e</i> by Gary B. Little
</li>
<li>
<a href="http://apple2.org.za/gswv/a2zine/GS.WorldView/Resources/DOS.3.3.ANATOMY/">
<i>DOS 3.3 Anatomy</i>
</a>
</li>
<li>
<a href="http://www.doc.ic.ac.uk/~ih/doc/stepper/others/example3/diskii_specs.html">
<i>Apple II Disk Drive Article</i>
</a>
by Neil Parker
</li>
<li>
<a href="http://6502.org/">6502.org</a>
</li>
<li>
The
<a href="http://www.faqs.org/faqs/apple2/programmerfaq/part1/">
comp.sys.apple2.programmer
</a>
FAQ
</li>
</ul>
</li>
<li>
<h3>And special thanks to:</h3>
<ul>
<li>
<a href="http://adtpro.sourceforge.net/">ADTPro</a>
for allowing me to pull some of my circa
1980 programming efforts off some ancient floppies.
</li>
<li>
<a href="http://kegs.sourceforge.net/">KEGS</a>, because at some
point I got so tired of futzing with ADC/SBC code I just ported
the KEGS C code for those opcodes to Javascript so I could stop
worrying about it.
</li>
<li>
<a href="http://apple2history.org/">Apple II History</a>,
for a lovely, informative site.
</li>
<li>
<a href="http://www.megidish.net/apple2js/">Gil Megidish</a>,
for the kick in the pants to finally post my version, once I
realized there was, in fact, another apple2js in the world.
</li>
</ul>
</li>
<h2>Contact</h2>
<ul>
<li>
<a href="mailto:apple2js@scullinsteel.com">apple2js@scullinsteel.com</a>
</li>
</ul>
</div>
</body>
</html>

1076
apple2js.html Normal file

File diff suppressed because it is too large Load Diff

422
css/apple2.css Normal file
View File

@ -0,0 +1,422 @@
/* Copyright 2010-2013 Will Scullin */
.disklabel {
color: #000;
font-weight: bold;
}
img {
border: none;
}
img#badge {
padding: 0px 12px;
cursor: pointer;
}
h1#subtitle {
margin: 0px;
padding: 3px 0px 0px 10px;
color: black;
font-family: "Adobe Garamond Pro",Garamond,Times;
font-size: 13px;
font-weight: normal;
}
.motter {
font-family: "Motter Tektura";
font-size: 12px;
}
input[type="button"] {
width: 75px;
}
input[type="text"] {
width: 40px;
}
body {
margin: 16px 0px;
font-size: 10px;
background-color: #c4c1a0; /* Pantone 453 */
color: #fff;
}
#display {
margin: 5px 0px;
}
.overscan {
margin: auto;
position: relative;
background-color: black;
padding: 16px;
width: 560px;
height: 384px;
border: 6px inset #f0edd0;
border-radius: 10px;
}
#power {
padding: 2px;
border: 1px inset #888;
}
.disk {
margin: 5px;
float: left;
background-image: url(red-off-16.png);
width: 16px;
height: 16px;
}
.disklabel {
font-size: 11px;
font-family: sans-serif;
}
.disksave {
display: none;
}
.code {
font-family: Courier;
font-size: 14px;
white-space: pre;
}
table.debug_page {
padding: 0px;
font-family: Courier;
font-size: 10px;
border-collapse: collapse;
}
th {
background-color: #ccc;
}
.inset {
width: 594px;
border-radius: 6px;
border: 3px inset #f0edd0;
padding: 6px;
margin: 10px 0px;
}
#speed {
margin: 9px 0px;
width: 200px;
}
#khz {
margin-right: 4px;
padding: 4px;
float: left;
font-family: Courier;
font-size: 12px;
width: 60px;
height: 15px;
text-align: right;
background: #000;
color: #0f0;
border: 2px inset #888;
border-radius: 4px;
}
canvas {
position: absolute;
top: 16px;
left: 16px;
cursor: crosshair;
width: 560px;
height: 384px;
image-rendering: -moz-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
}
:-webkit-full-screen {
width: 100%;
height: 100%;
}
/*
@media screen and (min-device-width:1120px) {
:-webkit-full-screen {
background: #000;
}
:-moz-full-screen .overscan {
border: 0px none !important;
width: 1120px;
height: 768px;
margin: auto;
}
:-webkit-full-screen .overscan {
border: 0px none !important;
width: 1120px;
height: 768px;
}
:-moz-full-screen canvas {
width: 1120px;
height: 768px;
}
:-webkit-full-screen canvas {
width: 1120px;
height: 768px;
}
:-webkit-full-screen #scanlines {
width: 1120px;
height: 768px;
}
:-moz-full-screen #scanlines {
width: 1120px;
height: 768px;
}
}
*/
#scanlines {
position: absolute;
top: 16px;
left: 16px;
cursor: crosshair;
z-index: 1;
width: 560px;
height: 384px;
}
#page1 {
visibility: display;
}
#page2 {
visibility: hidden;
}
#about iframe {
border: 1px inset #666;
width: 99%;
height: 99%;
}
#about {
padding: 16px;
margin: 0px;
font-family: "Adobe Garamond Pro",Garamond,Times;
font-size: 14px;
background-color: #fff;
color: #000;
}
#about a {
background-color: #fff;
color: #000;
}
#load select {
width: 250px;
height: 300px;
}
#keyboard .row {
display: block;
margin: 0px;
padding: 0px;
height: 42px;
font-family: Helvetica;
width: 605px;
}
#keyboard .row0 {
margin-left: 20px;
}
#keyboard .row2 {
margin-left: 10px;
}
#keyboard .row3 {
margin-left: 10px;
}
#keyboard .row4 {
margin-left: 10px;
}
.apple2e #keyboard .row0 {
margin-left: 0px;
}
.apple2e #keyboard .row2 {
margin-left: 0px;
}
.apple2e #keyboard .row3 {
margin-left: 0px;
}
.apple2e #keyboard .row4 {
margin-left: 0px;
}
#keyboard .key {
display: block;
float: left;
margin: 0px;
padding: 0px;
width: 32px;
height: 32px;
background-color: #44372C;
color: white;
vertical-align: bottom;
text-align: center;
position: relative;
border: 5px outset #66594E;
border-radius: 5px;
cursor: pointer;
}
#keyboard .pressed {
background-color: #22150A;
border: 5px outset #44372C;
}
#keyboard .key div {
border-radius: 3px;
position: absolute;
bottom: 0px;
width: 100%;
text-align: center;
}
#keyboard .vcenter div {
bottom: 10px;
}
#keyboard .vcenter2 div {
bottom: 5px;
}
#keyboard .key span {
font-size: 14px;
}
#keyboard .key span.small {
font-size: 7px;
}
#keyboard .key-SHIFT {
width: 53px;
}
#keyboard .active {
color: #4f4;
}
#keyboard .key-RETURN {
width: 52px;
}
#keyboard .key-DELETE {
width: 47px;
}
#keyboard .key-TAB {
width: 47px;
}
#keyboard .key-POWER {
width: 38px;
height: 38px;
border: 2px groove black;
background-color: #ffd;
color: black;
border-radius: 2px;
}
#keyboard .key-POWER div {
bottom: 15px;
}
#keyboard .key-nbsp {
margin-left: 62px;
width: 330px;
}
.apple2e table#display {
margin: 5px;
}
.apple2e .inset {
width: 604px;
}
.apple2e #keyboard .key-CTRL {
width: 60px;
}
.apple2e #keyboard .key-RETURN {
width: 60px;
}
.apple2e #keyboard .key-SHIFT {
width: 81px;
}
.apple2e #keyboard .key-nbsp {
margin-left: 0px;
width: 215px;
}
#keyboard .key-POW {
width: 38px;
height: 38px;
border: 2px groove black;
background-color: #ffd;
color: black;
border-radius: 2px;
}
#keyboard .key-POW div {
bottom: 15px;
}
#keyboard .key-POW span {
background: #4f4;
color: #4f4;
}
#keyboard .key-OPEN_APPLE div {
background-image: url(../img/open-apple24.png);
width: 24px;
height: 24px;
bottom: 1px;
left: 4px;
}
#keyboard .key-OPEN_APPLE span {
display: none;
}
#keyboard .key-OPEN_APPLE.active div {
background-image: url(../img/open-apple24-green.png);
}
#keyboard .key-CLOSED_APPLE div {
background-image: url(../img/closed-apple24.png);
width: 24px;
height: 24px;
bottom: 1px;
left: 4px;
}
#keyboard .key-CLOSED_APPLE.active div {
background-image: url(../img/closed-apple24-green.png);
}
#keyboard .key-CLOSED_APPLE span {
display: none;
}

BIN
css/red-off-16.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

BIN
css/red-on-16.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 869 B

BIN
img/badge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

1
js/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
all*.js

8219
js/6502test.js Normal file

File diff suppressed because it is too large Load Diff

35
js/Makefile Normal file
View File

@ -0,0 +1,35 @@
COMPRESS = java -jar $(HOME)/bin/compiler.jar --warning_level QUIET
JSLINT = jshint
JSFILES = copyright.js util.js prefs.js ram.js langcard.js fpbasic.js apple2char.js canvas2.js apple2io.js parallel.js ramfactor.js disk2.js cpu6502.js base64.js
JSFILES2E = copyright.js util.js prefs.js ram.js mmu.js apple2e.js apple2e-enhanced.js apple2echar.js canvas2e.js apple2io.js parallel.js slot3.js ramfactor.js thunderclock.js disk2.js cpu6502.js base64.js
ALLJS = ${JSFILES} ${JSFILES2E}
CHECKEDJS := $(patsubst %.js,.checked-%.js,${ALLJS})
default: all.min.js all2e.min.js
$(MAKE) -C ui
all.min.js: all.js
$(COMPRESS) < all.js > all.min.js
all2e.min.js: all2e.js
$(COMPRESS) < all2e.js > all2e.min.js
all.js: $(JSFILES) Makefile
cat $(JSFILES) > all.js
all2e.js: $(JSFILES2E) Makefile
cat $(JSFILES2E) > all2e.js
clean:
$(RM) -f all.js all.min.js all2e.js all2e.min.js .checked-*
$(MAKE) -C ui clean
lint: $(CHECKEDJS)
$(MAKE) -C ui lint
.checked-%.js: %.js
$(JSLINT) $<
@touch $@

262
js/apple2char.js Normal file
View File

@ -0,0 +1,262 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*exported charset */
var charset = [
0x00,0x1c,0x22,0x2a,0x2e,0x2c,0x20,0x1e,
0x00,0x08,0x14,0x22,0x22,0x3e,0x22,0x22,
0x00,0x3c,0x22,0x22,0x3c,0x22,0x22,0x3c,
0x00,0x1c,0x22,0x20,0x20,0x20,0x22,0x1c,
0x00,0x3c,0x22,0x22,0x22,0x22,0x22,0x3c,
0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x3e,
0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x20,
0x00,0x1e,0x20,0x20,0x20,0x26,0x22,0x1e,
0x00,0x22,0x22,0x22,0x3e,0x22,0x22,0x22,
0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x1c,
0x00,0x02,0x02,0x02,0x02,0x02,0x22,0x1c,
0x00,0x22,0x24,0x28,0x30,0x28,0x24,0x22,
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,
0x00,0x22,0x36,0x2a,0x2a,0x22,0x22,0x22,
0x00,0x22,0x22,0x32,0x2a,0x26,0x22,0x22,
0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c,
0x00,0x3c,0x22,0x22,0x3c,0x20,0x20,0x20,
0x00,0x1c,0x22,0x22,0x22,0x2a,0x24,0x1a,
0x00,0x3c,0x22,0x22,0x3c,0x28,0x24,0x22,
0x00,0x1c,0x22,0x20,0x1c,0x02,0x22,0x1c,
0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1c,
0x00,0x22,0x22,0x22,0x22,0x22,0x14,0x08,
0x00,0x22,0x22,0x22,0x2a,0x2a,0x36,0x22,
0x00,0x22,0x22,0x14,0x08,0x14,0x22,0x22,
0x00,0x22,0x22,0x14,0x08,0x08,0x08,0x08,
0x00,0x3e,0x02,0x04,0x08,0x10,0x20,0x3e,
0x00,0x3e,0x30,0x30,0x30,0x30,0x30,0x3e,
0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x00,
0x00,0x3e,0x06,0x06,0x06,0x06,0x06,0x3e,
0x00,0x00,0x00,0x08,0x14,0x22,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,
0x00,0x14,0x14,0x14,0x00,0x00,0x00,0x00,
0x00,0x14,0x14,0x3e,0x14,0x3e,0x14,0x14,
0x00,0x08,0x1e,0x28,0x1c,0x0a,0x3c,0x08,
0x00,0x30,0x32,0x04,0x08,0x10,0x26,0x06,
0x00,0x10,0x28,0x28,0x10,0x2a,0x24,0x1a,
0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,
0x00,0x08,0x04,0x02,0x02,0x02,0x04,0x08,
0x00,0x08,0x2a,0x1c,0x08,0x1c,0x2a,0x08,
0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,
0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,
0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x00,
0x00,0x1c,0x22,0x26,0x2a,0x32,0x22,0x1c,
0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x1c,
0x00,0x1c,0x22,0x02,0x0c,0x10,0x20,0x3e,
0x00,0x3e,0x02,0x04,0x0c,0x02,0x22,0x1c,
0x00,0x04,0x0c,0x14,0x24,0x3e,0x04,0x04,
0x00,0x3e,0x20,0x3c,0x02,0x02,0x22,0x1c,
0x00,0x0e,0x10,0x20,0x3c,0x22,0x22,0x1c,
0x00,0x3e,0x02,0x04,0x08,0x10,0x10,0x10,
0x00,0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,
0x00,0x1c,0x22,0x22,0x1e,0x02,0x04,0x38,
0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,
0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x10,
0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,
0x00,0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,
0x00,0x10,0x08,0x04,0x02,0x04,0x08,0x10,
0x00,0x1c,0x22,0x04,0x08,0x08,0x00,0x08,
0x80,0x9c,0xa2,0xaa,0xae,0xac,0xa0,0x9e,
0x80,0x88,0x94,0xa2,0xa2,0xbe,0xa2,0xa2,
0x80,0xbc,0xa2,0xa2,0xbc,0xa2,0xa2,0xbc,
0x80,0x9c,0xa2,0xa0,0xa0,0xa0,0xa2,0x9c,
0x80,0xbc,0xa2,0xa2,0xa2,0xa2,0xa2,0xbc,
0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xbe,
0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xa0,
0x80,0x9e,0xa0,0xa0,0xa0,0xa6,0xa2,0x9e,
0x80,0xa2,0xa2,0xa2,0xbe,0xa2,0xa2,0xa2,
0x80,0x9c,0x88,0x88,0x88,0x88,0x88,0x9c,
0x80,0x82,0x82,0x82,0x82,0x82,0xa2,0x9c,
0x80,0xa2,0xa4,0xa8,0xb0,0xa8,0xa4,0xa2,
0x80,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xbe,
0x80,0xa2,0xb6,0xaa,0xaa,0xa2,0xa2,0xa2,
0x80,0xa2,0xa2,0xb2,0xaa,0xa6,0xa2,0xa2,
0x80,0x9c,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,
0x80,0xbc,0xa2,0xa2,0xbc,0xa0,0xa0,0xa0,
0x80,0x9c,0xa2,0xa2,0xa2,0xaa,0xa4,0x9a,
0x80,0xbc,0xa2,0xa2,0xbc,0xa8,0xa4,0xa2,
0x80,0x9c,0xa2,0xa0,0x9c,0x82,0xa2,0x9c,
0x80,0xbe,0x88,0x88,0x88,0x88,0x88,0x88,
0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,
0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0x94,0x88,
0x80,0xa2,0xa2,0xa2,0xaa,0xaa,0xb6,0xa2,
0x80,0xa2,0xa2,0x94,0x88,0x94,0xa2,0xa2,
0x80,0xa2,0xa2,0x94,0x88,0x88,0x88,0x88,
0x80,0xbe,0x82,0x84,0x88,0x90,0xa0,0xbe,
0x80,0xbe,0xb0,0xb0,0xb0,0xb0,0xb0,0xbe,
0x80,0x80,0xa0,0x90,0x88,0x84,0x82,0x80,
0x80,0xbe,0x86,0x86,0x86,0x86,0x86,0xbe,
0x80,0x80,0x80,0x88,0x94,0xa2,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xbe,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x88,0x88,0x88,0x88,0x88,0x80,0x88,
0x80,0x94,0x94,0x94,0x80,0x80,0x80,0x80,
0x80,0x94,0x94,0xbe,0x94,0xbe,0x94,0x94,
0x80,0x88,0x9e,0xa8,0x9c,0x8a,0xbc,0x88,
0x80,0xb0,0xb2,0x84,0x88,0x90,0xa6,0x86,
0x80,0x90,0xa8,0xa8,0x90,0xaa,0xa4,0x9a,
0x80,0x88,0x88,0x88,0x80,0x80,0x80,0x80,
0x80,0x88,0x90,0xa0,0xa0,0xa0,0x90,0x88,
0x80,0x88,0x84,0x82,0x82,0x82,0x84,0x88,
0x80,0x88,0xaa,0x9c,0x88,0x9c,0xaa,0x88,
0x80,0x80,0x88,0x88,0xbe,0x88,0x88,0x80,
0x80,0x80,0x80,0x80,0x80,0x88,0x88,0x90,
0x80,0x80,0x80,0x80,0xbe,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x88,
0x80,0x80,0x82,0x84,0x88,0x90,0xa0,0x80,
0x80,0x9c,0xa2,0xa6,0xaa,0xb2,0xa2,0x9c,
0x80,0x88,0x98,0x88,0x88,0x88,0x88,0x9c,
0x80,0x9c,0xa2,0x82,0x8c,0x90,0xa0,0xbe,
0x80,0xbe,0x82,0x84,0x8c,0x82,0xa2,0x9c,
0x80,0x84,0x8c,0x94,0xa4,0xbe,0x84,0x84,
0x80,0xbe,0xa0,0xbc,0x82,0x82,0xa2,0x9c,
0x80,0x8e,0x90,0xa0,0xbc,0xa2,0xa2,0x9c,
0x80,0xbe,0x82,0x84,0x88,0x90,0x90,0x90,
0x80,0x9c,0xa2,0xa2,0x9c,0xa2,0xa2,0x9c,
0x80,0x9c,0xa2,0xa2,0x9e,0x82,0x84,0xb8,
0x80,0x80,0x80,0x88,0x80,0x88,0x80,0x80,
0x80,0x80,0x80,0x88,0x80,0x88,0x88,0x90,
0x80,0x84,0x88,0x90,0xa0,0x90,0x88,0x84,
0x80,0x80,0x80,0xbe,0x80,0xbe,0x80,0x80,
0x80,0x90,0x88,0x84,0x82,0x84,0x88,0x90,
0x80,0x9c,0xa2,0x84,0x88,0x88,0x80,0x88,
0x00,0x1c,0x22,0x2a,0x2e,0x2c,0x20,0x1e,
0x00,0x08,0x14,0x22,0x22,0x3e,0x22,0x22,
0x00,0x3c,0x22,0x22,0x3c,0x22,0x22,0x3c,
0x00,0x1c,0x22,0x20,0x20,0x20,0x22,0x1c,
0x00,0x3c,0x22,0x22,0x22,0x22,0x22,0x3c,
0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x3e,
0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x20,
0x00,0x1e,0x20,0x20,0x20,0x26,0x22,0x1e,
0x00,0x22,0x22,0x22,0x3e,0x22,0x22,0x22,
0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x1c,
0x00,0x02,0x02,0x02,0x02,0x02,0x22,0x1c,
0x00,0x22,0x24,0x28,0x30,0x28,0x24,0x22,
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,
0x00,0x22,0x36,0x2a,0x2a,0x22,0x22,0x22,
0x00,0x22,0x22,0x32,0x2a,0x26,0x22,0x22,
0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c,
0x00,0x3c,0x22,0x22,0x3c,0x20,0x20,0x20,
0x00,0x1c,0x22,0x22,0x22,0x2a,0x24,0x1a,
0x00,0x3c,0x22,0x22,0x3c,0x28,0x24,0x22,
0x00,0x1c,0x22,0x20,0x1c,0x02,0x22,0x1c,
0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,
0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1c,
0x00,0x22,0x22,0x22,0x22,0x22,0x14,0x08,
0x00,0x22,0x22,0x22,0x2a,0x2a,0x36,0x22,
0x00,0x22,0x22,0x14,0x08,0x14,0x22,0x22,
0x00,0x22,0x22,0x14,0x08,0x08,0x08,0x08,
0x00,0x3e,0x02,0x04,0x08,0x10,0x20,0x3e,
0x00,0x3e,0x30,0x30,0x30,0x30,0x30,0x3e,
0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x00,
0x00,0x3e,0x06,0x06,0x06,0x06,0x06,0x3e,
0x00,0x00,0x00,0x08,0x14,0x22,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,
0x00,0x14,0x14,0x14,0x00,0x00,0x00,0x00,
0x00,0x14,0x14,0x3e,0x14,0x3e,0x14,0x14,
0x00,0x08,0x1e,0x28,0x1c,0x0a,0x3c,0x08,
0x00,0x30,0x32,0x04,0x08,0x10,0x26,0x06,
0x00,0x10,0x28,0x28,0x10,0x2a,0x24,0x1a,
0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,
0x00,0x08,0x04,0x02,0x02,0x02,0x04,0x08,
0x00,0x08,0x2a,0x1c,0x08,0x1c,0x2a,0x08,
0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,
0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,
0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x00,
0x00,0x1c,0x22,0x26,0x2a,0x32,0x22,0x1c,
0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x1c,
0x00,0x1c,0x22,0x02,0x0c,0x10,0x20,0x3e,
0x00,0x3e,0x02,0x04,0x0c,0x02,0x22,0x1c,
0x00,0x04,0x0c,0x14,0x24,0x3e,0x04,0x04,
0x00,0x3e,0x20,0x3c,0x02,0x02,0x22,0x1c,
0x00,0x0e,0x10,0x20,0x3c,0x22,0x22,0x1c,
0x00,0x3e,0x02,0x04,0x08,0x10,0x10,0x10,
0x00,0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,
0x00,0x1c,0x22,0x22,0x1e,0x02,0x04,0x38,
0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,
0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x10,
0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,
0x00,0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,
0x00,0x10,0x08,0x04,0x02,0x04,0x08,0x10,
0x00,0x1c,0x22,0x04,0x08,0x08,0x00,0x08,
0x80,0x9c,0xa2,0xaa,0xae,0xac,0xa0,0x9e,
0x80,0x88,0x94,0xa2,0xa2,0xbe,0xa2,0xa2,
0x80,0xbc,0xa2,0xa2,0xbc,0xa2,0xa2,0xbc,
0x80,0x9c,0xa2,0xa0,0xa0,0xa0,0xa2,0x9c,
0x80,0xbc,0xa2,0xa2,0xa2,0xa2,0xa2,0xbc,
0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xbe,
0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xa0,
0x80,0x9e,0xa0,0xa0,0xa0,0xa6,0xa2,0x9e,
0x80,0xa2,0xa2,0xa2,0xbe,0xa2,0xa2,0xa2,
0x80,0x9c,0x88,0x88,0x88,0x88,0x88,0x9c,
0x80,0x82,0x82,0x82,0x82,0x82,0xa2,0x9c,
0x80,0xa2,0xa4,0xa8,0xb0,0xa8,0xa4,0xa2,
0x80,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xbe,
0x80,0xa2,0xb6,0xaa,0xaa,0xa2,0xa2,0xa2,
0x80,0xa2,0xa2,0xb2,0xaa,0xa6,0xa2,0xa2,
0x80,0x9c,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,
0x80,0xbc,0xa2,0xa2,0xbc,0xa0,0xa0,0xa0,
0x80,0x9c,0xa2,0xa2,0xa2,0xaa,0xa4,0x9a,
0x80,0xbc,0xa2,0xa2,0xbc,0xa8,0xa4,0xa2,
0x80,0x9c,0xa2,0xa0,0x9c,0x82,0xa2,0x9c,
0x80,0xbe,0x88,0x88,0x88,0x88,0x88,0x88,
0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,
0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0x94,0x88,
0x80,0xa2,0xa2,0xa2,0xaa,0xaa,0xb6,0xa2,
0x80,0xa2,0xa2,0x94,0x88,0x94,0xa2,0xa2,
0x80,0xa2,0xa2,0x94,0x88,0x88,0x88,0x88,
0x80,0xbe,0x82,0x84,0x88,0x90,0xa0,0xbe,
0x80,0xbe,0xb0,0xb0,0xb0,0xb0,0xb0,0xbe,
0x80,0x80,0xa0,0x90,0x88,0x84,0x82,0x80,
0x80,0xbe,0x86,0x86,0x86,0x86,0x86,0xbe,
0x80,0x80,0x80,0x88,0x94,0xa2,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xbe,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x88,0x88,0x88,0x88,0x88,0x80,0x88,
0x80,0x94,0x94,0x94,0x80,0x80,0x80,0x80,
0x80,0x94,0x94,0xbe,0x94,0xbe,0x94,0x94,
0x80,0x88,0x9e,0xa8,0x9c,0x8a,0xbc,0x88,
0x80,0xb0,0xb2,0x84,0x88,0x90,0xa6,0x86,
0x80,0x90,0xa8,0xa8,0x90,0xaa,0xa4,0x9a,
0x80,0x88,0x88,0x88,0x80,0x80,0x80,0x80,
0x80,0x88,0x90,0xa0,0xa0,0xa0,0x90,0x88,
0x80,0x88,0x84,0x82,0x82,0x82,0x84,0x88,
0x80,0x88,0xaa,0x9c,0x88,0x9c,0xaa,0x88,
0x80,0x80,0x88,0x88,0xbe,0x88,0x88,0x80,
0x80,0x80,0x80,0x80,0x80,0x88,0x88,0x90,
0x80,0x80,0x80,0x80,0xbe,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x88,
0x80,0x80,0x82,0x84,0x88,0x90,0xa0,0x80,
0x80,0x9c,0xa2,0xa6,0xaa,0xb2,0xa2,0x9c,
0x80,0x88,0x98,0x88,0x88,0x88,0x88,0x9c,
0x80,0x9c,0xa2,0x82,0x8c,0x90,0xa0,0xbe,
0x80,0xbe,0x82,0x84,0x8c,0x82,0xa2,0x9c,
0x80,0x84,0x8c,0x94,0xa4,0xbe,0x84,0x84,
0x80,0xbe,0xa0,0xbc,0x82,0x82,0xa2,0x9c,
0x80,0x8e,0x90,0xa0,0xbc,0xa2,0xa2,0x9c,
0x80,0xbe,0x82,0x84,0x88,0x90,0x90,0x90,
0x80,0x9c,0xa2,0xa2,0x9c,0xa2,0xa2,0x9c,
0x80,0x9c,0xa2,0xa2,0x9e,0x82,0x84,0xb8,
0x80,0x80,0x80,0x88,0x80,0x88,0x80,0x80,
0x80,0x80,0x80,0x88,0x80,0x88,0x88,0x90,
0x80,0x84,0x88,0x90,0xa0,0x90,0x88,0x84,
0x80,0x80,0x80,0xbe,0x80,0xbe,0x80,0x80,
0x80,0x90,0x88,0x84,0x82,0x84,0x88,0x90,
0x80,0x9c,0xa2,0x84,0x88,0x88,0x80,0x88
];

2082
js/apple2e-enhanced.js Normal file

File diff suppressed because it is too large Load Diff

2083
js/apple2e.js Normal file

File diff suppressed because it is too large Load Diff

518
js/apple2echar.js Normal file
View File

@ -0,0 +1,518 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*exported charset */
var charset = [
0x1c,0x22,0x2a,0x3a,0x1a,0x02,0x3c,0x00,
0x08,0x14,0x22,0x22,0x3e,0x22,0x22,0x00,
0x1e,0x22,0x22,0x1e,0x22,0x22,0x1e,0x00,
0x1c,0x22,0x02,0x02,0x02,0x22,0x1c,0x00,
0x1e,0x22,0x22,0x22,0x22,0x22,0x1e,0x00,
0x3e,0x02,0x02,0x1e,0x02,0x02,0x3e,0x00,
0x3e,0x02,0x02,0x1e,0x02,0x02,0x02,0x00,
0x3c,0x02,0x02,0x02,0x32,0x22,0x3c,0x00,
0x22,0x22,0x22,0x3e,0x22,0x22,0x22,0x00,
0x1c,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,
0x20,0x20,0x20,0x20,0x20,0x22,0x1c,0x00,
0x22,0x12,0x0a,0x06,0x0a,0x12,0x22,0x00,
0x02,0x02,0x02,0x02,0x02,0x02,0x3e,0x00,
0x22,0x36,0x2a,0x2a,0x22,0x22,0x22,0x00,
0x22,0x22,0x26,0x2a,0x32,0x22,0x22,0x00,
0x1c,0x22,0x22,0x22,0x22,0x22,0x1c,0x00,
0x1e,0x22,0x22,0x1e,0x02,0x02,0x02,0x00,
0x1c,0x22,0x22,0x22,0x2a,0x12,0x2c,0x00,
0x1e,0x22,0x22,0x1e,0x0a,0x12,0x22,0x00,
0x1c,0x22,0x02,0x1c,0x20,0x22,0x1c,0x00,
0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x22,0x22,0x22,0x22,0x22,0x22,0x1c,0x00,
0x22,0x22,0x22,0x22,0x22,0x14,0x08,0x00,
0x22,0x22,0x22,0x2a,0x2a,0x36,0x22,0x00,
0x22,0x22,0x14,0x08,0x14,0x22,0x22,0x00,
0x22,0x22,0x14,0x08,0x08,0x08,0x08,0x00,
0x3e,0x20,0x10,0x08,0x04,0x02,0x3e,0x00,
0x3e,0x06,0x06,0x06,0x06,0x06,0x3e,0x00,
0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00,
0x3e,0x30,0x30,0x30,0x30,0x30,0x3e,0x00,
0x00,0x00,0x08,0x14,0x22,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x00,
0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,
0x14,0x14,0x3e,0x14,0x3e,0x14,0x14,0x00,
0x08,0x3c,0x0a,0x1c,0x28,0x1e,0x08,0x00,
0x06,0x26,0x10,0x08,0x04,0x32,0x30,0x00,
0x04,0x0a,0x0a,0x04,0x2a,0x12,0x2c,0x00,
0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,
0x08,0x04,0x02,0x02,0x02,0x04,0x08,0x00,
0x08,0x10,0x20,0x20,0x20,0x10,0x08,0x00,
0x08,0x2a,0x1c,0x08,0x1c,0x2a,0x08,0x00,
0x00,0x08,0x08,0x3e,0x08,0x08,0x00,0x00,
0x00,0x00,0x00,0x00,0x08,0x08,0x04,0x00,
0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00,
0x1c,0x22,0x32,0x2a,0x26,0x22,0x1c,0x00,
0x08,0x0c,0x08,0x08,0x08,0x08,0x1c,0x00,
0x1c,0x22,0x20,0x18,0x04,0x02,0x3e,0x00,
0x3e,0x20,0x10,0x18,0x20,0x22,0x1c,0x00,
0x10,0x18,0x14,0x12,0x3e,0x10,0x10,0x00,
0x3e,0x02,0x1e,0x20,0x20,0x22,0x1c,0x00,
0x38,0x04,0x02,0x1e,0x22,0x22,0x1c,0x00,
0x3e,0x20,0x10,0x08,0x04,0x04,0x04,0x00,
0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,0x00,
0x1c,0x22,0x22,0x3c,0x20,0x10,0x0e,0x00,
0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,
0x00,0x00,0x08,0x00,0x08,0x08,0x04,0x00,
0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x00,
0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,0x00,
0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00,
0x1c,0x22,0x10,0x08,0x08,0x00,0x08,0x00,
0xef,0xf7,0xc9,0x80,0xc0,0xc0,0x81,0xc9,
0xef,0xf7,0xc9,0xbe,0xde,0xde,0xb5,0xc9,
0xff,0xff,0xfd,0xf9,0xf1,0xe1,0xc9,0xbd,
0x80,0xdd,0xeb,0xf7,0xf7,0xeb,0xd5,0x80,
0xff,0xbf,0xdf,0xee,0xf5,0xfb,0xfb,0xff,
0x80,0xc0,0xa0,0x93,0x8a,0x84,0x84,0x80,
0x8f,0x9f,0x81,0xce,0x86,0xcf,0xc0,0xfd,
0xff,0xe7,0xf8,0xff,0xf8,0xf3,0xf7,0x8f,
0xf7,0xfb,0xfd,0x80,0xfd,0xfb,0xf7,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
0xf7,0xf7,0xf7,0xf7,0xb6,0xd5,0xe3,0xf7,
0xf7,0xe3,0xd5,0xb6,0xf7,0xf7,0xf7,0xf7,
0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xbf,0xbf,0xbf,0xbb,0xb9,0x80,0xf9,0xfb,
0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
0xec,0xe7,0xe3,0x81,0xe3,0xe7,0xef,0x90,
0x9b,0xf3,0xe3,0xc0,0xe3,0xf3,0xfb,0x84,
0xbf,0xb7,0xf7,0x80,0xc1,0xe3,0xb7,0xbf,
0xbf,0xb7,0xe3,0xc1,0x80,0xf7,0xb7,0xbf,
0xff,0xff,0xff,0x80,0xff,0xff,0xff,0xff,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x80,
0xf7,0xef,0xdf,0x80,0xdf,0xef,0xf7,0xff,
0xd5,0xaa,0xd5,0xaa,0xd5,0xaa,0xd5,0xaa,
0xaa,0xd5,0xaa,0xd5,0xaa,0xd5,0xaa,0xd5,
0xff,0xc1,0xbe,0xfe,0xfe,0xfe,0x80,0xff,
0xff,0xff,0xc0,0xbf,0xbf,0xbf,0x80,0xff,
0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,
0xf7,0xe3,0xc1,0x80,0xc1,0xe3,0xf7,0xff,
0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x80,
0xeb,0xeb,0x88,0xff,0x88,0xeb,0xeb,0xff,
0x80,0xbf,0xbf,0xb3,0xb3,0xbf,0xbf,0x80,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
0x04,0x08,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1c,0x20,0x3c,0x22,0x3c,0x00,
0x02,0x02,0x1e,0x22,0x22,0x22,0x1e,0x00,
0x00,0x00,0x3c,0x02,0x02,0x02,0x3c,0x00,
0x20,0x20,0x3c,0x22,0x22,0x22,0x3c,0x00,
0x00,0x00,0x1c,0x22,0x3e,0x02,0x3c,0x00,
0x18,0x24,0x04,0x1e,0x04,0x04,0x04,0x00,
0x00,0x00,0x1c,0x22,0x22,0x3c,0x20,0x1c,
0x02,0x02,0x1e,0x22,0x22,0x22,0x22,0x00,
0x08,0x00,0x0c,0x08,0x08,0x08,0x1c,0x00,
0x10,0x00,0x18,0x10,0x10,0x10,0x12,0x0c,
0x02,0x02,0x22,0x12,0x0e,0x12,0x22,0x00,
0x0c,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,
0x00,0x00,0x36,0x2a,0x2a,0x2a,0x22,0x00,
0x00,0x00,0x1e,0x22,0x22,0x22,0x22,0x00,
0x00,0x00,0x1c,0x22,0x22,0x22,0x1c,0x00,
0x00,0x00,0x1e,0x22,0x22,0x1e,0x02,0x02,
0x00,0x00,0x3c,0x22,0x22,0x3c,0x20,0x20,
0x00,0x00,0x3a,0x06,0x02,0x02,0x02,0x00,
0x00,0x00,0x3c,0x02,0x1c,0x20,0x1e,0x00,
0x04,0x04,0x1e,0x04,0x04,0x24,0x18,0x00,
0x00,0x00,0x22,0x22,0x22,0x32,0x2c,0x00,
0x00,0x00,0x22,0x22,0x22,0x14,0x08,0x00,
0x00,0x00,0x22,0x22,0x2a,0x2a,0x36,0x00,
0x00,0x00,0x22,0x14,0x08,0x14,0x22,0x00,
0x00,0x00,0x22,0x22,0x22,0x3c,0x20,0x1c,
0x00,0x00,0x3e,0x10,0x08,0x04,0x3e,0x00,
0x38,0x0c,0x0c,0x06,0x0c,0x0c,0x38,0x00,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x0e,0x18,0x18,0x30,0x18,0x18,0x0e,0x00,
0x2c,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x2a,0x14,0x2a,0x14,0x2a,0x00,0x00,
0xe3,0xdd,0xd5,0xc5,0xe5,0xfd,0xc3,0xff,
0xf7,0xeb,0xdd,0xdd,0xc1,0xdd,0xdd,0xff,
0xe1,0xdd,0xdd,0xe1,0xdd,0xdd,0xe1,0xff,
0xe3,0xdd,0xfd,0xfd,0xfd,0xdd,0xe3,0xff,
0xe1,0xdd,0xdd,0xdd,0xdd,0xdd,0xe1,0xff,
0xc1,0xfd,0xfd,0xe1,0xfd,0xfd,0xc1,0xff,
0xc1,0xfd,0xfd,0xe1,0xfd,0xfd,0xfd,0xff,
0xc3,0xfd,0xfd,0xfd,0xcd,0xdd,0xc3,0xff,
0xdd,0xdd,0xdd,0xc1,0xdd,0xdd,0xdd,0xff,
0xe3,0xf7,0xf7,0xf7,0xf7,0xf7,0xe3,0xff,
0xdf,0xdf,0xdf,0xdf,0xdf,0xdd,0xe3,0xff,
0xdd,0xed,0xf5,0xf9,0xf5,0xed,0xdd,0xff,
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xc1,0xff,
0xdd,0xc9,0xd5,0xd5,0xdd,0xdd,0xdd,0xff,
0xdd,0xdd,0xd9,0xd5,0xcd,0xdd,0xdd,0xff,
0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3,0xff,
0xe1,0xdd,0xdd,0xe1,0xfd,0xfd,0xfd,0xff,
0xe3,0xdd,0xdd,0xdd,0xd5,0xed,0xd3,0xff,
0xe1,0xdd,0xdd,0xe1,0xf5,0xed,0xdd,0xff,
0xe3,0xdd,0xfd,0xe3,0xdf,0xdd,0xe3,0xff,
0xc1,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,
0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3,0xff,
0xdd,0xdd,0xdd,0xdd,0xdd,0xeb,0xf7,0xff,
0xdd,0xdd,0xdd,0xd5,0xd5,0xc9,0xdd,0xff,
0xdd,0xdd,0xeb,0xf7,0xeb,0xdd,0xdd,0xff,
0xdd,0xdd,0xeb,0xf7,0xf7,0xf7,0xf7,0xff,
0xc1,0xdf,0xef,0xf7,0xfb,0xfd,0xc1,0xff,
0xc1,0xf9,0xf9,0xf9,0xf9,0xf9,0xc1,0xff,
0xff,0xfd,0xfb,0xf7,0xef,0xdf,0xff,0xff,
0xc1,0xcf,0xcf,0xcf,0xcf,0xcf,0xc1,0xff,
0xff,0xff,0xf7,0xeb,0xdd,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0xf7,0xff,
0xeb,0xeb,0xeb,0xff,0xff,0xff,0xff,0xff,
0xeb,0xeb,0xc1,0xeb,0xc1,0xeb,0xeb,0xff,
0xf7,0xc3,0xf5,0xe3,0xd7,0xe1,0xf7,0xff,
0xf9,0xd9,0xef,0xf7,0xfb,0xcd,0xcf,0xff,
0xfb,0xf5,0xf5,0xfb,0xd5,0xed,0xd3,0xff,
0xf7,0xf7,0xf7,0xff,0xff,0xff,0xff,0xff,
0xf7,0xfb,0xfd,0xfd,0xfd,0xfb,0xf7,0xff,
0xf7,0xef,0xdf,0xdf,0xdf,0xef,0xf7,0xff,
0xf7,0xd5,0xe3,0xf7,0xe3,0xd5,0xf7,0xff,
0xff,0xf7,0xf7,0xc1,0xf7,0xf7,0xff,0xff,
0xff,0xff,0xff,0xff,0xf7,0xf7,0xfb,0xff,
0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,
0xff,0xdf,0xef,0xf7,0xfb,0xfd,0xff,0xff,
0xe3,0xdd,0xcd,0xd5,0xd9,0xdd,0xe3,0xff,
0xf7,0xf3,0xf7,0xf7,0xf7,0xf7,0xe3,0xff,
0xe3,0xdd,0xdf,0xe7,0xfb,0xfd,0xc1,0xff,
0xc1,0xdf,0xef,0xe7,0xdf,0xdd,0xe3,0xff,
0xef,0xe7,0xeb,0xed,0xc1,0xef,0xef,0xff,
0xc1,0xfd,0xe1,0xdf,0xdf,0xdd,0xe3,0xff,
0xc7,0xfb,0xfd,0xe1,0xdd,0xdd,0xe3,0xff,
0xc1,0xdf,0xef,0xf7,0xfb,0xfb,0xfb,0xff,
0xe3,0xdd,0xdd,0xe3,0xdd,0xdd,0xe3,0xff,
0xe3,0xdd,0xdd,0xc3,0xdf,0xef,0xf1,0xff,
0xff,0xff,0xf7,0xff,0xf7,0xff,0xff,0xff,
0xff,0xff,0xf7,0xff,0xf7,0xf7,0xfb,0xff,
0xef,0xf7,0xfb,0xfd,0xfb,0xf7,0xef,0xff,
0xff,0xff,0xc1,0xff,0xc1,0xff,0xff,0xff,
0xfb,0xf7,0xef,0xdf,0xef,0xf7,0xfb,0xff,
0xe3,0xdd,0xef,0xf7,0xf7,0xff,0xf7,0xff,
0xe3,0xdd,0xd5,0xc5,0xe5,0xfd,0xc3,0xff,
0xf7,0xeb,0xdd,0xdd,0xc1,0xdd,0xdd,0xff,
0xe1,0xdd,0xdd,0xe1,0xdd,0xdd,0xe1,0xff,
0xe3,0xdd,0xfd,0xfd,0xfd,0xdd,0xe3,0xff,
0xe1,0xdd,0xdd,0xdd,0xdd,0xdd,0xe1,0xff,
0xc1,0xfd,0xfd,0xe1,0xfd,0xfd,0xc1,0xff,
0xc1,0xfd,0xfd,0xe1,0xfd,0xfd,0xfd,0xff,
0xc3,0xfd,0xfd,0xfd,0xcd,0xdd,0xc3,0xff,
0xdd,0xdd,0xdd,0xc1,0xdd,0xdd,0xdd,0xff,
0xe3,0xf7,0xf7,0xf7,0xf7,0xf7,0xe3,0xff,
0xdf,0xdf,0xdf,0xdf,0xdf,0xdd,0xe3,0xff,
0xdd,0xed,0xf5,0xf9,0xf5,0xed,0xdd,0xff,
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xc1,0xff,
0xdd,0xc9,0xd5,0xd5,0xdd,0xdd,0xdd,0xff,
0xdd,0xdd,0xd9,0xd5,0xcd,0xdd,0xdd,0xff,
0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3,0xff,
0xe1,0xdd,0xdd,0xe1,0xfd,0xfd,0xfd,0xff,
0xe3,0xdd,0xdd,0xdd,0xd5,0xed,0xd3,0xff,
0xe1,0xdd,0xdd,0xe1,0xf5,0xed,0xdd,0xff,
0xe3,0xdd,0xfd,0xe3,0xdf,0xdd,0xe3,0xff,
0xc1,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,
0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xe3,0xff,
0xdd,0xdd,0xdd,0xdd,0xdd,0xeb,0xf7,0xff,
0xdd,0xdd,0xdd,0xd5,0xd5,0xc9,0xdd,0xff,
0xdd,0xdd,0xeb,0xf7,0xeb,0xdd,0xdd,0xff,
0xdd,0xdd,0xeb,0xf7,0xf7,0xf7,0xf7,0xff,
0xc1,0xdf,0xef,0xf7,0xfb,0xfd,0xc1,0xff,
0xc1,0xf9,0xf9,0xf9,0xf9,0xf9,0xc1,0xff,
0xff,0xfd,0xfb,0xf7,0xef,0xdf,0xff,0xff,
0xc1,0xcf,0xcf,0xcf,0xcf,0xcf,0xc1,0xff,
0xff,0xff,0xf7,0xeb,0xdd,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,
0xfb,0xf7,0xef,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xe3,0xdf,0xc3,0xdd,0xc3,0xff,
0xfd,0xfd,0xe1,0xdd,0xdd,0xdd,0xe1,0xff,
0xff,0xff,0xc3,0xfd,0xfd,0xfd,0xc3,0xff,
0xdf,0xdf,0xc3,0xdd,0xdd,0xdd,0xc3,0xff,
0xff,0xff,0xe3,0xdd,0xc1,0xfd,0xc3,0xff,
0xe7,0xdb,0xfb,0xe1,0xfb,0xfb,0xfb,0xff,
0xff,0xff,0xe3,0xdd,0xdd,0xc3,0xdf,0xe3,
0xfd,0xfd,0xe1,0xdd,0xdd,0xdd,0xdd,0xff,
0xf7,0xff,0xf3,0xf7,0xf7,0xf7,0xe3,0xff,
0xef,0xff,0xe7,0xef,0xef,0xef,0xed,0xf3,
0xfd,0xfd,0xdd,0xed,0xf1,0xed,0xdd,0xff,
0xf3,0xf7,0xf7,0xf7,0xf7,0xf7,0xe3,0xff,
0xff,0xff,0xc9,0xd5,0xd5,0xd5,0xdd,0xff,
0xff,0xff,0xe1,0xdd,0xdd,0xdd,0xdd,0xff,
0xff,0xff,0xe3,0xdd,0xdd,0xdd,0xe3,0xff,
0xff,0xff,0xe1,0xdd,0xdd,0xe1,0xfd,0xfd,
0xff,0xff,0xc3,0xdd,0xdd,0xc3,0xdf,0xdf,
0xff,0xff,0xc5,0xf9,0xfd,0xfd,0xfd,0xff,
0xff,0xff,0xc3,0xfd,0xe3,0xdf,0xe1,0xff,
0xfb,0xfb,0xe1,0xfb,0xfb,0xdb,0xe7,0xff,
0xff,0xff,0xdd,0xdd,0xdd,0xcd,0xd3,0xff,
0xff,0xff,0xdd,0xdd,0xdd,0xeb,0xf7,0xff,
0xff,0xff,0xdd,0xdd,0xd5,0xd5,0xc9,0xff,
0xff,0xff,0xdd,0xeb,0xf7,0xeb,0xdd,0xff,
0xff,0xff,0xdd,0xdd,0xdd,0xc3,0xdf,0xe3,
0xff,0xff,0xc1,0xef,0xf7,0xfb,0xc1,0xff,
0xc7,0xf3,0xf3,0xf9,0xf3,0xf3,0xc7,0xff,
0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
0xf1,0xe7,0xe7,0xcf,0xe7,0xe7,0xf1,0xff,
0xd3,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xd5,0xeb,0xd5,0xeb,0xd5,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xfe,0xfe,0xee,0xbb,0xfe,0xfe,0xff,0xff,
0xfd,0xfd,0xdd,0x77,0xfd,0xfd,0xff,0xff,
0xfc,0xfc,0xcc,0x33,0xfc,0xfc,0xff,0xff,
0xfb,0xfb,0xbb,0xee,0xfb,0xfb,0xff,0xff,
0xfa,0xfa,0xaa,0xaa,0xfa,0xfa,0xff,0xff,
0xf9,0xf9,0x99,0x66,0xf9,0xf9,0xff,0xff,
0xf8,0xf8,0x88,0x22,0xf8,0xf8,0xff,0xff,
0xf7,0xf7,0x77,0xdd,0xf7,0xf7,0xff,0xff,
0xf6,0xf6,0x66,0x99,0xf6,0xf6,0xff,0xff,
0xf5,0xf5,0x55,0x55,0xf5,0xf5,0xff,0xff,
0xf4,0xf4,0x44,0x11,0xf4,0xf4,0xff,0xff,
0xf3,0xf3,0x33,0xcc,0xf3,0xf3,0xff,0xff,
0xf2,0xf2,0x22,0x88,0xf2,0xf2,0xff,0xff,
0xf1,0xf1,0x11,0x44,0xf1,0xf1,0xff,0xff,
0xf0,0xf0,0x00,0x00,0xf0,0xf0,0xff,0xff,
0xef,0xef,0xff,0xff,0xef,0xef,0xee,0xbb,
0xee,0xee,0xee,0xbb,0xee,0xee,0xee,0xbb,
0xed,0xed,0xdd,0x77,0xed,0xed,0xee,0xbb,
0xec,0xec,0xcc,0x33,0xec,0xec,0xee,0xbb,
0xeb,0xeb,0xbb,0xee,0xeb,0xeb,0xee,0xbb,
0xea,0xea,0xaa,0xaa,0xea,0xea,0xee,0xbb,
0xe9,0xe9,0x99,0x66,0xe9,0xe9,0xee,0xbb,
0xe8,0xe8,0x88,0x22,0xe8,0xe8,0xee,0xbb,
0xe7,0xe7,0x77,0xdd,0xe7,0xe7,0xee,0xbb,
0xe6,0xe6,0x66,0x99,0xe6,0xe6,0xee,0xbb,
0xe5,0xe5,0x55,0x55,0xe5,0xe5,0xee,0xbb,
0xe4,0xe4,0x44,0x11,0xe4,0xe4,0xee,0xbb,
0xe3,0xe3,0x33,0xcc,0xe3,0xe3,0xee,0xbb,
0xe2,0xe2,0x22,0x88,0xe2,0xe2,0xee,0xbb,
0xe1,0xe1,0x11,0x44,0xe1,0xe1,0xee,0xbb,
0xe0,0xe0,0x00,0x00,0xe0,0xe0,0xee,0xbb,
0xdf,0xdf,0xff,0xff,0xdf,0xdf,0xdd,0x77,
0xde,0xde,0xee,0xbb,0xde,0xde,0xdd,0x77,
0xdd,0xdd,0xdd,0x77,0xdd,0xdd,0xdd,0x77,
0xdc,0xdc,0xcc,0x33,0xdc,0xdc,0xdd,0x77,
0xdb,0xdb,0xbb,0xee,0xdb,0xdb,0xdd,0x77,
0xda,0xda,0xaa,0xaa,0xda,0xda,0xdd,0x77,
0xd9,0xd9,0x99,0x66,0xd9,0xd9,0xdd,0x77,
0xd8,0xd8,0x88,0x22,0xd8,0xd8,0xdd,0x77,
0xd7,0xd7,0x77,0xdd,0xd7,0xd7,0xdd,0x77,
0xd6,0xd6,0x66,0x99,0xd6,0xd6,0xdd,0x77,
0xd5,0xd5,0x55,0x55,0xd5,0xd5,0xdd,0x77,
0xd4,0xd4,0x44,0x11,0xd4,0xd4,0xdd,0x77,
0xd3,0xd3,0x33,0xcc,0xd3,0xd3,0xdd,0x77,
0xd2,0xd2,0x22,0x88,0xd2,0xd2,0xdd,0x77,
0xd1,0xd1,0x11,0x44,0xd1,0xd1,0xdd,0x77,
0xd0,0xd0,0x00,0x00,0xd0,0xd0,0xdd,0x77,
0xcf,0xcf,0xff,0xff,0xcf,0xcf,0xcc,0x33,
0xce,0xce,0xee,0xbb,0xce,0xce,0xcc,0x33,
0xcd,0xcd,0xdd,0x77,0xcd,0xcd,0xcc,0x33,
0xcc,0xcc,0xcc,0x33,0xcc,0xcc,0xcc,0x33,
0xcb,0xcb,0xbb,0xee,0xcb,0xcb,0xcc,0x33,
0xca,0xca,0xaa,0xaa,0xca,0xca,0xcc,0x33,
0xc9,0xc9,0x99,0x66,0xc9,0xc9,0xcc,0x33,
0xc8,0xc8,0x88,0x22,0xc8,0xc8,0xcc,0x33,
0xc7,0xc7,0x77,0xdd,0xc7,0xc7,0xcc,0x33,
0xc6,0xc6,0x66,0x99,0xc6,0xc6,0xcc,0x33,
0xc5,0xc5,0x55,0x55,0xc5,0xc5,0xcc,0x33,
0xc4,0xc4,0x44,0x11,0xc4,0xc4,0xcc,0x33,
0xc3,0xc3,0x33,0xcc,0xc3,0xc3,0xcc,0x33,
0xc2,0xc2,0x22,0x88,0xc2,0xc2,0xcc,0x33,
0xc1,0xc1,0x11,0x44,0xc1,0xc1,0xcc,0x33,
0xc0,0xc0,0x00,0x00,0xc0,0xc0,0xcc,0x33,
0xbf,0xbf,0xff,0xff,0xbf,0xbf,0xbb,0xee,
0xbe,0xbe,0xee,0xbb,0xbe,0xbe,0xbb,0xee,
0xbd,0xbd,0xdd,0x77,0xbd,0xbd,0xbb,0xee,
0xbc,0xbc,0xcc,0x33,0xbc,0xbc,0xbb,0xee,
0xbb,0xbb,0xbb,0xee,0xbb,0xbb,0xbb,0xee,
0xba,0xba,0xaa,0xaa,0xba,0xba,0xbb,0xee,
0xb9,0xb9,0x99,0x66,0xb9,0xb9,0xbb,0xee,
0xb8,0xb8,0x88,0x22,0xb8,0xb8,0xbb,0xee,
0xb7,0xb7,0x77,0xdd,0xb7,0xb7,0xbb,0xee,
0xb6,0xb6,0x66,0x99,0xb6,0xb6,0xbb,0xee,
0xb5,0xb5,0x55,0x55,0xb5,0xb5,0xbb,0xee,
0xb4,0xb4,0x44,0x11,0xb4,0xb4,0xbb,0xee,
0xb3,0xb3,0x33,0xcc,0xb3,0xb3,0xbb,0xee,
0xb2,0xb2,0x22,0x88,0xb2,0xb2,0xbb,0xee,
0xb1,0xb1,0x11,0x44,0xb1,0xb1,0xbb,0xee,
0xb0,0xb0,0x00,0x00,0xb0,0xb0,0xbb,0xee,
0xaf,0xaf,0xff,0xff,0xaf,0xaf,0xaa,0xaa,
0xae,0xae,0xee,0xbb,0xae,0xae,0xaa,0xaa,
0xad,0xad,0xdd,0x77,0xad,0xad,0xaa,0xaa,
0xac,0xac,0xcc,0x33,0xac,0xac,0xaa,0xaa,
0xab,0xab,0xbb,0xee,0xab,0xab,0xaa,0xaa,
0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,
0xa9,0xa9,0x99,0x66,0xa9,0xa9,0xaa,0xaa,
0xa8,0xa8,0x88,0x22,0xa8,0xa8,0xaa,0xaa,
0xa7,0xa7,0x77,0xdd,0xa7,0xa7,0xaa,0xaa,
0xa6,0xa6,0x66,0x99,0xa6,0xa6,0xaa,0xaa,
0xa5,0xa5,0x55,0x55,0xa5,0xa5,0xaa,0xaa,
0xa4,0xa4,0x44,0x11,0xa4,0xa4,0xaa,0xaa,
0xa3,0xa3,0x33,0xcc,0xa3,0xa3,0xaa,0xaa,
0xa2,0xa2,0x22,0x88,0xa2,0xa2,0xaa,0xaa,
0xa1,0xa1,0x11,0x44,0xa1,0xa1,0xaa,0xaa,
0xa0,0xa0,0x00,0x00,0xa0,0xa0,0xaa,0xaa,
0x9f,0x9f,0xff,0xff,0x9f,0x9f,0x99,0x66,
0x9e,0x9e,0xee,0xbb,0x9e,0x9e,0x99,0x66,
0x9d,0x9d,0xdd,0x77,0x9d,0x9d,0x99,0x66,
0x9c,0x9c,0xcc,0x33,0x9c,0x9c,0x99,0x66,
0x9b,0x9b,0xbb,0xee,0x9b,0x9b,0x99,0x66,
0x9a,0x9a,0xaa,0xaa,0x9a,0x9a,0x99,0x66,
0x99,0x99,0x99,0x66,0x99,0x99,0x99,0x66,
0x98,0x98,0x88,0x22,0x98,0x98,0x99,0x66,
0x97,0x97,0x77,0xdd,0x97,0x97,0x99,0x66,
0x96,0x96,0x66,0x99,0x96,0x96,0x99,0x66,
0x95,0x95,0x55,0x55,0x95,0x95,0x99,0x66,
0x94,0x94,0x44,0x11,0x94,0x94,0x99,0x66,
0x93,0x93,0x33,0xcc,0x93,0x93,0x99,0x66,
0x92,0x92,0x22,0x88,0x92,0x92,0x99,0x66,
0x91,0x91,0x11,0x44,0x91,0x91,0x99,0x66,
0x90,0x90,0x00,0x00,0x90,0x90,0x99,0x66,
0x8f,0x8f,0xff,0xff,0x8f,0x8f,0x88,0x22,
0x8e,0x8e,0xee,0xbb,0x8e,0x8e,0x88,0x22,
0x8d,0x8d,0xdd,0x77,0x8d,0x8d,0x88,0x22,
0x8c,0x8c,0xcc,0x33,0x8c,0x8c,0x88,0x22,
0x8b,0x8b,0xbb,0xee,0x8b,0x8b,0x88,0x22,
0x8a,0x8a,0xaa,0xaa,0x8a,0x8a,0x88,0x22,
0x89,0x89,0x99,0x66,0x89,0x89,0x88,0x22,
0x88,0x88,0x88,0x22,0x88,0x88,0x88,0x22,
0x87,0x87,0x77,0xdd,0x87,0x87,0x88,0x22,
0x86,0x86,0x66,0x99,0x86,0x86,0x88,0x22,
0x85,0x85,0x55,0x55,0x85,0x85,0x88,0x22,
0x84,0x84,0x44,0x11,0x84,0x84,0x88,0x22,
0x83,0x83,0x33,0xcc,0x83,0x83,0x88,0x22,
0x82,0x82,0x22,0x88,0x82,0x82,0x88,0x22,
0x81,0x81,0x11,0x44,0x81,0x81,0x88,0x22,
0x80,0x80,0x00,0x00,0x80,0x80,0x88,0x22,
0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xdd,
0xfe,0xfe,0xee,0xbb,0xfe,0xfe,0x77,0xdd,
0xfd,0xfd,0xdd,0x77,0xfd,0xfd,0x77,0xdd,
0xfc,0xfc,0xcc,0x33,0xfc,0xfc,0x77,0xdd,
0xfb,0xfb,0xbb,0xee,0xfb,0xfb,0x77,0xdd,
0xfa,0xfa,0xaa,0xaa,0xfa,0xfa,0x77,0xdd,
0xf9,0xf9,0x99,0x66,0xf9,0xf9,0x77,0xdd,
0xf8,0xf8,0x88,0x22,0xf8,0xf8,0x77,0xdd,
0xf7,0xf7,0x77,0xdd,0xf7,0xf7,0x77,0xdd,
0xf6,0xf6,0x66,0x99,0xf6,0xf6,0x77,0xdd,
0xf5,0xf5,0x55,0x55,0xf5,0xf5,0x77,0xdd,
0xf4,0xf4,0x44,0x11,0xf4,0xf4,0x77,0xdd,
0xf3,0xf3,0x33,0xcc,0xf3,0xf3,0x77,0xdd,
0xf2,0xf2,0x22,0x88,0xf2,0xf2,0x77,0xdd,
0xf1,0xf1,0x11,0x44,0xf1,0xf1,0x77,0xdd,
0xf0,0xf0,0x00,0x00,0xf0,0xf0,0x77,0xdd,
0xef,0xef,0xff,0xff,0xef,0xef,0x66,0x99,
0xee,0xee,0xee,0xbb,0xee,0xee,0x66,0x99,
0xed,0xed,0xdd,0x77,0xed,0xed,0x66,0x99,
0xec,0xec,0xcc,0x33,0xec,0xec,0x66,0x99,
0xeb,0xeb,0xbb,0xee,0xeb,0xeb,0x66,0x99,
0xea,0xea,0xaa,0xaa,0xea,0xea,0x66,0x99,
0xe9,0xe9,0x99,0x66,0xe9,0xe9,0x66,0x99,
0xe8,0xe8,0x88,0x22,0xe8,0xe8,0x66,0x99,
0xe7,0xe7,0x77,0xdd,0xe7,0xe7,0x66,0x99,
0xe6,0xe6,0x66,0x99,0xe6,0xe6,0x66,0x99,
0xe5,0xe5,0x55,0x55,0xe5,0xe5,0x66,0x99,
0xe4,0xe4,0x44,0x11,0xe4,0xe4,0x66,0x99,
0xe3,0xe3,0x33,0xcc,0xe3,0xe3,0x66,0x99,
0xe2,0xe2,0x22,0x88,0xe2,0xe2,0x66,0x99,
0xe1,0xe1,0x11,0x44,0xe1,0xe1,0x66,0x99,
0xe0,0xe0,0x00,0x00,0xe0,0xe0,0x66,0x99,
0xdf,0xdf,0xff,0xff,0xdf,0xdf,0x55,0x55,
0xde,0xde,0xee,0xbb,0xde,0xde,0x55,0x55,
0xdd,0xdd,0xdd,0x77,0xdd,0xdd,0x55,0x55,
0xdc,0xdc,0xcc,0x33,0xdc,0xdc,0x55,0x55,
0xdb,0xdb,0xbb,0xee,0xdb,0xdb,0x55,0x55,
0xda,0xda,0xaa,0xaa,0xda,0xda,0x55,0x55,
0xd9,0xd9,0x99,0x66,0xd9,0xd9,0x55,0x55,
0xd8,0xd8,0x88,0x22,0xd8,0xd8,0x55,0x55,
0xd7,0xd7,0x77,0xdd,0xd7,0xd7,0x55,0x55,
0xd6,0xd6,0x66,0x99,0xd6,0xd6,0x55,0x55,
0xd5,0xd5,0x55,0x55,0xd5,0xd5,0x55,0x55,
0xd4,0xd4,0x44,0x11,0xd4,0xd4,0x55,0x55,
0xd3,0xd3,0x33,0xcc,0xd3,0xd3,0x55,0x55,
0xd2,0xd2,0x22,0x88,0xd2,0xd2,0x55,0x55,
0xd1,0xd1,0x11,0x44,0xd1,0xd1,0x55,0x55,
0xd0,0xd0,0x00,0x00,0xd0,0xd0,0x55,0x55,
0xcf,0xcf,0xff,0xff,0xcf,0xcf,0x44,0x11,
0xce,0xce,0xee,0xbb,0xce,0xce,0x44,0x11,
0xcd,0xcd,0xdd,0x77,0xcd,0xcd,0x44,0x11,
0xcc,0xcc,0xcc,0x33,0xcc,0xcc,0x44,0x11,
0xcb,0xcb,0xbb,0xee,0xcb,0xcb,0x44,0x11,
0xca,0xca,0xaa,0xaa,0xca,0xca,0x44,0x11,
0xc9,0xc9,0x99,0x66,0xc9,0xc9,0x44,0x11,
0xc8,0xc8,0x88,0x22,0xc8,0xc8,0x44,0x11,
0xc7,0xc7,0x77,0xdd,0xc7,0xc7,0x44,0x11,
0xc6,0xc6,0x66,0x99,0xc6,0xc6,0x44,0x11,
0xc5,0xc5,0x55,0x55,0xc5,0xc5,0x44,0x11,
0xc4,0xc4,0x44,0x11,0xc4,0xc4,0x44,0x11,
0xc3,0xc3,0x33,0xcc,0xc3,0xc3,0x44,0x11,
0xc2,0xc2,0x22,0x88,0xc2,0xc2,0x44,0x11,
0xc1,0xc1,0x11,0x44,0xc1,0xc1,0x44,0x11,
0xc0,0xc0,0x00,0x00,0xc0,0xc0,0x44,0x11,
0xbf,0xbf,0xff,0xff,0xbf,0xbf,0x33,0xcc,
0xbe,0xbe,0xee,0xbb,0xbe,0xbe,0x33,0xcc,
0xbd,0xbd,0xdd,0x77,0xbd,0xbd,0x33,0xcc,
0xbc,0xbc,0xcc,0x33,0xbc,0xbc,0x33,0xcc,
0xbb,0xbb,0xbb,0xee,0xbb,0xbb,0x33,0xcc,
0xba,0xba,0xaa,0xaa,0xba,0xba,0x33,0xcc,
0xb9,0xb9,0x99,0x66,0xb9,0xb9,0x33,0xcc,
0xb8,0xb8,0x88,0x22,0xb8,0xb8,0x33,0xcc,
0xb7,0xb7,0x77,0xdd,0xb7,0xb7,0x33,0xcc,
0xb6,0xb6,0x66,0x99,0xb6,0xb6,0x33,0xcc,
0xb5,0xb5,0x55,0x55,0xb5,0xb5,0x33,0xcc,
0xb4,0xb4,0x44,0x11,0xb4,0xb4,0x33,0xcc,
0xb3,0xb3,0x33,0xcc,0xb3,0xb3,0x33,0xcc,
0xb2,0xb2,0x22,0x88,0xb2,0xb2,0x33,0xcc,
0xb1,0xb1,0x11,0x44,0xb1,0xb1,0x33,0xcc,
0xb0,0xb0,0x00,0x00,0xb0,0xb0,0x33,0xcc,
0xaf,0xaf,0xff,0xff,0xaf,0xaf,0x22,0x88,
0xae,0xae,0xee,0xbb,0xae,0xae,0x22,0x88,
0xad,0xad,0xdd,0x77,0xad,0xad,0x22,0x88,
0xac,0xac,0xcc,0x33,0xac,0xac,0x22,0x88,
0xab,0xab,0xbb,0xee,0xab,0xab,0x22,0x88,
0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x22,0x88,
0xa9,0xa9,0x99,0x66,0xa9,0xa9,0x22,0x88,
0xa8,0xa8,0x88,0x22,0xa8,0xa8,0x22,0x88,
0xa7,0xa7,0x77,0xdd,0xa7,0xa7,0x22,0x88,
0xa6,0xa6,0x66,0x99,0xa6,0xa6,0x22,0x88,
0xa5,0xa5,0x55,0x55,0xa5,0xa5,0x22,0x88,
0xa4,0xa4,0x44,0x11,0xa4,0xa4,0x22,0x88,
0xa3,0xa3,0x33,0xcc,0xa3,0xa3,0x22,0x88,
0xa2,0xa2,0x22,0x88,0xa2,0xa2,0x22,0x88,
0xa1,0xa1,0x11,0x44,0xa1,0xa1,0x22,0x88,
0xa0,0xa0,0x00,0x00,0xa0,0xa0,0x22,0x88,
0x9f,0x9f,0xff,0xff,0x9f,0x9f,0x11,0x44,
0x9e,0x9e,0xee,0xbb,0x9e,0x9e,0x11,0x44,
0x9d,0x9d,0xdd,0x77,0x9d,0x9d,0x11,0x44,
0x9c,0x9c,0xcc,0x33,0x9c,0x9c,0x11,0x44,
0x9b,0x9b,0xbb,0xee,0x9b,0x9b,0x11,0x44,
0x9a,0x9a,0xaa,0xaa,0x9a,0x9a,0x11,0x44,
0x99,0x99,0x99,0x66,0x99,0x99,0x11,0x44,
0x98,0x98,0x88,0x22,0x98,0x98,0x11,0x44,
0x97,0x97,0x77,0xdd,0x97,0x97,0x11,0x44,
0x96,0x96,0x66,0x99,0x96,0x96,0x11,0x44,
0x95,0x95,0x55,0x55,0x95,0x95,0x11,0x44,
0x94,0x94,0x44,0x11,0x94,0x94,0x11,0x44,
0x93,0x93,0x33,0xcc,0x93,0x93,0x11,0x44,
0x92,0x92,0x22,0x88,0x92,0x92,0x11,0x44,
0x91,0x91,0x11,0x44,0x91,0x91,0x11,0x44,
0x90,0x90,0x00,0x00,0x90,0x90,0x11,0x44,
0x8f,0x8f,0xff,0xff,0x8f,0x8f,0x00,0x00,
0x8e,0x8e,0xee,0xbb,0x8e,0x8e,0x00,0x00,
0x8d,0x8d,0xdd,0x77,0x8d,0x8d,0x00,0x00,
0x8c,0x8c,0xcc,0x33,0x8c,0x8c,0x00,0x00,
0x8b,0x8b,0xbb,0xee,0x8b,0x8b,0x00,0x00,
0x8a,0x8a,0xaa,0xaa,0x8a,0x8a,0x00,0x00,
0x89,0x89,0x99,0x66,0x89,0x89,0x00,0x00,
0x88,0x88,0x88,0x22,0x88,0x88,0x00,0x00,
0x87,0x87,0x77,0xdd,0x87,0x87,0x00,0x00,
0x86,0x86,0x66,0x99,0x86,0x86,0x00,0x00,
0x85,0x85,0x55,0x55,0x85,0x85,0x00,0x00,
0x84,0x84,0x44,0x11,0x84,0x84,0x00,0x00,
0x83,0x83,0x33,0xcc,0x83,0x83,0x00,0x00,
0x82,0x82,0x22,0x88,0x82,0x82,0x00,0x00,
0x81,0x81,0x11,0x44,0x81,0x81,0x00,0x00,
0x80,0x80,0x00,0x00,0x80,0x80,0x00,0x00
];

337
js/apple2io.js Normal file
View File

@ -0,0 +1,337 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*globals debug: false, toHex: false, each: false */
/*exported Apple2IO */
function Apple2IO(cpu, callbacks)
{
var SAMPLE_RATE = 64;
var _buffer = [];
var _key = 0;
var _keyDown = false;
var _button = [false, false, false];
var _paddle = [0.0, 0.0, 0.0, 0,0];
var _phase = -1;
var _sample = [];
var _oldSample = [];
var _sampleTime = 0;
var _high = "%A0";
var _low = "%60";
var _trigger = 0;
var LOC = {
KEYBOARD: 0x00, // keyboard data (latched) (Read),
CLR80VID: 0x0C, // clear 80 column mode
SET80VID: 0x0D, // set 80 column mode
CLRALTCH: 0x0E, // clear 80 column mode
SETALTCH: 0x0F, // set 80 column mode
STROBE: 0x10, // clear bit 7 of keyboard data ($C000)
RDTEXT: 0x1A, // using text mode
RDMIXED: 0x1B, // using mixed mode
RDPAGE2: 0x1C, // using text/graphics page2
RDHIRES: 0x1D, // using Hi-res graphics mode
RDALTCH: 0x1E, // using alternate character set
RD80VID: 0x1F, // using 80-column display mode
TAPEOUT: 0x20, // toggle the cassette output.
SPEAKER: 0x30, // toggle speaker diaphragm
CLRTEXT: 0x50, // display graphics
SETTEXT: 0x51, // display text
CLRMIXED: 0x52, // clear mixed mode- enable full graphics
SETMIXED: 0x53, // enable graphics/text mixed mode
PAGE1: 0x54, // select text/graphics page1
PAGE2: 0x55, // select text/graphics page2
CLRHIRES: 0x56, // select Lo-res
SETHIRES: 0x57, // select Hi-res
CLRAN0: 0x58, // Set annunciator-0 output to 0
SETAN0: 0x59, // Set annunciator-0 output to 1
CLRAN1: 0x5A, // Set annunciator-1 output to 0
SETAN1: 0x5B, // Set annunciator-1 output to 1
CLRAN2: 0x5C, // Set annunciator-2 output to 0
SETAN2: 0x5D, // Set annunciator-2 output to 1
CLRAN3: 0x5E, // Set annunciator-3 output to 0
SETAN3: 0x5F, // Set annunciator-3 output to 1
TAPEIN: 0x60, // bit 7: data from cassette
PB0: 0x61, // game Pushbutton 0 / open apple (command) key data
PB1: 0x62, // game Pushbutton 1 / closed apple (option) key data
PB2: 0x63, // game Pushbutton 2 (read)
PADDLE0: 0x64, // bit 7: status of pdl-0 timer (read)
PADDLE1: 0x65, // bit 7: status of pdl-1 timer (read)
PADDLE2: 0x66, // bit 7: status of pdl-2 timer (read)
PADDLE3: 0x67, // bit 7: status of pdl-3 timer (read)
PDLTRIG: 0x70, // trigger paddles
SETIOUDIS:0x7E, // Enable double hires
CLRIOUDIS:0x7F // Disable double hires
};
function _debug() {
// debug.apply(arguments);
}
var _locs = [];
function _access(off) {
var result = 0;
var now = cpu.cycles();
var delta = now - _trigger;
switch (off) {
case LOC.CLR80VID:
// _debug("80 Column Mode off");
if ('_80col' in callbacks) callbacks._80col(false);
break;
case LOC.SET80VID:
// _debug("80 Column Mode on");
if ('_80col' in callbacks) callbacks._80col(true);
break;
case LOC.CLRALTCH:
// _debug("Alt Char off");
if ('altchar' in callbacks) callbacks.altchar(false);
break;
case LOC.SETALTCH:
// _debug("Alt Char on");
if ('altchar' in callbacks) callbacks.altchar(true);
break;
case LOC.CLRTEXT:
_debug("Graphics Mode");
callbacks.text(false);
break;
case LOC.SETTEXT:
_debug("Text Mode");
callbacks.text(true);
break;
case LOC.CLRMIXED:
_debug("Mixed Mode off");
callbacks.mixed(false);
break;
case LOC.SETMIXED:
_debug("Mixed Mode on");
callbacks.mixed(true);
break;
case LOC.CLRHIRES:
_debug("LoRes Mode");
callbacks.hires(false);
break;
case LOC.SETHIRES:
_debug("HiRes Mode");
callbacks.hires(true);
break;
case LOC.PAGE1:
callbacks.page(1);
break;
case LOC.PAGE2:
callbacks.page(2);
break;
case LOC.RDTEXT:
if ('isText' in callbacks)
result = callbacks.isText() ? 0x80 : 0x0;
break;
case LOC.RDMIXED:
if ('isMixed' in callbacks)
result = callbacks.isMixed() ? 0x80 : 0x0;
break;
case LOC.RDPAGE2:
if ('isPage2' in callbacks)
result = callbacks.isPage2() ? 0x80 : 0x0;
break;
case LOC.RDHIRES:
if ('isHires' in callbacks)
result = callbacks.isHires() ? 0x80 : 0x0;
break;
case LOC.RD80VID:
if ('is80Col' in callbacks)
result = callbacks.is80Col() ? 0x80 : 0x0;
break;
case LOC.RDALTCH:
if ('isAltChar' in callbacks)
result = callbacks.isAltChar() ? 0x80 : 0x0;
break;
case LOC.SETAN0:
_debug('Annunciator 0 on');
if ('annunciator' in callbacks) callbacks.annunicator(0, true);
break;
case LOC.SETAN1:
_debug('Annunciator 1 on');
if ('annunciator' in callbacks) callbacks.annunicator(1, true);
break;
case LOC.SETAN2:
_debug('Annunciator 2 on');
if ('annunciator' in callbacks) callbacks.annunicator(2, true);
break;
case LOC.SETAN3:
_debug('Annunciator 3 on');
if ('annunciator' in callbacks) callbacks.annunicator(3, true);
if ('doublehires' in callbacks) callbacks.doublehires(false);
break;
case LOC.CLRAN0:
_debug('Annunciator 0 off');
if ('annunciator' in callbacks) callbacks.annunicator(0, false);
break;
case LOC.CLRAN1:
_debug('Annunciator 1 off');
if ('annunciator' in callbacks) callbacks.annunicator(1, false);
break;
case LOC.CLRAN2:
_debug('Annunciator 2 off');
if ('annunciator' in callbacks) callbacks.annunicator(2, false);
break;
case LOC.CLRAN3:
_debug('Annunciator 3 off');
if ('annunciator' in callbacks) callbacks.annunicator(3, false);
if ('doublehires' in callbacks) callbacks.doublehires(true);
break;
case LOC.SPEAKER:
if (_sampleTime) {
var phase = _phase > 0 ? _high : _low;
for (; _sampleTime < now; _sampleTime += SAMPLE_RATE) {
_sample.push(phase);
}
_phase = -_phase;
}
break;
case LOC.STROBE:
_key &= 0x7f;
if (_buffer.length > 0) {
_key = _buffer.shift().charCodeAt(0) | 0x80;
}
result = _keyDown ? 0x80 : 0x00;
break;
case LOC.KEYBOARD:
result = _key;
break;
case LOC.PB0:
result = _button[0] ? 0x80 : 0;
break;
case LOC.PB1:
result = _button[1] ? 0x80 : 0;
break;
case LOC.PB2:
result = _button[2] ? 0x80 : 0;
break;
case LOC.PADDLE0:
result = (delta < (_paddle[0] * 2560) ? 0x80 : 0x00);
break;
case LOC.PADDLE1:
result = (delta < (_paddle[1] * 2560) ? 0x80 : 0x00);
break;
case LOC.PADDLE2:
result = (delta < (_paddle[2] * 2560) ? 0x80 : 0x00);
break;
case LOC.PADDLE3:
result = (delta < (_paddle[3] * 2560) ? 0x80 : 0x00);
break;
case LOC.PDLTRIG:
_trigger = cpu.cycles();
break;
}
return result;
}
return {
registerSwitches: function apple2io_registerSwitches(a, locs) {
each(locs, function(key) {
var val = locs[key];
if (_locs[val]) {
debug('duplicate switch! ' + toHex(val));
}
_locs[val] = a;
});
},
start: function apple2io_start() {
this.registerSwitches(this, LOC);
return 0xc0;
},
end: function apple2io_end() {
return 0xc0;
},
read: function apple2io_read(page, off) {
var result = 0;
if (_locs[off]) {
result = _locs[off].ioSwitch(off);
} else {
debug("I/O read: C0" + toHex(off));
}
return result;
},
write: function apple2io_write(page, off, val) {
if (_locs[off]) {
_locs[off].ioSwitch(off, val);
} else {
debug("I/O write: C0" + toHex(off));
}
},
getState: function apple2io_getState() { return {}; },
setState: function apple2io_setState() { },
ioSwitch: function apple2io_ioSwitch(off, val) {
return _access(off, val);
},
keyDown: function apple2io_keyDown(ascii) {
_keyDown = true;
_key = ascii | 0x80;
},
keyUp: function apple2io_keyUp() {
_keyDown = false;
_key = 0;
},
buttonDown: function apple2io_buttonDown(b) {
_button[b] = true;
},
buttonUp: function apple2io_buttonUp(b) {
_button[b] = false;
},
paddle: function apple2io_paddle(p, v) {
_paddle[p] = v;
},
getSample: function apple2io_getSample(stop) {
var result = _sample;
var now = cpu.cycles();
//if (_sampleTime) {
// var phase = _phase > 0 ? _high : _low;
// for (; _sampleTime < now; _sampleTime += SAMPLE_RATE)
// _sample.push(phase);
//}
_sample = _oldSample;
_sample.length = 0;
_sampleTime = stop ? 0 : now;
_oldSample = result;
return result;
},
floatAudio: function apple2io_floatAudio(rate) {
_low = -0.5;
_high = 0.5;
SAMPLE_RATE = 1023000.0 / rate;
},
byteAudio: function apple2io_floatAudio(rate) {
_low = 0xa0;
_high = 0x60;
SAMPLE_RATE = 1023000.0 / rate;
},
setKeyBuffer: function apple2io_setKeyBuffer(buffer) {
_buffer = buffer.split("");
if (_buffer.length > 0) {
_keyDown = true;
_key = _buffer.shift().charCodeAt(0) | 0x80;
}
}
};
}

112
js/base64.js Normal file
View File

@ -0,0 +1,112 @@
/*exported base64_encode, base64_decode */
function base64_encode (data) {
// Twacked by Will Scullin to handle arrays of "bytes"
// http://kevin.vanzonneveld.net
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Bayron Guevara
// + improved by: Thunder.m
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Pellentesque Malesuada
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// - depends on: utf8_encode
// * example 1: base64_encode('Kevin van Zonneveld');
// * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
// mozilla has this native
// - but breaks in 2.0.0.12!
//if (typeof this.window['atob'] == 'function') {
// return atob(data);
//}
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];
if (!data) {
return data;
}
do { // pack three octets into four hexets
o1 = data[i++];
o2 = data[i++];
o3 = data[i++];
bits = o1<<16 | o2<<8 | o3;
h1 = bits>>18 & 0x3f;
h2 = bits>>12 & 0x3f;
h3 = bits>>6 & 0x3f;
h4 = bits & 0x3f;
// use hexets to index into b64, and append result to encoded string
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < data.length);
enc = tmp_arr.join('');
switch (data.length % 3) {
case 1:
enc = enc.slice(0, -2) + '==';
break;
case 2:
enc = enc.slice(0, -1) + '=';
break;
}
return enc;
}
function base64_decode(data) {
// Twacked by Will Scullin to handle arrays of "bytes"
// http://kevin.vanzonneveld.net
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Thunder.m
// + input by: Aman Gupta
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + bugfixed by: Pellentesque Malesuada
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + input by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// - depends on: utf8_decode
// * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
// * returns 1: 'Kevin van Zonneveld'
// mozilla has this native
// - but breaks in 2.0.0.12!
//if (typeof this.window['btoa'] == 'function') {
// return btoa(data);
//}
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, tmp_arr = [];
if (!data) {
return data;
}
do { // unpack four hexets into three octets using index points in b64
h1 = b64.indexOf(data.charAt(i++));
h2 = b64.indexOf(data.charAt(i++));
h3 = b64.indexOf(data.charAt(i++));
h4 = b64.indexOf(data.charAt(i++));
bits = h1<<18 | h2<<12 | h3<<6 | h4;
o1 = bits>>16 & 0xff;
o2 = bits>>8 & 0xff;
o3 = bits & 0xff;
tmp_arr[ac++] = o1;
if (h3 != 64) {
tmp_arr[ac++] = o2;
}
if (h4 != 64) {
tmp_arr[ac++] = o3;
}
} while (i < data.length);
return tmp_arr;
}

412
js/canvas2.js Normal file
View File

@ -0,0 +1,412 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*globals allocMemPages: false,
charset: false,
base64_encode: false, base64_decode: false */
/*exported LoresPage, HiresPage, VideoModes*/
/*
* Text Page 1 Drawing
*/
var textMode = true;
var mixedMode = true;
var hiresMode = false;
var pageMode = 1;
var pages = [];
var context = null;
function LoresPage(page)
{
var _page = page;
var _buffer = [];
var _refreshing = false;
var _greenMode = false;
var _black = [0x00,0x00,0x00];
var _white = [0xff,0xff,0xff];
var _green = [0x00,0xff,0x00];
var _colors = [
[0x00,0x00,0x00], // 0 Black 0000 0 0
[0x90,0x17,0x40], // 1 Red 0001 8 1
[0x3c,0x22,0xa5], // 2 Dark Blue 1000 1
[0xd0,0x43,0xe5], // 3 Purple 1001 9
[0x00,0x69,0x40], // 4 Dark Green 0100 4
[0xb0,0xb0,0xb0], // 5 Gray 1 0101 5
[0x2f,0x95,0xe5], // 6 Medium Blue 1100 12
[0xbf,0xab,0xff], // 7 Light Blue 1101 13
[0x40,0x54,0x00], // 8 Brown 0010 2
[0xd0,0x6a,0x1a], // 9 Orange 0011 3
[0x40,0x40,0x40], // 10 Gray 2 1010 10
[0xff,0x96,0xbf], // 11 Pink 1011 11
[0x2f,0xbc,0x1a], // 12 Light Green 0110 6
[0xb9,0xd0,0x60], // 13 Yellow 0111 7
[0x6f,0xe8,0xbf], // 14 Aqua 1110 14
[0xff,0xff,0xff] // 15 White 1111 15
/* Alternate from http://mrob.com/pub/xapple2/colors.html
[ 0, 0, 0], // 0 Black
[227, 30, 96], // 1 Red
[ 96, 78,189], // 2 Dark Blue
[255, 68,253], // 3 Purple
[ 0,163, 96], // 4 Dark Green
[156,156,156], // 5 Grey
[ 20,207,253], // 6 Med Blue
[208,195,255], // 7 Light Blue
[ 96,114, 3], // 8 Brown
[255,106, 60], // 9 Orange
[156,156,156], // 10 Grey
[255,160,208], // 11 Pink
[ 20,245, 60], // 12 Light Green
[208,221,141], // 13 Yellow
[114,255,208], // 14 Aqua
[255,255,255] // 15 White
*/
];
function _init() {
_buffer = allocMemPages(0x4);
for (var idx = 0; idx < 0x400; idx++) {
_buffer[idx] = 0; // Math.floor(Math.random()*256);
}
}
_init();
return {
start: function() { return (0x04 * _page); },
end: function() { return (0x04 * _page) + 0x03; },
read: function(page, off) {
var addr = (page << 8) | off,
base = addr - 0x400 * _page;
return _buffer[base];
},
write: function(page, off, val) {
var addr = (page << 8) | off,
base = addr - 0x400 * _page;
if (_buffer[base] === val && !_refreshing)
return;
_buffer[base] = val;
var col = (base % 0x80) % 0x28,
adj = off - col;
// 000001cd eabab000 -> 000abcde
var ab = (adj & 0x18),
cd = (page & 0x03) << 1,
e = adj >> 7;
var row = ab | cd | e, color, idx, jdx, b;
if ((row < 24) && (col < 40)) {
if (!textMode && hiresMode && !(mixedMode && row > 19))
return;
var data = pages[_page].data, fore, back;
off = (col * 7 + row * 280 * 8) * 4;
if (textMode || (mixedMode && row > 19)) {
if (val & 0x80) {
fore = _greenMode ? _green : _white;
back = _black;
} else {
fore = _black;
back = _greenMode ? _green : _white;
}
for (jdx = 0; jdx < 8; jdx++) {
b = charset[(val & 0x3f) * 8 + jdx];
b <<= 1;
for (idx = 0; idx < 7; idx++) {
color = (b & 0x80) ? fore : back;
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
b <<= 1;
off += 4;
}
off += 273 * 4;
}
} else {
for (jdx = 0; jdx < 8; jdx++) {
color = _colors[(jdx < 4) ? (val & 0x0f) : (val >> 4)];
for (idx = 0; idx < 7; idx++) {
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
off += 4;
}
off += 273 * 4;
}
}
}
},
refresh: function() {
var addr = 0x400 * _page;
_refreshing = true;
for (var idx = 0; idx < 0x400; idx++, addr++) {
this.write(addr >> 8, addr & 0xff, _buffer[idx]);
}
_refreshing = false;
},
green: function(on) {
_greenMode = on;
this.refresh();
},
blit: function() {
context.putImageData(pages[_page], 0, 0);
},
getState: function() {
return {
page: _page,
green: _green,
buffer: base64_encode(_buffer)
};
},
setState: function(state) {
_page = state.page;
_green = state.green;
_buffer = base64_decode(state.buffer);
this.refresh();
}
};
}
function HiresPage(page)
{
var _page = page;
var orangeCol = [0xff, 0x65, 0x00];
var greenCol = [0x00, 0xff, 0x00];
var blueCol = [0x09, 0x2a, 0xff];
var violetCol = [0xc9, 0x39, 0xc7];
var whiteCol = [0xff, 0xff, 0xff];
var blackCol = [0x00, 0x00, 0x00];
var _buffer = [];
var _refreshing = false;
var _green = false;
function _init() {
_buffer = allocMemPages(0x20);
for (var idx = 0; idx < 0x2000; idx++)
_buffer[idx] = 0; // Math.floor(Math.random()*256);
}
_init();
return {
start: function() { return (0x20 * _page); },
end: function() { return (0x020 * _page) + 0x1f; },
read: function(page, off) {
var addr = (page << 8) | off,
base = addr - 0x2000 * _page;
return _buffer[base];
},
write: function(page, off, val) {
var addr = (page << 8) | off,
base = addr - 0x2000 * _page;
if (_buffer[base] === val && !_refreshing)
return;
_buffer[base] = val;
var hbs = val & 0x80;
val &= 0x7f;
var col = (base % 0x80) % 0x28,
adj = off - col;
// 000001cd eabab000 -> 000abcde
var ab = (adj & 0x18),
cd = (page & 0x03) << 1,
e = adj >> 7;
var rowa = ab | cd | e,
rowb = base >> 10;
if ((rowa < 24) && (col < 40)) {
if (textMode || !hiresMode || (mixedMode && rowa > 19))
return;
var data = pages[_page].data,
dy = rowa * 8 + rowb,
dx = col * 7 - 1,
b0 = col > 0 ? _buffer[base - 1] : 0,
b2 = col < 39 ? _buffer[base + 1] : 0;
val |= (b2 & 0x3) << 7;
var v0 = b0 & 0x20, v1 = b0 & 0x40, v2 = val & 0x1,
odd = !(col & 0x1),
color,
oddCol = (hbs ? orangeCol : greenCol),
evenCol = (hbs ? blueCol : violetCol);
off = dx * 4 + dy * 280 * 4;
for (var idx = 0; idx < 9; idx++, off += 4) {
val >>= 1;
if (v1) {
if (_green) {
color = greenCol;
} else if (v0 || v2) {
color = whiteCol;
} else {
color = odd ? oddCol : evenCol;
}
} else {
if (_green) {
color = blackCol;
} else if (odd && v0 && v2) {
color = evenCol;
} else if (!odd && v0 && v2) {
color = oddCol;
} else {
color = blackCol;
}
}
if (dx > -1 && dx < 280) {
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
}
dx++;
v0 = v1;
v1 = v2;
v2 = val & 0x01;
odd = !odd;
}
}
},
refresh: function() {
var addr = 0x2000 * _page;
_refreshing = true;
for (var idx = 0; idx < 0x2000; idx++, addr++) {
this.write(addr >> 8, addr & 0xff, _buffer[idx]);
}
_refreshing = false;
},
green: function(on) {
_green = on;
this.refresh();
},
blit: function() {
context.putImageData(pages[_page], 0, 0);
},
getState: function() {
return {
page: _page,
green: _green,
buffer: base64_encode(_buffer)
};
},
setState: function(state) {
_page = state.page;
_green = state.green;
_buffer = base64_decode(state.buffer);
this.refresh();
}
};
}
function VideoModes(gr,hgr,gr2,hgr2) {
var _grs = [gr, gr2];
var _hgrs = [hgr, hgr2];
function _refresh() {
_grs[0].refresh();
_grs[1].refresh();
_hgrs[0].refresh();
_hgrs[1].refresh();
}
return {
refresh: function() {
_refresh();
},
text: function(on) {
var old = textMode;
textMode = on;
if (old != on) {
_refresh();
}
},
hires: function(on) {
var old = hiresMode;
hiresMode = on;
if (old != on) {
_refresh();
}
},
mixed: function(on) {
var old = mixedMode;
mixedMode = on;
if (old != on) {
_refresh();
}
},
page: function(pageNo) {
pageMode = pageNo;
},
setContext: function(c) {
context = c;
pages[1] = context.createImageData(280, 192);
pages[2] = context.createImageData(280, 192);
for (var idx = 0; idx < 280 * 192 * 4; idx++) {
pages[1].data[idx] = 0xff;
pages[2].data[idx] = 0xff;
}
},
blit: function() {
if (hiresMode && !textMode) {
_hgrs[pageMode - 1].blit();
} else {
_grs[pageMode - 1].blit();
}
},
getState: function() {
return {
grs: [_grs[0].getState(), _grs[1].getState()],
hgrs: [_hgrs[0].getState(), _hgrs[1].getState()],
textMode: textMode,
mixedMode: mixedMode,
hiresMode: hiresMode,
pageMode: pageMode
};
},
setState: function(state) {
textMode = state.textMode;
mixedMode = state.mixedMode;
hiresMode = state.hiresMode;
pageMode = state.pageMode;
_grs[0].setState(state.grs[0]);
_grs[1].setState(state.grs[1]);
_hgrs[0].setState(state.hgrs[0]);
_hgrs[1].setState(state.hgrs[1]);
},
green: function(on) {
_grs[0].green(on);
_grs[1].green(on);
_hgrs[0].green(on);
_hgrs[1].green(on);
}
};
}

698
js/canvas2e.js Normal file
View File

@ -0,0 +1,698 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*globals allocMemPages: false, charset: false, base64_encode: false, base64_decode: false */
/*exported LoresPage, HiresPage, VideoModes */
var GREEN = [0x00,0xff,0x00];
// var WHITE = [0xff,0xff,0xff];
var MONO = GREEN;
var textMode = true;
var mixedMode = false;
var hiresMode = false;
var pageMode = 1;
var _80colMode = false;
var altCharMode = false;
var doubleHiresMode = false;
var pages = [];
var context = null;
/****************************************************************************
*
* Text/Lores Graphics
*
***************************************************************************/
function LoresPage(page)
{
var _page = page;
var _buffer = [];
var _refreshing = false;
var _greenMode = false;
var _black = [0x00,0x00,0x00];
var _white = [0xff,0xff,0xff];
var _green = [0x00,0xff,0x00];
var _colors = [
[0x00,0x00,0x00], // 0 Black 0000 0 0
[0x90,0x17,0x40], // 1 Red 0001 8 1
[0x3c,0x22,0xa5], // 2 Dark Blue 1000 1
[0xd0,0x43,0xe5], // 3 Purple 1001 9
[0x00,0x69,0x40], // 4 Dark Green 0100 4
[0xb0,0xb0,0xb0], // 5 Gray 1 0101 5
[0x2f,0x95,0xe5], // 6 Medium Blue 1100 12
[0xbf,0xab,0xff], // 7 Light Blue 1101 13
[0x40,0x54,0x00], // 8 Brown 0010 2
[0xd0,0x6a,0x1a], // 9 Orange 0011 3
[0x40,0x40,0x40], // 10 Gray 2 1010 10
[0xff,0x96,0xbf], // 11 Pink 1011 11
[0x2f,0xbc,0x1a], // 12 Light Green 0110 6
[0xb9,0xd0,0x60], // 13 Yellow 0111 7
[0x6f,0xe8,0xbf], // 14 Aqua 1110 14
[0xff,0xff,0xff] // 15 White 1111 15
];
function _init() {
_buffer[0] = allocMemPages(0x4);
_buffer[1] = allocMemPages(0x4);
for (var idx = 0; idx < 0x400; idx++) {
_buffer[0][idx] = 0; // idx & 0x2 ? 0xff : 0x00;
_buffer[1][idx] = 0; // idx & 0x2 ? 0xff : 0x00;
}
}
_init();
return {
bank0: function() {
var self = this;
return {
start: function() {
return self._start();
},
end: function() {
return self._end();
},
read: function(page, off) {
return self._read(page, off, 0);
},
write: function(page, off, val) {
return self._write(page, off, val, 0);
}
};
},
bank1: function() {
var self = this;
return {
start: function() {
return self._start();
},
end: function() {
return self._end();
},
read: function(page, off) {
return self._read(page, off, 1);
},
write: function(page, off, val) {
return self._write(page, off, val, 1);
}
};
},
// These are used by both bank 0 and 1
_start: function() { return (0x04 * _page); },
_end: function() { return (0x04 * _page) + 0x03; },
_read: function(page, off, bank) {
var addr = (page << 8) | off,
base = addr - 0x400 * _page;
return _buffer[bank][base];
},
_write: function(page, off, val, bank) {
var addr = (page << 8) | off,
base = addr - 0x400 * _page,
fore, back;
if (_buffer[bank][base] == val && !_refreshing)
return;
_buffer[bank][base] = val;
if (bank !== 0 && !_80colMode)
return;
var col = (base % 0x80) % 0x28,
adj = off - col;
// 000001cd eabab000 -> 000abcde
var ab = (adj & 0x18),
cd = (page & 0x03) << 1,
e = adj >> 7;
var idx, jdx;
var row = ab | cd | e;
var data = pages[_page].data;
if ((row < 24) && (col < 40)) {
if (!textMode && hiresMode && !(mixedMode && row > 19))
return;
var color;
if (textMode || (mixedMode && row > 19)) {
var b;
fore = _greenMode ? _green : _white;
back = _black;
if (!altCharMode && !_80colMode) {
val = (val >= 0x40 && val < 0x80) ? val - 0x40 : val;
}
if (_80colMode) {
off = (col * 14 + (bank ? 0 : 1) * 7 + row * 560 * 8) * 4;
for (jdx = 0; jdx < 8; jdx++) {
b = charset[val * 8 + jdx];
for (idx = 0; idx < 7; idx++) {
color = (b & 0x01) ? back : fore;
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
b >>= 1;
off += 4;
}
off += 553 * 4;
}
} else {
off = (col * 14 + row * 560 * 8) * 4;
for (jdx = 0; jdx < 8; jdx++) {
b = charset[val * 8 + jdx];
for (idx = 0; idx < 7; idx++) {
color = (b & 0x01) ? back : fore;
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
data[off + 4] = color[0];
data[off + 5] = color[1];
data[off + 6] = color[2];
b >>= 1;
off += 8;
}
off += 546 * 4;
}
}
} else {
if (_80colMode) {
off = (col * 14 + (bank ? 0 : 1) * 7 + row * 560 * 8) * 4;
for (jdx = 0; jdx < 8; jdx++) {
color = _colors[(jdx < 4) ?
(val & 0x0f) : (val >> 4)];
for (idx = 0; idx < 7; idx++) {
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
off += 4;
}
off += 553 * 4;
}
} else {
off = (col * 14 + row * 560 * 8) * 4;
for (jdx = 0; jdx < 8; jdx++) {
color = _colors[(jdx < 4) ?
(val & 0x0f) : (val >> 4)];
for (idx = 0; idx < 7; idx++) {
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
data[off + 4] = color[0];
data[off + 5] = color[1];
data[off + 6] = color[2];
off += 8;
}
off += 546 * 4;
}
}
}
}
},
refresh: function() {
var page, off, addr = 0x400 * _page;
_refreshing = true;
for (var idx = 0; idx < 0x400; idx++, addr++) {
page = addr >> 8;
off = addr & 0xff;
this._write(addr >> 8, addr & 0xff, _buffer[0][idx], 0);
if (_80colMode)
this._write(addr >> 8, addr & 0xff, _buffer[1][idx], 1);
}
_refreshing = false;
},
green: function(on) {
_greenMode = on;
},
blit: function() {
context.putImageData(pages[_page], 0, 0);
},
getState: function() {
return {
page: _page,
green: _green,
buffer: [base64_encode(_buffer[0]),
base64_encode(_buffer[1])]
};
},
setState: function(state) {
_page = state.page;
_green = state.green;
_buffer[0] = base64_decode(state.buffer[0]);
_buffer[1] = base64_decode(state.buffer[1]);
this.refresh();
}
};
}
/****************************************************************************
*
* Hires Graphics
*
***************************************************************************/
function HiresPage(page)
{
var _page = page;
var r4 = [0, // Black
2, // Dark Blue
4, // Dark Green
6, // Medium Blue
8, // Brown
5, // Gray 1
12, // Light Green
14, // Aqua
1, // Red
3, // Purple
10, // Gray 2
7, // Pink
9, // Orange
11, // Light Blue
13, // Yellow
15]; // White
var dcolors = [
[0x00,0x00,0x00], // 0 Black 0000 0 0
[0x90,0x17,0x40], // 1 Red 0001 8 1
[0x3c,0x22,0xa5], // 2 Dark Blue 1000 1
[0xd0,0x43,0xe5], // 3 Purple 1001 9
[0x00,0x69,0x40], // 4 Dark Green 0100 4
[0xb0,0xb0,0xb0], // 5 Gray 1 0101 5
[0x2f,0x95,0xe5], // 6 Medium Blue 1100 12
[0xbf,0xab,0xff], // 7 Light Blue 1101 13
[0x40,0x54,0x00], // 8 Brown 0010 2
[0xd0,0x6a,0x1a], // 9 Orange 0011 3
[0x40,0x40,0x40], // 10 Gray 2 1010 10
[0xff,0x96,0xbf], // 11 Pink 1011 11
[0x2f,0xbc,0x1a], // 12 Light Green 0110 6
[0xb9,0xd0,0x60], // 13 Yellow 0111 7
[0x6f,0xe8,0xbf], // 14 Aqua 1110 14
[0xff,0xff,0xff] // 15 White 1111 15
];
// hires colors
var orangeCol = [0xff, 0x65, 0x00];
var greenCol = [0x00, 0xff, 0x00];
var blueCol = [0x09, 0x2a, 0xff];
var violetCol = [0xc9, 0x39, 0xc7];
var whiteCol = [0xff, 0xff, 0xff];
var blackCol = [0x00, 0x00, 0x00];
var _buffer = [];
var _refreshing = false;
var _green = false;
var _garish = false;
function _init() {
_buffer[0] = allocMemPages(0x20);
_buffer[1] = allocMemPages(0x20);
for (var idx = 0; idx < 0x2000; idx++) {
_buffer[0][idx] = 0; // idx & 0x2 ? 0xff : 0x00;
_buffer[1][idx] = 0; // idx & 0x2 ? 0xff : 0x00;
}
}
_init();
return {
bank0: function() {
var self = this;
return {
start: function() {
return self._start();
},
end: function() {
return self._end();
},
read: function(page, off) {
return self._read(page, off, 0);
},
write: function(page, off, val) {
return self._write(page, off, val, 0);
}
};
},
bank1: function() {
var self = this;
return {
start: function() {
return self._start();
},
end: function() {
return self._end();
},
read: function(page, off) {
return self._read(page, off, 1);
},
write: function(page, off, val) {
return self._write(page, off, val, 1);
}
};
},
_start: function() { return (0x20 * _page); },
_end: function() { return (0x020 * _page) + 0x1f; },
_read: function(page, off, bank) {
var addr = (page << 8) | off, base = addr - 0x2000 * _page;
return _buffer[bank][base];
},
_write: function(page, off, val, bank) {
var addr = (page << 8) | off, base = addr - 0x2000 * _page,
idx, jdx;
if (_buffer[bank][base] == val && !_refreshing)
return;
_buffer[bank][base] = val;
if (bank !== 0 && !doubleHiresMode)
return;
var hbs = val & 0x80;
val &= 0x7f;
var col = (base % 0x80) % 0x28,
adj = off - col;
// 000001cd eabab000 -> 000abcde
var ab = (adj & 0x18),
cd = (page & 0x03) << 1,
e = adj >> 7;
var rowa = ab | cd | e,
rowb = base >> 10;
var dx, dy, data = pages[_page].data;
if ((rowa < 24) && (col < 40)) {
if (textMode || !hiresMode || (mixedMode && rowa > 19))
return;
dy = rowa * 16 + rowb * 2;
var b0, b1, b2, b3, b4, c;
if (doubleHiresMode) {
// Every 4 bytes is 7 pixels
// 2 bytes per bank
var mod = col % 2, mcol = col - mod;
b0 = _buffer[1][base - mod];
b1 = _buffer[0][base - mod];
b2 = _buffer[1][base - mod + 1];
b3 = _buffer[0][base - mod + 1];
b4 = _buffer[1][base - mod + 2];
c = [((b0 & 0x0f) >> 0), // 0
((b0 & 0x70) >> 4) | ((b1 & 0x01) << 3), // 1
((b1 & 0x1e) >> 1), // 2
((b1 & 0x60) >> 5) | ((b2 & 0x03) << 2), // 3
((b2 & 0x3c) >> 2), // 4
((b2 & 0x40) >> 6) | ((b3 & 0x07) << 1), // 5
((b3 & 0x78) >> 3), // 6
0]; // 7
if (col < 39) {
c[7] = b4 & 0x0f;
}
dx = mcol * 14;
off = dx * 4 + dy * 280 * 4;
for (idx = 0; idx < 7; idx++) {
var dcolor = _green ? MONO : dcolors[r4[c[idx]]];
var bits = c[idx] | (c[idx + 1] << 4);
for (jdx = 0; jdx < 4; jdx++, off += 4) {
var saturate = !MONO && (_garish || bits & 0xe);
if (bits & 0x1 || saturate) {
data[off + 0] = dcolor[0];
data[off + 1] = dcolor[1];
data[off + 2] = dcolor[2];
} else {
data[off + 0] = 0; // dcolor[0] >> 1;
data[off + 1] = 0; // dcolor[1] >> 1;
data[off + 2] = 0; // dcolor[2] >> 1;
}
bits >>= 1;
}
}
} else {
dx = col * 14 - 2;
b0 = col > 0 ? _buffer[bank][base - 1] : 0;
b2 = col < 39 ? _buffer[bank][base + 1] : 0;
val |= (b2 & 0x3) << 7;
var v0 = b0 & 0x20, v1 = b0 & 0x40, v2 = val & 0x1,
odd = !(col & 0x1), color,
oddCol = (hbs ? orangeCol : greenCol),
evenCol = (hbs ? blueCol : violetCol);
off = dx * 4 + dy * 280 * 4;
for (idx = 0; idx < 9; idx++, off += 8) {
val >>= 1;
if (v1) {
if (_green) {
color = MONO;
} else if (v0 || v2) {
color = whiteCol;
} else {
color = odd ? oddCol : evenCol;
}
} else {
if (_green) {
color = blackCol;
} else if (odd && v2 && (_garish || v0)) {
color = evenCol;
} else if (!odd && v0 && (_garish || v2)) {
color = oddCol;
} else {
color = blackCol;
}
}
if (dx > -1 && dx < 560) {
data[off + 0] = color[0];
data[off + 1] = color[1];
data[off + 2] = color[2];
data[off + 4] = color[0];
data[off + 5] = color[1];
data[off + 6] = color[2];
}
dx += 2;
v0 = v1;
v1 = v2;
v2 = val & 0x01;
odd = !odd;
}
}
}
},
refresh: function() {
var page, off, idx, addr = 0x2000 * _page;
_refreshing = true;
for (idx = 0; idx < 0x2000; idx++, addr++) {
page = addr >> 8;
off = addr & 0xff;
this._write(page, off, _buffer[0][idx], 0);
if (_80colMode)
this._write(page, off, _buffer[1][idx], 1);
}
_refreshing = false;
},
green: function(on) {
_green = on;
this.refresh();
},
garish: function(on) {
_garish = on;
this.refresh();
},
blit: function() {
context.putImageData(pages[_page], 0, 0);
},
getState: function() {
return {
page: _page,
green: _green,
garish: _garish,
buffer: [base64_encode(_buffer[0]),
base64_encode(_buffer[1])]
};
},
setState: function(state) {
_page = state.page;
_green = state.green;
_garish = state.garish;
_buffer[0] = base64_decode(state.buffer[0]);
_buffer[1] = base64_decode(state.buffer[1]);
this.refresh();
}
};
}
function VideoModes(gr,hgr,gr2,hgr2) {
var _grs = [gr, gr2];
var _hgrs = [hgr, hgr2];
function _refresh() {
gr.refresh();
gr2.refresh();
hgr.refresh();
hgr2.refresh();
}
return {
refresh: function() {
_refresh();
},
reset: function() {
textMode = true;
mixedMode = false;
hiresMode = true;
pageMode = 1;
_80colMode = false;
altCharMode = false;
doubleHiresMode = false;
_refresh();
},
text: function(on) {
var old = textMode;
textMode = on;
if (old != on) {
_refresh();
}
},
_80col: function(on) {
var old = _80colMode;
_80colMode = on;
if (old != on) {
_refresh();
}
},
altchar: function(on) {
var old = altCharMode;
altCharMode = on;
if (old != on) {
_refresh();
}
},
hires: function(on) {
var old = hiresMode;
hiresMode = on;
if (old != on) {
_refresh();
}
},
doublehires: function(on) {
var old = doubleHiresMode;
doubleHiresMode = on;
if (old != on) {
if (on) {
this.page(1);
}
_refresh();
}
},
mixed: function(on) {
var old = mixedMode;
mixedMode = on;
if (old != on) {
_refresh();
}
},
page: function(pageNo) {
pageMode = pageNo;
},
isText: function() {
return textMode;
},
isMixed: function() {
return mixedMode;
},
isPage2: function() {
return pageMode == 2;
},
isHires: function() {
return hiresMode;
},
is80Col: function() {
return _80colMode;
},
isAltChar: function() {
return altCharMode;
},
setContext: function(c) {
context = c;
pages[1] = c.createImageData(560, 192);
pages[2] = c.createImageData(560, 192);
for (var idx = 0; idx < 560 * 192 * 4; idx++) {
pages[1].data[idx] = 0xff;
pages[2].data[idx] = 0xff;
}
},
blit: function() {
if (hiresMode && !textMode) {
_hgrs[pageMode - 1].blit();
} else {
_grs[pageMode - 1].blit();
}
},
getState: function() {
return {
grs: [_grs[0].getState(), _grs[1].getState()],
hgrs: [_hgrs[0].getState(), _hgrs[1].getState()],
textMode: textMode,
mixedMode: mixedMode,
hiresMode: hiresMode,
pageMode: pageMode,
_80colMode: _80colMode,
altCharMode: altCharMode,
doubleHiresMode: doubleHiresMode
};
},
setState: function(state) {
textMode = state.textMode;
mixedMode = state.mixedMode;
hiresMode = state.hiresMode;
pageMode = state.pageMode;
_80colMode = state._80colMode;
altCharMode = state.altCharMode;
doubleHiresMode = state.doubleHiresMode;
_grs[0].setState(state.grs[0]);
_grs[1].setState(state.grs[1]);
_hgrs[0].setState(state.hgrs[0]);
_hgrs[1].setState(state.hgrs[1]);
},
green: function(on) {
_grs[0].green(on);
_grs[1].green(on);
_hgrs[0].green(on);
_hgrs[1].green(on);
},
garish: function(on) {
_hgrs[0].garish(on);
_hgrs[1].garish(on);
}
};
}

11
js/copyright.js Normal file
View File

@ -0,0 +1,11 @@
/*!
* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/

1342
js/cpu6502.js Normal file

File diff suppressed because it is too large Load Diff

795
js/disk2.js Normal file
View File

@ -0,0 +1,795 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*jshint browser: true */
/*globals extend: false, base64_encode: false, base64_decode: false, each: false */
/*exported DiskII */
function DiskII(io, callbacks, slot)
{
slot = slot || 6;
var _drives = [
{ // Drive 1
format: "dsk",
volume: 254,
tracks: [],
track: 0,
head: 0,
phase: 0,
readOnly: false,
dirty: false
},
{ // Drive 2
format: "dsk",
volume: 254,
tracks: [],
track: 0,
head: 0,
phase: 0,
readOnly: false,
dirty: false
}];
var _skip = 0;
var _latch = 0;
var _writeMode = false;
var _on = false;
var _drive = 1;
var _cur = _drives[_drive - 1];
var LOC = {
// Disk II Stuff
PHASE0OFF: 0x80,
PHASE0ON: 0x81,
PHASE1OFF: 0x82,
PHASE1ON: 0x83,
PHASE2OFF: 0x84,
PHASE2ON: 0x85,
PHASE3OFF: 0x86,
PHASE3ON: 0x87,
DRIVEOFF: 0x88,
DRIVEON: 0x89,
DRIVE1: 0x8A,
DRIVE2: 0x8B,
DRIVEREAD: 0x8C, // Q6L
DRIVEWRITE: 0x8D, // Q6H
DRIVEREADMODE: 0x8E, // Q7L
DRIVEWRITEMODE: 0x8F // Q7H
};
// var DO = [0x0,0x7,0xE,0x6,0xD,0x5,0xC,0x4,
// 0xB,0x3,0xA,0x2,0x9,0x1,0x8,0xF];
var _DO = [0x0,0xD,0xB,0x9,0x7,0x5,0x3,0x1,
0xE,0xC,0xA,0x8,0x6,0x4,0x2,0xF];
// var PO = [0x0,0x8,0x1,0x9,0x2,0xa,0x3,0xb,
// 0x4,0xc,0x5,0xd,0x6,0xe,0x7,0xf];
var _PO = [0x0,0x2,0x4,0x6,0x8,0xa,0xc,0xe,
0x1,0x3,0x5,0x7,0x9,0xb,0xd,0xf];
var _trans = [0x96, 0x97, 0x9a, 0x9b, 0x9d, 0x9e, 0x9f, 0xa6,
0xa7, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb2, 0xb3,
0xb4, 0xb5, 0xb6, 0xb7, 0xb9, 0xba, 0xbb, 0xbc,
0xbd, 0xbe, 0xbf, 0xcb, 0xcd, 0xce, 0xcf, 0xd3,
0xd6, 0xd7, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
0xdf, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xec,
0xed, 0xee, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
0xf7, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff];
var _detrans = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x02, 0x03, 0x00, 0x04, 0x05, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08,
0x00, 0x00, 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
0x00, 0x00, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,
0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1B, 0x00, 0x1C, 0x1D, 0x1E,
0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x20, 0x21,
0x00, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x2A, 0x2B,
0x00, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32,
0x00, 0x00, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
0x00, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F];
function _debug() {
// debug.apply(this, arguments);
}
function _init() {
each(LOC, function(key) {
LOC[key] += slot * 0x10;
});
}
/**
* From Beneath Apple DOS
*/
function _fourXfour(val) {
var xx = val & 0xaa;
var yy = val & 0x55;
xx >>= 1;
xx |= 0xaa;
yy |= 0xaa;
return [xx, yy];
}
function _defourXfour(xx, yy) {
return ((xx << 1) | 0x01) & yy;
}
function _explodeSector(volume, track, sector, data) {
var checksum;
var buf = [], idx;
var gap;
/*
* Gap 1/3 (40/0x28 bytes)
*/
if (sector === 0) // Gap 1
gap = 0x80;
else { // Gap 3
gap = track === 0 ? 0x28 : 0x26;
}
for (idx = 0; idx < gap; idx++) {
buf.push(0xff);
}
/*
* Address Field
*/
checksum = volume ^ track ^ sector;
extend(buf, [0xd5, 0xaa, 0x96]); // Address Prolog D5 AA 96
extend(buf, _fourXfour(volume));
extend(buf, _fourXfour(track));
extend(buf, _fourXfour(sector));
extend(buf, _fourXfour(checksum));
extend(buf, [0xde, 0xaa, 0xeb]); // Epilog DE AA EB
/*
* Gap 2 (5 bytes)
*/
for (idx = 0; idx < 0x05; idx++) {
buf.push(0xff);
}
/*
* Data Field
*/
extend(buf, [0xd5, 0xaa, 0xad]); // Data Prolog D5 AA AD
var nibbles = [];
var ptr2 = 0;
var ptr6 = 0x56;
var idx2, idx6;
for (idx = 0; idx < 0x156; idx++) {
nibbles[idx] = 0;
}
idx2 = 0x55;
for (idx6 = 0x101; idx6 >= 0; idx6--) {
var val6 = data[idx6 % 0x100];
var val2 = nibbles[ptr2 + idx2];
val2 = (val2 << 1) | (val6 & 1);
val6 >>= 1;
val2 = (val2 << 1) | (val6 & 1);
val6 >>= 1;
nibbles[ptr6 + idx6] = val6;
nibbles[ptr2 + idx2] = val2;
if (--idx2 < 0)
idx2 = 0x55;
}
var last = 0;
for (idx = 0; idx < 0x156; idx++) {
var val = nibbles[idx];
buf.push(_trans[last ^ val]);
last = val;
}
buf.push(_trans[last]);
extend(buf, [0xde, 0xaa, 0xeb]); // Epilog DE AA EB
/*
* Gap 3
*/
buf.push(0xff);
return buf;
}
function _json_encode(drive, pretty) {
var cur = _drives[drive - 1];
var data = [];
var format = "dsk";
for (var t = 0; t < cur.tracks.length; t++) {
data[t] = [];
if (cur.format === "nib") {
format = "nib";
data[t] = base64_encode(cur.tracks[t]);
} else {
for (var s = 0; s < 0x10; s++) {
data[t][s] = base64_encode(_readSector(drive, t, _DO[s]));
}
}
}
return JSON.stringify({"type": format,
"encoding": "base64",
"volume": cur.volume,
"data": data},
null,
pretty ? " " : null);
}
function _compactArray(ary) {
var result = ary;
if (window.Uint8Array) {
result = new Uint8Array(ary);
}
return result;
}
function _json_decode(drive, data) {
var _cur = _drives[drive - 1];
var tracks = [];
var json = JSON.parse(data);
var v = json.volume;
for (var t = 0; t < json.data.length; t++) {
var track = [];
for (var s = 0; s < json.data[t].length; s++) {
var _s = 15 - s;
var d = base64_decode(json.data[t][_s]);
extend(track, _explodeSector(v, t, _DO[_s], d));
}
tracks[t] = _compactArray(track);
}
_cur.volume = v;
_cur.format = json.type;
_cur.tracks = tracks;
}
function _readNext() {
var result = 0;
if (_skip || _writeMode) {
var t = _cur.tracks[_cur.track >> 1];
if (t && t.length) {
if (_cur.head >= t.length)
_cur.head = 0;
if (_writeMode) {
t[_cur.head] = _latch;
} else
result = t[_cur.head];
++_cur.head;
}
}
_skip = (++_skip % 4);
return result;
}
function _writeNext(val) {
if (_writeMode) {
_latch = val;
if (!_cur.dirty) {
_updateDirty(_drive, true);
}
}
}
function _readSector(drive, track, sector) {
var val, state = 0;
var idx = 0;
var retry = 0;
var cur = _drives[drive - 1].tracks[track];
function _readNext() {
var result = cur[idx++];
if (idx >= cur.length) {
idx = 0;
retry++;
}
return result;
}
function _skipBytes(count) {
idx += count;
if (idx >= cur.length) {
idx %= cur.length;
retry++;
}
}
var t = 0, s = 0, jdx, kdx;
var data = [];
while (retry < 4) {
switch (state) {
case 0:
val = _readNext();
state = (val === 0xd5) ? 1 : 0;
break;
case 1:
val = _readNext();
state = (val === 0xaa) ? 2 : 0;
break;
case 2:
val = _readNext();
state = (val === 0x96) ? 3 : (val === 0xad ? 4 : 0);
break;
case 3: // Address
_defourXfour(_readNext(), _readNext()); // Volume
t = _defourXfour(_readNext(), _readNext());
s = _defourXfour(_readNext(), _readNext());
_skipBytes(5); // Skip checksum and footer
state = 0;
break;
case 4: // Data
if (s === sector && t === track) {
var data2 = [];
var last = 0;
for (jdx = 0x55; jdx >= 0; jdx--) {
val = _detrans[_readNext() - 0x80] ^ last;
data2[jdx] = val;
last = val;
}
for (jdx = 0; jdx < 0x100; jdx++) {
val = _detrans[_readNext() - 0x80] ^ last;
data[jdx] = val;
last = val;
}
for (kdx = 0, jdx = 0x55; kdx < 0x100; kdx++) {
data[kdx] <<= 1;
if (data2[jdx] & 0x01) data[kdx] |= 0x01;
data2[jdx] >>= 1;
data[kdx] <<= 1;
if (data2[jdx] & 0x01) data[kdx] |= 0x01;
data2[jdx] >>= 1;
if (--jdx < 0) jdx = 0x55;
}
return data;
}
else
_skipBytes(0x159); // Skip data, checksum and footer
state = 0;
break;
default:
break;
}
}
return [];
}
var _phase_delta = [[ 0, 1, 2,-1],
[-1, 0, 1, 2],
[-2,-1, 0, 1],
[ 1,-2,-1, 0]];
function setPhase(phase, on) {
_debug("phase " + phase + (on ? " on" : " off"));
if (on) {
_cur.track += _phase_delta[_cur.phase][phase];
_cur.phase = phase;
if (_cur.track > _cur.tracks.length * 2 - 1)
_cur.track = _cur.tracks.length * 2 - 1;
if (_cur.track < 0x0)
_cur.track = 0x0;
/* _debug("Drive " + _drive +
", track " + toHex(_cur.track >> 1) +
" (" + toHex(_cur.track) + ")" +
" [" + (_cur.track % 4) + "/" + phase + "]"); */
}
}
function _access(off, val) {
var result = 0;
switch (off) {
case LOC.PHASE0OFF:
setPhase(0, false);
break;
case LOC.PHASE0ON:
setPhase(0, true);
break;
case LOC.PHASE1OFF:
setPhase(1, false);
break;
case LOC.PHASE1ON:
setPhase(1, true);
break;
case LOC.PHASE2OFF:
setPhase(2, false);
break;
case LOC.PHASE2ON:
setPhase(2, true);
break;
case LOC.PHASE3OFF:
setPhase(3, false);
break;
case LOC.PHASE3ON:
setPhase(3, true);
break;
case LOC.DRIVEOFF:
_debug("Drive Off");
_on = false;
if (callbacks.driveLight) { callbacks.driveLight(_drive, false); }
break;
case LOC.DRIVEON:
_debug("Drive On");
_on = true;
if (callbacks.driveLight) { callbacks.driveLight(_drive, true); }
break;
case LOC.DRIVE1:
_debug("Disk 1");
_drive = 1;
_cur = _drives[_drive - 1];
if (_on && callbacks.driveLight) {
callbacks.driveLight(2, false);
callbacks.driveLight(1, true);
}
break;
case LOC.DRIVE2:
_debug("Disk 2");
_drive = 2;
_cur = _drives[_drive - 1];
if (_on && callbacks.driveLight) {
callbacks.driveLight(1, false);
callbacks.driveLight(2, true);
}
break;
case LOC.DRIVEREAD:
result = _readNext();
// _debug("read: " + toHex(result));
break;
case LOC.DRIVEWRITE:
// _debug("write: " + toHex(val));
if (val !== undefined) {
_writeNext(val);
}
break;
case LOC.DRIVEREADMODE:
_debug("Read Mode");
_writeMode = false;
result = (_readNext() & 0x7f) | (_cur.readOnly ? 0x80 : 0x00);
break;
case LOC.DRIVEWRITEMODE:
_debug("Write Mode");
_writeMode = true;
break;
default:
break;
}
return result;
}
function _updateDirty(drive, dirty) {
_drives[drive - 1].dirty = dirty;
if (callbacks.dirty) { callbacks.dirty(_drive, dirty); }
}
var diskII_16 = [
0xa2,0x20,0xa0,0x00,0xa2,0x03,0x86,0x3c,
0x8a,0x0a,0x24,0x3c,0xf0,0x10,0x05,0x3c,
0x49,0xff,0x29,0x7e,0xb0,0x08,0x4a,0xd0,
0xfb,0x98,0x9d,0x56,0x03,0xc8,0xe8,0x10,
0xe5,0x20,0x58,0xff,0xba,0xbd,0x00,0x01,
0x0a,0x0a,0x0a,0x0a,0x85,0x2b,0xaa,0xbd,
0x8e,0xc0,0xbd,0x8c,0xc0,0xbd,0x8a,0xc0,
0xbd,0x89,0xc0,0xa0,0x50,0xbd,0x80,0xc0,
0x98,0x29,0x03,0x0a,0x05,0x2b,0xaa,0xbd,
0x81,0xc0,0xa9,0x56,0x20,0xa8,0xfc,0x88,
0x10,0xeb,0x85,0x26,0x85,0x3d,0x85,0x41,
0xa9,0x08,0x85,0x27,0x18,0x08,0xbd,0x8c,
0xc0,0x10,0xfb,0x49,0xd5,0xd0,0xf7,0xbd,
0x8c,0xc0,0x10,0xfb,0xc9,0xaa,0xd0,0xf3,
0xea,0xbd,0x8c,0xc0,0x10,0xfb,0xc9,0x96,
0xf0,0x09,0x28,0x90,0xdf,0x49,0xad,0xf0,
0x25,0xd0,0xd9,0xa0,0x03,0x85,0x40,0xbd,
0x8c,0xc0,0x10,0xfb,0x2a,0x85,0x3c,0xbd,
0x8c,0xc0,0x10,0xfb,0x25,0x3c,0x88,0xd0,
0xec,0x28,0xc5,0x3d,0xd0,0xbe,0xa5,0x40,
0xc5,0x41,0xd0,0xb8,0xb0,0xb7,0xa0,0x56,
0x84,0x3c,0xbc,0x8c,0xc0,0x10,0xfb,0x59,
0xd6,0x02,0xa4,0x3c,0x88,0x99,0x00,0x03,
0xd0,0xee,0x84,0x3c,0xbc,0x8c,0xc0,0x10,
0xfb,0x59,0xd6,0x02,0xa4,0x3c,0x91,0x26,
0xc8,0xd0,0xef,0xbc,0x8c,0xc0,0x10,0xfb,
0x59,0xd6,0x02,0xd0,0x87,0xa0,0x00,0xa2,
0x56,0xca,0x30,0xfb,0xb1,0x26,0x5e,0x00,
0x03,0x2a,0x5e,0x00,0x03,0x2a,0x91,0x26,
0xc8,0xd0,0xee,0xe6,0x27,0xe6,0x3d,0xa5,
0x3d,0xcd,0x00,0x08,0xa6,0x2b,0x90,0xdb,
0x4c,0x01,0x08,0x00,0x00,0x00,0x00,0x00 ];
/*
var diskII_13 = [
0xa2,0x20,0xa0,0x00,0xa9,0x03,0x85,0x3c,
0x18,0x88,0x98,0x24,0x3c,0xf0,0xf5,0x26,
0x3c,0x90,0xf8,0xc0,0xd5,0xf0,0xed,0xca,
0x8a,0x99,0x00,0x08,0xd0,0xe6,0x20,0x58,
0xff,0xba,0xbd,0x00,0x01,0x48,0x0a,0x0a,
0x0a,0x0a,0x85,0x2b,0xaa,0xa9,0xd0,0x48,
0xbd,0x8e,0xc0,0xbd,0x8c,0xc0,0xbd,0x8a,
0xc0,0xbd,0x89,0xc0,0xa0,0x50,0xbd,0x80,
0xc0,0x98,0x29,0x03,0x0a,0x05,0x2b,0xaa,
0xbd,0x81,0xc0,0xa9,0x56,0x20,0xa8,0xfc,
0x88,0x10,0xeb,0xa9,0x03,0x85,0x27,0xa9,
0x00,0x85,0x26,0x85,0x3d,0x18,0x08,0xbd,
0x8c,0xc0,0x10,0xfb,0x49,0xd5,0xd0,0xf7,
0xbd,0x8c,0xc0,0x10,0xfb,0xc9,0xaa,0xd0,
0xf3,0xea,0xbd,0x8c,0xc0,0x10,0xfb,0xc9,
0xb5,0xf0,0x09,0x28,0x90,0xdf,0x49,0xad,
0xf0,0x1f,0xd0,0xd9,0xa0,0x03,0x84,0x2a,
0xbd,0x8c,0xc0,0x10,0xfb,0x2a,0x85,0x3c,
0xbd,0x8c,0xc0,0x10,0xfb,0x25,0x3c,0x88,
0xd0,0xee,0x28,0xc5,0x3d,0xd0,0xbe,0xb0,
0xbd,0xa0,0x9a,0x84,0x3c,0xbc,0x8c,0xc0,
0x10,0xfb,0x59,0x00,0x08,0xa4,0x3c,0x88,
0x99,0x00,0x08,0xd0,0xee,0x84,0x3c,0xbc,
0x8c,0xc0,0x10,0xfb,0x59,0x00,0x08,0xa4,
0x3c,0x91,0x26,0xc8,0xd0,0xef,0xbc,0x8c,
0xc0,0x10,0xfb,0x59,0x00,0x08,0xd0,0x8d,
0x60,0xa8,0xa2,0x00,0xb9,0x00,0x08,0x4a,
0x3e,0xcc,0x03,0x4a,0x3e,0x99,0x03,0x85,
0x3c,0xb1,0x26,0x0a,0x0a,0x0a,0x05,0x3c,
0x91,0x26,0xc8,0xe8,0xe0,0x33,0xd0,0xe4,
0xc6,0x2a,0xd0,0xde,0xcc,0x00,0x03,0xd0,
0x03,0x4c,0x01,0x03,0x4c,0x2d,0xff,0xff
];
*/
var diskII = diskII_16;
_init();
return {
start: function disk2_start() {
io.registerSwitches(this, LOC);
return 0xc0 + slot;
},
end: function disk2_end() {
return 0xc0 + slot;
},
ioSwitch: function disk2_ioSwitch(off, val) {
return _access(off, val);
},
read: function disk2_read(page, off) {
return diskII[off];
},
reset: function disk2_reset() {
if (_on) {
_writeMode = false;
_on = false;
callbacks.driveLight(_drive, false);
}
},
getState: function disk2_getState() {
function getDriveState(drive) {
var result = {
format: drive.format,
volume: drive.volume,
tracks: [],
track: drive.track,
head: drive.head,
phase: drive.phase,
readOnly: drive.readOnly,
dirty: drive.dirty
};
for (var idx = 0; idx < drive.tracks.length; idx++) {
result.tracks.push(base64_encode(drive.tracks[idx]));
}
return result;
}
var result = {
drives: [],
skip: _skip,
latch: _latch,
writeMode: _writeMode,
on: _on,
drive: _drive
};
_drives.forEach(function (drive, idx) {
result.drives[idx] = getDriveState(drive);
});
return result;
},
setState: function disk2_setState(state) {
function setDriveState(state) {
var result = {
format: state.format,
volume: state.volume,
tracks: [],
track: state.track,
head: state.head,
phase: state.phase,
readOnly: state.readOnly,
dirty: state.dirty
};
for (var idx = 0; idx < state.tracks.length; idx++) {
result.tracks.push(base64_decode(state.tracks[idx]));
}
return result;
}
state.drives.forEach(function(drive, idx) {
_drives[idx] = setDriveState(state);
});
_skip = state.skip;
_latch = state.latch;
_writeMode = state.writeMode;
_on = state.on;
_drive = state.drive;
_cur = _drives[_drive - 1];
},
rwts: function disk2_rwts(disk, track, sector) {
return _readSector(disk, track, sector);
},
setDisk: function disk2_setDisk(drive, disk) {
var fmt = disk.type, readOnly = disk.readOnly;
var data, t, s;
if (disk.encoding == "base64") {
data = [];
for (t = 0; t < disk.data.length; t++) {
if (fmt == "nib") {
data[t] = base64_decode(disk.data[t]);
} else {
data[t] = [];
for (s = 0; s < disk.data[t].length; s++) {
data[t][s] = base64_decode(disk.data[t][s]);
}
}
}
} else {
data = disk.data;
}
var cur = _drives[drive - 1];
// var v = (fmt === "dsk" ? data[0x11][0x00][0x06] : 0xfe);
// if (v == 0x00) {
var v = disk.volume || 0xfe;
// }
cur.volume = v;
cur.readOnly = readOnly;
cur.format = fmt;
var tracks = [];
for (t = 0; t < data.length; t++) {
var track = [];
if (fmt === "nib") {
track = data[t];
} else {
for (s = 0; s < data[t].length; s++) {
var _s = 15 - s;
if (fmt === "po") { // ProDOS Order
extend(track,
_explodeSector(v, t, _PO[s], data[t][s]));
} else if (fmt === "dsk") { // DOS Order
extend(track,
_explodeSector(v, t, _DO[_s], data[t][_s]));
} else { // flat
extend(track,
_explodeSector(v, t, s, data[t][s]));
}
}
}
tracks[t] = _compactArray(track);
}
cur.tracks = tracks;
_updateDirty(_drive, false);
},
getJSON: function disk2_getJSON(drive, pretty) {
return _json_encode(drive, pretty);
},
setJSON: function disk2_setJSON(drive, data) {
_json_decode(drive, data);
return true;
},
setBinary: function disk2_setBinary(drive, name, fmt, data) {
var _cur = _drives[drive - 1];
var tracks = [];
var v = 254;
if (fmt === "do") {
fmt = "dsk";
}
for (var t = 0; t < 35; t++) {
var track, off, d;
if (fmt === "nib") {
off = t * 0x1a00;
track = new Uint8Array(data.slice(off, off + 0x1a00));
} else {
track = [];
for (var s = 0; s < 16; s++) {
var _s = 15 - s;
if (fmt == "po") { // ProDOS Order
off = (16 * t + s) * 256;
d = new Uint8Array(data.slice(off, off + 256));
extend(track,
_explodeSector(v, t, _PO[s], d));
} else if (fmt == "dsk") { // DOS Order
off = (16 * t + _s) * 256;
d = new Uint8Array(data.slice(off, off + 256));
extend(track,
_explodeSector(v, t, _DO[_s], d));
} else {
return false;
}
}
}
tracks[t] = track;
}
_cur.volume = v;
_cur.format = fmt;
_cur.tracks = tracks;
_updateDirty(drive, true);
return true;
},
getBinary: function disk2_getBinary(drive) {
var cur = _drives[drive - 1];
var len = (16 * cur.tracks.length * 256);
var data = new Uint8Array(len);
var idx = 0;
for (var t = 0; t < cur.tracks.length; t++) {
if (cur.format === "nib") {
data[idx++] = cur.tracks[t];
} else {
for (var s = 0; s < 0x10; s++) {
var sector = _readSector(drive, t, _DO[s]);
for (var b = 0; b < 256; b++) {
data[idx++] = sector[b];
}
}
}
}
return data;
},
getBase64: function disk2_getBase64(drive) {
var cur = _drives[drive - 1];
var data = [];
for (var t = 0; t < cur.tracks.length; t++) {
data[t] = [];
if (cur.format === "nib") {
data += base64_encode(cur.tracks[t]);
} else {
for (var s = 0; s < 0x10; s++) {
data += base64_encode(_readSector(drive, t, _DO[s]));
}
}
}
return data;
}
};
}

1569
js/fpbasic.js Normal file

File diff suppressed because it is too large Load Diff

1558
js/intbasic.js Normal file

File diff suppressed because it is too large Load Diff

222
js/langcard.js Normal file
View File

@ -0,0 +1,222 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*globals RAM */
/*exported LanguageCard */
function LanguageCard(io, rom) {
var _io = io;
var _rom = rom;
var _bank1 = null;
var _bank2 = null;
var _ram = null;
var _readbsr = false;
var _writebsr = false;
var _bsr2 = false;
var _last = 0x00;
var _read1 = null;
var _read2 = null;
var _write1 = null;
var _write2 = null;
function _init() {
_bank1 = new RAM(0xd0, 0xdf);
_bank2 = new RAM(0xd0, 0xdf);
_ram = new RAM(0xe0, 0xff);
_write1 = _rom;
_write2 = _rom;
_read1 = _rom;
_read2 = _rom;
}
function _debug() {
// debug.apply(arguments);
}
_init();
var LOC = {
// Status
BSRBANK2: 0x11,
BSRREADRAM: 0x12,
// Bank 2
READBSR2: 0x80,
WRITEBSR2: 0x81,
OFFBSR2: 0x82,
READWRBSR2: 0x83,
// Shadow Bank 2
_READBSR2: 0x84,
_WRITEBSR2: 0x85,
_OFFBSR2: 0x86,
_READWRBSR2: 0x87,
// Bank 1
READBSR1: 0x88,
WRITEBSR1: 0x89,
OFFBSR1: 0x8a,
READWRBSR1: 0x8b,
// Shadow Bank 1
_READBSR1: 0x8c,
_WRITEBSR1: 0x8d,
_OFFBSR1: 0x8e,
_READWRBSR1: 0x8f
};
function _access(off) {
var result = 0;
switch (off) {
case LOC.READBSR2:
case LOC._READBSR2:
_readbsr = true;
_writebsr = false;
_bsr2 = true;
_debug("Bank 2 Read");
break;
case LOC.WRITEBSR2:
case LOC._WRITEBSR2:
_readbsr = false;
_writebsr = ((_last & 0xF3) == (off & 0xF3));
_bsr2 = true;
_debug("Bank 2 Write");
break;
case LOC.OFFBSR2:
case LOC._OFFBSR2:
_readbsr = false;
_writebsr = false;
_bsr2 = true;
_debug("Bank 2 Off");
break;
case LOC.READWRBSR2:
case LOC._READWRBSR2:
_readbsr = true;
_writebsr = ((_last & 0xF3) == (off & 0xF3));
_bsr2 = true;
_debug("Bank 2 Read/Write");
break;
case LOC.READBSR1:
case LOC._READBSR1:
_readbsr = true;
_writebsr = false;
_bsr2 = false;
_debug("Bank 1 Read");
break;
case LOC.WRITEBSR1:
case LOC._WRITEBSR1:
_readbsr = false;
_writebsr = ((_last & 0xF3) == (off & 0xF3));
_bsr2 = false;
_debug("Bank 1 Write");
break;
case LOC.OFFBSR1:
case LOC._OFFBSR1:
_readbsr = false;
_writebsr = false;
_bsr2 = false;
_debug("Bank 1 Off");
break;
case LOC.READWRBSR1:
case LOC._READWRBSR1:
_readbsr = true;
_writebsr = ((_last & 0xF3) == (off & 0xF3));
_bsr2 = false;
_debug("Bank 1 Read/Write");
break;
case LOC.BSRBANK2:
result = _bsr2 ? 0x80 : 0x00;
_debug("Bank 2 Read " + _bsr2);
break;
case LOC.BSRREADRAM:
result = _readbsr ? 0x80 : 0x00;
_debug("Bank SW RAM Read " + _readbsr);
break;
default:
break;
}
_last = off;
if (_readbsr) {
_read1 = _bsr2 ? _bank2 : _bank1;
_read2 = _ram;
} else {
_read1 = _rom;
_read2 = _rom;
}
if (_writebsr) {
_write1 = _bsr2 ? _bank2 : _bank1;
_write2 = _ram;
} else {
_write1 = rom;
_write2 = rom;
}
return result;
}
return {
start: function() {
_io.registerSwitches(this, LOC);
return 0xd0;
},
end: function() {
return 0xff;
},
ioSwitch: function(off, val) {
return _access(off, val);
},
read: function(page, off, dbg) {
var result = 0;
if (page < 0xe0) {
result = _read1.read(page, off, dbg);
} else {
result = _read2.read(page, off, dbg);
}
return result;
},
write: function(page, off, val) {
if (page < 0xe0) {
_write1.write(page, off, val);
} else {
_write2.write(page, off, val);
}
},
getState: function() {
return {
readbsr: _readbsr,
writebsr: _writebsr,
bsr2: _bsr2,
last: _last,
bank1: _bank1.getState(),
bank2: _bank2.getState()
};
},
setState: function(state) {
_readbsr = state.readbsr;
_writebsr = state.writebsr;
_bsr2 = state.bsr2;
_bank1.setState(state.bank1);
_bank2.setState(state.bank2);
_access(-1);
_last = state.last;
}
};
}

680
js/mmu.js Normal file
View File

@ -0,0 +1,680 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*globals RAM: false, toHex: false, hiresMode: false, debug: false */
/*exported MMU */
function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
{
var idx;
var _auxRom = 0x00;
var _readPages = new Array(0x100);
var _writePages = new Array(0x100);
var _pages = new Array(0x100);
// Language Card RAM Softswitches
var _bank1;
var _readbsr;
var _writebsr;
// Auxilliary ROM
var _intcxrom;
var _slot3rom;
// Auxilliary RAM
var _auxRamRead;
var _auxRamWrite;
var _altzp;
// Video
var _80store = false;
var _page2;
var _vbEnd = 0;
function _initSwitches() {
_bank1 = true;
_readbsr = false;
_writebsr = false;
_auxRamRead = false;
_auxRamWrite = false;
_altzp = false;
_intcxrom = false;
_slot3rom = false;
_80store = false;
_page2 = false;
}
function _debug() {
// debug.apply(arguments);
}
var _last = 0x00;
function EmptySlots() {
return {
start: function slot_start() {
return 0xC1;
},
end: function slot_end() {
return 0xCF;
},
read: function slot_read() {
return 0x00;
},
write: function slot_write() {
}
};
}
var emptyslots = new EmptySlots();
var mem00_01 = [new RAM(0x0, 0x1), new RAM(0x0, 0x1)];
var mem02_03 = [new RAM(0x2, 0x3), new RAM(0x2, 0x3)];
var mem04_07 = [lores1.bank0(), lores1.bank1()];
var mem08_0B = [lores2.bank0(), lores2.bank1()];
var mem0C_1F = [new RAM(0xC, 0x1F), new RAM(0xC, 0x1F)];
var mem20_3F = [hires1.bank0(), hires1.bank1()];
var mem40_5F = [hires2.bank0(), hires2.bank1()];
var mem60_BF = [new RAM(0x60,0xBF), new RAM(0x60,0xBF)];
var memC0_C0 = [io];
// var memC1_CF = [emptyslots, rom];
var memD0_DF = [rom,
new RAM(0xD0,0xDF), new RAM(0xD0,0xDF),
new RAM(0xD0,0xDF), new RAM(0xD0,0xDF)];
var memE0_FF = [rom, new RAM(0xE0,0xFF), new RAM(0xE0,0xFF)];
/*
* Initialize read/write banks
*/
// Zero Page/Stack
for (idx = 0x0; idx < 0x2; idx++) {
_pages[idx] = mem00_01;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// 0x300-0x400
for (idx = 0x2; idx < 0x4; idx++) {
_pages[idx] = mem02_03;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// Text Page 1
for (idx = 0x4; idx < 0x8; idx++) {
_pages[idx] = mem04_07;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// Text Page 2
for (idx = 0x8; idx < 0xC; idx++) {
_pages[idx] = mem08_0B;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// 0xC00-0x2000
for (idx = 0xC; idx < 0x20; idx++) {
_pages[idx] = mem0C_1F;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// Hires Page 1
for (idx = 0x20; idx < 0x40; idx++) {
_pages[idx] = mem20_3F;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// Hires Page 2
for (idx = 0x40; idx < 0x60; idx++) {
_pages[idx] = mem40_5F;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// 0x6000-0xc000
for (idx = 0x60; idx < 0xc0; idx++) {
_pages[idx] = mem60_BF;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// I/O Switches
idx = 0xc0;
_pages[idx] = memC0_C0;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
// Slots
for (idx = 0xc1; idx < 0xd0; idx++) {
_pages[idx] = [emptyslots, rom]; // memC1_CF;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// Basic ROM
for (idx = 0xd0; idx < 0xe0; idx++) {
_pages[idx] = memD0_DF;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
// Monitor ROM
for (idx = 0xe0; idx < 0x100; idx++) {
_pages[idx] = memE0_FF;
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
/*
* I/O Switch locations
*/
var LOC = {
// 80 Column
_80STOREOFF: 0x00,
_80STOREON: 0x01,
// Aux RAM
RAMRDOFF: 0x02,
RAMRDON: 0x03,
RAMWROFF: 0x04,
RAMWRON: 0x05,
// Bank switched ROM
INTCXROMOFF: 0x06,
INTCXROMON: 0x07,
ALTZPOFF: 0x08,
ALTZPON: 0x09,
SLOTC3ROMOFF: 0x0A,
SLOTC3ROMON: 0x0B,
// Status
BSRBANK2: 0x11,
BSRREADRAM: 0x12,
RAMRD: 0x13,
RAMWRT: 0x14,
INTCXROM: 0x15,
ALTZP: 0x16,
SLOTC3ROM: 0x17,
_80STORE: 0x18,
VERTBLANK: 0x19,
PAGE1: 0x54, // select text/graphics page1 main/aux
PAGE2: 0x55, // select text/graphics page2 main/aux
// Bank 2
READBSR2: 0x80,
WRITEBSR2: 0x81,
OFFBSR2: 0x82,
READWRBSR2: 0x83,
// Shadow Bank 2
_READBSR2: 0x84,
_WRITEBSR2: 0x85,
_OFFBSR2: 0x86,
_READWRBSR2: 0x87,
// Bank 1
READBSR1: 0x88,
WRITEBSR1: 0x89,
OFFBSR1: 0x8a,
READWRBSR1: 0x8b,
// Shadow Bank 1
_READBSR1: 0x8c,
_WRITEBSR1: 0x8d,
_OFFBSR1: 0x8e,
_READWRBSR1: 0x8f
};
function _updateBanks() {
if (_auxRamRead) {
for (idx = 0x02; idx < 0xC0; idx++) {
_readPages[idx] = _pages[idx][1];
}
} else {
for (idx = 0x02; idx < 0xC0; idx++) {
_readPages[idx] = _pages[idx][0];
}
}
if (_auxRamWrite) {
for (idx = 0x02; idx < 0xC0; idx++) {
_writePages[idx] = _pages[idx][1];
}
} else {
for (idx = 0x02; idx < 0xC0; idx++) {
_writePages[idx] = _pages[idx][0];
}
}
if (_80store) {
if (_page2) {
for (idx = 0x4; idx < 0x8; idx++) {
_readPages[idx] = _pages[idx][1];
_writePages[idx] = _pages[idx][1];
}
if (hiresMode) {
for (idx = 0x20; idx < 0x40; idx++) {
_readPages[idx] = _pages[idx][1];
_writePages[idx] = _pages[idx][1];
}
}
} else {
for (idx = 0x4; idx < 0x8; idx++) {
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
if (hiresMode) {
for (idx = 0x20; idx < 0x40; idx++) {
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
}
}
}
if (_intcxrom) {
for (idx = 0xc1; idx < 0xd0; idx++) {
_readPages[idx] = _pages[idx][1];
}
} else {
for (idx = 0xc1; idx < 0xd0; idx++) {
_readPages[idx] = _pages[idx][0];
}
if (_slot3rom) {
_readPages[0xc3] = _pages[0xc3][1];
} else {
_readPages[0xc3] = _pages[0xc3][0];
}
}
if (_altzp) {
for (idx = 0x0; idx < 0x2; idx++) {
_readPages[idx] = _pages[idx][1];
_writePages[idx] = _pages[idx][1];
}
} else {
for (idx = 0x0; idx < 0x2; idx++) {
_readPages[idx] = _pages[idx][0];
_writePages[idx] = _pages[idx][0];
}
}
if (_readbsr) {
if (_bank1) {
for (idx = 0xd0; idx < 0xe0; idx++) {
_readPages[idx] = _pages[idx][_altzp ? 2 : 1];
}
} else {
for (idx = 0xd0; idx < 0xe0; idx++) {
_readPages[idx] = _pages[idx][_altzp ? 4 : 3];
}
}
for (idx = 0xe0; idx < 0x100; idx++) {
_readPages[idx] = _pages[idx][_altzp ? 2 : 1];
}
} else {
for (idx = 0xd0; idx < 0x100; idx++) {
_readPages[idx] = _pages[idx][0];
}
}
if (_writebsr) {
if (_bank1) {
for (idx = 0xd0; idx < 0xe0; idx++) {
_writePages[idx] = _pages[idx][_altzp ? 2 : 1];
}
} else {
for (idx = 0xd0; idx < 0xe0; idx++) {
_writePages[idx] = _pages[idx][_altzp ? 4 : 3];
}
}
for (idx = 0xe0; idx < 0x100; idx++) {
_writePages[idx] = _pages[idx][_altzp ? 2 : 1];
}
} else {
for (idx = 0xd0; idx < 0x100; idx++) {
_writePages[idx] = _pages[idx][0];
}
}
}
/*
* The Big Switch
*/
function _access(off, val) {
var result;
switch (off) {
// Apple //e memory management
case LOC._80STOREOFF:
if (typeof val != 'undefined') {
_80store = false;
// _debug("80 Store Off");
} else {
// Chain to io for keyboard
result = io.ioSwitch(off, val);
}
break;
case LOC._80STOREON:
if (typeof val != 'undefined') {
_80store = true;
// _debug("80 Store On");
} else
result = 0;
break;
case LOC.RAMRDOFF:
if (typeof val != 'undefined') {
_auxRamRead = false;
_debug("Aux RAM Read Off");
} else
result = 0;
break;
case LOC.RAMRDON:
if (typeof val != 'undefined') {
_auxRamRead = true;
_debug("Aux RAM Read On");
} else
result = 0;
break;
case LOC.RAMWROFF:
if (typeof val != 'undefined') {
_auxRamWrite = false;
_debug("Aux RAM Write Off");
} else
result = 0;
break;
case LOC.RAMWRON:
if (typeof val != 'undefined') {
_auxRamWrite = true;
_debug("Aux RAM Write On");
} else
result = 0;
break;
case LOC.INTCXROMOFF:
if (typeof val != 'undefined') {
_intcxrom = false;
// _debug("Int CX ROM Off");
}
break;
case LOC.INTCXROMON:
if (typeof val != 'undefined') {
_intcxrom = true;
// _debug("Int CX ROM On");
}
break;
case LOC.ALTZPOFF: // 0x08
if (typeof val != 'undefined') {
_altzp = false;
_debug("Alt ZP Off");
}
break;
case LOC.ALTZPON: // 0x09
if (typeof val != 'undefined') {
_altzp = true;
_debug("Alt ZP On");
}
break;
case LOC.SLOTC3ROMOFF:
if (typeof val != 'undefined') {
_slot3rom = false;
_debug("Slot 3 ROM Off");
}
break;
case LOC.SLOTC3ROMON:
if (typeof val != 'undefined') {
_slot3rom = true;
_debug("Slot 3 ROM On");
}
break;
// Graphics Switches
case LOC.PAGE1:
_page2 = false;
if (!_80store) result = io.ioSwitch(off, val);
break;
case LOC.PAGE2:
_page2 = true;
if (!_80store) result = io.ioSwitch(off, val);
break;
// Language Card Switches
case LOC.READBSR2: // 0xC080
case LOC._READBSR2:
_bank1 = false;
_readbsr = true;
_writebsr = false;
_debug("Bank 2 Read");
break;
case LOC.WRITEBSR2: // 0xC081
case LOC._WRITEBSR2:
_bank1 = false;
_readbsr = false;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3));
_debug("Bank 2 Write");
break;
case LOC.OFFBSR2: // 0xC082
case LOC._OFFBSR2:
_bank1 = false;
_readbsr = false;
_writebsr = false;
_debug("Bank 2 Off");
break;
case LOC.READWRBSR2: // 0xC083
case LOC._READWRBSR2:
_bank1 = false;
_readbsr = true;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3));
_debug("Bank 2 Read/Write");
break;
case LOC.READBSR1: // 0xC088
case LOC._READBSR1:
_bank1 = true;
_readbsr = true;
_writebsr = false;
_debug("Bank 1 Read");
break;
case LOC.WRITEBSR1: // 0xC089
case LOC._WRITEBSR1:
_bank1 = true;
_readbsr = false;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3));
_debug("Bank 1 Write");
break;
case LOC.OFFBSR1: // 0xC08A
case LOC._OFFBSR1:
_bank1 = true;
_readbsr = false;
_writebsr = false;
_debug("Bank 1 Off");
break;
case LOC.READWRBSR1: // 0xC08B
case LOC._READWRBSR1:
_bank1 = true;
_readbsr = true;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3));
_debug("Bank 1 Read/Write");
break;
// Status registers
case LOC.BSRBANK2:
_debug("Bank 2 Read " + !_bank1);
result = !_bank1 ? 0x80 : 0x00;
break;
case LOC.BSRREADRAM:
_debug("Bank SW RAM Read " + _readbsr);
result = _readbsr ? 0x80 : 0x00;
break;
case LOC.RAMRD: // 0xC013
_debug("Aux RAM Read " + _auxRamRead);
result = _auxRamRead ? 0x80 : 0x0;
break;
case LOC.RAMWRT: // 0xC014
_debug("Aux RAM Write " + _auxRamWrite);
result = _auxRamWrite ? 0x80 : 0x0;
break;
case LOC.INTCXROM: // 0xC015
// _debug("Int CX ROM " + _intcxrom);
result = _intcxrom ? 0x80 : 0x00;
break;
case LOC.ALTZP: // 0xC016
_debug("Alt ZP " + _altzp);
result = _altzp ? 0x80 : 0x0;
break;
case LOC.SLOTC3ROM: // 0xC017
_debug("Slot C3 ROM " + _slot3rom);
result = _slot3rom ? 0x80 : 0x00;
break;
case LOC._80STORE: // 0xC018
result = _80store ? 0x80 : 0x00;
break;
case LOC.VERTBLANK: // 0xC018
// result = cpu.cycles() % 20 < 5 ? 0x80 : 0x00;
result = (cpu.cycles() < _vbEnd) ? 0x80 : 0x00;
break;
default:
debug("MMU missing register " + toHex(off));
break;
}
_last = off;
if (result !== undefined)
return result;
result = 0;
_updateBanks();
return result;
}
return {
start: function mmu_start() {
// Fake call start to register switches
io.start();
// Do us afterward because we override some of the above
io.registerSwitches(this, LOC);
return 0x00;
},
end: function mmu_end() {
return 0xff;
},
ioSwitch: function mmu_ioswitch(off, val) {
return _access(off, val);
},
reset: function() {
_initSwitches();
_updateBanks();
for (idx = 0xc1; idx < 0xc8; idx++) {
if ('reset' in _pages[idx][0]) {
_pages[idx][0].reset();
}
}
},
read: function mmu_read(page, off, debug) {
return _readPages[page].read(page, off, debug);
},
write: function mmu_write(page, off, val) {
_writePages[page].write(page, off, val);
},
addSlot: function mmu_addSlot(slot, card) {
if (slot == 3) {
_pages[0xc0 + slot][1] = card;
}
_pages[0xc0 + slot][0] = card;
card.start();
},
auxRom: function mmu_auxRom(slot, rom) {
var idx;
if (_auxRom != slot) {
_debug("Slot " + slot + " expansion rom added");
_auxRom = slot;
for (idx = 0xc8; idx < 0xd0; idx++) {
_pages[idx][0] = rom;
}
_updateBanks();
}
},
resetVB: function mmu_resetVB() {
_vbEnd = cpu.cycles() + 1000;
},
getState: function() {
return {
readbsr: _readbsr,
writebsr: _writebsr,
bank1: _bank1,
last: _last,
auxRom: _auxRom,
intcxrom: _intcxrom,
slot3rom: _slot3rom,
auxRamRead: _auxRamRead,
auxRamWrite: _auxRamWrite,
altzp: _altzp,
_80store: _80store,
page2: _page2,
mem00_01: [mem00_01[0].getState(), mem00_01[1].getState()],
mem02_03: [mem02_03[0].getState(), mem02_03[1].getState()],
mem0C_1F: [mem0C_1F[0].getState(), mem0C_1F[1].getState()],
mem60_BF: [mem60_BF[0].getState(), mem60_BF[1].getState()],
memD0_DF: [memD0_DF[0].getState(), memD0_DF[1].getState(),
memD0_DF[2].getState(), memD0_DF[3].getState()],
memE0_FF: [memE0_FF[0].getState(), memE0_FF[1].getState()]
};
},
setState: function(state) {
_readbsr = state.readbsr;
_writebsr = state.writebsr;
_bank1 = state.bank1;
_auxRom = state.auxRom;
_intcxrom = state.intcxrom;
_slot3rom = state.slot3rom;
_auxRamRead = state.auxRamRead;
_auxRamWrite = state.auxRamWrite;
_altzp = state.altzp;
_80store = state._80store;
_page2 = state.page2;
mem00_01[0].setState(state.mem00_01[0]);
mem00_01[1].setState(state.mem00_01[1]);
mem02_03[0].setState(state.mem02_03[0]);
mem02_03[1].setState(state.mem02_03[1]);
mem0C_1F[0].setState(state.mem0C_1F[0]);
mem0C_1F[1].setState(state.mem0C_1F[1]);
mem60_BF[0].setState(state.mem60_BF[0]);
mem60_BF[1].setState(state.mem60_BF[1]);
memD0_DF[0].setState(state.memD0_DF[0]);
memD0_DF[1].setState(state.memD0_DF[1]);
memD0_DF[2].setState(state.memD0_DF[2]);
memD0_DF[3].setState(state.memD0_DF[3]);
memE0_FF[0].setState(state.memE0_FF[0]);
memE0_FF[1].setState(state.memE0_FF[1]);
_access(-1);
_last = state.last;
}
};
}

79
js/parallel.js Normal file
View File

@ -0,0 +1,79 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*exported Parallel */
function Parallel(io, cbs, slot) {
slot = slot || 1;
var LOC = {
IOREG: 0x80
};
var _cbs = cbs;
var rom = [
0x18,0xb0,0x38,0x48,0x8a,0x48,0x98,0x48,
0x08,0x78,0x20,0x58,0xff,0xba,0x68,0x68,
0x68,0x68,0xa8,0xca,0x9a,0x68,0x28,0xaa,
0x90,0x38,0xbd,0xb8,0x05,0x10,0x19,0x98,
0x29,0x7f,0x49,0x30,0xc9,0x0a,0x90,0x3b,
0xc9,0x78,0xb0,0x29,0x49,0x3d,0xf0,0x21,
0x98,0x29,0x9f,0x9d,0x38,0x06,0x90,0x7e,
0xbd,0xb8,0x06,0x30,0x14,0xa5,0x24,0xdd,
0x38,0x07,0xb0,0x0d,0xc9,0x11,0xb0,0x09,
0x09,0xf0,0x3d,0x38,0x07,0x65,0x24,0x85,
0x24,0x4a,0x38,0xb0,0x6d,0x18,0x6a,0x3d,
0xb8,0x06,0x90,0x02,0x49,0x81,0x9d,0xb8,
0x06,0xd0,0x53,0xa0,0x0a,0x7d,0x38,0x05,
0x88,0xd0,0xfa,0x9d,0xb8,0x04,0x9d,0x38,
0x05,0x38,0xb0,0x43,0xc5,0x24,0x90,0x3a,
0x68,0xa8,0x68,0xaa,0x68,0x4c,0xf0,0xfd,
0x90,0xfe,0xb0,0xfe,0x99,0x80,0xc0,0x90,
0x37,0x49,0x07,0xa8,0x49,0x0a,0x0a,0xd0,
0x06,0xb8,0x85,0x24,0x9d,0x38,0x07,0xbd,
0xb8,0x06,0x4a,0x70,0x02,0xb0,0x23,0x0a,
0x0a,0xa9,0x27,0xb0,0xcf,0xbd,0x38,0x07,
0xfd,0xb8,0x04,0xc9,0xf8,0x90,0x03,0x69,
0x27,0xac,0xa9,0x00,0x85,0x24,0x18,0x7e,
0xb8,0x05,0x68,0xa8,0x68,0xaa,0x68,0x60,
0x90,0x27,0xb0,0x00,0x10,0x11,0xa9,0x89,
0x9d,0x38,0x06,0x9d,0xb8,0x06,0xa9,0x28,
0x9d,0xb8,0x04,0xa9,0x02,0x85,0x36,0x98,
0x5d,0x38,0x06,0x0a,0xf0,0x90,0x5e,0xb8,
0x05,0x98,0x48,0x8a,0x0a,0x0a,0x0a,0x0a,
0xa8,0xbd,0x38,0x07,0xc5,0x24,0x68,0xb0,
0x05,0x48,0x29,0x80,0x09,0x20,0x2c,0x58,
0xff,0xf0,0x03,0xfe,0x38,0x07,0x70,0x84
];
return {
start: function() {
LOC.IOREG += 0x10 * slot;
io.registerSwitches(this, LOC);
return 0xc0 + slot;
},
end: function() {
return 0xc0 + slot;
},
ioSwitch: function(off, val) {
if (off == LOC.IOREG && val && 'putChar' in _cbs)
_cbs.putChar(val);
},
read: function(page, off) {
return rom[off];
},
write: function() {}
};
}

32
js/prefs.js Normal file
View File

@ -0,0 +1,32 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*jshint browser: true */
/*exported Prefs */
function Prefs()
{
return {
havePrefs: function() {
return typeof(localStorage) != "undefined";
},
readPref: function(name) {
if (localStorage)
return localStorage.getItem(name);
return null;
},
writePref: function(name, value) {
if (localStorage)
localStorage.setItem(name, value);
}
};
}

57
js/ram.js Normal file
View File

@ -0,0 +1,57 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*globals allocMemPages, base64_encode, base64_decode */
/*exported RAM */
function RAM(sp, ep) {
var mem;
var start_page = sp;
var end_page = ep;
mem = allocMemPages(ep - sp + 1);
for (var page = 0; page <= ep; page++) {
for (var off = 0; off < 0x100; off++) {
mem[page * 0x100 + off] = 0; // Math.floor(Math.random()*256);
}
}
return {
start: function() {
return start_page;
},
end: function() {
return end_page;
},
read: function(page, off) {
return mem[(page - start_page) * 0x100 + off];
},
write: function(page, off, val) {
mem[(page - start_page) * 0x100 + off] = val;
},
getState: function() {
return {
start: start_page,
end: end_page,
mem: base64_encode(mem)
};
},
setState: function(state) {
start_page = state.start;
end_page = state.end;
mem = base64_decode(state.mem);
}
};
}

1209
js/ramfactor.js Normal file

File diff suppressed because it is too large Load Diff

46
js/slot3.js Normal file
View File

@ -0,0 +1,46 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*exported Slot3*/
function Slot3(mmu, rom)
{
var auxRomFn = {
start: function auxRom_start() {
return 0xc8;
},
end: function auxRom_end() {
return 0xcf;
},
read: function auxRom_read(page, off) {
return rom.read(page, off);
},
write: function auxRom_write() {}
};
return {
start: function slot3_start() {
return 0xc3;
},
end: function slot3_end() {
return 0xc3;
},
read: function slot3_read(page, off) {
mmu.auxRom(0x3, auxRomFn);
return rom.read(page, off);
},
write: function slot3_write() {
mmu.auxRom(0x3, auxRomFn);
}
};
}

671
js/symbols.js Normal file
View File

@ -0,0 +1,671 @@
var SYMBOLS = {
/*
0x00: "GOWARM",
0x03: "GOSTROUT",
0x0A: "USR",
0x0D: "CHARAC",
0x0E: "ENDCHR",
0x0F: "TKN.CNTR",
0x0F: "EOL.PNTR",
0x0F: "NUMDIM",
0x10: "DIMFLG",
0x11: "VALTYP",
0x13: "DATAFLG",
0x13: "GARFLG",
0x14: "SUBFLG",
0x15: "INPUTFLG",
0x16: "CPRMASK",
0x16: "SIGNFLG",
0x1A: "HGR.SHAPE",
0x1C: "HGR.BITS",
0x1D: "HGR.COUNT",
0x24: "MON.CH",
0x26: "MON.GBASL",
0x27: "MON.GBASH",
0x2C: "MON.H2",
0x2D: "MON.V2",
0x30: "MON.HMASK",
0x32: "MON.INVFLG",
0x33: "MON.PROMPT",
0x3C: "MON.A1L",
0x3D: "MON.A1H",
0x3E: "MON.A2L",
0x3F: "MON.A2H",
0x50: "LINNUM",
0x52: "TEMPPT",
0x53: "LASTPT",
0x55: "TEMPST",
0x5E: "INDEX",
0x60: "DEST",
0x62: "RESULT",
0x67: "TXTTAB",
0x69: "VARTAB",
0x6B: "ARYTAB",
0x6D: "STREND",
0x6F: "FRETOP",
0x71: "FRESPC",
0x73: "MEMSIZ",
0x75: "CURLIN",
0x77: "OLDLIN",
0x79: "OLDTEXT",
0x7B: "DATLIN",
0x7D: "DATPTR",
0x7F: "INPTR",
0x81: "VARNAM",
0x83: "VARPNT",
0x85: "FORPNT",
0x87: "TXPSV",
0x87: "LASTOP",
0x89: "CPRTYP",
0x8A: "TEMP3",
0x8A: "FNCNAM",
0x8C: "DSCPTR",
0x8F: "DSCLEN",
0x90: "JMPADRS",
0x91: "LENGTH",
0x92: "ARG.EXTENSION",
0x93: "TEMP1",
0x94: "ARYPNT",
0x94: "HIGHDS",
0x96: "HIGHTR",
0x98: "TEMP2",
0x99: "TMPEXP",
0x99: "INDX",
0x9A: "EXPON",
0x9B: "DPFLG",
0x9B: "LOWTR",
0x9C: "EXPSGN",
0x9D: "FAC",
0x9D: "DSCTMP",
0xA0: "VPNT",
0xA2: "FAC.SIGN",
0xA3: "SERLEN",
0xA4: "SHIFT.SIGN.EXT",
0xA5: "ARG",
0xAA: "ARG.SIGN",
0xAB: "SGNCPR",
0xAC: "FAC.EXTENSION",
0xAD: "SERPNT",
0xAB: "STRNG1",
0xAD: "STRNG2",
0xAF: "PRGEND",
0xB1: "CHRGET",
0xB7: "CHRGOT",
0xB8: "TXTPTR",
0xC9: "RNDSEED",
0xD0: "HGR.DX",
0xD2: "HGR.DY",
0xD3: "HGR.QUADRANT",
0xD4: "HGR.E",
0xD6: "LOCK",
0xD8: "ERRFLG",
0xDA: "ERRLIN",
0xDC: "ERRPOS",
0xDE: "ERRNUM",
0xDF: "ERRSTK",
0xE0: "HGR.X",
0xE2: "HGR.Y",
0xE4: "HGR.COLOR",
0xE5: "HGR.HORIZ",
0xE6: "HGR.PAGE",
0xE7: "HGR.SCALE",
0xE8: "HGR.SHAPE.PNTR",
0xEA: "HGR.COLLISIONS",
0xF0: "FIRST",
0xF1: "SPEEDZ",
0xF2: "TRCFLG",
0xF3: "FLASH.BIT",
0xF4: "TXTPSV",
0xF6: "CURLSV",
0xF8: "REMSTK",
0xF9: "HGR.ROTATION",
0x0100: "STACK",
0x0200: "INPUT.BUFFER",
0x03F5: "AMPERSAND.VECTOR",
*/
0xC000: "KEYBOARD",
0xC050: "SW.TXTCLR",
0xC052: "SW.MIXCLR",
0xC053: "SW.MIXSET",
0xC054: "SW.LOWSCR",
0xC055: "SW.HISCR",
0xC056: "SW.LORES",
0xC057: "SW.HIRES",
0xD000: "TOKEN.ADDRESS.TABLE",
0xD080: "UNFNC",
0xD0B2: "MATHTBL",
0xD0C7: "M.NEG",
0xD0CA: "M.EQU",
0xD0CD: "M.REL",
0xD0D0: "TOKEN.NAME.TABLE",
0xD260: "ERROR.MESSAGES",
0xD350: "QT.ERROR",
0xD358: "QT.IN",
0xD35D: "QT.BREAK",
0xD365: "GTFORPNT",
0xD393: "BLTU",
0xD39A: "BLTU2",
0xD3D6: "CHKMEM",
0xD3E3: "REASON",
0xD410: "MEMERR",
0xD412: "ERROR",
0xD431: "PRINT.ERROR.LINNUM",
0xD43C: "RESTART",
0xD45C: "NUMBERED.LINE",
0xD4B5: "PUT.NEW.LINE",
0xD4F2: "FIX.LINKS",
0xD52C: "INLIN",
0xD52E: "INLIN2",
0xD553: "INCHR",
0xD559: "PARSE.INPUT.LINE",
0xD56C: "PARSE",
0xD61A: "FNDLIN",
0xD61E: "FL1",
0xD648: "RTS.1",
0xD649: "NEW",
0xD64B: "SCRTCH",
0xD665: "SETPTRS",
0xD66A: "CLEAR",
0xD66C: "CLEARC",
0xD683: "STKINI",
0xD696: "RTS.2",
0xD697: "STXTPT",
0xD6A5: "LIST",
0xD6DA: "LIST.0",
0xD6FE: "LIST.1",
0xD702: "LIST.2",
0xD724: "LIST.3",
0xD72C: "GETCHR",
0xD734: "LIST.4",
0xD766: "FOR",
0xD7AF: "STEP",
0xD7D2: "NEWSTT",
0xD805: "TRACE.",
0xD826: "GOEND",
0xD828: "EXECUTE.STATEMENT",
0xD82A: "EXECUTE.STATEMENT.1",
0xD842: "COLON.",
0xD846: "SYNERR.1",
0xD849: "RESTORE",
0xD853: "SETDA",
0xD857: "RTS.3",
0xD858: "ISCNTC",
0xD863: "CONTROL.C.TYPED",
0xD86E: "STOP",
0xD870: "END",
0xD871: "END2",
0xD88A: "END4",
0xD896: "CONT",
0xD8AF: "RTS.4",
0xD8B0: "SAVE",
0xD8C9: "LOAD",
0xD8F0: "VARTIO",
0xD901: "PROGIO",
0xD912: "RUN",
0xD921: "GOSUB",
0xD935: "GO.TO.LINE",
0xD93E: "GOTO",
0xD96A: "RTS.5",
0xD96B: "POP",
0xD97C: "UNDERR",
0xD981: "SYNERR.2",
0xD984: "RETURN",
0xD995: "DATA",
0xD998: "ADDON",
0xD9A2: "RTS.6",
0xD9A3: "DATAN",
0xD9A6: "REMN",
0xD9C5: "PULL3",
0xD9C9: "IF",
0xD9DC: "REM",
0xD9E1: "IF.TRUE",
0xD9EC: "ONGOTO",
0xD9F4: "ON.1",
0xD9F8: "ON.2",
0xDA0B: "RTS.7",
0xDA0C: "LINGET",
0xDA46: "LET",
0xDA63: "LET2",
0xDA7A: "LET.STRING",
0xDA7B: "PUTSTR",
0xDACF: "PR.STRING",
0xDAD5: "PRINT",
0xDAD7: "PRINT2",
0xDAFB: "CRDO",
0xDB00: "NEGATE",
0xDB02: "RTS.8",
0xDB03: "PR.COMMA",
0xDB16: "PR.TAB.OR.SPC",
0xDB2C: "NXSPC",
0xDB2F: "PR.NEXT.CHAR",
0xDB35: "DOSPC",
0xDB3A: "STROUT",
0xDB3D: "STRPRT",
0xDB57: "OUTSP",
0xDB5A: "OUTQUES",
0xDB5C: "OUTDO",
0xDB71: "INPUTERR",
0xDB7B: "READERR",
0xDB7F: "ERLIN",
0xDB86: "INPERR",
0xDB87: "RESPERR",
0xDBA0: "GET",
0xDBB2: "INPUT",
0xDBDC: "NXIN",
0xDBE2: "READ",
0xDBE9: "INPUT.FLAG.ZERO",
0xDBEB: "PROCESS.INPUT.LIST",
0xDBF1: "PROCESS.INPUT.ITEM",
0xDC2B: "INSTART",
0xDC69: "INPUT.DATA",
0xDC72: "INPUT.MORE",
0xDC99: "INPFIN",
0xDCA0: "FINDATA",
0xDCC6: "INPDONE",
0xDCDF: "ERR.EXTRA",
0xDCEF: "ERR.REENTRY",
0xDCF9: "NEXT",
0xDCFF: "NEXT.1",
0xDD02: "NEXT.2",
0xDD0D: "GERR",
0xDD0F: "NEXT.3",
0xDD67: "FRMNUM",
0xDD6A: "CHKNUM",
0xDD6C: "CHKSTR",
0xDD6D: "CHKVAL",
0xDD78: "JERROR",
0xDD7B: "FRMEVL",
0xDD86: "FRMEVL.1",
0xDD95: "FRMEVL.2",
0xDDCD: "FRM.PRECEDENCE.TEST",
0xDDD6: "NXOP",
0xDDD7: "SAVOP",
0xDDE4: "FRM.RELATIONAL",
0xDDF6: "PREFNC",
0xDDFD: "FRM.RECURSE",
0xDE0D: "SNTXERR",
0xDE10: "FRM.STACK.1",
0xDE15: "FRM.STACK.2",
0xDE20: "FRM.STACK.3",
0xDE35: "NOTMATH",
0xDE38: "GOEX",
0xDE3A: "FRM.PERFORM.1",
0xDE43: "FRM.PERFORM.2",
0xDE5D: "EXIT",
0xDE60: "FRM.ELEMENT",
0xDE81: "STRTXT",
0xDE90: "NOT.",
0xDE98: "EQUOP",
0xDEA4: "FN.",
0xDEAB: "SGN.",
0xDEB2: "PARCHK",
0xDEB8: "CHKCLS",
0xDEBB: "CHKOPN",
0xDEBE: "CHKCOM",
0xDEC0: "SYNCHR",
0xDEC9: "SYNERR",
0xDECE: "MIN",
0xDED0: "EQUL",
0xDED5: "FRM.VARIABLE",
0xDED7: "FRM.VARIABLE.CALL",
0xDEF9: "SCREEN",
0xDF0C: "UNARY",
0xDF4F: "OR",
0xDF55: "AND",
0xDF5D: "FALSE",
0xDF60: "TRUE",
0xDF65: "RELOPS",
0xDF7D: "STRCMP",
0xDFAA: "STRCMP.1",
0xDFB0: "NUMCMP",
0xDFB5: "STRCMP.2",
0xDFC1: "CMPDONE",
0xDFCD: "PDL",
0xDFD6: "NXDIM",
0xDFD9: "DIM",
0xDFE3: "PTRGET",
0xDFE8: "PTRGET2",
0xDFEA: "PTRGET3",
0xDFF4: "BADNAM",
0xDFF7: "NAMOK",
0xE007: "PTRGET4",
0xE07D: "ISLETC",
0xE087: "NAME.NOT.FOUND",
0xE09A: "C.ZERO",
0xE09C: "MAKE.NEW.VARIABLE",
0xE0DE: "SET.VARPNT.AND.YA",
0xE0ED: "GETARY",
0xE0EF: "GETARY2",
0xE0FE: "NEG32768",
0xE102: "MAKINT",
0xE108: "MKINT",
0xE10C: "AYINT",
0xE119: "MI1",
0xE11B: "MI2",
0xE11E: "ARRAY",
0xE196: "SUBERR",
0xE199: "IQERR",
0xE19B: "JER",
0xE19E: "USE.OLD.ARRAY",
0xE1B8: "MAKE.NEW.ARRAY",
0xE24B: "FIND.ARRAY.ELEMENT",
0xE253: "FAE.1",
0xE269: "GSE",
0xE26C: "GME",
0xE26F: "FAE.2",
0xE270: "FAE.3",
0xE2AC: "RTS.9",
0xE2AD: "MULTIPLY.SUBSCRIPT",
0xE2B6: "MULTIPLY.SUBS.1",
0xE2DE: "FRE",
0xE2F2: "GIVAYF",
0xE2FF: "POS",
0xE301: "SNGFLT",
0xE306: "ERRDIR",
0xE30E: "UNDFNC",
0xE313: "DEF",
0xE341: "FNC.",
0xE354: "FUNCT",
0xE3AF: "FNCDATA",
0xE3C5: "STR",
0xE3D5: "STRINI",
0xE3DD: "STRSPA",
0xE3E7: "STRLIT",
0xE3ED: "STRLT2",
0xE42A: "PUTNEW",
0xE432: "JERR",
0xE435: "PUTEMP",
0xE452: "GETSPA",
0xE484: "GARBAG",
0xE488: "FIND.HIGHEST.STRING",
0xE519: "CHECK.SIMPLE.VARIABLE",
0xE523: "CHECK.VARIABLE",
0xE552: "CHECK.BUMP",
0xE55D: "CHECK.EXIT",
0xE562: "MOVE.HIGHEST.STRING.TO.TOP",
0xE597: "CAT",
0xE5D4: "MOVINS",
0xE5E2: "MOVSTR",
0xE5E6: "MOVSTR.1",
0xE5FD: "FRESTR",
0xE600: "FREFAC",
0xE604: "FRETMP",
0xE635: "FRETMS",
0xE646: "CHRSTR",
0xE65A: "LEFTSTR",
0xE660: "SUBSTRING.1",
0xE667: "SUBSTRING.2",
0xE668: "SUBSTRING.3",
0xE686: "RIGHTSTR",
0xE691: "MIDSTR",
0xE6B9: "SUBSTRING.SETUP",
0xE6D6: "LEN",
0xE6DC: "GETSTR",
0xE6E5: "ASC",
0xE6F2: "GOIQ",
0xE6F5: "GTBYTC",
0xE6F8: "GETBYT",
0xE6FB: "CONINT",
0xE707: "VAL",
0xE73D: "POINT",
0xE746: "GTNUM",
0xE74C: "COMBYTE",
0xE752: "GETADR",
0xE764: "PEEK",
0xE77B: "POKE",
0xE784: "WAIT",
0xE79F: "RTS.10",
0xE7A0: "FADDH",
0xE7A7: "FSUB",
0xE7AA: "FSUBT",
0xE7B9: "FADD.1",
0xE7BE: "FADD",
0xE7C1: "FADDT",
0xE7CE: "FADD.2",
0xE7FA: "FADD.3",
0xE829: "NORMALIZE.FAC.1",
0xE82E: "NORMALIZE.FAC.2",
0xE84E: "ZERO.FAC",
0xE850: "STA.IN.FAC.SIGN.AND.EXP",
0xE852: "STA.IN.FAC.SIGN",
0xE855: "FADD.4",
0xE874: "NORMALIZE.FAC.3",
0xE880: "NORMALIZE.FAC.4",
0xE88D: "NORMALIZE.FAC.5",
0xE88F: "NORMALIZE.FAC.6",
0xE89D: "RTS.11",
0xE89E: "COMPLEMENT.FAC",
0xE8A4: "COMPLEMENT.FAC.MANTISSA",
0xE8C6: "INCREMENT.FAC.MANTISSA",
0xE8D4: "RTS.12",
0xE8D5: "OVERFLOW",
0xE8DA: "SHIFT.RIGHT.1",
0xE8DC: "SHIFT.RIGHT.2",
0xE8F0: "SHIFT.RIGHT",
0xE8FD: "L",
0xE8FD: "SHIFT.RIGHT.3",
0xE907: "SHIFT.RIGHT.4",
0xE911: "SHIFT.RIGHT.5",
0xE913: "CON.ONE",
0xE918: "POLY.LOG",
0xE92D: "CON.SQR.HALF",
0xE932: "CON.SQR.TWO",
0xE937: "CON.NEG.HALF",
0xE93C: "CON.LOG.TWO",
0xE941: "LOG",
0xE948: "GIQ",
0xE94B: "LOG.2",
0xE97F: "FMULT",
0xE982: "FMULTT",
0xE9B0: "MULTIPLY.1",
0xE9B5: "MULTIPLY.2",
0xE9E2: "RTS.13",
0xE9E3: "LOAD.ARG.FROM.YA",
0xEA0E: "ADD.EXPONENTS",
0xEA10: "ADD.EXPONENTS.1",
0xEA2B: "OUTOFRNG",
0xEA31: "ZERO",
0xEA36: "JOV",
0xEA39: "MUL10",
0xEA50: "CON.TEN",
0xEA55: "DIV10",
0xEA5E: "DIV",
0xEA66: "FDIV",
0xEA69: "FDIVT",
0xEAE6: "COPY.RESULT.INTO.FAC",
0xEAF9: "LOAD.FAC.FROM.YA",
0xEB1E: "STORE.FAC.IN.TEMP2.ROUNDED",
0xEB21: "STORE.FAC.IN.TEMP1.ROUNDED",
0xEB27: "SETFOR",
0xEB2B: "STORE.FAC.AT.YX.ROUNDED",
0xEB53: "COPY.ARG.TO.FAC",
0xEB55: "MFA",
0xEB63: "COPY.FAC.TO.ARG.ROUNDED",
0xEB66: "MAF",
0xEB71: "RTS.14",
0xEB72: "ROUND.FAC",
0xEB7A: "INCREMENT.MANTISSA",
0xEB82: "SIGN",
0xEB86: "SIGN1",
0xEB88: "SIGN2",
0xEB8F: "RTS.15",
0xEB90: "SGN",
0xEB93: "FLOAT",
0xEB9B: "FLOAT.1",
0xEBA0: "FLOAT.2",
0xEBAF: "ABS",
0xEBB2: "FCOMP",
0xEBB4: "FCOMP2",
0xEBF2: "QINT",
0xEC11: "RTS.16",
0xEC12: "QINT.2",
0xEC23: "INT",
0xEC40: "QINT.3",
0xEC49: "RTS.17",
0xEC4A: "FIN",
0xEC61: "FIN.1",
0xEC64: "FIN.2",
0xEC66: "FIN.3",
0xEC87: "FIN.4",
0xEC8A: "FIN.5",
0xEC8C: "FIN.6",
0xEC98: "FIN.10",
0xEC9E: "FIN.7",
0xECA0: "FIN.8",
0xECC1: "FIN.9",
0xECD5: "ADDACC",
0xECE8: "GETEXP",
0xED0A: "CON.99999999.9",
0xED0F: "CON.999999999",
0xED14: "CON.BILLION",
0xED19: "INPRT",
0xED24: "LINPRT",
0xED2E: "PRINT.FAC",
0xED31: "GO.STROUT",
0xED34: "FOUT",
0xED36: "FOUT.1",
0xED8C: "FOUT.2",
0xEE17: "FOUT.3",
0xEE57: "FOUT.4",
0xEE5A: "FOUT.5",
0xEE5F: "FOUT.6",
0xEE64: "CON.HALF",
0xEE69: "DECTBL",
0xEE8D: "DECTBL.END",
0xEE8D: "SQR",
0xEE97: "FPWRT",
0xEED0: "NEGOP",
0xEEDA: "RTS.18",
0xEEDB: "CON.LOG.E",
0xEEE0: "POLY.EXP",
0xEF09: "EXP",
0xEF5C: "POLYNOMIAL.ODD",
0xEF72: "POLYNOMIAL",
0xEF76: "SERMAIN",
0xEFA5: "RTS.19",
0xEFA6: "CON.RND.1",
0xEFAA: "CON.RND.2",
0xEFAE: "RND",
0xEFE7: "GO.MOVMF",
0xEFEA: "COS",
0xEFF1: "SIN",
0xF023: "SIN.1",
0xF026: "SIN.2",
0xF03A: "TAN",
0xF062: "TAN.1",
0xF066: "CON.PI.HALF",
0xF06B: "CON.PI.DOUB",
0xF070: "QUARTER",
0xF075: "POLY.SIN",
0xF09E: "ATN",
0xF0CD: "RTS.20",
0xF0CE: "POLY.ATN",
0xF10B: "GENERIC.CHRGET",
0xF128: "COLD.START",
0xF128: "GENERIC.END",
0xF1D5: "CALL",
0xF1DE: "IN.NUMBER",
0xF1E5: "PR.NUMBER",
0xF1EC: "PLOTFNS",
0xF206: "GOERR",
0xF209: "LINCOOR",
0xF225: "PLOT",
0xF232: "HLIN",
0xF241: "VLIN",
0xF24F: "COLOR",
0xF256: "VTAB",
0xF262: "SPEED",
0xF26D: "TRACE",
0xF26F: "NOTRACE",
0xF273: "NORMAL",
0xF277: "INVERSE",
0xF279: "N.I.",
0xF27B: "N.I.F.",
0xF280: "FLASH",
0xF286: "HIMEM",
0xF296: "JMM",
0xF299: "SETHI",
0xF2A6: "LOMEM",
0xF2CB: "ONERR",
0xF2E9: "HANDLERR",
0xF318: "RESUME",
0xF32E: "JSYN",
0xF331: "DEL",
0xF390: "GR",
0xF399: "TEXT",
0xF39F: "STORE",
0xF3BC: "RECALL",
0xF3D8: "HGR2",
0xF3E2: "HGR",
0xF3EA: "SETHPG",
0xF3F2: "HCLR",
0xF3F6: "BKGND",
0xF411: "HPOSN",
0xF457: "HPLOT0",
0xF465: "MOVE.LEFT.OR.RIGHT",
0xF46E: "LR.1",
0xF471: "LR.2",
0xF476: "LR.3",
0xF478: "LR.4",
0xF47E: "COLOR.SHIFT",
0xF48A: "MOVE.RIGHT",
0xF49C: "LRUDX1",
0xF49D: "LRUDX2",
0xF4B3: "LRUD1",
0xF4B4: "LRUD2",
0xF4C4: "LRUD3",
0xF4C8: "LRUD4",
0xF4CD: "CON.03",
0xF4D3: "MOVE.UP.OR.DOWN",
0xF501: "UD.1",
0xF505: "MOVE.DOWN",
0xF508: "CON.04",
0xF530: "HLINRL",
0xF53A: "HGLIN",
0xF57C: "MOVEX",
0xF581: "MOVEX2",
0xF5B2: "MSKTBL",
0xF5B9: "CON.1C",
0xF5BA: "COSINE.TABLE",
0xF5CB: "HFIND",
0xF600: "RTS.22",
0xF601: "DRAW0",
0xF605: "DRAW1",
0xF65D: "XDRAW0",
0xF661: "XDRAW1",
0xF6B9: "HFNS",
0xF6E6: "GGERR",
0xF6E9: "HCOLOR",
0xF6F5: "RTS.23",
0xF6F6: "COLORTBL",
0xF6FE: "HPLOT",
0xF721: "ROT",
0xF727: "SCALE",
0xF72D: "DRWPNT",
0xF769: "DRAW",
0xF76F: "XDRAW",
0xF775: "SHLOAD",
0xF7BC: "TAPEPNT",
0xF7D9: "GETARYPT",
0xF7E7: "HTAB",
0xF800: "MON.PLOT",
0xF819: "MON.HLINE",
0xF828: "MON.VLINE",
0xF864: "MON.SETCOL",
0xF871: "MON.SCRN",
0xFB1E: "MON.PREAD",
0xFB39: "MON.SETTXT",
0xFB40: "MON.SETGR",
0xFB5B: "MON.TABV",
0xFC58: "MON.HOME",
0xFCA8: "MON.WAIT",
0xFCFA: "MON.RD2BIT",
0xFD0C: "MON.RDKEY",
0xFD6A: "MON.GETLN",
0xFDED: "MON.COUT",
0xFE8B: "MON.INPORT",
0xFE95: "MON.OUTPORT",
0xFECD: "MON.WRITE",
0xFEFD: "MON.READ",
0xFF02: "MON.READ2"
};

380
js/thunderclock.js Normal file
View File

@ -0,0 +1,380 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*exported Thunderclock */
function Thunderclock(mmu, io, slot)
{
var rom = [
0x08,0x78,0x28,0x2c,0x58,0xff,0x70,0x05, // 00
0x38,0xb0,0x01,0x18,0xb8,0x08,0x78,0x48,
0x8a,0x48,0x98,0x48,0xad,0xff,0xcf,0x20, // 10
0x1a,0xc8,0x68,0x68,0xba,0x8d,0xf8,0x07,
0x0a,0x0a,0x0a,0x0a,0x8d,0x78,0x07,0x68, // 20
0x68,0x68,0xa8,0x68,0x9a,0x09,0x04,0x48,
0x28,0x98,0xac,0x78,0x07,0xae,0xf8,0x07, // 30
0x29,0x7f,0x48,0x50,0x0e,0xb8,0xa5,0x36,
0xd0,0x04,0xe4,0x37,0xf0,0x0a,0xa9,0x08, // 40
0x85,0x38,0x38,0x90,0x16,0x4c,0x50,0xc9,
0xa9,0x0b,0x85,0x36,0xa9,0x5e,0x9d,0xb8, // 50
0x04,0xa9,0x0a,0x9d,0x38,0x04,0xa9,0x00,
0x9d,0x38,0x05,0x68,0xc9,0x25,0xf0,0x5c, // 60
0xc9,0x26,0xf0,0x58,0xc9,0x3c,0xf0,0x54,
0xc9,0x3e,0xf0,0x50,0xc9,0x23,0xf0,0x4c, // 70
0xc9,0x5e,0xf0,0x5a,0xc9,0x21,0xf0,0x4a,
0xc9,0x2a,0xf0,0x52,0xa2,0x20,0xc9,0x2c, // 80
0xf0,0x52,0xa2,0x28,0xc9,0x2e,0xf0,0x4c,
0xa2,0x30,0xc9,0x2f,0xf0,0x46,0xae,0xf8, // 90
0x07,0x48,0xbd,0xb8,0x04,0xc9,0x21,0xf0,
0x41,0xc9,0x5e,0xf0,0x0e,0x68,0x29,0x1f, // A0
0x0a,0x38,0xe9,0x01,0x9d,0x38,0x04,0xa9,
0x5e,0xd0,0x23,0x68,0x38,0xe9,0x41,0x30, // B0
0x20,0xc9,0x16,0x10,0x1c,0xaa,0xbd,0x8d,
0xcb,0x4c,0x04,0xcb,0x9d,0x38,0x05,0x4c, // C0
0x2f,0xc9,0xa9,0x20,0x20,0xb7,0xca,0xa9,
0x08,0x20,0xb7,0xca,0xa9,0x21,0x9d,0xb8, // D0
0x04,0x4c,0x2f,0xc9,0x8a,0x20,0xb7,0xca,
0xd0,0xf7,0x68,0xc9,0x0d,0xf0,0x13,0xc9, // E0
0x20,0xf0,0x44,0x29,0x0f,0x20,0xcf,0xca,
0xf0,0x02,0xa9,0x0a,0x9d,0x38,0x07,0x18, // F0
0x90,0x35,0x20,0xcf,0xca,0x7d,0x38,0x07,
0x48,0xa9,0x09,0x9d,0x38,0x06,0x20,0xcf, // 00
0xca,0x48,0xde,0x38,0x06,0xd0,0xf7,0xa9,
0x0a,0x9d,0x38,0x06,0x68,0x20,0xcf,0xca,
0xde,0x38,0x06,0xd0,0xf7,0xa9,0x10,0x20,
0xb7,0xca,0xd0,0xb2,0xba,0x68,0x68,0x98,
0x48,0x68,0x68,0xa9,0x8d,0x48,0x9a,0xae,
0xf8,0x07,0xac,0x78,0x07,0xbd,0xb8,0x03,
0xdd,0x38,0x07,0xd0,0x0c,0x1d,0x38,0x07,
0xf0,0x07,0xc9,0x40,0xd0,0x03,0x99,0x80,
0xc0,0x68,0xa8,0x68,0xaa,0x68,0x28,0x60,
0x68,0xa9,0x18,0x20,0xb7,0xca,0xa9,0x08,
0x20,0xb7,0xca,0xa9,0x09,0x9d,0x38,0x06,
0x20,0xcf,0xca,0xc9,0x0a,0x30,0x02,0xa9,
0x00,0x48,0xde,0x38,0x06,0xd0,0xf1,0x20,
0xcf,0xca,0xc9,0x0d,0x30,0x02,0xa9,0x00,
0x48,0xbd,0x38,0x05,0xf0,0x04,0xc9,0x23,
0xd0,0x5e,0xa0,0x00,0x68,0xc9,0x0a,0x30,
0x04,0xc8,0x38,0xe9,0x0a,0x48,0x98,0xa2,
0x00,0x20,0xa6,0xca,0x68,0x20,0xa6,0xca,
0xac,0xf8,0x07,0xb9,0x38,0x05,0xd0,0x2a,
0xa9,0xaf,0x20,0xa8,0xca,0x68,0xa0,0x04,
0x68,0x20,0xa6,0xca,0x68,0x20,0xa6,0xca,
0x88,0xf0,0x07,0xa9,0x3b,0x20,0xa8,0xca,
0xd0,0xee,0xa9,0xa0,0x8d,0x05,0x02,0xb9,
0xf3,0xcb,0xf0,0x19,0x20,0xa8,0xca,0xc8,
0xd0,0xf5,0xa9,0x00,0x48,0xa0,0x05,0x20,
0xaf,0xca,0x68,0x20,0xa6,0xca,0x68,0x20,
0xa6,0xca,0x88,0xd0,0xf2,0x4c,0x9a,0xca,
0x68,0xaa,0x68,0x0a,0x0a,0xa8,0x8a,0x0a,
0x0a,0x48,0xae,0xf8,0x07,0xbd,0x38,0x05,
0xa2,0xa0,0xc9,0x3c,0xb0,0x02,0xa2,0xa2,
0x8a,0xa2,0x00,0x20,0xa8,0xca,0xb9,0xa3,
0xcb,0xc8,0x20,0xa8,0xca,0xc9,0xa0,0xd0,
0xf5,0x68,0xa8,0xb9,0xbf,0xcb,0xc8,0x20,
0xa8,0xca,0xc9,0xa0,0xd0,0xf5,0x68,0x20,
0xa4,0xca,0x68,0x20,0xa6,0xca,0x20,0xb3,
0xca,0xa0,0x03,0x68,0x20,0xa4,0xca,0xd0,
0x03,0x20,0xa6,0xca,0x68,0x20,0xa6,0xca,
0x88,0xf0,0x09,0xa9,0xba,0x20,0xa8,0xca,
0x68,0x4c,0x29,0xca,0xac,0xf8,0x07,0xb9,
0x38,0x05,0xc9,0x25,0xf0,0x04,0xc9,0x3e,
0xd0,0x50,0xa0,0x41,0xad,0x0c,0x02,0xc9,
0xa0,0xd0,0x02,0xa9,0x30,0x0a,0x0a,0x0a,
0x0a,0x8d,0x20,0x02,0xad,0x0d,0x02,0x29,
0x0f,0x0d,0x20,0x02,0xc9,0x12,0x30,0x02,
0xa0,0x50,0xc9,0x00,0xd0,0x04,0xa9,0x12,
0xd0,0x09,0xc9,0x13,0x30,0x16,0xf8,0x38,
0xe9,0x12,0xd8,0xa2,0x0c,0x48,0x20,0xff,
0xca,0x29,0x0f,0x20,0xa4,0xca,0x68,0x29,
0x0f,0x20,0xa6,0xca,0xa2,0x14,0x20,0xb3,
0xca,0x98,0x20,0xa8,0xca,0xa9,0x4d,0x20,
0xa8,0xca,0x8a,0xa8,0xa9,0x8d,0x20,0xa8,
0xca,0x4c,0x24,0xc9,0xf0,0x0d,0x09,0x30,
0x09,0x80,0x9d,0x00,0x02,0xe8,0x60,0xa9,
0xac,0xd0,0xf5,0xa9,0xa0,0xd0,0xf1,0x99,
0x80,0xc0,0x09,0x04,0x99,0x80,0xc0,0x20,
0xc7,0xca,0x49,0x04,0x99,0x80,0xc0,0x20,
0xca,0xca,0x48,0x48,0x68,0x68,0x60,0x48,
0xa9,0x04,0x9d,0xb8,0x06,0xa9,0x00,0x9d,
0xb8,0x05,0xb9,0x80,0xc0,0x0a,0x7e,0xb8,
0x05,0x68,0x48,0x29,0x01,0x99,0x80,0xc0,
0x09,0x02,0x99,0x80,0xc0,0x49,0x02,0x99,
0x80,0xc0,0x68,0x6a,0x48,0xde,0xb8,0x06,
0xd0,0xe0,0x68,0xbd,0xb8,0x05,0x18,0x6a,
0x6a,0x6a,0x6a,0x60,0x48,0xae,0xf8,0x07,
0xbd,0x38,0x04,0x9d,0xb8,0x06,0x20,0x50,
0xcb,0x68,0x48,0x20,0x4c,0xcb,0x68,0x48,
0x49,0xf8,0x20,0x4c,0xcb,0xa2,0xa0,0x20,
0x69,0xcb,0xa2,0xa0,0x20,0x69,0xcb,0xa0,
0x18,0x20,0x60,0xcb,0xae,0xf8,0x07,0xde,
0xb8,0x06,0xd0,0xda,0x68,0xa0,0xbc,0xca,
0xd0,0xfd,0x88,0xd0,0xfa,0x4c,0x2f,0xc9,
0x48,0x90,0x05,0x20,0x50,0xcb,0xf0,0x03,
0x20,0x59,0xcb,0x68,0x0a,0xd0,0xf1,0x60,
0xa2,0x50,0x20,0x69,0xcb,0xa0,0x28,0xd0,
0x07,0xa2,0x18,0x20,0x69,0xcb,0xa0,0x44,
0xa2,0x13,0xca,0xd0,0xfd,0x88,0xd0,0xf8,
0x60,0xac,0x78,0x07,0xa9,0x20,0x99,0x80,
0xc0,0xea,0xea,0xea,0x49,0x20,0x99,0x80,
0xc0,0xea,0xea,0xea,0x49,0x20,0x99,0x80,
0xc0,0xea,0xea,0xea,0x49,0x20,0x99,0x80,
0xc0,0xca,0xd0,0xe0,0x60,0x64,0xe4,0x24,
0xa4,0x14,0x94,0x54,0xd4,0x74,0xf4,0x34,
0xb4,0x04,0x84,0x44,0xc4,0x2c,0x3c,0x5c,
0x4c,0x1c,0x0c,0x53,0x55,0x4e,0x20,0x4d,
0x4f,0x4e,0x20,0x54,0x55,0x45,0x20,0x57,
0x45,0x44,0x20,0x54,0x48,0x55,0x20,0x46,
0x52,0x49,0x20,0x53,0x41,0x54,0x20,0x45,
0x52,0x52,0x20,0x4a,0x41,0x4e,0x20,0x46,
0x45,0x42,0x20,0x4d,0x41,0x52,0x20,0x41,
0x50,0x52,0x20,0x4d,0x41,0x59,0x20,0x4a,
0x55,0x4e,0x20,0x4a,0x55,0x4c,0x20,0x41,
0x55,0x47,0x20,0x53,0x45,0x50,0x20,0x4f,
0x43,0x54,0x20,0x4e,0x4f,0x56,0x20,0x44,
0x45,0x43,0x20,0xae,0xb0,0xb0,0xb0,0x00,
0xae,0xb0,0xb0,0xb0,0x00,0xa0,0xa0,0xc1,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
];
var LOC = {
CONTROL: 0x80
};
var FLAGS = {
DATA: 0x01,
CLOCK: 0x02,
STROBE: 0x04
};
function _init() {
LOC.CONTROL += slot * 0x10;
}
var auxRomFn = {
start: function auxRom_start() {
return 0xc8;
},
end: function auxRom_end() {
return 0xcf;
},
read: function auxRom_read(page, off) {
return rom[(page - 0xc8) * 256 + off];
},
write: function auxRom_write() {}
};
var _command = 0;
var _bits = [];
function _calcbits() {
function shift(val) {
for (var idx = 0; idx < 4; idx++) {
_bits.push((val & 0x08) !== 0);
val <<= 1;
}
}
function shiftBCD(val) {
shift(parseInt(val / 10, 10));
shift(parseInt(val % 10, 10));
}
var now = new Date();
var day = now.getDate();
var weekday = now.getDay();
var month = now.getMonth() + 1;
var hour = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds();
_bits = [];
shift(month);
shift(weekday);
shiftBCD(day);
shiftBCD(hour);
shiftBCD(minutes);
shiftBCD(seconds);
}
function _access(off, val) {
switch (off) {
case LOC.CONTROL:
if (val !== undefined) {
if (val & FLAGS.STROBE) {
if ((_command & 0x78) == 0x18) {
_calcbits();
}
}
_command = val;
} else {
if (_bits.pop()) {
_command |= 0x80;
} else {
_command &= 0x7f;
}
}
break;
}
return _command;
}
_init();
return {
start: function thunderclock_start() {
io.registerSwitches(this, LOC);
return 0xc0 + slot;
},
end: function thunderclock_end() {
return 0xc0 + slot;
},
read: function thunderclock_read(page, off) {
mmu.auxRom(slot, auxRomFn);
return rom[off];
},
write: function thunderclock_write() {
mmu.auxRom(slot, auxRomFn);
},
ioSwitch: function thunderclock_ioSwitch(off, val) {
return _access(off, val);
}
};
}

1
js/ui/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
ui-all*.js

32
js/ui/Makefile Normal file
View File

@ -0,0 +1,32 @@
COMPRESS = java -jar $(HOME)/bin/compiler.jar --warning_level QUIET
JSLINT = jshint
JSFILES = copyright.js keyboard2.js printer.js
JSFILES2E = copyright.js keyboard2e.js printer.js
ALLJS = ${JSFILES} ${JSFILES2E}
CHECKEDJS := $(patsubst %.js,.checked-%.js,${ALLJS})
default: ui-all.min.js ui-all2e.min.js
ui-all.min.js: ui-all.js
$(COMPRESS) < ui-all.js > ui-all.min.js
ui-all2e.min.js: ui-all2e.js
$(COMPRESS) < ui-all2e.js > ui-all2e.min.js
ui-all.js: $(JSFILES) Makefile
cat $(JSFILES) > ui-all.js
ui-all2e.js: $(JSFILES2E) Makefile
cat $(JSFILES2E) > ui-all2e.js
clean:
$(RM) -f ui-all.js ui-all.min.js ui-all2e.js ui-all2e.min.js .checked-*
lint: $(CHECKEDJS)
.checked-%.js: %.js
$(JSLINT) $<
@touch $@

11
js/ui/copyright.js Normal file
View File

@ -0,0 +1,11 @@
/*!
* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/

278
js/ui/keyboard2.js Normal file
View File

@ -0,0 +1,278 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*jshint jquery: true, browser: true */
/*globals debug: false, toHex: false, reset: false */
/*exported KeyBoard */
// keycode: [plain, cntl, shift]
function KeyBoard(io) {
var keymap = {
// Most of these won't happen
0x00: [0x00, 0x00, 0x00], //
0x01: [0x01, 0x01, 0x01], //
0x02: [0x02, 0x02, 0x02], //
0x03: [0x03, 0x03, 0x03], //
0x04: [0x04, 0x04, 0x04], //
0x05: [0x05, 0x05, 0x05], //
0x06: [0x06, 0x06, 0x06], //
0x07: [0x07, 0x07, 0x07], //
0x08: [0x08, 0x08, 0x08], // BS
0x09: [0x09, 0x09, 0x09], // TAB
0x0A: [0x0A, 0x0A, 0x0A], //
0x0B: [0x0B, 0x0B, 0x0B], //
0x0C: [0x0C, 0x0C, 0x0C], //
0x0D: [0x0D, 0x0D, 0x0D], // CR
0x0E: [0x0E, 0x0E, 0x0E], //
0x0F: [0x0F, 0x0F, 0x0F], //
0x10: [0xff, 0xff, 0xff], // SHIFT
0x11: [0xff, 0xff, 0xff], // CTRL
0x12: [0xff, 0xff, 0xff], // OPTION
0x13: [0x13, 0x13, 0x13], //
0x14: [0x14, 0x14, 0x14], //
0x15: [0x15, 0x15, 0x15], //
0x16: [0x16, 0x16, 0x16], //
0x17: [0x17, 0x17, 0x18], //
0x18: [0x18, 0x18, 0x18], //
0x19: [0x19, 0x19, 0x19], //
0x1A: [0x1A, 0x1A, 0x1A], //
0x1B: [0x1B, 0x1B, 0x1B], // ESC
0x1C: [0x1C, 0x1C, 0x1C], //
0x1D: [0x1D, 0x1D, 0x1D], //
0x1E: [0x1E, 0x1E, 0x1E], //
0x1F: [0x1F, 0x1F, 0x1F], //
// Most of these besides space won't happen
0x20: [0x20, 0x20, 0x20], //
0x21: [0x21, 0x21, 0x21], //
0x22: [0x22, 0x22, 0x22], //
0x23: [0x23, 0x23, 0x23], //
0x24: [0x24, 0x24, 0x24], //
0x25: [0x08, 0x08, 0x08], // <- left
0x26: [0x0B, 0x0B, 0x0B], // ^ up
0x27: [0x15, 0x15, 0x15], // -> right
0x28: [0x0A, 0x0A, 0x0A], // v down
0x29: [0x29, 0x29, 0x29], // )
0x2A: [0x2A, 0x2A, 0x2A], // *
0x2B: [0x2B, 0x2B, 0x2B], // +
0x2C: [0x2C, 0x2C, 0x3C], // , - <
0x2D: [0x2D, 0x2D, 0x5F], // - - _
0x2E: [0x2E, 0x2E, 0x3E], // . - >
0x2F: [0x2F, 0x2F, 0x3F], // / - ?
0x30: [0x30, 0x30, 0x29], // 0 - )
0x31: [0x31, 0x31, 0x21], // 1 - !
0x32: [0x32, 0x00, 0x40], // 2 - @
0x33: [0x33, 0x33, 0x23], // 3 - #
0x34: [0x34, 0x34, 0x24], // 4 - $
0x35: [0x35, 0x35, 0x25], // 5 - %
0x36: [0x36, 0x36, 0x5E], // 6 - ^
0x37: [0x37, 0x37, 0x26], // 7 - &
0x38: [0x38, 0x38, 0x2A], // 8 - *
0x39: [0x39, 0x39, 0x28], // 9 - (
0x3A: [0x3A, 0x3A, 0x3A], // :
0x3B: [0x3B, 0x3B, 0x3A], // ; - :
0x3C: [0x3C, 0x3C, 0x3C], // <
0x3D: [0x3D, 0x3D, 0x2B], // = - +
0x3E: [0x3E, 0x3E, 0x3E], // >
0x3F: [0x3F, 0x3F, 0x3F], // ?
// Alpha and control
0x40: [0x40, 0x00, 0x40], // @
0x41: [0x41, 0x01, 0x41], // A
0x42: [0x42, 0x02, 0x42], // B
0x43: [0x43, 0x03, 0x43], // C - BRK
0x44: [0x44, 0x04, 0x44], // D
0x45: [0x45, 0x05, 0x45], // E
0x46: [0x46, 0x06, 0x46], // F
0x47: [0x47, 0x07, 0x47], // G - BELL
0x48: [0x48, 0x08, 0x48], // H
0x49: [0x49, 0x09, 0x49], // I - TAB
0x4A: [0x4A, 0x0A, 0x4A], // J - NL
0x4B: [0x4B, 0x0B, 0x4B], // K - VT
0x4C: [0x4C, 0x0C, 0x4C], // L
0x4D: [0x4D, 0x0D, 0x4D], // M - CR
0x4E: [0x4E, 0x0E, 0x4E], // N
0x4F: [0x4F, 0x0F, 0x4F], // O
0x50: [0x50, 0x10, 0x50], // P
0x51: [0x51, 0x11, 0x51], // Q
0x52: [0x52, 0x12, 0x52], // R
0x53: [0x53, 0x13, 0x53], // S
0x54: [0x54, 0x14, 0x54], // T
0x55: [0x55, 0x15, 0x55], // U
0x56: [0x56, 0x16, 0x56], // V
0x57: [0x57, 0x17, 0x57], // W
0x58: [0x58, 0x18, 0x58], // X
0x59: [0x59, 0x19, 0x59], // Y
0x5A: [0x5A, 0x1A, 0x5A], // Z
// 0x5B: [0x5B, 0x1B, 0x5B], // [ - ESC
// 0x5C: [0x5C, 0x1C, 0x5C], // \
// 0x5D: [0x5D, 0x1D, 0x5D], // ]
0x5E: [0x5E, 0x1E, 0x5E], // ^
0x5F: [0x5F, 0x1F, 0x5F], // _
// Stray keys
0xBA: [0x3B, 0x3B, 0x3A], // ; - :
0xBB: [0x3D, 0x3D, 0x2B], // = - +
0xBC: [0x2C, 0x2C, 0x3C], // , - <
0xBD: [0x2D, 0x2D, 0x5F], // - - _
0xBE: [0x2E, 0x2E, 0x3E], // . - >
0xBF: [0x2F, 0x2F, 0x3F], // / - ?
0xDB: [0x5B, 0x5B, 0x5B], // [
0xDC: [0x5C, 0x5C, 0x5C], // \
0xDD: [0x5D, 0x5D, 0x5D], // ]
0xDE: [0x27, 0x27, 0x22], // ' - "
0xFF: [0xFF, 0xFF, 0xFF] // No comma line
};
var keys =
[[['1','2','3','4','5','6','7','8','9','0',':','-','RESET'],
['ESC','Q','W','E','R','T','Y','U','I','O','P','REPT','RETURN'],
['CTRL','A','S','D','F','G','H','J','K','L',';','&larr;','&rarr;'],
['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'],
['POWER', '&nbsp;']],
[['!','"','#','$','%','&',"'",'(',')','0','*','=','RESET'],
['ESC','Q','W','E','R','T','Y','U','I','O','@','REPT','RETURN'],
['CTRL','A','S','D','F','BELL','H','J','K','L','+','&larr;','&rarr;'],
['SHIFT','Z','X','C','V','B','^','M','<','>','?','SHIFT'],
['POWER', '&nbsp;']]];
var shifted = false;
var controlled = false;
return {
mapKeyEvent: function keyboard_mapKeyEvent(evt) {
var code = evt.keyCode;
if (code in keymap) {
return keymap[code][evt.shiftKey ? 2 : (evt.ctrlKey ? 1 : 0)];
}
debug("Unhandled key = " + toHex(code));
return 0xFF;
},
create: function keyboard_create(kb) {
var x, y, row, key, key1, key2, label, label1, label2;
kb.disableSelection();
function buildLabel(k) {
var span = $("<span>" + k + "</span>");
if (k.length > 1 && k.substr(0,1) != '&')
span.addClass("small");
return span;
}
function _mousedown() {
$(this).addClass("pressed");
}
function _mouseup() {
$(this).removeClass("pressed");
}
function _click() {
var self = this,
key = $(self).data(shifted ? "key2" : "key1");
switch (key) {
case "BELL":
key = "G";
break;
case "RETURN":
key = "\r";
break;
case "&larr;":
key = "\010";
break;
case "&rarr;":
key = "\025";
break;
case "&nbsp;":
key = " ";
break;
case "ESC":
key = "\033";
break;
default:
break;
}
if (key.length > 1) {
switch (key) {
case "SHIFT":
shifted = !shifted;
$("#keyboard .key-SHIFT").toggleClass("shifted");
break;
case "CTRL":
controlled = !controlled;
$("#keyboard .key-CTRL").toggleClass("controlled");
break;
case "RESET":
reset();
break;
case "POWER":
if (window.confirm("Power Cycle?"))
window.location.reload();
break;
default:
break;
}
} else {
if (controlled && key >= "@" && key <= "_") {
io.keyDown(key.charCodeAt(0) - 0x40);
} else {
io.keyDown(key.charCodeAt(0));
}
}
}
for (y = 0; y < 5; y++) {
row = $("<div class='row row" + y + "'/>");
kb.append(row);
for (x = 0; x < keys[0][y].length; x++) {
key1 = keys[0][y][x];
key2 = keys[1][y][x];
label = $("<div />");
label1 = buildLabel(key1);
label2 = buildLabel(key2);
key = $("<div class='key'>");
key.addClass("key-" + key1.replace(/[&;]/g,""));
if (key1.length > 1)
key.addClass("vcenter");
if (key1 != key2) {
key.addClass("key-" + key2.replace(/[&;]/g,""));
label.append(label2);
label.append("<br/>");
}
label.append(label1);
key.append(label);
key.data({"key1": key1, "key2": key2});
key.bind("mousedown", _mousedown);
key.bind("mouseup mouseout", _mouseup);
key.click(_click);
row.append(key);
}
}
}
};
}

378
js/ui/keyboard2e.js Normal file
View File

@ -0,0 +1,378 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*jshint jquery: true, browser: true */
/*globals debug: false, toHex: false */
/*exported KeyBoard */
function KeyBoard(io) {
// keycode: [plain, cntl, shift]
var keymap = {
// Most of these won't happen
0x00: [0x00, 0x00, 0x00], //
0x01: [0x01, 0x01, 0x01], //
0x02: [0x02, 0x02, 0x02], //
0x03: [0x03, 0x03, 0x03], //
0x04: [0x04, 0x04, 0x04], //
0x05: [0x05, 0x05, 0x05], //
0x06: [0x06, 0x06, 0x06], //
0x07: [0x07, 0x07, 0x07], //
0x08: [0x7F, 0x7F, 0x7F], // BS/DELETE
0x09: [0x09, 0x09, 0x09], // TAB
0x0A: [0x0A, 0x0A, 0x0A], //
0x0B: [0x0B, 0x0B, 0x0B], //
0x0C: [0x0C, 0x0C, 0x0C], //
0x0D: [0x0D, 0x0D, 0x0D], // CR
0x0E: [0x0E, 0x0E, 0x0E], //
0x0F: [0x0F, 0x0F, 0x0F], //
0x10: [0xff, 0xff, 0xff], // SHIFT
0x11: [0xff, 0xff, 0xff], // CTRL
0x12: [0xff, 0xff, 0xff], // ALT/OPTION
0x13: [0x13, 0x13, 0x13], //
0x14: [0x14, 0x14, 0x14], //
0x15: [0x15, 0x15, 0x15], //
0x16: [0x16, 0x16, 0x16], //
0x17: [0x17, 0x17, 0x18], //
0x18: [0x18, 0x18, 0x18], //
0x19: [0x19, 0x19, 0x19], //
0x1A: [0x1A, 0x1A, 0x1A], //
0x1B: [0x1B, 0x1B, 0x1B], // ESC
0x1C: [0x1C, 0x1C, 0x1C], //
0x1D: [0x1D, 0x1D, 0x1D], //
0x1E: [0x1E, 0x1E, 0x1E], //
0x1F: [0x1F, 0x1F, 0x1F], //
// Most of these besides space won't happen
0x20: [0x20, 0x20, 0x20], //
0x21: [0x21, 0x21, 0x21], //
0x22: [0x22, 0x22, 0x22], //
0x23: [0x23, 0x23, 0x23], //
0x24: [0x24, 0x24, 0x24], //
0x25: [0x08, 0x08, 0x08], // <- left
0x26: [0x0B, 0x0B, 0x0B], // ^ up
0x27: [0x15, 0x15, 0x15], // -> right
0x28: [0x0A, 0x0A, 0x0A], // v down
0x29: [0x29, 0x29, 0x29], // )
0x2A: [0x2A, 0x2A, 0x2A], // *
0x2B: [0x2B, 0x2B, 0x2B], // +
0x2C: [0x2C, 0x2C, 0x3C], // , - <
0x2D: [0x2D, 0x2D, 0x5F], // - - _
0x2E: [0x2E, 0x2E, 0x3E], // . - >
0x2F: [0x2F, 0x2F, 0x3F], // / - ?
0x30: [0x30, 0x30, 0x29], // 0 - )
0x31: [0x31, 0x31, 0x21], // 1 - !
0x32: [0x32, 0x00, 0x40], // 2 - @
0x33: [0x33, 0x33, 0x23], // 3 - #
0x34: [0x34, 0x34, 0x24], // 4 - $
0x35: [0x35, 0x35, 0x25], // 5 - %
0x36: [0x36, 0x36, 0x5E], // 6 - ^
0x37: [0x37, 0x37, 0x26], // 7 - &
0x38: [0x38, 0x38, 0x2A], // 8 - *
0x39: [0x39, 0x39, 0x28], // 9 - (
0x3A: [0x3A, 0x3A, 0x3A], // :
0x3B: [0x3B, 0x3B, 0x3A], // ; - :
0x3C: [0x3C, 0x3C, 0x3C], // <
0x3D: [0x3D, 0x3D, 0x2B], // = - +
0x3E: [0x3E, 0x3E, 0x3E], // >
0x3F: [0x3F, 0x3F, 0x3F], // ?
// Alpha and control
0x40: [0x40, 0x00, 0x40], // @
0x41: [0x61, 0x01, 0x41], // A
0x42: [0x62, 0x02, 0x42], // B
0x43: [0x63, 0x03, 0x43], // C - BRK
0x44: [0x64, 0x04, 0x44], // D
0x45: [0x65, 0x05, 0x45], // E
0x46: [0x66, 0x06, 0x46], // F
0x47: [0x67, 0x07, 0x47], // G - BELL
0x48: [0x68, 0x08, 0x48], // H
0x49: [0x69, 0x09, 0x49], // I - TAB
0x4A: [0x6A, 0x0A, 0x4A], // J - NL
0x4B: [0x6B, 0x0B, 0x4B], // K - VT
0x4C: [0x6C, 0x0C, 0x4C], // L
0x4D: [0x6D, 0x0D, 0x4D], // M - CR
0x4E: [0x6E, 0x0E, 0x4E], // N
0x4F: [0x6F, 0x0F, 0x4F], // O
0x50: [0x70, 0x10, 0x50], // P
0x51: [0x71, 0x11, 0x51], // Q
0x52: [0x72, 0x12, 0x52], // R
0x53: [0x73, 0x13, 0x53], // S
0x54: [0x74, 0x14, 0x54], // T
0x55: [0x75, 0x15, 0x55], // U
0x56: [0x76, 0x16, 0x56], // V
0x57: [0x77, 0x17, 0x57], // W
0x58: [0x78, 0x18, 0x58], // X
0x59: [0x79, 0x19, 0x59], // Y
0x5A: [0x7A, 0x1A, 0x5A], // Z
0x5B: [0xFF, 0xFF, 0xFF], // Left window
0x5C: [0xFF, 0xFF, 0xFF], // Right window
0x5D: [0xFF, 0xFF, 0xFF], // Select
0x5E: [0x5E, 0x1E, 0x5E], //
0x5F: [0x5F, 0x1F, 0x5F], // _
// Numeric pad
0x60: [0x30, 0x30, 0x30], // 0
0x61: [0x31, 0x31, 0x31], // 1
0x62: [0x32, 0x32, 0x32], // 2
0x63: [0x33, 0x33, 0x33], // 3
0x64: [0x34, 0x34, 0x34], // 4
0x65: [0x35, 0x35, 0x35], // 5
0x66: [0x36, 0x36, 0x36], // 6
0x67: [0x37, 0x37, 0x37], // 7
0x68: [0x38, 0x38, 0x38], // 8
0x69: [0x39, 0x39, 0x39], // 9
0x6A: [0x2A, 0x2A, 0x2A], // *
0x6B: [0x2B, 0x2B, 0x2B], // +
0x6D: [0x2D, 0x2D, 0x2D], // -
0x6E: [0x2E, 0x2E, 0x2E], // .
0x6F: [0x2F, 0x2F, 0x39], // /
// Stray keys
0xBA: [0x3B, 0x3B, 0x3A], // ; - :
0xBB: [0x3D, 0x3D, 0x2B], // = - +
0xBC: [0x2C, 0x2C, 0x3C], // , - <
0xBD: [0x2D, 0x2D, 0x5F], // - - _
0xBE: [0x2E, 0x2E, 0x3E], // . - >
0xBF: [0x2F, 0x2F, 0x3F], // / - ?
0xC0: [0x60, 0x60, 0x7E], // ` - ~
0xDB: [0x5B, 0x5B, 0x7B], // [
0xDC: [0x5C, 0x5C, 0x7C], // \
0xDD: [0x5D, 0x5D, 0x7D], // ]
0xDE: [0x27, 0x22, 0x22], // ' - "
0xFF: [0xFF, 0xFF, 0xFF] // No comma line
};
var keys =
[[['ESC','1','2','3','4','5','6','7','8','9','0','-','=','DELETE'],
['TAB','Q','W','E','R','T','Y','U','I','O','P','[',']','\\'],
['CTRL','A','S','D','F','G','H','J','K','L',';','\'','RETURN'],
['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'],
['LOCK','`','POW','OPEN_APPLE','&nbsp;','CLOSED_APPLE','&larr;','&rarr;','&darr;','&uarr;']],
[['ESC','!','@','#','$','%','^','&',"*",'(',')','_','+','DELETE'],
['TAB','Q','W','E','R','T','Y','U','I','O','P','{','}','|'],
['CTRL','A','S','D','F','G','H','J','K','L',':','"','RETURN'],
['SHIFT','Z','X','C','V','B','N','M','<','>','?','SHIFT'],
['CAPS','~','POW','OPEN_APPLE','&nbsp;','CLOSED_APPLE','&larr;','&rarr;','&darr;','&uarr;']]];
var shifted = false;
var controlled = false;
var capslocked = true;
var optioned = false;
var commanded = false;
return {
mapKeyEvent: function keyboard_mapKeyEvent(evt) {
var code = evt.keyCode, key = 0xff;
if (code in keymap) {
key = keymap[code][evt.shiftKey ? 2 : (evt.ctrlKey ? 1 : 0)];
if (capslocked && key >= 0x61 && key <= 0x7A)
key -= 0x20;
} else {
debug("Unhandled key = " + toHex(code));
}
return key;
},
shiftKey: function keyboard_shiftKey(down) {
shifted = down;
if (down) {
io.buttonDown(2);
$("#keyboard .key-SHIFT").addClass("active");
} else {
io.buttonUp(2);
$("#keyboard .key-SHIFT").removeClass("active");
}
},
controlKey: function keyboard_controlKey(down) {
controlled = down;
if (down) {
$("#keyboard .key-CTRL").addClass("active");
} else {
$("#keyboard .key-CTRL").removeClass("active");
}
},
commandKey: function keyboard_commandKey(down) {
commanded = down;
if (down) {
io.buttonDown(0);
$("#keyboard .key-OPEN_APPLE").addClass("active");
} else {
io.buttonUp(0);
$("#keyboard .key-OPEN_APPLE").removeClass("active");
}
},
optionKey: function keyboard_optionKey(down) {
optioned = down;
if (down) {
io.buttonDown(1);
$("#keyboard .key-CLOSED_APPLE").addClass("active");
} else {
io.buttonUp(1);
$("#keyboard .key-CLOSED_APPLE").removeClass("active");
}
},
capslockKey: function keyboard_caplockKey(down) {
capslocked = down;
if (down) {
$("#keyboard .key-LOCK").addClass("active");
} else {
$("#keyboard .key-LOCK").removeClass("active");
}
},
create: function keyboard_create(kb) {
var x, y, row, key, key1, key2, label, label1, label2, self = this;
kb.disableSelection();
function buildLabel(k) {
var span = $("<span>" + k + "</span>");
if (k.length > 1 && k.substr(0,1) != '&')
span.addClass("small");
return span;
}
function _mousedown() {
$(this).addClass("pressed");
}
function _mouseup() {
$(this).removeClass("pressed");
}
function _click() {
var key = $(this).data(shifted ? "key2" : "key1");
switch (key) {
case "BELL":
key = "G";
break;
case "RETURN":
key = "\r";
break;
case "TAB":
key = "\t";
break;
case "DELETE":
key = "\0177";
break;
case "&larr;":
key = "\010";
break;
case "&rarr;":
key = "\025";
break;
case "&darr;":
key = "\012";
break;
case "&uarr;":
key = "\013";
break;
case "&nbsp;":
key = " ";
break;
case "ESC":
key = "\033";
break;
default:
break;
}
if (key.length > 1) {
switch (key) {
case "SHIFT":
self.shiftKey(!shifted);
break;
case "CTRL":
self.controlKey(!controlled);
break;
case "CAPS":
case "LOCK":
self.capslockKey(!capslocked);
break;
case "POW":
if (window.confirm("Power Cycle?"))
window.location.reload();
break;
case "OPEN_APPLE":
self.commandKey(!commanded);
break;
case "CLOSED_APPLE":
self.optionKey(!optioned);
break;
default:
break;
}
} else {
if (controlled && key >= "@" && key <= "_") {
io.keyDown(key.charCodeAt(0) - 0x40);
} else if (!shifted && !capslocked &&
key >= 'A' && key <= 'Z') {
io.keyDown(key.charCodeAt(0) + 0x20);
} else {
io.keyDown(key.charCodeAt(0));
}
}
}
for (y = 0; y < 5; y++) {
row = $("<div class='row row" + y + "e'/>");
kb.append(row);
for (x = 0; x < keys[0][y].length; x++) {
key1 = keys[0][y][x];
key2 = keys[1][y][x];
label = $("<div />");
label1 = buildLabel(key1);
label2 = buildLabel(key2);
key = $("<div class='key'>");
key.addClass("key-" + key1.replace(/[&#;]/g,""));
if (key1.length > 1) {
if (key1 == "LOCK")
key.addClass("vcenter2");
else
key.addClass("vcenter");
}
if (key1 != key2) {
key.addClass("key-" + key2.replace(/[&;]/g,""));
label.append(label2);
label.append("<br/>");
}
if (key1 == "LOCK")
key.addClass("active");
label.append(label1);
key.append(label);
key.data({"key1": key1, "key2": key2});
key.bind("mousedown", _mousedown);
key.bind("mouseup mouseout", _mouseup);
key.click(_click);
row.append(key);
}
}
}
};
}

26
js/ui/printer.js Normal file
View File

@ -0,0 +1,26 @@
/*jshint browser:true */
/*exported Printer */
function Printer() {
var _printer = null;
return {
putChar: function(val) {
if (!_printer || _printer.closed) {
_printer = window.open("", "_blank","toolbar=0,location=0");
_printer.document.title = "Printer";
_printer.document.write("<div style='font: 12px courier'>");
_printer.document.write("<span>");
window.focus();
}
var c = String.fromCharCode(val & 0x7f);
if (c == '\r') {
_printer.document.write("<br /></span>");
} else if (c == ' ') {
_printer.document.write("&nbsp;");
} else {
_printer.document.write(c);
}
}
};
}

109
js/util.js Normal file
View File

@ -0,0 +1,109 @@
/* -*- mode: JavaScript; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*/
/*jshint rhino:true, browser: true, devel: true */
/*exported allocMem, allocMemPages, debug, toHex, toBinary, extend, gup, hup, each */
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
var hex_digits = "0123456789ABCDEF";
var bin_digits = "01";
function allocMem(size) {
var result;
if (window.Uint8Array) {
result = new Uint8Array(size);
} else {
result = new Array(size);
}
return result;
}
function allocMemPages(pages) {
return allocMem(pages * 0x100);
}
function extend(ary1, ary2) {
ary2.forEach(function(val) {
ary1.push(val);
});
return ary1;
}
function debug(msg) {
if (typeof(console) != 'undefined' && 'log' in console) {
console.log(msg);
} else if (typeof(environment) == 'object') { // rhino shell
print(msg);
}
}
function toHex(v, n) {
if (!n) {
n = v < 256 ? 2 : 4;
}
var result = "";
for (var idx = 0; idx < n; idx++) {
result = hex_digits[v & 0x0f] + result;
v >>= 4;
}
return result;
}
function toBinary(v) {
var result = "";
for (var idx = 0; idx < 8; idx++) {
result = bin_digits[v & 0x01] + result;
v >>= 1;
}
return result;
}
// From http://www.netlobo.com/url_query_string_javascript.html
function gup( name )
{
name = name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( !results )
return "";
else
return results[1];
}
function hup() {
var regex = new RegExp("#(.*)");
var results = regex.exec(window.location.hash);
if ( !results )
return "";
else
return results[1];
}
function keys(obj) {
var result = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
result.push(key);
}
}
return result;
}
function each(obj, fn) {
keys(obj).forEach(fn);
}

639
json/disks/dos33master.json Normal file
View File

@ -0,0 +1,639 @@
loadJSON({
"name": "DOS 3.3 Master",
"category": "System",
"type": "dsk",
"writeProtected": true,
"encoding": "base64",
"data":
[
[
"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"
],
[
"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"
],
[
"L7FC0A+tuzXJBPACOGAgNDFMIDGN1jXIsUKN1zUg3C+t5DWN4DWt5TWN4TUgEC+s5jUYYIydMyBEMqydM8iRQo3XNYit8TWRQo3WNSAQLyDWN6nADdU1jdU1YK7qNY69Na7rNY6+Na7sNaztNY6/NYzANejQAcjM6TXQEezoNdAMogCgAO7qNdAD7us1juw1jO01YO7mNdAI7uQ10APu5TVgrMM1rsQ1hEKGQ+7DNdAD7sQ1YKzBNdAIrsI18AfOwjXOwTVgTH8zIPcvrcM1hUKtxDWFQ6kBjZ0zqQCN2DUY7tg1IBEwsFGiAI6cM73GNPAfMCKgAOjo6LFC3cY00A==",
"CsjAHtDzrpwzGGAgMDKQ27DPrJ0z0MGsnTPQ76AA6OjosUKdxjTIwB7Q9a6cMzhgGK2cM2kjquD1YKkArJ0z0JdMdzOt8TXwIc7wNTAXGKIEPvE1ytD6kPDu7jXQA+7vNa3wNWCpAI3xNakAjZ4zIPcvGK3rM23sM/AJze8zkBSp/9AKrZ4z0DepAY2eM43sMxhpEY3rM43xNagKCqiiBBi59jOd8TXwBjipAJn2M4jK0O6QvSD7L63wM43wNdCJTHczrfE10AFgSCD3L6zwNWgYIN0yqQCN8TVM+y+i/H72NOjQ+sjM8DPQ8goKqPAPogS98TUZ9jOZ9jOIytDzYA==",
"rb01jeY1jeo1rb41jeQ1jes1qQCN5TWgEKqt5jVKsAOKkA4YreU1beg1jeU1im3pNWpu5TVu5DVu5jWI0NutvzWN7DVt5jWN5jWtwDWN7TVt5DWN5DWpAG3lNY3lNWCpAdAiqQLQHqkD0BqpBNAWqQXQEqkG0A5M7T/qqQrQBq3FNRiQATgIjcU1qQCFSCB+LiiumzOaYBENAAD1IwEAAAAA//8BCmTUycHC09LBwqDFzdXMz9agy9PJxAQRDwQAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHoAAAAAAAAAABEBAAAjEAABAAAAAAAAAAAAAAAA/w==",
"/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAAAAAAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsbAQD+AQYAdSoAAAAYABcAFgAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGABAREAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"mM0rE6CgDxlRG1EdsKCJ0/CWw6CNoNKg6J+ghaCq09WZoKmg6KCMoKCgoO+z09DFw6Kg6KC5uumwoIqgjAGgswDRoE0ZoKKFxaCgoKCqAAHv2AKguAIAAAC5oKagoPC7qaCQiKCJw6nIsO+goqDloKSgoMigpaD6oHqghbOQyciloBEBAACg1gABxYOg6KCgsK6ioOagoM+g+6DnoKCAoKDFqqCCsaCJoPCgoLqkoKDooImgoMqxhaDMoKCfoMWyisjFhaCR06zGoIXFoKDooKDGoKKqqaCgz6CFzeWgoICg8KCBoKWwoJigpaCguqSAoIegiaCgr7KFoLqgyYXOgQ==",
"08XD1M/S06DV08XEjY0AxM+g2c/VoNfJ08ig1M+g0sXQzMHDxaDJ1KDBztnXwdm/oACHh9XOw8/Q2cHCzMWgxsnMxY0AoKCgoKCgoKC8AL6goKAA18jJw8ig18/VzMSg2c/VoMzJy8W/oADJztbBzMnEoNPMz9QAyc7WwczJxKDE0snWxQDDz9DZoMbJzMXTjQDExczF1MWgxsnMxdONAMPB1MHMz8eNAMzPw8ugxsnMxdONANLF08XUoNPMz9SgpqDE0snWxY0A09DBw8Wgz86gxMnTy40A1c7Mz8PLoMbJzMXTjQDWxdLJxtmgxsnMxdONANHVydSNAKAAAQAAsA==",
"oKqqoKCgoKCgoKCgoKCgoMbJxKDWxdLTyc/OoM2goKCgoKCgoKCgoKCqAKqgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKqqoKDDz9DZ0snHyNSgsbm3uaDB0NDMxaDDz83Q1dTF0qDJzsOuoKCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo3DyM/P08Wgz87FoM/GoNTIxaDGz8zMz9fJzsegz9DUyc/O042NANDSxdPToMHO2aDLxdmg1M+gw8/O1MnO1cWgAMPBzsPFzMzFxI0AoNPFw9TP0tOgxtLFxY0AoA==",
"YDjZGbAAAB3ZHLFkAHIeONkZsWsHHdkcsrcLciSxyAUDX7E8BQEUyAVcsRAEA2DEGcPEJLE8BQNbATn+/12gz9LJx8nOwcyg0NLPx9LBzaDDz9DZ0snHyNSgoLG5t7egwtmgwdDQzMWgw8/N0NXUxdKgAX3//13OxdegzcHUxdLJwcygw8/Q2dLJx8jUoMLS1cPFoNTPx87B2trJzsmgw6/PoMPB0tKgxczFw9TSz87Jw9Ogw8/S0K6gtbixsaDHxcHS2aDCzNbErqDTwc6gxtLBzsPJ08PPrMPBoLm0sbKxoKi0sbWptra4rbSytLMBYAAAAAAAAAAAAAAAAAAAAA==",
"ACSzMAIBFkQC09Rx1NLZErICAANkzM/DZdPUARROAszPw3HMz8MSswMAA1+zJgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"A2EoyM/NxSkBE6QBb7ELAANQshUAA2Eoz88pAROuAW+xDwADULIVAANhKKenKQETuAFvsRAAA1CyFQADYSiurikBBcIBWwEUzAFVzM/DVrMADFezpAxYtAQAAQzWAcFxLj/Mz8NyARDgAcJxLj/Mz8MSsQEAcgEQ6gHDcS4/zM/DErICAHIBEPQBxHEuP8zPwxKzAwByAQj+AVyxGAEBCAgCWczPwwEFEgJbARkcAszPw3GzAw0D09RxLj/Mz8MTswMAcgERJgJgLj/Mz8NyFrEBACVbAQ4wAtTS2XEvP7cHAHIBIjoCYC4/twcAFNPUE7EOABLU0tkSss8IchawAA==",
"xNhxwxPBA8TZccQTwgEoIgHExczUwXExP8TYcgNgMT/E2XIZMT/E2HIlxMXM1MFxMT/E2XIBISwB2HHBA9lxwgPJzsPYcTA/xNhyA8nOw9lxMD/E2XIBFDYBVcxWsQEAV8TFzNTBErEBAAERQAFksRAAZdgDZLERAGXZARFKAWSxEgBlsAAAA02yAAgBEVQBZLESAGWxAQADTbIACAEVXgHYcdgSyc7D2APZcdkSyc7D2QEIaAFZzANbARVyAWS1NgBlsAAAA2S1NwBlsQsAAQh8AW+0BAABEIYBULIZAANhKMjPzcUpARGQAVCyGwADYSjT18XF1CkBEJoBULMeAA==",
"cgEBEWQAVctWsQEAV7HoAwNZywEObgBVy1axAQBXtC0AAQ14AG+xDQADULEMAAEQggBhwUAqyyPLErYGAHIBEYwAVcpWsQEAV7dLAANZygEGlgBZywERoABVy1axAQBXsegDA1nLAQiqAE2yTQsBEbQAVctWsQEAV7X0AQNZywEUvgBvsQ0AA1CxDQADYSjUyMUpAQ/IAFCxDwADYSjFzsQpARHSAFXLVrEBAFex3AUDWcsBFNwAb7ENAANQsQ0AA2EooKCgKQEP5gBQsQ8AA2EooKCgKQER8ABVy1axAQBXtKAPA1nLAQj6AFyzHAIBCAQBX7FuAAEFDgFRAREYAQ==",
"0q7KrqDCydPIz9ABDBQATsFAIrUzAHIBPB4AwUBwKKCgoKCgoKDCz8KgwsnTyM/QoNDSxdPFztTToK6urqDB0NDMxa3WydPJz86hoKCgoKCgoCkBCSgATTa5qAMBJTIAb7EKAANQsQoAA2EoqqqqoMHQ0MzFrdbJ08nPzqCqqqopATQ3AG+yFAADULMDAANhKMPP0NnSycfI1KCxube4oMHQ0MzFoMPPzdDV1MXSrKDJzsOuKQERPABVy1axAQBXssQJA1nLAQlGAE02uagDASZQAE2yqQgDZDaxqT9lsAAAA2Q2sa4/ZbAAAANkNrGwP2WwAAABDVoAXLLMAQNcsg==",
"RgBNsqkIA2Q2sak/ZbAAAANkNrGuP2WwAAADZDaxsD9lsAAAAQ1QAFyyNAgDXLLQBwERWgBVy1axAQBXtfQBA1nLAQ5kAFXLVrEBAFe0KwABDXgAQQUAXaCqqqpBBQBdoKqqqqDB0NDMxa3WydPJQQUAXaCqqqqgwdDQzMWt1snTyc/OoKqqqqCgoKCgHwA8AABdoKqqqqDB0NDMxa3WydPJz86gqqqqoKCgoKCgoMPP0NnSycfI1KCxube4rKDSrsquoMLJ08jP0AFBCgBdoDwAAF2gNwAAXaCqqqqgwdDQzMWt1snTyc/OoKqqqqCgoKCgoKDX0snU1MXOoMLZoA==",
"//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAQQUAXaCqqqqgwdDQzMWt1snTyc9BBQBdoKqqqqDB0NDMxa3WydPJz86gqqqqoKCgoKCgoMPP0NnSycfI1KCxube4rKDSrsquoMLJ08jP0KCgoKCgAQwKAE7BQCK0LwByATgUAMFAcCigoKCgoMLPwqDCydPIz9Cg0NLF08XO1NOgra2toMHQ0MzFrdbJ08nPzqGgoKCgoCkBCR4ATTa5qAMBJSgAb7EKAANQsQoAA2EoqqqqoMHQ0MzFrdbJ08nPzqCqqqopAQg8AFyzuAsBJg==",
"zdzNQM6kzgjPbM/QzzTQmND80GDRxNEo0ozS8NJU07jTHNSA1OTUSNWs1RDWdNbY1jzXoNcE2GjYzNgw2ZTZ+NlFA8oAGRlMAAUACgAUAB4AKAAyADwARgBQAFoAZAB4AIIAlgCgALQAyAD6ACwBNgFeAWgBcgF8AfQBvAKEA+gD8gMQBBoEJAQuBDgEPQRCBNAH2gfkB+4H+AcCCAwIFgggCDQIPghICFIIXAhmCHAImAi4C+oLHAwmDDAMOgwA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAA==",
"AAAAAGcAAAAAAABDAQAAAAAAQgEAAAAAAEABAAAAAABAAAAAAAAAQAAAAAD//wAAwUAAORigoKCgoKCgws/CoMLJ08jP0KDQ0sXTxc7U06Curq6gwdDQzMWt1snTyc/OoaCgoKCgoKAeywA/GMUJzM/DAEcYBAzBAE0YiwDCAFMYAADDAFkYiwDEAF8YvwDE2ABmGAAAxNkAbRi/AMTFzNTBAHcYvwDYAH0YiwDZAIMYNgDJzsPYAIwYAADJzsPZAJUYAQDMAJsYNgDKAKEYTAB8xODERMWoxQzGcMbUxjjHnMcAyGTIyMgsyZDJ9MlYyrzKIMuEy+jLTMywzBTNeA==",
"AAAAAABAOQAAAAAAYDAAAAAAAGAQAAAAAABgAAAAAAAAQAAAAAAAAEAAAAD//wAAAAAAAAAAAAAAQAEAAAAAAGADAAAAAABgAwAAAAAAYAMAAAAAAEABAAAAAABAAQAAAAAAeA8AAAAAAHw/AAAAAAB+fwAAAAAAf38BAAAAQGdnAwAAAGBhRwEAAABAYWcAAAAAAGM3AAAAAABmHwAAAAAAbA8AAAAAAGQHAAAAAABgBwAAAAAAcA8AAAAAAHgPAAAAAAB4HwAAAAAAeD4AAAAAAHg8AAAAAAA4OAAAAAAAODwAAAAAADAeAAAAAABwDwAAAAAAeAMAAAAAAHwAAA==",
"0sXFoNPU0tXD1NXSxa4BBXAIXQEceghdoM/SycfJzsHMoNDSz8fSwc2gycTFwboBEoQIXaCgoNfIz6DLzs/X078BBY4IXQEomAhdoMPP0NnSycfI1KCxube4oMHQ0MzFoMPPzdDV1MXSoMnOw64B0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"oM3V09QBHyAIXaDFydTIxdKgwsWgwaDZxdOgz9Kgzs+soNfFASMqCF2g18nMzKDU0sHWxdLTxaDUyMWg1NLFxaDFydTIxdIBITQIXaDMxcbUoM/SoNLJx8jUrqDJxqDXxaDEz6DOz9QBIT4IXaDH1cXT06DUyMWgwc7JzcHMoMPP0tLFw9TM2awBIkgIXaDXxaDTyc3QzNmgx8XUoNTIxaDOxdegwc7JzcHMASNSCF2gwc7EoMGg0dXF09TJz86g1M+gxMnT1MnOx9XJ08gBIFwIXaDJ1KDG0s/NoM/UyMXSoMHOyc3BzNOsoMHOxAEgZghdoNXQxMHUxaDUyMWg1A=="
],
[
"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"
],
[
"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"
],
[
"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"
],
[
"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",
"n0wI5yA07qXOhchgIBXnpciRzmAgbO6lzoXmpc+F50xE4iDk7kw04SDk7rR4tVBp/rABiIXahNsYZc6VUJhlz5V4oAC1UNHayLV48dqwgEwj6CAV56VOIAjnpU/QBMVOaQApf4VPlaCgEaVPChhpQAomTiZPiNDypc4gCOelz5WgTHriIBXnpM7ESqXP5UuQHoRMpc+FTUyt5SAV56TOxEylz+VNsAiESqXPhUuQ6EzL7v//////////IHHhTL/vIAPuqf+FyKmAjQACYCA25+ggNue1UGCpAIVKhUypCIVLqRCFTUyt5dV40AEYTALhILflTDboILflTFvo4IDQAQ==",
"YAO/HyCx5+jotU+F2rV3hdu0TpjVdrAJsdog7f3ITA/uqf+F1WDoqQCVeJWgtXc49U+VUEwj6P8gFeelz9Aopc5gIDTupMjJMLAhwCiwHUwA+CA07kxk+Eb4YCCz88kYsAqFJUwi/KB3TODjoHvQ+SBU4qXa0Ael29ADTH7nBs4mzybmJuel5sXapefl25AKheel5uXahebmzojQ4WD///////8gFedszgAgNO7FyJC7hSxgIDTuyTCwsaTITBn4IDTuxciQpYUtYCA07skosJuopchMKPiYqqBuIMTjiqggxOOgckxh8SA/8gbOJs8w+rDc0ATFzrDWYCAV57HOlA==",
"qeSupQBHoqG0fw0wramkfw0jramkZ6ysoaPyp/S4pbQATcxnjGiM22ebaJtQjGOMfwFRB4gphIDEGVdxB4gUcQeMB4iusqOzcQiIo7OhcQiIrqWsaIMIaJ0IcQeIYHW0r651jXWLUQeIGbikrrLspLDzoqHup7PkrrLrpaWwUQeIOYHBT38PLwBRBogpwgyCV4xqjEKupai0YK6lqLRPfh41jCdRB4gJi/7kr63yr+SuodzenN2c3t2ew93Pys3LAEearaWtr6xnmq2lramo7qGtYIwgr7S1ofKso/elrmCMIKylpO61smCutbLur6PltqGz5KGvrHp+miIgAGADvw==",
"6P///1AgT8D0oeSvrfKv5K6h8KW0s++07qWotFyAAEBgjWCLfx0gfowzAABgA78SR4OuqWeDsrDlo6GytHmws6RpsLOk5aOhsrSvrnmws6Svrmmws6SvrvCvsPSzqaxgjCC0s6msAECJyUedF2idClh7Z6KhtLZntKEHjAeuqay2Z7ShB4wHrqmsqGeMB7SvrLBnnbKvrK+jZ4wHpauvsPSuqbKwfw4ntK6psrB/Dii0rqmysGQHpqlnr7Svp3i0paxrfwKtpbJnorWzr6fusrW0pbJ+jDm0uKWuZ7CltLMnr7QHnRmyr6Z/BTe0tbCuqX8FKLS1sK6pfwUqtLWwrg=="
],
[
"TyBBTkQgUFJFU1MgUkVUVVJOKSI7AEEhICuiVlRCyDI6jMk4Njg6olZUQsgxOrkzNixUQjqMyTg2ODqEIiI7SCQAWSEqK63oKEgkLDEp0c8iWSLEMTEwNjAAdSEvK0gk0CIiOlDQMTU6T1HQNTAwOqsyNDkwAI0hNCut6ChIJCwxKdHPIk4ixDExMDQwAOAhPiuiKFZUQik6jMk4Njg6oihWVELIMSk6uiJXT1VMRCBTT01FT05FIEVMU0UgTElLRSBUTyBQTEFZPyAiOzpWVELQ4igzNyk6VELQ4igzNikACSJIK6IyMzqMyTg2ODqiVlRCyDE6uTM2LFRCOozJOA==",
"NjI4NinPMTI3xDg1NjAAHyCOIa1Q0c8xNjDEODU2MABeIJghjMk5MzY6iTqxOrIgUEFERExFUyBBUkUgSU4gQU5EIFNQQUNFIEJBUiBIQVMgQkVFTiBQUkVTU0VELgB/IPgqsiAiRVNDIiBLRVkgSEFTIEJFRU4gUFJFU1NFRACgIAIruckxNjM2OCwwOozJOTM2Oq3iKDM0KdAwxKIxMADCIAcruiJXT1VMRCBZT1UgTElLRSBUTyBDT05USU5VRSIA5yAMK7oiUExBWUlORz8gIjs6VlRC0OIoMzcpOlRC0OIoMzYpABUhFiu6Oro6uiIoVFlQRSBZRVMgT1IgTg==",
"QURETEUgU0VULiAgUExFQVNFIFBMVUcgSU4gVEhFIFBBRERMRSIATx9SIboiU0VUIEFORCBUSEVOIFBSRVNTIFRIRSBTUEFDRSBCQVIuIgB8H1whujq6IklGIFlPVSBETyBOT1QgSEFWRSBQQURETEVTLCBZT1UgTUFZIgCqH2YhuiJFWElUIFRIRSBHQU1FIEJZIFBSRVNTSU5HIFRIRSBFU0MgS0VZLiIAxh9wIVDQ4ijJMTYzODQpOq1Q0TE1NcQ4NTYwAOgfeiG5yTE2MzY4LDA6rVDRzzE1NcQ4NTgwOqsxMTAwMAAOIIQhreIoyTE2Mjg3Kc8xMjfN4ijJMQ==",
"Yhu5NzY4LDE3Mzq5NzY5LDQ4Ork3NzAsMTkyOrk3NzEsMTM2Ork3NzIsMjA4Ork3NzMsNDq5Nzc0LDE5ODq5Nzc1LDc6uTc3NiwyNDA6uTc3Nyw4OgCiHmwbuTc3OCwyMDI6uTc3OSwyMDg6uTc4MCwyNDY6uTc4MSwxNjY6uTc4Miw2Ork3ODMsNzY6uTc4NCwwOrk3ODUsMzq5Nzg2LDk2AKgedhuxAMUeNCGyIFBBRERMRVMgTk9UIFBMVUdHRUQgSU4A+B4+IaIxMDq6IkJSSUNLIE9VVCBSRVFVSVJFUyBUSEUgVVNFIE9GIFRIRSBBUFBMRSIAJh9IIboiUA==",
"OqIyMzq6ACodwguBSdAxwTI1yDEyNcrbKDEpOrAyMDqCSTpN0DE6TtAwADIdzAurODAAiB3AEqIyMzqWMTqMyTg2ODq5NTAsNjM6uiIgIFBVU0ggUEFERExFIEJVVFRPTiBUTyBCRUdJTiBUSEUgR0FNRSAgIjs6uTUwLDI1NTpPUdA1MDA6sQDFHcoSojIzOpYxOozJODY4OroiIDw8PCBQTEVBU0UgVVNFIFRIRSBPVEhFUiBQQURETEUuID4+PiAgIjsA2h3UErk2LDQwOrk3LDMwOow3NjgA6R3eEkVSQVNF0DIwOrEA/R1YG7IgU09VTkQgUk9VVElORQBVHg==",
"MTYzODQp0c8xNTXEMjkwMAAeHF4LojIzOozJODY4ADccaAugQTqNWCxZyzM6WdAxMjDK2ygxKQBAHHILWNAxOQBjHHwLVtDJMTpX0DXK2ygxKckyOkzQTMkxOq1M0THEODAwAHwcgwut4yhBJCnErUzPMcS6QSQiLCAiOwCnHIYLrUzPMcS6IlRISVMgSVMgQkFMTCAiOzbJTDsiIE9VVCBPRiA1LiIAwByaC63iKMkxNjM4NCnQMTU1xDExMDAwAM8cpAutTNHPMcQzMDEwAPQcrgu5NTAsNjM6uiJUSElTIElTIFRIRSBMQVNUIEJBTEwiOwAGHbgLuTUwLDI1NQ==",
"QkVHSU4gVEhFIEdBTUUgICI7Ork1MCwyNTUAYBtKC4FL0DHBMjA6gks6siBBTExPVyBUSU1FIEZPUiBVU0VSIFRPIFJFTEVBU0UgQlVUVE9OIEZST00gTEFTVCBQVVNIAGgbVAuwMjAAoRtYC1Ax0NgoMSk6rSjUKE9PTERQMclQMSnPM87iKMkxNjI4NinPMTI3Kc3GRVJBU0XEsDQ4MTAAvRtZC09PTERQMdBQMTqyV1JPTkcgUEFERExFANYbWgutRVJBU0XERVJBU0XQRVJBU0XJMQDpG1sLrUVSQVNF0DHEsDQ4MDAAEBxdC63iKMkxNjI4NynRMTI4zeIoyQ==",
"UNDiKMkxNjM4NCk6reIoyTE2Mjg3Kc8xMjfEMjQ4MAA3GqYJrVDRzzE2MM1Q0c8xNTXEMjQ2MABSGrAJuckxNjM2OCwwOq1Q0DE1NcQxMTAwMABhGrUJlzqiMjQ6ljE6sQBrGroJjMk5MzYAlBrECYg6QdAyOkLQMTI6Q9A5OkTQMTM6RdAyOkbQMTU6skNPTE9SUwCiGs4JTEzQNTpQ0DE1AKsa2AmwMzU1ALsaFApPT0xEUDHQ2CgxKQDFGiwLsDEzMDAA1ho2C1PQMDpZ0DE5OkzQNgAaG0ALojIzOrk1MCw2Mzq6IiAgUFVTSCBQQURETEUgQlVUVE9OIFRPIA==",
"IEsgICBPIFUgVCAgICAgICI7Op06uiI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgBwGS4JojEyOroiICAgQ09QWVJJR0hUIDE5NzkgQVBQTEUgQ09NUFVURVIgSU5DIgB4GWoJojIwAKoZdAm6OroiKFBSRVNTSU5HIFRIRSBFU0MgS0VZIFdJTEwgRU5EIFRIRSBHQU1FKSIA+xmSCaIyMzq6IlBSRVNTIFRIRSBTUEFDRSBCQVIgVE8gQkVHSU4uLi4uIjs6ueIoNDApyOIoNDEpyjI1NsjiKDM2KSw5Njq5yTE2MzY4LDAAHxqcCQ==",
"N8QyMzM1AB0Y6AitUNExNTbNUNHPMTQxxDIyNjAAKBjyCIQiIjtBJAA6GPwIreMoQSQp0DDEMjMzNQBgGAYJgUnQMcHjKEEkKTqt5ijqKEEkLEksSSkp0c82NMQyMzMwAG0YEAmCSTpJ0EnJMQCfGBoJQSTQ6ihBJCxJLOMoQSQpKTqt4yhBJCnEreMoQSQpzzEyxEEk0OgoQSQsMTIpAKkYHwmrMjQ5MABAGSQJjMk5MzY6ojU6uiI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ijs6njq6IiAgIEwgSSBUIFQgTCBFICAgQiBSIEkgQw==",
"VEggVEhFIFBBRERMRSBIRUxEIE9GRi1DRU5URVIuIgAnF6IIujq6ADUXrAi5yTE2MzY4LDAAqhfACLoiKiBCRUZPUkUgV0UgQkVHSU4sIFBMRUFTRSBUWVBFIjq6IiogWU9VUiBGSVJTVCBOQU1FIEFORCBUSEVOIFBSRVNTIjq6IiogVEhFIEtFWSBNQVJLRUQgIjvnKDM0KTsiUkVUVVJOIjvnKDM0KTsA0RfKCLniKDQwKcjiKDQxKcoyNTbI4igzNiksOTY6siBDVVJTT1IA7hfUCFDQ4ijJMTYzODQpOq1Q0DE1NcQxMTAwMAAGGN4IreIoyTE2Mjg3Kc8xMg==",
"YvpA+oYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"bCD6/KkWIMn8hS4g+vygJCD9/LD5IP38oDsg7PyBPEUuhS4guvygNZDwIOz8xS7wDanFIO39qdIg7f0g7f2ph0zt/aVISKVFpkakRyhghUWGRoRHCGiFSLqGSdhgIIT+IC/7IJP+IIn+2CA6/6mqhTMgZ/0gx/8gp/+ENKAXiDDo2cz/0Pggvv+kNExz/6IDCgoKCgomPiY/yhD4pTHQBrU/lT2VQejw89AGogCGPoY/uQACyEmwyQqQ02mIyfqwzWCp/ki54/9IpTGgAIQxYLyyvrLvxLKpu6akBpUHAgXwAOuTp8aZssm+wTWMxJavFxcrH4N/Xcy1/BcX9QP7Aw==",
"aKQ1YMY08J/K0BbJutC7hTGlPpFA5kDQAuZBYKQ0uf8BhTFgogG1PpVClUTKEPdgsTyRQiC0/JD3YLE80ULwHCCS/bE8INr9qaAg7f2pqCDt/bFCINr9qakg7f0gtPyQ2WAgdf6pFEgg0PggU/mFOoQ7aDjpAdDvYIrwB7U8lTrKEPlgoD/QAqD/hDJgqQCFPqI4oBvQCKkAhT6iNqDwpT4pD/AGCcCgAPACqf2UAJUBYOrqTADgTAPgIHX+ID//bDoATNf6YOpg6urq6upM+AOpQCDJ/KAnogBBPEihPCDt/iC6/KAdaJDuoCIg7f7wTaIQCiDW/ND6YCAA/mho0A==",
"/IitYMBFLxD4RS+FL8CAYKQksShIKT8JQJEoaGw4AOZO0ALmTywAwBD1kSitAMAsEMBgIAz9IKX7IAz9yZvw82ClMkip/4UyvQACIO39aIUyvQACyYjwHcmY8Arg+JADIDr/6NATqdwg7f0gjv2lMyDt/aIBivDzyiA1/cmV0AKxKMngkAIp350AAsmN0LIgnPypjdBbpD2mPCCO/SBA+aAAqa1M7f2lPAkHhT6lPYU/pTwpB9ADIJL9qaAg7f2xPCDa/SC6/JDoYEqQ6kpKpT6QAkn/ZTxIqb0g7f1oSEpKSkog5f1oKQ8JsMm6kAJpBmw2AMmgkAIlMoQ1SCB4+w==",
"YMmgsO+oEOzJjfBayYrwWsmI0MnGJBDopSGFJMYkpSLFJbALxiWlJSDB+2UghShgScDwKGn9kMDw2mn9kCzw3mn9kFzQ6aQkpSVIICT8IJ78oABoaQDFI5DwsMqlIoUloACEJPDkqQCFJOYlpSXFI5C2xiWlIkggJPylKIUqpSmFK6QhiGhpAcUjsA1IICT8sSiRKogQ+TDhoAAgnvywhqQkqaCRKMjEIZD5YDhI6QHQ/GjpAdD2YOZC0ALmQ6U8xT6lPeU/5jzQAuY9YKBLINv80Plp/rD1oCEg2/zIyIjQ/ZAFoDKI0P2sIMCgLMpgoghIIPr8aCqgOsrQ9WAg/Q=="
],
[
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AThokAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAHwaJQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCqGiYBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A2BonAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAAYbKAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uADoZHgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBoGR8Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AlhkgAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAMQZIQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDyGSIBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AIBojAYNcLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AVBgZAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAIIYGgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCwGBsBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A3hgcAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAAwZHQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uAEAXEwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBuFxQBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AnBcVAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAMoXFgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgD4FxcBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AJhgYAYNcLg==",
"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"
],
[
"Fg0Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AWhYOAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAIgWDwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgC2FhABg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A5BYRAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uABIXEgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAEYVCAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgB0FQkBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AohUKAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANAVCwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgD+FQwBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ALA==",
"Li4uLgAyFAIBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AYBQDAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAI4UBAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgC8FAUBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A6hQGAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uABgVBwGDXC4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAEwT/QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgB6E/4Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AqBP/AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANYTAAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAEFAEBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLgA4EvcAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AZhL4AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAJQS+QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDCEvoAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A8BL7AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAB4T/ACDXC4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAFIR8gCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCAEfMAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ArhH0AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANwR9QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAKEvYAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLgA+EOwAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AbBDtAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAJoQ7gCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDIEO8Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A9hDwAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uACQR8QCDXC4uLg==",
"AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAFgP5wCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCGD+gAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AtA/pAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAOIP6gCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAQEOsAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgBEDuEAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4Acg7iAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKAO4wCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDODuQAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A/A7lAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uACoP5g==",
"Li4AMA3bAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAF4N3ACDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCMDd0Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4Aug3eAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAOgN3wCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAWDuAAg1wuLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBKDNYAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AeAzXAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKYM2ACDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDUDNkAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AAg3aAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4ANgvQAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAGQL0QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCSC9IAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AwAvTAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAO4L1ACDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAcDNUAg1wuLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBQCssAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AfgrMAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKwKzQCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDaCs4Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ACAvPAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"U1MgICAqACMJbQCyKiAgICAgVEhBTiA0MDAhISAgICAgICoAQAluALIqICAgICAgICAgICAgICAgICAgICAgKgBdCW8AsiogICAgUFJPR1JBTSBXSUxMICAgICAqAHoJcACyKiAgIFNFTEYtREVTVFJVQ1QhICAgICoAlwlxALIqICAgICAgICAgICAgICAgICAgICAgKgC0CXIAsioqKioqKioqKioqKioqKioqKioqKioqALwJcwCyCgoAxgnIAIMxMDAxAPQJyQCDQVBQTEUgQ09NUFVURVIgSU5DLi4uLi4uLi4uLjQwOCA5OTYgMTAxMAAiCsoAg1wuLi4uLg==",
"0jEeCGQAsioqKioqKioqKioqKioqKioqKioqKioqADsIZQCyKiAgICAgICAgICAgICAgICAgICAgICoAWAhmALIqICAgIFcgQSBSIE4gSSBOIEcgICAgKgB1CGcAsiogICAgLSAtIC0gLSAtIC0gLSAgICAqAJIIaACyKiAgICAgICAgICAgICAgICAgICAgICoArwhpALIqICAgIERPIE5PVCBNT0RJRlkgICAgKgDMCGoAsiogIEFOWSBMSU5FIElOIFRISVMgICAqAOkIawCyKiAgIFBST0dSQU0gV0lUSCBBICAgICoABglsALIqICBMSU5FIE5VTUJFUiBMRQ==",
"AAAAAAAAAAAAAAAACg4KDQoMCgsKCgoJCggKBwoGCgUKBAoDCgIKAQoACQMJAgkBCQAMBgwFDAQMAwwCDAEMAA0MDQsNCg0JDQgNBw0GDQUNBA0DDQINAQ0AEg8SDhINEgwSCxIKEgkSCBIHEgYSBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"oNbF0tPJz86gxKCgoKCgoKCgoKCgqgCqoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCqqqCgw8/Q2dLJx8jUoLG5t7mgwdDQzMWgw8/N0NXUxdKgyc7DrqCgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqNw8jPz9PFoM/OxaDPxqDUyMWgxs/MzM/Xyc7HoM/Q1MnPztONjQDQ0sXT06DBztmgy8XZoNTPoMPPztTJztXFoADDwc7DxczMxcSNAKDTxcPUz9LToMbSxcWNAKDTxcPUz9LToNXTxcSNjQDEz6DZzw==",
"1MXEh40AxMnTy6DG1czMjQDEydPLoNfSydTFoNDSz9TFw9TFxI0AxsnMxaDMz8PLxcSNAMmvz6DF0tLP0o0Ayc7WwczJxKDGyczFzsHNxQCHh8nO09XGxsnDycXO1KDNxc3P0tmg1M+g0tXOoNDSz8fSwc2NAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoKDB0NDMxaDd26DEz9Ogs66yoNTPoLOus6DDz87WxdLUxdKgoKCqqqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgqqqgoKCgoKCgoKCgoM3VxsbJzg==",
"w8/Q2aDP0o280sXU1dLOvqDUz6DSxdDMwcPFoMXYydPUyc7HoMbJzMWgz9KNvMPU0sytw7680sXU1dLOvqDUz6DDwc7Dxcygw8/Q2Y26AADF0tLP0q6goKDDz8TFvQCN18/VzMSg2c/VoMzJy8Wg1M+gzcHLxaDBzs/UyMXSoMPP0Nm/oACNyc7TxdLUoNPP1dLDxaDEydPLoMHOxKDQ0sXT06DBoMvF2QCNyc7TxdLUoMTF09TJzsHUyc/OoMTJ08ugwc7EoNDSxdPToMGgy8XZoADEz6DZz9Wg18HO1KDQ0s/N0NTJzse/oADEz87FjQDOz6DGyczF06DTxczFww==",
"FPEUBRUQFSYVMxU+FU8VdRUWFrUW3xPQFtsW6hb6Fh0XMBc6Fz8XVhdjF3EXcRdxF3EXcReAF9PP1dLDxaDTzM/UvwCgoKCgoKDE0snWxb8AxMXT1MnOwdTJz86g08zP1L8AoKCgoKCgoKCgoKDE0snWxb8AxsnMxc7BzcW/AMnO08XS1KDEydPL066goNDSxdPToLzF08O+oNTPoNLF1NXSzqDUz6CgzcHJzqDNxc7VoM/SoMHO2aDP1MjF0qDLxdmg1M+gwsXHyc6NAI3BzNLFwcTZoMXYydPU066gjQDU2dDFoMnOoMGgzsXXoMbJzMWgzsHNxaDGz9Kg1MjFoA==",
"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"
],
[
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBQIUsBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AfiFMAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKwhTQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDaIU4Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ACCJPAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4APCBFAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAGogRgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCYIEcBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AxiBIAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAPQgSQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAiIUoBg1wuLi4uLg==",
"XC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBWH0ABg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AhB9BAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uALIfQgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDgH0MBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ADiBEAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4AQh46AYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAHAeOwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCeHjwBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AzB49AYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAPoePgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAoHz8Bgw==",
"AC4dNAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBcHTUBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4Aih02AYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uALgdNwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDmHTgBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AFB45AYNcLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ASBwvAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAHYcMAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCkHDEBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A0hwyAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAAAdMwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uADQbKQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBiGyoBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AkBsrAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAL4bLAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDsGy0Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AGhwuAYNcLi4uLi4uLi4uLi4uLg==",
"////ogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"S0VUVEUgSVMgV1JJVEUgUFJPVEVDVEVELiAgUkVNT1ZFDVdSSVRFIFBST1RFQ1QgVEFCLo3///////////////v////////////////////7//8BYAEAAABgDgASAAAAAABgAQAB79gBYAEAAABgDgASAAAAAABgAVdSSVRURU4gQlkgSkFNRVMgUi4gSFVTVE9OIERFQ0VNQkVSIDE1LCAxOTc4IChUSElTIE1FU1NBR0UgSVMgRklMTEVSLCBXSFkgUkVBRCBJVD8p7////////////////////+/////////////////////v////////////////////7////w==",
"RElTS0VUVEUgQU5EIFBSRVNTDVtSRVRVUk5dIFRPIFJFQk9PVCBET1OgDQcHByAgVU5BQkxFIFRPIFJFQUQgSU1BR0UuDY0NBwcHICBJTUFHRSBPRiBET1MgMy4zICAgKE1BU1RFUikgSVMgTk9UDQ1BVkFJTEFCTEUuICBDSEVDSyBJTlNUUlVDVElPTlMuDY0NBwcHICBVTkFCTEUgVE8gV1JJVEUuICBESVNLRVRURSBNVVNUIEJFDUlOSVRJQUxJWkVEIFBST1BFUkxZLiAgQ0hFQ0sgRElTS0VUVEUNRk9SIFBST1BFUiBJTlNFUlRJT04ujQ0HBwcgIERJUw==",
"IEhBUyBCRUVOIFVQREFURUQsIFlPVSBNQVlSRU1PVkUgSVQgQVQgVEhJUyBUSU1FLg0NICBJRiBZT1UgV0lTSCBUTyAiTUFTVEVSIiBBTk9USEVSIERJU0stDUVUVEUsIFBSRVNTIFtSRVRVUk5dLg0NICBPVEhFUldJU0UgUFJFU1MgW0VTQ10gVE8gRVhJVCAiTUFTVEVSIo0NDSAgSUYgWU9VIFdJU0ggVE8gUkVUUlkgUFJFU1MgW1JFVFVSTl0NDSAgT1RIRVJXSVNFIFBSRVNTIFtFU0NdIFRPIEVYSVQgIk1BU1RFUiKNDSAgSU5TRVJUIEEgU1lTVEVNIA==",
"UiBQTEFDRSBJVCBJTg1USEUgRElTSyBESVJFQ1RPUlkNDSAgVEhJUyBJUyBUSEUgRklMRSBOQU1FIFRIQVQgV0lMTCBCRQ1QTEFDRUQgV0lUSElOIFRIRSBJTUFHRToNDSAgIKANICBQTEFDRSBUSEUgRElTS0VUVEUgVE8gQkUgTUFTVEVSRUQgIElODVRIRSBESVNLIERSSVZFLg0NICBQUkVTUyBbUkVUVVJOXSBXSEVOIFJFQURZDQ1OT1RFOiBJRiBZT1UgV0FOVCBBIERJRkZFUkVOVCBGSUxFIE5BTUUsUFJFU1MgW0VTQ10ujQ0gIFRIRSBESVNLRVRURQ==",
"RE9TIDMuMyAgIE1BU1RFUiAtIENSRUFURSBVVElMSVRZDQ0gIENPUFlSSUdIVCAxOTgwIEJZIEFQUExFIENPTVBVVEVSIElOQw0gICAgICAgICAgQUxMIFJJR0hUUyBSRVNFUlZFRC4NDQ0NICAgICAgICAoTk9XIExPQURJTkcgRE9TIElNQUdFKY0NUExFQVNFIElOUFVUIFRIRSAiR1JFRVRJTkciIFBST0dSQU0nUw1GSUxFIE5BTUU6oA0NUkVNRU1CRVIgVEhBVCAiTUFTVEVSIiBET0VTIE5PVCBDUkVBVEUNVEhFICJHUkVFVElORyIgUFJPR1JBTSwgTw==",
"5vDQ7+bx0OtgSCBY/GiFJWCpoKIAIO394B7wBr0xDujQ86mNTO39qfCFNqkbhTip/YU3hTmN9AOph4UzYCAM/cmN8AbJm/AD0PMYYIrwLIbwoAC5AALIyaDw+MnBkByiAJ0xDujgHvAeuQACyY3wDcms8AnE8PAFyNDmOGCpoJ0xDujgHtD4GGCpAtACqQEgswmpDqBkINkDsBusaQ7IwBDQBaAA7mgOjGkO7m0OrW0OyTfQ3RhgSMkB0Bog4wOF8YTwoAGx8I1QDo1eDsix8I1RDo1fDqARuU8OmWQOiBD3aI1wDmD4CYgKugphC+0LlwzpDCYNQw2ODfMNDSAgIA==",
"AAj/BqkMIAUJICMJqQAg4wggiQmQG6kIIAUJrQAcyUzwD0xGCOrq6uqpByDjCEy1CK0GHk0NHklu0A+tvjRJBNAIjWYrjesT8AipCCDjCEy1CKkKIAUJqQEg4wggav0gSAmw7qAduTEOmXUriBD3qQIgBQmpAiDjCCANCakDIOMIIDkJsMwghQmQSqkKIAUJrXEOCrADCpAEqQnQAqkKIOMIqQUg4wggOQmwCKkKIAUJTGsIqQogBQmpBiDjCCA5CbD7rWUOSkpKSgnAhfGpAIXwbPAAqQYgBQmpBCDjCCA5CbDVTE4ICqq94gmF8L3jCYXxoACx8EgJgCDt/WgwCA==",
"AAAAAAAAAAAAAAAADA4MDQwMDAsMCgwJDAgMBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"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"
],
[
"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"
],
[
"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"
],
[
"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",
"q62qr95BTsRP0r69vFNHzklO1EFC01VT0kZSxVNDUk6oUETMUE/TU1HSUk7ETE/HRVjQQ0/TU0nOVEHOQVTOUEVFy0xFzlNUUqRWQcxBU8NDSFKkTEVGVKRSSUdIVKRNSUSkAE5FWFQgV0lUSE9VVCBGT9JTWU5UQdhSRVRVUk4gV0lUSE9VVCBHT1NVwk9VVCBPRiBEQVTBSUxMRUdBTCBRVUFOVElU2U9WRVJGTE/XT1VUIE9GIE1FTU9S2VVOREVGJ0QgU1RBVEVNRU7UQkFEIFNVQlNDUklQ1FJFRElNJ0QgQVJSQdlESVZJU0lPTiBCWSBaRVLPSUxMRUdBTA==",
"zFBMT9RITEnOVkxJzkhHUrJIR9JIQ09MT1K9SFBMT9REUkHXWERSQddIVEHCSE9NxVJPVL1TQ0FMRb1TSExPQcRUUkFDxU5PVFJBQ8VOT1JNQcxJTlZFUlPFRkxBU8hDT0xPUr1QT9BWVEHCSElNRU26TE9NRU26T05FUtJSRVNVTcVSRUNBTMxTVE9SxVNQRUVEvUxF1EdPVM9SVc5JxlJFU1RPUsWmR09TVcJSRVRVUs5SRc1TVE/QT85XQUnUTE9BxFNBVsVERcZQT0vFUFJJTtRDT07UTElT1ENMRUHSR0XUTkXXVEFCqFTPRs5TUEOoVEhFzkHUTk/UU1RF0A==",
"ANAAMG/YZdf43JTZsdsw89jf4duP85jz5PHd8dTxJPIx8kDy1/Ph8+j2/fZo92735vdX/CD3Jvd092zybvJy8nbyf/JO8mrZVfKF8qXyyvIX87vznvNh8kXaPdkR2cjZSNj0AyDZatnb2W3Y69mD58jYr9gS43rn1NqV2KTWadaf20jWkOsj7K/rCgDe4hLUzd//4o3uru9B6Qnv6u/x7zrwnvBk59bmxeMH5+XmRuZa5obmkeZ5wOd5qed7gel7aOp9lu5QVN9GTt9/z+5/l95kZN9FTsRGT9JORVjUREFUwUlOUFXUREXMREnNUkVBxEfSVEVY1FBSo0lOo0NBTA==",
"AAAAAAAAAAAAAAAAEA4QDRAMEAsQChAJEAgQBxAGEAUQBBADEAIQARAABA4EDQQMBAsECgQJBAgEBwQGBAUEBAQDBAIEAQQABQ8FDgUNBQwFCwUKBQkFCAUHBQYFBQUEBQMFAgUBBQAGDwYOBg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"BBEPAwEA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAegAAAAAAAAAADf8AACMQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAA//8AAAAAAAAAfwAAAf8AAAAAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABELAAAAAAAAAAALD4TN1cbGyc6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAbABwGgtDIz87FoMzJ09SgoKCgoKCgoKCgoKCgoKCgoKCgoDMAEgSC0sHOxM/NoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgCgATBILSxc7VzcLF0qCgoKCgoKCgoKCgoKCgoKCgoKCgoKANABUEgtLFztXNwsXSoMnO09TS1cPUyc/O06CgoKCgoKCgoCcAGwSC0sXU0snF1sWg1MXY1KCgoKCgoKCgoKCgoKCgoKCgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ABEMAAAAAAAAAAAhD4LF2MXDoMTFzc+goKCgoKCgoKCgoKCgoKCgoKCgoKAKACIPhMbJxKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoBQAEA+ExtDCwdPJw6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgMgAPD4TJztTCwdPJw6CgoKCgoKCgoKCgoKCgoKCgoKCgoKAyAA4PgszJ1NTMxaDC0snDy6DP1dSgoKCgoKCgoKCgoKCgoBwADQ+CzcHLxaDUxdjUoKCgoKCgoKCgoKCgoKCgoKCgoKCgAwAMD4TNwdPUxdKgw9LFwdTFoKCgoKCgoKCgoKCgoKCgoKAJAA==",
"ABENAAAAAAAAAAAaD4LC0snBzqfToNTIxc3FoKCgoKCgoKCgoKCgoKCgoKAGABsPhMPIwcnOoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAMAHA+Bw8/Mz9KgxMXNz6CgoKCgoKCgoKCgoKCgoKCgoKCgCQAdD4LDz8zP0qDExc3P08/G1KCgoKCgoKCgoKCgoKCgoKAJAB4PgcPP0NmgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAkAHw+Ew8/Q2a7PwsqwoKCgoKCgoKCgoKCgoKCgoKCgoKCgAwAgD4LDz9DZwaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAJAA==",
"ABEOAAAAAAAAAAATD4LIxczMz6CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAGABQPgcHOyc3BzNOgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoBIAFQ+AwdDQzMWg0NLPzdOgoKCgoKCgoKCgoKCgoKCgoKCgAwAWD4HB0NDMxdPPxtSgoKCgoKCgoKCgoKCgoKCgoKCgoKAGABcPgcHQ0MzF1snTyc/OoKCgoKCgoKCgoKCgoKCgoKCgoBoAGA+BwsnP0sjZ1MjNoKCgoKCgoKCgoKCgoKCgoKCgoKCgEQAZD4TCz8/UsbOgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAKAA=="
],
[
"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"
],
[
"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",
"T1QgRVhFQ1VURSBPTiI6uiJBIFdSSVRFLVBST1RFQ1RFRCBESVNLRVRURSBTVUNIIEFTIgCzDfwDuiJZT1VSIERPUyBTWVNURU0gTUFTVEVSIChWRVJTSU9OIDMuMykuICAgRk9SIFlPVVIgQ09OVkVOSUVOQ0UsIFBST1ZJU0lPTlMgSEFWRSAgIEJFRU4gTUFERSBUTyBDT1BZIFRISVMgUFJPR1JBTSBBTkQgSVQnUyIA1g0GBLoiREFUQSBUTyBBTk9USEVSIERJU0tFVFRFLiI6ugASDhAEhCJETyBZT1UgV0lTSCBUTyBETyBUSElTIE5PVz8gKFkgT1IgTg==",
"IgATDKQBuiJMSVNUIiwiICAxIgAnDK4BuiJDSEFOR0UiLCIgIDIiADkMuAG6IkVYSVQiLCIgIDMiAGQMwgG6OoQiQ0hPT1NFIE5VTUJFUiAoMSAtIDMpICI7USQ6UdDlKFEkKQBzDMwBrVHPMM1R0TTEsQCJDNYBoigxNSk6uucoNyk7Oqs0NTAAlgzgAbpDTCQ7RkwkAJ4M6gGXOoAAwgz0AbJERU1PTlNUUkFUSU9OIE9GIFJBTkRPTSBBQ0NFU1MA3AzoA4ZBJCg5KSxCKDkpLEMoOSksRCg5KQA0DfIDlzq6OroiVEhJUyBERU1PTlNUUkFUSU9OIFdJTEwgTg==",
"RAAHDA4BsgAXDBgBreIoNzY4KdAwxIAAagwiAbo6uiIuLi5MQU5HVUFHRSBDQVJEIENBTk5PVCBCRSBSRUxPQURFRCI6uiIgICBVTlRJTCBUSEUgU1lTVEVNIElTIFJFQk9PVEVELi4uIgBwDCwBgAAAAEgAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"NjoACwubAIw3NjkAHgugAK3iKDc2OCnRzzHEMjUwACULqgCyIABJC7QAsi0tSUYgVEhFUkUsIExPQUQgSU5URyBBTkQgUEEjMQBQC74AsiAAgAvIAKIxMDq6IihMT0FESU5HIElOVEVHRVIgSU5UTyBMQU5HVUFHRSBDQVJEKSIAngvSALoiBEJMT0FEIElOVEJBU0lDLEEkRDAwMCIAvQvcALIgLS1XUklURSBQUk9URUNUIFRIRSBDQVJEANYL5gBB0OIoyTE2MjU0KTqyICAkQzA4MgDcC/AAgADiC/oAsgABDAQBsi0tTk8gQ0FSRCBPUiBDQU4nVCBSRUxPQQ==",
"uTgwNCwwOrk4MDUsMjA4Ork4MDYsMjA4Ork4MDcsMTA6uTgwOCwxNzM6uTgwOSwxMjk6uTgxMCwxOTI6uTgxMSwxNzM6uTgxMiwxMjk6AJwKcwC5ODEzLDE5Mjq5ODE0LDE2OTq5ODE1LDE6uTgxNiwyMDg6uTgxNywyOrk4MTgsMTY5Ork4MTksMDq5ODIwLDE0MTq5ODIxLDA6AOwKeAC5ODIyLDM6uTgyMywxMDQ6uTgyNCwyMDU6uTgyNSwwOrk4MjYsMjI0Ork4MjcsMjQwOrk4MjgsMzq5ODI5LDE3Mzq5ODMwLDEyODoAAgt9ALk4MzEsMTkyOrk4MzIsOQ==",
"LDEwNDoAVwlfALk3NzcsNzI6uTc3OCwyMDU6uTc3OSwwOrk3ODAsMjI0Ork3ODEsMjA4Ork3ODIsMzU6uTc4MywxNzM6uTc4NCwxMzE6uTc4NSwxOTI6AKsJZAC5Nzg2LDE3Mzq5Nzg3LDEzMTq5Nzg4LDE5Mjq5Nzg5LDE2OTq5NzkwLDE2NTq5NzkxLDE0MTq5NzkyLDA6uTc5MywyMDg6uTc5NCwyMDU6APsJaQC5Nzk1LDA6uTc5NiwyMDg6uTc5NywyMDg6uTc5OCwxOTq5Nzk5LDc0Ork4MDAsMTQxOrk4MDEsMDq5ODAyLDIwODq5ODAzLDIwNToATgpuAA==",
"cQQZCAoAsiAgLS0gRE9TIDMuMyBIRUxMTwAgCBQAsiAAKAgeAIk6ugAuCCgAlwBZCDIAuiJET1MgVkVSU0lPTiAzLjMgICAgICAgICAgICAwOC8yNS84MCIAiwg8ALo6uiJBUFBMRSBJSSBQTFVTIE9SIFJPTUNBUkQgICBTWVNURU0gTUFTVEVSIgCSCEYAsiAAtAhQALIgLS1QT0tFIExBTkdVQUdFIENBUkQgRklOREVSAAUJWgC5NzY4LDA6uTc2OSwxNzM6uTc3MCwwOrk3NzEsMjI0Ork3NzIsNzI6uTc3MywxNzM6uTc3NCwxMjk6uTc3NSwxOTI6uTc3Ng==",
"AAAAAAAAAAAAAAAAEw4TDRMMEwsTCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"AQycBGHXxkBGswMAAQ2mBGEooc3Pz9PFKQEIsARfsWQAASLQB12tra2tra2tra2tra2tra2tra2tra2tra2tra2trQEb2gddoKCg0NLPx9LBzaDF2NDMwc7B1MnPzgEi5Addra2tra2tra2tra2tra2tra2tra2tra2tra2tra0BBe4HXQEd+AddoMLB08nDwczM2ayg1MjJ06DQ0s/H0sHNAR4CCF2gyczM1dPU0sHUxdOg1MjFoNXTxaDPxqDBASIMCF2gwsnOwdLZoNTSxcWg09TS1cPU1dLFrqDTyc7DxQEjFghdoNTIxaDBztPXxdKg1M+gwaDR1cXT1MnPzg==",
"wc7JzcHM06DCxcbP0sW/KQFYVwRhKNTZ0MWgp87F18bJzMWnoMbP0qDNxaDUz6DGz9LHxdSg18jB1KDJKQNhKMjB1sWgzMXB0s7FxKDV0KDUz6DOz9egz9Kgycagzs+gz87FoMjB0ykBNFgEUyjUwdXHyNSgzcWgwc7Z1MjJzseg2cXUuqApJsFAA2DBQDoozsXXxsnMxSkksWQAAQxgBGHXxkBGsAAAAQpqBGEosqy0KQEMdARh18ZARrEBAAEqfgRhKMTPxdOgydSgzMnWxaDJzqDUyMWg18HUxdIpA2KyAgADYrMDAAEMiARh18ZARrICAAEMkgRhKKHG0s/HKQ==",
"2aygwaDTyc3QzMWgp9mnoM/SKQNhKKfOp6DSxdPQz87TxaDJ06DT1cbGycPJxc7UqSkBV0IEYSjJxqDJoMTPoM7P1KDH1cXT06DXyMHUoNnP1dKgwc7JzcHMoMnTrCkDYSjJoNfJzMygwdPLoNnP1aDBoMbF16DR1cXT1MnPztOg08+g1MjB1CkBNkwEYSjOxdjUoNTJzcWgyaDXyczMoMvOz9eg18jB1KDZz9XSoMHOyc3BzCkDYSjJ064pA2MBUVYEYSjEz6DZz9Wg18HO1KDNxaDUz6DT1MHS1KDMxcHSzsnOx6ygz9IpA2EoyMHWxaDZz9Wg1MHVx8jUoM3FoA==",
"JLFkAAFnJARjA2Eoyc7T1NLVw9TJz87TuikDYwNhKNnP1aDXyczMoNTIyc7LoM/GoMHOoMHOyc3BzKygwc7EoMmg18nMzCkDYSjU0tmg1M+gx9XF09Og18jB1KDBzsnNwcyg2c/VoMHSxSkBVS4EYSjUyMnOy8nOx6DPxq6goMmg18nMzKDEz6DUyMnToMLZoMHTy8nOxykDYSjZz9WgwaDTxdLJxdOgz8ag0dXF09TJz87ToMHCz9XUoNnP1dIpAXI4BGEowc7JzcHMrKDUz6DXyMnDyKDZz9Wg0sXT0M/OxKDFydTIxdIpA2Eo2cXToM/SoM7PrqCowcPU1cHMzA==",
"1KDSxqSuoM7P1MWg1MjB1KDUyMWgoqzSoqDJ06DGz9Kg0sHOxM/NoMHDw8XT06DJztTPoMbJzMXTrgFdFQRhKKqg18HSzsnOx4e6oNnP1dKgxMnTy8XU1MWgzcHZoM7P1KDCxSkDYSjX0snUxaDQ0s/UxcPUxcSgyc6gz9LExdKg1M+g0MzB2aDUyMnTKQNhKMfBzcWhKQFtGgRvtQUAA2EooKqqqqqgwc7JzcHMoMzFwdLOyc7HoMfBzcWgqqqqqikDYwNhKMjB1sWg2c/VoMXWxdKg0MzB2cXEoMLFxs/Sxb8pRwNSwUADYDvBQHIlYMFAKrEBACOxAQByOSjZKQ==",
"wczTxsnMxazSKQPXxkBwKITX0snUxaDBzsnNwczTxsnMxazSKQPDzEBwKITDzM/TxSkDz9BAcCiEz9DFzqDBzsnNwczTxsnMxazMuLApA2HP0EABdhEEXaDUyMWgwcLP1sWg09TSyc7H06DXxdLFoNPF1KDTz6DUyMHUoNfFoM/OzNmgzsXFxKDUz6DQ0snO1KDBoNPU0snOx6DSwdTIxdKg1MjBzqDU2dDFoNTIxaDXyM/MxaDP0MXSwdTJz86uoMXYwc3QzMW6AXESBF2g0sHUyMXSoNTIwc6g0NLJztSgxKS7otLFwcSgwc7JzcHM08bJzMWs0qKg18Wg0NLJzg==",
"XaqgoKCgoKCgoLC2r7Cxr7e4oKCgoKCgoKCgqgEg9ANdqqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCqASD1A12qoKCg1dDEwdTFxLqgsa+xsq+3uaCgoKCgoKoBIPYDXaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgET/ANhKITOz83PzqDJrM+swykBXgYESwNNNrmoAwNOzsXXQCK3RgByQ8HOyc1AIrdGAHJD0UAit0YAckPBQCK3RgByQ9LGQCKyFAByQ9fGQCKyFAByQ8HOQCKxCgByQ8PMQCKyFAByQ8/QQCK0KAByAWYQBNLGQHAohNLFwcSgwc7JzQ==",
"XaqgoNDSz8fSwc2g1MjB1NOgzMXB0s7ToKCgqgEg7ANdqqCgwcLP1dSg1sHSyc/V06DBzsnNwczToKCqASDtA12qoKDG0s/NoNTIxaDV08XSrqCgoKCgoKCgoKoBIO4DXaqgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgqgEg7wNdqqCgoNPZ09TFzaDSxdHVydLFzcXO1NO6oKCqASDwA12qoKCxtsugzcXNz9LZrKDEydPLoMnJoKCgoKoBIPEDXaqgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgqgEg8gNdqqCgoKCgoNKuoNfJx8fJztTPzqCgoKCgoKCqASDzAw==",
"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"
],
[
"ICAgRVJST1IgTUVTU0FHRVMiADEL4gS6IjEzICAgICAgIE9USEVSIE1FU1NBR0VTIgBHC+wEuiIxNCAgICAgICBOT1RFUyIAXQv2BLoiMTUgICAgICAgTk9URVMiAHMLAAW6IjE2ICAgICAgIE5PVEVTIgB7CwoFojIzAJ8LFAW6IlBSRVNTIFJFVFVSTiBUTyBSVU4gUkVOVU1CRVIiAMQLHgW6IkhJVCBBTlkgS0VZIEZPUiBJTlNUUlVDVElPTlMiOwDMCygFvkEkANsLMgWt5ihBJCnQM8SAAO4LPAWt5ihBJCnQMTPEMzk1MAD0C0YFlwAHDFAFusBQVCkiUA==",
"IgAwCpIEuiIgNiAgICAgTUVSR0UgICAgICAgICAgMTQgICAgVVNBR0UgTk9URVMiAF8KnAS6IiA3ICAgICBNRVJHRSAgICAgICAgICAxNSAgICBVU0FHRSBOT1RFUyIAjgqmBLoiIDggICAgIFNZTlRBWCAgICAgICAgIDE2ICAgIFVTQUdFIE5PVEVTIgCYCrAEqzEyOTAAtQq6BLoiOSAgICAgICAgSU5QVVQgU1lOVEFYIgDUCsQEuiIxMCAgICAgICBFUlJPUiBNRVNTQUdFUyIA8wrOBLoiMTEgICAgICAgRVJST1IgTUVTU0FHRVMiABIL2AS6IjEyICAgIA==",
"ICAgUEFHRSAgIFRJVExFICAgICAiABsJVgS6AEkJYAS6IiAxICAgICBDT05URU5UUyAgICAgICAgOSAgICBTWU5UQVggICAgIgB3CWoEuiIgMiAgICAgV0FSTklORyAgICAgICAgMTAgICAgRVJST1IgTVNHUyIApQl0BLoiIDMgICAgIFJFTlVNQkVSICAgICAgIDExICAgIEVSUk9SIE1TR1MiANMJfgS6IiA0ICAgICBSRU5VTUJFUiAgICAgICAxMiAgICBFUlJPUiBNU0dTIgABCogEuiIgNSAgICAgUkVOVU1CRVIgICAgICAgMTMgICAgT1RIRVIgTVNHUw==",
"bSUXCOgDsiAgICAgICAgUkVOVU1CRVIAHQjyA7oAKgj8A4k6lzqpMjU1ADoIBgRUVNAxNTpQVNAzNAB0CBAEuiImIjvAMDUpOyJBUFBMRVNPRlQgUkVOVU1CRVIgSU5TVFJVQ1RJT05TIjvANDApOyImIjsAeggaBLoAtggkBLoiJiI7wDQpOyJDT1BZUklHSFQgMTk4MCAgQVBQTEUgQ09NUFVURVIgSU5DIjvANDApOyImIjsAwAguBLo6ujq6AMYIOASdAOcIQgS6wFRUKSJDT05URU5UUyLAUFQpIlBBR0UgMSAiABUJTAS6IlBBR0UgICBUSVRMRSAgICAgIA==",
"AAAAAAAAAAAAAAAAFQMVAhUBFQAWCRYIFgcWBhYFFgQWAxYCFgEWABkFGQQZAxkCGQEZABoJGggaBxoGGgUaBBoDGgIaARoAGwwbCxsKGwkbCBsHGwYbBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"TElORVMgSU4gUkFOR0WNSU5DUkVNRU5UIFRPTyBMQVJHRY1EVVBMSUNBVEUgTElORSBOVU1CRVJTjU9VVCBPRiBNRU1PUlmNUFJPR1JBTSBPTiBIT0xELCBVU0UgIiZNIiBUTyBSRUNPVkVSjUhPTEQgRklMRSBJTiBVU0WNTElNSVRFRCBNRU1PUlksIE1BWSBERVNUUk9ZIFBST0dSQU0gICAgIENPTlRJTlVFIChZL04pPweNU1lOVEFYjT4gNjM5OTmNTElORSBUT08gTE9OR41JTkNSRU1FTlQgPSAwjcnJ8AfJACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"ALGlyKqxpYalhaaxpWDmp9AC5qilp8VzpajldJAHaGigUkyghGCEq6WjhaelpIWooACxp0Wd0AfIsadFnvAVGKWnaQSFp5AC5qigAbGnyf/Q3vAKyLGnhZ3IsaeFnqSrYKVphaOlaoWkpKsYsaNFndAHyLGjRZ7wEqWjaQSFo5AC5qSgAbGjyf/Q3mC5AIdIyAmAIO39aBDzYO67htAD7ryGrQACyTqwBjjpMDjp0GAARVNJRoWrrLC8xAAAAAAYpaNloYWjpaRlooWksATJ+pAFoCdMoISlnaAC0aXIpZ7xpbC2pasQBU5PIFBST0dSQU0gSU4gTUVNT1JZjU5PIA==",
"iBD7oGAgpIZMhoSt04YN1Ibw9Tikc6V06QHEaeVqsAWgUkyghKVnpmiFoYaioAGxofAHqoixoUxBhaWhhUKlooVDrdWGhT6t1oaFP6VzhTyldIU9oAAgLP6t1YaFc63WhoV0OK3ThukChaGt1IbpAIWiGKWvZaGFr4VppbBlooWwhWqpAI3Tho3UhqVnhaGlaIWiGKABsaHwHaAEyLGh0PvImGWhqqAAkaGlomkAyJGhhqGFopDdTGWDogCGp4aoqganJqiwMaWohaulpwomq7AmCiarsCFlp4WnpatlqIWosBWKKQ9lp4WnpahpAIWosAYgsoaQyWBoaKDWTKCEoA==",
"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"
],
[
"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"
],
[
"AAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAYAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAABwAQAAAAAAcAEAAAAAAHABAAAAAABgAAAAAAAAYAAAAAAAAHwHAAAAAAB/DwAAAABAfx8AAAAAYH8/AAAAAHB5eQAAAABgeGEBAAAAQHlhAAAAAAB7MQAAAAAAfhkAAAAAAHwNAAAAAAB4CQAAAAAAeAEAAAAAAHwDAAAAAAB8BwAAAAAAfgcAAAAAAF8HAAAAAABPBwAAAAAABwcAAAAAAA8HAAAAAAAeAwAAAAAAfAMAAAAAAHAHAAAAAABADw==",
"AAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAMAAAAAAAADgAAAD//wAAAAAAAAAAAAAAGAAAAAAAADwAAAAAAAA8AAAAAAAAPAAAAAAAABgAAAAAAAAYAAAAAABwfwcAAAAAfH8fAAAAAH5/fwAAAAAGf2AAAAAAAz5AAQAAAAE+AAMAAAABPgACAAAAAT4AAwAAAAM+AAIAAAABfwEAAAAAAH8HAAAAAEB/HwAAAABAfz8AAAAAQA84AAAAAEAPGAAAAABADxgAAAAAAA8cAAAAAAAHDAAAAAAABwwAAAAAAAcEAAAAAAAHHAAAAAAABgAAAAAAAA4AAA==",
"AAAAADAYAAAAAAAwEAAAAAAAEDAAAAAAABAwAAAAAAAwIAAAAAAAGCAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAAwAAAAAAAAMAAAAAAAQH8fAAAAAHB/fwAAAAB8f38BAAAADHxDAQAAAAZ4AQMAAAADeAECAAAAAXgBAgAAAAN4AQIAAAABeAEDAAAAAH4DAgAAAEB/AwAAAABwfwcAAAAAeH8HAAAAADhgBwAAAAAwYAcAAAAAMGAHAAAAAHBgAwAAAABgQAMAAAAAYEADAAAAAEBAAwAAAABwQAMAAAAAAEABAAAAAABgAQ==",
"AAAAAEBhAAAAAABAYAAAAAAAYEAAAAAAAGBAAAAAAAAgYAAAAAAAIEABAAAAAAAAACAAAAAAAABgQAEAAAAAQGEDAAAAAABhAwAAAAAAYwMAAAAAAEYBAAAAAABOAQAAAAAAfA8AAAAAAHgfAAAAAAB4PwAAAAAAeHcBAAAAAHhjAwAAAABwAw8AAAAAcAM8AAAAAHADIAAAAABwBwAAAAAAcAcAAAAAAHAHAAAAAABwDwAAAAAAeA8AAAAAAHgOAAAAAAB4DgAAAAAAOA4AAAAAADgOAAAAAAA4DgAAAAAAOAwAAAAAADgcAAAAAAA4HAAAAAAAMBgAAAAAADAYAA==",
"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"
],
[
"ra2trdygoKCgoKCgqqDEwdTFoMnO0NXUoNPVwtLP1dTJzsWgqqCgoKCgoKDcra2tra2tra2tra2tra2tra2tra2tra2vioqKigENKAXUwnEuP7MkAHIBOTwFZLMkAGXUwgNNNrhkAwPMz8NxsQEAA81xsAAAA8RxsAAAA1LJzkADYDvJzkByFrAAACSxPAUBGVAFXLF0BANgN9PJx84ksTwFA81xztXNARRkBWDNHLEBAB7NGbEMACSxPAUBGXgFXLF0BANgN9PJx84ksTwFA8RxztXNAQ6MBWDEHLEBACSxPAUBGaAFXLF0BANgN9PJx84ksTwFA9lxztXNASm0BQ==",
"zkByFrAAACVbATecBGA7yc5AchzMz8MlWwPTycfOcbEBAANV08PSVszPw1c7yc5AcgPDyNJxPMnOQCrTw9JycgEQsARgw8jSFrGgACSxAAUBGMQEYMPI0hyxsAAew8jSGbG5ACSxFAUBK9gEYM7VzRyzzAweztXNFrPMDB3DyNIcsbgAJLHsBAPTycfOcbAAAANbARfsBM7VzXGxCgAUztXNE7GwABLDyNIBCAAFWdPD0gEyFAXTycfOcdPJx84UONPD0hfMz8NyA87VzXHTycfOFM7VzQPMz8Nx08PSErEBAANbAWUeBV2Kioqvra2tra2tra2tra2tra2tra2trQ==",
"AAADZLIXAGW5YAABb0wEZLICAGWxrQADZLMDAGW0MAADZLQEAGWxwAADZLUFAGWxpQADZLYGAGWwAAADZLcHAGWzIAADZLgIAGWxqAADZLkJAGWy/AADZLEKAGWxpQADZLELAGWxAQADZLEMAGWy0AADZLENAGW0BAABCGAEX7hAAQFmdARdioqKr62tra2tra2tra2tra2tra2tra2tra2tra3coKCgoKCqoNPU0snOx6DWwczVxaDT1cLSz9XUyc7FoKqgoKCgoNytra2tra2tra2tra2tra2tra2tra2tra2tr4qKigEhiATO1c1xsAAAA9PJx85xsAAAA2A7yQ==",
"xyXGzXHNErEBABOxDAAUOM0ZsQsAcgNgN83GzMHHHcbNFrEBACXG2XHZErEBAAPNxszBx3GwAAABCOgDXLgsAQER/APGzMHHcbEBAANfsQgCAVMQBMPEcbMfABOxAQAUOM0WuQkAHs0WtAQAHs0WtgYAHs0WsQsAchOzAwAUOM0WsgIAchKxAQAUODc42R+0BAByHTjZH7FkAHIdzRayAgByA1sBCiQEXaDJzsnUAV04BGSxDgBlscYAA2SxDwBlshgAA2SxEABlsvAAA2SxEQBltQUAA2SxEgBlscYAA2SxEwBlsQEAA2SyFABlt0wAA2SyFQBlsgIAA2SyFgBlsA==",
"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"
],
[
"Q09NTUFORCBBUkUgSUdOT1JFRCIAHhvOCbAzODYwAEMb2Am6wFRUKSJJTlBVVCBTWU5UQVgiwFBUKSJQQUdFIDkgIgBJG+IJugB4G+wJuiIgICAgIFRIRSBGSVJTVCBMRVRURVIgQUZURVIgJyYnIE1VU1QgQkUiAJAb9gm6IkMsRSxGLEgsSSxNLE9SIFMiAL0bAAq6OroiICAgICBDLEgsQU5EIE0gRVhFQ1VURSBJTU1FRElBVEVMWS4iAOUbCgq6IlRIRSBSRVNUIE9GIFRIRSBMSU5FIElTIElHTk9SRUQuIgAQHBQKujq6IiAgICAgRSxGLEksQU5EIFMgIA==",
"ACgadAm6IiAgICAgSSAgLSAgTElORSBOVU1CRVIgSU5DUkVNRU5UIgBJGn4JuiIgICAgIFMgIC0gIFNUQVJUIE9GIFJBTkdFIgBoGogJuiIgICAgIEUgIC0gIEVORCBPRiBSQU5HRSIAgRqSCbo6uiJDT01NQU5EIExFVFRFUlMiAJkanAm6IiAgICAgTSAgLSAgTUVSR0UiALAapgm6IiAgICAgSCAgLSAgSE9MRCIAyhqwCboiICAgICBDICAtICBDT05WRVJUIgD3GroJujq6IiAgICAgRVhUUkEgTEVUVEVSUyBBTkQgU1BBQ0VTIEFGVEVSIgAUG8QJuiJBIA==",
"UFVUIFNZTlRBWCLAUFQpIlBBR0UgOCAiAB4ZLgm6AEsZOAm6IiAgICAgVEhFIEZJUlNUIENIQVJBQ1RFUiBPRiBBTlkgSU5QVVQiAF8ZQgm6Ik1VU1QgQkUgJyYnLiIAjhlMCbo6uiIgICAgIFJFTlVNQkVSIC8gTUVSR0UgT05MWSBSRUNPR05JWkVTIgC9GVYJuiJUSEUgRk9MTE9XSU5HIFNJTkdMRSBDSEFSQUNURVIgQ09NTUFORFMiANgZYAm6OroiUEFSQU1FVEVSIExFVFRFUlMiAAAaagm6IiAgICAgRiAgLSAgRklSU1QgTkVXIExJTkUgTlVNQkVSIg==",
"OroiICAgKiBNRVJHSU5HIFdJVEggTk8gUFJPR1JBTSBJTiIATRjeCLoiICAgICBNRU1PUlkgUkVTVE9SRVMgVEhFIEhPTEQgRklMRSIAbRjoCLo6uiIgICAgICAgICAgICAgICBDT05WRVJUIgCAGPIIujq6IiYgQ09OVkVSVCIArBj8CLo6uiIgICAgIFdJTEwgQ09OVkVSVCBBTiBSQU0gQVBQTEVTT0ZUIgDWGAYJuiJQUk9HUkFNIFRPIFJVTiBXSVRIIEEgUk9NIENBUkQgQU5EIgDpGBAJuiJWSUNFIFZFUlNBLiIA8xgaCbAzODYwABgZJAm6wFRUKSJJTg==",
"CLoALxeYCLoiICAgICBNRVJHRSBXSUxMIENPTUJJTkUgVEhFIEhPTEQgRklMRSIAXBeiCLoiV0lUSCBUSEUgUFJPR1JBTSBDVVJSRU5UTFkgSU4gTUVNT1JZLiIAhxesCLo6uiIgICAqIExJTkUgTlVNQkVSUyBBUkUgQVJSQU5HRUQgSU4iAKMXtgi6IiAgICAgQVNDRU5ESU5HIE9SREVSIgDSF8AIujq6IiAgICogRFVQTElDQVRFIExJTkUgTlVNQkVSUyBXSUxMIEJPVEgiAPoXygi6IiAgICAgQVBQRUFSLCBIT0xEIFZFUlNJT04gU0VDT05EIgAjGNQIug==",
"RklSU1QgUFJPR1JBTSBBTkQiAB4WNAi6IlRZUEUiAC4WPgi6OroiJiBIT0xEIgBbFkgIujq6IiAgICAgTkVYVCwgTE9BRCBUSEUgU0VDT05EIFBST0dSQU0uIgCHFlIIuiJZT1UgTUFZIFJVTiBPUiBSRU5VTUJFUiBUSElTIFBST0dSQU0iAJkWXAi6IkFTIE5FRURFRC4iAMMWZgi6OroiICAgICBUSEVOLCBUTyBNRVJHRSBUSEUgVFdPIFRZUEUiANQWcAi6OroiJiBNRVJHRSIA3hZ6CLAzODYwAPwWhAi6wFRUKSJNRVJHRSLAUFQpIlBBR0UgNyAiAAIXjg==",
"zR+ptSDNH6UvIL0fpUEgvR+lSyC9H6UvRUFFS0hKBUqdjcDdjMBoCaogzB+p3iDNH6mqIM0fqesgzR+p/yDNH6AChEagrdAGiPANSGjqSGidjcDdjMCw8MZG0PKkRxgkAJ2NwL2MwKVLaQqFS+kM8AqwASyFS6n/TOseSGikR72NwL2OwDAyiEhoSGhIaIjQ9yBlGbAEpS3wCqRHiMAQkBhMsh7mQaVBySOwEgogHhqkR8jIhEdMsh6pQEw5Hkw3HkhKBUqdjcDdjMBowQAJqupIaOqdjcDdjMBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"OR7wN6ADsUiFL0ygHqADsUhIpS+gDpFIaPAIxS/wBKkg0NugBaUt0UjQlSiQGCD9GAiwjCggwRmu+AUYJDigDZFIvYjAYCBqGJDwqRCw7kigAbE8amiQCAogXB5OeARghS4gfx65eAQkNTADufgEjXgEpS4kNTAFmfgEEAOZeARMHhqKSkpKSqhgSKACsUhqZjUgfx5oCiQ1MAWZ+AQQA5l4BGCpgI14BKkAhUEgHhqpqoVKoFCER6knhUu9jcC9jsCp/52PwN2MwCQAiPAPSGjqSGjq6p2NwN2MwLDuxkvQ8KRH6urQBkhoSGjBAOqdjcDdjMCI0PCp1SDMH6mqIA==",
"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"
],
[
"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"
],
[
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"KQAMMTwAgUrQMcFJABgxRgA6hEEkKEopAB8xUACCSgAzMVoAukQkOyJDTE9TRSAiO1okAEkxZAC6RCQ7Ik5PTU9OIEMsSSxPIgAAAApNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"SwEWMAoARCTQ5yg0KTqyIENUUkwgRAA/MAwAuiJUSElTIFBST0dSQU0gUkVUUklFVkVTIFRFWFQgRklMRVMiAGwwDgC6IkNSRUFURUQgQlkgVEhFICdDUkVBVEUgVEVYVCcgUFJPR1JBTS4iAIswEAC6Ik1PTiBDLEksTyBJUyBJTiBFRkZFQ1QuIgCRMBIAugCvMBQAhCJOQU1FIE9GIFRFWFQgRklMRT8gIjtaJADDMBYAukQkOyJNT04gQyxJLE8iAMkwGAC6ANwwHgC6RCQ7Ik9QRU4gIjtaJADvMCgAukQkOyJSRUFEICI7WiQA9jAyAIRJAAExNwCGQSQoSQ==",
"AAAAAAAAAAAAAAAAGwMbAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"VCI7AAstKA++QSQAGi0yD63mKEEkKdAzxIAALS08D63mKEEkKdAyN8QzOTMwADMtRg+XADktUA+xAEMtWg+rMTAwMABJLWQPgABsLW4PojIwOroiIjqiMjA6uiIEUlVOIFJFTlVNQkVSIjqAAAAAAKIyMDq6IgRSVU4gUkVOVU1CRVIiOoAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"IgAyLMQOuiJDQU4gVVNFIFRISVMgTUVNT1JZIEZPUiBUSEVJUiBPUEVSQVRJT04uIjsAXyzODroiVEhFUkVGT1JFIEZPUiBNQVhJTVVNIFVTRUFCTEUgTUVNT1JZLCIAiyzYDroiVVNFIFRIRSBIT0xEIEZJTEUgT05MWSBXSElMRSBNRVJHSU5HIgCcLOIOuiJQUk9HUkFNUy4iAKYs7A6wMzg2MACwLPYOqzEwMDAAyCwAD7IgIDUzNjQ0MzcxMCA0QVBSODAAziwKD4AA1iwUD6IyNAADLR4PuiJQUkVTUyBTUEFDRSBGT1IgTU9SRSwgRVNDIFRPIFJFU1RBUg==",
"UkVOVU1CRVIgSVMgUFJPQkFCTFkgSU5UQUNULiIATCuSDro6uiIgICAgIFRIRSBJTlRFTkRFRCBVU0UgRk9SIE1FUkdFIElTIFRPIgB4K5wOuiJCRSBBQkxFIFRPIElOU0VSVCBTVUJST1VUSU5FUyBJTlRPIEEiAKIrpg66IlBST0dSQU0gRlJPTSBBIFNVQlJPVVRJTkUgTElCUkFSWS4iANMrsA66OroiICAgICBUSEUgJ0hPTEQnIEZJTEUgSVMgQSBTRVBBUkFURSBQQVJUIgABLLoOuiJPRiBNRU1PUlkuICBORUlUSEVSIEJBU0lDIE5PUiBSRU5VTUJFUg==",
"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"
],
[
"Li4AMA3bAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAF4N3ACDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCMDd0Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4Aug3eAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAOgN3wCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAWDuAAg1wuLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBKDNYAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AeAzXAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKYM2ACDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDUDNkAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AAg3aAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4ANgvQAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAGQL0QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCSC9IAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AwAvTAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAO4L1ACDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAcDNUAg1wuLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBQCssAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AfgrMAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKwKzQCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDaCs4Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ACAvPAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"U1MgICAqACMJbQCyKiAgICAgVEhBTiA0MDAhISAgICAgICoAQAluALIqICAgICAgICAgICAgICAgICAgICAgKgBdCW8AsiogICAgUFJPR1JBTSBXSUxMICAgICAqAHoJcACyKiAgIFNFTEYtREVTVFJVQ1QhICAgICoAlwlxALIqICAgICAgICAgICAgICAgICAgICAgKgC0CXIAsioqKioqKioqKioqKioqKioqKioqKioqALwJcwCyCgoAxgnIAIMxMDAwAPQJyQCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAiCsoAg1wuLi4uLg==",
"8jEeCGQAsioqKioqKioqKioqKioqKioqKioqKioqADsIZQCyKiAgICAgICAgICAgICAgICAgICAgICoAWAhmALIqICAgIFcgQSBSIE4gSSBOIEcgICAgKgB1CGcAsiogICAgLSAtIC0gLSAtIC0gLSAgICAqAJIIaACyKiAgICAgICAgICAgICAgICAgICAgICoArwhpALIqICAgIERPIE5PVCBNT0RJRlkgICAgKgDMCGoAsiogIEFOWSBMSU5FIElOIFRISVMgICAqAOkIawCyKiAgIFBST0dSQU0gV0lUSCBBICAgICoABglsALIqICBMSU5FIE5VTUJFUiBMRQ==",
"AAAAAAAAAAAAAAAAHAUcBBwDHAIcARwAHQYdBR0EHQMdAh0BHQAeBh4FHgQeAx4CHgEeAB8MHwsfCh8JHwgfBx8GHwUfBB8DHwIfAR8AIAYgBSAEIAMgAiABIAAhBSEEIQMhAiEBIQANDA0LDQoNCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"AANssAAAbbMnAG6zIwADabICAGqzIwBrsAAAA2myAgBqsyMAa7MnAANbAQ+gD1XJVrEBAFc7wUByARiqD1CyAgAUyRKyAgADYcFAKskjyXJHAQi0D1nJA1sBKf//XarDz9DZ0snHyNSgsbm3uKDB0NDMxaDDz83Q1dTF0qzJzsOuqgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"OMkS0HIVsgIAErkJAANg0Bmy/wAl0HGy/wADXLHcBQEm1ANvshUAA2Eo2KDJ06ApRthFKKApA2Eo2aDJ06ApRtlFKKApAQ/eA2AuP8VyGdokssgAAQ3oA2AuP8dyGdolTAEZ8gNgLj/IchnaJdVxONUSsQEAch+xEAABEPwDZtUDZ9ho2QNfuawDARjcBWSwAABl0ANksQEAZcQDTbICAANbASHQB1A4OLQoABM7wUBychWyAgASsQEAcgNhwUADYwNbASm4C0wDVclWsAAAV7MfAANmyRWyAgADbLAAAG2zJwBuyRKzAwADWckBPsILZrUFAANssAAAbbMnAG6yAg==",
"1dPFoNTIxaDHwc3FoMPPztTSz8zToMHOxKDC1dTUz87TrikDXNQBLyoDwUBwKNTIxaDC1dTUz87ToMPMxcHSoNTIxaDU1qDBzsSgw8jBzsfFKQNc1AEuNAPBQHAo1MjFoMTJ09DMwdnFxKDDz8zP0q6goNTS2aDPzsWgzs/XrikDXNQBFoQDYC4/x3IZ2h4uP8hyGdokuaIDAQ+OA2AuP8VyGdokssgAAQiYA1+5hAMBCKIDTcMDTAEhrAPQcTI/sAAAcgPYcdAVtgYAA2DYGbMnACXYcbMnAAEhtgPJcTI/sQEAcgPZcckVtgYAA2DZGbMnACXZcbMnAAElwAPQcQ==",
"ErQEAANiyUcBCHYCWckDYwESgAJVyVaxAQBXsQ8AWLICAAESigJQsgIAFMkStAQAA2LJRwEPlAJZyQNjA2MDX7TCAQE7vAJMA03DA1XXVrMDAFe1MgADVclWsQEAV7ETAANVylawAABXsRMAA8txyRLKA2AuP8VyGdokssgAARruAmbKFLMDABU4yRKzAwByEskU1xWxDAABJ/gCZ8loywNny2jJA2e0KAATyWi0KAATywNntCgAE8totCgAE8kBJwIDZ8totCgAE8kDZ7QoABPJaMsDZ8lotCgAE8sDZ7QoABPLaMkBDwwDWcpayVrXA1+0wgEBMSADTcMDwUBwKA==",
"AQBychOxsAABFZABYM4csQEAHs4ZtQUAJV+yyAABDJIBYM4WtQUAJVEBDpoBX7SQARLOFLFkAAEPwgFgLj/FchzaJLTCAQEIzAFfssgAAQj0AVyzuAsBIP4BwUBwKMLNxNDEx83Mws/H0MzZwdcpA1y0oA8DYwEgCALBQHAozMfC1cfSwsLS0tLJx8XRySkDXLSgDwNjASASAsFAcCjB1MzS0sXMzNfOxc7SzNXUKQNctKAPA2MBHhwCwUBwKMvB1dDO2dXVzsfZy87PwcUpA1y0oA8BCCYCX7TCAQEIWAJcs7gLARJiAlXJVrAAAFexDgBYsgIAARJsAlCyAgAUyQ==",
"A2MBCiIBYSixrilHASAsAcFAcCjT1MHOxMHSxKDDz8zP0qDOwc3F0ykDXNQBCjYBYSiyrilHASJAAcFAcCjT1MHOxMHSxKDDz8zP0qDO1c3CxdLTKQNc1AEKSgFhKLOuKUcBGFQBwUBwKMvBzMXJxM/Tw8/QxSkDXNQBCl4BYSi0rilHARxoAcFAcCjTy8XUw8jJzseg08PSxcXOKQNc1AELagFhKLWuoClHARBsAcFAcCjF2MnUKQNc1AEHcgFjA2MBIHwBUyjXyMnDyKDXz9XMxKDZz9WgzMnLxb+gKSbBQAEmhgFgO8FAchawAAAlX7LIAAPOcTzBQCqxAQAjsQ==",
"wwNjA2TGZbAAAAEq3ADBQHAowdDQzMWgxMXNz87T1NLB1MnPzqDQ0s/H0sHN0ykDXNQDYwEs5gBhKKCgoKDUz6DP0MXSwdTFoMGgxMXNz87T1NLB1MnPzqygoNTZ0MUpASzwAGEoydTToM7VzcLF0q6goNTIxc6g1NnQxaDUyMWgy8XZoM3B0svFxCkBLfoAYSin0sXU1dLOp6DB1KDUyMWg0snHyNSgxcTHxaDPxqDUyMWgy8XZrSkBLAQBYSjCz8HSxK6goNTZ0MWg1MjFoKfSxdTV0s6noMvF2aDUz6DT1M/QKQEdDgFhKMHO2aDExc3PztPU0sHUyc/OrikDYw==",
"gQdHHgBOwUAitCgAcgPVcbkJAAPEcbMDAAPFcTaxAEADxnE2sfA/A8dxNrGfPwPIcTaxnj8Dw3E2uagDA9RxstAHA9pxsX8AAVRkAGSyAgBlsa0AA2SzAwBltDAAA2S0BABlscAAA2S1BQBlsYgAA2S2BgBlstAAA2S3BwBltAQAA2S4CABlscYAA2S5CQBlsQEAA2SxCgBlsvAAAV1uAGSxCwBluAgAA2SxDABlssoAA2SxDQBlstAAA2SxDgBlsvYAA2SxDwBlsaYAA2SxEABlsAAAA2SxEQBlt0wAA2SxEgBlsgIAA2SxEwBlsAAAA2SyFABluWAAARHIAEsDTQ==",
"AAAAAAAAAAAAAAAAHA4cDRwMHAscChwJHAgcBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"Li4uLgAyFAIBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AYBQDAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAI4UBAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgC8FAUBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A6hQGAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uABgVBwGDXC4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAEwT/QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgB6E/4Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AqBP/AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANYTAAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAEFAEBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLgA4EvcAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AZhL4AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAJQS+QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDCEvoAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A8BL7AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAB4T/ACDXC4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAFIR8gCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCAEfMAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ArhH0AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANwR9QCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAKEvYAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLgA+EOwAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AbBDtAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAJoQ7gCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDIEO8Ag1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A9hDwAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uACQR8QCDXC4uLg==",
"AINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAFgP5wCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCGD+gAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AtA/pAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAOIP6gCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAQEOsAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgBEDuEAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4Acg7iAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKAO4wCDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDODuQAg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A/A7lAINcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uACoP5g==",
"D5YyyknIMjq66ihBJCxJLDEpOwAcD7QPgkk6sQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"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"
],
[
"Li4uLi4uADQbKQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBiGyoBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AkBsrAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAL4bLAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDsGy0Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AGhwuAYNcLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AThokAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAHwaJQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCqGiYBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A2BonAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAAYbKAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uADoZHgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBoGR8Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AlhkgAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAMQZIQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDyGSIBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AIBojAYNcLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AVBgZAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAIIYGgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCwGBsBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A3hgcAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAAwZHQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uAEAXEwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBuFxQBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AnBcVAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAMoXFgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgD4FxcBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AJhgYAYNcLg==",
"Fg0Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AWhYOAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAIgWDwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgC2FhABg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A5BYRAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uABIXEgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAEYVCAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgB0FQkBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AohUKAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANAVCwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgD+FQwBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ALA==",
"oMTJ08ugwc7EoNDSxdPToNLF1NXSzilHA1LEy0ABCQgCTTa5qAMBBRICWwGgwc7EoNDSxdPToNLF1NXSzilHA1LEy0ABCQgCTTa5qAMBBRICWwFgA1LEy0ABCYEBTTa5qAMBBYYBWwEMAVsB0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"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"
],
[
"UExFQVNFIEVOVEVSIFRIRSBTRUFSQ0ggS0VZOiI6ojEzOpY1OoQiIjtTJDqtUyTQIiLEMjUwMDAATyj0A61QUsSwNzAwOroiICI6uiIgIgCvKPcDlzqiMTq6IiBOQU1FICAgICAgICAgICAgICAgICAgICAgIFBIT05FIE5VTUJFUiI6uiItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgC8KPkDrVBSxLA3NTAAyij6A61T0DLEMjUxMAD4KPwDojEyOozJODY4OpYxMjqeOroiPDwgU0VBUkNISU5HID4+IjqdOlZU0DIAASkBBK46hw==",
"TiBTQVZFRCEhByI6ojIyOoAAHyd6A4k6lzqiMjI6gAAvJ+gDsgoKU0VBUkNICgoARCftA7AzMDAwOq1PUNAxxDEwMTAApCfuA5c6ojk6ljU6uiJXT1VMRCBZT1UgTElLRSBUTyBTRUFSQ0ggQlkiOro6ljEwOroiMSAgV09SRCAoRkFTVCkiOpY3OroiT1IgMiAgQ0hBUkFDVEVSIChTTE9XKSIA8CfvA6IxNDqMyTg2ODqWMjA6hCJXSElDSDogIjtTSyQ6U0vQ5ShTSyQpOq1TS9HPMc1TS9HPMs7jKFNLJCnPMcS6IgciOqsxMDA3ADgo8gOXOqIxMTqWNTq6Ig==",
"OrEAFyYgA7IKCkVORCBST1VUSU5FCgoAJSYqA61NRtAwxDg5MABVJjQDrURJU0vEuucoNCkiU0FWRSBQSE9ORSBMSVNUIjqJOpc6ojIyOow5NzY6gAC2Jj4DlzqiMTE6uiJJTlNFUlQgQSBORVcgVEFQRSBJTlRPIFRIRSBSRUNPUkRFUiwgU0VUIjs6uiJPTiBSRUNPUkQsIEFORCBQUkVTUyAnUkVUVVJOJyAiOzqEIiI7UyQA1iZIA4FJ0DHBMTUwMDqCOrc6gUnQMcEyMDAwOoI6twARJ1IDlzqiMTI6uiJUSEUgUFJPR1JBTSBBTkQgREFUQSBIQVZFIEJFRQ==",
"KcjiKDEwMDEp0DE5MsRESVNL0DEAMyXWAa1ESVNLxLrnKDQpIk5PTU9OIEMsSSxPIjqXAGAl9AGyCgpHRVQgQUREUkVTUyBPRiBGSVJTVCBEQVRBIFNUQVRFTUVOVAoKAIMl/gGqU1RBUlTQKOIoMTAzKcjiKDEwNCnKMjU2yDQ1OCkAoyUmArIKClNFVCBGQVNUL1NMT1cgU0VBUkNICwsKCgCtJTACqk9Q0DAAuCU6AqsyNTAwMADSJbwCsgoKQUNUSVZBVEUgUFJJTlRFUgoKANwlxgKKU0w6sQD5Je4CsgoKREUtQUNUSVZBVEUgUFJJTlRFUgoKAAIm+AKKMA==",
"Li4AMCRbAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAF4kXAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCMJF0Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AuiReAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uANQkkAGyCgpTRVQgUFJJTlRFUiBTTE9UCgoA3iSaAapTTNAxAPUkwgGyCgpESVNLIFNZU1RFTT8/CgoAFCXMAa3iKDk5NA==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBKI1YBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AeCNXAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKYjWAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDUI1kBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AAiRaAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4ANiJQAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAGQiUQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCSIlIBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AwCJTAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAO4iVAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAcI1UBg1wuLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBQIUsBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AfiFMAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAKwhTQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDaIU4Bg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ACCJPAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4APCBFAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAGogRgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCYIEcBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AxiBIAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAPQgSQGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAiIUoBg1wuLi4uLg==",
"XC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBWH0ABg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AhB9BAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uALIfQgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDgH0MBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ADiBEAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4AQh46AYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAHAeOwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCeHjwBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AzB49AYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAPoePgGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgAoHz8Bgw==",
"AC4dNAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgBcHTUBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4Aih02AYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uALgdNwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgDmHTgBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4AFB45AYNcLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ASBwvAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAHYcMAGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgCkHDEBg1wuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4A0hwyAYNcLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uAAAdMwGDXC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg==",
"rccDrsgDrMkDYInppaCzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"wAILAUzXAkz3AkwXA7DLuaCwotPJgaClxAIBIKsDogGp/53RAp3TAsoQ96ABsTyNzgLIsTyN0AJMNAMgqwOiAb3RAjAIySOQBKkB0CggOAOwE6AOsTyNygKQDiCrA6IAIDgDkASpAtAMvc0ChQ+9zwKFEKkAjckCILwDYI7GA6zLAoiMygOpAKADkTzuygOtygPNzALwD73TAhAR/tECvdECySOQAhhgqQ+d0wKpAKAIkTytygPIkTy9zQKgAZE8vc8CyJE8yL3RAsiRPMi90wKRPKAMvdUCkTwg4wMg2QMgtAOQAWCuxgPe0wJMSAONxwOOyAOMyQMg4wOFPYQ8YA==",
"AAAAAAAAAAAAAAAAHw4fDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
],
[
"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"
],
[
"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"
],
[
"xM/OxY0Azs+gxsnMxdOg08XMxcPUxcSHjQDEydPLoMbVzMyNAMTJ08ug19LJ1MWg0NLP1MXD1MXEjQDGyczFoMzPw8vFxI0Aya/PoMXS0s/SjQDJztbBzMnEoMbJzMXOwc3FAIeHyc7T1cbGycPJxc7UoM3Fzc/S2aDUz6DS1c6g0NLPx9LBzY0AqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgoKCgoKCgoMHQ0MzFoN3boMbJzMWgxMXWxczP0MXSoKCgoKCgoKqqoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoA==",
"16DGyczFoM7BzcWgxs/SoNTIxaDDz9DZoM/SjbzSxdTV0s6+oNTPoNLF0MzBw8WgxdjJ09TJzsegxsnMxaDP0o28w9TSzK3DvrzSxdTV0s6+oNTPoMPBzsPFzKDDz9DZjboAAMXS0s/SrqCgoMPPxMW9AI3Xz9XMxKDZz9WgzMnLxaDUz6DNwcvFoMHOz9TIxdKgw8/Q2b+gAI3JztPF0tSg08/V0sPFoMTJ08ugwc7EoNDSxdPToMGgy8XZAI3JztPF0tSgxMXT1MnOwdTJz86gxMnTy6DBzsSg0NLF09OgwaDLxdmgAMTPoNnP1aDXwc7UoNDSz83Q1MnOx7+gAA==",
"Fb0V5xX/FQUWGRYkFjoWRxZSFmMWiRYqF8kX8xTkF+8X/hcOGDEYRBhOGFMYahh3GIUYhRiFGIUYhRifGMgY1xioGJEYtBjlGPMY08/V0sPFoNPMz9S/AKCgoKCgoMTSydbFvwDExdPUyc7B1MnPzqDTzM/UvwCgoKCgoKCgoKCgoMTSydbFvwDGyczFzsHNxb8Ayc7TxdLUoMTJ08vTrqCg0NLF09OgvMXTw76g1M+g0sXU1dLOoNTPoKDNwcnOoM3FztWgz9Kgwc7ZoM/UyMXSoMvF2aDUz6DCxcfJzo0AjcHM0sXBxNmgxdjJ09TTrqCNANTZ0MWgyc6gwaDOxQ==",
"2v1M0wOiEyDNCq4cE5qiAI6tEyAdC0wOCM+goIGgpbHsoIOgoKKgxsnMxaCAoPCggaClsKCYoKWgoLqkgKCHoMigoK+ypaC6oMmgAMbJzMXOwc3FuqCgncyq06/YoKDUiaCMoKDIoICgoKCg5arSoKCgoOAAoLnFhKCGoKCwoK+grKCgz6DMoKSgoNDMoM6SoJCw6MiksKCgwcWgoKCquqDNoKCNusDjoKmuoK+iz4WxsrO0tba3uLkAt7kAtrK1s7S4ALEAsrezuQBlDqkN1w2WDYMNaA2yDb0Nyw1RGVEbURxRGlEdPBlKFFcUZBR2FIgUkhQmE+AUYxVyFUsTmQ==",
"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"
]
]});

7
json/disks/index.js Normal file
View File

@ -0,0 +1,7 @@
disk_index = [
{
"filename": "json/disks/dos33master.json",
"name": "DOS 3.3 Master",
"category": "System"
}
];

132
scripts/dsk2js.pl Executable file
View File

@ -0,0 +1,132 @@
#!/usr/bin/perl -w
# Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation. No representations are made about the suitability of this
# software for any purpose. It is provided "as is" without express or
# implied warranty.
use MIME::Base64 qw(encode_base64);
use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
my %opts;
getopts('rn:c:t:', \%opts);
sub HELP_MESSAGE() {
my $fh = shift;
print $fh "dsk2js.pl [-c category] [-n name] [-t type] imagefile\n"
};
sub VERSION_MESSAGE() { my $fh = shift; print $fh "Version 1.0\n" };
open(DISK, $ARGV[0]) or die $!;
binmode(DISK);
my ($name, $ext) = $ARGV[0] =~ /([^\/]+)\.(dsk|po|2mg)$/i;
my $rv;
my $buffer;
my $readOnly = 0;
my $volume = 0;
my $category = "Misc";
$name = $opts{'n'} if ($opts{'n'});
$category = $opts{'c'} if ($opts{'c'});
$ext = $opts{'t'} if ($opts{'t'});
if ($opts{'r'}) {
$readOnly = 1;
}
$ext = lc($ext);
my $tmp;
my $offset = 0;
if ($ext eq '2mg') {
# $rv = read(DISK, $buffer, 0x40);
# Format
$offset += read(DISK, $buffer, 0x04);
$tmp = unpack("a[4]", $buffer);
if ($tmp ne '2IMG') {
print STDERR "Invalid format";
exit(1);
}
# Creator
$offset += read(DISK, $buffer, 0x04);
$tmp = unpack("a[4]", $buffer);
print STDERR "Creator: " . $tmp . "\n";
# Header Length
$offset += read(DISK, $buffer, 0x02);
my $header_length = unpack("v", $buffer);
# Version Number
$offset += read(DISK, $buffer, 0x02);
my $version_number = unpack("v", $buffer);
if ($version_number != 1) {
print STDERR "Unknown version: " . $version_number . "\n";
exit(1);
}
# Image Format
$offset += read(DISK, $buffer, 0x04);
my $image_format = unpack("V", $buffer);
if ($image_format == 0) {
$ext = "dsk";
} elsif ($image_format == 1) {
$ext = "po";
} else {
print STDERR "Handled image format: " . $image_format;
exit(1);
}
print STDERR "Format: " . $ext . "\n";
# Flags
$offset += read(DISK, $buffer, 0x04);
my $flags = unpack("V", $buffer);
if ($flags & 0x80000000) {
$readOnly = 1;
}
if ($flags & 0x100) {
$volume = $flags & 0xff;
}
$rv = read(DISK, $buffer, $header_length - $offset);
}
my $sector = 0;
my $track = 0;
print "loadJSON({\n";
print " \"name\": \"$name\",\n";
print " \"type\": \"$ext\",\n";
print " \"category\": \"$category\",\n";
print " \"encoding\": \"base64\",\n";
if ($readOnly) {
print " \"readOnly\": true,\n";
}
if ($volume) {
print " \"volume\": \"$volume\",\n";
}
print " \"data\":\n";
print "[\n";
for ($track = 0; $track < 0x23; $track++) {
print ",\n" if ($track != 0);
print " [\n";
for ($sector = 0; $sector < 0x10; $sector++) {
print ",\n" if ($sector != 0);
$rv = read(DISK, $buffer, 0x100);
print " \"";
print encode_base64($buffer, "");
print "\"";
}
print "\n ]";
}
print "\n]});\n";
close(DISK);

64
scripts/index.pl Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/env perl -w
# Copyright 2010-2013 Will Scullin <scullin@scullinsteel.com>
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation. No representations are made about the suitability of this
# software for any purpose. It is provided "as is" without express or
# implied warranty.
use MIME::Base64 qw(encode_base64);
use JSON qw(from_json);
use Data::Dumper;
use Getopt::Std;
my $disk;
my @disks = ();
my %opts;
getopts('pe', \%opts);
while (<json/disks/*.json>) {
my $json;
my $fn = $_;
print STDERR "$fn\n";
open(DISK, $fn) or die $!;
while (<DISK>) {
my $line = $_;
$line =~ s/^loadJSON\(//;
$line =~ s/\);$//;
$json .= $line;
}
close(DISK);
$disk = from_json($json);
$disk->{'filename'} = $fn;
$disk->{'data'} = NULL;
push(@disks, $disk);
}
@disks = sort { $a->{'category'} . $a->{'name'} cmp $b->{'category'} . $b->{'name'} } @disks;
my $first = 1;
print "disk_index = [\n";
foreach $disk (@disks) {
next if $disk->{'private'} && !$opts{'p'};
next if $disk->{'2e'} && !$opts{'e'};
print ",\n" unless ($first);
print " {\n";
print " \"filename\": \"" . $disk->{'filename'} . "\",\n";
print " \"name\": \"" . $disk->{'name'} . "\",\n";
if ($disk->{'disk'}) {
print " \"disk\": \"" . $disk->{'disk'} . "\",\n";
}
print " \"category\": \"" . $disk->{'category'} . "\"\n";
print " }";
$first = 0;
}
print "\n];\n";