Wolfenstein 3-D!

This is a port of Wolf4SDL, which is derived from the original id
software source release. The port runs on top of the SDL plugin
runtime and is loaded as an overlay.

Licensing of the game code is not an issue, as discussed below
(essentially, the Debian project treats Wolf4SDL as GPLv2, with an
email from John Carmack backing it up):

  http://forums.rockbox.org/index.php?topic=52872

Included is a copy of MAME's Yamaha OPL sound chip emulator
(fmopl_gpl.c).  This file was not part of the original Wolf4SDL source
(which includes a non-GPL'd version), but was rather rebased from from
a later MAME source which had been relicensed to GPLv2.

Change-Id: I64c2ba035e0be7e2f49252f40640641416613439
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 652a0b3..a0527c8 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -180,6 +180,7 @@
 wavplay,viewers
 wavrecord,apps
 wavview,viewers
+wolf3d,games
 wormlet,games
 xobox,games
 xworld,games
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 1ae0144..0ff6eb9 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -78,6 +78,7 @@
     (!defined(LCD_STRIDEFORMAT) || (LCD_STRIDEFORMAT != VERTICAL_STRIDE))
 #if (PLUGIN_BUFFER_SIZE > 0x14000) && defined(CPU_ARM)
 duke3d.c
+wolf3d.c
 #endif
 #endif
 
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index 055db43..04c3d76 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -8,7 +8,6 @@
 clock
 #endif
 
-
 /* For all targets with a bitmap display */
 #ifdef HAVE_LCD_BITMAP
 
@@ -22,7 +21,6 @@
     defined(CPU_ARM)
 sdl
 #endif
-
 puzzles
 #endif
 
diff --git a/apps/plugins/sdl/progs/wolf3d/Changes-dc.txt b/apps/plugins/sdl/progs/wolf3d/Changes-dc.txt
new file mode 100644
index 0000000..e613b0a
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/Changes-dc.txt
@@ -0,0 +1,17 @@
+1.7 <February 01, 2009>
+- Saved game description saved to VMS header
+- Adjustments made to LCD
+- VMU loading code improved
+- Miscellaneous code clean ups
+- Work started on new disc check code
+
+1.6 <October 04, 2008>
+- Getting the DC port up-to-date
+
+1.5 <May 25, 2008>
+- Mouse support
+- Weapon switch support
+- Controllers with C & Z button support
+- Command line parameters via 'params.txt' support
+- SOD mission pack support via menu
+- Commercial CD-ROM swap support
diff --git a/apps/plugins/sdl/progs/wolf3d/Changes.txt b/apps/plugins/sdl/progs/wolf3d/Changes.txt
new file mode 100644
index 0000000..0bf2170
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/Changes.txt
@@ -0,0 +1,157 @@
+Wolf4SDL v1.7 (released 2011-05-15, revision 256)
+ - Added support for Mac OS X
+   (thanks to Chris Ballinger)
+ - Added support for .sd1 SOD game files as delivered by Steam
+   by changing --mission parameter slightly
+   (thanks to Pickle)
+ - Added --windowed-mouse parameter to start windowed mode with grabbed mouse
+   (thanks to Jared Breland)
+ - Rain and snow speed fix (thanks to Tricob)
+ - Floor/ceiling fix (thanks to Tricob / Adam Biser)
+ - Fixed moon out of screen bug (thanks to Tricob)
+ - Rain/snow leaking ceilings fix (thanks to Adam Biser / Tricob)
+ - Per-user configuration/savegame directories (~/.wolf4sdl) on
+   Linux like systems per default (thanks to Jared Breland)
+ - Added --configdir parameter
+ - Use SDL_DOUBLEBUF for vsync to avoid or at least reduce flickering
+   (thanks to Greg Ayrton for the hint, use --nodblbuf to disable it)
+ - Removed remainings of the frame rate counter on screen, when disabled
+ - Don't quit game when using TAB+E with --tedlevel
+ - Added --extravbls parameter
+ - Changed default for "extra VBLs" from 1 to 0
+ - Fixed missing umask parameter for open with O_CREAT
+   (bug reported by Daniel Fass)
+ - Fixed support for 1.0 shareware data files
+   (bug reported by Marcus Naylor)
+ - Fixed xtile and ytile not being valid in HitHorizWall and HitVertWall,
+   respectively. This caused problems with some tutorials.
+ - Removed unused HitHorizPWall and HitVertPWall.
+
+Wolf4SDL v1.6 (released 2008-09-01, revision 233)
+ - Fixed songs not really supporting more than 64kb
+ - Try to recognize whether data files don't fit to program version
+   instead of just using them and probably crash
+   (can be disabled with --ignorenumchunks)
+ - Fizzle fade now works for resolutions up to 8191x4095
+   (thanks to Xilinx, Inc. for the list of maximum-length LFSR counters)
+ - Fixed demos being dependent on actual duration of GETGATLINGSND
+   (fixes second demo, which even rarely worked in vanilla Wolf3D)
+ - Fixed demos by disabling some bugfixes during recording and playback
+   (see PLAYDEMOLIKEORIGINAL define in version.h)
+ - Removed system menu on Windows in windowed mode to avoid ALT to open it
+ - Fixed palette issues occurring on some Windows systems by using the
+   "best" color depth reported by libSDL per default (also see --bits option)
+ - Fixed directional 3d sprites on architectures only allowing aligned memory
+   access (bug reported by Pickle)
+ - Fixed remaining status bar after end of demo in 320x240s resolutions
+   (bug reported by Pickle)
+ - Removed last busy waiting (fixes very unstable framerates on machines with
+   stricter schedulers like FreeBSD; thanks to Tron for making me notice)
+ - Fixed compiling of SOD on case sensitive file systems
+   (thanks to Michael)
+
+Wolf4SDL v1.5 (released 2008-05-25, revision 215)
+ - Reduced minimum distance to back of moving pushwall to PLAYERSIZE
+ - Fixed pushwall rendering when player's eye is in the pushwall back tile
+   (bug reported by Pickle)
+ - Enable 'End game' menu item also when using --tedlevel
+ - Removed some unneccessary fade outs
+   (DrawPlayScreen does not call VW_FadeOut anymore!!)
+ - When using 'End game', 'View scores' does not directly show up anymore
+ - Fixed quickload/quicksave not working when started with --tedlevel (vanilla
+   bug). This now also only checks for save games once at startup (may speed
+   up entering the menu on Dreamcast)
+ - Fixed drawing moving pushwalls viewed at acute angles near the level border
+ - Fixed vanilla bug hiding bonus items on same tile as player, when he cannot
+   pick them up (e.g. medikit at 100% health) (thanks to Pickle for noticing)
+ - Added GP2X specific code by Pickle
+ - Reimplemented picture grabber to support all screen resolutions
+   (<TAB>+P in debug mode)
+ - Added --resf option to force to use unsupported resolutions >= 320x200
+ - Added support for resolutions being a multiple of 320x240
+   (thanks for your help, Pickle!)
+ - Fixed crash when cheat-hurting oneself to death (bug reported by Tricob)
+ - Cleaned up id_sd.cpp (kept PC speaker stuff for future reference)
+ - Added move buttons (invalidates config file, only hardcoded yet)
+ - Added joystick support to US_LineInput used for highscore names
+   and save games
+ - Added US_Printf and US_CPrintf (works just like printf)
+ - Fixed wrong surface locks/unlocks
+ - Added Visual C++ 6 support
+ - Removed some useless VW_WaitVBLs (Thanks to TexZK)
+ - Added some asserts in id_vl.cpp to check for screen access out of bounds
+ - Fixed BJ face popping up in fullsize mode sometimes
+   (Thanks to Andy_Nonymous)
+ - Rewrote page manager to support page >= 64kB
+   and to correctly handle sounds >= 4kB
+ - Improved SOD mission packs support (Thanks to fackue)
+ - Updated Code::Blocks search paths to ..\SDL-devel\
+ - Added version.h to Dev-C++ and Code::Blocks project file
+ - Fixed some files being read in text mode on MinGW
+
+Wolf4SDL v1.4 (released 2008-03-10, revision 164)
+ - Added MinGW/MSYS compatibility
+ - Updated Code::Blocks project
+ - Updated Dev-C++ project and added a README-devcpp.txt
+ - Fixed some busy waiting situations
+ - Added directional 3D sprites support (USE_DIR3DSPR)
+ - Added support for Spear mission packs (by fackue)
+ - Added support for Wolf3D full v1.1 and shareware v1.0, v1.1 and v1.2
+ - Added shading support (USE_SHADING)
+ - Added object flags (see objflag_t enum in wl_def.h)
+ - Reintroduced version.h
+ - Increased MAXVISABLE from 50 to 250
+ - Added outside atmosphere features (USE_STARSKY, USE_RAIN, USE_SNOW)
+ - Added cloud sky support (USE_CLOUDSKY)
+ - Added support for SoD demo
+ - Fixed SoD on systems with case sensitive filenames
+ - Added DarkOne's/Adam's multi-textured floors/ceiling (USE_FLOORCEILINGTEX)
+ - Added parallax sky support (USE_PARALLAX define)
+ - Introduced level feature flags (USE_FEATUREFLAGS define)
+ - Added high resolution support (USE_HIRES define)
+ - Added support for music > 64 kB as supported by WDC
+ - Added --samplerate and --audiobuffer parameters
+ - Added support for GP2X (ARM processor, thanks to Pickle)
+ - Added support for Dreamcast (SH-4 processor, thanks to fackue)
+ - Added joystick support (up to 32 buttons)
+
+Wolf4SDL v1.3 (released 2008-01-20, revision 113)
+ - Added parameter for SOD to disable copy protection quiz
+ - F12 now also grabs the mouse (for keyboards without scrolllock)
+ - Fixed out of bounds array access in key processing
+
+Wolf4SDL v1.2 (released 2008-01-09, revision 108)
+ - Fixed fading for 'End Game'
+ - Corrected fading speed
+ - Added Spear of Destiny compile support
+ - Reimplemented palette file (Sorry...)
+ - Fixed end game crash, when player did not die yet
+   (Thanks to Agent87 for noticing this bug!)
+ - Added full size screen feature
+ - Added project files for Code::Blocks and Dev-C++
+   (Thanks to Codetech84!)
+ - Made it MinGW compatible
+ - Fixed demo fading issues
+ - Reformatted many source code files
+ - Resolved all warnings reported by VC++ 8 and GCC
+ - Fixed crash when starting the game with no sound >effects<
+   (Thanks to Agent87 for noticing this bug!)
+ - Always grab mouse when started in fullscreen
+ - Map left and right alt, shift and ctrl keys to the same keys
+ - Fix numpad keys with numlock off
+ - Fixed a buffer overflow causing a crash
+
+Wolf4SDL v1.1 (released 2007-12-28, revision 70)
+ - Fixed Pause
+ - Fixed IN_Ack()
+ - Added command line parameters for windowed mode and screen resolution
+ - Reimplemented command line parameters (try --help)
+ - Improved scaled "Get Psyched" progress bar graphic
+ - Improved scaled screen borders
+ - Fixed "Fade in black screen" bug
+ - Avoid asserts when shutting down with an error
+ - Use software surfaces to reduce problems with palette on Windows
+ - Windows: Statically links to MSVCR80.DLL now to avoid missing files
+
+Wolf4SDL v1.0 (released 2007-12-26, revision 53)
+ - Initial release
diff --git a/apps/plugins/sdl/progs/wolf3d/README-GP2X.txt b/apps/plugins/sdl/progs/wolf3d/README-GP2X.txt
new file mode 100644
index 0000000..41ca30e
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/README-GP2X.txt
@@ -0,0 +1,70 @@
+Wolf4SDL by Moritz "Ripper" Kroll (http://www.chaos-software.de.vu)
+Original Wolfenstein 3D by id Software (http://www.idsoftware.com)
+GP2X support by Pickle
+
+Source and Windows Binary: http://www.stud.uni-karlsruhe.de/~uvaue/chaos/downloads.html
+GP2X Binary: http://archive.gp2x.de/cgi-bin/cfiles.cgi?0,0,0,0,20,2479
+
+SUMMARY:
+See main README.txt
+
+
+GP2X CONTROLS:
+Directional:    these are mapped to the arrow keys.
+A :             mapped to space, which opens doors
+B :             mapped to left shift, which enables running. Also mapped
+                to key n, for the NO response in the menu.
+X :             mapped to left control, which enables shooting.
+Y :             mapped to the number keys, to select weapons. It cycles
+                through each weapon in order. Also mapped to key y, for
+                the YES responses in the menu.
+** NOTE: In "enter text" mode each button sends its letter,
+         for example a=a, y=y
+
+Select:         mapped to the escape key
+Start:          mapped to the enter key
+Select+Start:   mapped to pause
+
+Shoulder Left:  this is mapped in a way to strafe left
+Shoulder Right: this is mapped in a way to strafe right
+** NOTE: If you press both the left and right shoulder buttons the statusbar
+         will be shown in the fullscreen mode described above.
+
+Volume Buttons: raise and lower the volume.
+
+Either Volume Button + Select: show fps
+Either Volume Button + Start:  take a screenshot
+
+
+** NOTE: The directional stick is given precedence over the strafe keys.
+         For example if you hold the shoulder right to strafe right and you
+         then move the stick right you will stop strafing and turn. If you
+         then release the stick you will resume strafing the right.
+         (I've tested this and it seems to work fairly well)
+
+
+INSTALL:
+Pick your Wolf4SDL binary and copy the files at the root of the zip to any
+folder together with the data files of the according game (e.g. *.WL6 for
+Wolfenstein 3D or *.SOD for Spear of Destiny).
+The binaries do not restart the GP2X menu application.
+If you use GMenu2x, select the wrapper option for your icon.
+If you use the GPH menu, you will have to create your own script to restart it.
+
+
+Compiling from source code:
+I used the Code::Blocks dev kit. (http://archive.gp2x.de/cgi-bin/cfiles.cgi?0,0,0,0,14,2295)
+You can use the template example. Add all of the source files to the project.
+Under build options (pick your GP2X compilier) and under "Compilier Settings"
+-> "Defines" add GP2X. Just press the build button.
+The Makefile should also work for linux type environments, although I have
+not tried it this way. If you use it, the GP2X define should be added to the
+Makefile using CFLAGS += -DGP2X.
+
+I also added the compiler flags
+"-fmerge-all-constants -ffast-math -funswitch-loops"
+which give a good performance increase.
+For Code::Blocks put this line in "Compiler Settings" - "Other Options".
+
+PERFORMANCE:
+The game runs good at 200 Mhz.
diff --git a/apps/plugins/sdl/progs/wolf3d/README-dc.txt b/apps/plugins/sdl/progs/wolf3d/README-dc.txt
new file mode 100644
index 0000000..ebdf446
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/README-dc.txt
@@ -0,0 +1,85 @@
+Wolf4SDL\DC 1.7
+ported to Dreamcast by dcbasic
+
+A port of Wolf4SDL by Moritz "Ripper" Kroll.
+
+What's new in 1.7:
+- See Changes-dc.txt
+
+Instructions:
+- Extract the Wolf4SDL\DC archive to it's own folder.
+- Put your *.wl6 files inside /cd/data/wolf3d (if you have a commercial CD-ROM
+  release of Wolfenstein you can skip this step).
+- If you want to use the command line, create a text file called 'args.txt'
+  (without quotes) in the /cd/data/wolf3d folder and add any valid
+  arguments. Please keep them on one line.
+- Download and install BootDreams (http://dchelp.dcemulation.org/?BootDreams).
+- Open the folder you extracted Wolf4SDL\DC to in BootDreams.
+- Select a task. If you'd like to burn Wolf4SDL\DC directly to a CD-R, select
+  the CDRecord task and set the disc format to either Audio\Data or Data\Data
+  (both do essentially the same thing).
+- Click Process.
+- If you created a CD image, burn it with the appropriate burning program
+  e.g. Alcohol 120%.
+- Pop the CD-R in your Dreamcast and play.
+- If you have a commercial CD-ROM, wait until you're asked to swap in your
+  copy of Wolfenstein 3D, swap your copy in, press start and play.
+
+Valid Arguments:
+--goobers (Wolfenstein 3D only)
+--debugkeys (Spear of Destiny only)
+--goodtimes (Spear of Destiny only)
+--nowait
+--baby
+--easy
+--normal
+--hard
+--tedlevel <level>
+--res <width> <height> (default 320x200)
+--resf <width> <height>
+--bits <screen_bits> (default 8)
+--dblbuf
+--extravbls <vbls>
+--samplerate <rate> (default 11025)
+--audiobuffer <size> (default 4096)
+
+Notes:
+- The --res argument will also except '640 400' but will slow rendering down
+  greatly. The width must be a multiple of 320 and the height must be a
+  multiple of 200 or 240.
+- The --resf argument will force the passed screen resolution but may result
+  in graphic corruption.
+- The default samplerate is 11025 to keep the extra SOD missions from running
+  out of memory. Wolfenstein 3D and the original SOD mission will happily run
+  with the samplerate set to 22050.
+- The --dblbuf argument works but slows speed down by about 10 frames.
+
+Compiling:
+This port was developed under Code::Blocks 8.02 with the DC Dev ISO R4
+integrated within it. I've also included a Makefile in case you don't use
+Code::Blocks. You will need SDL and SDL mixer to compile Wolf4SDL\DC.
+
+DC Dev ISO can be downloaded from here:
+http://dcemulation.org/?title=DC_Dev_ISO
+
+It contains everything you need to compile Wolf4SDL. It includes Code::Blocks
+8.02 and a tool to integrate Code::Blocks with DC Dev ISO. It uses Cygwin as
+the terminal environment and includes the DC compilers and all the SDL
+libraries that are needed to compile Wolf4SDL.
+
+To compile Wolf4SDL\DC under Code::Blocks, extract the source to it's own
+folder, open 'Wolf4SDL-DC.cbp' and goto 'Build' | 'Build'.
+
+To compile Wolf4SDL\DC using the supplied Makefile, extract the source to it's
+own directory in C:\cygwin\usr\local\dc and type 'make -f Makefile.dc' in your
+terminal while inside the folder Wolf4SDL\DC was extracted to. By default the
+Makefile will create a scrambled 1ST_READ.BIN, unscrambled Wolf4SDL.bin and of
+course, Wolf4SDL.elf.
+
+Credits & Thanks:
+- OneThiryt8 for which parts of this port was based on his port, sdlWolf
+- BlueCrab who wrote parts of the swap disc menu
+- BlackAura for which I stole parts of his menu code from nxDoom
+- Ripper for such a clean and friendly Wolfenstein 3D engine
+- Bero for the Dreamcast port of SDL, which this port uses
+- Dan Potter and team for KOS, which this port uses
diff --git a/apps/plugins/sdl/progs/wolf3d/README-devcpp.txt b/apps/plugins/sdl/progs/wolf3d/README-devcpp.txt
new file mode 100644
index 0000000..e013c48
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/README-devcpp.txt
@@ -0,0 +1,43 @@
+This file explains how you can compile Wolf4SDL using Bloodshed's Dev-C++.
+Keep in mind, that Dev-C++ is a dead project since 2005. The recommended way
+to compile Wolf4SDL on Windows is using Visual Studio 2005 C++ or the free
+Visual C++ 2005 Express. But for dial-up users Dev-C++ is probably still a
+good option.
+
+Needed files:
+ - "Dev-C++ 5.0 Beta 9.2 (4.9.9.2)" with Mingw/GCC 3.4.2 (about 9 MB)
+   http://www.bloodshed.net/dev/devcpp.html
+ - SDL-1.2.13-1chaos.DevPak (544 kB)
+   http://www.chaos-software.de.vu -> Downloads
+ - SDL_mixer-1.2.6-2mol.DevPak (347 kB)
+   http://sourceforge.net/project/showfiles.php?group_id=94270&package_id=151751
+
+Installation:
+ - Install Dev-C++ to C:\Dev-Cpp
+ - Open Wolf4SDL.dev
+ - Go to "Tools" -> "Package Manager"
+ - Click on the "Install" button in the toolbar
+ - Select "SDL-1.2.13-1chaos.DevPak" (where ever you saved it)
+ - Some "Next" buttons and a "Finish" button later...
+ - Click on the "Install" button in the toolbar
+ - Select "SDL_mixer-1.2.6-2mol.DevPak" (where ever you saved it)
+ - Some "Next" buttons and a "Finish" button later...
+ - Close the Package Manager
+
+Data file setup:
+ - Copy the data files (e.g. *.WL6) you want to use to the Wolf4SDL
+   source code folder
+ - If you want to use the data files of the full Activision version of
+   Wolfenstein 3D v1.4, you can just skip to the next section
+ - Otherwise open "version.h" and comment/uncomment the definitions
+   according to the description given in this file
+
+Compiling Wolf4SDL:
+ - Compile via "Execute" -> "Compile"
+ - No errors should be displayed
+ - Run Wolf4SDL via "Execute" -> "Run"
+
+Troubleshooting:
+ - If you get an error message "undefined reference to `__cpu_features_init'",
+   make sure, there is no c:\mingw folder. Otherwise Dev-C++ will mix different
+   versions of MinGW libraries...
diff --git a/apps/plugins/sdl/progs/wolf3d/README.txt b/apps/plugins/sdl/progs/wolf3d/README.txt
new file mode 100644
index 0000000..c6683ec
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/README.txt
@@ -0,0 +1,224 @@
+Wolf4SDL by Moritz "Ripper" Kroll (http://www.chaos-software.de.vu)
+Original Wolfenstein 3D by id Software (http://www.idsoftware.com)
+=============================================================================
+
+Wolf4SDL is an open-source port of id Software's classic first-person shooter
+Wolfenstein 3D to the cross-plattform multimedia library "Simple DirectMedia
+Layer (SDL)" (http://www.libsdl.org). It is meant to keep the original feel
+while taking advantage of some improvements mentioned in the list below.
+
+
+Main features:
+--------------
+
+ - Cross-plattform:
+      Supported operating systems are at least:
+       - Windows 98, Windows ME, Windows 2000, Windows XP, Windows Vista
+         (32 and 64 bit), Windows 7 (32 and 64 bit)
+       - Linux
+       - BSD variants
+       - Mac OS X (x86)
+       - KallistiOS (used for Dreamcast)
+      Only little endian platforms like x86, ARM and SH-4 are supported, yet.
+
+ - AdLib sounds and music:
+      This port includes the OPL2 emulator from MAME, so you can not only
+      hear the AdLib sounds but also music without any AdLib-compatible
+      soundcard in near to perfect quality!
+
+ - Multichannel digitized sounds:
+      Digitized sounds play on 8 channels! So in a fire fight you will
+      always hear, when a guard opens the door behind you ;)
+
+ - Higher screen resolutions:
+      Aside from the original 320x200 resolution, Wolf4SDL currently
+      supports any resolutions being multiples of 320x200 or 320x240,
+      the default being 640x400.
+      Unlike some other ports, Wolf4SDL does NOT apply any bilinear
+      or similar filtering, so the graphics are NOT blurred but
+      pixelated just as we love it.
+
+ - Fully playable with only a game controller:
+      Wolf4SDL can be played completely without a keyboard. At least two
+      buttons are required (shoot/YES and open door/NO), but five or more
+      are recommended (run, strafe, ESC).
+
+Additional features:
+--------------------
+
+ - Two additional view sizes:
+      Wolf4SDL supports one view size using the full width of the screen
+      and showing the status bar, like in Mac-enstein, and one view size
+      filling the whole screen (press TAB to see the status bar).
+
+ - (Nearly) unlimited sound and song lengths:
+      Mod developers are not restricted to 64kB for digitized sounds and
+      IMF songs anymore, so longer songs and digitized sounds with better
+      quality are possible.
+
+ - Resuming ingame music:
+      When you come back to the game from the menu or load a save game, the
+      music will be resumed where it was suspended rather than started from
+      the beginning.
+
+ - Freely movable pushwalls:
+      Moving pushwalls can be viewed from all sides, allowing mod developers
+      to place them with fewer restrictions. The player can also follow the
+      pushwall directly instead of having to wait until the pushwall has left
+      a whole tile.
+
+ - Optional integrated features for mod developers:
+      Wolf4SDL already contains the shading, directional 3D sprites,
+      floor and ceiling textures, high resolution textures/sprites,
+      parallax sky, cloud sky and outside atmosphere features, which
+      can be easily activated in version.h.
+
+
+The following versions of Wolfenstein 3D data files are currently supported
+by the source code (choose the version by commenting/uncommenting lines in
+version.h as described in that file):
+
+ - Wolfenstein 3D v1.1 full Apogee
+ - Wolfenstein 3D v1.4 full Apogee (not tested)
+ - Wolfenstein 3D v1.4 full GT/ID/Activision
+ - Wolfenstein 3D v1.0 shareware Apogee
+ - Wolfenstein 3D v1.1 shareware Apogee
+ - Wolfenstein 3D v1.2 shareware Apogee
+ - Wolfenstein 3D v1.4 shareware
+ - Spear of Destiny full
+ - Spear of Destiny demo
+ - Spear of Destiny - Mission 2: Return to Danger (not tested)
+ - Spear of Destiny - Mission 3: Ultimate Challenge (not tested)
+
+
+How to play:
+------------
+
+To play Wolfenstein 3D with Wolf4SDL, you just have to copy the original data
+files (e.g. *.WL6) into the same directory as the Wolf4SDL executable.
+Please make sure, that you use the correct version of the executable with the
+according data files version as the differences are hardcoded into the binary!
+
+On Windows SDL.dll and SDL_mixer.dll must also be copied into this directory.
+They are also available at http://www.chaos-software.de.vu
+
+If you play in windowed mode (--windowed parameter), press SCROLLLOCK or F12
+to grab the mouse. Press it again to release the mouse.
+
+
+Usage:
+------
+
+Wolf4SDL supports the following command line options:
+ --help                 This help page
+ --tedlevel <level>     Starts the game in the given level
+ --baby                 Sets the difficulty to baby for tedlevel
+ --easy                 Sets the difficulty to easy for tedlevel
+ --normal               Sets the difficulty to normal for tedlevel
+ --hard                 Sets the difficulty to hard for tedlevel
+ --nowait               Skips intro screens
+ --windowed[-mouse]     Starts the game in a window [and grabs mouse]
+ --res <width> <height> Sets the screen resolution
+                        (must be multiple of 320x200 or 320x240)
+ --resf <w> <h>         Sets any screen resolution >= 320x200
+                        (which may result in graphic errors)
+ --bits <b>             Sets the screen color depth
+                        (Use this when you have palette/fading problem
+                        or perhaps to optimize speed on old systems.
+                        Allowed: 8, 16, 24, 32, default: "best" depth)
+ --nodblbuf             Don't use SDL's double buffering
+ --extravbls <vbls>     Sets a delay after each frame, which may help to
+                        reduce flickering (SDL does not support vsync...)
+                        (unit is currently 8 ms, default: 0)
+ --joystick <index>     Use the index-th joystick if available
+ --joystickhat <index>  Enables movement with the given coolie hat
+ --samplerate <rate>    Sets the sound sample rate (given in Hz)
+ --audiobuffer <size>   Sets the size of the audio buffer (-> sound latency)
+                        (given in bytes)
+ --ignorenumchunks      Ignores the number of chunks in VGAHEAD.*
+                        (may be useful for some broken mods)
+ --configdir <dir>      Directory where config file and save games are stored
+                        (Windows default: current directory,
+                        others: $HOME/.wolf4sdl)
+
+For Spear of Destiny the following additional options are available:
+ --mission <mission>    Mission number to play (1-3)
+ --goodtimes            Disable copy protection quiz
+
+
+Compiling from source code:
+---------------------------
+
+The current version of the source code is available in the svn repository at:
+   svn://tron.homeunix.org:3690/wolf3d/trunk
+
+The following ways of compiling the source code are supported:
+ - Makefile (for Linux, BSD variants and MinGW/MSYS)
+ - Visual C++ 2008 (Wolf4SDL.VC9.sln and Wolf4SDL.VC9.vcproj)
+ - Visual C++ 2005 (Wolf4SDL.sln and Wolf4SDL.vcproj)
+ - Visual C++ 6 (Wolf4SDL.dsw and Wolf4SDL.dsp)
+ - Code::Blocks 8.02 (Wolf4SDL.cbp)
+ - Dev-C++ 5.0 Beta 9.2 (4.9.9.2) (Wolf4SDL.dev) (see README-devcpp.txt)
+ - Xcode (for Mac OS X, macosx/Wolf4SDL.xcodeproj/project.pbxproj)
+ - Special compiling for Dreamcast (see README-dc.txt)
+ - Special compiling for GP2X (see README-GP2X.txt)
+
+To compile the source code you need the development libraries of
+ - SDL (http://www.libsdl.org/download-1.2.php) and
+ - SDL_mixer (http://www.libsdl.org/projects/SDL_mixer/)
+and have to adjust the include and library paths in the projects accordingly.
+
+Please note, that there is no official SDL_mixer development pack for MinGW,
+yet, but you can get the needed files from a Dev-C++ package here:
+http://sourceforge.net/project/showfiles.php?group_id=94270&package_id=151751
+Just rename the file extension from ".devpack" to ".tar.bz2" and unpack it
+with for example WinRAR. Then add the directories include/SDL and lib to the
+according search paths in your project.
+
+IMPORTANT: Do not forget to take care of version.h!
+   By default it compiles for "Wolfenstein 3D v1.4 full GT/ID/Activision"!
+
+
+TODOs:
+------
+
+ - Add PC speaker emulation
+ - Center non-ingame screens for resolutions being a multiple of 320x240
+ - Add support for any graphic resolution >= 320x200
+
+
+Known bugs:
+-----------
+
+ - None! ;D
+
+
+Troubleshooting:
+----------------
+
+ - If your frame rate is low, consider using the original screen resolution
+   (--res 320 200) or lowering the sound quality (--samplerate 22050)
+
+
+Credits:
+--------
+
+ - Special thanks to id Software! Without the source code we would still have
+   to pelt Wolfenstein 3D with hex editors and disassemblers ;D
+ - Special thanks to the MAME developer team for providing the source code
+   of the OPL2 emulator!
+ - Many thanks to "Der Tron" for hosting the svn repository, making Wolf4SDL
+   FreeBSD compatible, testing, bugfixing and cleaning up the code!
+ - Thanks to Chris for his improvements on Wolf4GW, on which Wolf4SDL bases.
+ - Thanks to Pickle for the GP2X support and help on 320x240 support
+ - Thanks to fackue for the Dreamcast support
+ - Thanks to Chris Ballinger for the Mac OS X support
+ - Thanks to Xilinx, Inc. for providing a list of maximum-length LFSR counters
+   used for higher resolutions of fizzle fade
+
+
+Licenses:
+---------
+
+ - The original source code of Wolfenstein 3D: license-id.txt
+ - The OPL2 emulator (fmopl.cpp): license-mame.txt
diff --git a/apps/plugins/sdl/progs/wolf3d/audiosod.h b/apps/plugins/sdl/progs/wolf3d/audiosod.h
new file mode 100644
index 0000000..1798ed4
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/audiosod.h
@@ -0,0 +1,142 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .SOD
+// Created Thu Aug 13 09:25:58 1992
+//
+/////////////////////////////////////////////////
+
+#define NUMSOUNDS		    81
+#define NUMSNDCHUNKS	    267
+
+//
+// Sound names & indexes
+//
+typedef enum {
+	HITWALLSND,              // 0
+	MISSILEHITSND,           // 1
+	SELECTITEMSND,           // 2
+	GHOSTSIGHTSND,           // 3
+	MOVEGUN2SND,             // 4
+	MOVEGUN1SND,             // 5
+	NOWAYSND,                // 6
+	NAZIHITPLAYERSND,        // 7
+	MISSILEFIRESND,          // 8
+	PLAYERDEATHSND,          // 9
+	DOGDEATHSND,             // 10
+	ATKGATLINGSND,           // 11
+	GETKEYSND,               // 12
+	NOITEMSND,               // 13
+	WALK1SND,                // 14
+	WALK2SND,                // 15
+	TAKEDAMAGESND,           // 16
+	GAMEOVERSND,             // 17
+	OPENDOORSND,             // 18
+	CLOSEDOORSND,            // 19
+	DONOTHINGSND,            // 20
+	HALTSND,                 // 21
+	DEATHSCREAM2SND,         // 22
+	ATKKNIFESND,             // 23
+	ATKPISTOLSND,            // 24
+	DEATHSCREAM3SND,         // 25
+	ATKMACHINEGUNSND,        // 26
+	HITENEMYSND,             // 27
+	SHOOTDOORSND,            // 28
+	DEATHSCREAM1SND,         // 29
+	GETMACHINESND,           // 30
+	GETAMMOSND,              // 31
+	SHOOTSND,                // 32
+	HEALTH1SND,              // 33
+	HEALTH2SND,              // 34
+	BONUS1SND,               // 35
+	BONUS2SND,               // 36
+	BONUS3SND,               // 37
+	GETGATLINGSND,           // 38
+	ESCPRESSEDSND,           // 39
+	LEVELDONESND,            // 40
+	DOGBARKSND,              // 41
+	ENDBONUS1SND,            // 42
+	ENDBONUS2SND,            // 43
+	BONUS1UPSND,             // 44
+	BONUS4SND,               // 45
+	PUSHWALLSND,             // 46
+	NOBONUSSND,              // 47
+	PERCENT100SND,           // 48
+	BOSSACTIVESND,           // 49
+	DEATHSCREAM4SND,         // 50
+	SCHUTZADSND,             // 51
+	AHHHGSND,                // 52
+	DEATHSCREAM5SND,         // 53
+	DEATHSCREAM7SND,         // 54
+	DEATHSCREAM8SND,         // 55
+	LEBENSND,                // 56
+	DEATHSCREAM6SND,         // 57
+	NAZIFIRESND,             // 58
+	BOSSFIRESND,             // 59
+	SSFIRESND,               // 60
+	SLURPIESND,              // 61
+	GHOSTFADESND,            // 62
+	DEATHSCREAM9SND,         // 63
+	GETAMMOBOXSND,           // 64
+	ANGELSIGHTSND,           // 65
+	SPIONSND,                // 66
+	NEINSOVASSND,            // 67
+	DOGATTACKSND,            // 68
+	ANGELFIRESND,            // 69
+	TRANSSIGHTSND,           // 70
+	TRANSDEATHSND,           // 71
+	WILHELMSIGHTSND,         // 72
+	WILHELMDEATHSND,         // 73
+	UBERDEATHSND,            // 74
+	KNIGHTSIGHTSND,          // 75
+	KNIGHTDEATHSND,          // 76
+	ANGELDEATHSND,           // 77
+	KNIGHTMISSILESND,        // 78
+	GETSPEARSND,             // 79
+	ANGELTIREDSND,           // 80
+	LASTSOUND
+} soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS		0
+#define STARTADLIBSOUNDS	81
+#define STARTDIGISOUNDS		162
+#define STARTMUSIC		    243
+
+//
+// Music names & indexes
+//
+typedef enum {
+	XFUNKIE_MUS,             // 0
+	DUNGEON_MUS,             // 1
+	XDEATH_MUS,              // 2
+	GETTHEM_MUS,             // 3
+	XTIPTOE_MUS,             // 4
+	GOINGAFT_MUS,            // 5
+	URAHERO_MUS,             // 6
+	XTHEEND_MUS,             // 7
+	NAZI_OMI_MUS,            // 8
+	POW_MUS,                 // 9
+	TWELFTH_MUS,             // 10
+	SEARCHN_MUS,             // 11
+	SUSPENSE_MUS,            // 12
+	ZEROHOUR_MUS,            // 13
+	WONDERIN_MUS,            // 14
+	ULTIMATE_MUS,            // 15
+	ENDLEVEL_MUS,            // 16
+	XEVIL_MUS,               // 17
+	XJAZNAZI_MUS,            // 18
+	COPYPRO_MUS,             // 19
+	XAWARD_MUS,              // 20
+	XPUTIT_MUS,              // 21
+	XGETYOU_MUS,             // 22
+	XTOWER2_MUS,             // 23
+	LASTMUSIC
+} musicnames;
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
diff --git a/apps/plugins/sdl/progs/wolf3d/audiowl6.h b/apps/plugins/sdl/progs/wolf3d/audiowl6.h
new file mode 100644
index 0000000..a29248d
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/audiowl6.h
@@ -0,0 +1,153 @@
+/////////////////////////////////////////////////
+//
+// MUSE Header for .WL6
+// Created Tue Jul 14 15:04:53 1992
+//
+/////////////////////////////////////////////////
+
+//
+// Sound names & indexes
+//
+typedef enum {
+	HITWALLSND,              // 0
+	SELECTWPNSND,            // 1
+	SELECTITEMSND,           // 2
+	HEARTBEATSND,            // 3
+	MOVEGUN2SND,             // 4
+	MOVEGUN1SND,             // 5
+	NOWAYSND,                // 6
+	NAZIHITPLAYERSND,        // 7
+	SCHABBSTHROWSND,         // 8
+	PLAYERDEATHSND,          // 9
+	DOGDEATHSND,             // 10
+	ATKGATLINGSND,           // 11
+	GETKEYSND,               // 12
+	NOITEMSND,               // 13
+	WALK1SND,                // 14
+	WALK2SND,                // 15
+	TAKEDAMAGESND,           // 16
+	GAMEOVERSND,             // 17
+	OPENDOORSND,             // 18
+	CLOSEDOORSND,            // 19
+	DONOTHINGSND,            // 20
+	HALTSND,                 // 21
+	DEATHSCREAM2SND,         // 22
+	ATKKNIFESND,             // 23
+	ATKPISTOLSND,            // 24
+	DEATHSCREAM3SND,         // 25
+	ATKMACHINEGUNSND,        // 26
+	HITENEMYSND,             // 27
+	SHOOTDOORSND,            // 28
+	DEATHSCREAM1SND,         // 29
+	GETMACHINESND,           // 30
+	GETAMMOSND,              // 31
+	SHOOTSND,                // 32
+	HEALTH1SND,              // 33
+	HEALTH2SND,              // 34
+	BONUS1SND,               // 35
+	BONUS2SND,               // 36
+	BONUS3SND,               // 37
+	GETGATLINGSND,           // 38
+	ESCPRESSEDSND,           // 39
+	LEVELDONESND,            // 40
+	DOGBARKSND,              // 41
+	ENDBONUS1SND,            // 42
+	ENDBONUS2SND,            // 43
+	BONUS1UPSND,             // 44
+	BONUS4SND,               // 45
+	PUSHWALLSND,             // 46
+	NOBONUSSND,              // 47
+	PERCENT100SND,           // 48
+	BOSSACTIVESND,           // 49
+	MUTTISND,                // 50
+	SCHUTZADSND,             // 51
+	AHHHGSND,                // 52
+	DIESND,                  // 53
+	EVASND,                  // 54
+	GUTENTAGSND,             // 55
+	LEBENSND,                // 56
+	SCHEISTSND,              // 57
+	NAZIFIRESND,             // 58
+	BOSSFIRESND,             // 59
+	SSFIRESND,               // 60
+	SLURPIESND,              // 61
+	TOT_HUNDSND,             // 62
+	MEINGOTTSND,             // 63
+	SCHABBSHASND,            // 64
+	HITLERHASND,             // 65
+	SPIONSND,                // 66
+	NEINSOVASSND,            // 67
+	DOGATTACKSND,            // 68
+	FLAMETHROWERSND,         // 69
+	MECHSTEPSND,             // 70
+	GOOBSSND,                // 71
+	YEAHSND,                 // 72
+#ifndef APOGEE_1_0
+	DEATHSCREAM4SND,         // 73
+	DEATHSCREAM5SND,         // 74
+	DEATHSCREAM6SND,         // 75
+	DEATHSCREAM7SND,         // 76
+	DEATHSCREAM8SND,         // 77
+	DEATHSCREAM9SND,         // 78
+	DONNERSND,               // 79
+	EINESND,                 // 80
+	ERLAUBENSND,             // 81
+	KEINSND,                 // 82
+	MEINSND,                 // 83
+	ROSESND,                 // 84
+	MISSILEFIRESND,          // 85
+	MISSILEHITSND,           // 86
+#endif
+	LASTSOUND
+} soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS		0
+#define STARTADLIBSOUNDS	LASTSOUND
+#define STARTDIGISOUNDS		(2*LASTSOUND)
+#define STARTMUSIC		    (3*LASTSOUND)
+
+//
+// Music names & indexes
+//
+typedef enum {
+	CORNER_MUS,              // 0
+	DUNGEON_MUS,             // 1
+	WARMARCH_MUS,            // 2
+	GETTHEM_MUS,             // 3
+	HEADACHE_MUS,            // 4
+	HITLWLTZ_MUS,            // 5
+	INTROCW3_MUS,            // 6
+	NAZI_NOR_MUS,            // 7
+	NAZI_OMI_MUS,            // 8
+	POW_MUS,                 // 9
+	SALUTE_MUS,              // 10
+	SEARCHN_MUS,             // 11
+	SUSPENSE_MUS,            // 12
+	VICTORS_MUS,             // 13
+	WONDERIN_MUS,            // 14
+	FUNKYOU_MUS,             // 15
+	ENDLEVEL_MUS,            // 16
+	GOINGAFT_MUS,            // 17
+	PREGNANT_MUS,            // 18
+	ULTIMATE_MUS,            // 19
+	NAZI_RAP_MUS,            // 20
+	ZEROHOUR_MUS,            // 21
+	TWELFTH_MUS,             // 22
+	ROSTER_MUS,              // 23
+	URAHERO_MUS,             // 24
+	VICMARCH_MUS,            // 25
+	PACMAN_MUS,              // 26
+	LASTMUSIC
+} musicnames;
+
+#define NUMSOUNDS		    LASTSOUND
+#define NUMSNDCHUNKS		(STARTMUSIC + LASTMUSIC)
+
+/////////////////////////////////////////////////
+//
+// Thanks for playing with MUSE!
+//
+/////////////////////////////////////////////////
diff --git a/apps/plugins/sdl/progs/wolf3d/f_spear.h b/apps/plugins/sdl/progs/wolf3d/f_spear.h
new file mode 100644
index 0000000..8043d60
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/f_spear.h
@@ -0,0 +1,76 @@
+#define STR_ENDGAME1	"We owe you a great debt, Mr. Blazkowicz."
+#define STR_ENDGAME2	"You have served your country well."
+#define STR_ENDGAME3	"With the spear gone, the Allies will finally"
+#define STR_ENDGAME4	"by able to destroy Hitler..."
+
+#define STR_COPY1		"That's close, but not close enough to get"
+#define STR_COPY2		"you into the game."
+
+#define STR_COPY3		"Wow, you must have the early version of the"
+#define STR_COPY4		"manual with the totally false information in it."
+
+#define STR_COPY5		"I would let you into the game, but seeing"
+#define STR_COPY6		"as that was not at all the right answer..."
+
+#define STR_COPY7		"It's just too bad we can't get together on"
+#define STR_COPY8		"this one.  Sorry."
+
+#define STR_COPY9		"Hey, you're just SO off base!"
+
+#define STR_COPY10		"You know, I once typed that myself when"
+#define STR_COPY11		"I was your age."
+
+#define STR_COPY12		"Nops.  Zero points.  Zugga."
+
+#define STR_COPY13		"Yeah...right."
+
+#define STR_COPY14		"You must like these quizzes."
+
+#define STR_COPY15		"Could be called \"PixelMeister\"?"
+
+#define STR_COPY16		"Might engineer some software?"
+
+#define STR_COPY17		"Would be found"
+#define STR_COPY18		"directing creatively?"
+
+#define STR_COPY19		"Might be found"
+#define STR_COPY20		"handling operations?"
+
+#define STR_COPY21		"Has a name familiar"
+#define STR_COPY22		"to your weatherman?"
+
+#define STR_NOPE1		"Welcome to the DOS prompt, pirate!"
+#define STR_NOPE2		"Eat hot DOS prompt, goober!"
+#define STR_NOPE3		"Ya know, this program doesn't cost that much."
+#define STR_NOPE4		"Hey...weren't you just AT this DOS prompt?"
+#define STR_NOPE5		"What's a nice user like you doin' at a DOS prompt like this?"
+#define STR_NOPE6		"Well, I'm sure you just \"misplaced\" the manual..."
+#define STR_NOPE7		"Run me again when you've boned up on your manual a bit."
+#define STR_NOPE8		"Nice try, but no Spear."
+#define STR_NOPE9		"That information is in the Spear of Destiny manual, by the way."
+
+#define STR_MISC1		"Under \"Killing the Enemy\", what"
+#define STR_MISC2		"type of enemy is pictured?"
+
+#define STR_MISC3		"How many eyelets are on B.J.'s"
+#define STR_MISC4		"boots? (see page 2)"
+
+#define STR_MISC5		"The word \"minister\" appears in"
+#define STR_MISC6		"what gray shape on page 2?"
+
+#define STR_MISC7		"How many bullets does B.J. have"
+#define STR_MISC8		"on the screen-shot in the middle"
+#define STR_MISC9		"of page 9?"
+
+#define STR_STAR	    "star"
+#define STR_DEBRIEF	    " DEBRIEFING\n SESSION\n"
+#define STR_ENEMY1	    "Name the member of the"
+#define STR_ENEMY2	    "enemy forces shown above"
+
+#define STR_CHECKMAN	"CHECK YER MANUAL!"
+#define STR_MAN1	    "Which manual page"
+#define STR_MAN2	    "is the Options Menu"
+#define STR_MAN3	    "function"
+#define STR_MAN4	    "on?"
+
+#define STR_ID1		    "Which member of Id Software:"
diff --git a/apps/plugins/sdl/progs/wolf3d/fmopl.h b/apps/plugins/sdl/progs/wolf3d/fmopl.h
new file mode 100644
index 0000000..f6a9c13
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/fmopl.h
@@ -0,0 +1,4 @@
+#define USE_GPL 1
+#if USE_GPL
+#include "fmopl_gpl.h"
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c b/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c
new file mode 100644
index 0000000..41178d6
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c
@@ -0,0 +1,2565 @@
+/*
+ * Rockbox notes:
+ *
+ * This file is originally from the MAME project, from after their
+ * GPLv2 relicense. I (Franklin Wei) have made some modifications
+ * since then to make it work with the Wolf4SDL source. Notably, I
+ * corrected the behavior of YM3812Write() to write directly to the
+ * registers. Additionally, I fixed an unaligned write in OPL_CALC_CH
+ * which caused terrible output on ARM.
+ */
+
+// license:GPL-2.0+
+// copyright-holders:Jarek Burczynski,Tatsuyuki Satoh
+/*
+**
+** File: fmopl.c - software implementation of FM sound generator
+**                                            types OPL and OPL2
+**
+** Copyright Jarek Burczynski (bujar at mame dot net)
+** Copyright Tatsuyuki Satoh , MultiArcadeMachineEmulator development
+**
+** Version 0.72
+**
+
+Revision History:
+
+04-08-2003 Jarek Burczynski:
+- removed BFRDY hack. BFRDY is busy flag, and it should be 0 only when the chip
+handles memory read/write or during the adpcm synthesis when the chip
+requests another byte of ADPCM data.
+
+24-07-2003 Jarek Burczynski:
+- added a small hack for Y8950 status BFRDY flag (bit 3 should be set after
+some (unknown) delay). Right now it's always set.
+
+14-06-2003 Jarek Burczynski:
+- implemented all of the status register flags in Y8950 emulation
+- renamed y8950_set_delta_t_memory() parameters from _rom_ to _mem_ since
+they can be either RAM or ROM
+
+08-10-2002 Jarek Burczynski (thanks to Dox for the YM3526 chip)
+- corrected ym3526_read() to always set bit 2 and bit 1
+to HIGH state - identical to ym3812_read (verified on real YM3526)
+
+04-28-2002 Jarek Burczynski:
+- binary exact Envelope Generator (verified on real YM3812);
+compared to YM2151: the EG clock is equal to internal_clock,
+rates are 2 times slower and volume resolution is one bit less
+- modified interface functions (they no longer return pointer -
+that's internal to the emulator now):
+- new wrapper functions for OPLCreate: ym3526_init(), ym3812_init() and y8950_init()
+- corrected 'off by one' error in feedback calculations (when feedback is off)
+- enabled waveform usage (credit goes to Vlad Romascanu and zazzal22)
+- speeded up noise generator calculations (Nicola Salmoria)
+
+03-24-2002 Jarek Burczynski (thanks to Dox for the YM3812 chip)
+Complete rewrite (all verified on real YM3812):
+- corrected sin_tab and tl_tab data
+- corrected operator output calculations
+- corrected waveform_select_enable register;
+simply: ignore all writes to waveform_select register when
+waveform_select_enable == 0 and do not change the waveform previously selected.
+- corrected KSR handling
+- corrected Envelope Generator: attack shape, Sustain mode and
+Percussive/Non-percussive modes handling
+- Envelope Generator rates are two times slower now
+- LFO amplitude (tremolo) and phase modulation (vibrato)
+- rhythm sounds phase generation
+- white noise generator (big thanks to Olivier Galibert for mentioning Berlekamp-Massey algorithm)
+- corrected key on/off handling (the 'key' signal is ORed from three sources: FM, rhythm and CSM)
+- funky details (like ignoring output of operator 1 in BD rhythm sound when connect == 1)
+
+12-28-2001 Acho A. Tang
+- reflected Delta-T EOS status on Y8950 status port.
+- fixed subscription range of attack/decay tables
+
+
+To do:
+add delay before key off in CSM mode (see CSMKeyControll)
+verify volume of the FM part on the Y8950
+*/
+
+#include "fmopl.h"
+
+
+
+/* output final shift */
+#if (OPL_SAMPLE_BITS==16)
+#define FINAL_SH    (0)
+#define MAXOUT      (+32767)
+#define MINOUT      (-32768)
+#else
+#define FINAL_SH    (8)
+#define MAXOUT      (+127)
+#define MINOUT      (-128)
+#endif
+
+
+#define FREQ_SH         16  /* 16.16 fixed point (frequency calculations) */
+#define EG_SH           16  /* 16.16 fixed point (EG timing)              */
+#define LFO_SH          24  /*  8.24 fixed point (LFO calculations)       */
+#define TIMER_SH        16  /* 16.16 fixed point (timers calculations)    */
+
+#define FREQ_MASK       ((1<<FREQ_SH)-1)
+
+/* envelope output entries */
+#define ENV_BITS        10
+#define ENV_LEN         (1<<ENV_BITS)
+#define ENV_STEP        (128.0/ENV_LEN)
+
+#define MAX_ATT_INDEX   ((1<<(ENV_BITS-1))-1) /*511*/
+#define MIN_ATT_INDEX   (0)
+
+/* sinwave entries */
+#define SIN_BITS        10
+#define SIN_LEN         (1<<SIN_BITS)
+#define SIN_MASK        (SIN_LEN-1)
+
+#define TL_RES_LEN      (256)   /* 8 bits addressing (real chip) */
+
+
+
+/* register number to channel number , slot offset */
+#define SLOT1 0
+#define SLOT2 1
+
+/* Envelope Generator phases */
+
+#define EG_ATT          4
+#define EG_DEC          3
+#define EG_SUS          2
+#define EG_REL          1
+#define EG_OFF          0
+
+
+/* save output as raw 16-bit sample */
+
+/*#define SAVE_SAMPLE*/
+
+#ifdef SAVE_SAMPLE
+static signed int acc_calc(signed int value)
+{
+    if (value>=0)
+    {
+        if (value < 0x0200)
+            return (value & ~0);
+        if (value < 0x0400)
+            return (value & ~1);
+        if (value < 0x0800)
+            return (value & ~3);
+        if (value < 0x1000)
+            return (value & ~7);
+        if (value < 0x2000)
+            return (value & ~15);
+        if (value < 0x4000)
+            return (value & ~31);
+        return (value & ~63);
+    }
+    /*else value < 0*/
+    if (value > -0x0200)
+        return (~abs(value) & ~0);
+    if (value > -0x0400)
+        return (~abs(value) & ~1);
+    if (value > -0x0800)
+        return (~abs(value) & ~3);
+    if (value > -0x1000)
+        return (~abs(value) & ~7);
+    if (value > -0x2000)
+        return (~abs(value) & ~15);
+    if (value > -0x4000)
+        return (~abs(value) & ~31);
+    return (~abs(value) & ~63);
+}
+
+
+static FILE *sample[1];
+#if 1   /*save to MONO file */
+#define SAVE_ALL_CHANNELS                               \
+    {   signed int pom = acc_calc(lt);                  \
+        fputc((unsigned short)pom&0xff,sample[0]);      \
+        fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+    }
+#else   /*save to STEREO file */
+#define SAVE_ALL_CHANNELS                               \
+    {   signed int pom = lt;                            \
+        fputc((unsigned short)pom&0xff,sample[0]);      \
+        fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+        pom = rt;                                       \
+        fputc((unsigned short)pom&0xff,sample[0]);      \
+        fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+    }
+#endif
+#endif
+
+#define LOG_CYM_FILE 0
+static FILE * cymfile = NULL;
+
+
+
+#define OPL_TYPE_WAVESEL   0x01  /* waveform select     */
+#define OPL_TYPE_ADPCM     0x02  /* DELTA-T ADPCM unit  */
+#define OPL_TYPE_KEYBOARD  0x04  /* keyboard interface  */
+#define OPL_TYPE_IO        0x08  /* I/O port            */
+
+/* ---------- Generic interface section ---------- */
+#define OPL_TYPE_YM3526 (0)
+#define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
+#define OPL_TYPE_Y8950  (OPL_TYPE_ADPCM|OPL_TYPE_KEYBOARD|OPL_TYPE_IO)
+
+
+
+struct OPL_SLOT
+{
+    UINT32  ar;         /* attack rate: AR<<2           */
+    UINT32  dr;         /* decay rate:  DR<<2           */
+    UINT32  rr;         /* release rate:RR<<2           */
+    UINT8   KSR;        /* key scale rate               */
+    UINT8   ksl;        /* keyscale level               */
+    UINT8   ksr;        /* key scale rate: kcode>>KSR   */
+    UINT8   mul;        /* multiple: mul_tab[ML]        */
+
+    /* Phase Generator */
+    UINT32  Cnt;        /* frequency counter            */
+    UINT32  Incr;       /* frequency counter step       */
+    UINT8   FB;         /* feedback shift value         */
+    INT32   *connect1;  /* slot1 output pointer         */
+    INT32   op1_out[2]; /* slot1 output for feedback    */
+    UINT8   CON;        /* connection (algorithm) type  */
+
+    /* Envelope Generator */
+    UINT8   eg_type;    /* percussive/non-percussive mode */
+    UINT8   state;      /* phase type                   */
+    UINT32  TL;         /* total level: TL << 2         */
+    INT32   TLL;        /* adjusted now TL              */
+    INT32   volume;     /* envelope counter             */
+    UINT32  sl;         /* sustain level: sl_tab[SL]    */
+    UINT8   eg_sh_ar;   /* (attack state)               */
+    UINT8   eg_sel_ar;  /* (attack state)               */
+    UINT8   eg_sh_dr;   /* (decay state)                */
+    UINT8   eg_sel_dr;  /* (decay state)                */
+    UINT8   eg_sh_rr;   /* (release state)              */
+    UINT8   eg_sel_rr;  /* (release state)              */
+    UINT32  key;        /* 0 = KEY OFF, >0 = KEY ON     */
+
+    /* LFO */
+    UINT32  AMmask;     /* LFO Amplitude Modulation enable mask */
+    UINT8   vib;        /* LFO Phase Modulation enable flag (active high)*/
+
+    /* waveform select */
+    UINT16  wavetable;
+};
+
+typedef struct OPL_SLOT OPL_SLOT;
+
+struct OPL_CH
+{
+    OPL_SLOT SLOT[2];
+    /* phase generator state */
+    UINT32  block_fnum; /* block+fnum                   */
+    UINT32  fc;         /* Freq. Increment base         */
+    UINT32  ksl_base;   /* KeyScaleLevel Base step      */
+    UINT8   kcode;      /* key code (for key scaling)   */
+};
+
+typedef struct OPL_CH OPL_CH;
+
+/* OPL state */
+struct FM_OPL
+{
+    // moved to beginning to fix alignment
+    signed int phase_modulation __attribute__((aligned));    /* phase modulation input (SLOT 2) */
+    signed int output[1] __attribute__((aligned));
+
+    /* FM channel slots */
+    OPL_CH  P_CH[9];                /* OPL/OPL2 chips have 9 channels*/
+
+    UINT32  eg_cnt;                 /* global envelope generator counter    */
+    UINT32  eg_timer;               /* global envelope generator counter works at frequency = chipclock/72 */
+    UINT32  eg_timer_add;           /* step of eg_timer                     */
+    UINT32  eg_timer_overflow;      /* envelope generator timer overlfows every 1 sample (on real chip) */
+
+    UINT8   rhythm;                 /* Rhythm mode                  */
+
+    UINT32  fn_tab[1024];           /* fnumber->increment counter   */
+
+    /* LFO */
+    UINT32  LFO_AM;
+    INT32   LFO_PM;
+
+    UINT8   lfo_am_depth;
+    UINT8   lfo_pm_depth_range;
+    UINT32  lfo_am_cnt;
+    UINT32  lfo_am_inc;
+    UINT32  lfo_pm_cnt;
+    UINT32  lfo_pm_inc;
+
+    UINT32  noise_rng;              /* 23 bit noise shift register  */
+    UINT32  noise_p;                /* current noise 'phase'        */
+    UINT32  noise_f;                /* current noise period         */
+
+    UINT8   wavesel;                /* waveform select enable flag  */
+
+    UINT32  T[2];                   /* timer counters               */
+    UINT8   st[2];                  /* timer enable                 */
+
+#if BUILD_Y8950
+    /* Delta-T ADPCM unit (Y8950) */
+
+    YM_DELTAT *deltat;
+
+    /* Keyboard and I/O ports interface */
+    UINT8   portDirection;
+    UINT8   portLatch;
+    OPL_PORTHANDLER_R porthandler_r;
+    OPL_PORTHANDLER_W porthandler_w;
+    void *  port_param;
+    OPL_PORTHANDLER_R keyboardhandler_r;
+    OPL_PORTHANDLER_W keyboardhandler_w;
+    void *  keyboard_param;
+#endif
+
+    /* external event callback handlers */
+    OPL_TIMERHANDLER  timer_handler;    /* TIMER handler                */
+    void *TimerParam;                   /* TIMER parameter              */
+    OPL_IRQHANDLER    IRQHandler;   /* IRQ handler                  */
+    void *IRQParam;                 /* IRQ parameter                */
+    OPL_UPDATEHANDLER UpdateHandler;/* stream update handler        */
+    void *UpdateParam;              /* stream update parameter      */
+
+    UINT8 type;                     /* chip type                    */
+    UINT8 address;                  /* address register             */
+    UINT8 status;                   /* status flag                  */
+    UINT8 statusmask;               /* status mask                  */
+    UINT8 mode;                     /* Reg.08 : CSM,notesel,etc.    */
+
+    UINT32 clock;                   /* master clock  (Hz)           */
+    UINT32 rate;                    /* sampling rate (Hz)           */
+    double freqbase;                /* frequency base               */
+    double TimerBase;         /* Timer base time (==sampling time)*/
+    device_t *device;
+
+#if BUILD_Y8950
+    INT32 output_deltat[4];     /* for Y8950 DELTA-T, chip is mono, that 4 here is just for safety */
+#endif
+} __attribute__((aligned));
+
+typedef struct FM_OPL FM_OPL;
+
+/* mapping of register number (offset) to slot number used by the emulator */
+static const int slot_array[32]=
+{
+    0, 2, 4, 1, 3, 5,-1,-1,
+    6, 8,10, 7, 9,11,-1,-1,
+    12,14,16,13,15,17,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1
+};
+
+/* key scale level */
+/* table is 3dB/octave , DV converts this into 6dB/octave */
+/* 0.1875 is bit 0 weight of the envelope counter (volume) expressed in the 'decibel' scale */
+#define DV (0.1875/2.0)
+static const UINT32 ksl_tab[8*16]=
+{
+    /* OCT 0 */
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    /* OCT 1 */
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    0.000/DV, 0.750/DV, 1.125/DV, 1.500/DV,
+    1.875/DV, 2.250/DV, 2.625/DV, 3.000/DV,
+    /* OCT 2 */
+    0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+    0.000/DV, 1.125/DV, 1.875/DV, 2.625/DV,
+    3.000/DV, 3.750/DV, 4.125/DV, 4.500/DV,
+    4.875/DV, 5.250/DV, 5.625/DV, 6.000/DV,
+    /* OCT 3 */
+    0.000/DV, 0.000/DV, 0.000/DV, 1.875/DV,
+    3.000/DV, 4.125/DV, 4.875/DV, 5.625/DV,
+    6.000/DV, 6.750/DV, 7.125/DV, 7.500/DV,
+    7.875/DV, 8.250/DV, 8.625/DV, 9.000/DV,
+    /* OCT 4 */
+    0.000/DV, 0.000/DV, 3.000/DV, 4.875/DV,
+    6.000/DV, 7.125/DV, 7.875/DV, 8.625/DV,
+    9.000/DV, 9.750/DV,10.125/DV,10.500/DV,
+    10.875/DV,11.250/DV,11.625/DV,12.000/DV,
+    /* OCT 5 */
+    0.000/DV, 3.000/DV, 6.000/DV, 7.875/DV,
+    9.000/DV,10.125/DV,10.875/DV,11.625/DV,
+    12.000/DV,12.750/DV,13.125/DV,13.500/DV,
+    13.875/DV,14.250/DV,14.625/DV,15.000/DV,
+    /* OCT 6 */
+    0.000/DV, 6.000/DV, 9.000/DV,10.875/DV,
+    12.000/DV,13.125/DV,13.875/DV,14.625/DV,
+    15.000/DV,15.750/DV,16.125/DV,16.500/DV,
+    16.875/DV,17.250/DV,17.625/DV,18.000/DV,
+    /* OCT 7 */
+    0.000/DV, 9.000/DV,12.000/DV,13.875/DV,
+    15.000/DV,16.125/DV,16.875/DV,17.625/DV,
+    18.000/DV,18.750/DV,19.125/DV,19.500/DV,
+    19.875/DV,20.250/DV,20.625/DV,21.000/DV
+};
+#undef DV
+
+/* 0 / 3.0 / 1.5 / 6.0 dB/OCT */
+static const UINT32 ksl_shift[4] = { 31, 1, 2, 0 };
+
+
+/* sustain level table (3dB per step) */
+/* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
+#define SC(db) (UINT32) ( db * (2.0/ENV_STEP) )
+static const UINT32 sl_tab[16]={
+    SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
+    SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
+};
+#undef SC
+
+
+#define RATE_STEPS (8)
+static const unsigned char eg_inc[15*RATE_STEPS]={
+/*cycle:0 1  2 3  4 5  6 7*/
+
+    /* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..12 0 (increment by 0 or 1) */
+    /* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..12 1 */
+    /* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..12 2 */
+    /* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..12 3 */
+
+    /* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 13 0 (increment by 1) */
+    /* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 13 1 */
+    /* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 13 2 */
+    /* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 13 3 */
+
+    /* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 14 0 (increment by 2) */
+    /* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 14 1 */
+    /*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 14 2 */
+    /*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 14 3 */
+
+    /*12 */ 4,4, 4,4, 4,4, 4,4, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 4) */
+    /*13 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 2, 15 3 for attack */
+    /*14 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */
+};
+
+
+#define O(a) (a*RATE_STEPS)
+
+/*note that there is no O(13) in this table - it's directly in the code */
+static const unsigned char eg_rate_select[16+64+16]={   /* Envelope Generator rates (16 + 64 rates + 16 RKS) */
+/* 16 infinite time rates */
+    O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
+    O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
+
+/* rates 00-12 */
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+    O( 0),O( 1),O( 2),O( 3),
+
+/* rate 13 */
+    O( 4),O( 5),O( 6),O( 7),
+
+/* rate 14 */
+    O( 8),O( 9),O(10),O(11),
+
+/* rate 15 */
+    O(12),O(12),O(12),O(12),
+
+/* 16 dummy rates (same as 15 3) */
+    O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12),
+    O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12),
+
+};
+#undef O
+
+/*rate  0,    1,    2,    3,   4,   5,   6,  7,  8,  9,  10, 11, 12, 13, 14, 15 */
+/*shift 12,   11,   10,   9,   8,   7,   6,  5,  4,  3,  2,  1,  0,  0,  0,  0  */
+/*mask  4095, 2047, 1023, 511, 255, 127, 63, 31, 15, 7,  3,  1,  0,  0,  0,  0  */
+
+#define O(a) (a*1)
+static const unsigned char eg_rate_shift[16+64+16]={    /* Envelope Generator counter shifts (16 + 64 rates + 16 RKS) */
+/* 16 infinite time rates */
+    O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+    O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+
+/* rates 00-12 */
+    O(12),O(12),O(12),O(12),
+    O(11),O(11),O(11),O(11),
+    O(10),O(10),O(10),O(10),
+    O( 9),O( 9),O( 9),O( 9),
+    O( 8),O( 8),O( 8),O( 8),
+    O( 7),O( 7),O( 7),O( 7),
+    O( 6),O( 6),O( 6),O( 6),
+    O( 5),O( 5),O( 5),O( 5),
+    O( 4),O( 4),O( 4),O( 4),
+    O( 3),O( 3),O( 3),O( 3),
+    O( 2),O( 2),O( 2),O( 2),
+    O( 1),O( 1),O( 1),O( 1),
+    O( 0),O( 0),O( 0),O( 0),
+
+/* rate 13 */
+    O( 0),O( 0),O( 0),O( 0),
+
+/* rate 14 */
+    O( 0),O( 0),O( 0),O( 0),
+
+/* rate 15 */
+    O( 0),O( 0),O( 0),O( 0),
+
+/* 16 dummy rates (same as 15 3) */
+    O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+    O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+
+};
+#undef O
+
+
+/* multiple table */
+#define ML 2
+static const UINT8 mul_tab[16]= {
+/* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,10,12,12,15,15 */
+    ML/2, 1*ML, 2*ML, 3*ML, 4*ML, 5*ML, 6*ML, 7*ML,
+    8*ML, 9*ML,10*ML,10*ML,12*ML,12*ML,15*ML,15*ML
+};
+#undef ML
+
+/*  TL_TAB_LEN is calculated as:
+ *   12 - sinus amplitude bits     (Y axis)
+ *   2  - sinus sign bit           (Y axis)
+ *   TL_RES_LEN - sinus resolution (X axis)
+ */
+#define TL_TAB_LEN (12*2*TL_RES_LEN)
+static signed int tl_tab[TL_TAB_LEN];
+
+#define ENV_QUIET       (TL_TAB_LEN>>4)
+
+/* sin waveform table in 'decibel' scale */
+/* four waveforms on OPL2 type chips */
+static unsigned int sin_tab[SIN_LEN * 4];
+
+
+/* LFO Amplitude Modulation table (verified on real YM3812)
+   27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples
+
+   Length: 210 elements.
+
+   Each of the elements has to be repeated
+   exactly 64 times (on 64 consecutive samples).
+   The whole table takes: 64 * 210 = 13440 samples.
+
+   When AM = 1 data is used directly
+   When AM = 0 data is divided by 4 before being used (losing precision is important)
+*/
+
+#define LFO_AM_TAB_ELEMENTS 210
+
+static const UINT8 lfo_am_table[LFO_AM_TAB_ELEMENTS] = {
+    0,0,0,0,0,0,0,
+    1,1,1,1,
+    2,2,2,2,
+    3,3,3,3,
+    4,4,4,4,
+    5,5,5,5,
+    6,6,6,6,
+    7,7,7,7,
+    8,8,8,8,
+    9,9,9,9,
+    10,10,10,10,
+    11,11,11,11,
+    12,12,12,12,
+    13,13,13,13,
+    14,14,14,14,
+    15,15,15,15,
+    16,16,16,16,
+    17,17,17,17,
+    18,18,18,18,
+    19,19,19,19,
+    20,20,20,20,
+    21,21,21,21,
+    22,22,22,22,
+    23,23,23,23,
+    24,24,24,24,
+    25,25,25,25,
+    26,26,26,
+    25,25,25,25,
+    24,24,24,24,
+    23,23,23,23,
+    22,22,22,22,
+    21,21,21,21,
+    20,20,20,20,
+    19,19,19,19,
+    18,18,18,18,
+    17,17,17,17,
+    16,16,16,16,
+    15,15,15,15,
+    14,14,14,14,
+    13,13,13,13,
+    12,12,12,12,
+    11,11,11,11,
+    10,10,10,10,
+    9,9,9,9,
+    8,8,8,8,
+    7,7,7,7,
+    6,6,6,6,
+    5,5,5,5,
+    4,4,4,4,
+    3,3,3,3,
+    2,2,2,2,
+    1,1,1,1
+};
+
+/* LFO Phase Modulation table (verified on real YM3812) */
+static const INT8 lfo_pm_table[8*8*2] = {
+/* FNUM2/FNUM = 00 0xxxxxxx (0x0000) */
+    0, 0, 0, 0, 0, 0, 0, 0, /*LFO PM depth = 0*/
+    0, 0, 0, 0, 0, 0, 0, 0, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 00 1xxxxxxx (0x0080) */
+    0, 0, 0, 0, 0, 0, 0, 0, /*LFO PM depth = 0*/
+    1, 0, 0, 0,-1, 0, 0, 0, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 01 0xxxxxxx (0x0100) */
+    1, 0, 0, 0,-1, 0, 0, 0, /*LFO PM depth = 0*/
+    2, 1, 0,-1,-2,-1, 0, 1, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 01 1xxxxxxx (0x0180) */
+    1, 0, 0, 0,-1, 0, 0, 0, /*LFO PM depth = 0*/
+    3, 1, 0,-1,-3,-1, 0, 1, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 10 0xxxxxxx (0x0200) */
+    2, 1, 0,-1,-2,-1, 0, 1, /*LFO PM depth = 0*/
+    4, 2, 0,-2,-4,-2, 0, 2, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 10 1xxxxxxx (0x0280) */
+    2, 1, 0,-1,-2,-1, 0, 1, /*LFO PM depth = 0*/
+    5, 2, 0,-2,-5,-2, 0, 2, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 11 0xxxxxxx (0x0300) */
+    3, 1, 0,-1,-3,-1, 0, 1, /*LFO PM depth = 0*/
+    6, 3, 0,-3,-6,-3, 0, 3, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 11 1xxxxxxx (0x0380) */
+    3, 1, 0,-1,-3,-1, 0, 1, /*LFO PM depth = 0*/
+    7, 3, 0,-3,-7,-3, 0, 3  /*LFO PM depth = 1*/
+};
+
+
+/* lock level of common table */
+static int num_lock = 0;
+
+
+#define SLOT7_1 (&OPL->P_CH[7].SLOT[SLOT1])
+#define SLOT7_2 (&OPL->P_CH[7].SLOT[SLOT2])
+#define SLOT8_1 (&OPL->P_CH[8].SLOT[SLOT1])
+#define SLOT8_2 (&OPL->P_CH[8].SLOT[SLOT2])
+
+
+
+
+static int limit( int val, int max, int min ) {
+    if ( val > max )
+        val = max;
+    else if ( val < min )
+        val = min;
+
+    return val;
+}
+
+
+/* status set and IRQ handling */
+static void OPL_STATUS_SET(FM_OPL *OPL,int flag)
+{
+    /* set status flag */
+    OPL->status |= flag;
+    if(!(OPL->status & 0x80))
+    {
+        if(OPL->status & OPL->statusmask)
+        {   /* IRQ on */
+            OPL->status |= 0x80;
+            /* callback user interrupt handler (IRQ is OFF to ON) */
+            if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,1);
+        }
+    }
+}
+
+/* status reset and IRQ handling */
+static void OPL_STATUS_RESET(FM_OPL *OPL,int flag)
+{
+    /* reset status flag */
+    OPL->status &=~flag;
+    if((OPL->status & 0x80))
+    {
+        if (!(OPL->status & OPL->statusmask) )
+        {
+            OPL->status &= 0x7f;
+            /* callback user interrupt handler (IRQ is ON to OFF) */
+            if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,0);
+        }
+    }
+}
+
+/* IRQ mask set */
+static void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag)
+{
+    OPL->statusmask = flag;
+    /* IRQ handling check */
+    OPL_STATUS_SET(OPL,0);
+    OPL_STATUS_RESET(OPL,0);
+}
+
+
+/* advance LFO to next sample */
+static void advance_lfo(FM_OPL *OPL)
+{
+    UINT8 tmp;
+
+    /* LFO */
+    OPL->lfo_am_cnt += OPL->lfo_am_inc;
+//	if (OPL->lfo_am_cnt >= ((UINT32)LFO_AM_TAB_ELEMENTS<<LFO_SH) )  /* lfo_am_table is 210 elements long */
+//		OPL->lfo_am_cnt -= ((UINT32)LFO_AM_TAB_ELEMENTS<<LFO_SH);
+    if (OPL->lfo_am_cnt >= (LFO_AM_TAB_ELEMENTS<<LFO_SH) )	/* lfo_am_table is 210 elements long */
+        OPL->lfo_am_cnt -= (LFO_AM_TAB_ELEMENTS<<LFO_SH);
+
+    tmp = lfo_am_table[ OPL->lfo_am_cnt >> LFO_SH ];
+
+    if (OPL->lfo_am_depth)
+        OPL->LFO_AM = tmp;
+    else
+        OPL->LFO_AM = tmp>>2;
+
+    OPL->lfo_pm_cnt += OPL->lfo_pm_inc;
+    OPL->LFO_PM = ((OPL->lfo_pm_cnt>>LFO_SH) & 7) | OPL->lfo_pm_depth_range;
+}
+
+/* advance to next sample */
+static void advance(FM_OPL *OPL)
+{
+    OPL_CH *CH;
+    OPL_SLOT *op;
+    int i;
+
+    OPL->eg_timer += OPL->eg_timer_add;
+
+    while (OPL->eg_timer >= OPL->eg_timer_overflow)
+    {
+        OPL->eg_timer -= OPL->eg_timer_overflow;
+
+        OPL->eg_cnt++;
+
+        for (i=0; i<9*2; i++)
+        {
+            CH  = &OPL->P_CH[i/2];
+            op  = &CH->SLOT[i&1];
+
+            /* Envelope Generator */
+            switch(op->state)
+            {
+            case EG_ATT:        /* attack phase */
+                if ( !(OPL->eg_cnt & ((1<<op->eg_sh_ar)-1) ) )
+                {
+                    op->volume += (~op->volume *
+                                   (eg_inc[op->eg_sel_ar + ((OPL->eg_cnt>>op->eg_sh_ar)&7)])
+                        ) >>3;
+
+                    if (op->volume <= MIN_ATT_INDEX)
+                    {
+                        op->volume = MIN_ATT_INDEX;
+                        op->state = EG_DEC;
+                    }
+
+                }
+                break;
+
+            case EG_DEC:    /* decay phase */
+                if ( !(OPL->eg_cnt & ((1<<op->eg_sh_dr)-1) ) )
+                {
+                    op->volume += eg_inc[op->eg_sel_dr + ((OPL->eg_cnt>>op->eg_sh_dr)&7)];
+
+                    if ( (UINT32) op->volume >= op->sl )
+                        op->state = EG_SUS;
+
+                }
+                break;
+
+            case EG_SUS:    /* sustain phase */
+
+                /* this is important behaviour:
+                   one can change percusive/non-percussive modes on the fly and
+                   the chip will remain in sustain phase - verified on real YM3812 */
+
+                if(op->eg_type)     /* non-percussive mode */
+                {
+                    /* do nothing */
+                }
+                else                /* percussive mode */
+                {
+                    /* during sustain phase chip adds Release Rate (in percussive mode) */
+                    if ( !(OPL->eg_cnt & ((1<<op->eg_sh_rr)-1) ) )
+                    {
+                        op->volume += eg_inc[op->eg_sel_rr + ((OPL->eg_cnt>>op->eg_sh_rr)&7)];
+
+                        if ( op->volume >= MAX_ATT_INDEX )
+                            op->volume = MAX_ATT_INDEX;
+                    }
+                    /* else do nothing in sustain phase */
+                }
+                break;
+
+            case EG_REL:    /* release phase */
+                if ( !(OPL->eg_cnt & ((1<<op->eg_sh_rr)-1) ) )
+                {
+                    op->volume += eg_inc[op->eg_sel_rr + ((OPL->eg_cnt>>op->eg_sh_rr)&7)];
+
+                    if ( op->volume >= MAX_ATT_INDEX )
+                    {
+                        op->volume = MAX_ATT_INDEX;
+                        op->state = EG_OFF;
+                    }
+
+                }
+                break;
+
+            default:
+                break;
+            }
+        }
+    }
+
+    for (i=0; i<9*2; i++)
+    {
+        CH  = &OPL->P_CH[i/2];
+        op  = &CH->SLOT[i&1];
+
+        /* Phase Generator */
+        if(op->vib)
+        {
+            UINT8 block;
+            unsigned int block_fnum = CH->block_fnum;
+
+            unsigned int fnum_lfo   = (block_fnum&0x0380) >> 7;
+
+            signed int lfo_fn_table_index_offset = lfo_pm_table[OPL->LFO_PM + 16*fnum_lfo ];
+
+            if (lfo_fn_table_index_offset)  /* LFO phase modulation active */
+            {
+                block_fnum += lfo_fn_table_index_offset;
+                block = (block_fnum&0x1c00) >> 10;
+                op->Cnt += (OPL->fn_tab[block_fnum&0x03ff] >> (7-block)) * op->mul;
+            }
+            else    /* LFO phase modulation  = zero */
+            {
+                op->Cnt += op->Incr;
+            }
+        }
+        else    /* LFO phase modulation disabled for this operator */
+        {
+            op->Cnt += op->Incr;
+        }
+    }
+
+    /*  The Noise Generator of the YM3812 is 23-bit shift register.
+     *   Period is equal to 2^23-2 samples.
+     *   Register works at sampling frequency of the chip, so output
+     *   can change on every sample.
+     *
+     *   Output of the register and input to the bit 22 is:
+     *   bit0 XOR bit14 XOR bit15 XOR bit22
+     *
+     *   Simply use bit 22 as the noise output.
+     */
+
+    OPL->noise_p += OPL->noise_f;
+    i = OPL->noise_p >> FREQ_SH;        /* number of events (shifts of the shift register) */
+    OPL->noise_p &= FREQ_MASK;
+    while (i)
+    {
+        /*
+          UINT32 j;
+          j = ( (OPL->noise_rng) ^ (OPL->noise_rng>>14) ^ (OPL->noise_rng>>15) ^ (OPL->noise_rng>>22) ) & 1;
+          OPL->noise_rng = (j<<22) | (OPL->noise_rng>>1);
+        */
+
+        /*
+          Instead of doing all the logic operations above, we
+          use a trick here (and use bit 0 as the noise output).
+          The difference is only that the noise bit changes one
+          step ahead. This doesn't matter since we don't know
+          what is real state of the noise_rng after the reset.
+        */
+
+        if (OPL->noise_rng & 1) OPL->noise_rng ^= 0x800302;
+        OPL->noise_rng >>= 1;
+
+        i--;
+    }
+}
+
+
+static signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
+{
+    UINT32 p;
+
+    p = (env<<4) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + (pm<<16))) >> FREQ_SH ) & SIN_MASK) ];
+
+    if (p >= TL_TAB_LEN)
+        return 0;
+    return tl_tab[p];
+}
+
+static signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
+{
+    UINT32 p;
+
+    p = (env<<4) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + pm      )) >> FREQ_SH ) & SIN_MASK) ];
+
+    if (p >= TL_TAB_LEN)
+        return 0;
+    return tl_tab[p];
+}
+
+
+#define volume_calc(OP) ((OP)->TLL + ((UINT32)(OP)->volume) + (OPL->LFO_AM & (OP)->AMmask))
+
+/* calculate output */
+static void OPL_CALC_CH( FM_OPL *OPL, OPL_CH *CH )
+{
+    OPL_SLOT *SLOT;
+    unsigned int env;
+    signed int out;
+
+    OPL->phase_modulation = 0;
+
+    /* SLOT 1 */
+    SLOT = &CH->SLOT[SLOT1];
+    env  = volume_calc(SLOT);
+    out  = SLOT->op1_out[0] + SLOT->op1_out[1];
+    SLOT->op1_out[0] = SLOT->op1_out[1];
+
+    //INT32 a;
+    //memcpy(&a, SLOT->connect1, sizeof(a));
+    //a += SLOT->op1_out[0];
+    //memcpy(SLOT->connect1, &a, sizeof(a));
+
+    *SLOT->connect1 += SLOT->op1_out[0]; // alignment issue on arm
+    SLOT->op1_out[1] = 0;
+    if( env < ENV_QUIET )
+    {
+        if (!SLOT->FB)
+            out = 0;
+        SLOT->op1_out[1] = op_calc1(SLOT->Cnt, env, (out<<SLOT->FB), SLOT->wavetable );
+    }
+    /* SLOT 2 */
+    SLOT++;
+    env = volume_calc(SLOT);
+    if( env < ENV_QUIET )
+    {
+        OPL->output[0] += op_calc(SLOT->Cnt, env, OPL->phase_modulation, SLOT->wavetable);
+    }
+}
+
+/*
+  operators used in the rhythm sounds generation process:
+
+  Envelope Generator:
+
+  channel  operator  register number   Bass  High  Snare Tom  Top
+  / slot   number    TL ARDR SLRR Wave Drum  Hat   Drum  Tom  Cymbal
+  6 / 0   12        50  70   90   f0  +
+  6 / 1   15        53  73   93   f3  +
+  7 / 0   13        51  71   91   f1        +
+  7 / 1   16        54  74   94   f4              +
+  8 / 0   14        52  72   92   f2                    +
+  8 / 1   17        55  75   95   f5                          +
+
+  Phase Generator:
+
+  channel  operator  register number   Bass  High  Snare Tom  Top
+  / slot   number    MULTIPLE          Drum  Hat   Drum  Tom  Cymbal
+  6 / 0   12        30                +
+  6 / 1   15        33                +
+  7 / 0   13        31                      +     +           +
+  7 / 1   16        34                -----  n o t  u s e d -----
+  8 / 0   14        32                                  +
+  8 / 1   17        35                      +                 +
+
+  channel  operator  register number   Bass  High  Snare Tom  Top
+  number   number    BLK/FNUM2 FNUM    Drum  Hat   Drum  Tom  Cymbal
+  6     12,15     B6        A6      +
+
+  7     13,16     B7        A7            +     +           +
+
+  8     14,17     B8        A8            +           +     +
+
+*/
+
+/* calculate rhythm */
+
+static void OPL_CALC_RH( FM_OPL *OPL, OPL_CH *CH, unsigned int noise )
+{
+    OPL_SLOT *SLOT;
+    signed int out;
+    unsigned int env;
+
+
+    /* Bass Drum (verified on real YM3812):
+       - depends on the channel 6 'connect' register:
+       when connect = 0 it works the same as in normal (non-rhythm) mode (op1->op2->out)
+       when connect = 1 _only_ operator 2 is present on output (op2->out), operator 1 is ignored
+       - output sample always is multiplied by 2
+    */
+
+    OPL->phase_modulation = 0;
+    /* SLOT 1 */
+    SLOT = &CH[6].SLOT[SLOT1];
+    env = volume_calc(SLOT);
+
+    out = SLOT->op1_out[0] + SLOT->op1_out[1];
+    SLOT->op1_out[0] = SLOT->op1_out[1];
+
+    if (!SLOT->CON)
+        OPL->phase_modulation = SLOT->op1_out[0];
+    /* else ignore output of operator 1 */
+
+    SLOT->op1_out[1] = 0;
+    if( env < ENV_QUIET )
+    {
+        if (!SLOT->FB)
+            out = 0;
+        SLOT->op1_out[1] = op_calc1(SLOT->Cnt, env, (out<<SLOT->FB), SLOT->wavetable );
+    }
+
+    /* SLOT 2 */
+    SLOT++;
+    env = volume_calc(SLOT);
+    if( env < ENV_QUIET )
+        OPL->output[0] += op_calc(SLOT->Cnt, env, OPL->phase_modulation, SLOT->wavetable) * 2;
+
+
+    /* Phase generation is based on: */
+    /* HH  (13) channel 7->slot 1 combined with channel 8->slot 2 (same combination as TOP CYMBAL but different output phases) */
+    /* SD  (16) channel 7->slot 1 */
+    /* TOM (14) channel 8->slot 1 */
+    /* TOP (17) channel 7->slot 1 combined with channel 8->slot 2 (same combination as HIGH HAT but different output phases) */
+
+    /* Envelope generation based on: */
+    /* HH  channel 7->slot1 */
+    /* SD  channel 7->slot2 */
+    /* TOM channel 8->slot1 */
+    /* TOP channel 8->slot2 */
+
+
+    /* The following formulas can be well optimized.
+       I leave them in direct form for now (in case I've missed something).
+    */
+
+    /* High Hat (verified on real YM3812) */
+    env = volume_calc(SLOT7_1);
+    if( env < ENV_QUIET )
+    {
+        /* high hat phase generation:
+           phase = d0 or 234 (based on frequency only)
+           phase = 34 or 2d0 (based on noise)
+        */
+
+        /* base frequency derived from operator 1 in channel 7 */
+        unsigned char bit7 = ((SLOT7_1->Cnt>>FREQ_SH)>>7)&1;
+        unsigned char bit3 = ((SLOT7_1->Cnt>>FREQ_SH)>>3)&1;
+        unsigned char bit2 = ((SLOT7_1->Cnt>>FREQ_SH)>>2)&1;
+
+        unsigned char res1 = (bit2 ^ bit7) | bit3;
+
+        /* when res1 = 0 phase = 0x000 | 0xd0; */
+        /* when res1 = 1 phase = 0x200 | (0xd0>>2); */
+        UINT32 phase = res1 ? (0x200|(0xd0>>2)) : 0xd0;
+
+        /* enable gate based on frequency of operator 2 in channel 8 */
+        unsigned char bit5e= ((SLOT8_2->Cnt>>FREQ_SH)>>5)&1;
+        unsigned char bit3e= ((SLOT8_2->Cnt>>FREQ_SH)>>3)&1;
+
+        unsigned char res2 = (bit3e ^ bit5e);
+
+        /* when res2 = 0 pass the phase from calculation above (res1); */
+        /* when res2 = 1 phase = 0x200 | (0xd0>>2); */
+        if (res2)
+            phase = (0x200|(0xd0>>2));
+
+
+        /* when phase & 0x200 is set and noise=1 then phase = 0x200|0xd0 */
+        /* when phase & 0x200 is set and noise=0 then phase = 0x200|(0xd0>>2), ie no change */
+        if (phase&0x200)
+        {
+            if (noise)
+                phase = 0x200|0xd0;
+        }
+        else
+            /* when phase & 0x200 is clear and noise=1 then phase = 0xd0>>2 */
+            /* when phase & 0x200 is clear and noise=0 then phase = 0xd0, ie no change */
+        {
+            if (noise)
+                phase = 0xd0>>2;
+        }
+
+        OPL->output[0] += op_calc(phase<<FREQ_SH, env, 0, SLOT7_1->wavetable) * 2;
+    }
+
+    /* Snare Drum (verified on real YM3812) */
+    env = volume_calc(SLOT7_2);
+    if( env < ENV_QUIET )
+    {
+        /* base frequency derived from operator 1 in channel 7 */
+        unsigned char bit8 = ((SLOT7_1->Cnt>>FREQ_SH)>>8)&1;
+
+        /* when bit8 = 0 phase = 0x100; */
+        /* when bit8 = 1 phase = 0x200; */
+        UINT32 phase = bit8 ? 0x200 : 0x100;
+
+        /* Noise bit XOR'es phase by 0x100 */
+        /* when noisebit = 0 pass the phase from calculation above */
+        /* when noisebit = 1 phase ^= 0x100; */
+        /* in other words: phase ^= (noisebit<<8); */
+        if (noise)
+            phase ^= 0x100;
+
+        OPL->output[0] += op_calc(phase<<FREQ_SH, env, 0, SLOT7_2->wavetable) * 2;
+    }
+
+    /* Tom Tom (verified on real YM3812) */
+    env = volume_calc(SLOT8_1);
+    if( env < ENV_QUIET )
+        OPL->output[0] += op_calc(SLOT8_1->Cnt, env, 0, SLOT8_1->wavetable) * 2;
+
+    /* Top Cymbal (verified on real YM3812) */
+    env = volume_calc(SLOT8_2);
+    if( env < ENV_QUIET )
+    {
+        /* base frequency derived from operator 1 in channel 7 */
+        unsigned char bit7 = ((SLOT7_1->Cnt>>FREQ_SH)>>7)&1;
+        unsigned char bit3 = ((SLOT7_1->Cnt>>FREQ_SH)>>3)&1;
+        unsigned char bit2 = ((SLOT7_1->Cnt>>FREQ_SH)>>2)&1;
+
+        unsigned char res1 = (bit2 ^ bit7) | bit3;
+
+        /* when res1 = 0 phase = 0x000 | 0x100; */
+        /* when res1 = 1 phase = 0x200 | 0x100; */
+        UINT32 phase = res1 ? 0x300 : 0x100;
+
+        /* enable gate based on frequency of operator 2 in channel 8 */
+        unsigned char bit5e= ((SLOT8_2->Cnt>>FREQ_SH)>>5)&1;
+        unsigned char bit3e= ((SLOT8_2->Cnt>>FREQ_SH)>>3)&1;
+
+        unsigned char res2 = (bit3e ^ bit5e);
+        /* when res2 = 0 pass the phase from calculation above (res1); */
+        /* when res2 = 1 phase = 0x200 | 0x100; */
+        if (res2)
+            phase = 0x300;
+
+        OPL->output[0] += op_calc(phase<<FREQ_SH, env, 0, SLOT8_2->wavetable) * 2;
+    }
+}
+
+
+/* generic table initialize */
+static int init_tables(void)
+{
+    signed int i,x;
+    signed int n;
+    double o,m;
+
+
+    for (x=0; x<TL_RES_LEN; x++)
+    {
+        m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0);
+        m = floor(m);
+
+        /* we never reach (1<<16) here due to the (x+1) */
+        /* result fits within 16 bits at maximum */
+
+        n = (int)m;     /* 16 bits here */
+        n >>= 4;        /* 12 bits here */
+        if (n&1)        /* round to nearest */
+            n = (n>>1)+1;
+        else
+            n = n>>1;
+        /* 11 bits here (rounded) */
+        n <<= 1;        /* 12 bits here (as in real chip) */
+        tl_tab[ x*2 + 0 ] = n;
+        tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ];
+
+        for (i=1; i<12; i++)
+        {
+            tl_tab[ x*2+0 + i*2*TL_RES_LEN ] =  tl_tab[ x*2+0 ]>>i;
+            tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ];
+        }
+#if 0
+        logerror("tl %04i", x*2);
+        for (i=0; i<12; i++)
+            logerror(", [%02i] %5i", i*2, tl_tab[ x*2 /*+1*/ + i*2*TL_RES_LEN ] );
+        logerror("\n");
+#endif
+    }
+    /*logerror("FMOPL.C: TL_TAB_LEN = %i elements (%i bytes)\n",TL_TAB_LEN, (int)sizeof(tl_tab));*/
+
+
+    for (i=0; i<SIN_LEN; i++)
+    {
+        /* non-standard sinus */
+        m = sin( ((i*2)+1) * M_PI / SIN_LEN ); /* checked against the real chip */
+
+        /* we never reach zero here due to ((i*2)+1) */
+
+        if (m>0.0)
+            o = 8*log(1.0/m)/log(2.0);  /* convert to 'decibels' */
+        else
+            o = 8*log(-1.0/m)/log(2.0); /* convert to 'decibels' */
+
+        o = o / (ENV_STEP/4);
+
+        n = (int)(2.0*o);
+        if (n&1)                        /* round to nearest */
+            n = (n>>1)+1;
+        else
+            n = n>>1;
+
+        sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 );
+
+        /*logerror("FMOPL.C: sin [%4i (hex=%03x)]= %4i (tl_tab value=%5i)\n", i, i, sin_tab[i], tl_tab[sin_tab[i]] );*/
+    }
+
+    for (i=0; i<SIN_LEN; i++)
+    {
+        /* waveform 1:  __      __     */
+        /*             /  \____/  \____*/
+        /* output only first half of the sinus waveform (positive one) */
+
+        if (i & (1<<(SIN_BITS-1)) )
+            sin_tab[1*SIN_LEN+i] = TL_TAB_LEN;
+        else
+            sin_tab[1*SIN_LEN+i] = sin_tab[i];
+
+        /* waveform 2:  __  __  __  __ */
+        /*             /  \/  \/  \/  \*/
+            /* abs(sin) */
+
+            sin_tab[2*SIN_LEN+i] = sin_tab[i & (SIN_MASK>>1) ];
+
+            /* waveform 3:  _   _   _   _  */
+            /*             / |_/ |_/ |_/ |_*/
+            /* abs(output only first quarter of the sinus waveform) */
+
+            if (i & (1<<(SIN_BITS-2)) )
+                sin_tab[3*SIN_LEN+i] = TL_TAB_LEN;
+            else
+                sin_tab[3*SIN_LEN+i] = sin_tab[i & (SIN_MASK>>2)];
+
+            /*logerror("FMOPL.C: sin1[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[1*SIN_LEN+i], tl_tab[sin_tab[1*SIN_LEN+i]] );
+              logerror("FMOPL.C: sin2[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[2*SIN_LEN+i], tl_tab[sin_tab[2*SIN_LEN+i]] );
+              logerror("FMOPL.C: sin3[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[3*SIN_LEN+i], tl_tab[sin_tab[3*SIN_LEN+i]] );*/
+    }
+    /*logerror("FMOPL.C: ENV_QUIET= %08x (dec*8=%i)\n", ENV_QUIET, ENV_QUIET*8 );*/
+
+
+#ifdef SAVE_SAMPLE
+    sample[0]=fopen("sampsum.pcm","wb");
+#endif
+
+    return 1;
+}
+
+static void OPLCloseTable( void )
+{
+#ifdef SAVE_SAMPLE
+    fclose(sample[0]);
+#endif
+}
+
+
+
+static void OPL_initalize(FM_OPL *OPL)
+{
+    int i;
+
+    /* frequency base */
+    OPL->freqbase  = (OPL->rate) ? ((double)OPL->clock / 72.0) / OPL->rate  : 0;
+#if 0
+    OPL->rate = (double)OPL->clock / 72.0;
+    OPL->freqbase  = 1.0;
+#endif
+
+    /*logerror("freqbase=%f\n", OPL->freqbase);*/
+
+    /* Timer base time */
+    OPL->TimerBase = 1.0 / ((double)OPL->clock / 72.0 );
+
+    /* make fnumber -> increment counter table */
+    for( i=0 ; i < 1024 ; i++ )
+    {
+        /* opn phase increment counter = 20bit */
+        OPL->fn_tab[i] = (UINT32)( (double)i * 64 * OPL->freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */
+#if 0
+        logerror("FMOPL.C: fn_tab[%4i] = %08x (dec=%8i)\n",
+                 i, OPL->fn_tab[i]>>6, OPL->fn_tab[i]>>6 );
+#endif
+    }
+
+#if 0
+    for( i=0 ; i < 16 ; i++ )
+    {
+        logerror("FMOPL.C: sl_tab[%i] = %08x\n",
+                 i, sl_tab[i] );
+    }
+    for( i=0 ; i < 8 ; i++ )
+    {
+        int j;
+        logerror("FMOPL.C: ksl_tab[oct=%2i] =",i);
+        for (j=0; j<16; j++)
+        {
+            logerror("%08x ", (UINT32)(ksl_tab[i*16+j]) );
+        }
+        logerror("\n");
+    }
+#endif
+
+
+    /* Amplitude modulation: 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples */
+    /* One entry from LFO_AM_TABLE lasts for 64 samples */
+    OPL->lfo_am_inc = (UINT32) ((1.0 / 64.0 ) * (1<<LFO_SH) * OPL->freqbase);
+
+    /* Vibrato: 8 output levels (triangle waveform); 1 level takes 1024 samples */
+    OPL->lfo_pm_inc = (UINT32) ((1.0 / 1024.0) * (1<<LFO_SH) * OPL->freqbase);
+
+    /*logerror ("OPL->lfo_am_inc = %8x ; OPL->lfo_pm_inc = %8x\n", OPL->lfo_am_inc, OPL->lfo_pm_inc);*/
+
+    /* Noise generator: a step takes 1 sample */
+    OPL->noise_f = (UINT32) ((1.0 / 1.0) * (1<<FREQ_SH) * OPL->freqbase);
+
+    OPL->eg_timer_add = (UINT32) ((1<<EG_SH) * OPL->freqbase);
+    OPL->eg_timer_overflow = ( 1 ) * (1<<EG_SH);
+    /*logerror("OPLinit eg_timer_add=%8x eg_timer_overflow=%8x\n", OPL->eg_timer_add, OPL->eg_timer_overflow);*/
+
+}
+
+static void FM_KEYON(OPL_SLOT *SLOT, UINT32 key_set)
+{
+    if( !SLOT->key )
+    {
+        /* restart Phase Generator */
+        SLOT->Cnt = 0;
+        /* phase -> Attack */
+        SLOT->state = EG_ATT;
+    }
+    SLOT->key |= key_set;
+}
+
+static void FM_KEYOFF(OPL_SLOT *SLOT, UINT32 key_clr)
+{
+    if( SLOT->key )
+    {
+        SLOT->key &= key_clr;
+
+        if( !SLOT->key )
+        {
+            /* phase -> Release */
+            if (SLOT->state>EG_REL)
+                SLOT->state = EG_REL;
+        }
+    }
+}
+
+/* update phase increment counter of operator (also update the EG rates if necessary) */
+static void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT)
+{
+    int ksr;
+
+    /* (frequency) phase increment counter */
+    SLOT->Incr = CH->fc * SLOT->mul;
+    ksr = CH->kcode >> SLOT->KSR;
+
+    if( SLOT->ksr != ksr )
+    {
+        SLOT->ksr = ksr;
+
+        /* calculate envelope generator rates */
+        if ((SLOT->ar + SLOT->ksr) < 16+62)
+        {
+            SLOT->eg_sh_ar  = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+            SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+        }
+        else
+        {
+            SLOT->eg_sh_ar  = 0;
+            SLOT->eg_sel_ar = 13*RATE_STEPS;
+        }
+        SLOT->eg_sh_dr  = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+        SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+        SLOT->eg_sh_rr  = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+        SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+    }
+}
+
+/* set multi,am,vib,EG-TYP,KSR,mul */
+static void set_mul(FM_OPL *OPL,int slot,int v)
+{
+    OPL_CH   *CH   = &OPL->P_CH[slot/2];
+    OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+    SLOT->mul     = mul_tab[v&0x0f];
+    SLOT->KSR     = (v&0x10) ? 0 : 2;
+    SLOT->eg_type = (v&0x20);
+    SLOT->vib     = (v&0x40);
+    SLOT->AMmask  = (v&0x80) ? ~0 : 0;
+    CALC_FCSLOT(CH,SLOT);
+}
+
+/* set ksl & tl */
+static void set_ksl_tl(FM_OPL *OPL,int slot,int v)
+{
+#if 0
+    OPL_CH   *CH   = &OPL->P_CH[slot/2];
+    OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+    SLOT->ksl = ksl_shift[v >> 6];
+    SLOT->TL  = (v&0x3f)<<(ENV_BITS-1-7); /* 7 bits TL (bit 6 = always 0) */
+
+    SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+#else
+    OPL_CH   *CH   = &OPL->P_CH[slot/2];
+    OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+    int ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */
+
+    SLOT->ksl = ksl ? 3-ksl : 31;
+    SLOT->TL  = (v&0x3f)<<(ENV_BITS-1-7); /* 7 bits TL (bit 6 = always 0) */
+
+    SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+#endif
+}
+
+/* set attack rate & decay rate  */
+static void set_ar_dr(FM_OPL *OPL,int slot,int v)
+{
+    OPL_CH   *CH   = &OPL->P_CH[slot/2];
+    OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+    SLOT->ar = (v>>4)  ? 16 + ((v>>4)  <<2) : 0;
+
+    if ((SLOT->ar + SLOT->ksr) < 16+62)
+    {
+        SLOT->eg_sh_ar  = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+        SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+    }
+    else
+    {
+        SLOT->eg_sh_ar  = 0;
+        SLOT->eg_sel_ar = 13*RATE_STEPS;
+    }
+
+    SLOT->dr    = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0;
+    SLOT->eg_sh_dr  = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+    SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+}
+
+/* set sustain level & release rate */
+static void set_sl_rr(FM_OPL *OPL,int slot,int v)
+{
+    OPL_CH   *CH   = &OPL->P_CH[slot/2];
+    OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+    SLOT->sl  = sl_tab[ v>>4 ];
+
+    SLOT->rr  = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0;
+    SLOT->eg_sh_rr  = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+    SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+}
+
+
+/* write a value v to register r on OPL chip */
+static void OPLWriteReg(FM_OPL *OPL, int r, int v)
+{
+    OPL_CH *CH;
+    int slot;
+    int block_fnum;
+
+
+    /* adjust bus to 8 bits */
+    r &= 0xff;
+    v &= 0xff;
+
+    if (LOG_CYM_FILE && (cymfile) && (r!=0) )
+    {
+        fprintf(cymfile, "%02x = %02x\n", r, v);
+    }
+
+
+    switch(r&0xe0)
+    {
+    case 0x00:  /* 00-1f:control */
+        switch(r&0x1f)
+        {
+        case 0x01:  /* waveform select enable */
+            if(OPL->type&OPL_TYPE_WAVESEL)
+            {
+                OPL->wavesel = v&0x20;
+                /* do not change the waveform previously selected */
+            }
+            break;
+        case 0x02:  /* Timer 1 */
+            OPL->T[0] = (256-v)*4;
+            break;
+        case 0x03:  /* Timer 2 */
+            OPL->T[1] = (256-v)*16;
+            break;
+        case 0x04:  /* IRQ clear / mask and Timer enable */
+            if(v&0x80)
+            {   /* IRQ flag clear */
+                OPL_STATUS_RESET(OPL,0x7f-0x08); /* don't reset BFRDY flag or we will have to call deltat module to set the flag */
+            }
+            else
+            {   /* set IRQ mask ,timer enable*/
+                UINT8 st1 = v&1;
+                UINT8 st2 = (v>>1)&1;
+
+                /* IRQRST,T1MSK,t2MSK,EOSMSK,BRMSK,x,ST2,ST1 */
+                OPL_STATUS_RESET(OPL, v & (0x78-0x08) );
+                OPL_STATUSMASK_SET(OPL, (~v) & 0x78 );
+
+                /* timer 2 */
+                if(OPL->st[1] != st2)
+                {
+                    double period = st2 ? (double)OPL->T[1]*OPL->TimerBase : 0.0;
+                    //double period = st2 ? (OPL->TimerBase * OPL->T[1]) : 0;
+                    OPL->st[1] = st2;
+                    if (OPL->timer_handler) (OPL->timer_handler)(1,period);
+                }
+                /* timer 1 */
+                if(OPL->st[0] != st1)
+                {
+                    double period = st1 ? (double)OPL->T[0]*OPL->TimerBase : 0.0;
+                    //double period = st1 ? (OPL->TimerBase * OPL->T[0]) : 0;
+                    OPL->st[0] = st1;
+                    if (OPL->timer_handler) (OPL->timer_handler)(0,period);
+                }
+            }
+            break;
+#if BUILD_Y8950
+        case 0x06:      /* Key Board OUT */
+            if(OPL->type&OPL_TYPE_KEYBOARD)
+            {
+                if(OPL->keyboardhandler_w)
+                    OPL->keyboardhandler_w(OPL->keyboard_param,v);
+                else
+                {
+                    //OPL->device->logerror("Y8950: write unmapped KEYBOARD port\n");
+                }
+            }
+            break;
+        case 0x07:  /* DELTA-T control 1 : START,REC,MEMDATA,REPT,SPOFF,x,x,RST */
+            if(OPL->type&OPL_TYPE_ADPCM)
+                YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v);
+            break;
+#endif
+        case 0x08:  /* MODE,DELTA-T control 2 : CSM,NOTESEL,x,x,smpl,da/ad,64k,rom */
+            OPL->mode = v;
+#if BUILD_Y8950
+            if(OPL->type&OPL_TYPE_ADPCM)
+                YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v&0x0f); /* mask 4 LSBs in register 08 for DELTA-T unit */
+#endif
+            break;
+
+#if BUILD_Y8950
+        case 0x09:      /* START ADD */
+        case 0x0a:
+        case 0x0b:      /* STOP ADD  */
+        case 0x0c:
+        case 0x0d:      /* PRESCALE   */
+        case 0x0e:
+        case 0x0f:      /* ADPCM data write */
+        case 0x10:      /* DELTA-N    */
+        case 0x11:      /* DELTA-N    */
+        case 0x12:      /* ADPCM volume */
+            if(OPL->type&OPL_TYPE_ADPCM)
+                YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v);
+            break;
+
+        case 0x15:      /* DAC data high 8 bits (F7,F6...F2) */
+        case 0x16:      /* DAC data low 2 bits (F1, F0 in bits 7,6) */
+        case 0x17:      /* DAC data shift (S2,S1,S0 in bits 2,1,0) */
+            //OPL->device->logerror("FMOPL.C: DAC data register written, but not implemented reg=%02x val=%02x\n",r,v);
+            break;
+
+        case 0x18:      /* I/O CTRL (Direction) */
+            if(OPL->type&OPL_TYPE_IO)
+                OPL->portDirection = v&0x0f;
+            break;
+        case 0x19:      /* I/O DATA */
+            if(OPL->type&OPL_TYPE_IO)
+            {
+                OPL->portLatch = v;
+                if(OPL->porthandler_w)
+                    OPL->porthandler_w(OPL->port_param,v&OPL->portDirection);
+            }
+            break;
+#endif
+        default:
+            //OPL->device->logerror("FMOPL.C: write to unknown register: %02x\n",r);
+            break;
+        }
+        break;
+    case 0x20:  /* am ON, vib ON, ksr, eg_type, mul */
+        slot = slot_array[r&0x1f];
+        if(slot < 0) return;
+        set_mul(OPL,slot,v);
+        break;
+    case 0x40:
+        slot = slot_array[r&0x1f];
+        if(slot < 0) return;
+        set_ksl_tl(OPL,slot,v);
+        break;
+    case 0x60:
+        slot = slot_array[r&0x1f];
+        if(slot < 0) return;
+        set_ar_dr(OPL,slot,v);
+        break;
+    case 0x80:
+        slot = slot_array[r&0x1f];
+        if(slot < 0) return;
+        set_sl_rr(OPL,slot,v);
+        break;
+    case 0xa0:
+        if (r == 0xbd)          /* am depth, vibrato depth, r,bd,sd,tom,tc,hh */
+        {
+            OPL->lfo_am_depth = v & 0x80;
+            OPL->lfo_pm_depth_range = (v&0x40) ? 8 : 0;
+
+            OPL->rhythm  = v&0x3f;
+
+            if(OPL->rhythm&0x20)
+            {
+                /* BD key on/off */
+                if(v&0x10)
+                {
+                    FM_KEYON (&OPL->P_CH[6].SLOT[SLOT1], 2);
+                    FM_KEYON (&OPL->P_CH[6].SLOT[SLOT2], 2);
+                }
+                else
+                {
+                    FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1],~2);
+                    FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2],~2);
+                }
+                /* HH key on/off */
+                if(v&0x01) FM_KEYON (&OPL->P_CH[7].SLOT[SLOT1], 2);
+                else       FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1],~2);
+                /* SD key on/off */
+                if(v&0x08) FM_KEYON (&OPL->P_CH[7].SLOT[SLOT2], 2);
+                else       FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2],~2);
+                /* TOM key on/off */
+                if(v&0x04) FM_KEYON (&OPL->P_CH[8].SLOT[SLOT1], 2);
+                else       FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1],~2);
+                /* TOP-CY key on/off */
+                if(v&0x02) FM_KEYON (&OPL->P_CH[8].SLOT[SLOT2], 2);
+                else       FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2],~2);
+            }
+            else
+            {
+                /* BD key off */
+                FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1],~2);
+                FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2],~2);
+                /* HH key off */
+                FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1],~2);
+                /* SD key off */
+                FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2],~2);
+                /* TOM key off */
+                FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1],~2);
+                /* TOP-CY off */
+                FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2],~2);
+            }
+            return;
+        }
+        /* keyon,block,fnum */
+        if( (r&0x0f) > 8) return;
+        CH = &OPL->P_CH[r&0x0f];
+        if(!(r&0x10))
+        {   /* a0-a8 */
+            block_fnum  = (CH->block_fnum&0x1f00) | v;
+        }
+        else
+        {   /* b0-b8 */
+            block_fnum = ((v&0x1f)<<8) | (CH->block_fnum&0xff);
+
+            if(v&0x20)
+            {
+                FM_KEYON (&CH->SLOT[SLOT1], 1);
+                FM_KEYON (&CH->SLOT[SLOT2], 1);
+            }
+            else
+            {
+                FM_KEYOFF(&CH->SLOT[SLOT1],~1);
+                FM_KEYOFF(&CH->SLOT[SLOT2],~1);
+            }
+        }
+        /* update */
+        if(CH->block_fnum != (UINT32) block_fnum)
+        {
+            UINT8 block  = block_fnum >> 10;
+
+            CH->block_fnum = block_fnum;
+
+            CH->ksl_base = (UINT32)(ksl_tab[block_fnum>>6]);
+            CH->fc       = OPL->fn_tab[block_fnum&0x03ff] >> (7-block);
+
+            /* BLK 2,1,0 bits -> bits 3,2,1 of kcode */
+            CH->kcode    = (CH->block_fnum&0x1c00)>>9;
+
+            /* the info below is actually opposite to what is stated in the Manuals (verifed on real YM3812) */
+            /* if notesel == 0 -> lsb of kcode is bit 10 (MSB) of fnum  */
+            /* if notesel == 1 -> lsb of kcode is bit 9 (MSB-1) of fnum */
+            if (OPL->mode&0x40)
+                CH->kcode |= (CH->block_fnum&0x100)>>8; /* notesel == 1 */
+            else
+                CH->kcode |= (CH->block_fnum&0x200)>>9; /* notesel == 0 */
+
+            /* refresh Total Level in both SLOTs of this channel */
+            CH->SLOT[SLOT1].TLL = CH->SLOT[SLOT1].TL + (CH->ksl_base>>CH->SLOT[SLOT1].ksl);
+            CH->SLOT[SLOT2].TLL = CH->SLOT[SLOT2].TL + (CH->ksl_base>>CH->SLOT[SLOT2].ksl);
+
+            /* refresh frequency counter in both SLOTs of this channel */
+            CALC_FCSLOT(CH,&CH->SLOT[SLOT1]);
+            CALC_FCSLOT(CH,&CH->SLOT[SLOT2]);
+        }
+        break;
+    case 0xc0:
+        /* FB,C */
+        if( (r&0x0f) > 8) return;
+        CH = &OPL->P_CH[r&0x0f];
+        CH->SLOT[SLOT1].FB  = (v>>1)&7 ? ((v>>1)&7) + 7 : 0;
+        CH->SLOT[SLOT1].CON = v&1;
+        CH->SLOT[SLOT1].connect1 = CH->SLOT[SLOT1].CON ? &OPL->output[0] : &OPL->phase_modulation;
+        break;
+    case 0xe0: /* waveform select */
+        /* simply ignore write to the waveform select register if selecting not enabled in test register */
+        if(OPL->wavesel)
+        {
+            slot = slot_array[r&0x1f];
+            if(slot < 0) return;
+            CH = &OPL->P_CH[slot/2];
+
+            CH->SLOT[slot&1].wavetable = (v&0x03)*SIN_LEN;
+        }
+        break;
+    }
+}
+
+static TIMER_CALLBACK( cymfile_callback )
+{
+    if (cymfile)
+    {
+        //fputc( (unsigned char)0, cymfile );
+    }
+}
+
+/* lock/unlock for common table */
+static int OPL_LockTable(device_t *device)
+{
+    num_lock++;
+    if(num_lock>1) return 0;
+
+    /* first time */
+
+    /* allocate total level table (128kb space) */
+    if( !init_tables() )
+    {
+        num_lock--;
+        return -1;
+    }
+
+    if (LOG_CYM_FILE)
+    {
+        cymfile = fopen("/3812_.cym","w");
+        if (cymfile)
+        {
+            //device->machine().scheduler().timer_pulse ( double::from_hz(110), FUNC(cymfile_callback)); /*110 Hz pulse timer*/
+        }
+        else
+        {
+            //device->logerror("Could not create file 3812_.cym\n");
+        }
+    }
+
+    return 0;
+}
+
+static void OPL_UnLockTable(void)
+{
+    if(num_lock) num_lock--;
+    if(num_lock) return;
+
+    /* last time */
+
+    OPLCloseTable();
+
+    if (cymfile)
+        fclose (cymfile);
+    cymfile = NULL;
+}
+
+static void OPLResetChip(FM_OPL *OPL)
+{
+    int c,s;
+    int i;
+
+    OPL->eg_timer = 0;
+    OPL->eg_cnt   = 0;
+
+    OPL->noise_rng = 1; /* noise shift register */
+    OPL->mode   = 0;    /* normal mode */
+    OPL_STATUS_RESET(OPL,0x7f);
+
+    /* reset with register write */
+    OPLWriteReg(OPL,0x01,0); /* wavesel disable */
+    OPLWriteReg(OPL,0x02,0); /* Timer1 */
+    OPLWriteReg(OPL,0x03,0); /* Timer2 */
+    OPLWriteReg(OPL,0x04,0); /* IRQ mask clear */
+    for(i = 0xff ; i >= 0x20 ; i-- ) OPLWriteReg(OPL,i,0);
+
+    /* reset operator parameters */
+    for( c = 0 ; c < 9 ; c++ )
+    {
+        OPL_CH *CH = &OPL->P_CH[c];
+        for(s = 0 ; s < 2 ; s++ )
+        {
+            /* wave table */
+            CH->SLOT[s].wavetable = 0;
+            CH->SLOT[s].state     = EG_OFF;
+            CH->SLOT[s].volume    = MAX_ATT_INDEX;
+        }
+    }
+#if BUILD_Y8950
+    if(OPL->type&OPL_TYPE_ADPCM)
+    {
+        YM_DELTAT *DELTAT = OPL->deltat;
+
+        DELTAT->freqbase = OPL->freqbase;
+        DELTAT->output_pointer = &OPL->output_deltat[0];
+        DELTAT->portshift = 5;
+        DELTAT->output_range = 1<<23;
+        YM_DELTAT_ADPCM_Reset(DELTAT,0,YM_DELTAT_EMULATION_MODE_NORMAL,OPL->device);
+    }
+#endif
+}
+
+
+static void OPL_postload(FM_OPL *OPL)
+{
+    int slot, ch;
+
+    for( ch=0 ; ch < 9 ; ch++ )
+    {
+        OPL_CH *CH = &OPL->P_CH[ch];
+
+        /* Look up key scale level */
+        UINT32 block_fnum = CH->block_fnum;
+        CH->ksl_base = (UINT32)(ksl_tab[block_fnum >> 6]);
+        CH->fc       = OPL->fn_tab[block_fnum & 0x03ff] >> (7 - (block_fnum >> 10));
+
+        for( slot=0 ; slot < 2 ; slot++ )
+        {
+            OPL_SLOT *SLOT = &CH->SLOT[slot];
+
+            /* Calculate key scale rate */
+            SLOT->ksr = CH->kcode >> SLOT->KSR;
+
+            /* Calculate attack, decay and release rates */
+            if ((SLOT->ar + SLOT->ksr) < 16+62)
+            {
+                SLOT->eg_sh_ar  = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+                SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+            }
+            else
+            {
+                SLOT->eg_sh_ar  = 0;
+                SLOT->eg_sel_ar = 13*RATE_STEPS;
+            }
+            SLOT->eg_sh_dr  = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+            SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+            SLOT->eg_sh_rr  = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+            SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+
+            /* Calculate phase increment */
+            SLOT->Incr = CH->fc * SLOT->mul;
+
+            /* Total level */
+            SLOT->TLL = SLOT->TL + (CH->ksl_base >> SLOT->ksl);
+
+            /* Connect output */
+            SLOT->connect1 = SLOT->CON ? &OPL->output[0] : &OPL->phase_modulation;
+        }
+    }
+#if BUILD_Y8950
+    if ( (OPL->type & OPL_TYPE_ADPCM) && (OPL->deltat) )
+    {
+        // We really should call the postlod function for the YM_DELTAT, but it's hard without registers
+        // (see the way the YM2610 does it)
+        //YM_DELTAT_postload(OPL->deltat, REGS);
+    }
+#endif
+}
+
+
+static void OPLsave_state_channel(device_t *device, OPL_CH *CH)
+{
+}
+
+
+/* Register savestate for a virtual YM3812/YM3526Y8950 */
+
+static void OPL_save_state(FM_OPL *OPL, device_t *device)
+{
+}
+
+
+/* Create one of virtual YM3812/YM3526/Y8950 */
+/* 'clock' is chip clock in Hz  */
+/* 'rate'  is sampling rate  */
+static FM_OPL *OPLCreate(device_t *device, UINT32 clock, UINT32 rate, int type)
+{
+    char *ptr;
+    FM_OPL *OPL;
+    int state_size;
+
+    if (OPL_LockTable(device) == -1) return NULL;
+
+    /* calculate OPL state size */
+    state_size  = sizeof(FM_OPL);
+
+#if BUILD_Y8950
+    if (type&OPL_TYPE_ADPCM) state_size+= sizeof(YM_DELTAT);
+#endif
+
+    /* allocate memory block */
+    ptr = malloc(state_size);
+
+    if(!ptr)
+        return NULL;
+
+    memset(ptr, 0, state_size);
+
+    OPL  = (FM_OPL *)ptr;
+
+    /* GCC behaves weirdly... check that it's not acting up */
+
+    if((UINT32)OPL & 3 == 0)
+        printf("OPL is word-aligned");
+    if((UINT32)(OPL->output) & 3 == 0)
+        printf("output is word-aligned");
+
+    ptr += sizeof(FM_OPL);
+
+#if BUILD_Y8950
+    if (type&OPL_TYPE_ADPCM)
+    {
+        OPL->deltat = (YM_DELTAT *)ptr;
+    }
+    ptr += sizeof(YM_DELTAT);
+#endif
+
+    OPL->device = device;
+    OPL->type  = type;
+    OPL->clock = clock;
+    OPL->rate  = rate;
+
+    /* init global tables */
+    OPL_initalize(OPL);
+
+    return OPL;
+}
+
+/* Destroy one of virtual YM3812 */
+static void OPLDestroy(FM_OPL *OPL)
+{
+    OPL_UnLockTable();
+    free(OPL);
+}
+
+/* Optional handlers */
+
+static void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER timer_handler,void *param)
+{
+    OPL->timer_handler   = timer_handler;
+    OPL->TimerParam = param;
+}
+static void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,void *param)
+{
+    OPL->IRQHandler     = IRQHandler;
+    OPL->IRQParam = param;
+}
+static void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+    OPL->UpdateHandler = UpdateHandler;
+    OPL->UpdateParam = param;
+}
+
+static int OPLWrite(FM_OPL *OPL,int a,int v)
+{
+    if( !(a&1) )
+    {   /* address port */
+        OPL->address = v & 0xff;
+    }
+    else
+    {   /* data port */
+        if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0);
+        OPLWriteReg(OPL,OPL->address,v);
+    }
+    return OPL->status>>7;
+}
+
+static unsigned char OPLRead(FM_OPL *OPL,int a)
+{
+    if( !(a&1) )
+    {
+        /* status port */
+
+#if BUILD_Y8950
+
+        if(OPL->type&OPL_TYPE_ADPCM)    /* Y8950 */
+        {
+            return (OPL->status & (OPL->statusmask|0x80)) | (OPL->deltat->PCM_BSY&1);
+        }
+
+#endif
+
+        /* OPL and OPL2 */
+        return OPL->status & (OPL->statusmask|0x80);
+    }
+
+#if BUILD_Y8950
+    /* data port */
+    switch(OPL->address)
+    {
+    case 0x05: /* KeyBoard IN */
+        if(OPL->type&OPL_TYPE_KEYBOARD)
+        {
+            if(OPL->keyboardhandler_r)
+                return OPL->keyboardhandler_r(OPL->keyboard_param);
+            else
+                OPL->device->logerror("Y8950: read unmapped KEYBOARD port\n");
+        }
+        return 0;
+
+    case 0x0f: /* ADPCM-DATA  */
+        if(OPL->type&OPL_TYPE_ADPCM)
+        {
+            UINT8 val;
+
+            val = YM_DELTAT_ADPCM_Read(OPL->deltat);
+            /*logerror("Y8950: read ADPCM value read=%02x\n",val);*/
+            return val;
+        }
+        return 0;
+
+    case 0x19: /* I/O DATA    */
+        if(OPL->type&OPL_TYPE_IO)
+        {
+            if(OPL->porthandler_r)
+                return OPL->porthandler_r(OPL->port_param);
+            else
+                OPL->device->logerror("Y8950:read unmapped I/O port\n");
+        }
+        return 0;
+    case 0x1a: /* PCM-DATA    */
+        if(OPL->type&OPL_TYPE_ADPCM)
+        {
+            OPL->device->logerror("Y8950 A/D convertion is accessed but not implemented !\n");
+            return 0x80; /* 2's complement PCM data - result from A/D convertion */
+        }
+        return 0;
+    }
+#endif
+
+    return 0xff;
+}
+
+/* CSM Key Controll */
+static void CSMKeyControll(OPL_CH *CH)
+{
+    FM_KEYON (&CH->SLOT[SLOT1], 4);
+    FM_KEYON (&CH->SLOT[SLOT2], 4);
+
+    /* The key off should happen exactly one sample later - not implemented correctly yet */
+
+    FM_KEYOFF(&CH->SLOT[SLOT1], ~4);
+    FM_KEYOFF(&CH->SLOT[SLOT2], ~4);
+}
+
+
+static int OPLTimerOver(FM_OPL *OPL,int c)
+{
+    if( c )
+    {   /* Timer B */
+        OPL_STATUS_SET(OPL,0x20);
+    }
+    else
+    {   /* Timer A */
+        OPL_STATUS_SET(OPL,0x40);
+        /* CSM mode key,TL controll */
+        if( OPL->mode & 0x80 )
+        {   /* CSM mode total level latch and auto key on */
+            int ch;
+            if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0);
+            for(ch=0; ch<9; ch++)
+                CSMKeyControll( &OPL->P_CH[ch] );
+        }
+    }
+    /* reload timer */
+    if (OPL->timer_handler) (OPL->timer_handler)(c,OPL->TimerBase * OPL->T[c]);
+    return OPL->status>>7;
+}
+
+
+#define MAX_OPL_CHIPS 2
+
+
+#if (BUILD_YM3812)
+
+void * YM3812Init(device_t *device, UINT32 clock, UINT32 rate)
+{
+    /* emulator create */
+    FM_OPL *YM3812 = OPLCreate(device,clock,rate,OPL_TYPE_YM3812);
+    if (YM3812)
+    {
+        OPL_save_state(YM3812, device);
+        YM3812ResetChip(YM3812);
+    }
+    return YM3812;
+}
+
+void YM3812Shutdown(void *chip)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+
+    /* emulator shutdown */
+    OPLDestroy(YM3812);
+}
+void YM3812ResetChip(void *chip)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+    OPLResetChip(YM3812);
+}
+
+int YM3812Write(void *chip, int a, int v)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+
+    OPLWriteReg(YM3812, a, v);
+    return (YM3812->status>>7);
+
+    // technically correct, but breaks Wolf4SDL - FW19
+    //return OPLWrite(YM3812, a, v);
+}
+
+unsigned char YM3812Read(void *chip, int a)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+    /* YM3812 always returns bit2 and bit1 in HIGH state */
+    return OPLRead(YM3812, a) | 0x06 ;
+}
+int YM3812TimerOver(void *chip, int c)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+    return OPLTimerOver(YM3812, c);
+}
+
+void YM3812SetTimerHandler(void *chip, OPL_TIMERHANDLER timer_handler, void *param)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+    OPLSetTimerHandler(YM3812, timer_handler, param);
+}
+void YM3812SetIRQHandler(void *chip,OPL_IRQHANDLER IRQHandler,void *param)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+    OPLSetIRQHandler(YM3812, IRQHandler, param);
+}
+void YM3812SetUpdateHandler(void *chip,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+    FM_OPL *YM3812 = (FM_OPL *)chip;
+    OPLSetUpdateHandler(YM3812, UpdateHandler, param);
+}
+
+
+/*
+** Generate samples for one of the YM3812's
+**
+** 'which' is the virtual YM3812 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void YM3812UpdateOne(void *chip, OPLSAMPLE *buffer, int length)
+{
+    FM_OPL      *OPL = (FM_OPL *)chip;
+    UINT8       rhythm = OPL->rhythm&0x20;
+    OPLSAMPLE   *buf = buffer;
+    int i;
+
+    for( i=0; i < length ; i++ )
+    {
+        int lt;
+
+        OPL->output[0] = 0;
+
+        advance_lfo(OPL);
+
+        /* FM part */
+        OPL_CALC_CH(OPL, &OPL->P_CH[0]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[1]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[2]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[3]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[4]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[5]);
+
+        if(!rhythm)
+        {
+            OPL_CALC_CH(OPL, &OPL->P_CH[6]);
+            OPL_CALC_CH(OPL, &OPL->P_CH[7]);
+            OPL_CALC_CH(OPL, &OPL->P_CH[8]);
+        }
+        else        /* Rhythm part */
+        {
+            OPL_CALC_RH(OPL, &OPL->P_CH[0], (OPL->noise_rng>>0)&1 );
+        }
+
+        lt = OPL->output[0];
+
+        //lt >>= FINAL_SH;
+        lt <<= 2;
+
+        /* limit check */
+        lt = limit( lt , MAXOUT, MINOUT );
+
+#ifdef SAVE_SAMPLE
+        if (which==0)
+        {
+            SAVE_ALL_CHANNELS
+		}
+#endif
+
+        /* store to sound buffer */
+        //buf[i] = lt;
+
+        buf[i*2] = lt;          // stereo version
+        buf[i*2+1] = lt;
+
+        advance(OPL);
+    }
+}
+#endif /* BUILD_YM3812 */
+
+// Rockbox: we don't care about the rest.
+
+#if (BUILD_YM3526)
+
+void *ym3526_init(device_t *device, UINT32 clock, UINT32 rate)
+{
+    /* emulator create */
+    FM_OPL *YM3526 = OPLCreate(device,clock,rate,OPL_TYPE_YM3526);
+    if (YM3526)
+    {
+        OPL_save_state(YM3526, device);
+        ym3526_reset_chip(YM3526);
+    }
+    return YM3526;
+}
+
+void ym3526_shutdown(void *chip)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    /* emulator shutdown */
+    OPLDestroy(YM3526);
+}
+void ym3526_reset_chip(void *chip)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    OPLResetChip(YM3526);
+}
+
+int ym3526_write(void *chip, int a, int v)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    return OPLWrite(YM3526, a, v);
+}
+
+unsigned char ym3526_read(void *chip, int a)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    /* YM3526 always returns bit2 and bit1 in HIGH state */
+    return OPLRead(YM3526, a) | 0x06 ;
+}
+int ym3526_timer_over(void *chip, int c)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    return OPLTimerOver(YM3526, c);
+}
+
+void ym3526_set_timer_handler(void *chip, OPL_TIMERHANDLER timer_handler, void *param)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    OPLSetTimerHandler(YM3526, timer_handler, param);
+}
+void ym3526_set_irq_handler(void *chip,OPL_IRQHANDLER IRQHandler,void *param)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    OPLSetIRQHandler(YM3526, IRQHandler, param);
+}
+void ym3526_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+    FM_OPL *YM3526 = (FM_OPL *)chip;
+    OPLSetUpdateHandler(YM3526, UpdateHandler, param);
+}
+
+
+/*
+** Generate samples for one of the YM3526's
+**
+** 'which' is the virtual YM3526 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void ym3526_update_one(void *chip, OPLSAMPLE *buffer, int length)
+{
+    FM_OPL      *OPL = (FM_OPL *)chip;
+    UINT8       rhythm = OPL->rhythm&0x20;
+    OPLSAMPLE   *buf = buffer;
+    int i;
+
+    for( i=0; i < length ; i++ )
+    {
+        int lt;
+
+        OPL->output[0] = 0;
+
+        advance_lfo(OPL);
+
+        /* FM part */
+        OPL_CALC_CH(OPL, &OPL->P_CH[0]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[1]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[2]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[3]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[4]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[5]);
+
+        if(!rhythm)
+        {
+            OPL_CALC_CH(OPL, &OPL->P_CH[6]);
+            OPL_CALC_CH(OPL, &OPL->P_CH[7]);
+            OPL_CALC_CH(OPL, &OPL->P_CH[8]);
+        }
+        else        /* Rhythm part */
+        {
+            OPL_CALC_RH(OPL, &OPL->P_CH[0], (OPL->noise_rng>>0)&1 );
+        }
+
+        lt = OPL->output[0];
+
+        lt >>= FINAL_SH;
+
+        /* limit check */
+        lt = limit( lt , MAXOUT, MINOUT );
+
+#ifdef SAVE_SAMPLE
+        if (which==0)
+        {
+            SAVE_ALL_CHANNELS
+		}
+#endif
+
+        /* store to sound buffer */
+        buf[i] = lt;
+
+        advance(OPL);
+    }
+
+}
+#endif /* BUILD_YM3526 */
+
+
+
+
+#if BUILD_Y8950
+
+static void Y8950_deltat_status_set(void *chip, UINT8 changebits)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    OPL_STATUS_SET(Y8950, changebits);
+}
+static void Y8950_deltat_status_reset(void *chip, UINT8 changebits)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    OPL_STATUS_RESET(Y8950, changebits);
+}
+
+void *y8950_init(device_t *device, UINT32 clock, UINT32 rate)
+{
+    /* emulator create */
+    FM_OPL *Y8950 = OPLCreate(device,clock,rate,OPL_TYPE_Y8950);
+    if (Y8950)
+    {
+        Y8950->deltat->status_set_handler = Y8950_deltat_status_set;
+        Y8950->deltat->status_reset_handler = Y8950_deltat_status_reset;
+        Y8950->deltat->status_change_which_chip = Y8950;
+        Y8950->deltat->status_change_EOS_bit = 0x10;        /* status flag: set bit4 on End Of Sample */
+        Y8950->deltat->status_change_BRDY_bit = 0x08;   /* status flag: set bit3 on BRDY (End Of: ADPCM analysis/synthesis, memory reading/writing) */
+
+        /*Y8950->deltat->write_time = 10.0 / clock;*/       /* a single byte write takes 10 cycles of main clock */
+        /*Y8950->deltat->read_time  = 8.0 / clock;*/        /* a single byte read takes 8 cycles of main clock */
+        /* reset */
+        OPL_save_state(Y8950, device);
+        y8950_reset_chip(Y8950);
+    }
+
+    return Y8950;
+}
+
+void y8950_shutdown(void *chip)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    /* emulator shutdown */
+    OPLDestroy(Y8950);
+}
+void y8950_reset_chip(void *chip)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    OPLResetChip(Y8950);
+}
+
+int y8950_write(void *chip, int a, int v)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    return OPLWrite(Y8950, a, v);
+}
+
+unsigned char y8950_read(void *chip, int a)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    return OPLRead(Y8950, a);
+}
+int y8950_timer_over(void *chip, int c)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    return OPLTimerOver(Y8950, c);
+}
+
+void y8950_set_timer_handler(void *chip, OPL_TIMERHANDLER timer_handler, void *param)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    OPLSetTimerHandler(Y8950, timer_handler, param);
+}
+void y8950_set_irq_handler(void *chip,OPL_IRQHANDLER IRQHandler,void *param)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    OPLSetIRQHandler(Y8950, IRQHandler, param);
+}
+void y8950_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+    FM_OPL *Y8950 = (FM_OPL *)chip;
+    OPLSetUpdateHandler(Y8950, UpdateHandler, param);
+}
+
+void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size )
+{
+    FM_OPL      *OPL = (FM_OPL *)chip;
+    OPL->deltat->memory = (UINT8 *)(deltat_mem_ptr);
+    OPL->deltat->memory_size = deltat_mem_size;
+}
+
+/*
+** Generate samples for one of the Y8950's
+**
+** 'which' is the virtual Y8950 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void y8950_update_one(void *chip, OPLSAMPLE *buffer, int length)
+{
+    int i;
+    FM_OPL      *OPL = (FM_OPL *)chip;
+    UINT8       rhythm  = OPL->rhythm&0x20;
+    YM_DELTAT   *DELTAT = OPL->deltat;
+    OPLSAMPLE   *buf    = buffer;
+
+    for( i=0; i < length ; i++ )
+    {
+        int lt;
+
+        OPL->output[0] = 0;
+        OPL->output_deltat[0] = 0;
+
+        advance_lfo(OPL);
+
+        /* deltaT ADPCM */
+        if( DELTAT->portstate&0x80 )
+            YM_DELTAT_ADPCM_CALC(DELTAT);
+
+        /* FM part */
+        OPL_CALC_CH(OPL, &OPL->P_CH[0]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[1]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[2]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[3]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[4]);
+        OPL_CALC_CH(OPL, &OPL->P_CH[5]);
+
+        if(!rhythm)
+        {
+            OPL_CALC_CH(OPL, &OPL->P_CH[6]);
+            OPL_CALC_CH(OPL, &OPL->P_CH[7]);
+            OPL_CALC_CH(OPL, &OPL->P_CH[8]);
+        }
+        else        /* Rhythm part */
+        {
+            OPL_CALC_RH(OPL, &OPL->P_CH[0], (OPL->noise_rng>>0)&1 );
+        }
+
+        lt = OPL->output[0] + (OPL->output_deltat[0]>>11);
+
+        lt >>= FINAL_SH;
+
+        /* limit check */
+        lt = limit( lt , MAXOUT, MINOUT );
+
+#ifdef SAVE_SAMPLE
+        if (which==0)
+        {
+            SAVE_ALL_CHANNELS
+		}
+#endif
+
+        /* store to sound buffer */
+        buf[i] = lt;
+
+        advance(OPL);
+    }
+
+}
+
+void y8950_set_port_handler(void *chip,OPL_PORTHANDLER_W PortHandler_w,OPL_PORTHANDLER_R PortHandler_r,void * param)
+{
+    FM_OPL      *OPL = (FM_OPL *)chip;
+    OPL->porthandler_w = PortHandler_w;
+    OPL->porthandler_r = PortHandler_r;
+    OPL->port_param = param;
+}
+
+void y8950_set_keyboard_handler(void *chip,OPL_PORTHANDLER_W KeyboardHandler_w,OPL_PORTHANDLER_R KeyboardHandler_r,void * param)
+{
+    FM_OPL      *OPL = (FM_OPL *)chip;
+    OPL->keyboardhandler_w = KeyboardHandler_w;
+    OPL->keyboardhandler_r = KeyboardHandler_r;
+    OPL->keyboard_param = param;
+}
+
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.h b/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.h
new file mode 100644
index 0000000..c340a17
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.h
@@ -0,0 +1,117 @@
+#ifndef __FMOPL_H_
+#define __FMOPL_H_
+
+#include "wl_def.h"
+
+#define HAS_YM3812 1
+
+/* --- select emulation chips --- */
+#define BUILD_YM3812 (HAS_YM3812)
+#define BUILD_YM3526 (HAS_YM3526)
+#define BUILD_Y8950  (HAS_Y8950)
+
+/* select output bits size of output : 8 or 16 */
+#define OPL_SAMPLE_BITS 16
+
+/* compiler dependence */
+#ifndef OSD_CPU_H
+#define OSD_CPU_H
+typedef unsigned char	UINT8;   /* unsigned  8bit */
+typedef unsigned short	UINT16;  /* unsigned 16bit */
+typedef unsigned int	UINT32;  /* unsigned 32bit */
+typedef signed char		INT8;    /* signed  8bit   */
+typedef signed short	INT16;   /* signed 16bit   */
+typedef signed int		INT32;   /* signed 32bit   */
+#endif
+
+#if (OPL_SAMPLE_BITS==16)
+typedef INT16 OPLSAMPLE;
+#endif
+#if (OPL_SAMPLE_BITS==8)
+typedef INT8 OPLSAMPLE;
+#endif
+
+
+typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
+typedef void (*OPL_IRQHANDLER)(int param,int irq);
+typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
+typedef void (*OPL_PORTHANDLER_W)(int param,unsigned char data);
+typedef unsigned char (*OPL_PORTHANDLER_R)(int param);
+
+
+#if BUILD_YM3812
+
+
+typedef void device_t;
+void *YM3812Init(device_t *junk, UINT32 clock, UINT32 rate);
+void YM3812Shutdown(void *chip);
+void YM3812ResetChip(void *chip);
+int  YM3812Write(void *chip, int a, int v);
+unsigned char YM3812Read(void *chip, int a);
+void YM3812Mute(void *chip,int channel,bool mute);
+int  YM3812TimerOver(void *chip, int c);
+void YM3812UpdateOne(void *chip, INT16 *buffer, int length);
+
+// not used
+//void YM3812SetTimerHandler(void *chip, OPL_TIMERHANDLER TimerHandler, int channelOffset);
+//void YM3812SetIRQHandler(void *chip, OPL_IRQHANDLER IRQHandler, int param);
+//void YM3812SetUpdateHandler(void *chip, OPL_UPDATEHANDLER UpdateHandler, int param);
+
+#endif
+
+
+#if BUILD_YM3526
+
+/*
+** Initialize YM3526 emulator(s).
+**
+** 'num' is the number of virtual YM3526's to allocate
+** 'clock' is the chip clock in Hz
+** 'rate' is sampling rate
+*/
+int  YM3526Init(int num, int clock, int rate);
+/* shutdown the YM3526 emulators*/
+void YM3526Shutdown(void);
+void YM3526ResetChip(int which);
+int  YM3526Write(int which, int a, int v);
+unsigned char YM3526Read(int which, int a);
+int  YM3526TimerOver(int which, int c);
+/*
+** Generate samples for one of the YM3526's
+**
+** 'which' is the virtual YM3526 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void YM3526UpdateOne(int which, INT16 *buffer, int length);
+
+void YM3526SetTimerHandler(int which, OPL_TIMERHANDLER TimerHandler, int channelOffset);
+void YM3526SetIRQHandler(int which, OPL_IRQHANDLER IRQHandler, int param);
+void YM3526SetUpdateHandler(int which, OPL_UPDATEHANDLER UpdateHandler, int param);
+
+#endif
+
+
+#if BUILD_Y8950
+
+/* Y8950 port handlers */
+void Y8950SetPortHandler(int which, OPL_PORTHANDLER_W PortHandler_w, OPL_PORTHANDLER_R PortHandler_r, int param);
+void Y8950SetKeyboardHandler(int which, OPL_PORTHANDLER_W KeyboardHandler_w, OPL_PORTHANDLER_R KeyboardHandler_r, int param);
+void Y8950SetDeltaTMemory(int which, void * deltat_mem_ptr, int deltat_mem_size );
+
+int  Y8950Init (int num, int clock, int rate);
+void Y8950Shutdown (void);
+void Y8950ResetChip (int which);
+int  Y8950Write (int which, int a, int v);
+unsigned char Y8950Read (int which, int a);
+int  Y8950TimerOver (int which, int c);
+void Y8950UpdateOne (int which, INT16 *buffer, int length);
+
+void Y8950SetTimerHandler (int which, OPL_TIMERHANDLER TimerHandler, int channelOffset);
+void Y8950SetIRQHandler (int which, OPL_IRQHANDLER IRQHandler, int param);
+void Y8950SetUpdateHandler (int which, OPL_UPDATEHANDLER UpdateHandler, int param);
+
+#endif
+
+
+#endif /* __FMOPL_H_ */
diff --git a/apps/plugins/sdl/progs/wolf3d/foreign.h b/apps/plugins/sdl/progs/wolf3d/foreign.h
new file mode 100644
index 0000000..b0f2f21
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/foreign.h
@@ -0,0 +1,131 @@
+#define QUITSUR	    "Are you sure you want\n"\
+		            "to quit this great game?"
+
+#define CURGAME	    "You are currently in\n"\
+		            "a game. Continuing will\n"\
+		            "erase old game. Ok?"
+
+#define GAMESVD	    "There's already a game\n"\
+		            "saved at this position.\n"\
+		            "      Overwrite?"
+
+#define ENDGAMESTR	"Are you sure you want\n"\
+					"to end the game you\n"\
+					"are playing? (Y or N):"
+
+#define STR_NG	"New Game"
+#define	STR_SD	"Sound"
+#define	STR_CL	"Control"
+#define	STR_LG	"Load Game"
+#define	STR_SG	"Save Game"
+#define	STR_CV	"Change View"
+#define	STR_VS	"View Scores"
+#define STR_EG	"End Game"
+#define	STR_BD	"Back to Demo"
+#define STR_QT	"Quit"
+
+#define STR_LOADING	"Loading"
+#define STR_SAVING	"Saving"
+
+#define STR_GAME	"Game"
+#define STR_DEMO	"Demo"
+#define STR_LGC		"Load Game called\n\""
+#define STR_EMPTY	"empty"
+#define STR_CALIB	"Calibrate"
+#define STR_JOYST	"Joystick"
+#define STR_MOVEJOY	"Move joystick to\nupper left and\npress button 0\n"
+#define STR_MOVEJOY2 "Move joystick to\nlower right and\npress button 1\n"
+#define STR_ESCEXIT	"ESC to exit"
+
+#define STR_NONE	"None"
+#define	STR_PC		"PC Speaker"
+#define	STR_ALSB	"AdLib/Sound Blaster"
+#define	STR_DISNEY	"Disney Sound Source"
+#define	STR_SB		"Sound Blaster"
+
+#define	STR_MOUSEEN	"Mouse Enabled"
+#define	STR_JOYEN	"Joystick Enabled"
+#define	STR_PORT2	"Use joystick port 2"
+#define	STR_GAMEPAD	"Gravis GamePad Enabled"
+#define	STR_SENS	"Mouse Sensitivity"
+#define	STR_CUSTOM	"Customize controls"
+
+#define	STR_DADDY	"Can I play, Daddy?"
+#define	STR_HURTME	"Don't hurt me."
+#define	STR_BRINGEM	"Bring 'em on!"
+#define	STR_DEATH	"I am Death incarnate!"
+
+#define	STR_MOUSEADJ	"Adjust Mouse Sensitivity"
+#define STR_SLOW	    "Slow"
+#define STR_FAST	    "Fast"
+
+#define	STR_CRUN	"Run"
+#define STR_COPEN	"Open"
+#define STR_CFIRE	"Fire"
+#define STR_CSTRAFE	"Strafe"
+
+#define	STR_LEFT	"Left"
+#define	STR_RIGHT	"Right"
+#define	STR_FRWD	"Frwd"
+#define	STR_BKWD	"Bkwrd"
+#define	STR_THINK	"Thinking"
+
+#define STR_SIZE1	"Use arrows to size"
+#define STR_SIZE2	"ENTER to accept"
+#define STR_SIZE3	"ESC to cancel"
+
+#define STR_YOUWIN	"you win!"
+
+#define STR_TOTALTIME	"total time"
+
+#define STR_RATKILL		    "kill    %"
+#define STR_RATSECRET  	  "secret    %"
+#define STR_RATTREASURE	"treasure    %"
+
+#define STR_BONUS	"bonus"
+#define STR_TIME	"time"
+#define STR_PAR		" par"
+
+#define STR_RAT2KILL            "kill ratio    %"
+#define STR_RAT2SECRET  	  "secret ratio    %"
+#define STR_RAT2TREASURE	"treasure ratio    %"
+
+#define STR_DEFEATED	"defeated!"
+
+#define STR_CHEATER1	"You now have 100% Health,"
+#define STR_CHEATER2    "99 Ammo and both Keys!"
+#define STR_CHEATER3	"Note that you have basically"
+#define STR_CHEATER4	"eliminated your chances of"
+#define STR_CHEATER5	"getting a high score!"
+
+#define STR_NOSPACE1	"There is not enough space"
+#define STR_NOSPACE2	"on your disk to Save Game!"
+
+#define STR_SAVECHT1	"Your Save Game file is,"
+#define STR_SAVECHT2	"shall we say, \"corrupted\"."
+#define STR_SAVECHT3	"But I'll let you go on and"
+#define STR_SAVECHT4	"play anyway...."
+
+#define	STR_SEEAGAIN	"Let's see that again!"
+
+#ifdef SPEAR
+#define ENDSTR1 "Heroes don't quit, but\ngo ahead and press " YESBUTTONNAME "\nif you aren't one."
+#define ENDSTR2 "Press " YESBUTTONNAME " to quit,\nor press " NOBUTTONNAME " to enjoy\nmore violent diversion."
+#define ENDSTR3 "Depressing the " YESBUTTONNAME " key means\nyou must return to the\nhumdrum workday world."
+#define ENDSTR4 "Hey, quit or play,\n" YESBUTTONNAME " or " NOBUTTONNAME ":\nit's your choice."
+#define ENDSTR5 "Sure you don't want to\nwaste a few more\nproductive hours?"
+#define ENDSTR6 "I think you had better\nplay some more. Please\npress " NOBUTTONNAME "...please?"
+#define ENDSTR7 "If you are tough, press " NOBUTTONNAME ".\nIf not, press " YESBUTTONNAME " daintily."
+#define ENDSTR8 "I'm thinkin' that\nyou might wanna press " NOBUTTONNAME "\nto play more. You do it."
+#define ENDSTR9 "Sure. Fine. Quit.\nSee if we care.\nGet it over with.\nPress " YESBUTTONNAME "."
+#else
+#define ENDSTR1 "Dost thou wish to\nleave with such hasty\nabandon?"
+#define ENDSTR2 "Chickening out...\nalready?"
+#define ENDSTR3 "Press " NOBUTTONNAME " for more carnage.\nPress " YESBUTTONNAME " to be a weenie."
+#define ENDSTR4 "So, you think you can\nquit this easily, huh?"
+#define ENDSTR5 "Press " NOBUTTONNAME " to save the world.\nPress " YESBUTTONNAME " to abandon it in\nits hour of need."
+#define ENDSTR6 "Press " NOBUTTONNAME " if you are brave.\nPress " YESBUTTONNAME " to cower in shame."
+#define ENDSTR7 "Heroes, press " NOBUTTONNAME ".\nWimps, press " YESBUTTONNAME "."
+#define ENDSTR8 "You are at an intersection.\nA sign says, 'Press " YESBUTTONNAME " to quit.'\n>"
+#define ENDSTR9 "For guns and glory, press " NOBUTTONNAME ".\nFor work and worry, press " YESBUTTONNAME "."
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/gfxv_apo.h b/apps/plugins/sdl/progs/wolf3d/gfxv_apo.h
new file mode 100644
index 0000000..7352f88
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/gfxv_apo.h
@@ -0,0 +1,244 @@
+//////////////////////////////////////
+//
+// Graphics .H file for Apogee v1.4
+// IGRAB-ed on Sun May 03 01:19:32 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+    // Lump Start
+    H_BJPIC=3,
+    H_CASTLEPIC,                 // 4
+    H_KEYBOARDPIC,               // 5
+    H_JOYPIC,                    // 6
+    H_HEALPIC,                   // 7
+    H_TREASUREPIC,               // 8
+    H_GUNPIC,                    // 9
+    H_KEYPIC,                    // 10
+    H_BLAZEPIC,                  // 11
+    H_WEAPON1234PIC,             // 12
+    H_WOLFLOGOPIC,               // 13
+    H_VISAPIC,                   // 14
+    H_MCPIC,                     // 15
+    H_IDLOGOPIC,                 // 16
+    H_TOPWINDOWPIC,              // 17
+    H_LEFTWINDOWPIC,             // 18
+    H_RIGHTWINDOWPIC,            // 19
+    H_BOTTOMINFOPIC,             // 20
+#if !defined(APOGEE_1_0) && !defined(APOGEE_1_1) && !defined(APOGEE_1_2)
+    H_SPEARADPIC,                // 21
+#endif
+    // Lump Start
+    C_OPTIONSPIC,                // 22
+    C_CURSOR1PIC,                // 23
+    C_CURSOR2PIC,                // 24
+    C_NOTSELECTEDPIC,            // 25
+    C_SELECTEDPIC,               // 26
+    C_FXTITLEPIC,                // 27
+    C_DIGITITLEPIC,              // 28
+    C_MUSICTITLEPIC,             // 29
+    C_MOUSELBACKPIC,             // 30
+    C_BABYMODEPIC,               // 31
+    C_EASYPIC,                   // 32
+    C_NORMALPIC,                 // 33
+    C_HARDPIC,                   // 34
+    C_LOADSAVEDISKPIC,           // 35
+    C_DISKLOADING1PIC,           // 36
+    C_DISKLOADING2PIC,           // 37
+    C_CONTROLPIC,                // 38
+    C_CUSTOMIZEPIC,              // 39
+    C_LOADGAMEPIC,               // 40
+    C_SAVEGAMEPIC,               // 41
+    C_EPISODE1PIC,               // 42
+    C_EPISODE2PIC,               // 43
+    C_EPISODE3PIC,               // 44
+    C_EPISODE4PIC,               // 45
+    C_EPISODE5PIC,               // 46
+    C_EPISODE6PIC,               // 47
+    C_CODEPIC,                   // 48
+#ifndef APOGEE_1_0
+    C_TIMECODEPIC,               // 49
+    C_LEVELPIC,                  // 50
+    C_NAMEPIC,                   // 51
+    C_SCOREPIC,                  // 52
+#if !defined(APOGEE_1_1) && !defined(APOGEE_1_2)
+    C_JOY1PIC,                   // 53
+    C_JOY2PIC,                   // 54
+#endif
+#else
+    C_TIMECODEPIC=C_CODEPIC,     // 47
+#endif
+    // Lump Start
+    L_GUYPIC,                    // 55
+    L_COLONPIC,                  // 56
+    L_NUM0PIC,                   // 57
+    L_NUM1PIC,                   // 58
+    L_NUM2PIC,                   // 59
+    L_NUM3PIC,                   // 60
+    L_NUM4PIC,                   // 61
+    L_NUM5PIC,                   // 62
+    L_NUM6PIC,                   // 63
+    L_NUM7PIC,                   // 64
+    L_NUM8PIC,                   // 65
+    L_NUM9PIC,                   // 66
+    L_PERCENTPIC,                // 67
+    L_APIC,                      // 68
+    L_BPIC,                      // 69
+    L_CPIC,                      // 70
+    L_DPIC,                      // 71
+    L_EPIC,                      // 72
+    L_FPIC,                      // 73
+    L_GPIC,                      // 74
+    L_HPIC,                      // 75
+    L_IPIC,                      // 76
+    L_JPIC,                      // 77
+    L_KPIC,                      // 78
+    L_LPIC,                      // 79
+    L_MPIC,                      // 80
+    L_NPIC,                      // 81
+    L_OPIC,                      // 82
+    L_PPIC,                      // 83
+    L_QPIC,                      // 84
+    L_RPIC,                      // 85
+    L_SPIC,                      // 86
+    L_TPIC,                      // 87
+    L_UPIC,                      // 88
+    L_VPIC,                      // 89
+    L_WPIC,                      // 90
+    L_XPIC,                      // 91
+    L_YPIC,                      // 92
+    L_ZPIC,                      // 93
+    L_EXPOINTPIC,                // 94
+#ifndef APOGEE_1_0
+    L_APOSTROPHEPIC,             // 95
+#endif
+    L_GUY2PIC,                   // 96
+    L_BJWINSPIC,                 // 97
+    STATUSBARPIC,                // 98
+    TITLEPIC,                    // 99
+    PG13PIC,                     // 100
+    CREDITSPIC,                  // 101
+    HIGHSCORESPIC,               // 102
+    // Lump Start
+    KNIFEPIC,                    // 103
+    GUNPIC,                      // 104
+    MACHINEGUNPIC,               // 105
+    GATLINGGUNPIC,               // 106
+    NOKEYPIC,                    // 107
+    GOLDKEYPIC,                  // 108
+    SILVERKEYPIC,                // 109
+    N_BLANKPIC,                  // 110
+    N_0PIC,                      // 111
+    N_1PIC,                      // 112
+    N_2PIC,                      // 113
+    N_3PIC,                      // 114
+    N_4PIC,                      // 115
+    N_5PIC,                      // 116
+    N_6PIC,                      // 117
+    N_7PIC,                      // 118
+    N_8PIC,                      // 119
+    N_9PIC,                      // 120
+    FACE1APIC,                   // 121
+    FACE1BPIC,                   // 122
+    FACE1CPIC,                   // 123
+    FACE2APIC,                   // 124
+    FACE2BPIC,                   // 125
+    FACE2CPIC,                   // 126
+    FACE3APIC,                   // 127
+    FACE3BPIC,                   // 128
+    FACE3CPIC,                   // 129
+    FACE4APIC,                   // 130
+    FACE4BPIC,                   // 131
+    FACE4CPIC,                   // 132
+    FACE5APIC,                   // 133
+    FACE5BPIC,                   // 134
+    FACE5CPIC,                   // 135
+    FACE6APIC,                   // 136
+    FACE6BPIC,                   // 137
+    FACE6CPIC,                   // 138
+    FACE7APIC,                   // 139
+    FACE7BPIC,                   // 140
+    FACE7CPIC,                   // 141
+    FACE8APIC,                   // 142
+    GOTGATLINGPIC,               // 143
+    MUTANTBJPIC,                 // 144
+    PAUSEDPIC,                   // 145
+    GETPSYCHEDPIC,               // 146
+
+    TILE8,                       // 147
+
+    ORDERSCREEN,                 // 148
+    ERRORSCREEN,                 // 149
+    T_HELPART,                   // 150
+#ifdef APOGEE_1_0
+    T_ENDART1,                   // 143
+#endif
+    T_DEMO0,                     // 151
+    T_DEMO1,                     // 152
+    T_DEMO2,                     // 153
+    T_DEMO3,                     // 154
+#ifndef APOGEE_1_0
+    T_ENDART1,                   // 155
+    T_ENDART2,                   // 156
+    T_ENDART3,                   // 157
+    T_ENDART4,                   // 158
+    T_ENDART5,                   // 159
+    T_ENDART6,                   // 160
+#endif
+
+    ENUMEND
+} graphicnums;
+
+//
+// Data LUMPs
+//
+#define README_LUMP_START       H_BJPIC
+#define README_LUMP_END         H_BOTTOMINFOPIC
+
+#define CONTROLS_LUMP_START     C_OPTIONSPIC
+#define CONTROLS_LUMP_END       (L_GUYPIC - 1)
+
+#define LEVELEND_LUMP_START     L_GUYPIC
+#define LEVELEND_LUMP_END       L_BJWINSPIC
+
+#define LATCHPICS_LUMP_START    KNIFEPIC
+#define LATCHPICS_LUMP_END      GETPSYCHEDPIC
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS    ENUMEND
+#define NUMFONT      2
+#define NUMFONTM     0
+#define NUMPICS      (GETPSYCHEDPIC - NUMFONT)
+#define NUMPICM      0
+#define NUMSPRITES   0
+#define NUMTILE8     72
+#define NUMTILE8M    0
+#define NUMTILE16    0
+#define NUMTILE16M   0
+#define NUMTILE32    0
+#define NUMTILE32M   0
+#define NUMEXTERNS   13
+//
+// File offsets for data items
+//
+#define STRUCTPIC    0
+
+#define STARTFONT    1
+#define STARTFONTM   3
+#define STARTPICS    3
+#define STARTPICM    TILE8
+#define STARTSPRITES TILE8
+#define STARTTILE8   TILE8
+#define STARTTILE8M  ORDERSCREEN
+#define STARTTILE16  ORDERSCREEN
+#define STARTTILE16M ORDERSCREEN
+#define STARTTILE32  ORDERSCREEN
+#define STARTTILE32M ORDERSCREEN
+#define STARTEXTERNS ORDERSCREEN
+
+//
+// Thank you for using IGRAB!
+//
diff --git a/apps/plugins/sdl/progs/wolf3d/gfxv_sod.h b/apps/plugins/sdl/progs/wolf3d/gfxv_sod.h
new file mode 100644
index 0000000..8c82a89
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/gfxv_sod.h
@@ -0,0 +1,290 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .SOD
+// IGRAB-ed on Thu Oct 08 20:38:29 1992
+//
+//////////////////////////////////////
+
+typedef enum {
+    // Lump Start
+    C_BACKDROPPIC=3,
+    C_MOUSELBACKPIC,                     // 4
+    C_CURSOR1PIC,                        // 5
+    C_CURSOR2PIC,                        // 6
+    C_NOTSELECTEDPIC,                    // 7
+    C_SELECTEDPIC,                       // 8
+    // Lump Start
+    C_CUSTOMIZEPIC,                      // 9
+    C_JOY1PIC,                           // 10
+    C_JOY2PIC,                           // 11
+    C_MOUSEPIC,                          // 12
+    C_JOYSTICKPIC,                       // 13
+    C_KEYBOARDPIC,                       // 14
+    C_CONTROLPIC,                        // 15
+    // Lump Start
+    C_OPTIONSPIC,                        // 16
+    // Lump Start
+    C_FXTITLEPIC,                        // 17
+    C_DIGITITLEPIC,                      // 18
+    C_MUSICTITLEPIC,                     // 19
+    // Lump Start
+    C_HOWTOUGHPIC,                       // 20
+    C_BABYMODEPIC,                       // 21
+    C_EASYPIC,                           // 22
+    C_NORMALPIC,                         // 23
+    C_HARDPIC,                           // 24
+    // Lump Start
+    C_DISKLOADING1PIC,                   // 25
+    C_DISKLOADING2PIC,                   // 26
+    C_LOADGAMEPIC,                       // 27
+    C_SAVEGAMEPIC,                       // 28
+    // Lump Start
+    HIGHSCORESPIC,                       // 29
+    C_WONSPEARPIC,                       // 30
+#ifndef SPEARDEMO
+    // Lump Start
+    BJCOLLAPSE1PIC,                      // 31
+    BJCOLLAPSE2PIC,                      // 32
+    BJCOLLAPSE3PIC,                      // 33
+    BJCOLLAPSE4PIC,                      // 34
+    ENDPICPIC,                           // 35
+#endif
+    // Lump Start
+    L_GUYPIC,                            // 36
+    L_COLONPIC,                          // 37
+    L_NUM0PIC,                           // 38
+    L_NUM1PIC,                           // 39
+    L_NUM2PIC,                           // 40
+    L_NUM3PIC,                           // 41
+    L_NUM4PIC,                           // 42
+    L_NUM5PIC,                           // 43
+    L_NUM6PIC,                           // 44
+    L_NUM7PIC,                           // 45
+    L_NUM8PIC,                           // 46
+    L_NUM9PIC,                           // 47
+    L_PERCENTPIC,                        // 48
+    L_APIC,                              // 49
+    L_BPIC,                              // 50
+    L_CPIC,                              // 51
+    L_DPIC,                              // 52
+    L_EPIC,                              // 53
+    L_FPIC,                              // 54
+    L_GPIC,                              // 55
+    L_HPIC,                              // 56
+    L_IPIC,                              // 57
+    L_JPIC,                              // 58
+    L_KPIC,                              // 59
+    L_LPIC,                              // 60
+    L_MPIC,                              // 61
+    L_NPIC,                              // 62
+    L_OPIC,                              // 63
+    L_PPIC,                              // 64
+    L_QPIC,                              // 65
+    L_RPIC,                              // 66
+    L_SPIC,                              // 67
+    L_TPIC,                              // 68
+    L_UPIC,                              // 69
+    L_VPIC,                              // 70
+    L_WPIC,                              // 71
+    L_XPIC,                              // 72
+    L_YPIC,                              // 73
+    L_ZPIC,                              // 74
+    L_EXPOINTPIC,                        // 75
+    L_APOSTROPHEPIC,                     // 76
+    L_GUY2PIC,                           // 77
+    L_BJWINSPIC,                         // 78
+    // Lump Start
+    TITLE1PIC,                           // 79
+    TITLE2PIC,                           // 80
+#ifndef SPEARDEMO
+    // Lump Start
+    ENDSCREEN11PIC,                      // 81
+    // Lump Start
+    ENDSCREEN12PIC,                      // 82
+    ENDSCREEN3PIC,                       // 83
+    ENDSCREEN4PIC,                       // 84
+    ENDSCREEN5PIC,                       // 85
+    ENDSCREEN6PIC,                       // 86
+    ENDSCREEN7PIC,                       // 87
+    ENDSCREEN8PIC,                       // 88
+    ENDSCREEN9PIC,                       // 89
+#endif
+    STATUSBARPIC,                        // 90
+    PG13PIC,                             // 91
+    CREDITSPIC,                          // 92
+#ifndef SPEARDEMO
+    // Lump Start
+    IDGUYS1PIC,                          // 93
+    IDGUYS2PIC,                          // 94
+    // Lump Start
+    COPYPROTTOPPIC,                      // 95
+    COPYPROTBOXPIC,                      // 96
+    BOSSPIC1PIC,                         // 97
+    BOSSPIC2PIC,                         // 98
+    BOSSPIC3PIC,                         // 99
+    BOSSPIC4PIC,                         // 100
+#endif
+    // Lump Start
+    KNIFEPIC,                            // 101
+    GUNPIC,                              // 102
+    MACHINEGUNPIC,                       // 103
+    GATLINGGUNPIC,                       // 104
+    NOKEYPIC,                            // 105
+    GOLDKEYPIC,                          // 106
+    SILVERKEYPIC,                        // 107
+    N_BLANKPIC,                          // 108
+    N_0PIC,                              // 109
+    N_1PIC,                              // 110
+    N_2PIC,                              // 111
+    N_3PIC,                              // 112
+    N_4PIC,                              // 113
+    N_5PIC,                              // 114
+    N_6PIC,                              // 115
+    N_7PIC,                              // 116
+    N_8PIC,                              // 117
+    N_9PIC,                              // 118
+    FACE1APIC,                           // 119
+    FACE1BPIC,                           // 120
+    FACE1CPIC,                           // 121
+    FACE2APIC,                           // 122
+    FACE2BPIC,                           // 123
+    FACE2CPIC,                           // 124
+    FACE3APIC,                           // 125
+    FACE3BPIC,                           // 126
+    FACE3CPIC,                           // 127
+    FACE4APIC,                           // 128
+    FACE4BPIC,                           // 129
+    FACE4CPIC,                           // 130
+    FACE5APIC,                           // 131
+    FACE5BPIC,                           // 132
+    FACE5CPIC,                           // 133
+    FACE6APIC,                           // 134
+    FACE6BPIC,                           // 135
+    FACE6CPIC,                           // 136
+    FACE7APIC,                           // 137
+    FACE7BPIC,                           // 138
+    FACE7CPIC,                           // 139
+    FACE8APIC,                           // 140
+    GOTGATLINGPIC,                       // 141
+    GODMODEFACE1PIC,                     // 142
+    GODMODEFACE2PIC,                     // 143
+    GODMODEFACE3PIC,                     // 144
+    BJWAITING1PIC,                       // 145
+    BJWAITING2PIC,                       // 146
+    BJOUCHPIC,                           // 147
+    PAUSEDPIC,                           // 148
+    GETPSYCHEDPIC,                       // 149
+
+    TILE8,                               // 150
+
+    ORDERSCREEN,                         // 151
+    ERRORSCREEN,                         // 152
+    TITLEPALETTE,                        // 153
+#ifndef SPEARDEMO
+    END1PALETTE,                         // 154
+    END2PALETTE,                         // 155
+    END3PALETTE,                         // 156
+    END4PALETTE,                         // 157
+    END5PALETTE,                         // 158
+    END6PALETTE,                         // 159
+    END7PALETTE,                         // 160
+    END8PALETTE,                         // 161
+    END9PALETTE,                         // 162
+    IDGUYSPALETTE,                       // 163
+#endif
+    T_DEMO0,                             // 164
+#ifndef SPEARDEMO
+    T_DEMO1,                             // 165
+    T_DEMO2,                             // 166
+    T_DEMO3,                             // 167
+    T_ENDART1,                           // 168
+#endif
+    ENUMEND
+} graphicnums;
+
+//
+// Data LUMPs
+//
+#define BACKDROP_LUMP_START		3
+#define BACKDROP_LUMP_END		8
+
+#define CONTROL_LUMP_START		9
+#define CONTROL_LUMP_END		15
+
+#define OPTIONS_LUMP_START		16
+#define OPTIONS_LUMP_END		16
+
+#define SOUND_LUMP_START		17
+#define SOUND_LUMP_END			19
+
+#define NEWGAME_LUMP_START		20
+#define NEWGAME_LUMP_END		24
+
+#define LOADSAVE_LUMP_START		25
+#define LOADSAVE_LUMP_END		28
+
+#define HIGHSCORES_LUMP_START	29
+#define HIGHSCORES_LUMP_END		30
+
+#define ENDGAME_LUMP_START		31
+#define ENDGAME_LUMP_END		35
+
+#define LEVELEND_LUMP_START		L_GUYPIC
+#define LEVELEND_LUMP_END		L_BJWINSPIC
+
+#define TITLESCREEN_LUMP_START	TITLE1PIC
+#define TITLESCREEN_LUMP_END	TITLE2PIC
+
+#define ENDGAME1_LUMP_START		ENDSCREEN11PIC
+#define ENDGAME1_LUMP_END		ENDSCREEN11PIC
+
+#define ENDGAME2_LUMP_START		ENDSCREEN12PIC
+#define ENDGAME2_LUMP_END		ENDSCREEN12PIC
+
+#define EASTEREGG_LUMP_START	IDGUYS1PIC
+#define EASTEREGG_LUMP_END		IDGUYS2PIC
+
+#define COPYPROT_LUMP_START		COPYPROTTOPPIC
+#define COPYPROT_LUMP_END		BOSSPIC4PIC
+
+#define LATCHPICS_LUMP_START    KNIFEPIC
+#define LATCHPICS_LUMP_END		GETPSYCHEDPIC
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS    ENUMEND
+#define NUMFONT      2
+#define NUMFONTM     0
+#define NUMPICS      (GETPSYCHEDPIC - NUMFONT)
+#define NUMPICM      0
+#define NUMSPRITES   0
+#define NUMTILE8     72
+#define NUMTILE8M    0
+#define NUMTILE16    0
+#define NUMTILE16M   0
+#define NUMTILE32    0
+#define NUMTILE32M   0
+#define NUMEXTERNS   18
+//
+// File offsets for data items
+//
+#define STRUCTPIC    0
+
+#define STARTFONT    1
+#define STARTFONTM   3
+#define STARTPICS    3
+#define STARTPICM    TILE8
+#define STARTSPRITES TILE8
+#define STARTTILE8   TILE8
+#define STARTTILE8M  ORDERSCREEN
+#define STARTTILE16  ORDERSCREEN
+#define STARTTILE16M ORDERSCREEN
+#define STARTTILE32  ORDERSCREEN
+#define STARTTILE32M ORDERSCREEN
+#define STARTEXTERNS ORDERSCREEN
+
+//
+// Thank you for using IGRAB!
+//
diff --git a/apps/plugins/sdl/progs/wolf3d/gfxv_wl6.h b/apps/plugins/sdl/progs/wolf3d/gfxv_wl6.h
new file mode 100644
index 0000000..f1403ba
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/gfxv_wl6.h
@@ -0,0 +1,216 @@
+//////////////////////////////////////
+//
+// Graphics .H file for .WL6
+// IGRAB-ed on Wed Apr 13 06:58:44 1994
+//
+//////////////////////////////////////
+
+typedef enum {
+    // Lump Start
+    H_BJPIC=3,
+    H_CASTLEPIC,                         // 4
+    H_BLAZEPIC,                          // 5
+    H_TOPWINDOWPIC,                      // 6
+    H_LEFTWINDOWPIC,                     // 7
+    H_RIGHTWINDOWPIC,                    // 8
+    H_BOTTOMINFOPIC,                     // 9
+    // Lump Start
+    C_OPTIONSPIC,                        // 10
+    C_CURSOR1PIC,                        // 11
+    C_CURSOR2PIC,                        // 12
+    C_NOTSELECTEDPIC,                    // 13
+    C_SELECTEDPIC,                       // 14
+    C_FXTITLEPIC,                        // 15
+    C_DIGITITLEPIC,                      // 16
+    C_MUSICTITLEPIC,                     // 17
+    C_MOUSELBACKPIC,                     // 18
+    C_BABYMODEPIC,                       // 19
+    C_EASYPIC,                           // 20
+    C_NORMALPIC,                         // 21
+    C_HARDPIC,                           // 22
+    C_LOADSAVEDISKPIC,                   // 23
+    C_DISKLOADING1PIC,                   // 24
+    C_DISKLOADING2PIC,                   // 25
+    C_CONTROLPIC,                        // 26
+    C_CUSTOMIZEPIC,                      // 27
+    C_LOADGAMEPIC,                       // 28
+    C_SAVEGAMEPIC,                       // 29
+    C_EPISODE1PIC,                       // 30
+    C_EPISODE2PIC,                       // 31
+    C_EPISODE3PIC,                       // 32
+    C_EPISODE4PIC,                       // 33
+    C_EPISODE5PIC,                       // 34
+    C_EPISODE6PIC,                       // 35
+    C_CODEPIC,                           // 36
+    C_TIMECODEPIC,                       // 37
+    C_LEVELPIC,                          // 38
+    C_NAMEPIC,                           // 39
+    C_SCOREPIC,                          // 40
+    C_JOY1PIC,                           // 41
+    C_JOY2PIC,                           // 42
+    // Lump Start
+    L_GUYPIC,                            // 43
+    L_COLONPIC,                          // 44
+    L_NUM0PIC,                           // 45
+    L_NUM1PIC,                           // 46
+    L_NUM2PIC,                           // 47
+    L_NUM3PIC,                           // 48
+    L_NUM4PIC,                           // 49
+    L_NUM5PIC,                           // 50
+    L_NUM6PIC,                           // 51
+    L_NUM7PIC,                           // 52
+    L_NUM8PIC,                           // 53
+    L_NUM9PIC,                           // 54
+    L_PERCENTPIC,                        // 55
+    L_APIC,                              // 56
+    L_BPIC,                              // 57
+    L_CPIC,                              // 58
+    L_DPIC,                              // 59
+    L_EPIC,                              // 60
+    L_FPIC,                              // 61
+    L_GPIC,                              // 62
+    L_HPIC,                              // 63
+    L_IPIC,                              // 64
+    L_JPIC,                              // 65
+    L_KPIC,                              // 66
+    L_LPIC,                              // 67
+    L_MPIC,                              // 68
+    L_NPIC,                              // 69
+    L_OPIC,                              // 70
+    L_PPIC,                              // 71
+    L_QPIC,                              // 72
+    L_RPIC,                              // 73
+    L_SPIC,                              // 74
+    L_TPIC,                              // 75
+    L_UPIC,                              // 76
+    L_VPIC,                              // 77
+    L_WPIC,                              // 78
+    L_XPIC,                              // 79
+    L_YPIC,                              // 80
+    L_ZPIC,                              // 81
+    L_EXPOINTPIC,                        // 82
+    L_APOSTROPHEPIC,                     // 83
+    L_GUY2PIC,                           // 84
+    L_BJWINSPIC,                         // 85
+    STATUSBARPIC,                        // 86
+    TITLEPIC,                            // 87
+    PG13PIC,                             // 88
+    CREDITSPIC,                          // 89
+    HIGHSCORESPIC,                       // 90
+    // Lump Start
+    KNIFEPIC,                            // 91
+    GUNPIC,                              // 92
+    MACHINEGUNPIC,                       // 93
+    GATLINGGUNPIC,                       // 94
+    NOKEYPIC,                            // 95
+    GOLDKEYPIC,                          // 96
+    SILVERKEYPIC,                        // 97
+    N_BLANKPIC,                          // 98
+    N_0PIC,                              // 99
+    N_1PIC,                              // 100
+    N_2PIC,                              // 101
+    N_3PIC,                              // 102
+    N_4PIC,                              // 103
+    N_5PIC,                              // 104
+    N_6PIC,                              // 105
+    N_7PIC,                              // 106
+    N_8PIC,                              // 107
+    N_9PIC,                              // 108
+    FACE1APIC,                           // 109
+    FACE1BPIC,                           // 110
+    FACE1CPIC,                           // 111
+    FACE2APIC,                           // 112
+    FACE2BPIC,                           // 113
+    FACE2CPIC,                           // 114
+    FACE3APIC,                           // 115
+    FACE3BPIC,                           // 116
+    FACE3CPIC,                           // 117
+    FACE4APIC,                           // 118
+    FACE4BPIC,                           // 119
+    FACE4CPIC,                           // 120
+    FACE5APIC,                           // 121
+    FACE5BPIC,                           // 122
+    FACE5CPIC,                           // 123
+    FACE6APIC,                           // 124
+    FACE6BPIC,                           // 125
+    FACE6CPIC,                           // 126
+    FACE7APIC,                           // 127
+    FACE7BPIC,                           // 128
+    FACE7CPIC,                           // 129
+    FACE8APIC,                           // 130
+    GOTGATLINGPIC,                       // 131
+    MUTANTBJPIC,                         // 132
+    PAUSEDPIC,                           // 133
+    GETPSYCHEDPIC,                       // 134
+
+
+
+    ORDERSCREEN=136,
+    ERRORSCREEN,                         // 137
+    T_HELPART,                           // 138
+    T_DEMO0,                             // 139
+    T_DEMO1,                             // 140
+    T_DEMO2,                             // 141
+    T_DEMO3,                             // 142
+    T_ENDART1,                           // 143
+    T_ENDART2,                           // 144
+    T_ENDART3,                           // 145
+    T_ENDART4,                           // 146
+    T_ENDART5,                           // 147
+    T_ENDART6,                           // 148
+    ENUMEND
+} graphicnums;
+
+//
+// Data LUMPs
+//
+#define README_LUMP_START		3
+#define README_LUMP_END			9
+
+#define CONTROLS_LUMP_START		10
+#define CONTROLS_LUMP_END		42
+
+#define LEVELEND_LUMP_START		43
+#define LEVELEND_LUMP_END		85
+
+#define LATCHPICS_LUMP_START	91
+#define LATCHPICS_LUMP_END		134
+
+
+//
+// Amount of each data item
+//
+#define NUMCHUNKS    149
+#define NUMFONT      2
+#define NUMFONTM     0
+#define NUMPICS      132
+#define NUMPICM      0
+#define NUMSPRITES   0
+#define NUMTILE8     72
+#define NUMTILE8M    0
+#define NUMTILE16    0
+#define NUMTILE16M   0
+#define NUMTILE32    0
+#define NUMTILE32M   0
+#define NUMEXTERNS   13
+//
+// File offsets for data items
+//
+#define STRUCTPIC    0
+
+#define STARTFONT    1
+#define STARTFONTM   3
+#define STARTPICS    3
+#define STARTPICM    135
+#define STARTSPRITES 135
+#define STARTTILE8   135
+#define STARTTILE8M  136
+#define STARTTILE16  136
+#define STARTTILE16M 136
+#define STARTTILE32  136
+#define STARTTILE32M 136
+#define STARTEXTERNS 136
+
+//
+// Thank you for using IGRAB!
+//
diff --git a/apps/plugins/sdl/progs/wolf3d/gp2x.h b/apps/plugins/sdl/progs/wolf3d/gp2x.h
new file mode 100644
index 0000000..f8b3557
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/gp2x.h
@@ -0,0 +1,51 @@
+#ifndef GP2X_H
+#define GP2X_H
+
+#include <SDL/SDL.h>
+#include <sys/ioctl.h>
+#include <sys/soundcard.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "wl_def.h"
+
+#define GP2X_BUTTON_UP              (0)
+#define GP2X_BUTTON_DOWN            (4)
+#define GP2X_BUTTON_LEFT            (2)
+#define GP2X_BUTTON_RIGHT           (6)
+#define GP2X_BUTTON_UPLEFT          (1)
+#define GP2X_BUTTON_UPRIGHT         (7)
+#define GP2X_BUTTON_DOWNLEFT        (3)
+#define GP2X_BUTTON_DOWNRIGHT       (5)
+#define GP2X_BUTTON_CLICK           (18)
+#define GP2X_BUTTON_A               (12)
+#define GP2X_BUTTON_B               (13)
+#define GP2X_BUTTON_X               (15)
+#define GP2X_BUTTON_Y               (14)
+#define GP2X_BUTTON_L               (11)
+#define GP2X_BUTTON_R               (10)
+#define GP2X_BUTTON_START           (8)
+#define GP2X_BUTTON_SELECT          (9)
+#define GP2X_BUTTON_VOLUP           (16)
+#define GP2X_BUTTON_VOLDOWN         (17)
+
+#define VOLUME_MIN 0
+#define VOLUME_MAX 100
+#define VOLUME_CHANGE_RATE 2
+#define VOLUME_NOCHG 0
+#define VOLUME_DOWN 1
+#define VOLUME_UP 2
+#define KEY_DOWN 1
+#define KEY_UP 0
+
+void GP2X_Init();
+void GP2X_Shutdown();
+void GP2X_StartMMUHack();
+
+void GP2X_AdjustVolume( int direction );
+void GP2X_ButtonDown( int button );
+void GP2X_ButtonUp( int button );
+void Screenshot( void );
+void SetKeyboard( unsigned int key, int press );
+
+#endif // GP2X_H
diff --git a/apps/plugins/sdl/progs/wolf3d/id_ca.c b/apps/plugins/sdl/progs/wolf3d/id_ca.c
new file mode 100644
index 0000000..c6131a9
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_ca.c
@@ -0,0 +1,1113 @@
+// ID_CA.C
+
+// this has been customized for WOLF
+
+/*
+=============================================================================
+
+Id Software Caching Manager
+---------------------------
+
+Must be started BEFORE the memory manager, because it needs to get the headers
+loaded into the data segment
+
+=============================================================================
+*/
+
+#include <SDL.h>
+
+
+#include "wl_def.h"
+#pragma hdrstop
+
+#define THREEBYTEGRSTARTS
+
+/*
+=============================================================================
+
+                             LOCAL CONSTANTS
+
+=============================================================================
+*/
+
+typedef struct
+{
+    word bit0,bit1;       // 0-255 is a character, > is a pointer to a node
+} huffnode;
+
+
+typedef struct
+{
+    word RLEWtag;
+    int32_t headeroffsets[100];
+} mapfiletype;
+
+
+/*
+=============================================================================
+
+                             GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+#define BUFFERSIZE 0x1000
+static int32_t bufferseg[BUFFERSIZE/4];
+
+int     mapon;
+
+word    *mapsegs[MAPPLANES];
+static maptype* mapheaderseg[NUMMAPS];
+byte    *audiosegs[NUMSNDCHUNKS];
+byte    *grsegs[NUMCHUNKS];
+
+word    RLEWtag;
+
+int     numEpisodesMissing = 0;
+
+/*
+=============================================================================
+
+                             LOCAL VARIABLES
+
+=============================================================================
+*/
+
+char extension[5]; // Need a string, not constant to change cache files
+char graphext[5];
+char audioext[5];
+static const char gheadname[] = DATADIR "vgahead.";
+static const char gfilename[] = DATADIR "vgagraph.";
+static const char gdictname[] = DATADIR "vgadict.";
+static const char mheadname[] = DATADIR "maphead.";
+static const char mfilename[] = DATADIR "maptemp.";
+static const char mfilecama[] = DATADIR "gamemaps.";
+static const char aheadname[] = DATADIR "audiohed.";
+static const char afilename[] = DATADIR "audiot.";
+
+void CA_CannotOpen(const char *string);
+
+static int32_t  grstarts[NUMCHUNKS + 1];
+static int32_t* audiostarts; // array of offsets in audio / audiot
+
+#ifdef GRHEADERLINKED
+huffnode *grhuffman;
+#else
+huffnode grhuffman[255];
+#endif
+
+int    grhandle = -1;               // handle to EGAGRAPH
+int    maphandle = -1;              // handle to MAPTEMP / GAMEMAPS
+int    audiohandle = -1;            // handle to AUDIOT / AUDIO
+
+int32_t   chunkcomplen,chunkexplen;
+
+SDMode oldsoundmode;
+
+
+static int32_t GRFILEPOS(const size_t idx)
+{
+	assert(idx < lengthof(grstarts));
+	return grstarts[idx];
+}
+
+/*
+=============================================================================
+
+                            LOW LEVEL ROUTINES
+
+=============================================================================
+*/
+
+/*
+============================
+=
+= CAL_GetGrChunkLength
+=
+= Gets the length of an explicit length chunk (not tiles)
+= The file pointer is positioned so the compressed data can be read in next.
+=
+============================
+*/
+
+void CAL_GetGrChunkLength (int chunk)
+{
+    lseek(grhandle,GRFILEPOS(chunk),SEEK_SET);
+    read(grhandle,&chunkexplen,sizeof(chunkexplen));
+    chunkcomplen = GRFILEPOS(chunk+1)-GRFILEPOS(chunk)-4;
+}
+
+
+/*
+==========================
+=
+= CA_WriteFile
+=
+= Writes a file from a memory buffer
+=
+==========================
+*/
+
+boolean CA_WriteFile (const char *filename, void *ptr, int32_t length)
+{
+    const int handle = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
+    if (handle == -1)
+        return false;
+
+    if (!write (handle,ptr,length))
+    {
+        close (handle);
+        return false;
+    }
+    close (handle);
+    return true;
+}
+
+
+
+/*
+==========================
+=
+= CA_LoadFile
+=
+= Allocate space for and load a file
+=
+==========================
+*/
+
+boolean CA_LoadFile (const char *filename, memptr *ptr)
+{
+    int32_t size;
+
+    const int handle = open(filename, O_RDONLY | O_BINARY);
+    if (handle == -1)
+        return false;
+
+    size = lseek(handle, 0, SEEK_END);
+    lseek(handle, 0, SEEK_SET);
+    *ptr=malloc(size);
+    CHECKMALLOCRESULT(*ptr);
+    if (!read (handle,*ptr,size))
+    {
+        close (handle);
+        return false;
+    }
+    close (handle);
+    return true;
+}
+
+/*
+============================================================================
+
+                COMPRESSION routines, see JHUFF.C for more
+
+============================================================================
+*/
+
+static void CAL_HuffExpand(byte *source, byte *dest, int32_t length, huffnode *hufftable)
+{
+    byte *end;
+    huffnode *headptr, *huffptr;
+
+    if(!length || !dest)
+    {
+        Quit("length or dest is null!");
+        return;
+    }
+
+    headptr = hufftable+254;        // head node is always node 254
+
+    int written = 0;
+
+    end=dest+length;
+
+    byte val = *source++;
+    byte mask = 1;
+    word nodeval;
+    huffptr = headptr;
+    while(1)
+    {
+        if(!(val & mask))
+            nodeval = huffptr->bit0;
+        else
+            nodeval = huffptr->bit1;
+        if(mask==0x80)
+        {
+            val = *source++;
+            mask = 1;
+        }
+        else mask <<= 1;
+
+        if(nodeval<256)
+        {
+            *dest++ = (byte) nodeval;
+            written++;
+            huffptr = headptr;
+            if(dest>=end) break;
+        }
+        else
+        {
+            huffptr = hufftable + (nodeval - 256);
+        }
+    }
+}
+
+/*
+======================
+=
+= CAL_CarmackExpand
+=
+= Length is the length of the EXPANDED data
+=
+======================
+*/
+
+#define NEARTAG 0xa7
+#define FARTAG  0xa8
+
+void CAL_CarmackExpand (byte *source, word *dest, int length)
+{
+    word ch,chhigh,count,offset;
+    byte *inptr;
+    word *copyptr, *outptr;
+
+    length/=2;
+
+    inptr = (byte *) source;
+    outptr = dest;
+
+    while (length>0)
+    {
+        ch = READWORD(&inptr);
+        chhigh = ch>>8;
+        if (chhigh == NEARTAG)
+        {
+            count = ch&0xff;
+            if (!count)
+            {                               // have to insert a word containing the tag byte
+                ch |= *inptr++;
+                *outptr++ = ch;
+                length--;
+            }
+            else
+            {
+                offset = *inptr++;
+                copyptr = outptr - offset;
+                length -= count;
+                if(length<0) return;
+                while (count--)
+                    *outptr++ = *copyptr++;
+            }
+        }
+        else if (chhigh == FARTAG)
+        {
+            count = ch&0xff;
+            if (!count)
+            {                               // have to insert a word containing the tag byte
+                ch |= *inptr++;
+                *outptr++ = ch;
+                length --;
+            }
+            else
+            {
+                offset = READWORD(&inptr);
+                copyptr = dest + offset;
+                length -= count;
+                if(length<0) return;
+                while (count--)
+                    *outptr++ = *copyptr++;
+            }
+        }
+        else
+        {
+            *outptr++ = ch;
+            length --;
+        }
+    }
+}
+
+/*
+======================
+=
+= CA_RLEWcompress
+=
+======================
+*/
+
+int32_t CA_RLEWCompress (word *source, int32_t length, word *dest, word rlewtag)
+{
+    word value,count;
+    unsigned i;
+    word *start,*end;
+
+    start = dest;
+
+    end = source + (length+1)/2;
+
+    //
+    // compress it
+    //
+    do
+    {
+        count = 1;
+        value = *source++;
+        while (*source == value && source<end)
+        {
+            count++;
+            source++;
+        }
+        if (count>3 || value == rlewtag)
+        {
+            //
+            // send a tag / count / value string
+            //
+            *dest++ = rlewtag;
+            *dest++ = count;
+            *dest++ = value;
+        }
+        else
+        {
+            //
+            // send word without compressing
+            //
+            for (i=1;i<=count;i++)
+                *dest++ = value;
+        }
+
+    } while (source<end);
+
+    return (int32_t)(2*(dest-start));
+}
+
+
+/*
+======================
+=
+= CA_RLEWexpand
+= length is EXPANDED length
+=
+======================
+*/
+
+void CA_RLEWexpand (word *source, word *dest, int32_t length, word rlewtag)
+{
+    word value,count,i;
+    word *end=dest+length/2;
+
+//
+// expand it
+//
+    do
+    {
+        value = *source++;
+        if (value != rlewtag)
+            //
+            // uncompressed
+            //
+            *dest++=value;
+        else
+        {
+            //
+            // compressed string
+            //
+            count = *source++;
+            value = *source++;
+            for (i=1;i<=count;i++)
+                *dest++ = value;
+        }
+    } while (dest<end);
+}
+
+
+
+/*
+=============================================================================
+
+                                         CACHE MANAGER ROUTINES
+
+=============================================================================
+*/
+
+
+/*
+======================
+=
+= CAL_SetupGrFile
+=
+======================
+*/
+
+void CAL_SetupGrFile (void)
+{
+    char fname[13 + sizeof(DATADIR)];
+    int handle;
+    byte *compseg;
+
+#ifdef GRHEADERLINKED
+
+    grhuffman = (huffnode *)&EGAdict;
+    grstarts = (int32_t _seg *)FP_SEG(&EGAhead);
+
+#else
+
+//
+// load ???dict.ext (huffman dictionary for graphics files)
+//
+
+    strcpy(fname,gdictname);
+    strcat(fname,graphext);
+
+    handle = open(fname, O_RDONLY | O_BINARY);
+    if (handle == -1)
+        CA_CannotOpen(fname);
+
+    read(handle, grhuffman, sizeof(grhuffman));
+    close(handle);
+
+    // load the data offsets from ???head.ext
+    strcpy(fname,gheadname);
+    strcat(fname,graphext);
+
+    handle = open(fname, O_RDONLY | O_BINARY);
+    if (handle == -1)
+        CA_CannotOpen(fname);
+
+    long headersize = lseek(handle, 0, SEEK_END);
+    lseek(handle, 0, SEEK_SET);
+
+#ifndef APOGEE_1_0
+	int expectedsize = lengthof(grstarts) - numEpisodesMissing;
+#else
+	int expectedsize = lengthof(grstarts);
+#endif
+
+    if(!param_ignorenumchunks && headersize / 3 != (long) expectedsize)
+        Quit("Wolf4SDL was not compiled for these data files:\n"
+            "%s contains a wrong number of offsets (%i instead of %i)!\n\n"
+            "Please check whether you are using the right executable!\n"
+            "(For mod developers: perhaps you forgot to update NUMCHUNKS?)",
+            fname, headersize / 3, expectedsize);
+
+    byte data[lengthof(grstarts) * 3];
+    read(handle, data, sizeof(data));
+    close(handle);
+
+    const byte* d = data;
+    for (int32_t* i = grstarts; i != endof(grstarts); ++i)
+    {
+        const int32_t val = d[0] | d[1] << 8 | d[2] << 16;
+        *i = (val == 0x00FFFFFF ? -1 : val);
+        d += 3;
+    }
+#endif
+
+//
+// Open the graphics file, leaving it open until the game is finished
+//
+    strcpy(fname,gfilename);
+    strcat(fname,graphext);
+
+    grhandle = open(fname, O_RDONLY | O_BINARY);
+    if (grhandle == -1)
+        CA_CannotOpen(fname);
+
+
+//
+// load the pic and sprite headers into the arrays in the data segment
+//
+    pictable=(pictabletype *) malloc(NUMPICS*sizeof(pictabletype));
+    CHECKMALLOCRESULT(pictable);
+    CAL_GetGrChunkLength(STRUCTPIC);                // position file pointer
+    compseg=(byte *) malloc(chunkcomplen);
+    CHECKMALLOCRESULT(compseg);
+    read (grhandle,compseg,chunkcomplen);
+    CAL_HuffExpand(compseg, (byte*)pictable, NUMPICS * sizeof(pictabletype), grhuffman);
+    free(compseg);
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CAL_SetupMapFile
+=
+======================
+*/
+
+void CAL_SetupMapFile (void)
+{
+    int     i;
+    int handle;
+    int32_t length,pos;
+    char fname[13 + sizeof(DATADIR)];
+
+//
+// load maphead.ext (offsets and tileinfo for map file)
+//
+    strcpy(fname,mheadname);
+    strcat(fname,extension);
+
+    handle = open(fname, O_RDONLY | O_BINARY);
+    if (handle == -1)
+        CA_CannotOpen(fname);
+
+    length = NUMMAPS*4+2; // used to be "filelength(handle);"
+    mapfiletype *tinf=(mapfiletype *) malloc(sizeof(mapfiletype));
+    CHECKMALLOCRESULT(tinf);
+    read(handle, tinf, length);
+    close(handle);
+
+    RLEWtag=tinf->RLEWtag;
+
+//
+// open the data file
+//
+#ifdef CARMACIZED
+    strcpy(fname, mfilecama);
+    strcat(fname, extension);
+
+    maphandle = open(fname, O_RDONLY | O_BINARY);
+    if (maphandle == -1)
+        CA_CannotOpen(fname);
+#else
+    strcpy(fname,mfilename);
+    strcat(fname,extension);
+
+    maphandle = open(fname, O_RDONLY | O_BINARY);
+    if (maphandle == -1)
+        CA_CannotOpen(fname);
+#endif
+
+//
+// load all map header
+//
+    for (i=0;i<NUMMAPS;i++)
+    {
+        pos = tinf->headeroffsets[i];
+        if (pos<0)                          // $FFFFFFFF start is a sparse map
+            continue;
+
+        mapheaderseg[i]=(maptype *) malloc(sizeof(maptype));
+        CHECKMALLOCRESULT(mapheaderseg[i]);
+        lseek(maphandle,pos,SEEK_SET);
+        read (maphandle,(memptr)mapheaderseg[i],sizeof(maptype));
+    }
+
+    free(tinf);
+
+//
+// allocate space for 3 64*64 planes
+//
+    for (i=0;i<MAPPLANES;i++)
+    {
+        mapsegs[i]=(word *) malloc(maparea*2);
+        CHECKMALLOCRESULT(mapsegs[i]);
+    }
+}
+
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CAL_SetupAudioFile
+=
+======================
+*/
+
+void CAL_SetupAudioFile (void)
+{
+    char fname[13 + sizeof(DATADIR)];
+
+//
+// load audiohed.ext (offsets for audio file)
+//
+    strcpy(fname,aheadname);
+    strcat(fname,audioext);
+
+    void* ptr;
+    if (!CA_LoadFile(fname, &ptr))
+        CA_CannotOpen(fname);
+    audiostarts = (int32_t*)ptr;
+
+//
+// open the data file
+//
+    strcpy(fname,afilename);
+    strcat(fname,audioext);
+
+    audiohandle = open(fname, O_RDONLY | O_BINARY);
+    if (audiohandle == -1)
+        CA_CannotOpen(fname);
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CA_Startup
+=
+= Open all files and load in headers
+=
+======================
+*/
+
+void CA_Startup (void)
+{
+#ifdef PROFILE
+    unlink ("PROFILE.TXT");
+    profilehandle = open("PROFILE.TXT", O_CREAT | O_WRONLY | O_TEXT);
+#endif
+
+    CAL_SetupMapFile ();
+    CAL_SetupGrFile ();
+    CAL_SetupAudioFile ();
+
+    mapon = -1;
+}
+
+//==========================================================================
+
+
+/*
+======================
+=
+= CA_Shutdown
+=
+= Closes all files
+=
+======================
+*/
+
+void CA_Shutdown (void)
+{
+    int i,start;
+
+    if(maphandle != -1)
+        close(maphandle);
+    if(grhandle != -1)
+        close(grhandle);
+    if(audiohandle != -1)
+        close(audiohandle);
+
+    for(i=0; i<NUMCHUNKS; i++)
+        UNCACHEGRCHUNK(i);
+    free(pictable);
+
+    switch(oldsoundmode)
+    {
+        case sdm_Off:
+            return;
+        case sdm_PC:
+            start = STARTPCSOUNDS;
+            break;
+        case sdm_AdLib:
+            start = STARTADLIBSOUNDS;
+            break;
+    }
+
+    for(i=0; i<NUMSOUNDS; i++,start++)
+        UNCACHEAUDIOCHUNK(start);
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_CacheAudioChunk
+=
+======================
+*/
+
+int32_t CA_CacheAudioChunk (int chunk)
+{
+#ifdef SOUND_ENABLE
+    int32_t pos = audiostarts[chunk];
+    int32_t size = audiostarts[chunk+1]-pos;
+
+    if (audiosegs[chunk])
+        return size;                        // already in memory
+
+    audiosegs[chunk]=(byte *) malloc(size);
+    CHECKMALLOCRESULT(audiosegs[chunk]);
+
+    lseek(audiohandle,pos,SEEK_SET);
+    read(audiohandle,audiosegs[chunk],size);
+
+    return size;
+#endif
+    return 0;
+}
+
+void CA_CacheAdlibSoundChunk (int chunk)
+{
+#ifdef SOUND_ENABLE
+    int32_t pos = audiostarts[chunk];
+    int32_t size = audiostarts[chunk+1]-pos;
+
+    if (audiosegs[chunk])
+        return;                        // already in memory
+
+    lseek(audiohandle, pos, SEEK_SET);
+    read(audiohandle, bufferseg, ORIG_ADLIBSOUND_SIZE - 1);   // without data[1]
+
+    AdLibSound *sound = (AdLibSound *) malloc(size + sizeof(AdLibSound) - ORIG_ADLIBSOUND_SIZE);
+    CHECKMALLOCRESULT(sound);
+
+    byte *ptr = (byte *) bufferseg;
+    sound->common.length = READLONGWORD(&ptr);
+    sound->common.priority = READWORD(&ptr);
+    sound->inst.mChar = *ptr++;
+    sound->inst.cChar = *ptr++;
+    sound->inst.mScale = *ptr++;
+    sound->inst.cScale = *ptr++;
+    sound->inst.mAttack = *ptr++;
+    sound->inst.cAttack = *ptr++;
+    sound->inst.mSus = *ptr++;
+    sound->inst.cSus = *ptr++;
+    sound->inst.mWave = *ptr++;
+    sound->inst.cWave = *ptr++;
+    sound->inst.nConn = *ptr++;
+    sound->inst.voice = *ptr++;
+    sound->inst.mode = *ptr++;
+    sound->inst.unused[0] = *ptr++;
+    sound->inst.unused[1] = *ptr++;
+    sound->inst.unused[2] = *ptr++;
+    sound->block = *ptr++;
+
+    read(audiohandle, sound->data, size - ORIG_ADLIBSOUND_SIZE + 1);  // + 1 because of byte data[1]
+
+    audiosegs[chunk]=(byte *) sound;
+#endif
+}
+
+//===========================================================================
+
+/*
+======================
+=
+= CA_LoadAllSounds
+=
+= Purges all sounds, then loads all new ones (mode switch)
+=
+======================
+*/
+
+void CA_LoadAllSounds (void)
+{
+#ifdef SOUND_ENABLE
+    unsigned start,i;
+
+    switch (oldsoundmode)
+    {
+        case sdm_Off:
+            goto cachein;
+        case sdm_PC:
+            start = STARTPCSOUNDS;
+            break;
+        case sdm_AdLib:
+            start = STARTADLIBSOUNDS;
+            break;
+    }
+
+    for (i=0;i<NUMSOUNDS;i++,start++)
+        UNCACHEAUDIOCHUNK(start);
+
+cachein:
+
+    oldsoundmode = SoundMode;
+
+    switch (SoundMode)
+    {
+        case sdm_Off:
+            start = STARTADLIBSOUNDS;   // needed for priorities...
+            break;
+        case sdm_PC:
+            start = STARTPCSOUNDS;
+            break;
+        case sdm_AdLib:
+            start = STARTADLIBSOUNDS;
+            break;
+    }
+
+    if(start == STARTADLIBSOUNDS)
+    {
+        for (i=0;i<NUMSOUNDS;i++,start++)
+            CA_CacheAdlibSoundChunk(start);
+    }
+    else
+    {
+        for (i=0;i<NUMSOUNDS;i++,start++)
+            CA_CacheAudioChunk(start);
+    }
+#endif
+}
+
+//===========================================================================
+
+
+/*
+======================
+=
+= CAL_ExpandGrChunk
+=
+= Does whatever is needed with a pointer to a compressed chunk
+=
+======================
+*/
+
+void CAL_ExpandGrChunk (int chunk, int32_t *source)
+{
+    int32_t    expanded;
+
+    if (chunk >= STARTTILE8 && chunk < STARTEXTERNS)
+    {
+        //
+        // expanded sizes of tile8/16/32 are implicit
+        //
+
+#define BLOCK           64
+#define MASKBLOCK       128
+
+        if (chunk<STARTTILE8M)          // tile 8s are all in one chunk!
+            expanded = BLOCK*NUMTILE8;
+        else if (chunk<STARTTILE16)
+            expanded = MASKBLOCK*NUMTILE8M;
+        else if (chunk<STARTTILE16M)    // all other tiles are one/chunk
+            expanded = BLOCK*4;
+        else if (chunk<STARTTILE32)
+            expanded = MASKBLOCK*4;
+        else if (chunk<STARTTILE32M)
+            expanded = BLOCK*16;
+        else
+            expanded = MASKBLOCK*16;
+    }
+    else
+    {
+        //
+        // everything else has an explicit size longword
+        //
+        expanded = *source++;
+    }
+
+    //
+    // allocate final space, decompress it, and free bigbuffer
+    // Sprites need to have shifts made and various other junk
+    //
+    grsegs[chunk]=(byte *) malloc(expanded);
+    CHECKMALLOCRESULT(grsegs[chunk]);
+    CAL_HuffExpand((byte *) source, grsegs[chunk], expanded, grhuffman);
+}
+
+
+/*
+======================
+=
+= CA_CacheGrChunk
+=
+= Makes sure a given chunk is in memory, loadiing it if needed
+=
+======================
+*/
+
+void CA_CacheGrChunk (int chunk)
+{
+    int32_t pos,compressed;
+    int32_t *source;
+    int  next;
+
+    if (grsegs[chunk])
+        return;                             // already in memory
+
+//
+// load the chunk into a buffer, either the miscbuffer if it fits, or allocate
+// a larger buffer
+//
+    pos = GRFILEPOS(chunk);
+    if (pos<0)                              // $FFFFFFFF start is a sparse tile
+        return;
+
+    next = chunk +1;
+    while (GRFILEPOS(next) == -1)           // skip past any sparse tiles
+        next++;
+
+    compressed = GRFILEPOS(next)-pos;
+
+    lseek(grhandle,pos,SEEK_SET);
+
+    if (compressed<=BUFFERSIZE)
+    {
+        read(grhandle,bufferseg,compressed);
+        source = bufferseg;
+    }
+    else
+    {
+        source = (int32_t *) malloc(compressed);
+        CHECKMALLOCRESULT(source);
+        read(grhandle,source,compressed);
+    }
+
+    CAL_ExpandGrChunk (chunk,source);
+
+    if (compressed>BUFFERSIZE)
+        free(source);
+}
+
+
+
+//==========================================================================
+
+/*
+======================
+=
+= CA_CacheScreen
+=
+= Decompresses a chunk from disk straight onto the screen
+=
+======================
+*/
+
+void CA_CacheScreen (int chunk)
+{
+    int32_t    pos,compressed,expanded;
+    memptr  bigbufferseg;
+    int32_t    *source;
+    int             next;
+
+//
+// load the chunk into a buffer
+//
+    pos = GRFILEPOS(chunk);
+    next = chunk +1;
+    while (GRFILEPOS(next) == -1)           // skip past any sparse tiles
+        next++;
+    compressed = GRFILEPOS(next)-pos;
+
+    lseek(grhandle,pos,SEEK_SET);
+
+    bigbufferseg=malloc(compressed);
+    CHECKMALLOCRESULT(bigbufferseg);
+    read(grhandle,bigbufferseg,compressed);
+    source = (int32_t *) bigbufferseg;
+
+    expanded = *source++;
+
+//
+// allocate final space, decompress it, and free bigbuffer
+// Sprites need to have shifts made and various other junk
+//
+    byte *pic = (byte *) malloc(64000);
+    CHECKMALLOCRESULT(pic);
+    CAL_HuffExpand((byte *) source, pic, expanded, grhuffman);
+
+    byte *vbuf = LOCK();
+    for(int y = 0, scy = 0; y < 200; y++, scy += scaleFactor)
+    {
+        for(int x = 0, scx = 0; x < 320; x++, scx += scaleFactor)
+        {
+            byte col = pic[(y * 80 + (x >> 2)) + (x & 3) * 80 * 200];
+            for(unsigned i = 0; i < scaleFactor; i++)
+                for(unsigned j = 0; j < scaleFactor; j++)
+                    vbuf[(scy + i) * curPitch + scx + j] = col;
+        }
+    }
+    UNLOCK();
+    free(pic);
+    free(bigbufferseg);
+}
+
+//==========================================================================
+
+/*
+======================
+=
+= CA_CacheMap
+=
+= WOLF: This is specialized for a 64*64 map size
+=
+======================
+*/
+
+void CA_CacheMap (int mapnum)
+{
+    int32_t   pos,compressed;
+    int       plane;
+    word     *dest;
+    memptr    bigbufferseg;
+    unsigned  size;
+    word     *source;
+#ifdef CARMACIZED
+    word     *buffer2seg;
+    int32_t   expanded;
+#endif
+
+    mapon = mapnum;
+
+//
+// load the planes into the allready allocated buffers
+//
+    size = maparea*2;
+
+    for (plane = 0; plane<MAPPLANES; plane++)
+    {
+        pos = mapheaderseg[mapnum]->planestart[plane];
+        compressed = mapheaderseg[mapnum]->planelength[plane];
+
+        dest = mapsegs[plane];
+
+        lseek(maphandle,pos,SEEK_SET);
+        if (compressed<=BUFFERSIZE)
+            source = (word *) bufferseg;
+        else
+        {
+            bigbufferseg=malloc(compressed);
+            CHECKMALLOCRESULT(bigbufferseg);
+            source = (word *) bigbufferseg;
+        }
+
+        read(maphandle,source,compressed);
+#ifdef CARMACIZED
+        //
+        // unhuffman, then unRLEW
+        // The huffman'd chunk has a two byte expanded length first
+        // The resulting RLEW chunk also does, even though it's not really
+        // needed
+        //
+        expanded = *source;
+        source++;
+        buffer2seg = (word *) malloc(expanded);
+        CHECKMALLOCRESULT(buffer2seg);
+        CAL_CarmackExpand((byte *) source, buffer2seg,expanded);
+        CA_RLEWexpand(buffer2seg+1,dest,size,RLEWtag);
+        free(buffer2seg);
+
+#else
+        //
+        // unRLEW, skipping expanded length
+        //
+        CA_RLEWexpand (source+1,dest,size,RLEWtag);
+#endif
+
+        if (compressed>BUFFERSIZE)
+            free(bigbufferseg);
+    }
+}
+
+//===========================================================================
+
+void CA_CannotOpen(const char *string)
+{
+    char str[30];
+
+    strcpy(str,"Can't open ");
+    strcat(str,string);
+    strcat(str,"!\n");
+    Quit (str);
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_ca.h b/apps/plugins/sdl/progs/wolf3d/id_ca.h
new file mode 100644
index 0000000..87a8886
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_ca.h
@@ -0,0 +1,60 @@
+#ifndef __ID_CA__
+#define __ID_CA__
+
+//===========================================================================
+
+#define NUMMAPS         60
+#ifdef USE_FLOORCEILINGTEX
+    #define MAPPLANES       3
+#else
+    #define MAPPLANES       2
+#endif
+
+#define UNCACHEGRCHUNK(chunk) {if(grsegs[chunk]) {free(grsegs[chunk]); grsegs[chunk]=NULL;}}
+#define UNCACHEAUDIOCHUNK(chunk) {if(audiosegs[chunk]) {free(audiosegs[chunk]); audiosegs[chunk]=NULL;}}
+
+//===========================================================================
+
+typedef struct
+{
+    int32_t planestart[3];
+    word    planelength[3];
+    word    width,height;
+    char    name[16];
+} maptype;
+
+//===========================================================================
+
+extern  int   mapon;
+
+extern  word *mapsegs[MAPPLANES];
+extern  byte *audiosegs[NUMSNDCHUNKS];
+extern  byte *grsegs[NUMCHUNKS];
+
+extern  char  extension[5];
+extern  char  graphext[5];
+extern  char  audioext[5];
+
+//===========================================================================
+
+boolean CA_LoadFile (const char *filename, memptr *ptr);
+boolean CA_WriteFile (const char *filename, void *ptr, int32_t length);
+
+int32_t CA_RLEWCompress (word *source, int32_t length, word *dest, word rlewtag);
+
+void CA_RLEWexpand (word *source, word *dest, int32_t length, word rlewtag);
+
+void CA_Startup (void);
+void CA_Shutdown (void);
+
+int32_t CA_CacheAudioChunk (int chunk);
+void CA_LoadAllSounds (void);
+
+void CA_CacheGrChunk (int chunk);
+void CA_CacheMap (int mapnum);
+
+void CA_CacheScreen (int chunk);
+
+void CA_CannotOpen(const char *name);
+
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/id_in.c b/apps/plugins/sdl/progs/wolf3d/id_in.c
new file mode 100644
index 0000000..62eec2f
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_in.c
@@ -0,0 +1,667 @@
+//
+//	ID Engine
+//	ID_IN.c - Input Manager
+//	v1.0d1
+//	By Jason Blochowiak
+//
+
+//
+//	This module handles dealing with the various input devices
+//
+//	Depends on: Memory Mgr (for demo recording), Sound Mgr (for timing stuff),
+//				User Mgr (for command line parms)
+//
+//	Globals:
+//		LastScan - The keyboard scan code of the last key pressed
+//		LastASCII - The ASCII value of the last key pressed
+//	DEBUG - there are more globals
+//
+
+#include "wl_def.h"
+
+
+/*
+=============================================================================
+
+					GLOBAL VARIABLES
+
+=============================================================================
+*/
+
+
+//
+// configuration variables
+//
+boolean MousePresent;
+boolean forcegrabmouse;
+
+
+// 	Global variables
+volatile boolean    Keyboard[SDLK_LAST];
+volatile boolean	Paused;
+volatile char		LastASCII;
+volatile ScanCode	LastScan;
+
+//KeyboardDef	KbdDefs = {0x1d,0x38,0x47,0x48,0x49,0x4b,0x4d,0x4f,0x50,0x51};
+static KeyboardDef KbdDefs = {
+    sc_Return,              // button0
+    sc_Alt,                 // button1
+    sc_Home,                // upleft
+    sc_UpArrow,             // up
+    sc_PgUp,                // upright
+    sc_LeftArrow,           // left
+    sc_RightArrow,          // right
+    sc_End,                 // downleft
+    sc_DownArrow,           // down
+    sc_PgDn                 // downright
+};
+
+static SDL_Joystick *Joystick;
+int JoyNumButtons;
+static int JoyNumHats;
+
+static bool GrabInput = false;
+
+/*
+=============================================================================
+
+					LOCAL VARIABLES
+
+=============================================================================
+*/
+byte        ASCIINames[] =		// Unshifted ASCII for scan codes       // TODO: keypad
+{
+//	 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,8  ,9  ,0  ,0  ,0  ,13 ,0  ,0  ,	// 0
+    0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,27 ,0  ,0  ,0  ,	// 1
+	' ',0  ,0  ,0  ,0  ,0  ,0  ,39 ,0  ,0  ,'*','+',',','-','.','/',	// 2
+	'0','1','2','3','4','5','6','7','8','9',0  ,';',0  ,'=',0  ,0  ,	// 3
+	'`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',	// 4
+	'p','q','r','s','t','u','v','w','x','y','z','[',92 ,']',0  ,0  ,	// 5
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 6
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0		// 7
+};
+byte ShiftNames[] =		// Shifted ASCII for scan codes
+{
+//	 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,8  ,9  ,0  ,0  ,0  ,13 ,0  ,0  ,	// 0
+    0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,27 ,0  ,0  ,0  ,	// 1
+	' ',0  ,0  ,0  ,0  ,0  ,0  ,34 ,0  ,0  ,'*','+','<','_','>','?',	// 2
+	')','!','@','#','$','%','^','&','*','(',0  ,':',0  ,'+',0  ,0  ,	// 3
+	'~','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',	// 4
+	'P','Q','R','S','T','U','V','W','X','Y','Z','{','|','}',0  ,0  ,	// 5
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 6
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0		// 7
+};
+byte SpecialNames[] =	// ASCII for 0xe0 prefixed codes
+{
+//	 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 0
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,13 ,0  ,0  ,0  ,	// 1
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 2
+	0  ,0  ,0  ,0  ,0  ,'/',0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 3
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 4
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 5
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,	// 6
+	0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0  ,0   	// 7
+};
+
+
+static	boolean		IN_Started;
+
+static	Direction	DirTable[] =		// Quick lookup for total direction
+{
+    dir_NorthWest,	dir_North,	dir_NorthEast,
+    dir_West,		dir_None,	dir_East,
+    dir_SouthWest,	dir_South,	dir_SouthEast
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	INL_GetMouseButtons() - Gets the status of the mouse buttons from the
+//		mouse driver
+//
+///////////////////////////////////////////////////////////////////////////
+static int
+INL_GetMouseButtons(void)
+{
+    int buttons = SDL_GetMouseState(NULL, NULL);
+    int middlePressed = buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE);
+    int rightPressed = buttons & SDL_BUTTON(SDL_BUTTON_RIGHT);
+    buttons &= ~(SDL_BUTTON(SDL_BUTTON_MIDDLE) | SDL_BUTTON(SDL_BUTTON_RIGHT));
+    if(middlePressed) buttons |= 1 << 2;
+    if(rightPressed) buttons |= 1 << 1;
+
+    return buttons;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_GetJoyDelta() - Returns the relative movement of the specified
+//		joystick (from +/-127)
+//
+///////////////////////////////////////////////////////////////////////////
+void IN_GetJoyDelta(int *dx,int *dy)
+{
+    if(!Joystick)
+    {
+        *dx = *dy = 0;
+        return;
+    }
+
+    SDL_JoystickUpdate();
+#ifdef _arch_dreamcast
+    int x = 0;
+    int y = 0;
+#else
+    int x = SDL_JoystickGetAxis(Joystick, 0) >> 8;
+    int y = SDL_JoystickGetAxis(Joystick, 1) >> 8;
+#endif
+
+    if(param_joystickhat != -1)
+    {
+        uint8_t hatState = SDL_JoystickGetHat(Joystick, param_joystickhat);
+        if(hatState & SDL_HAT_RIGHT)
+            x += 127;
+        else if(hatState & SDL_HAT_LEFT)
+            x -= 127;
+        if(hatState & SDL_HAT_DOWN)
+            y += 127;
+        else if(hatState & SDL_HAT_UP)
+            y -= 127;
+
+        if(x < -128) x = -128;
+        else if(x > 127) x = 127;
+
+        if(y < -128) y = -128;
+        else if(y > 127) y = 127;
+    }
+
+    *dx = x;
+    *dy = y;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_GetJoyFineDelta() - Returns the relative movement of the specified
+//		joystick without dividing the results by 256 (from +/-127)
+//
+///////////////////////////////////////////////////////////////////////////
+void IN_GetJoyFineDelta(int *dx, int *dy)
+{
+    if(!Joystick)
+    {
+        *dx = 0;
+        *dy = 0;
+        return;
+    }
+
+    SDL_JoystickUpdate();
+    int x = SDL_JoystickGetAxis(Joystick, 0);
+    int y = SDL_JoystickGetAxis(Joystick, 1);
+
+    if(x < -128) x = -128;
+    else if(x > 127) x = 127;
+
+    if(y < -128) y = -128;
+    else if(y > 127) y = 127;
+
+    *dx = x;
+    *dy = y;
+}
+
+/*
+===================
+=
+= IN_JoyButtons
+=
+===================
+*/
+
+int IN_JoyButtons()
+{
+    if(!Joystick) return 0;
+
+    SDL_JoystickUpdate();
+
+    int res = 0;
+    for(int i = 0; i < JoyNumButtons && i < 32; i++)
+        res |= SDL_JoystickGetButton(Joystick, i) << i;
+    return res;
+}
+
+boolean IN_JoyPresent()
+{
+    return Joystick != NULL;
+}
+
+static void processEvent(SDL_Event *event)
+{
+    switch (event->type)
+    {
+        // exit if the window is closed
+        case SDL_QUIT:
+            Quit(NULL);
+
+        // check for keypresses
+        case SDL_KEYDOWN:
+        {
+            if(event->key.keysym.sym==SDLK_SCROLLOCK || event->key.keysym.sym==SDLK_F12)
+            {
+                GrabInput = !GrabInput;
+                SDL_WM_GrabInput(GrabInput ? SDL_GRAB_ON : SDL_GRAB_OFF);
+                return;
+            }
+
+            LastScan = event->key.keysym.sym;
+            SDLMod mod = SDL_GetModState();
+            if(Keyboard[sc_Alt])
+            {
+                if(LastScan==SDLK_F4)
+                    Quit(NULL);
+            }
+
+            if(LastScan == SDLK_KP_ENTER) LastScan = SDLK_RETURN;
+            else if(LastScan == SDLK_RSHIFT) LastScan = SDLK_LSHIFT;
+            else if(LastScan == SDLK_RALT) LastScan = SDLK_LALT;
+            else if(LastScan == SDLK_RCTRL) LastScan = SDLK_LCTRL;
+            else
+            {
+                if((mod & KMOD_NUM) == 0)
+                {
+                    switch(LastScan)
+                    {
+                        case SDLK_KP2: LastScan = SDLK_DOWN; break;
+                        case SDLK_KP4: LastScan = SDLK_LEFT; break;
+                        case SDLK_KP6: LastScan = SDLK_RIGHT; break;
+                        case SDLK_KP8: LastScan = SDLK_UP; break;
+                    }
+                }
+            }
+
+            int sym = LastScan;
+            if(sym >= 'a' && sym <= 'z')
+                sym -= 32;  // convert to uppercase
+
+            if(mod & (KMOD_SHIFT | KMOD_CAPS))
+            {
+                if(sym < lengthof(ShiftNames) && ShiftNames[sym])
+                    LastASCII = ShiftNames[sym];
+            }
+            else
+            {
+                if(sym < lengthof(ASCIINames) && ASCIINames[sym])
+                    LastASCII = ASCIINames[sym];
+            }
+            if(LastScan<SDLK_LAST)
+            {
+                LOGF("setting key %d", LastScan);
+                Keyboard[LastScan] = 1;
+            }
+            if(LastScan == SDLK_PAUSE)
+                Paused = true;
+            break;
+		}
+
+        case SDL_KEYUP:
+        {
+            int key = event->key.keysym.sym;
+            if(key == SDLK_KP_ENTER) key = SDLK_RETURN;
+            else if(key == SDLK_RSHIFT) key = SDLK_LSHIFT;
+            else if(key == SDLK_RALT) key = SDLK_LALT;
+            else if(key == SDLK_RCTRL) key = SDLK_LCTRL;
+            else
+            {
+                if((SDL_GetModState() & KMOD_NUM) == 0)
+                {
+                    switch(key)
+                    {
+                        case SDLK_KP2: key = SDLK_DOWN; break;
+                        case SDLK_KP4: key = SDLK_LEFT; break;
+                        case SDLK_KP6: key = SDLK_RIGHT; break;
+                        case SDLK_KP8: key = SDLK_UP; break;
+                    }
+                }
+            }
+
+            if(key<SDLK_LAST)
+                Keyboard[key] = 0;
+            break;
+        }
+
+#if defined(GP2X)
+        case SDL_JOYBUTTONDOWN:
+            GP2X_ButtonDown(event->jbutton.button);
+            break;
+
+        case SDL_JOYBUTTONUP:
+            GP2X_ButtonUp(event->jbutton.button);
+            break;
+#endif
+    }
+}
+
+void IN_WaitAndProcessEvents()
+{
+    SDL_Event event;
+    if(!SDL_WaitEvent(&event)) return;
+    do
+    {
+        processEvent(&event);
+    }
+    while(SDL_PollEvent(&event));
+}
+
+void IN_ProcessEvents()
+{
+    SDL_Event event;
+
+    while (SDL_PollEvent(&event))
+    {
+        processEvent(&event);
+    }
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_Startup() - Starts up the Input Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_Startup(void)
+{
+	if (IN_Started)
+		return;
+
+    IN_ClearKeysDown();
+
+    if(param_joystickindex >= 0 && param_joystickindex < SDL_NumJoysticks())
+    {
+        Joystick = SDL_JoystickOpen(param_joystickindex);
+        if(Joystick)
+        {
+            JoyNumButtons = SDL_JoystickNumButtons(Joystick);
+            if(JoyNumButtons > 32) JoyNumButtons = 32;      // only up to 32 buttons are supported
+            JoyNumHats = SDL_JoystickNumHats(Joystick);
+            if(param_joystickhat < -1 || param_joystickhat >= JoyNumHats)
+                Quit("The joystickhat param must be between 0 and %i!", JoyNumHats - 1);
+        }
+    }
+
+    SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
+
+    if(fullscreen || forcegrabmouse)
+    {
+        GrabInput = true;
+        SDL_WM_GrabInput(SDL_GRAB_ON);
+    }
+
+    // I didn't find a way to ask libSDL whether a mouse is present, yet...
+#if defined(GP2X)
+    MousePresent = false;
+#elif defined(_arch_dreamcast)
+    MousePresent = DC_MousePresent();
+#else
+    MousePresent = true;
+#endif
+
+    IN_Started = true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_Shutdown() - Shuts down the Input Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_Shutdown(void)
+{
+	if (!IN_Started)
+		return;
+
+    if(Joystick)
+        SDL_JoystickClose(Joystick);
+
+	IN_Started = false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_ClearKeysDown() - Clears the keyboard array
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_ClearKeysDown(void)
+{
+	LastScan = sc_None;
+	LastASCII = key_None;
+	memset ((void *) Keyboard,0,sizeof(Keyboard));
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_ReadControl() - Reads the device associated with the specified
+//		player and fills in the control info struct
+//
+///////////////////////////////////////////////////////////////////////////
+void
+IN_ReadControl(int player,ControlInfo *info)
+{
+	word		buttons;
+	int			dx,dy;
+	Motion		mx,my;
+
+	dx = dy = 0;
+	mx = my = motion_None;
+	buttons = 0;
+
+	IN_ProcessEvents();
+
+    if (Keyboard[KbdDefs.upleft])
+        mx = motion_Left,my = motion_Up;
+    else if (Keyboard[KbdDefs.upright])
+        mx = motion_Right,my = motion_Up;
+    else if (Keyboard[KbdDefs.downleft])
+        mx = motion_Left,my = motion_Down;
+    else if (Keyboard[KbdDefs.downright])
+        mx = motion_Right,my = motion_Down;
+
+    if (Keyboard[KbdDefs.up])
+        my = motion_Up;
+    else if (Keyboard[KbdDefs.down])
+        my = motion_Down;
+
+    if (Keyboard[KbdDefs.left])
+        mx = motion_Left;
+    else if (Keyboard[KbdDefs.right])
+        mx = motion_Right;
+
+    if (Keyboard[KbdDefs.button0])
+        buttons += 1 << 0;
+    if (Keyboard[KbdDefs.button1])
+        buttons += 1 << 1;
+
+	dx = mx * 127;
+	dy = my * 127;
+
+	info->x = dx;
+	info->xaxis = mx;
+	info->y = dy;
+	info->yaxis = my;
+	info->button0 = (buttons & (1 << 0)) != 0;
+	info->button1 = (buttons & (1 << 1)) != 0;
+	info->button2 = (buttons & (1 << 2)) != 0;
+	info->button3 = (buttons & (1 << 3)) != 0;
+	info->dir = DirTable[((my + 1) * 3) + (mx + 1)];
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_WaitForKey() - Waits for a scan code, then clears LastScan and
+//		returns the scan code
+//
+///////////////////////////////////////////////////////////////////////////
+ScanCode
+IN_WaitForKey(void)
+{
+	ScanCode	result;
+
+	while ((result = LastScan)==0)
+		IN_WaitAndProcessEvents();
+	LastScan = 0;
+	return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and
+//		returns the ASCII value
+//
+///////////////////////////////////////////////////////////////////////////
+char
+IN_WaitForASCII(void)
+{
+	char		result;
+
+	while ((result = LastASCII)==0)
+		IN_WaitAndProcessEvents();
+	LastASCII = '\0';
+	return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_Ack() - waits for a button or key press.  If a button is down, upon
+// calling, it must be released for it to be recognized
+//
+///////////////////////////////////////////////////////////////////////////
+
+boolean	btnstate[NUMBUTTONS];
+
+void IN_StartAck(void)
+{
+    IN_ProcessEvents();
+//
+// get initial state of everything
+//
+	IN_ClearKeysDown();
+	memset(btnstate, 0, sizeof(btnstate));
+
+	int buttons = IN_JoyButtons() << 4;
+
+	if(MousePresent)
+		buttons |= IN_MouseButtons();
+
+	for(int i = 0; i < NUMBUTTONS; i++, buttons >>= 1)
+		if(buttons & 1)
+			btnstate[i] = true;
+}
+
+
+boolean IN_CheckAck (void)
+{
+    IN_ProcessEvents();
+//
+// see if something has been pressed
+//
+	if(LastScan)
+		return true;
+
+	int buttons = IN_JoyButtons() << 4;
+
+	if(MousePresent)
+		buttons |= IN_MouseButtons();
+
+	for(int i = 0; i < NUMBUTTONS; i++, buttons >>= 1)
+	{
+		if(buttons & 1)
+		{
+			if(!btnstate[i])
+            {
+                // Wait until button has been released
+                do
+                {
+                    IN_WaitAndProcessEvents();
+                    buttons = IN_JoyButtons() << 4;
+
+                    if(MousePresent)
+                        buttons |= IN_MouseButtons();
+                }
+                while(buttons & (1 << i));
+
+				return true;
+            }
+		}
+		else
+			btnstate[i] = false;
+	}
+
+	return false;
+}
+
+
+void IN_Ack (void)
+{
+	IN_StartAck ();
+
+    do
+    {
+        IN_WaitAndProcessEvents();
+    }
+	while(!IN_CheckAck ());
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	IN_UserInput() - Waits for the specified delay time (in ticks) or the
+//		user pressing a key or a mouse button. If the clear flag is set, it
+//		then either clears the key or waits for the user to let the mouse
+//		button up.
+//
+///////////////////////////////////////////////////////////////////////////
+boolean IN_UserInput(longword delay)
+{
+	longword	lasttime;
+
+	lasttime = GetTimeCount();
+	IN_StartAck ();
+	do
+	{
+        IN_ProcessEvents();
+		if (IN_CheckAck())
+			return true;
+        SDL_Delay(5);
+	} while (GetTimeCount() - lasttime < delay);
+	return(false);
+}
+
+//===========================================================================
+
+/*
+===================
+=
+= IN_MouseButtons
+=
+===================
+*/
+int IN_MouseButtons (void)
+{
+	if (MousePresent)
+		return INL_GetMouseButtons();
+	else
+		return 0;
+}
+
+bool IN_IsInputGrabbed()
+{
+    return GrabInput;
+}
+
+void IN_CenterMouse()
+{
+    SDL_WarpMouse(screenWidth / 2, screenHeight / 2);
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_in.h b/apps/plugins/sdl/progs/wolf3d/id_in.h
new file mode 100644
index 0000000..90e0c05
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_in.h
@@ -0,0 +1,183 @@
+//
+//	ID Engine
+//	ID_IN.h - Header file for Input Manager
+//	v1.0d1
+//	By Jason Blochowiak
+//
+
+#ifndef	__ID_IN__
+#define	__ID_IN__
+
+#ifdef	__DEBUG__
+#define	__DEBUG_InputMgr__
+#endif
+
+typedef	int		ScanCode;
+#define	sc_None			0
+#define	sc_Bad			0xff
+#define	sc_Return		SDLK_RETURN
+#define	sc_Enter		sc_Return
+#define	sc_Escape		SDLK_ESCAPE
+#define	sc_Space		SDLK_SPACE
+#define	sc_BackSpace	SDLK_BACKSPACE
+#define	sc_Tab			SDLK_TAB
+#define	sc_Alt			SDLK_LALT
+#define	sc_Control		SDLK_LCTRL
+#define	sc_CapsLock		SDLK_CAPSLOCK
+#define	sc_LShift		SDLK_LSHIFT
+#define	sc_RShift		SDLK_RSHIFT
+#define	sc_UpArrow		SDLK_UP
+#define	sc_DownArrow	SDLK_DOWN
+#define	sc_LeftArrow	SDLK_LEFT
+#define	sc_RightArrow	SDLK_RIGHT
+#define	sc_Insert		SDLK_INSERT
+#define	sc_Delete		SDLK_DELETE
+#define	sc_Home			SDLK_HOME
+#define	sc_End			SDLK_END
+#define	sc_PgUp			SDLK_PAGEUP
+#define	sc_PgDn			SDLK_PAGEDOWN
+#define	sc_F1			SDLK_F1
+#define	sc_F2			SDLK_F2
+#define	sc_F3			SDLK_F3
+#define	sc_F4			SDLK_F4
+#define	sc_F5			SDLK_F5
+#define	sc_F6			SDLK_F6
+#define	sc_F7			SDLK_F7
+#define	sc_F8			SDLK_F8
+#define	sc_F9			SDLK_F9
+#define	sc_F10			SDLK_F10
+#define	sc_F11			SDLK_F11
+#define	sc_F12			SDLK_F12
+
+#define sc_ScrollLock		SDLK_SCROLLOCK
+#define sc_PrintScreen		SDLK_PRINT
+
+#define	sc_1			SDLK_1
+#define	sc_2			SDLK_2
+#define	sc_3			SDLK_3
+#define	sc_4			SDLK_4
+#define	sc_5			SDLK_5
+#define	sc_6			SDLK_6
+#define	sc_7			SDLK_7
+#define	sc_8			SDLK_8
+#define	sc_9			SDLK_9
+#define	sc_0			SDLK_0
+
+#define	sc_A			SDLK_a
+#define	sc_B			SDLK_b
+#define	sc_C			SDLK_c
+#define	sc_D			SDLK_d
+#define	sc_E			SDLK_e
+#define	sc_F			SDLK_f
+#define	sc_G			SDLK_g
+#define	sc_H			SDLK_h
+#define	sc_I			SDLK_i
+#define	sc_J			SDLK_j
+#define	sc_K			SDLK_k
+#define	sc_L			SDLK_l
+#define	sc_M			SDLK_m
+#define	sc_N			SDLK_n
+#define	sc_O			SDLK_o
+#define	sc_P			SDLK_p
+#define	sc_Q			SDLK_q
+#define	sc_R			SDLK_r
+#define	sc_S			SDLK_s
+#define	sc_T			SDLK_t
+#define	sc_U			SDLK_u
+#define	sc_V			SDLK_v
+#define	sc_W			SDLK_w
+#define	sc_X			SDLK_x
+#define	sc_Y			SDLK_y
+#define	sc_Z			SDLK_z
+
+#define	key_None		0
+
+typedef	enum		{
+						demo_Off,demo_Record,demo_Playback,demo_PlayDone
+					} Demo;
+typedef	enum		{
+						ctrl_Keyboard,
+						ctrl_Keyboard1 = ctrl_Keyboard,ctrl_Keyboard2,
+						ctrl_Joystick,
+						ctrl_Joystick1 = ctrl_Joystick,ctrl_Joystick2,
+						ctrl_Mouse
+					} ControlType;
+typedef	enum		{
+						motion_Left = -1,motion_Up = -1,
+						motion_None = 0,
+						motion_Right = 1,motion_Down = 1
+					} Motion;
+typedef	enum		{
+						dir_North,dir_NorthEast,
+						dir_East,dir_SouthEast,
+						dir_South,dir_SouthWest,
+						dir_West,dir_NorthWest,
+						dir_None
+					} Direction;
+typedef	struct		{
+						boolean		button0,button1,button2,button3;
+						short		x,y;
+						Motion		xaxis,yaxis;
+						Direction	dir;
+					} CursorInfo;
+typedef	CursorInfo	ControlInfo;
+typedef	struct		{
+						ScanCode	button0,button1,
+									upleft,		up,		upright,
+									left,				right,
+									downleft,	down,	downright;
+					} KeyboardDef;
+typedef	struct		{
+						word		joyMinX,joyMinY,
+									threshMinX,threshMinY,
+									threshMaxX,threshMaxY,
+									joyMaxX,joyMaxY,
+									joyMultXL,joyMultYL,
+									joyMultXH,joyMultYH;
+					} JoystickDef;
+// Global variables
+extern  volatile boolean    Keyboard[];
+extern           boolean    MousePresent;
+extern  volatile boolean    Paused;
+extern  volatile char       LastASCII;
+extern  volatile ScanCode   LastScan;
+extern           int        JoyNumButtons;
+extern           boolean    forcegrabmouse;
+
+
+// Function prototypes
+#define	IN_KeyDown(code)	(Keyboard[(code)])
+#define	IN_ClearKey(code)	{Keyboard[code] = false;\
+							if (code == LastScan) LastScan = sc_None;}
+
+// DEBUG - put names in prototypes
+extern	void		IN_Startup(void),IN_Shutdown(void);
+extern	void		IN_ClearKeysDown(void);
+extern	void		IN_ReadControl(int,ControlInfo *);
+extern	void		IN_GetJoyAbs(word joy,word *xp,word *yp);
+extern	void		IN_SetupJoy(word joy,word minx,word maxx,
+								word miny,word maxy);
+extern	void		IN_StopDemo(void),IN_FreeDemoBuffer(void),
+					IN_Ack(void);
+extern	boolean		IN_UserInput(longword delay);
+extern	char		IN_WaitForASCII(void);
+extern	ScanCode	IN_WaitForKey(void);
+extern	word		IN_GetJoyButtonsDB(word joy);
+extern	const char *IN_GetScanName(ScanCode);
+
+void    IN_WaitAndProcessEvents();
+void    IN_ProcessEvents();
+
+int     IN_MouseButtons (void);
+
+boolean IN_JoyPresent();
+void    IN_SetJoyCurrent(int joyIndex);
+int     IN_JoyButtons (void);
+void    IN_GetJoyDelta(int *dx,int *dy);
+void    IN_GetJoyFineDelta(int *dx, int *dy);
+
+void    IN_StartAck(void);
+boolean IN_CheckAck (void);
+bool    IN_IsInputGrabbed();
+void    IN_CenterMouse();
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/id_pm.c b/apps/plugins/sdl/progs/wolf3d/id_pm.c
new file mode 100644
index 0000000..4b8d580
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_pm.c
@@ -0,0 +1,125 @@
+#include "wl_def.h"
+
+int ChunksInFile;
+int PMSpriteStart;
+int PMSoundStart;
+
+bool PMSoundInfoPagePadded = false;
+
+// holds the whole VSWAP
+uint32_t *PMPageData;
+size_t PMPageDataSize;
+
+// ChunksInFile+1 pointers to page starts.
+// The last pointer points one byte after the last page.
+uint8_t **PMPages;
+
+void PM_Startup()
+{
+    char fname[13 + sizeof(DATADIR)] = DATADIR "vswap.";
+    strcat(fname,extension);
+
+    FILE *file = fopen(fname,"rb");
+    if(!file)
+        CA_CannotOpen(fname);
+
+    ChunksInFile = 0;
+    fread(&ChunksInFile, sizeof(word), 1, file);
+    PMSpriteStart = 0;
+    fread(&PMSpriteStart, sizeof(word), 1, file);
+    PMSoundStart = 0;
+    fread(&PMSoundStart, sizeof(word), 1, file);
+
+    uint32_t* pageOffsets = (uint32_t *) malloc((ChunksInFile + 1) * sizeof(int32_t));
+    CHECKMALLOCRESULT(pageOffsets);
+    fread(pageOffsets, sizeof(uint32_t), ChunksInFile, file);
+
+    word *pageLengths = (word *) malloc(ChunksInFile * sizeof(word));
+    CHECKMALLOCRESULT(pageLengths);
+    fread(pageLengths, sizeof(word), ChunksInFile, file);
+
+    fseek(file, 0, SEEK_END);
+    long fileSize = ftell(file);
+    long pageDataSize = fileSize - pageOffsets[0];
+    if(pageDataSize > (size_t) -1)
+        Quit("The page file \"%s\" is too large!", fname);
+
+    pageOffsets[ChunksInFile] = fileSize;
+
+    uint32_t dataStart = pageOffsets[0];
+    int i;
+
+    // Check that all pageOffsets are valid
+    for(i = 0; i < ChunksInFile; i++)
+    {
+        if(!pageOffsets[i]) continue;   // sparse page
+        if(pageOffsets[i] < dataStart || pageOffsets[i] >= (size_t) fileSize)
+            Quit("Illegal page offset for page %i: %u (filesize: %u)",
+                    i, pageOffsets[i], fileSize);
+    }
+
+    // Calculate total amount of padding needed for sprites and sound info page
+    int alignPadding = 0;
+    for(i = PMSpriteStart; i < PMSoundStart; i++)
+    {
+        if(!pageOffsets[i]) continue;   // sparse page
+        uint32_t offs = pageOffsets[i] - dataStart + alignPadding;
+        if(offs & 1)
+            alignPadding++;
+    }
+
+    if((pageOffsets[ChunksInFile - 1] - dataStart + alignPadding) & 1)
+        alignPadding++;
+
+    PMPageDataSize = (size_t) pageDataSize + alignPadding;
+    PMPageData = (uint32_t *) malloc(PMPageDataSize);
+    CHECKMALLOCRESULT(PMPageData);
+
+    PMPages = (uint8_t **) malloc((ChunksInFile + 1) * sizeof(uint8_t *));
+    CHECKMALLOCRESULT(PMPages);
+
+    // Load pages and initialize PMPages pointers
+    uint8_t *ptr = (uint8_t *) PMPageData;
+    for(i = 0; i < ChunksInFile; i++)
+    {
+        if(i >= PMSpriteStart && i < PMSoundStart || i == ChunksInFile - 1)
+        {
+            size_t offs = ptr - (uint8_t *) PMPageData;
+
+            // pad with zeros to make it 2-byte aligned
+            if(offs & 1)
+            {
+                *ptr++ = 0;
+                if(i == ChunksInFile - 1) PMSoundInfoPagePadded = true;
+            }
+        }
+
+        PMPages[i] = ptr;
+
+        if(!pageOffsets[i])
+            continue;               // sparse page
+
+        // Use specified page length, when next page is sparse page.
+        // Otherwise, calculate size from the offset difference between this and the next page.
+        uint32_t size;
+        if(!pageOffsets[i + 1]) size = pageLengths[i];
+        else size = pageOffsets[i + 1] - pageOffsets[i];
+
+        fseek(file, pageOffsets[i], SEEK_SET);
+        fread(ptr, 1, size, file);
+        ptr += size;
+    }
+
+    // last page points after page buffer
+    PMPages[ChunksInFile] = ptr;
+
+    free(pageLengths);
+    free(pageOffsets);
+    fclose(file);
+}
+
+void PM_Shutdown()
+{
+    free(PMPages);
+    free(PMPageData);
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_pm.h b/apps/plugins/sdl/progs/wolf3d/id_pm.h
new file mode 100644
index 0000000..bbedb78
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_pm.h
@@ -0,0 +1,58 @@
+#ifndef __ID_PM__
+#define __ID_PM__
+
+#ifdef USE_HIRES
+#define PMPageSize 16384
+#else
+#define PMPageSize 4096
+#endif
+
+extern int ChunksInFile;
+extern int PMSpriteStart;
+extern int PMSoundStart;
+
+extern bool PMSoundInfoPagePadded;
+
+// ChunksInFile+1 pointers to page starts.
+// The last pointer points one byte after the last page.
+extern uint8_t **PMPages;
+
+void PM_Startup();
+void PM_Shutdown();
+
+static uint32_t PM_GetPageSize(int page)
+{
+    if(page < 0 || page >= ChunksInFile)
+        Quit("PM_GetPageSize: Tried to access illegal page: %i", page);
+    return (uint32_t) (PMPages[page + 1] - PMPages[page]);
+}
+
+static uint8_t *PM_GetPage(int page)
+{
+    if(page < 0 || page >= ChunksInFile)
+        Quit("PM_GetPage: Tried to access illegal page: %i", page);
+    return PMPages[page];
+}
+
+static uint8_t *PM_GetEnd()
+{
+    return PMPages[ChunksInFile];
+}
+
+static byte *PM_GetTexture(int wallpic)
+{
+    return PM_GetPage(wallpic);
+}
+
+static uint16_t *PM_GetSprite(int shapenum)
+{
+    // correct alignment is enforced by PM_Startup()
+    return (uint16_t *) (void *) PM_GetPage(PMSpriteStart + shapenum);
+}
+
+static byte *PM_GetSound(int soundpagenum)
+{
+    return PM_GetPage(PMSoundStart + soundpagenum);
+}
+
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/id_sd.c b/apps/plugins/sdl/progs/wolf3d/id_sd.c
new file mode 100644
index 0000000..a528caa
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_sd.c
@@ -0,0 +1,1578 @@
+//
+//      ID Engine
+//      ID_SD.c - Sound Manager for Wolfenstein 3D
+//      v1.2
+//      By Jason Blochowiak
+//
+
+//
+//      This module handles dealing with generating sound on the appropriate
+//              hardware
+//
+//      Depends on: User Mgr (for parm checking)
+//
+//      Globals:
+//              For User Mgr:
+//                      SoundBlasterPresent - SoundBlaster card present?
+//                      AdLibPresent - AdLib card present?
+//                      SoundMode - What device is used for sound effects
+//                              (Use SM_SetSoundMode() to set)
+//                      MusicMode - What device is used for music
+//                              (Use SM_SetMusicMode() to set)
+//                      DigiMode - What device is used for digitized sound effects
+//                              (Use SM_SetDigiDevice() to set)
+//
+//              For Cache Mgr:
+//                      NeedsDigitized - load digitized sounds?
+//                      NeedsMusic - load music?
+//
+
+#include "wl_def.h"
+#include "fmopl.h"
+
+#include "fixedpoint.h"
+
+#pragma hdrstop
+
+#define ORIGSAMPLERATE 7042
+
+typedef struct
+{
+	char RIFF[4];
+	longword filelenminus8;
+	char WAVE[4];
+	char fmt_[4];
+	longword formatlen;
+	word val0x0001;
+	word channels;
+	longword samplerate;
+	longword bytespersec;
+	word bytespersample;
+	word bitspersample;
+} headchunk;
+
+typedef struct
+{
+	char chunkid[4];
+	longword chunklength;
+} wavechunk;
+
+typedef struct
+{
+    uint32_t startpage;
+    uint32_t length;
+} digiinfo;
+
+static Mix_Chunk *SoundChunks[ STARTMUSIC - STARTDIGISOUNDS];
+static byte      *SoundBuffers[STARTMUSIC - STARTDIGISOUNDS];
+
+globalsoundpos channelSoundPos[MIX_CHANNELS];
+
+//      Global variables
+        boolean         AdLibPresent,
+                        SoundBlasterPresent,SBProPresent,
+                        SoundPositioned;
+        SDMode          SoundMode;
+        SMMode          MusicMode;
+        SDSMode         DigiMode;
+static  byte          **SoundTable;
+        int             DigiMap[LASTSOUND];
+        int             DigiChannel[STARTMUSIC - STARTDIGISOUNDS];
+
+//      Internal variables
+static  boolean                 SD_Started;
+static  boolean                 nextsoundpos;
+static  soundnames              SoundNumber;
+static  soundnames              DigiNumber;
+static  word                    SoundPriority;
+static  word                    DigiPriority;
+static  int                     LeftPosition;
+static  int                     RightPosition;
+
+        word                    NumDigi;
+static  digiinfo               *DigiList;
+static  boolean                 DigiPlaying;
+
+//      PC Sound variables
+static  volatile byte           pcLastSample;
+static  byte * volatile         pcSound;
+static  longword                pcLengthLeft;
+
+//      AdLib variables
+static  byte * volatile         alSound;
+static  byte                    alBlock;
+static  longword                alLengthLeft;
+static  longword                alTimeCount;
+static  Instrument              alZeroInst;
+
+//      Sequencer variables
+static  volatile boolean        sqActive;
+static  word                   *sqHack;
+static  word                   *sqHackPtr;
+static  int                     sqHackLen;
+static  int                     sqHackSeqLen;
+static  longword                sqHackTime;
+
+
+static void SDL_SoundFinished(void)
+{
+#ifdef SOUND_ENABLE
+	SoundNumber   = (soundnames)0;
+	SoundPriority = 0;
+#endif
+}
+
+
+#ifdef NOTYET
+
+void SDL_turnOnPCSpeaker(word timerval);
+#pragma aux SDL_turnOnPCSpeaker = \
+        "mov    al,0b6h" \
+        "out    43h,al" \
+        "mov    al,bl" \
+        "out    42h,al" \
+        "mov    al,bh" \
+        "out    42h,al" \
+        "in     al,61h" \
+        "or     al,3"   \
+        "out    61h,al" \
+        parm [bx] \
+        modify exact [al]
+
+void SDL_turnOffPCSpeaker();
+#pragma aux SDL_turnOffPCSpeaker = \
+        "in     al,61h" \
+        "and    al,0fch" \
+        "out    61h,al" \
+        modify exact [al]
+
+void SDL_setPCSpeaker(byte val);
+#pragma aux SDL_setPCSpeaker = \
+        "in     al,61h" \
+        "and    al,0fch" \
+        "or     al,ah" \
+        "out    61h,al" \
+        parm [ah] \
+        modify exact [al]
+
+void SDL_DoFX()
+{
+        if(pcSound)
+        {
+                if(*pcSound!=pcLastSample)
+                {
+                        pcLastSample=*pcSound;
+
+                        if(pcLastSample)
+                                SDL_turnOnPCSpeaker(pcLastSample*60);
+                        else
+                                SDL_turnOffPCSpeaker();
+                }
+                pcSound++;
+                pcLengthLeft--;
+                if(!pcLengthLeft)
+                {
+                        pcSound=0;
+                        SoundNumber=(soundnames)0;
+                        SoundPriority=0;
+                        SDL_turnOffPCSpeaker();
+                }
+        }
+
+        // [adlib sound stuff removed...]
+}
+
+static void SDL_DigitizedDoneInIRQ(void);
+
+void SDL_DoFast()
+{
+        count_fx++;
+        if(count_fx>=5)
+        {
+                count_fx=0;
+
+                SDL_DoFX();
+
+                count_time++;
+                if(count_time>=2)
+                {
+                        TimeCount++;
+                        count_time=0;
+                }
+        }
+
+        // [adlib music and soundsource stuff removed...]
+
+        TimerCount+=TimerDivisor;
+        if(*((word *)&TimerCount+1))
+        {
+                *((word *)&TimerCount+1)=0;
+                t0OldService();
+        }
+        else
+        {
+                outp(0x20,0x20);
+        }
+}
+
+// Timer 0 ISR for 7000Hz interrupts
+void __interrupt SDL_t0ExtremeAsmService(void)
+{
+        if(pcindicate)
+        {
+                if(pcSound)
+                {
+                        SDL_setPCSpeaker(((*pcSound++)&0x80)>>6);
+                        pcLengthLeft--;
+                        if(!pcLengthLeft)
+                        {
+                                pcSound=0;
+                                SDL_turnOffPCSpeaker();
+                                SDL_DigitizedDoneInIRQ();
+                        }
+                }
+        }
+        extreme++;
+        if(extreme>=10)
+        {
+                extreme=0;
+                SDL_DoFast();
+        }
+        else
+                outp(0x20,0x20);
+}
+
+// Timer 0 ISR for 700Hz interrupts
+void __interrupt SDL_t0FastAsmService(void)
+{
+        SDL_DoFast();
+}
+
+// Timer 0 ISR for 140Hz interrupts
+void __interrupt SDL_t0SlowAsmService(void)
+{
+        count_time++;
+        if(count_time>=2)
+        {
+                TimeCount++;
+                count_time=0;
+        }
+
+        SDL_DoFX();
+
+        TimerCount+=TimerDivisor;
+        if(*((word *)&TimerCount+1))
+        {
+                *((word *)&TimerCount+1)=0;
+                t0OldService();
+        }
+        else
+                outp(0x20,0x20);
+}
+
+void SDL_IndicatePC(boolean ind)
+{
+        pcindicate=ind;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_SetTimer0() - Sets system timer 0 to the specified speed
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_SetTimer0(word speed)
+{
+#ifndef TPROF   // If using Borland's profiling, don't screw with the timer
+//      _asm pushfd
+        _asm cli
+
+        outp(0x43,0x36);                                // Change timer 0
+        outp(0x40,(byte)speed);
+        outp(0x40,speed >> 8);
+        // Kludge to handle special case for digitized PC sounds
+        if (TimerDivisor == (1192030 / (TickBase * 100)))
+                TimerDivisor = (1192030 / (TickBase * 10));
+        else
+                TimerDivisor = speed;
+
+//      _asm popfd
+        _asm    sti
+#else
+        TimerDivisor = 0x10000;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_SetIntsPerSec() - Uses SDL_SetTimer0() to set the number of
+//              interrupts generated by system timer 0 per second
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_SetIntsPerSec(word ints)
+{
+        TimerRate = ints;
+        SDL_SetTimer0(1192030 / ints);
+}
+
+static void
+SDL_SetTimerSpeed(void)
+{
+        word    rate;
+        void (_interrupt *isr)(void);
+
+        if ((DigiMode == sds_PC) && DigiPlaying)
+        {
+                rate = TickBase * 100;
+                isr = SDL_t0ExtremeAsmService;
+        }
+        else if ((MusicMode == smm_AdLib) || ((DigiMode == sds_SoundSource) && DigiPlaying)     )
+        {
+                rate = TickBase * 10;
+                isr = SDL_t0FastAsmService;
+        }
+        else
+        {
+                rate = TickBase * 2;
+                isr = SDL_t0SlowAsmService;
+        }
+
+        if (rate != TimerRate)
+        {
+                _dos_setvect(8,isr);
+                SDL_SetIntsPerSec(rate);
+                TimerRate = rate;
+        }
+}
+
+//
+//      PC Sound code
+//
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_PCPlaySample() - Plays the specified sample on the PC speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef  _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCPlaySample(byte *data,longword len,boolean inIRQ)
+{
+        if(!inIRQ)
+        {
+//              _asm    pushfd
+                _asm    cli
+        }
+
+        SDL_IndicatePC(true);
+
+        pcLengthLeft = len;
+        pcSound = (volatile byte *)data;
+
+        if(!inIRQ)
+        {
+//              _asm    popfd
+                _asm    sti
+        }
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_PCStopSample() - Stops a sample playing on the PC speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef  _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCStopSampleInIRQ(void)
+{
+        pcSound = 0;
+
+        SDL_IndicatePC(false);
+
+        _asm    in      al,0x61                 // Turn the speaker off
+        _asm    and     al,0xfd                 // ~2
+        _asm    out     0x61,al
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_PCPlaySound() - Plays the specified sound on the PC speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef  _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCPlaySound(PCSound *sound)
+{
+//      _asm    pushfd
+        _asm    cli
+
+        pcLastSample = -1;
+        pcLengthLeft = sound->common.length;
+        pcSound = sound->data;
+
+//      _asm    popfd
+        _asm    sti
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_PCStopSound() - Stops the current sound playing on the PC Speaker
+//
+///////////////////////////////////////////////////////////////////////////
+#ifdef  _MUSE_
+void
+#else
+static void
+#endif
+SDL_PCStopSound(void)
+{
+//      _asm    pushfd
+        _asm    cli
+
+        pcSound = 0;
+
+        _asm    in      al,0x61                 // Turn the speaker off
+        _asm    and     al,0xfd                 // ~2
+        _asm    out     0x61,al
+
+//      _asm    popfd
+        _asm    sti
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_ShutPC() - Turns off the pc speaker
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutPC(void)
+{
+//      _asm    pushfd
+        _asm    cli
+
+        pcSound = 0;
+
+        _asm    in      al,0x61                 // Turn the speaker & gate off
+        _asm    and     al,0xfc                 // ~3
+        _asm    out     0x61,al
+
+//      _asm    popfd
+        _asm    sti
+}
+
+#endif
+
+void
+SD_StopDigitized(void)
+{
+#ifdef SOUND_ENABLE
+    DigiPlaying = false;
+    DigiNumber = (soundnames) 0;
+    DigiPriority = 0;
+    SoundPositioned = false;
+    if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
+        SDL_SoundFinished();
+
+    switch (DigiMode)
+    {
+        case sds_PC:
+//            SDL_PCStopSampleInIRQ();
+            break;
+        case sds_SoundBlaster:
+//            SDL_SBStopSampleInIRQ();
+            Mix_HaltChannel(-1);
+            break;
+    }
+#endif
+}
+
+int SD_GetChannelForDigi(int which)
+{
+#ifdef SOUND_ENABLE
+    if(DigiChannel[which] != -1) return DigiChannel[which];
+
+    int channel = Mix_GroupAvailable(1);
+    if(channel == -1) channel = Mix_GroupOldest(1);
+    if(channel == -1)           // All sounds stopped in the meantime?
+        return Mix_GroupAvailable(1);
+    return channel;
+#endif
+    return 0;
+}
+
+void SD_SetPosition(int channel, int leftpos, int rightpos)
+{
+#ifdef SOUND_ENABLE
+    if((leftpos < 0) || (leftpos > 15) || (rightpos < 0) || (rightpos > 15)
+            || ((leftpos == 15) && (rightpos == 15)))
+        Quit("SD_SetPosition: Illegal position");
+
+    switch (DigiMode)
+    {
+        case sds_SoundBlaster:
+//            SDL_PositionSBP(leftpos,rightpos);
+            Mix_SetPanning(channel, ((15 - leftpos) << 4) + 15,
+                ((15 - rightpos) << 4) + 15);
+            break;
+    }
+#endif
+}
+
+#define FP_FLOOR(x, fracbits) (x & (~((1<<(fracbits))-1)))
+
+/* more precise than original samples */
+#define FRACBITS 10
+#define FP_MATH
+
+#ifdef FP_MATH
+/* Looks to be some sort of interpolation - FW19 */
+Sint16 GetSample(long csample_fp, byte *samples, int size)
+{
+    //float s0=0, s1=0, s2=0;
+    long s0_fp = 0, s1_fp = 0, s2_fp = 0;
+    long cursample_fp = FP_FLOOR(csample_fp, FRACBITS);
+    long sf_fp = csample_fp - cursample_fp;
+    const long one = 1 << FRACBITS;
+
+    int cursample = cursample_fp >> FRACBITS;
+
+    if(cursample-1 >= 0) s0_fp = (samples[cursample-1] - 128) << FRACBITS;
+    s1_fp = (samples[cursample] - 128) << FRACBITS;
+    if(cursample+1 < size) s2_fp = (samples[cursample+1] - 128) << FRACBITS;
+
+    //float val = s0*sf*(sf-1)/2 - s1*(sf*sf-1) + s2*(sf+1)*sf/2;
+
+    long val_fp = fp_mul(s0_fp, fp_mul(sf_fp, sf_fp - one, FRACBITS), FRACBITS) / 2 -
+                  fp_mul(s1_fp, fp_mul(sf_fp, sf_fp, FRACBITS) - one, FRACBITS)     +
+                  fp_mul(s2_fp, fp_mul(sf_fp + one, sf_fp, FRACBITS), FRACBITS) / 2;
+
+    int32_t intval = (int32_t) (val_fp * 256) >> FRACBITS;
+    if(intval < -32768) intval = -32768;
+    else if(intval > 32767) intval = 32767;
+    return (Sint16) intval;
+}
+#else
+Sint16 GetSample(float csample, byte *samples, int size)
+{
+    float s0=0, s1=0, s2=0;
+    int cursample = (int) csample;
+    float sf = csample - (float) cursample;
+
+    if(cursample-1 >= 0) s0 = (float) (samples[cursample-1] - 128);
+    s1 = (float) (samples[cursample] - 128);
+    if(cursample+1 < size) s2 = (float) (samples[cursample+1] - 128);
+
+    float val = s0*sf*(sf-1)/2 - s1*(sf*sf-1) + s2*(sf+1)*sf/2;
+    int32_t intval = (int32_t) (val * 256);
+    if(intval < -32768) intval = -32768;
+    else if(intval > 32767) intval = 32767;
+    return (Sint16) intval;
+}
+#endif
+
+void SD_PrepareSound(int which)
+{
+#ifdef SOUND_ENABLE
+#ifdef FP_MATH
+    if(DigiList == NULL)
+        Quit("SD_PrepareSound(%i): DigiList not initialized!\n", which);
+
+    int page = DigiList[which].startpage;
+    int size = DigiList[which].length;
+
+    byte *origsamples = PM_GetSound(page);
+    if(origsamples + size >= PM_GetEnd())
+        Quit("SD_PrepareSound(%i): Sound reaches out of page file!\n", which);
+
+    /* this is fine to keep as floating-point */
+    int destsamples = (int) ((float) size * (float) param_samplerate
+                             / (float) ORIGSAMPLERATE);
+
+    byte *wavebuffer = (byte *) malloc(sizeof(headchunk) + sizeof(wavechunk)
+        + destsamples * 2);     // dest are 16-bit samples
+    if(wavebuffer == NULL)
+        Quit("Unable to allocate wave buffer for sound %i size %d %d %d %d!\n", which, destsamples, size, param_samplerate, ORIGSAMPLERATE);
+
+    headchunk head = {{'R','I','F','F'}, 0, {'W','A','V','E'},
+        {'f','m','t',' '}, 0x10, 0x0001, 1, param_samplerate, param_samplerate*2, 2, 16};
+    wavechunk dhead = {{'d', 'a', 't', 'a'}, destsamples*2};
+    head.filelenminus8 = sizeof(head) + destsamples*2;  // (sizeof(dhead)-8 = 0)
+    memcpy(wavebuffer, &head, sizeof(head));
+    memcpy(wavebuffer+sizeof(head), &dhead, sizeof(dhead));
+
+    // alignment is correct, as wavebuffer comes from malloc
+    // and sizeof(headchunk) % 4 == 0 and sizeof(wavechunk) % 4 == 0
+    Sint16 *newsamples = (Sint16 *)(void *) (wavebuffer + sizeof(headchunk)
+        + sizeof(wavechunk));
+
+    long scale_fac_fp = fp_div(size << FRACBITS, destsamples << FRACBITS, FRACBITS);
+
+    for(int i=0; i<destsamples; i++)
+    {
+        newsamples[i] = GetSample(fp_mul(i << FRACBITS, scale_fac_fp, FRACBITS),
+                                  origsamples, size);
+    }
+    SoundBuffers[which] = wavebuffer;
+
+    SoundChunks[which] = Mix_LoadWAV_RW(SDL_RWFromMem(wavebuffer,
+        sizeof(headchunk) + sizeof(wavechunk) + destsamples * 2), 1);
+#else
+        if(DigiList == NULL)
+        Quit("SD_PrepareSound(%i): DigiList not initialized!\n", which);
+
+    int page = DigiList[which].startpage;
+    int size = DigiList[which].length;
+
+    byte *origsamples = PM_GetSound(page);
+    if(origsamples + size >= PM_GetEnd())
+        Quit("SD_PrepareSound(%i): Sound reaches out of page file!\n", which);
+
+    int destsamples = (int) ((float) size * (float) param_samplerate
+        / (float) ORIGSAMPLERATE);
+
+    byte *wavebuffer = (byte *) malloc(sizeof(headchunk) + sizeof(wavechunk)
+        + destsamples * 2);     // dest are 16-bit samples
+    if(wavebuffer == NULL)
+        Quit("Unable to allocate wave buffer for sound %i!\n", which);
+
+    headchunk head = {{'R','I','F','F'}, 0, {'W','A','V','E'},
+        {'f','m','t',' '}, 0x10, 0x0001, 1, param_samplerate, param_samplerate*2, 2, 16};
+    wavechunk dhead = {{'d', 'a', 't', 'a'}, destsamples*2};
+    head.filelenminus8 = sizeof(head) + destsamples*2;  // (sizeof(dhead)-8 = 0)
+    memcpy(wavebuffer, &head, sizeof(head));
+    memcpy(wavebuffer+sizeof(head), &dhead, sizeof(dhead));
+
+    // alignment is correct, as wavebuffer comes from malloc
+    // and sizeof(headchunk) % 4 == 0 and sizeof(wavechunk) % 4 == 0
+    Sint16 *newsamples = (Sint16 *)(void *) (wavebuffer + sizeof(headchunk)
+        + sizeof(wavechunk));
+    float cursample = 0.F;
+    float samplestep = (float) ORIGSAMPLERATE / (float) param_samplerate;
+    for(int i=0; i<destsamples; i++, cursample+=samplestep)
+    {
+        newsamples[i] = GetSample((float)size * (float)i / (float)destsamples,
+            origsamples, size);
+    }
+    SoundBuffers[which] = wavebuffer;
+
+    SoundChunks[which] = Mix_LoadWAV_RW(SDL_RWFromMem(wavebuffer,
+        sizeof(headchunk) + sizeof(wavechunk) + destsamples * 2), 1);
+#endif
+#endif
+}
+
+int SD_PlayDigitized(word which,int leftpos,int rightpos)
+{
+#ifdef SOUND_ENABLE
+    if (!DigiMode)
+        return 0;
+
+    if (which >= NumDigi)
+        Quit("SD_PlayDigitized: bad sound number %i", which);
+
+    int channel = SD_GetChannelForDigi(which);
+    SD_SetPosition(channel, leftpos,rightpos);
+
+    DigiPlaying = true;
+
+    Mix_Chunk *sample = SoundChunks[which];
+    if(sample == NULL)
+    {
+        printf("SoundChunks[%i] is NULL!\n", which);
+        return 0;
+    }
+
+    if(Mix_PlayChannel(channel, sample, 0) == -1)
+    {
+        printf("Unable to play sound: %s\n", Mix_GetError());
+        return 0;
+    }
+
+    return channel;
+#endif
+    return 0;
+}
+
+void SD_ChannelFinished(int channel)
+{
+#ifdef SOUND_ENABLE
+    channelSoundPos[channel].valid = 0;
+#endif
+}
+
+void
+SD_SetDigiDevice(SDSMode mode)
+{
+#ifdef SOUND_ENABLE
+    boolean devicenotpresent;
+
+    if (mode == DigiMode)
+        return;
+
+    SD_StopDigitized();
+
+    devicenotpresent = false;
+    switch (mode)
+    {
+        case sds_SoundBlaster:
+            if (!SoundBlasterPresent)
+                devicenotpresent = true;
+            break;
+    }
+
+    if (!devicenotpresent)
+    {
+        DigiMode = mode;
+
+#ifdef NOTYET
+        SDL_SetTimerSpeed();
+#endif
+    }
+#endif
+}
+
+void
+SDL_SetupDigi(void)
+{
+#ifdef SOUND_ENABLE
+    // Correct padding enforced by PM_Startup()
+    word *soundInfoPage = (word *) (void *) PM_GetPage(ChunksInFile-1);
+    NumDigi = (word) PM_GetPageSize(ChunksInFile - 1) / 4;
+
+    DigiList = (digiinfo *) malloc(NumDigi * sizeof(digiinfo));
+    int i;
+    for(i = 0; i < NumDigi; i++)
+    {
+        // Calculate the size of the digi from the sizes of the pages between
+        // the start page and the start page of the next sound
+
+        DigiList[i].startpage = soundInfoPage[i * 2];
+        if((int) DigiList[i].startpage >= ChunksInFile - 1)
+        {
+            NumDigi = i;
+            break;
+        }
+
+        int lastPage;
+        if(i < NumDigi - 1)
+        {
+            lastPage = soundInfoPage[i * 2 + 2];
+            if(lastPage == 0 || lastPage + PMSoundStart > ChunksInFile - 1) lastPage = ChunksInFile - 1;
+            else lastPage += PMSoundStart;
+        }
+        else lastPage = ChunksInFile - 1;
+
+        int size = 0;
+        for(int page = PMSoundStart + DigiList[i].startpage; page < lastPage; page++)
+            size += PM_GetPageSize(page);
+
+        // Don't include padding of sound info page, if padding was added
+        if(lastPage == ChunksInFile - 1 && PMSoundInfoPagePadded) size--;
+
+        // Patch lower 16-bit of size with size from sound info page.
+        // The original VSWAP contains padding which is included in the page size,
+        // but not included in the 16-bit size. So we use the more precise value.
+        if((size & 0xffff0000) != 0 && (size & 0xffff) < soundInfoPage[i * 2 + 1])
+            size -= 0x10000;
+        size = (size & 0xffff0000) | soundInfoPage[i * 2 + 1];
+
+        DigiList[i].length = size;
+    }
+
+    for(i = 0; i < LASTSOUND; i++)
+    {
+        DigiMap[i] = -1;
+        DigiChannel[i] = -1;
+    }
+#endif
+}
+
+//      AdLib Code
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_ALStopSound() - Turns off any sound effects playing through the
+//              AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ALStopSound(void)
+{
+#ifdef SOUND_ENABLE
+    alSound = 0;
+    alOut(alFreqH + 0, 0);
+#endif
+}
+
+static void
+SDL_AlSetFXInst(Instrument *inst)
+{
+#ifdef SOUND_ENABLE
+    byte c,m;
+
+    m = 0;      // modulator cell for channel 0
+    c = 3;      // carrier cell for channel 0
+    alOut(m + alChar,inst->mChar);
+    alOut(m + alScale,inst->mScale);
+    alOut(m + alAttack,inst->mAttack);
+    alOut(m + alSus,inst->mSus);
+    alOut(m + alWave,inst->mWave);
+    alOut(c + alChar,inst->cChar);
+    alOut(c + alScale,inst->cScale);
+    alOut(c + alAttack,inst->cAttack);
+    alOut(c + alSus,inst->cSus);
+    alOut(c + alWave,inst->cWave);
+
+    // Note: Switch commenting on these lines for old MUSE compatibility
+//    alOutInIRQ(alFeedCon,inst->nConn);
+    alOut(alFeedCon,0);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_ALPlaySound() - Plays the specified sound on the AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ALPlaySound(AdLibSound *sound)
+{
+#ifdef SOUND_ENABLE
+    Instrument      *inst;
+    byte            *data;
+
+    SDL_ALStopSound();
+
+    alLengthLeft = sound->common.length;
+    data = sound->data;
+    alBlock = ((sound->block & 7) << 2) | 0x20;
+    inst = &sound->inst;
+
+    if (!(inst->mSus | inst->cSus))
+    {
+        Quit("SDL_ALPlaySound() - Bad instrument");
+    }
+
+    SDL_AlSetFXInst(inst);
+    alSound = (byte *)data;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_ShutAL() - Shuts down the AdLib card for sound effects
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutAL(void)
+{
+#ifdef SOUND_ENABLE
+    alSound = 0;
+    alOut(alEffects,0);
+    alOut(alFreqH + 0,0);
+    SDL_AlSetFXInst(&alZeroInst);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_CleanAL() - Totally shuts down the AdLib card
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_CleanAL(void)
+{
+#ifdef SOUND_ENABLE
+    int     i;
+
+    alOut(alEffects,0);
+    for (i = 1; i < 0xf5; i++)
+        alOut(i, 0);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_StartAL() - Starts up the AdLib card for sound effects
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_StartAL(void)
+{
+#ifdef SOUND_ENABLE
+    alOut(alEffects, 0);
+    SDL_AlSetFXInst(&alZeroInst);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_DetectAdLib() - Determines if there's an AdLib (or SoundBlaster
+//              emulating an AdLib) present
+//
+///////////////////////////////////////////////////////////////////////////
+static boolean
+SDL_DetectAdLib(void)
+{
+#ifdef SOUND_ENABLE
+    for (int i = 1; i <= 0xf5; i++)       // Zero all the registers
+        alOut(i, 0);
+
+    alOut(1, 0x20);             // Set WSE=1
+//    alOut(8, 0);                // Set CSM=0 & SEL=0
+
+    return true;
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////
+//
+//      SDL_ShutDevice() - turns off whatever device was being used for sound fx
+//
+////////////////////////////////////////////////////////////////////////////
+static void
+SDL_ShutDevice(void)
+{
+#ifdef SOUND_ENABLE
+    switch (SoundMode)
+    {
+        case sdm_PC:
+//            SDL_ShutPC();
+            break;
+        case sdm_AdLib:
+            SDL_ShutAL();
+            break;
+    }
+    SoundMode = sdm_Off;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_CleanDevice() - totally shuts down all sound devices
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_CleanDevice(void)
+{
+#ifdef SOUND_ENABLE
+    if ((SoundMode == sdm_AdLib) || (MusicMode == smm_AdLib))
+        SDL_CleanAL();
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SDL_StartDevice() - turns on whatever device is to be used for sound fx
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+SDL_StartDevice(void)
+{
+#ifdef SOUND_ENABLE
+    switch (SoundMode)
+    {
+        case sdm_AdLib:
+            SDL_StartAL();
+            break;
+    }
+    SoundNumber = (soundnames) 0;
+    SoundPriority = 0;
+#endif
+}
+
+//      Public routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_SetSoundMode() - Sets which sound hardware to use for sound effects
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_SetSoundMode(SDMode mode)
+{
+#ifdef SOUND_ENABLE
+    boolean result = false;
+    word    tableoffset;
+
+    SD_StopSound();
+
+    if ((mode == sdm_AdLib) && !AdLibPresent)
+        mode = sdm_PC;
+
+    switch (mode)
+    {
+        case sdm_Off:
+            tableoffset = STARTADLIBSOUNDS;
+            result = true;
+            break;
+        case sdm_PC:
+            tableoffset = STARTPCSOUNDS;
+            result = true;
+            break;
+        case sdm_AdLib:
+            tableoffset = STARTADLIBSOUNDS;
+            if (AdLibPresent)
+                result = true;
+            break;
+        default:
+            Quit("SD_SetSoundMode: Invalid sound mode %i", mode);
+            return false;
+    }
+    SoundTable = &audiosegs[tableoffset];
+
+    if (result && (mode != SoundMode))
+    {
+        SDL_ShutDevice();
+        SoundMode = mode;
+        SDL_StartDevice();
+    }
+
+    return(result);
+#endif
+    return true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_SetMusicMode() - sets the device to use for background music
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_SetMusicMode(SMMode mode)
+{
+#ifdef SOUND_ENABLE
+    boolean result = false;
+
+    SD_FadeOutMusic();
+    while (SD_MusicPlaying())
+        SDL_Delay(5);
+
+    switch (mode)
+    {
+        case smm_Off:
+            result = true;
+            break;
+        case smm_AdLib:
+            if (AdLibPresent)
+                result = true;
+            break;
+    }
+
+    if (result)
+        MusicMode = mode;
+
+//    SDL_SetTimerSpeed();
+
+    return(result);
+#endif
+}
+
+int numreadysamples = 0;
+byte *curAlSound = 0;
+byte *curAlSoundPtr = 0;
+longword curAlLengthLeft = 0;
+int soundTimeCounter = 5;
+int samplesPerMusicTick;
+
+void *OPL_ptr = NULL;
+
+void SDL_IMFMusicPlayer(void *udata, Uint8 *stream, int len)
+{
+#ifdef SOUND_ENABLE
+    int stereolen = len>>1;
+    int sampleslen = stereolen>>1;
+    INT16 *stream16 = (INT16 *) (void *) stream;    // expect correct alignment
+
+    while(1)
+    {
+        if(numreadysamples)
+        {
+            if(numreadysamples<sampleslen)
+            {
+                YM3812UpdateOne(OPL_ptr, stream16, numreadysamples);
+                stream16 += numreadysamples*2;
+                sampleslen -= numreadysamples;
+            }
+            else
+            {
+                YM3812UpdateOne(OPL_ptr, stream16, sampleslen);
+                numreadysamples -= sampleslen;
+                return;
+            }
+        }
+        soundTimeCounter--;
+        if(!soundTimeCounter)
+        {
+            soundTimeCounter = 5;
+            if(curAlSound != alSound)
+            {
+                curAlSound = curAlSoundPtr = alSound;
+                curAlLengthLeft = alLengthLeft;
+            }
+            if(curAlSound)
+            {
+                if(*curAlSoundPtr)
+                {
+                    alOut(alFreqL, *curAlSoundPtr);
+                    alOut(alFreqH, alBlock);
+                }
+                else alOut(alFreqH, 0);
+                curAlSoundPtr++;
+                curAlLengthLeft--;
+                if(!curAlLengthLeft)
+                {
+                    curAlSound = alSound = 0;
+                    SoundNumber = (soundnames) 0;
+                    SoundPriority = 0;
+                    alOut(alFreqH, 0);
+                }
+            }
+        }
+        if(sqActive)
+        {
+            do
+            {
+                if(sqHackTime > alTimeCount) break;
+                sqHackTime = alTimeCount + *(sqHackPtr+1);
+                alOut(*(byte *) sqHackPtr, *(((byte *) sqHackPtr)+1));
+                sqHackPtr += 2;
+                sqHackLen -= 4;
+            }
+            while(sqHackLen>0);
+            alTimeCount++;
+            if(!sqHackLen)
+            {
+                sqHackPtr = sqHack;
+                sqHackLen = sqHackSeqLen;
+                sqHackTime = 0;
+                alTimeCount = 0;
+            }
+        }
+        numreadysamples = samplesPerMusicTick;
+    }
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_Startup() - starts up the Sound Mgr
+//              Detects all additional sound hardware and installs my ISR
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_Startup(void)
+{
+#ifdef SOUND_ENABLE
+    int     i;
+
+    if (SD_Started)
+        return;
+
+    if(Mix_OpenAudio(param_samplerate, AUDIO_S16, 2, param_audiobuffer))
+    {
+        printf("Unable to open audio: %s\n", Mix_GetError());
+        return;
+    }
+
+    Mix_ReserveChannels(2);  // reserve player and boss weapon channels
+    Mix_GroupChannels(2, MIX_CHANNELS-1, 1); // group remaining channels
+
+    // Init music
+
+    samplesPerMusicTick = param_samplerate / 700;    // SDL_t0FastAsmService played at 700Hz
+
+    if(!(OPL_ptr = YM3812Init((void*)1,3579545,param_samplerate)))
+    {
+        //printf("Unable to create virtual OPL!!\n");
+    }
+
+    for(i=1;i<0xf6;i++)
+        YM3812Write(OPL_ptr,i,0);
+
+    YM3812Write(OPL_ptr,1,0x20); // Set WSE=1
+//    YM3812Write(0,8,0); // Set CSM=0 & SEL=0		 // already set in for statement
+
+    Mix_HookMusic(SDL_IMFMusicPlayer, 0);
+    Mix_ChannelFinished(SD_ChannelFinished);
+    AdLibPresent = true;
+    SoundBlasterPresent = true;
+
+    alTimeCount = 0;
+
+    SD_SetSoundMode(sdm_Off);
+    SD_SetMusicMode(smm_Off);
+
+    SDL_SetupDigi();
+
+    SD_Started = true;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_Shutdown() - shuts down the Sound Mgr
+//              Removes sound ISR and turns off whatever sound hardware was active
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_Shutdown(void)
+{
+#ifdef SOUND_ENABLE
+    if (!SD_Started)
+        return;
+
+    SD_MusicOff();
+    SD_StopSound();
+
+    for(int i = 0; i < STARTMUSIC - STARTDIGISOUNDS; i++)
+    {
+        if(SoundChunks[i]) Mix_FreeChunk(SoundChunks[i]);
+        if(SoundBuffers[i]) free(SoundBuffers[i]);
+    }
+
+    free(DigiList);
+
+    SD_Started = false;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_PositionSound() - Sets up a stereo imaging location for the next
+//              sound to be played. Each channel ranges from 0 to 15.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_PositionSound(int leftvol,int rightvol)
+{
+#ifdef SOUND_ENABLE
+    LeftPosition = leftvol;
+    RightPosition = rightvol;
+    nextsoundpos = true;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_PlaySound() - plays the specified sound on the appropriate hardware
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_PlaySound(soundnames sound)
+{
+#ifdef SOUND_ENABLE
+    boolean         ispos;
+    SoundCommon     *s;
+    int             lp,rp;
+
+    lp = LeftPosition;
+    rp = RightPosition;
+    LeftPosition = 0;
+    RightPosition = 0;
+
+    ispos = nextsoundpos;
+    nextsoundpos = false;
+
+    if (sound == -1 || (DigiMode == sds_Off && SoundMode == sdm_Off))
+        return 0;
+
+    s = (SoundCommon *) SoundTable[sound];
+
+    if ((SoundMode != sdm_Off) && !s)
+            Quit("SD_PlaySound() - Uncached sound");
+
+    if ((DigiMode != sds_Off) && (DigiMap[sound] != -1))
+    {
+        if ((DigiMode == sds_PC) && (SoundMode == sdm_PC))
+        {
+#ifdef NOTYET
+            if (s->priority < SoundPriority)
+                return 0;
+
+            SDL_PCStopSound();
+
+            SD_PlayDigitized(DigiMap[sound],lp,rp);
+            SoundPositioned = ispos;
+            SoundNumber = sound;
+            SoundPriority = s->priority;
+#else
+            return 0;
+#endif
+        }
+        else
+        {
+#ifdef NOTYET
+            if (s->priority < DigiPriority)
+                return(false);
+#endif
+
+            int channel = SD_PlayDigitized(DigiMap[sound], lp, rp);
+            SoundPositioned = ispos;
+            DigiNumber = sound;
+            DigiPriority = s->priority;
+            return channel + 1;
+        }
+
+        return(true);
+    }
+
+    if (SoundMode == sdm_Off)
+        return 0;
+
+    if (!s->length)
+        Quit("SD_PlaySound() - Zero length sound");
+    if (s->priority < SoundPriority)
+        return 0;
+
+    switch (SoundMode)
+    {
+        case sdm_PC:
+//            SDL_PCPlaySound((PCSound *)s);
+            break;
+        case sdm_AdLib:
+            SDL_ALPlaySound((AdLibSound *)s);
+            break;
+    }
+
+    SoundNumber = sound;
+    SoundPriority = s->priority;
+
+    return 0;
+#endif
+    return 0;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_SoundPlaying() - returns the sound number that's playing, or 0 if
+//              no sound is playing
+//
+///////////////////////////////////////////////////////////////////////////
+word
+SD_SoundPlaying(void)
+{
+#ifdef SOUND_ENABLE
+    boolean result = false;
+
+    switch (SoundMode)
+    {
+        case sdm_PC:
+            result = pcSound? true : false;
+            break;
+        case sdm_AdLib:
+            result = alSound? true : false;
+            break;
+    }
+
+    if (result)
+        return(SoundNumber);
+    else
+        return(false);
+#endif
+    return false;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_StopSound() - if a sound is playing, stops it
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_StopSound(void)
+{
+#ifdef SOUND_ENABLE
+    if (DigiPlaying)
+        SD_StopDigitized();
+
+    switch (SoundMode)
+    {
+        case sdm_PC:
+//            SDL_PCStopSound();
+            break;
+        case sdm_AdLib:
+            SDL_ALStopSound();
+            break;
+    }
+
+    SoundPositioned = false;
+
+    SDL_SoundFinished();
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_WaitSoundDone() - waits until the current sound is done playing
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_WaitSoundDone(void)
+{
+#ifdef SOUND_ENABLE
+    while (SD_SoundPlaying())
+        SDL_Delay(5);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_MusicOn() - turns on the sequencer
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_MusicOn(void)
+{
+#ifdef SOUND_ENABLE
+    sqActive = true;
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_MusicOff() - turns off the sequencer and any playing notes
+//      returns the last music offset for music continue
+//
+///////////////////////////////////////////////////////////////////////////
+int
+SD_MusicOff(void)
+{
+#ifdef SOUND_ENABLE
+    word    i;
+
+    sqActive = false;
+    switch (MusicMode)
+    {
+        case smm_AdLib:
+            alOut(alEffects, 0);
+            for (i = 0;i < sqMaxTracks;i++)
+                alOut(alFreqH + i + 1, 0);
+            break;
+    }
+
+    return (int) (sqHackPtr-sqHack);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_StartMusic() - starts playing the music pointed to
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_StartMusic(int chunk)
+{
+#ifdef SOUND_ENABLE
+    SD_MusicOff();
+
+    if (MusicMode == smm_AdLib)
+    {
+        int32_t chunkLen = CA_CacheAudioChunk(chunk);
+        sqHack = (word *)(void *) audiosegs[chunk];     // alignment is correct
+        if(*sqHack == 0) sqHackLen = sqHackSeqLen = chunkLen;
+        else sqHackLen = sqHackSeqLen = *sqHack++;
+        sqHackPtr = sqHack;
+        sqHackTime = 0;
+        alTimeCount = 0;
+        SD_MusicOn();
+    }
+#endif
+}
+
+void
+SD_ContinueMusic(int chunk, int startoffs)
+{
+#ifdef SOUND_ENABLE
+    SD_MusicOff();
+
+    if (MusicMode == smm_AdLib)
+    {
+        int32_t chunkLen = CA_CacheAudioChunk(chunk);
+        sqHack = (word *)(void *) audiosegs[chunk];     // alignment is correct
+        if(*sqHack == 0) sqHackLen = sqHackSeqLen = chunkLen;
+        else sqHackLen = sqHackSeqLen = *sqHack++;
+        sqHackPtr = sqHack;
+
+        if(startoffs >= sqHackLen)
+        {
+            Quit("SD_StartMusic: Illegal startoffs provided!");
+        }
+
+        // fast forward to correct position
+        // (needed to reconstruct the instruments)
+
+        for(int i = 0; i < startoffs; i += 2)
+        {
+            byte reg = *(byte *)sqHackPtr;
+            byte val = *(((byte *)sqHackPtr) + 1);
+            if(reg >= 0xb1 && reg <= 0xb8) val &= 0xdf;           // disable play note flag
+            else if(reg == 0xbd) val &= 0xe0;                     // disable drum flags
+
+            alOut(reg,val);
+            sqHackPtr += 2;
+            sqHackLen -= 4;
+        }
+        sqHackTime = 0;
+        alTimeCount = 0;
+
+        SD_MusicOn();
+    }
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_FadeOutMusic() - starts fading out the music. Call SD_MusicPlaying()
+//              to see if the fadeout is complete
+//
+///////////////////////////////////////////////////////////////////////////
+void
+SD_FadeOutMusic(void)
+{
+#ifdef SOUND_ENABLE
+    switch (MusicMode)
+    {
+        case smm_AdLib:
+            // DEBUG - quick hack to turn the music off
+            SD_MusicOff();
+            break;
+    }
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//      SD_MusicPlaying() - returns true if music is currently playing, false if
+//              not
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+SD_MusicPlaying(void)
+{
+#ifdef SOUND_ENABLE
+    boolean result;
+
+    switch (MusicMode)
+    {
+        case smm_AdLib:
+            result = sqActive;
+            break;
+        default:
+            result = false;
+            break;
+    }
+
+    return(result);
+#endif
+    return false;
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_sd.h b/apps/plugins/sdl/progs/wolf3d/id_sd.h
new file mode 100644
index 0000000..2d91e73
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_sd.h
@@ -0,0 +1,158 @@
+//
+//      ID Engine
+//      ID_SD.h - Sound Manager Header
+//      Version for Wolfenstein
+//      By Jason Blochowiak
+//
+
+#ifndef __ID_SD__
+#define __ID_SD__
+
+extern void *OPL_ptr;
+
+#define alOut(n,b) YM3812Write(OPL_ptr, n, b)
+
+#define TickBase        70      // 70Hz per tick - used as a base for timer 0
+
+typedef enum
+{
+    sdm_Off,
+    sdm_PC,sdm_AdLib,
+} SDMode;
+
+typedef enum
+{
+    smm_Off,smm_AdLib
+} SMMode;
+
+typedef enum
+{
+    sds_Off,sds_PC,sds_SoundBlaster
+} SDSMode;
+
+typedef struct
+{
+    longword        length;
+    word            priority;
+} SoundCommon;
+
+#define ORIG_SOUNDCOMMON_SIZE 6
+
+//      PC Sound stuff
+#define pcTimer         0x42
+#define pcTAccess       0x43
+#define pcSpeaker       0x61
+
+#define pcSpkBits       3
+
+typedef struct
+{
+    SoundCommon     common;
+    byte            data[1];
+} PCSound;
+
+//      Register addresses
+// Operator stuff
+#define alChar          0x20
+#define alScale         0x40
+#define alAttack        0x60
+#define alSus           0x80
+#define alWave          0xe0
+// Channel stuff
+#define alFreqL         0xa0
+#define alFreqH         0xb0
+#define alFeedCon       0xc0
+// Global stuff
+#define alEffects       0xbd
+
+typedef struct
+{
+    byte    mChar,cChar,
+            mScale,cScale,
+            mAttack,cAttack,
+            mSus,cSus,
+            mWave,cWave,
+            nConn,
+
+            // These are only for Muse - these bytes are really unused
+            voice,
+            mode;
+    byte    unused[3];
+} Instrument;
+
+#define ORIG_INSTRUMENT_SIZE 16
+
+typedef struct
+{
+    SoundCommon     common;
+    Instrument      inst;
+    byte            block;
+    byte            data[1];
+} AdLibSound;
+
+#define ORIG_ADLIBSOUND_SIZE (ORIG_SOUNDCOMMON_SIZE + ORIG_INSTRUMENT_SIZE + 2)
+
+//
+//      Sequencing stuff
+//
+#define sqMaxTracks     10
+
+typedef struct
+{
+    word    length;
+    word    values[1];
+} MusicGroup;
+
+typedef struct
+{
+    int valid;
+    fixed globalsoundx, globalsoundy;
+} globalsoundpos;
+
+extern globalsoundpos channelSoundPos[];
+
+// Global variables
+extern  boolean         AdLibPresent,
+                        SoundBlasterPresent,
+                        SoundPositioned;
+extern  SDMode          SoundMode;
+extern  SDSMode         DigiMode;
+extern  SMMode          MusicMode;
+extern  int             DigiMap[];
+extern  int             DigiChannel[];
+
+#define GetTimeCount()  ((SDL_GetTicks()*7)/100)
+
+inline void Delay(int wolfticks)
+{
+    if(wolfticks>0) SDL_Delay(wolfticks * 100 / 7);
+}
+
+// Function prototypes
+extern  void    SD_Startup(void),
+                SD_Shutdown(void);
+
+extern  int     SD_GetChannelForDigi(int which);
+extern  void    SD_PositionSound(int leftvol,int rightvol);
+extern  boolean SD_PlaySound(soundnames sound);
+extern  void    SD_SetPosition(int channel, int leftvol,int rightvol);
+extern  void    SD_StopSound(void),
+                SD_WaitSoundDone(void);
+
+extern  void    SD_StartMusic(int chunk);
+extern  void    SD_ContinueMusic(int chunk, int startoffs);
+extern  void    SD_MusicOn(void),
+                SD_FadeOutMusic(void);
+extern  int     SD_MusicOff(void);
+
+extern  boolean SD_MusicPlaying(void);
+extern  boolean SD_SetSoundMode(SDMode mode);
+extern  boolean SD_SetMusicMode(SMMode mode);
+extern  word    SD_SoundPlaying(void);
+
+extern  void    SD_SetDigiDevice(SDSMode);
+extern  void	SD_PreparSound(int which);
+extern  int     SD_PlayDigitized(word which,int leftpos,int rightpos);
+extern  void    SD_StopDigitized(void);
+
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/id_us.h b/apps/plugins/sdl/progs/wolf3d/id_us.h
new file mode 100644
index 0000000..8495863
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_us.h
@@ -0,0 +1,101 @@
+//
+//	ID Engine
+//	ID_US.h - Header file for the User Manager
+//	v1.0d1
+//	By Jason Blochowiak
+//
+
+#ifndef	__ID_US__
+#define	__ID_US__
+
+#ifdef	__DEBUG__
+#define	__DEBUG_UserMgr__
+#endif
+
+//#define	HELPTEXTLINKED
+
+#define	MaxX	320
+#define	MaxY	200
+
+#define	MaxHelpLines	500
+
+#define	MaxHighName	57
+#define	MaxScores	7
+typedef	struct
+{
+    char	name[MaxHighName + 1];
+    int32_t	score;
+    word	completed,episode;
+} HighScore;
+
+#define	MaxGameName		32
+#define	MaxSaveGames	6
+typedef	struct
+{
+    char	signature[4];
+    word	*oldtest;
+    boolean	present;
+    char	name[MaxGameName + 1];
+} SaveGame;
+
+#define	MaxString	128	// Maximum input string size
+
+typedef	struct
+{
+    int	x,y,
+        w,h,
+        px,py;
+} WindowRec;	// Record used to save & restore screen windows
+
+extern	boolean		ingame,		// Set by game code if a game is in progress
+					loadedgame;	// Set if the current game was loaded
+extern	word		PrintX,PrintY;	// Current printing location in the window
+extern	word		WindowX,WindowY,// Current location of window
+					WindowW,WindowH;// Current size of window
+
+extern	void		(*USL_MeasureString)(const char *,word *,word *);
+extern void			(*USL_DrawString)(const char *);
+
+extern	boolean		(*USL_SaveGame)(int),(*USL_LoadGame)(int);
+extern	void		(*USL_ResetGame)(void);
+extern	SaveGame	Games[MaxSaveGames];
+extern	HighScore	Scores[];
+
+#define	US_HomeWindow()	{PrintX = WindowX; PrintY = WindowY;}
+
+void            US_Startup(void);
+void            US_Shutdown(void);
+void			US_TextScreen(void),
+				US_UpdateTextScreen(void),
+				US_FinishTextScreen(void);
+void			US_DrawWindow(word x,word y,word w,word h);
+void			US_CenterWindow(word,word);
+void			US_SaveWindow(WindowRec *win),
+				US_RestoreWindow(WindowRec *win);
+void 			US_ClearWindow(void);
+void			US_SetPrintRoutines(void (*measure)(const char *,word *,word *),
+									void (*print)(const char *));
+void			US_PrintCentered(const char *s),
+				US_CPrint(const char *s),
+				US_CPrintLine(const char *s),
+				US_Print(const char *s);
+void			US_Printf(const char *formatStr, ...);
+void			US_CPrintf(const char *formatStr, ...);
+
+void			US_PrintUnsigned(longword n);
+void			US_PrintSigned(int32_t n);
+void			US_StartCursor(void),
+				US_ShutCursor(void);
+void			US_CheckHighScore(int32_t score,word other);
+void			US_DisplayHighScores(int which);
+extern	boolean	US_UpdateCursor(void);
+boolean         US_LineInput(int x,int y,char *buf,const char *def,boolean escok,
+                             int maxchars,int maxwidth);
+
+void	        USL_PrintInCenter(const char *s,Rect r);
+char 	        *USL_GiveSaveName(word game);
+
+void            US_InitRndT(int randomize);
+int             US_RndT();
+
+#endif
diff --git a/apps/plugins/sdl/progs/wolf3d/id_us_1.c b/apps/plugins/sdl/progs/wolf3d/id_us_1.c
new file mode 100644
index 0000000..76b53f3
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_us_1.c
@@ -0,0 +1,789 @@
+//
+//	ID Engine
+//	ID_US_1.c - User Manager - General routines
+//	v1.1d1
+//	By Jason Blochowiak
+//	Hacked up for Catacomb 3D
+//
+
+//
+//	This module handles dealing with user input & feedback
+//
+//	Depends on: Input Mgr, View Mgr, some variables from the Sound, Caching,
+//		and Refresh Mgrs, Memory Mgr for background save/restore
+//
+//	Globals:
+//		ingame - Flag set by game indicating if a game is in progress
+//		loadedgame - Flag set if a game was loaded
+//		PrintX, PrintY - Where the User Mgr will print (global coords)
+//		WindowX,WindowY,WindowW,WindowH - The dimensions of the current
+//			window
+//
+
+#include "wl_def.h"
+
+#pragma	hdrstop
+
+#if _MSC_VER == 1200            // Visual C++ 6
+	#define vsnprintf _vsnprintf
+#endif
+
+//	Global variables
+		word		PrintX,PrintY;
+		word		WindowX,WindowY,WindowW,WindowH;
+
+//	Internal variables
+#define	ConfigVersion	1
+
+static	boolean		US_Started;
+
+		void		(*USL_MeasureString)(const char *,word *,word *) = VW_MeasurePropString;
+		void		(*USL_DrawString)(const char *) = VWB_DrawPropString;
+
+		SaveGame	Games[MaxSaveGames];
+		HighScore	Scores[MaxScores] =
+					{
+						{"id software-'92",10000,1},
+						{"Adrian Carmack",10000,1},
+						{"John Carmack",10000,1},
+						{"Kevin Cloud",10000,1},
+						{"Tom Hall",10000,1},
+						{"John Romero",10000,1},
+						{"Jay Wilbur",10000,1},
+					};
+
+int rndindex = 0;
+
+static byte rndtable[] = {
+      0,   8, 109, 220, 222, 241, 149, 107,  75, 248, 254, 140,  16,  66,
+	 74,  21, 211,  47,  80, 242, 154,  27, 205, 128, 161,  89,  77,  36,
+	 95, 110,  85,  48, 212, 140, 211, 249,  22,  79, 200,  50,  28, 188,
+	 52, 140, 202, 120,  68, 145,  62,  70, 184, 190,  91, 197, 152, 224,
+	149, 104,  25, 178, 252, 182, 202, 182, 141, 197,   4,  81, 181, 242,
+	145,  42,  39, 227, 156, 198, 225, 193, 219,  93, 122, 175, 249,   0,
+	175, 143,  70, 239,  46, 246, 163,  53, 163, 109, 168, 135,   2, 235,
+	 25,  92,  20, 145, 138,  77,  69, 166,  78, 176, 173, 212, 166, 113,
+	 94, 161,  41,  50, 239,  49, 111, 164,  70,  60,   2,  37, 171,  75,
+	136, 156,  11,  56,  42, 146, 138, 229,  73, 146,  77,  61,  98, 196,
+	135, 106,  63, 197, 195,  86,  96, 203, 113, 101, 170, 247, 181, 113,
+	 80, 250, 108,   7, 255, 237, 129, 226,  79, 107, 112, 166, 103, 241,
+	 24, 223, 239, 120, 198,  58,  60,  82, 128,   3, 184,  66, 143, 224,
+	145, 224,  81, 206, 163,  45,  63,  90, 168, 114,  59,  33, 159,  95,
+	 28, 139, 123,  98, 125, 196,  15,  70, 194, 253,  54,  14, 109, 226,
+	 71,  17, 161,  93, 186,  87, 244, 138,  20,  52, 123, 251,  26,  36,
+	 17,  46,  52, 231, 232,  76,  31, 221,  84,  37, 216, 165, 212, 106,
+	197, 242,  98,  43,  39, 175, 254, 145, 190,  84, 118, 222, 187, 136,
+	120, 163, 236, 249 };
+
+//	Internal routines
+
+//	Public routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_Startup() - Starts the User Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void US_Startup()
+{
+	if (US_Started)
+		return;
+
+	US_InitRndT(true);		// Initialize the random number generator
+
+	US_Started = true;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_Shutdown() - Shuts down the User Mgr
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_Shutdown(void)
+{
+	if (!US_Started)
+		return;
+
+	US_Started = false;
+}
+
+//	Window/Printing routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_SetPrintRoutines() - Sets the routines used to measure and print
+//		from within the User Mgr. Primarily provided to allow switching
+//		between masked and non-masked fonts
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_SetPrintRoutines(void (*measure)(const char *,word *,word *),
+    void (*print)(const char *))
+{
+	USL_MeasureString = measure;
+	USL_DrawString = print;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_Print() - Prints a string in the current window. Newlines are
+//		supported.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_Print(const char *sorg)
+{
+	char c;
+	char *sstart = strdup(sorg);
+	char *s = sstart;
+	char *se;
+	word w,h;
+
+	while (*s)
+	{
+		se = s;
+		while ((c = *se)!=0 && (c != '\n'))
+			se++;
+		*se = '\0';
+
+		USL_MeasureString(s,&w,&h);
+		px = PrintX;
+		py = PrintY;
+		USL_DrawString(s);
+
+		s = se;
+		if (c)
+		{
+			*se = c;
+			s++;
+
+			PrintX = WindowX;
+			PrintY += h;
+		}
+		else
+			PrintX += w;
+	}
+	free(sstart);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_PrintUnsigned() - Prints an unsigned long
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_PrintUnsigned(longword n)
+{
+	char	buffer[32];
+	sprintf(buffer, "%lu", n);
+
+	US_Print(buffer);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_PrintSigned() - Prints a signed long
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_PrintSigned(int32_t n)
+{
+	char	buffer[32];
+
+	US_Print(ltoa(n,buffer,10));
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	USL_PrintInCenter() - Prints a string in the center of the given rect
+//
+///////////////////////////////////////////////////////////////////////////
+void
+USL_PrintInCenter(const char *s,Rect r)
+{
+	word	w,h,
+			rw,rh;
+
+	USL_MeasureString(s,&w,&h);
+	rw = r.lr.x - r.ul.x;
+	rh = r.lr.y - r.ul.y;
+
+	px = r.ul.x + ((rw - w) / 2);
+	py = r.ul.y + ((rh - h) / 2);
+	USL_DrawString(s);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_PrintCentered() - Prints a string centered in the current window.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_PrintCentered(const char *s)
+{
+	Rect	r;
+
+	r.ul.x = WindowX;
+	r.ul.y = WindowY;
+	r.lr.x = r.ul.x + WindowW;
+	r.lr.y = r.ul.y + WindowH;
+
+	USL_PrintInCenter(s,r);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_CPrintLine() - Prints a string centered on the current line and
+//		advances to the next line. Newlines are not supported.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_CPrintLine(const char *s)
+{
+	word	w,h;
+
+	USL_MeasureString(s,&w,&h);
+
+	if (w > WindowW)
+		Quit("US_CPrintLine() - String exceeds width");
+	px = WindowX + ((WindowW - w) / 2);
+	py = PrintY;
+	USL_DrawString(s);
+	PrintY += h;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  US_CPrint() - Prints a string centered in the current window.
+//      Newlines are supported.
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_CPrint(const char *sorg)
+{
+	char	c;
+	char *sstart = strdup(sorg);
+	char *s = sstart;
+	char *se;
+
+	while (*s)
+	{
+		se = s;
+		while ((c = *se)!=0 && (c != '\n'))
+			se++;
+		*se = '\0';
+
+		US_CPrintLine(s);
+
+		s = se;
+		if (c)
+		{
+			*se = c;
+			s++;
+		}
+	}
+	free(sstart);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  US_Printf() - Prints a formatted string in the current window.
+//      Newlines are supported.
+//
+///////////////////////////////////////////////////////////////////////////
+
+void US_Printf(const char *formatStr, ...)
+{
+    char strbuf[256];
+    va_list vlist;
+    va_start(vlist, formatStr);
+    int len = vsnprintf(strbuf, sizeof(strbuf), formatStr, vlist);
+    va_end(vlist);
+    if(len <= -1 || len >= sizeof(strbuf))
+        strbuf[sizeof(strbuf) - 1] = 0;
+    US_Print(strbuf);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//  US_CPrintf() - Prints a formatted string centered in the current window.
+//      Newlines are supported.
+//
+///////////////////////////////////////////////////////////////////////////
+
+void US_CPrintf(const char *formatStr, ...)
+{
+    char strbuf[256];
+    va_list vlist;
+    va_start(vlist, formatStr);
+    int len = vsnprintf(strbuf, sizeof(strbuf), formatStr, vlist);
+    va_end(vlist);
+    if(len <= -1 || len >= sizeof(strbuf))
+        strbuf[sizeof(strbuf) - 1] = 0;
+    US_CPrint(strbuf);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_ClearWindow() - Clears the current window to white and homes the
+//		cursor
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_ClearWindow(void)
+{
+	VWB_Bar(WindowX,WindowY,WindowW,WindowH,WHITE);
+	PrintX = WindowX;
+	PrintY = WindowY;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_DrawWindow() - Draws a frame and sets the current window parms
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_DrawWindow(word x,word y,word w,word h)
+{
+	word	i,
+			sx,sy,sw,sh;
+
+	WindowX = x * 8;
+	WindowY = y * 8;
+	WindowW = w * 8;
+	WindowH = h * 8;
+
+	PrintX = WindowX;
+	PrintY = WindowY;
+
+	sx = (x - 1) * 8;
+	sy = (y - 1) * 8;
+	sw = (w + 1) * 8;
+	sh = (h + 1) * 8;
+
+	US_ClearWindow();
+
+	VWB_DrawTile8(sx,sy,0),VWB_DrawTile8(sx,sy + sh,5);
+	for (i = sx + 8;i <= sx + sw - 8;i += 8)
+		VWB_DrawTile8(i,sy,1),VWB_DrawTile8(i,sy + sh,6);
+	VWB_DrawTile8(i,sy,2),VWB_DrawTile8(i,sy + sh,7);
+
+	for (i = sy + 8;i <= sy + sh - 8;i += 8)
+		VWB_DrawTile8(sx,i,3),VWB_DrawTile8(sx + sw,i,4);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_CenterWindow() - Generates a window of a given width & height in the
+//		middle of the screen
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_CenterWindow(word w,word h)
+{
+	US_DrawWindow(((MaxX / 8) - w) / 2,((MaxY / 8) - h) / 2,w,h);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_SaveWindow() - Saves the current window parms into a record for
+//		later restoration
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_SaveWindow(WindowRec *win)
+{
+	win->x = WindowX;
+	win->y = WindowY;
+	win->w = WindowW;
+	win->h = WindowH;
+
+	win->px = PrintX;
+	win->py = PrintY;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_RestoreWindow() - Sets the current window parms to those held in the
+//		record
+//
+///////////////////////////////////////////////////////////////////////////
+void
+US_RestoreWindow(WindowRec *win)
+{
+	WindowX = win->x;
+	WindowY = win->y;
+	WindowW = win->w;
+	WindowH = win->h;
+
+	PrintX = win->px;
+	PrintY = win->py;
+}
+
+//	Input routines
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	USL_XORICursor() - XORs the I-bar text cursor. Used by US_LineInput()
+//
+///////////////////////////////////////////////////////////////////////////
+static void
+USL_XORICursor(int x,int y,const char *s,word cursor)
+{
+	static	boolean	status;		// VGA doesn't XOR...
+	char	buf[MaxString];
+	int		temp;
+	word	w,h;
+
+	strcpy(buf,s);
+	buf[cursor] = '\0';
+	USL_MeasureString(buf,&w,&h);
+
+	px = x + w - 1;
+	py = y;
+	if (status^=1)
+		USL_DrawString("\x80");
+	else
+	{
+		temp = fontcolor;
+		fontcolor = backcolor;
+		USL_DrawString("\x80");
+		fontcolor = temp;
+	}
+}
+
+char USL_RotateChar(char ch, int dir)
+{
+    static const char charSet[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ.,-!?0123456789";
+    const int numChars = sizeof(charSet) / sizeof(char) - 1;
+    int i;
+    for(i = 0; i < numChars; i++)
+    {
+        if(ch == charSet[i]) break;
+    }
+
+    if(i == numChars) i = 0;
+
+    i += dir;
+    if(i < 0) i = numChars - 1;
+    else if(i >= numChars) i = 0;
+    return charSet[i];
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+//	US_LineInput() - Gets a line of user input at (x,y), the string defaults
+//		to whatever is pointed at by def. Input is restricted to maxchars
+//		chars or maxwidth pixels wide. If the user hits escape (and escok is
+//		true), nothing is copied into buf, and false is returned. If the
+//		user hits return, the current string is copied into buf, and true is
+//		returned
+//
+///////////////////////////////////////////////////////////////////////////
+boolean
+US_LineInput(int x,int y,char *buf,const char *def,boolean escok,
+				int maxchars,int maxwidth)
+{
+	boolean		redraw,
+				cursorvis,cursormoved,
+				done,result, checkkey;
+	ScanCode	sc;
+	char		c;
+	char		s[MaxString],olds[MaxString];
+	int         cursor,len;
+	word		i,
+				w,h,
+				temp;
+	longword	curtime, lasttime, lastdirtime, lastbuttontime, lastdirmovetime;
+	ControlInfo ci;
+	Direction   lastdir = dir_None;
+
+	if (def)
+		strcpy(s,def);
+	else
+		*s = '\0';
+	*olds = '\0';
+	cursor = (int) strlen(s);
+	cursormoved = redraw = true;
+
+	cursorvis = done = false;
+	lasttime = lastdirtime = lastdirmovetime = GetTimeCount();
+	lastbuttontime = lasttime + TickBase / 4;	// 250 ms => first button press accepted after 500 ms
+	LastASCII = key_None;
+	LastScan = sc_None;
+
+	while (!done)
+	{
+		ReadAnyControl(&ci);
+
+		if (cursorvis)
+			USL_XORICursor(x,y,s,cursor);
+
+		sc = LastScan;
+		LastScan = sc_None;
+		c = LastASCII;
+		LastASCII = key_None;
+
+		checkkey = true;
+		curtime = GetTimeCount();
+
+		// After each direction change accept the next change after 250 ms and then everz 125 ms
+		if(ci.dir != lastdir || curtime - lastdirtime > TickBase / 4 && curtime - lastdirmovetime > TickBase / 8)
+		{
+			if(ci.dir != lastdir)
+			{
+				lastdir = ci.dir;
+				lastdirtime = curtime;
+			}
+            lastdirmovetime = curtime;
+
+			switch(ci.dir)
+			{
+				case dir_West:
+					if(cursor)
+					{
+						// Remove trailing whitespace if cursor is at end of string
+						if(s[cursor] == ' ' && s[cursor + 1] == 0)
+							s[cursor] = 0;
+						cursor--;
+					}
+					cursormoved = true;
+					checkkey = false;
+					break;
+				case dir_East:
+					if(cursor >= MaxString - 1) break;
+
+					if(!s[cursor])
+					{
+						USL_MeasureString(s,&w,&h);
+						if(len >= maxchars || maxwidth && w >= maxwidth) break;
+
+						s[cursor] = ' ';
+						s[cursor + 1] = 0;
+					}
+					cursor++;
+					cursormoved = true;
+					checkkey = false;
+					break;
+
+				case dir_North:
+					if(!s[cursor])
+					{
+						USL_MeasureString(s,&w,&h);
+						if(len >= maxchars || maxwidth && w >= maxwidth) break;
+						s[cursor + 1] = 0;
+					}
+					s[cursor] = USL_RotateChar(s[cursor], 1);
+					redraw = true;
+					checkkey = false;
+					break;
+
+				case dir_South:
+					if(!s[cursor])
+					{
+						USL_MeasureString(s,&w,&h);
+						if(len >= maxchars || maxwidth && w >= maxwidth) break;
+						s[cursor + 1] = 0;
+					}
+					s[cursor] = USL_RotateChar(s[cursor], -1);
+					redraw = true;
+					checkkey = false;
+					break;
+			}
+		}
+
+		if((int)(curtime - lastbuttontime) > TickBase / 4)   // 250 ms
+		{
+			if(ci.button0)             // acts as return
+			{
+				strcpy(buf,s);
+				done = true;
+				result = true;
+				checkkey = false;
+			}
+			if(ci.button1 && escok)    // acts as escape
+			{
+				done = true;
+				result = false;
+				checkkey = false;
+			}
+			if(ci.button2)             // acts as backspace
+			{
+				lastbuttontime = curtime;
+				if(cursor)
+				{
+					strcpy(s + cursor - 1,s + cursor);
+					cursor--;
+					redraw = true;
+				}
+				cursormoved = true;
+				checkkey = false;
+			}
+		}
+
+		if(checkkey)
+		{
+			switch (sc)
+			{
+				case sc_LeftArrow:
+					if (cursor)
+						cursor--;
+					c = key_None;
+					cursormoved = true;
+					break;
+				case sc_RightArrow:
+					if (s[cursor])
+						cursor++;
+					c = key_None;
+					cursormoved = true;
+					break;
+				case sc_Home:
+					cursor = 0;
+					c = key_None;
+					cursormoved = true;
+					break;
+				case sc_End:
+					cursor = (int) strlen(s);
+					c = key_None;
+					cursormoved = true;
+					break;
+
+				case sc_Return:
+					strcpy(buf,s);
+					done = true;
+					result = true;
+					c = key_None;
+					break;
+				case sc_Escape:
+					if (escok)
+					{
+						done = true;
+						result = false;
+					}
+					c = key_None;
+					break;
+
+				case sc_BackSpace:
+					if (cursor)
+					{
+						strcpy(s + cursor - 1,s + cursor);
+						cursor--;
+						redraw = true;
+					}
+					c = key_None;
+					cursormoved = true;
+					break;
+				case sc_Delete:
+					if (s[cursor])
+					{
+						strcpy(s + cursor,s + cursor + 1);
+						redraw = true;
+					}
+					c = key_None;
+					cursormoved = true;
+					break;
+
+				case SDLK_KP5: //0x4c:	// Keypad 5 // TODO: hmmm...
+				case sc_UpArrow:
+				case sc_DownArrow:
+				case sc_PgUp:
+				case sc_PgDn:
+				case sc_Insert:
+					c = key_None;
+					break;
+			}
+
+			if (c)
+			{
+				len = (int) strlen(s);
+				USL_MeasureString(s,&w,&h);
+
+				if(isprint(c) && (len < MaxString - 1) && ((!maxchars) || (len < maxchars))
+					&& ((!maxwidth) || (w < maxwidth)))
+				{
+					for (i = len + 1;i > cursor;i--)
+						s[i] = s[i - 1];
+					s[cursor++] = c;
+					redraw = true;
+				}
+			}
+		}
+
+		if (redraw)
+		{
+			px = x;
+			py = y;
+			temp = fontcolor;
+			fontcolor = backcolor;
+			USL_DrawString(olds);
+			fontcolor = (byte) temp;
+			strcpy(olds,s);
+
+			px = x;
+			py = y;
+			USL_DrawString(s);
+
+			redraw = false;
+		}
+
+		if (cursormoved)
+		{
+			cursorvis = false;
+			lasttime = curtime - TickBase;
+
+			cursormoved = false;
+		}
+		if (curtime - lasttime > TickBase / 2)    // 500 ms
+		{
+			lasttime = curtime;
+
+			cursorvis ^= true;
+		}
+		else SDL_Delay(5);
+		if (cursorvis)
+			USL_XORICursor(x,y,s,cursor);
+
+		VW_UpdateScreen();
+	}
+
+	if (cursorvis)
+		USL_XORICursor(x,y,s,cursor);
+	if (!result)
+	{
+		px = x;
+		py = y;
+		USL_DrawString(olds);
+	}
+	VW_UpdateScreen();
+
+	IN_ClearKeysDown();
+	return(result);
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_InitRndT - Initializes the pseudo random number generator.
+//      If randomize is true, the seed will be initialized depending on the
+//      current time
+//
+///////////////////////////////////////////////////////////////////////////
+void US_InitRndT(int randomize)
+{
+    if(randomize)
+        rndindex = (SDL_GetTicks() >> 4) & 0xff;
+    else
+        rndindex = 0;
+}
+
+///////////////////////////////////////////////////////////////////////////
+//
+// US_RndT - Returns the next 8-bit pseudo random number
+//
+///////////////////////////////////////////////////////////////////////////
+int US_RndT()
+{
+    rndindex = (rndindex+1)&0xff;
+    return rndtable[rndindex];
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_vh.c b/apps/plugins/sdl/progs/wolf3d/id_vh.c
new file mode 100644
index 0000000..a63dd06
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_vh.c
@@ -0,0 +1,435 @@
+#include "wl_def.h"
+
+
+pictabletype	*pictable;
+SDL_Surface     *latchpics[NUMLATCHPICS];
+
+int	    px,py;
+byte	fontcolor,backcolor;
+int	    fontnumber;
+
+//==========================================================================
+
+void VWB_DrawPropString(const char* string)
+{
+	fontstruct  *font;
+	int		    width, step, height;
+	byte	    *source, *dest;
+	byte	    ch;
+
+    byte *vbuf = LOCK();
+
+	font = (fontstruct *) grsegs[STARTFONT+fontnumber];
+	height = font->height;
+	dest = vbuf + scaleFactor * (py * curPitch + px);
+
+	while ((ch = (byte)*string++)!=0)
+	{
+		width = step = font->width[ch];
+		source = ((byte *)font)+font->location[ch];
+		while (width--)
+		{
+			for(int i=0;i<height;i++)
+			{
+				if(source[i*step])
+                {
+                    for(unsigned sy=0; sy<scaleFactor; sy++)
+                        for(unsigned sx=0; sx<scaleFactor; sx++)
+        					dest[(scaleFactor*i+sy)*curPitch+sx]=fontcolor;
+                }
+			}
+
+			source++;
+			px++;
+			dest+=scaleFactor;
+		}
+	}
+
+	UNLOCK();
+}
+
+/*
+=================
+=
+= VL_MungePic
+=
+=================
+*/
+
+void VL_MungePic (byte *source, unsigned width, unsigned height)
+{
+	unsigned x,y,plane,size,pwidth;
+	byte *temp, *dest, *srcline;
+
+	size = width*height;
+
+	if (width&3)
+		Quit ("VL_MungePic: Not divisable by 4!");
+
+//
+// copy the pic to a temp buffer
+//
+	temp=(byte *) malloc(size);
+    CHECKMALLOCRESULT(temp);
+	memcpy (temp,source,size);
+
+//
+// munge it back into the original buffer
+//
+	dest = source;
+	pwidth = width/4;
+
+	for (plane=0;plane<4;plane++)
+	{
+		srcline = temp;
+		for (y=0;y<height;y++)
+		{
+			for (x=0;x<pwidth;x++)
+				*dest++ = *(srcline+x*4+plane);
+			srcline+=width;
+		}
+	}
+
+	free(temp);
+}
+
+void VWL_MeasureString (const char *string, word *width, word *height, fontstruct *font)
+{
+	*height = font->height;
+	for (*width = 0;*string;string++)
+		*width += font->width[*((byte *)string)];	// proportional width
+}
+
+void VW_MeasurePropString (const char *string, word *width, word *height)
+{
+	VWL_MeasureString(string,width,height,(fontstruct *)grsegs[STARTFONT+fontnumber]);
+}
+
+/*
+=============================================================================
+
+				Double buffer management routines
+
+=============================================================================
+*/
+
+void VH_UpdateScreen()
+{
+	SDL_BlitSurface(screenBuffer, NULL, screen, NULL);
+	SDL_Flip(screen);
+}
+
+
+void VWB_DrawTile8 (int x, int y, int tile)
+{
+	LatchDrawChar(x,y,tile);
+}
+
+void VWB_DrawTile8M (int x, int y, int tile)
+{
+	VL_MemToScreen (((byte *)grsegs[STARTTILE8M])+tile*64,8,8,x,y);
+}
+
+void VWB_DrawPic (int x, int y, int chunknum)
+{
+	int	picnum = chunknum - STARTPICS;
+	unsigned width,height;
+
+	x &= ~7;
+
+	width = pictable[picnum].width;
+	height = pictable[picnum].height;
+
+	VL_MemToScreen (grsegs[chunknum],width,height,x,y);
+}
+
+void VWB_DrawPicScaledCoord (int scx, int scy, int chunknum)
+{
+	int	picnum = chunknum - STARTPICS;
+	unsigned width,height;
+
+	width = pictable[picnum].width;
+	height = pictable[picnum].height;
+
+    VL_MemToScreenScaledCoord (grsegs[chunknum],width,height,scx,scy);
+}
+
+
+void VWB_Bar (int x, int y, int width, int height, int color)
+{
+	VW_Bar (x,y,width,height,color);
+}
+
+void VWB_Plot (int x, int y, int color)
+{
+    if(scaleFactor == 1)
+        VW_Plot(x,y,color);
+    else
+        VW_Bar(x, y, 1, 1, color);
+}
+
+void VWB_Hlin (int x1, int x2, int y, int color)
+{
+    if(scaleFactor == 1)
+    	VW_Hlin(x1,x2,y,color);
+    else
+        VW_Bar(x1, y, x2-x1+1, 1, color);
+}
+
+void VWB_Vlin (int y1, int y2, int x, int color)
+{
+    if(scaleFactor == 1)
+		VW_Vlin(y1,y2,x,color);
+    else
+        VW_Bar(x, y1, 1, y2-y1+1, color);
+}
+
+
+/*
+=============================================================================
+
+						WOLFENSTEIN STUFF
+
+=============================================================================
+*/
+
+/*
+=====================
+=
+= LatchDrawPic
+=
+=====================
+*/
+
+void LatchDrawPic (unsigned x, unsigned y, unsigned picnum)
+{
+	VL_LatchToScreen_ez (latchpics[2+picnum-LATCHPICS_LUMP_START], x*8, y);
+}
+
+void LatchDrawPicScaledCoord (unsigned scx, unsigned scy, unsigned picnum)
+{
+	VL_LatchToScreenScaledCoord_ez (latchpics[2+picnum-LATCHPICS_LUMP_START], scx*8, scy);
+}
+
+
+//==========================================================================
+
+/*
+===================
+=
+= LoadLatchMem
+=
+===================
+*/
+
+void LoadLatchMem (void)
+{
+	int	i,width,height,start,end;
+	byte *src;
+	SDL_Surface *surf;
+
+//
+// tile 8s
+//
+    surf = SDL_CreateRGBSurface(SDL_HWSURFACE, 8*8,
+        ((NUMTILE8 + 7) / 8) * 8, 8, 0, 0, 0, 0);
+    if(surf == NULL)
+    {
+        Quit("Unable to create surface for tiles!");
+    }
+    SDL_SetColors(surf, gamepal, 0, 256);
+
+	latchpics[0] = surf;
+	CA_CacheGrChunk (STARTTILE8);
+	src = grsegs[STARTTILE8];
+
+	for (i=0;i<NUMTILE8;i++)
+	{
+		VL_MemToLatch (src, 8, 8, surf, (i & 7) * 8, (i >> 3) * 8);
+		src += 64;
+	}
+	UNCACHEGRCHUNK (STARTTILE8);
+
+//
+// pics
+//
+	start = LATCHPICS_LUMP_START;
+	end = LATCHPICS_LUMP_END;
+
+	for (i=start;i<=end;i++)
+	{
+		width = pictable[i-STARTPICS].width;
+		height = pictable[i-STARTPICS].height;
+		surf = SDL_CreateRGBSurface(SDL_HWSURFACE, width, height, 8, 0, 0, 0, 0);
+        if(surf == NULL)
+        {
+            Quit("Unable to create surface for picture!");
+        }
+        SDL_SetColors(surf, gamepal, 0, 256);
+
+		latchpics[2+i-start] = surf;
+		CA_CacheGrChunk (i);
+		VL_MemToLatch (grsegs[i], width, height, surf, 0, 0);
+		UNCACHEGRCHUNK(i);
+	}
+}
+
+//==========================================================================
+
+/*
+===================
+=
+= FizzleFade
+=
+= returns true if aborted
+=
+= It uses maximum-length Linear Feedback Shift Registers (LFSR) counters.
+= You can find a list of them with lengths from 3 to 168 at:
+= http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf
+= Many thanks to Xilinx for this list!!!
+=
+===================
+*/
+
+// XOR masks for the pseudo-random number sequence starting with n=17 bits
+static const uint32_t rndmasks[] = {
+                    // n    XNOR from (starting at 1, not 0 as usual)
+    0x00012000,     // 17   17,14
+    0x00020400,     // 18   18,11
+    0x00040023,     // 19   19,6,2,1
+    0x00090000,     // 20   20,17
+    0x00140000,     // 21   21,19
+    0x00300000,     // 22   22,21
+    0x00420000,     // 23   23,18
+    0x00e10000,     // 24   24,23,22,17
+    0x01200000,     // 25   25,22      (this is enough for 8191x4095)
+};
+
+static unsigned int rndbits_y;
+static unsigned int rndmask;
+
+extern SDL_Color curpal[256];
+
+// Returns the number of bits needed to represent the given value
+static int log2_ceil(uint32_t x)
+{
+    int n = 0;
+    uint32_t v = 1;
+    while(v < x)
+    {
+        n++;
+        v <<= 1;
+    }
+    return n;
+}
+
+void VH_Startup()
+{
+    int rndbits_x = log2_ceil(screenWidth);
+    rndbits_y = log2_ceil(screenHeight);
+
+    int rndbits = rndbits_x + rndbits_y;
+    if(rndbits < 17)
+        rndbits = 17;       // no problem, just a bit slower
+    else if(rndbits > 25)
+        rndbits = 25;       // fizzle fade will not fill whole screen
+
+    rndmask = rndmasks[rndbits - 17];
+}
+
+boolean FizzleFade (SDL_Surface *source, int x1, int y1,
+    unsigned width, unsigned height, unsigned frames, boolean abortable)
+{
+    unsigned x, y, frame, pixperframe;
+    int32_t  rndval, lastrndval;
+    int      first = 1;
+
+    lastrndval = 0;
+    pixperframe = width * height / frames;
+
+    IN_StartAck ();
+
+    frame = GetTimeCount();
+    byte *srcptr = VL_LockSurface(source);
+    do
+    {
+        if(abortable && IN_CheckAck ())
+        {
+            VL_UnlockSurface(source);
+            SDL_BlitSurface(source, NULL, screen, NULL);
+            SDL_Flip(screen);
+            return true;
+        }
+
+        byte *destptr = VL_LockSurface(screen);
+
+        rndval = lastrndval;
+
+        // When using double buffering, we have to copy the pixels of the last AND the current frame.
+        // Only for the first frame, there is no "last frame"
+        for(int i = first; i < 2; i++)
+        {
+            for(unsigned p = 0; p < pixperframe; p++)
+            {
+                //
+                // seperate random value into x/y pair
+                //
+
+                x = rndval >> rndbits_y;
+                y = rndval & ((1 << rndbits_y) - 1);
+
+                //
+                // advance to next random element
+                //
+
+                rndval = (rndval >> 1) ^ (rndval & 1 ? 0 : rndmask);
+
+                if(x >= width || y >= height)
+                {
+                    if(rndval == 0)     // entire sequence has been completed
+                        goto finished;
+                    p--;
+                    continue;
+                }
+
+                //
+                // copy one pixel
+                //
+
+                if(screenBits == 8)
+                {
+                    *(destptr + (y1 + y) * screen->pitch + x1 + x)
+                        = *(srcptr + (y1 + y) * source->pitch + x1 + x);
+                }
+                else
+                {
+                    byte col = *(srcptr + (y1 + y) * source->pitch + x1 + x);
+                    uint32_t fullcol = SDL_MapRGB(screen->format, curpal[col].r, curpal[col].g, curpal[col].b);
+                    memcpy(destptr + (y1 + y) * screen->pitch + (x1 + x) * screen->format->BytesPerPixel,
+                        &fullcol, screen->format->BytesPerPixel);
+                }
+
+                if(rndval == 0)		// entire sequence has been completed
+                    goto finished;
+            }
+
+            if(!i || first) lastrndval = rndval;
+        }
+
+        // If there is no double buffering, we always use the "first frame" case
+        if(usedoublebuffering) first = 0;
+
+        VL_UnlockSurface(screen);
+        SDL_Flip(screen);
+
+        frame++;
+        Delay(frame - GetTimeCount());        // don't go too fast
+    } while (1);
+
+finished:
+    VL_UnlockSurface(source);
+    VL_UnlockSurface(screen);
+    SDL_BlitSurface(source, NULL, screen, NULL);
+    SDL_Flip(screen);
+    return false;
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_vh.h b/apps/plugins/sdl/progs/wolf3d/id_vh.h
new file mode 100644
index 0000000..814e28d
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_vh.h
@@ -0,0 +1,99 @@
+// ID_VH.H
+
+
+#define WHITE			15			// graphics mode independant colors
+#define BLACK			0
+#define FIRSTCOLOR		1
+#define SECONDCOLOR		12
+#define F_WHITE			15
+#define F_BLACK			0
+#define F_FIRSTCOLOR	1
+#define F_SECONDCOLOR	12
+
+//===========================================================================
+
+#define MAXSHIFTS	1
+
+typedef struct
+{
+	int16_t width,height;
+} pictabletype;
+
+
+typedef struct
+{
+	int16_t height;
+	int16_t location[256];
+	int8_t width[256];
+} fontstruct;
+
+
+//===========================================================================
+
+
+extern	pictabletype	*pictable;
+extern	pictabletype	*picmtable;
+
+extern  byte            fontcolor,backcolor;
+extern	int             fontnumber;
+extern	int             px,py;
+
+#define SETFONTCOLOR(f,b) fontcolor=f;backcolor=b;
+
+//
+// mode independant routines
+// coordinates in pixels, rounded to best screen res
+// regions marked in double buffer
+//
+
+void VWB_DrawPropString	 (const char *string);
+
+void VWB_DrawTile8 (int x, int y, int tile);
+void VWB_DrawTile8M (int x, int y, int tile);
+void VWB_DrawTile16 (int x, int y, int tile);
+void VWB_DrawTile16M (int x, int y, int tile);
+void VWB_DrawPic (int x, int y, int chunknum);
+void VWB_DrawPicScaledCoord (int x, int y, int chunknum);
+void VWB_DrawMPic(int x, int y, int chunknum);
+void VWB_Bar (int x, int y, int width, int height, int color);
+#define VWB_BarScaledCoord VL_BarScaledCoord
+void VWB_Plot (int x, int y, int color);
+#define VWB_PlotScaledCoord VW_Plot
+void VWB_Hlin (int x1, int x2, int y, int color);
+void VWB_Vlin (int y1, int y2, int x, int color);
+#define VWB_HlinScaledCoord VW_Hlin
+#define VWB_VlinScaledCoord VW_Vlin
+
+void VH_UpdateScreen();
+#define VW_UpdateScreen VH_UpdateScreen
+
+//
+// wolfenstein EGA compatability stuff
+//
+
+
+#define VW_Shutdown		    VL_Shutdown
+#define VW_Bar			    VL_Bar
+#define VW_Plot			    VL_Plot
+#define VW_Hlin(x,z,y,c)	VL_Hlin(x,y,(z)-(x)+1,c)
+#define VW_Vlin(y,z,x,c)	VL_Vlin(x,y,(z)-(y)+1,c)
+#define VW_DrawPic		    VH_DrawPic
+#define VW_WaitVBL		    VL_WaitVBL
+#define VW_FadeIn()		    VL_FadeIn(0,255,gamepal,30);
+#define VW_FadeOut()	    VL_FadeOut(0,255,0,0,0,30);
+#define VW_ScreenToScreen	VL_ScreenToScreen
+void	VW_MeasurePropString (const char *string, word *width, word *height);
+
+#define LatchDrawChar(x,y,p) VL_LatchToScreen(latchpics[0],((p)&7)*8,((p)>>3)*8*64,8,8,x,y)
+#define LatchDrawTile(x,y,p) VL_LatchToScreen(latchpics[1],(p)*64,0,16,16,x,y)
+
+void    LatchDrawPic (unsigned x, unsigned y, unsigned picnum);
+void    LatchDrawPicScaledCoord (unsigned scx, unsigned scy, unsigned picnum);
+void    LoadLatchMem (void);
+
+void    VH_Startup();
+boolean FizzleFade (SDL_Surface *source, int x1, int y1,
+    unsigned width, unsigned height, unsigned frames, boolean abortable);
+
+#define NUMLATCHPICS	100
+extern	SDL_Surface *latchpics[NUMLATCHPICS];
diff --git a/apps/plugins/sdl/progs/wolf3d/id_vl.c b/apps/plugins/sdl/progs/wolf3d/id_vl.c
new file mode 100644
index 0000000..0152e17
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_vl.c
@@ -0,0 +1,727 @@
+// ID_VL.C
+
+#include <string.h>
+#include "wl_def.h"
+#pragma hdrstop
+
+// Uncomment the following line, if you get destination out of bounds
+// assertion errors and want to ignore them during debugging
+//#define IGNORE_BAD_DEST
+
+#ifdef IGNORE_BAD_DEST
+#undef assert
+#define assert(x) if(!(x)) return
+#define assert_ret(x) if(!(x)) return 0
+#else
+#define assert_ret(x) assert(x)
+#endif
+
+boolean fullscreen = true;
+boolean usedoublebuffering = true;
+unsigned screenWidth = 320; // SDL will scale for us
+unsigned screenHeight = 200;
+unsigned screenBits = LCD_DEPTH;      // use "best" color depth according to libSDL
+
+SDL_Surface *screen = NULL;
+unsigned screenPitch;
+
+SDL_Surface *screenBuffer = NULL;
+unsigned bufferPitch;
+
+SDL_Surface *curSurface = NULL;
+unsigned curPitch;
+
+unsigned scaleFactor;
+
+boolean	 screenfaded;
+unsigned bordercolor;
+
+SDL_Color palette1[256], palette2[256];
+SDL_Color curpal[256];
+
+
+#define CASSERT(x) extern int ASSERT_COMPILE[((x) != 0) * 2 - 1];
+#define RGB(r, g, b) {(r)*255/63, (g)*255/63, (b)*255/63, 0}
+
+SDL_Color gamepal[]={
+#ifdef SPEAR
+    #include "sodpal.inc"
+#else
+    #include "wolfpal.inc"
+#endif
+};
+
+CASSERT(lengthof(gamepal) == 256)
+
+//===========================================================================
+
+
+/*
+=======================
+=
+= VL_Shutdown
+=
+=======================
+*/
+
+void	VL_Shutdown (void)
+{
+	//VL_SetTextMode ();
+}
+
+
+/*
+=======================
+=
+= VL_SetVGAPlaneMode
+=
+=======================
+*/
+
+void	VL_SetVGAPlaneMode (void)
+{
+#ifdef SPEAR
+    SDL_WM_SetCaption("Spear of Destiny", NULL);
+#else
+    SDL_WM_SetCaption("Wolfenstein 3D", NULL);
+#endif
+
+    if(screenBits == -1)
+    {
+        const SDL_VideoInfo *vidInfo = SDL_GetVideoInfo();
+        screenBits = vidInfo->vfmt->BitsPerPixel;
+    }
+
+    screen = SDL_SetVideoMode(screenWidth, screenHeight, screenBits,
+          (usedoublebuffering ? SDL_HWSURFACE | SDL_DOUBLEBUF : 0)
+        | (screenBits == 8 ? SDL_HWPALETTE : 0)
+        | (fullscreen ? SDL_FULLSCREEN : 0));
+    if(!screen)
+    {
+        printf("Unable to set %ix%ix%i video mode: %s\n", screenWidth,
+            screenHeight, screenBits, SDL_GetError());
+        exit(1);
+    }
+    if((screen->flags & SDL_DOUBLEBUF) != SDL_DOUBLEBUF)
+        usedoublebuffering = false;
+    SDL_ShowCursor(SDL_DISABLE);
+
+    SDL_SetColors(screen, gamepal, 0, 256);
+    memcpy(curpal, gamepal, sizeof(SDL_Color) * 256);
+
+    screenBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, screenWidth,
+        screenHeight, 8, 0, 0, 0, 0);
+    if(!screenBuffer)
+    {
+        printf("Unable to create screen buffer surface: %s\n", SDL_GetError());
+        exit(1);
+    }
+    SDL_SetColors(screenBuffer, gamepal, 0, 256);
+
+    screenPitch = screen->pitch;
+    bufferPitch = screenBuffer->pitch;
+
+    curSurface = screenBuffer;
+    curPitch = bufferPitch;
+
+    scaleFactor = screenWidth/320;
+    if(screenHeight/200 < scaleFactor) scaleFactor = screenHeight/200;
+
+    pixelangle = (short *) malloc(screenWidth * sizeof(short));
+    CHECKMALLOCRESULT(pixelangle);
+    wallheight = (int *) malloc(screenWidth * sizeof(int));
+    CHECKMALLOCRESULT(wallheight);
+}
+
+/*
+=============================================================================
+
+						PALETTE OPS
+
+		To avoid snow, do a WaitVBL BEFORE calling these
+
+=============================================================================
+*/
+
+/*
+=================
+=
+= VL_ConvertPalette
+=
+=================
+*/
+
+void VL_ConvertPalette(byte *srcpal, SDL_Color *destpal, int numColors)
+{
+    for(int i=0; i<numColors; i++)
+    {
+        destpal[i].r = *srcpal++ * 255 / 63;
+        destpal[i].g = *srcpal++ * 255 / 63;
+        destpal[i].b = *srcpal++ * 255 / 63;
+    }
+}
+
+/*
+=================
+=
+= VL_FillPalette
+=
+=================
+*/
+
+void VL_FillPalette (int red, int green, int blue)
+{
+    int i;
+    SDL_Color pal[256];
+
+    for(i=0; i<256; i++)
+    {
+        pal[i].r = red;
+        pal[i].g = green;
+        pal[i].b = blue;
+    }
+
+    VL_SetPalette(pal, true);
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_SetColor
+=
+=================
+*/
+
+void VL_SetColor	(int color, int red, int green, int blue)
+{
+    SDL_Color col = { red, green, blue };
+    curpal[color] = col;
+
+    if(screenBits == 8)
+        SDL_SetPalette(screen, SDL_PHYSPAL, &col, color, 1);
+    else
+    {
+        SDL_SetPalette(curSurface, SDL_LOGPAL, &col, color, 1);
+        SDL_BlitSurface(curSurface, NULL, screen, NULL);
+        SDL_Flip(screen);
+    }
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_GetColor
+=
+=================
+*/
+
+void VL_GetColor	(int color, int *red, int *green, int *blue)
+{
+    SDL_Color *col = &curpal[color];
+    *red = col->r;
+    *green = col->g;
+    *blue = col->b;
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_SetPalette
+=
+=================
+*/
+
+void VL_SetPalette (SDL_Color *palette, bool forceupdate)
+{
+    memcpy(curpal, palette, sizeof(SDL_Color) * 256);
+
+    if(screenBits == 8)
+        SDL_SetPalette(screen, SDL_PHYSPAL, palette, 0, 256);
+    else
+    {
+        SDL_SetPalette(curSurface, SDL_LOGPAL, palette, 0, 256);
+        if(forceupdate)
+        {
+            SDL_BlitSurface(curSurface, NULL, screen, NULL);
+            SDL_Flip(screen);
+        }
+    }
+}
+
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_GetPalette
+=
+=================
+*/
+
+void VL_GetPalette (SDL_Color *palette)
+{
+    memcpy(palette, curpal, sizeof(SDL_Color) * 256);
+}
+
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_FadeOut
+=
+= Fades the current palette to the given color in the given number of steps
+=
+=================
+*/
+
+void VL_FadeOut (int start, int end, int red, int green, int blue, int steps)
+{
+	int		    i,j,orig,delta;
+	SDL_Color   *origptr, *newptr;
+
+    red = red * 255 / 63;
+    green = green * 255 / 63;
+    blue = blue * 255 / 63;
+
+    // rockbox
+    steps = steps / 2;
+
+	VL_WaitVBL(1);
+	VL_GetPalette(palette1);
+	memcpy(palette2, palette1, sizeof(SDL_Color) * 256);
+
+//
+// fade through intermediate frames
+//
+	for (i=0;i<steps;i++)
+	{
+		origptr = &palette1[start];
+		newptr = &palette2[start];
+		for (j=start;j<=end;j++)
+		{
+			orig = origptr->r;
+			delta = red-orig;
+			newptr->r = orig + delta * i / steps;
+			orig = origptr->g;
+			delta = green-orig;
+			newptr->g = orig + delta * i / steps;
+			orig = origptr->b;
+			delta = blue-orig;
+			newptr->b = orig + delta * i / steps;
+			origptr++;
+			newptr++;
+		}
+
+		if(!usedoublebuffering || screenBits == 8) VL_WaitVBL(1);
+		VL_SetPalette (palette2, true);
+                rb->yield();
+	}
+
+//
+// final color
+//
+	VL_FillPalette (red,green,blue);
+
+	screenfaded = true;
+}
+
+
+/*
+=================
+=
+= VL_FadeIn
+=
+=================
+*/
+
+void VL_FadeIn (int start, int end, SDL_Color *palette, int steps)
+{
+	int i,j,delta;
+
+	VL_WaitVBL(1);
+	VL_GetPalette(palette1);
+	memcpy(palette2, palette1, sizeof(SDL_Color) * 256);
+
+        steps = steps / 2;
+
+//
+// fade through intermediate frames
+//
+	for (i=0;i<steps;i++)
+	{
+		for (j=start;j<=end;j++)
+		{
+			delta = palette[j].r-palette1[j].r;
+			palette2[j].r = palette1[j].r + delta * i / steps;
+			delta = palette[j].g-palette1[j].g;
+			palette2[j].g = palette1[j].g + delta * i / steps;
+			delta = palette[j].b-palette1[j].b;
+			palette2[j].b = palette1[j].b + delta * i / steps;
+		}
+
+		if(!usedoublebuffering || screenBits == 8) VL_WaitVBL(1);
+		VL_SetPalette(palette2, true);
+	}
+
+//
+// final color
+//
+	VL_SetPalette (palette, true);
+	screenfaded = false;
+}
+
+/*
+=============================================================================
+
+							PIXEL OPS
+
+=============================================================================
+*/
+
+byte *VL_LockSurface(SDL_Surface *surface)
+{
+    if(SDL_MUSTLOCK(surface))
+    {
+        if(SDL_LockSurface(surface) < 0)
+            return NULL;
+    }
+    return (byte *) surface->pixels;
+}
+
+void VL_UnlockSurface(SDL_Surface *surface)
+{
+    if(SDL_MUSTLOCK(surface))
+    {
+        SDL_UnlockSurface(surface);
+    }
+}
+
+/*
+=================
+=
+= VL_Plot
+=
+=================
+*/
+
+void VL_Plot (int x, int y, int color)
+{
+    assert(x >= 0 && (unsigned) x < screenWidth
+            && y >= 0 && (unsigned) y < screenHeight
+            && "VL_Plot: Pixel out of bounds!");
+
+    VL_LockSurface(curSurface);
+	((byte *) curSurface->pixels)[y * curPitch + x] = color;
+    VL_UnlockSurface(curSurface);
+}
+
+/*
+=================
+=
+= VL_GetPixel
+=
+=================
+*/
+
+byte VL_GetPixel (int x, int y)
+{
+    assert_ret(x >= 0 && (unsigned) x < screenWidth
+            && y >= 0 && (unsigned) y < screenHeight
+            && "VL_GetPixel: Pixel out of bounds!");
+
+    VL_LockSurface(curSurface);
+	byte col = ((byte *) curSurface->pixels)[y * curPitch + x];
+    VL_UnlockSurface(curSurface);
+	return col;
+}
+
+
+/*
+=================
+=
+= VL_Hlin
+=
+=================
+*/
+
+void VL_Hlin (unsigned x, unsigned y, unsigned width, int color)
+{
+    assert(x >= 0 && x + width <= screenWidth
+            && y >= 0 && y < screenHeight
+            && "VL_Hlin: Destination rectangle out of bounds!");
+
+    VL_LockSurface(curSurface);
+    Uint8 *dest = ((byte *) curSurface->pixels) + y * curPitch + x;
+    memset(dest, color, width);
+    VL_UnlockSurface(curSurface);
+}
+
+
+/*
+=================
+=
+= VL_Vlin
+=
+=================
+*/
+
+void VL_Vlin (int x, int y, int height, int color)
+{
+	assert(x >= 0 && (unsigned) x < screenWidth
+			&& y >= 0 && (unsigned) y + height <= screenHeight
+			&& "VL_Vlin: Destination rectangle out of bounds!");
+
+	VL_LockSurface(curSurface);
+	Uint8 *dest = ((byte *) curSurface->pixels) + y * curPitch + x;
+
+	while (height--)
+	{
+		*dest = color;
+		dest += curPitch;
+	}
+	VL_UnlockSurface(curSurface);
+}
+
+
+/*
+=================
+=
+= VL_Bar
+=
+=================
+*/
+
+void VL_BarScaledCoord (int scx, int scy, int scwidth, int scheight, int color)
+{
+	assert(scx >= 0 && (unsigned) scx + scwidth <= screenWidth
+			&& scy >= 0 && (unsigned) scy + scheight <= screenHeight
+			&& "VL_BarScaledCoord: Destination rectangle out of bounds!");
+
+	VL_LockSurface(curSurface);
+	Uint8 *dest = ((byte *) curSurface->pixels) + scy * curPitch + scx;
+
+	while (scheight--)
+	{
+		memset(dest, color, scwidth);
+		dest += curPitch;
+	}
+	VL_UnlockSurface(curSurface);
+}
+
+/*
+============================================================================
+
+							MEMORY OPS
+
+============================================================================
+*/
+
+/*
+=================
+=
+= VL_MemToLatch
+=
+=================
+*/
+
+void VL_MemToLatch(byte *source, int width, int height,
+    SDL_Surface *destSurface, int x, int y)
+{
+    assert(x >= 0 && (unsigned) x + width <= screenWidth
+            && y >= 0 && (unsigned) y + height <= screenHeight
+            && "VL_MemToLatch: Destination rectangle out of bounds!");
+
+    VL_LockSurface(destSurface);
+    int pitch = destSurface->pitch;
+    byte *dest = (byte *) destSurface->pixels + y * pitch + x;
+    for(int ysrc = 0; ysrc < height; ysrc++)
+    {
+        for(int xsrc = 0; xsrc < width; xsrc++)
+        {
+            dest[ysrc * pitch + xsrc] = source[(ysrc * (width >> 2) + (xsrc >> 2))
+                + (xsrc & 3) * (width >> 2) * height];
+        }
+    }
+    VL_UnlockSurface(destSurface);
+}
+
+//===========================================================================
+
+
+/*
+=================
+=
+= VL_MemToScreenScaledCoord
+=
+= Draws a block of data to the screen with scaling according to scaleFactor.
+=
+=================
+*/
+
+void VL_MemToScreenScaledCoord (byte *source, int width, int height, int destx, int desty)
+{
+    assert(destx >= 0 && destx + width * scaleFactor <= screenWidth
+            && desty >= 0 && desty + height * scaleFactor <= screenHeight
+            && "VL_MemToScreenScaledCoord: Destination rectangle out of bounds!");
+
+    VL_LockSurface(curSurface);
+    byte *vbuf = (byte *) curSurface->pixels;
+    for(int j=0,scj=0; j<height; j++, scj+=scaleFactor)
+    {
+        for(int i=0,sci=0; i<width; i++, sci+=scaleFactor)
+        {
+            byte col = source[(j*(width>>2)+(i>>2))+(i&3)*(width>>2)*height];
+            for(unsigned m=0; m<scaleFactor; m++)
+            {
+                for(unsigned n=0; n<scaleFactor; n++)
+                {
+                    vbuf[(scj+m+desty)*curPitch+sci+n+destx] = col;
+                }
+            }
+        }
+    }
+    VL_UnlockSurface(curSurface);
+}
+
+/*
+=================
+=
+= VL_MemToScreenScaledCoord
+=
+= Draws a part of a block of data to the screen.
+= The block has the size origwidth*origheight.
+= The part at (srcx, srcy) has the size width*height
+= and will be painted to (destx, desty) with scaling according to scaleFactor.
+=
+=================
+*/
+
+void VL_MemToScreenScaledCoord_ex (byte *source, int origwidth, int origheight, int srcx, int srcy,
+                                   int destx, int desty, int width, int height)
+{
+    assert(destx >= 0 && destx + width * scaleFactor <= screenWidth
+            && desty >= 0 && desty + height * scaleFactor <= screenHeight
+            && "VL_MemToScreenScaledCoord: Destination rectangle out of bounds!");
+
+    VL_LockSurface(curSurface);
+    byte *vbuf = (byte *) curSurface->pixels;
+    for(int j=0,scj=0; j<height; j++, scj+=scaleFactor)
+    {
+        for(int i=0,sci=0; i<width; i++, sci+=scaleFactor)
+        {
+            byte col = source[((j+srcy)*(origwidth>>2)+((i+srcx)>>2))+((i+srcx)&3)*(origwidth>>2)*origheight];
+            for(unsigned m=0; m<scaleFactor; m++)
+            {
+                for(unsigned n=0; n<scaleFactor; n++)
+                {
+                    vbuf[(scj+m+desty)*curPitch+sci+n+destx] = col;
+                }
+            }
+        }
+    }
+    VL_UnlockSurface(curSurface);
+}
+
+//==========================================================================
+
+/*
+=================
+=
+= VL_LatchToScreen
+=
+=================
+*/
+
+void VL_LatchToScreenScaledCoord(SDL_Surface *source, int xsrc, int ysrc,
+    int width, int height, int scxdest, int scydest)
+{
+	assert(scxdest >= 0 && scxdest + width * scaleFactor <= screenWidth
+			&& scydest >= 0 && scydest + height * scaleFactor <= screenHeight
+			&& "VL_LatchToScreenScaledCoord: Destination rectangle out of bounds!");
+
+	if(scaleFactor == 1)
+    {
+        // HACK: If screenBits is not 8 and the screen is faded out, the
+        //       result will be black when using SDL_BlitSurface. The reason
+        //       is that the logical palette needed for the transformation
+        //       to the screen color depth is not equal to the logical
+        //       palette of the latch (the latch is not faded). Therefore,
+        //       SDL tries to map the colors...
+        //       The result: All colors are mapped to black.
+        //       So, we do the blit on our own...
+        if(screenBits != 8)
+        {
+            VL_LockSurface(source);
+            byte *src = (byte *) source->pixels;
+            unsigned srcPitch = source->pitch;
+
+            VL_LockSurface(curSurface);
+            byte *vbuf = (byte *) curSurface->pixels;
+            for(int j=0,scj=0; j<height; j++, scj++)
+            {
+                for(int i=0,sci=0; i<width; i++, sci++)
+                {
+                    byte col = src[(ysrc + j)*srcPitch + xsrc + i];
+                    vbuf[(scydest+scj)*curPitch+scxdest+sci] = col;
+                }
+            }
+            VL_UnlockSurface(curSurface);
+            VL_UnlockSurface(source);
+        }
+        else
+        {
+            SDL_Rect srcrect = { xsrc, ysrc, width, height };
+            SDL_Rect destrect = { scxdest, scydest, 0, 0 }; // width and height are ignored
+            SDL_BlitSurface(source, &srcrect, curSurface, &destrect);
+        }
+    }
+    else
+    {
+        VL_LockSurface(source);
+        byte *src = (byte *) source->pixels;
+        unsigned srcPitch = source->pitch;
+
+        VL_LockSurface(curSurface);
+        byte *vbuf = (byte *) curSurface->pixels;
+        for(int j=0,scj=0; j<height; j++, scj+=scaleFactor)
+        {
+            for(int i=0,sci=0; i<width; i++, sci+=scaleFactor)
+            {
+                byte col = src[(ysrc + j)*srcPitch + xsrc + i];
+                for(unsigned m=0; m<scaleFactor; m++)
+                {
+                    for(unsigned n=0; n<scaleFactor; n++)
+                    {
+                        vbuf[(scydest+scj+m)*curPitch+scxdest+sci+n] = col;
+                    }
+                }
+            }
+        }
+        VL_UnlockSurface(curSurface);
+        VL_UnlockSurface(source);
+    }
+}
+
+//===========================================================================
+
+/*
+=================
+=
+= VL_ScreenToScreen
+=
+=================
+*/
+
+void VL_ScreenToScreen (SDL_Surface *source, SDL_Surface *dest)
+{
+    SDL_BlitSurface(source, NULL, dest, NULL);
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/id_vl.h b/apps/plugins/sdl/progs/wolf3d/id_vl.h
new file mode 100644
index 0000000..d4a15f4
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/id_vl.h
@@ -0,0 +1,101 @@
+// ID_VL.H
+
+// wolf compatability
+
+void Quit (const char *error,...);
+
+//===========================================================================
+
+#define CHARWIDTH		2
+#define TILEWIDTH		4
+
+//===========================================================================
+
+extern SDL_Surface *screen, *screenBuffer, *curSurface;
+
+extern  boolean  fullscreen, usedoublebuffering;
+extern  unsigned screenWidth, screenHeight, screenBits, screenPitch, bufferPitch, curPitch;
+extern  unsigned scaleFactor;
+
+extern	boolean  screenfaded;
+extern	unsigned bordercolor;
+
+extern SDL_Color gamepal[256];
+
+//===========================================================================
+
+//
+// VGA hardware routines
+//
+
+#define VL_WaitVBL(a) SDL_Delay((a)*8)
+
+void VL_SetVGAPlaneMode (void);
+void VL_SetTextMode (void);
+void VL_Shutdown (void);
+
+void VL_ConvertPalette(byte *srcpal, SDL_Color *destpal, int numColors);
+void VL_FillPalette (int red, int green, int blue);
+void VL_SetColor    (int color, int red, int green, int blue);
+void VL_GetColor    (int color, int *red, int *green, int *blue);
+void VL_SetPalette  (SDL_Color *palette, bool forceupdate);
+void VL_GetPalette  (SDL_Color *palette);
+void VL_FadeOut     (int start, int end, int red, int green, int blue, int steps);
+void VL_FadeIn      (int start, int end, SDL_Color *palette, int steps);
+
+byte *VL_LockSurface(SDL_Surface *surface);
+void VL_UnlockSurface(SDL_Surface *surface);
+
+#define LOCK() VL_LockSurface(curSurface)
+#define UNLOCK() VL_UnlockSurface(curSurface)
+
+byte VL_GetPixel        (int x, int y);
+void VL_Plot            (int x, int y, int color);
+void VL_Hlin            (unsigned x, unsigned y, unsigned width, int color);
+void VL_Vlin            (int x, int y, int height, int color);
+void VL_BarScaledCoord  (int scx, int scy, int scwidth, int scheight, int color);
+inline void VL_Bar      (int x, int y, int width, int height, int color)
+{
+    VL_BarScaledCoord(scaleFactor*x, scaleFactor*y,
+        scaleFactor*width, scaleFactor*height, color);
+}
+inline void VL_ClearScreen(int color)
+{
+    SDL_FillRect(curSurface, NULL, color);
+}
+
+void VL_MungePic                (byte *source, unsigned width, unsigned height);
+void VL_DrawPicBare             (int x, int y, byte *pic, int width, int height);
+void VL_MemToLatch              (byte *source, int width, int height,
+                                    SDL_Surface *destSurface, int x, int y);
+void VL_ScreenToScreen          (SDL_Surface *source, SDL_Surface *dest);
+void VL_MemToScreenScaledCoord  (byte *source, int width, int height, int scx, int scy);
+void VL_MemToScreenScaledCoord_ex  (byte *source, int origwidth, int origheight, int srcx, int srcy,
+                                    int destx, int desty, int width, int height);
+
+inline void VL_MemToScreen (byte *source, int width, int height, int x, int y)
+{
+    VL_MemToScreenScaledCoord(source, width, height,
+        scaleFactor*x, scaleFactor*y);
+}
+
+void VL_MaskedToScreen (byte *source, int width, int height, int x, int y);
+
+void VL_LatchToScreenScaledCoord (SDL_Surface *source, int xsrc, int ysrc,
+    int width, int height, int scxdest, int scydest);
+
+inline void VL_LatchToScreen (SDL_Surface *source, int xsrc, int ysrc,
+    int width, int height, int xdest, int ydest)
+{
+    VL_LatchToScreenScaledCoord(source,xsrc,ysrc,width,height,
+        scaleFactor*xdest,scaleFactor*ydest);
+}
+inline void VL_LatchToScreenScaledCoord_ez (SDL_Surface *source, int scx, int scy)
+{
+    VL_LatchToScreenScaledCoord(source,0,0,source->w,source->h,scx,scy);
+}
+inline void VL_LatchToScreen_ez (SDL_Surface *source, int x, int y)
+{
+    VL_LatchToScreenScaledCoord(source,0,0,source->w,source->h,
+        scaleFactor*x,scaleFactor*y);
+}
diff --git a/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c b/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c
new file mode 100644
index 0000000..366616d
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c
@@ -0,0 +1,378 @@
+#ifdef _WIN32
+
+/*
+    SDL_main.c, placed in the public domain by Sam Lantinga  4/13/98
+
+    Modified to write stdout/stderr to a message box at shutdown by Ripper  2007-12-27
+
+    The WinMain function -- calls your program's main() function
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#ifdef _WIN32_WCE
+# define DIR_SEPERATOR TEXT("\\")
+# undef _getcwd
+# define _getcwd(str,len)	wcscpy(str,TEXT(""))
+# define setbuf(f,b)
+# define setvbuf(w,x,y,z)
+# define fopen		_wfopen
+# define freopen	_wfreopen
+# define remove(x)	DeleteFile(x)
+#else
+# define DIR_SEPERATOR TEXT("/")
+# include <direct.h>
+#endif
+
+/* Include the SDL main definition header */
+#include "SDL.h"
+#include "SDL_main.h"
+
+#ifdef main
+# ifndef _WIN32_WCE_EMULATION
+#  undef main
+# endif /* _WIN32_WCE_EMULATION */
+#endif /* main */
+
+/* The standard output files */
+#define STDOUT_FILE	TEXT("stdout.txt")
+#define STDERR_FILE	TEXT("stderr.txt")
+
+#ifndef NO_STDIO_REDIRECT
+# ifdef _WIN32_WCE
+  static wchar_t stdoutPath[MAX_PATH];
+  static wchar_t stderrPath[MAX_PATH];
+# else
+  static char stdoutPath[MAX_PATH];
+  static char stderrPath[MAX_PATH];
+# endif
+#endif
+
+#if defined(_WIN32_WCE) && _WIN32_WCE < 300
+/* seems to be undefined in Win CE although in online help */
+#define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
+#endif /* _WIN32_WCE < 300 */
+
+/* Parse a command line buffer into arguments */
+static int ParseCommandLine(char *cmdline, char **argv)
+{
+	char *bufp;
+	int argc;
+
+	argc = 0;
+	for ( bufp = cmdline; *bufp; ) {
+		/* Skip leading whitespace */
+		while ( isspace(*bufp) ) {
+			++bufp;
+		}
+		/* Skip over argument */
+		if ( *bufp == '"' ) {
+			++bufp;
+			if ( *bufp ) {
+				if ( argv ) {
+					argv[argc] = bufp;
+				}
+				++argc;
+			}
+			/* Skip over word */
+			while ( *bufp && (*bufp != '"') ) {
+				++bufp;
+			}
+		} else {
+			if ( *bufp ) {
+				if ( argv ) {
+					argv[argc] = bufp;
+				}
+				++argc;
+			}
+			/* Skip over word */
+			while ( *bufp && ! isspace(*bufp) ) {
+				++bufp;
+			}
+		}
+		if ( *bufp ) {
+			if ( argv ) {
+				*bufp = '\0';
+			}
+			++bufp;
+		}
+	}
+	if ( argv ) {
+		argv[argc] = NULL;
+	}
+	return(argc);
+}
+
+/* Show an error message */
+static void ShowError(const char *title, const char *message)
+{
+/* If USE_MESSAGEBOX is defined, you need to link with user32.lib */
+#ifdef USE_MESSAGEBOX
+	MessageBox(NULL, message, title, MB_ICONEXCLAMATION|MB_OK);
+#else
+	fprintf(stderr, "%s: %s\n", title, message);
+#endif
+}
+
+/* Pop up an out of memory message, returns to Windows */
+static bool OutOfMemory(void)
+{
+	ShowError("Fatal Error", "Out of memory - aborting");
+	return FALSE;
+}
+
+/* SDL_Quit() shouldn't be used with atexit() directly because
+   calling conventions may differ... */
+static void cleanup(void)
+{
+	SDL_Quit();
+}
+
+/* Remove the output files if there was no output written */
+static void cleanup_output(void)
+{
+#if 1
+#ifndef NO_STDIO_REDIRECT
+	FILE *file;
+#endif
+#endif
+
+	/* Flush the output in case anything is queued */
+	fclose(stdout);
+	fclose(stderr);
+
+#if 1
+#ifndef NO_STDIO_REDIRECT
+	/* See if the files have any output in them */
+	if ( stdoutPath[0] ) {
+		file = fopen(stdoutPath, TEXT("r"));
+		if ( file ) {
+            char buf[16384];
+            size_t readbytes = fread(buf, 1, 16383, file);
+            fclose(file);
+
+            if(readbytes != 0)
+            {
+                buf[readbytes] = 0;     // cut after last byte (<=16383)
+                MessageBox(NULL, buf, "Wolf4SDL", MB_OK);
+            }
+            else
+                remove(stdoutPath);     // remove empty file
+		}
+	}
+	if ( stderrPath[0] ) {
+		file = fopen(stderrPath, TEXT("rb"));
+		if ( file ) {
+            char buf[16384];
+            size_t readbytes = fread(buf, 1, 16383, file);
+            fclose(file);
+
+            if(readbytes != 0)
+            {
+                buf[readbytes] = 0;     // cut after last byte (<=16383)
+                MessageBox(NULL, buf, "Wolf4SDL", MB_OK);
+            }
+            else
+                remove(stderrPath);     // remove empty file
+		}
+	}
+#endif
+#endif
+}
+
+//#if defined(_MSC_VER) && !defined(_WIN32_WCE)
+///* The VC++ compiler needs main defined */
+//#define console_main main
+//#endif
+
+/* This is where execution begins [console apps] */
+int console_main(int argc, char *argv[])
+{
+	size_t n;
+	char *bufp, *appname;
+	int status;
+
+	/* Get the class name from argv[0] */
+	appname = argv[0];
+	if ( (bufp=SDL_strrchr(argv[0], '\\')) != NULL ) {
+		appname = bufp+1;
+	} else
+	if ( (bufp=SDL_strrchr(argv[0], '/')) != NULL ) {
+		appname = bufp+1;
+	}
+
+	if ( (bufp=SDL_strrchr(appname, '.')) == NULL )
+		n = SDL_strlen(appname);
+	else
+		n = (bufp-appname);
+
+	bufp = SDL_stack_alloc(char, n+1);
+	if ( bufp == NULL ) {
+		return OutOfMemory();
+	}
+	SDL_strlcpy(bufp, appname, n+1);
+	appname = bufp;
+
+	/* Load SDL dynamic link library */
+	if ( SDL_Init(SDL_INIT_NOPARACHUTE) < 0 ) {
+		ShowError("WinMain() error", SDL_GetError());
+		return(FALSE);
+	}
+	atexit(cleanup_output);
+	atexit(cleanup);
+
+	/* Sam:
+	   We still need to pass in the application handle so that
+	   DirectInput will initialize properly when SDL_RegisterApp()
+	   is called later in the video initialization.
+	 */
+	SDL_SetModuleHandle(GetModuleHandle(NULL));
+
+	/* Run the application main() code */
+	status = SDL_main(argc, argv);
+
+	/* Exit cleanly, calling atexit() functions */
+	exit(status);
+
+	/* Hush little compiler, don't you cry... */
+	return 0;
+}
+
+/* This is where execution begins [windowed apps] */
+#ifdef _WIN32_WCE
+int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw)
+#else
+int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
+#endif
+{
+	HINSTANCE handle;
+	char **argv;
+	int argc;
+	char *cmdline;
+#ifdef _WIN32_WCE
+	wchar_t *bufp;
+	int nLen;
+#else
+	char *bufp;
+	size_t nLen;
+#endif
+#ifndef NO_STDIO_REDIRECT
+	DWORD pathlen;
+#ifdef _WIN32_WCE
+	wchar_t path[MAX_PATH];
+#else
+	char path[MAX_PATH];
+#endif
+	FILE *newfp;
+#endif
+
+	/* Start up DDHELP.EXE before opening any files, so DDHELP doesn't
+	   keep them open.  This is a hack.. hopefully it will be fixed
+	   someday.  DDHELP.EXE starts up the first time DDRAW.DLL is loaded.
+	 */
+	handle = LoadLibrary(TEXT("DDRAW.DLL"));
+	if ( handle != NULL ) {
+		FreeLibrary(handle);
+	}
+
+#ifndef NO_STDIO_REDIRECT
+	pathlen = GetModuleFileName(NULL, path, SDL_arraysize(path));
+	while ( pathlen > 0 && path[pathlen] != '\\' ) {
+		--pathlen;
+	}
+	path[pathlen] = '\0';
+
+#ifdef _WIN32_WCE
+	wcsncpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
+	wcsncat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
+#else
+	SDL_strlcpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
+	SDL_strlcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
+#endif
+
+	/* Redirect standard input and standard output */
+	newfp = freopen(stdoutPath, TEXT("w"), stdout);
+
+#ifndef _WIN32_WCE
+	if ( newfp == NULL ) {	/* This happens on NT */
+#if !defined(stdout)
+		stdout = fopen(stdoutPath, TEXT("w"));
+#else
+		newfp = fopen(stdoutPath, TEXT("w"));
+		if ( newfp ) {
+			*stdout = *newfp;
+		}
+#endif
+	}
+#endif /* _WIN32_WCE */
+
+#ifdef _WIN32_WCE
+	wcsncpy( stderrPath, path, SDL_arraysize(stdoutPath) );
+	wcsncat( stderrPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
+#else
+	SDL_strlcpy( stderrPath, path, SDL_arraysize(stderrPath) );
+	SDL_strlcat( stderrPath, DIR_SEPERATOR STDERR_FILE, SDL_arraysize(stderrPath) );
+#endif
+
+	newfp = freopen(stderrPath, TEXT("w"), stderr);
+#ifndef _WIN32_WCE
+	if ( newfp == NULL ) {	/* This happens on NT */
+#if !defined(stderr)
+		stderr = fopen(stderrPath, TEXT("w"));
+#else
+		newfp = fopen(stderrPath, TEXT("w"));
+		if ( newfp ) {
+			*stderr = *newfp;
+		}
+#endif
+	}
+#endif /* _WIN32_WCE */
+
+	setvbuf(stdout, NULL, _IOLBF, BUFSIZ);	/* Line buffered */
+	setbuf(stderr, NULL);			/* No buffering */
+#endif /* !NO_STDIO_REDIRECT */
+
+#ifdef _WIN32_WCE
+	nLen = wcslen(szCmdLine)+128+1;
+	bufp = SDL_stack_alloc(wchar_t, nLen*2);
+	wcscpy (bufp, TEXT("\""));
+	GetModuleFileName(NULL, bufp+1, 128-3);
+	wcscpy (bufp+wcslen(bufp), TEXT("\" "));
+	wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp));
+	nLen = wcslen(bufp)+1;
+	cmdline = SDL_stack_alloc(char, nLen);
+	if ( cmdline == NULL ) {
+		return OutOfMemory();
+	}
+	WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL);
+#else
+	/* Grab the command line */
+	bufp = GetCommandLine();
+	nLen = SDL_strlen(bufp)+1;
+	cmdline = SDL_stack_alloc(char, nLen);
+	if ( cmdline == NULL ) {
+		return OutOfMemory();
+	}
+	SDL_strlcpy(cmdline, bufp, nLen);
+#endif
+
+	/* Parse it into argv and argc */
+	argc = ParseCommandLine(cmdline, NULL);
+	argv = SDL_stack_alloc(char*, argc+1);
+	if ( argv == NULL ) {
+		return OutOfMemory();
+	}
+	ParseCommandLine(cmdline, argv);
+
+	/* Run the main program (after a little SDL initialization) */
+	console_main(argc, argv);
+
+	/* Hush little compiler, don't you cry... */
+	return 0;
+}
+
+#endif  // _WIN32
diff --git a/apps/plugins/sdl/progs/wolf3d/signon.c b/apps/plugins/sdl/progs/wolf3d/signon.c
new file mode 100644
index 0000000..1601735
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/signon.c
@@ -0,0 +1,8007 @@
+#include "wl_def.h"
+
+#ifndef SPEAR
+byte signon[] = {
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,
+	0x04,0x22,0x24,0x21,0x22,0x23,0x21,0x22,0x04,0x25,0x25,0x22,0x22,0x24,0x22,0x22,
+	0x26,0x22,0x25,0x22,0x21,0x25,0x23,0x21,0x22,0x22,0x22,0x21,0x25,0x22,0x25,0x24,
+	0x25,0x22,0x21,0x22,0x22,0x21,0x24,0x23,0x04,0x28,0x29,0x28,0x29,0x23,0x26,0x25,
+	0x26,0x22,0x04,0x23,0x23,0x26,0x24,0x23,0x25,0x25,0x23,0x23,0x04,0x23,0x25,0x04,
+	0x28,0x25,0x23,0x24,0x22,0x25,0x28,0x28,0x28,0x23,0x23,0x04,0x23,0x22,0x23,0x25,
+	0x23,0x25,0x25,0x04,0x22,0x22,0x21,0x23,0x23,0x25,0x25,0x22,0x23,0x25,0x26,0x23,
+	0x29,0x29,0x22,0x24,0x23,0x22,0x04,0x25,0x22,0x04,0x23,0x23,0x22,0x23,0x25,0x24,
+	0x23,0x23,0x23,0x25,0x24,0x28,0x23,0x22,0x23,0x23,0x22,0x24,0x25,0x22,0x04,0x22,
+	0x22,0x24,0x04,0x24,0x24,0x24,0x24,0x25,0x24,0x28,0x2A,0x23,0x22,0x26,0x22,0x26,
+	0x25,0x22,0x22,0x26,0x28,0x26,0x28,0x28,0x24,0x24,0x25,0x22,0x24,0x25,0x22,0x25,
+	0x25,0x25,0x26,0x22,0x25,0x24,0x24,0x24,0x25,0x24,0x25,0x22,0x04,0x24,0x25,0x25,
+	0x26,0x24,0x22,0x26,0x26,0x24,0x24,0x23,0x04,0x22,0x25,0x28,0x24,0x26,0x22,0x26,
+	0x25,0x26,0x2A,0x28,0x23,0x25,0x25,0x25,0x23,0x28,0x25,0x25,0x04,0x25,0x24,0x23,
+	0x25,0x23,0x28,0x26,0x25,0x20,0x20,0x25,0x20,0x22,0x22,0x25,0x22,0x28,0x25,0x25,
+	0x28,0x04,0x28,0x25,0x24,0x24,0x24,0x24,0x24,0x25,0x25,0x28,0x28,0x25,0x25,0x26,
+	0x23,0x04,0x25,0x04,0x24,0x25,0x28,0x28,0x23,0x26,0x25,0x26,0x25,0x26,0x25,0x28,
+	0x28,0x24,0x26,0x28,0x20,0x20,0x26,0x20,0x23,0x04,0x26,0x25,0x24,0x26,0x28,0x28,
+	0x28,0x24,0x28,0x28,0x25,0x25,0x26,0x26,0x04,0x25,0x26,0x26,0x04,0x26,0x22,0x25,
+	0x25,0x22,0x28,0x24,0x28,0x25,0x26,0x26,0x26,0x25,0x25,0x28,0x28,0x26,0x28,0x28,
+	0x28,0x26,0x28,0x24,0x28,0x04,0x28,0x26,0x25,0x26,0x26,0x26,0x25,0x28,0x26,0x29,
+	0x25,0x22,0x25,0x23,0x25,0x25,0x22,0x22,0x04,0x22,0x23,0x25,0x25,0x23,0x22,0x22,
+	0x22,0x22,0x21,0x04,0x24,0x04,0x24,0x23,0x25,0x22,0x22,0x21,0x23,0x23,0x04,0x23,
+	0x24,0x23,0x25,0x25,0x25,0x22,0x04,0x25,0x23,0x25,0x25,0x25,0x25,0x25,0x24,0x25,
+	0x24,0x23,0x25,0x24,0x22,0x25,0x25,0x24,0x22,0x23,0x23,0x23,0x25,0x26,0x25,0x25,
+	0x24,0x24,0x25,0x24,0x24,0x21,0x25,0x26,0x04,0x22,0x25,0x25,0x23,0x22,0x25,0x26,
+	0x04,0x23,0x23,0x23,0x26,0x22,0x25,0x25,0x26,0x24,0x25,0x26,0x24,0x04,0x04,0x22,
+	0x25,0x24,0x04,0x25,0x28,0x25,0x26,0x26,0x04,0x28,0x23,0x25,0x22,0x22,0x26,0x23,
+	0x25,0x04,0x04,0x22,0x25,0x22,0x25,0x23,0x22,0x23,0x24,0x22,0x24,0x23,0x04,0x04,
+	0x28,0x28,0x21,0x24,0x25,0x24,0x28,0x23,0x28,0x28,0x25,0x25,0x23,0x23,0x24,0x25,
+	0x24,0x22,0x25,0x04,0x28,0x04,0x04,0x26,0x26,0x26,0x26,0x26,0x25,0x28,0x24,0x25,
+	0x28,0x24,0x25,0x04,0x24,0x25,0x24,0x24,0x24,0x24,0x24,0x04,0x24,0x22,0x24,0x23,
+	0x25,0x25,0x25,0x04,0x26,0x25,0x25,0x26,0x26,0x25,0x26,0x25,0x25,0x26,0x26,0x26,
+	0x04,0x28,0x28,0x26,0x25,0x28,0x28,0x28,0x28,0x28,0x24,0x25,0x23,0x26,0x25,0x25,
+	0x26,0x23,0x20,0x20,0x20,0x22,0x20,0x20,0x20,0x26,0x23,0x28,0x26,0x25,0x28,0x28,
+	0x26,0x26,0x28,0x04,0x28,0x28,0x26,0x26,0x24,0x26,0x25,0x28,0x27,0x04,0x24,0x26,
+	0x28,0x04,0x26,0x26,0x22,0x28,0x25,0x28,0x25,0x25,0x26,0x04,0x24,0x26,0x26,0x23,
+	0x26,0x23,0x26,0x25,0x24,0x25,0x22,0x25,0x26,0x25,0x24,0x25,0x22,0x25,0x26,0x25,
+	0x04,0x26,0x26,0x04,0x25,0x28,0x24,0x28,0x25,0x26,0x24,0x25,0x04,0x24,0x26,0x26,
+	0x28,0x25,0x23,0x26,0x28,0x28,0x25,0x04,0x28,0x23,0x26,0x28,0x04,0x24,0x25,0x26,
+	0x26,0x25,0x28,0x28,0x28,0x25,0x24,0x25,0x28,0x26,0x26,0x04,0x24,0x26,0x25,0x29,
+	0x22,0x22,0x25,0x26,0x25,0x22,0x26,0x21,0x25,0x25,0x22,0x22,0x23,0x25,0x24,0x24,
+	0x21,0x23,0x22,0x24,0x21,0x22,0x26,0x22,0x22,0x22,0x24,0x24,0x22,0x04,0x28,0x25,
+	0x25,0x23,0x28,0x04,0x23,0x25,0x25,0x25,0x25,0x23,0x23,0x22,0x22,0x04,0x25,0x25,
+	0x25,0x22,0x22,0x23,0x23,0x23,0x22,0x24,0x24,0x25,0x25,0x25,0x23,0x24,0x25,0x23,
+	0x22,0x23,0x24,0x24,0x23,0x22,0x25,0x24,0x26,0x25,0x25,0x28,0x26,0x25,0x25,0x22,
+	0x26,0x25,0x25,0x26,0x25,0x25,0x04,0x25,0x04,0x26,0x29,0x29,0x29,0x28,0x04,0x28,
+	0x25,0x26,0x26,0x28,0x25,0x23,0x26,0x04,0x28,0x28,0x28,0x28,0x25,0x25,0x23,0x23,
+	0x25,0x25,0x26,0x25,0x23,0x24,0x25,0x04,0x25,0x26,0x26,0x04,0x04,0x25,0x25,0x25,
+	0x27,0x28,0x22,0x24,0x04,0x28,0x04,0x26,0x26,0x28,0x23,0x22,0x23,0x24,0x28,0x25,
+	0x24,0x24,0x25,0x28,0x24,0x28,0x24,0x22,0x26,0x28,0x28,0x04,0x26,0x22,0x24,0x25,
+	0x25,0x25,0x28,0x25,0x26,0x25,0x26,0x26,0x25,0x24,0x26,0x22,0x25,0x26,0x26,0x26,
+	0x25,0x04,0x25,0x25,0x22,0x24,0x25,0x04,0x26,0x24,0x28,0x26,0x25,0x25,0x28,0x04,
+	0x28,0x26,0x29,0x28,0x29,0x28,0x27,0x25,0x26,0x25,0x22,0x22,0x04,0x24,0x26,0x23,
+	0x20,0x20,0x20,0x22,0x20,0x20,0x22,0x25,0x25,0x26,0x28,0x25,0x25,0x28,0x24,0x25,
+	0x04,0x28,0x28,0x04,0x26,0x04,0x28,0x25,0x04,0x04,0x04,0x25,0x28,0x25,0x24,0x04,
+	0x26,0x26,0x26,0x26,0x28,0x28,0x28,0x25,0x28,0x25,0x25,0x26,0x26,0x04,0x26,0x25,
+	0x23,0x25,0x04,0x22,0x22,0x22,0x24,0x26,0x24,0x26,0x26,0x25,0x25,0x04,0x28,0x24,
+	0x24,0x28,0x26,0x28,0x25,0x22,0x26,0x24,0x22,0x28,0x24,0x04,0x22,0x24,0x26,0x24,
+	0x26,0x24,0x26,0x26,0x26,0x25,0x25,0x26,0x04,0x28,0x26,0x28,0x26,0x26,0x28,0x28,
+	0x26,0x26,0x24,0x25,0x28,0x28,0x26,0x28,0x28,0x26,0x25,0x24,0x26,0x24,0x25,0x29,
+	0x21,0x25,0x22,0x24,0x22,0x22,0x21,0x25,0x24,0x23,0x22,0x25,0x25,0x21,0x24,0x23,
+	0x21,0x28,0x24,0x24,0x22,0x23,0x23,0x04,0x24,0x25,0x25,0x26,0x24,0x28,0x26,0x25,
+	0x28,0x28,0x04,0x26,0x25,0x22,0x23,0x24,0x24,0x23,0x25,0x23,0x25,0x25,0x26,0x25,
+	0x22,0x22,0x28,0x23,0x23,0x26,0x22,0x25,0x25,0x23,0x22,0x23,0x23,0x25,0x24,0x04,
+	0x23,0x22,0x26,0x23,0x22,0x23,0x23,0x25,0x22,0x24,0x22,0x21,0x04,0x28,0x25,0x26,
+	0x28,0x25,0x28,0x26,0x04,0x29,0x04,0x26,0x04,0x24,0x27,0x28,0x04,0x23,0x04,0x26,
+	0x04,0x23,0x26,0x24,0x28,0x24,0x24,0x26,0x26,0x28,0x28,0x26,0x28,0x04,0x04,0x25,
+	0x26,0x04,0x26,0x25,0x28,0x24,0x28,0x25,0x26,0x29,0x29,0x29,0x29,0x24,0x29,0x29,
+	0x26,0x25,0x23,0x29,0x28,0x25,0x27,0x26,0x04,0x22,0x25,0x26,0x28,0x24,0x24,0x26,
+	0x26,0x04,0x26,0x24,0x26,0x24,0x28,0x26,0x23,0x26,0x23,0x28,0x28,0x26,0x28,0x26,
+	0x26,0x25,0x28,0x25,0x28,0x25,0x28,0x25,0x25,0x28,0x28,0x28,0x26,0x26,0x26,0x28,
+	0x28,0x04,0x25,0x27,0x26,0x26,0x25,0x28,0x28,0x24,0x28,0x28,0x28,0x29,0x2A,0x2A,
+	0x26,0x28,0x28,0x27,0x04,0x04,0x25,0x24,0x22,0x23,0x23,0x20,0x22,0x24,0x22,0x24,
+	0x21,0x22,0x22,0x23,0x26,0x24,0x25,0x25,0x26,0x24,0x26,0x25,0x24,0x26,0x04,0x28,
+	0x24,0x28,0x26,0x26,0x24,0x28,0x26,0x26,0x04,0x04,0x24,0x24,0x24,0x25,0x26,0x24,
+	0x26,0x25,0x28,0x24,0x25,0x24,0x26,0x28,0x26,0x25,0x26,0x04,0x25,0x25,0x23,0x25,
+	0x25,0x23,0x23,0x26,0x04,0x25,0x26,0x28,0x28,0x23,0x28,0x26,0x25,0x26,0x26,0x28,
+	0x28,0x25,0x25,0x26,0x28,0x25,0x28,0x24,0x26,0x24,0x28,0x24,0x28,0x04,0x28,0x04,
+	0x04,0x28,0x26,0x26,0x04,0x04,0x25,0x28,0x04,0x04,0x28,0x28,0x25,0x28,0x26,0x04,
+	0x24,0x04,0x04,0x26,0x04,0x24,0x28,0x28,0x04,0x04,0x26,0x25,0x28,0x28,0x04,0x29,
+	0x22,0x22,0x22,0x22,0x23,0x22,0x22,0x28,0x25,0x21,0x25,0x23,0x22,0x22,0x04,0x25,
+	0x23,0x22,0x24,0x24,0x26,0x26,0x26,0x04,0x24,0x26,0x26,0x26,0x26,0x25,0x25,0x24,
+	0x04,0x25,0x24,0x28,0x26,0x25,0x26,0x23,0x22,0x04,0x23,0x22,0x25,0x04,0x04,0x23,
+	0x22,0x23,0x23,0x23,0x26,0x04,0x24,0x25,0x23,0x23,0x23,0x25,0x23,0x25,0x23,0x23,
+	0x23,0x22,0x25,0x22,0x23,0x22,0x21,0x23,0x23,0x22,0x25,0x23,0x25,0x25,0x26,0x27,
+	0x26,0x29,0x28,0x28,0x24,0x23,0x26,0x26,0x23,0x23,0x25,0x25,0x24,0x24,0x25,0x23,
+	0x22,0x25,0x23,0x23,0x23,0x22,0x28,0x23,0x26,0x24,0x24,0x26,0x29,0x28,0x28,0x28,
+	0x25,0x24,0x28,0x04,0x28,0x28,0x29,0x04,0x25,0x26,0x04,0x27,0x27,0x25,0x27,0x24,
+	0x24,0x28,0x27,0x25,0x28,0x29,0x25,0x29,0x26,0x25,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x25,0x26,0x28,0x25,0x28,0x26,0x22,0x28,0x28,0x26,0x25,0x26,0x28,0x26,0x24,0x24,
+	0x04,0x25,0x26,0x26,0x25,0x26,0x28,0x04,0x04,0x25,0x22,0x28,0x25,0x28,0x25,0x24,
+	0x26,0x27,0x28,0x25,0x04,0x04,0x2A,0x26,0x28,0x26,0x2A,0x28,0x28,0x28,0x25,0x26,
+	0x28,0x24,0x28,0x25,0x23,0x24,0x24,0x22,0x25,0x24,0x22,0x20,0x20,0x24,0x23,0x21,
+	0x25,0x25,0x24,0x04,0x25,0x28,0x25,0x04,0x28,0x26,0x04,0x26,0x23,0x28,0x28,0x24,
+	0x24,0x26,0x25,0x26,0x26,0x25,0x25,0x25,0x25,0x26,0x24,0x24,0x25,0x24,0x28,0x25,
+	0x25,0x26,0x28,0x23,0x26,0x28,0x22,0x04,0x26,0x23,0x25,0x24,0x28,0x25,0x21,0x24,
+	0x22,0x25,0x26,0x28,0x25,0x24,0x28,0x26,0x28,0x24,0x26,0x25,0x23,0x25,0x04,0x25,
+	0x04,0x26,0x04,0x28,0x26,0x28,0x28,0x25,0x28,0x24,0x26,0x28,0x27,0x27,0x25,0x28,
+	0x26,0x28,0x25,0x24,0x25,0x28,0x25,0x28,0x28,0x28,0x04,0x25,0x28,0x28,0x29,0x28,
+	0x04,0x29,0x28,0x29,0x28,0x28,0x04,0x28,0x26,0x29,0x29,0x28,0x29,0x29,0x28,0x29,
+	0x25,0x25,0x24,0x25,0x04,0x28,0x24,0x24,0x24,0x26,0x21,0x21,0x25,0x21,0x24,0x22,
+	0x24,0x25,0x25,0x28,0x26,0x04,0x23,0x28,0x28,0x26,0x25,0x28,0x24,0x24,0x04,0x28,
+	0x04,0x04,0x26,0x28,0x29,0x28,0x24,0x23,0x28,0x04,0x28,0x25,0x26,0x26,0x26,0x24,
+	0x28,0x26,0x23,0x25,0x26,0x04,0x04,0x24,0x22,0x25,0x25,0x22,0x24,0x23,0x04,0x22,
+	0x25,0x24,0x26,0x26,0x22,0x23,0x23,0x21,0x04,0x25,0x23,0x24,0x23,0x26,0x25,0x28,
+	0x24,0x22,0x25,0x28,0x22,0x24,0x23,0x25,0x23,0x25,0x26,0x25,0x23,0x04,0x22,0x28,
+	0x23,0x25,0x23,0x25,0x25,0x25,0x25,0x23,0x24,0x25,0x24,0x28,0x23,0x28,0x04,0x28,
+	0x28,0x28,0x04,0x26,0x25,0x24,0x26,0x26,0x25,0x28,0x28,0x25,0x24,0x24,0x04,0x24,
+	0x25,0x23,0x24,0x21,0x24,0x25,0x26,0x04,0x26,0x26,0x25,0x04,0x24,0x28,0x04,0x25,
+	0x25,0x23,0x28,0x26,0x26,0x04,0x26,0x04,0x26,0x28,0x26,0x24,0x04,0x28,0x25,0x24,
+	0x22,0x26,0x04,0x26,0x24,0x26,0x04,0x26,0x28,0x24,0x04,0x24,0x04,0x25,0x28,0x28,
+	0x29,0x24,0x29,0x28,0x25,0x29,0x28,0x28,0x28,0x28,0x25,0x28,0x28,0x28,0x27,0x26,
+	0x26,0x24,0x25,0x23,0x26,0x22,0x20,0x22,0x22,0x26,0x24,0x22,0x25,0x23,0x22,0x28,
+	0x23,0x28,0x25,0x25,0x26,0x28,0x26,0x25,0x26,0x25,0x04,0x26,0x25,0x28,0x25,0x25,
+	0x04,0x04,0x26,0x26,0x04,0x25,0x28,0x25,0x25,0x04,0x04,0x25,0x26,0x25,0x04,0x26,
+	0x25,0x25,0x26,0x26,0x26,0x04,0x26,0x26,0x26,0x25,0x26,0x25,0x26,0x20,0x22,0x24,
+	0x04,0x26,0x26,0x28,0x28,0x28,0x26,0x04,0x26,0x28,0x26,0x26,0x24,0x04,0x28,0x24,
+	0x25,0x26,0x26,0x24,0x25,0x26,0x24,0x25,0x26,0x26,0x04,0x04,0x28,0x28,0x28,0x28,
+	0x25,0x26,0x28,0x26,0x25,0x25,0x28,0x04,0x26,0x28,0x28,0x24,0x25,0x28,0x04,0x25,
+	0x2A,0x28,0x2A,0x28,0x2A,0x29,0x2A,0x28,0x29,0x04,0x29,0x28,0x28,0x28,0x25,0x29,
+	0x22,0x21,0x21,0x24,0x24,0x21,0x21,0x24,0x23,0x20,0x24,0x20,0x20,0x22,0x22,0x24,
+	0x24,0x24,0x25,0x25,0x04,0x25,0x26,0x28,0x26,0x26,0x25,0x26,0x28,0x28,0x22,0x04,
+	0x28,0x27,0x04,0x28,0x24,0x28,0x25,0x29,0x28,0x26,0x28,0x22,0x25,0x23,0x25,0x22,
+	0x23,0x25,0x25,0x26,0x26,0x24,0x26,0x25,0x28,0x28,0x25,0x26,0x28,0x25,0x24,0x04,
+	0x24,0x25,0x26,0x26,0x25,0x28,0x25,0x25,0x23,0x26,0x26,0x25,0x24,0x28,0x28,0x26,
+	0x26,0x25,0x22,0x23,0x22,0x23,0x23,0x24,0x23,0x22,0x24,0x26,0x04,0x26,0x24,0x21,
+	0x25,0x26,0x24,0x23,0x24,0x23,0x23,0x22,0x22,0x04,0x26,0x25,0x24,0x26,0x26,0x28,
+	0x24,0x26,0x25,0x28,0x24,0x26,0x28,0x28,0x25,0x25,0x25,0x28,0x24,0x23,0x04,0x04,
+	0x22,0x25,0x04,0x24,0x25,0x25,0x25,0x23,0x25,0x24,0x25,0x23,0x24,0x25,0x25,0x22,
+	0x04,0x04,0x24,0x04,0x24,0x25,0x24,0x24,0x24,0x24,0x24,0x25,0x25,0x28,0x28,0x25,
+	0x24,0x26,0x28,0x24,0x25,0x23,0x04,0x22,0x24,0x29,0x26,0x26,0x26,0x04,0x28,0x28,
+	0x26,0x29,0x28,0x24,0x25,0x25,0x25,0x28,0x28,0x04,0x28,0x04,0x28,0x25,0x25,0x25,
+	0x24,0x22,0x24,0x25,0x23,0x20,0x23,0x25,0x04,0x25,0x24,0x25,0x23,0x23,0x04,0x25,
+	0x24,0x23,0x24,0x26,0x26,0x26,0x23,0x25,0x24,0x28,0x25,0x04,0x04,0x26,0x04,0x25,
+	0x26,0x26,0x04,0x28,0x26,0x26,0x25,0x25,0x26,0x25,0x25,0x26,0x04,0x24,0x26,0x25,
+	0x26,0x28,0x23,0x28,0x28,0x26,0x26,0x04,0x04,0x25,0x25,0x22,0x20,0x22,0x25,0x24,
+	0x26,0x26,0x04,0x26,0x28,0x25,0x04,0x28,0x28,0x04,0x26,0x25,0x26,0x28,0x04,0x26,
+	0x28,0x25,0x26,0x24,0x26,0x24,0x25,0x25,0x28,0x25,0x26,0x25,0x24,0x24,0x04,0x28,
+	0x28,0x25,0x28,0x28,0x28,0x04,0x28,0x28,0x25,0x28,0x04,0x26,0x24,0x29,0x29,0x28,
+	0x29,0x28,0x28,0x26,0x29,0x28,0x29,0x28,0x28,0x25,0x23,0x25,0x27,0x24,0x26,0x29,
+	0x20,0x26,0x22,0x20,0x20,0x20,0x20,0x20,0x22,0x23,0x25,0x24,0x22,0x22,0x26,0x04,
+	0x26,0x20,0x04,0x26,0x25,0x24,0x22,0x04,0x28,0x26,0x26,0x28,0x26,0x28,0x28,0x25,
+	0x24,0x28,0x26,0x26,0x25,0x25,0x26,0x28,0x23,0x27,0x26,0x28,0x28,0x04,0x04,0x25,
+	0x22,0x23,0x25,0x24,0x25,0x25,0x25,0x25,0x26,0x25,0x24,0x27,0x25,0x28,0x25,0x24,
+	0x04,0x26,0x25,0x23,0x28,0x28,0x28,0x28,0x26,0x29,0x26,0x28,0x27,0x24,0x26,0x25,
+	0x28,0x04,0x26,0x25,0x22,0x26,0x25,0x22,0x23,0x24,0x23,0x23,0x22,0x22,0x23,0x23,
+	0x25,0x24,0x25,0x22,0x23,0x26,0x04,0x24,0x26,0x24,0x25,0x26,0x28,0x23,0x24,0x26,
+	0x24,0x25,0x28,0x26,0x23,0x28,0x24,0x24,0x22,0x23,0x22,0x25,0x25,0x25,0x26,0x25,
+	0x25,0x24,0x25,0x23,0x22,0x24,0x24,0x28,0x24,0x25,0x23,0x24,0x25,0x25,0x24,0x26,
+	0x25,0x25,0x28,0x25,0x04,0x24,0x25,0x25,0x24,0x26,0x24,0x24,0x28,0x28,0x29,0x28,
+	0x28,0x28,0x29,0x26,0x29,0x28,0x29,0x29,0x29,0x26,0x25,0x27,0x25,0x28,0x04,0x28,
+	0x27,0x28,0x26,0x28,0x26,0x26,0x29,0x28,0x26,0x28,0x25,0x25,0x28,0x24,0x20,0x23,
+	0x20,0x22,0x22,0x23,0x25,0x22,0x23,0x24,0x22,0x24,0x23,0x23,0x26,0x24,0x28,0x23,
+	0x28,0x04,0x24,0x26,0x28,0x26,0x24,0x26,0x26,0x04,0x04,0x04,0x25,0x25,0x24,0x26,
+	0x25,0x26,0x26,0x25,0x28,0x25,0x25,0x26,0x25,0x24,0x28,0x23,0x28,0x28,0x04,0x26,
+	0x04,0x24,0x25,0x26,0x04,0x25,0x24,0x24,0x24,0x24,0x24,0x24,0x26,0x28,0x25,0x23,
+	0x26,0x25,0x25,0x28,0x22,0x25,0x28,0x24,0x24,0x25,0x28,0x25,0x27,0x28,0x26,0x26,
+	0x27,0x28,0x28,0x04,0x27,0x25,0x25,0x28,0x28,0x28,0x28,0x26,0x29,0x26,0x25,0x28,
+	0x24,0x25,0x24,0x28,0x25,0x24,0x25,0x24,0x27,0x24,0x28,0x26,0x26,0x28,0x28,0x26,
+	0x28,0x24,0x28,0x04,0x25,0x28,0x23,0x28,0x24,0x04,0x28,0x28,0x04,0x26,0x26,0x29,
+	0x21,0x22,0x25,0x24,0x23,0x22,0x25,0x25,0x21,0x25,0x26,0x26,0x04,0x28,0x28,0x25,
+	0x04,0x21,0x20,0x20,0x25,0x22,0x25,0x25,0x24,0x28,0x25,0x25,0x24,0x04,0x04,0x24,
+	0x23,0x28,0x25,0x04,0x25,0x25,0x23,0x23,0x04,0x25,0x23,0x23,0x25,0x29,0x28,0x26,
+	0x24,0x28,0x25,0x25,0x28,0x04,0x25,0x26,0x28,0x27,0x25,0x28,0x24,0x28,0x28,0x04,
+	0x04,0x28,0x28,0x04,0x26,0x28,0x28,0x27,0x24,0x28,0x27,0x28,0x26,0x26,0x28,0x28,
+	0x28,0x25,0x28,0x25,0x25,0x25,0x25,0x26,0x24,0x25,0x22,0x23,0x22,0x25,0x23,0x23,
+	0x25,0x24,0x23,0x25,0x26,0x26,0x26,0x26,0x24,0x24,0x28,0x26,0x26,0x28,0x24,0x26,
+	0x28,0x28,0x25,0x23,0x24,0x26,0x24,0x22,0x23,0x24,0x04,0x23,0x22,0x23,0x23,0x25,
+	0x24,0x23,0x22,0x22,0x23,0x25,0x28,0x25,0x23,0x04,0x26,0x23,0x25,0x26,0x28,0x23,
+	0x25,0x22,0x25,0x22,0x24,0x24,0x22,0x25,0x24,0x22,0x22,0x24,0x23,0x28,0x04,0x24,
+	0x26,0x24,0x24,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x04,0x28,0x27,
+	0x28,0x28,0x04,0x28,0x28,0x26,0x28,0x26,0x28,0x04,0x26,0x24,0x20,0x22,0x22,0x22,
+	0x22,0x25,0x23,0x25,0x23,0x04,0x24,0x25,0x24,0x25,0x25,0x04,0x25,0x22,0x26,0x28,
+	0x26,0x26,0x04,0x24,0x26,0x24,0x25,0x26,0x22,0x25,0x26,0x26,0x04,0x28,0x23,0x28,
+	0x26,0x25,0x28,0x23,0x26,0x25,0x28,0x04,0x28,0x24,0x28,0x24,0x26,0x28,0x25,0x25,
+	0x25,0x25,0x23,0x26,0x25,0x23,0x20,0x24,0x24,0x23,0x24,0x25,0x26,0x25,0x28,0x26,
+	0x24,0x26,0x26,0x26,0x26,0x26,0x26,0x28,0x26,0x28,0x26,0x04,0x04,0x29,0x25,0x29,
+	0x26,0x28,0x28,0x28,0x28,0x29,0x04,0x29,0x28,0x26,0x26,0x28,0x04,0x29,0x28,0x28,
+	0x24,0x04,0x25,0x28,0x28,0x25,0x04,0x04,0x28,0x04,0x28,0x28,0x26,0x04,0x25,0x28,
+	0x24,0x04,0x04,0x26,0x26,0x23,0x24,0x04,0x26,0x28,0x28,0x25,0x26,0x04,0x25,0x29,
+	0x26,0x28,0x28,0x26,0x25,0x26,0x26,0x04,0x26,0x26,0x26,0x26,0x26,0x24,0x24,0x25,
+	0x22,0x25,0x22,0x26,0x04,0x24,0x28,0x04,0x28,0x28,0x04,0x04,0x26,0x23,0x24,0x28,
+	0x25,0x25,0x23,0x04,0x26,0x28,0x25,0x25,0x26,0x25,0x22,0x25,0x04,0x26,0x26,0x27,
+	0x28,0x25,0x28,0x25,0x25,0x25,0x28,0x26,0x24,0x25,0x04,0x28,0x28,0x23,0x24,0x22,
+	0x26,0x26,0x04,0x25,0x22,0x28,0x28,0x23,0x26,0x26,0x25,0x04,0x28,0x27,0x04,0x25,
+	0x26,0x24,0x26,0x29,0x28,0x28,0x26,0x26,0x27,0x24,0x26,0x04,0x24,0x22,0x26,0x25,
+	0x22,0x25,0x24,0x04,0x24,0x28,0x25,0x26,0x26,0x26,0x24,0x23,0x25,0x04,0x25,0x24,
+	0x25,0x25,0x22,0x22,0x28,0x25,0x25,0x22,0x25,0x24,0x24,0x26,0x25,0x25,0x23,0x23,
+	0x25,0x04,0x25,0x26,0x22,0x24,0x24,0x25,0x25,0x24,0x23,0x04,0x25,0x24,0x25,0x04,
+	0x26,0x04,0x26,0x28,0x28,0x24,0x26,0x26,0x25,0x28,0x24,0x25,0x26,0x26,0x22,0x24,
+	0x25,0x28,0x26,0x28,0x28,0x28,0x28,0x04,0x28,0x24,0x04,0x04,0x28,0x29,0x28,0x04,
+	0x28,0x28,0x25,0x25,0x26,0x26,0x23,0x25,0x21,0x24,0x22,0x20,0x25,0x24,0x28,0x23,
+	0x25,0x24,0x23,0x24,0x22,0x25,0x25,0x28,0x26,0x23,0x25,0x22,0x26,0x25,0x25,0x04,
+	0x26,0x26,0x24,0x25,0x25,0x26,0x24,0x28,0x28,0x04,0x25,0x26,0x25,0x24,0x26,0x25,
+	0x26,0x26,0x26,0x24,0x28,0x26,0x24,0x04,0x28,0x04,0x28,0x28,0x28,0x25,0x25,0x04,
+	0x25,0x24,0x23,0x22,0x20,0x24,0x21,0x28,0x25,0x28,0x25,0x28,0x25,0x26,0x28,0x26,
+	0x28,0x04,0x26,0x25,0x04,0x28,0x25,0x24,0x25,0x28,0x28,0x29,0x28,0x28,0x26,0x28,
+	0x25,0x28,0x25,0x26,0x26,0x29,0x29,0x25,0x28,0x25,0x04,0x24,0x26,0x28,0x29,0x28,
+	0x26,0x25,0x27,0x24,0x23,0x25,0x28,0x25,0x26,0x28,0x24,0x25,0x25,0x04,0x28,0x04,
+	0x25,0x24,0x26,0x04,0x26,0x26,0x26,0x26,0x22,0x25,0x28,0x04,0x23,0x28,0x28,0x29,
+	0x24,0x28,0x24,0x28,0x25,0x04,0x24,0x26,0x24,0x23,0x04,0x26,0x22,0x28,0x24,0x28,
+	0x04,0x25,0x26,0x25,0x28,0x28,0x28,0x24,0x20,0x22,0x28,0x25,0x23,0x23,0x28,0x24,
+	0x22,0x25,0x22,0x04,0x22,0x21,0x26,0x25,0x23,0x21,0x22,0x22,0x25,0x04,0x28,0x25,
+	0x28,0x22,0x28,0x28,0x04,0x04,0x24,0x22,0x25,0x25,0x22,0x23,0x25,0x22,0x21,0x23,
+	0x22,0x22,0x28,0x23,0x23,0x24,0x04,0x28,0x28,0x22,0x04,0x28,0x25,0x28,0x28,0x04,
+	0x26,0x26,0x28,0x28,0x24,0x04,0x22,0x25,0x28,0x28,0x28,0x26,0x25,0x28,0x28,0x26,
+	0x25,0x04,0x28,0x26,0x25,0x26,0x28,0x25,0x22,0x26,0x23,0x23,0x23,0x21,0x25,0x26,
+	0x25,0x26,0x25,0x28,0x25,0x04,0x26,0x25,0x26,0x22,0x25,0x24,0x24,0x25,0x25,0x28,
+	0x24,0x22,0x26,0x24,0x04,0x26,0x24,0x25,0x26,0x26,0x25,0x25,0x04,0x04,0x28,0x28,
+	0x24,0x24,0x28,0x25,0x23,0x04,0x24,0x22,0x04,0x26,0x26,0x28,0x28,0x26,0x26,0x27,
+	0x24,0x28,0x25,0x26,0x25,0x29,0x28,0x25,0x28,0x04,0x28,0x28,0x25,0x25,0x27,0x28,
+	0x26,0x28,0x24,0x23,0x24,0x23,0x25,0x24,0x20,0x22,0x23,0x25,0x23,0x28,0x26,0x04,
+	0x23,0x24,0x25,0x25,0x23,0x26,0x26,0x25,0x25,0x04,0x24,0x28,0x04,0x25,0x28,0x04,
+	0x24,0x24,0x25,0x28,0x26,0x28,0x04,0x25,0x25,0x28,0x04,0x26,0x28,0x28,0x28,0x28,
+	0x04,0x25,0x04,0x26,0x04,0x26,0x24,0x04,0x28,0x22,0x26,0x25,0x25,0x26,0x25,0x26,
+	0x25,0x25,0x22,0x25,0x23,0x23,0x28,0x25,0x25,0x24,0x22,0x28,0x24,0x26,0x25,0x24,
+	0x25,0x04,0x25,0x04,0x26,0x25,0x28,0x28,0x04,0x28,0x29,0x04,0x28,0x28,0x27,0x24,
+	0x28,0x27,0x25,0x27,0x25,0x28,0x28,0x28,0x26,0x28,0x04,0x28,0x04,0x22,0x26,0x26,
+	0x04,0x28,0x28,0x26,0x04,0x28,0x28,0x25,0x28,0x24,0x22,0x25,0x28,0x28,0x23,0x28,
+	0x04,0x26,0x28,0x28,0x26,0x04,0x26,0x24,0x24,0x26,0x25,0x28,0x24,0x23,0x24,0x29,
+	0x28,0x28,0x28,0x28,0x28,0x26,0x27,0x28,0x26,0x24,0x26,0x25,0x23,0x28,0x04,0x28,
+	0x28,0x27,0x24,0x25,0x24,0x26,0x25,0x24,0x23,0x25,0x20,0x20,0x20,0x25,0x20,0x04,
+	0x04,0x28,0x28,0x04,0x23,0x26,0x26,0x25,0x25,0x23,0x22,0x20,0x20,0x20,0x20,0x20,
+	0x22,0x23,0x26,0x28,0x23,0x24,0x04,0x25,0x23,0x28,0x23,0x26,0x25,0x25,0x25,0x28,
+	0x28,0x28,0x24,0x25,0x28,0x04,0x04,0x26,0x25,0x26,0x23,0x24,0x28,0x25,0x26,0x24,
+	0x26,0x25,0x25,0x24,0x25,0x22,0x28,0x26,0x25,0x22,0x26,0x28,0x25,0x25,0x28,0x25,
+	0x28,0x24,0x26,0x25,0x26,0x26,0x28,0x25,0x24,0x04,0x26,0x26,0x04,0x26,0x04,0x28,
+	0x28,0x04,0x04,0x24,0x24,0x25,0x04,0x04,0x24,0x28,0x26,0x26,0x28,0x27,0x28,0x25,
+	0x25,0x24,0x04,0x04,0x27,0x26,0x24,0x27,0x28,0x24,0x25,0x26,0x28,0x26,0x25,0x25,
+	0x25,0x28,0x04,0x28,0x25,0x28,0x25,0x25,0x28,0x28,0x25,0x28,0x28,0x25,0x23,0x29,
+	0x04,0x28,0x28,0x28,0x28,0x25,0x26,0x24,0x25,0x25,0x28,0x25,0x26,0x26,0x25,0x21,
+	0x25,0x23,0x22,0x21,0x25,0x24,0x20,0x25,0x28,0x23,0x23,0x25,0x22,0x25,0x23,0x22,
+	0x26,0x28,0x24,0x26,0x04,0x26,0x25,0x28,0x28,0x23,0x26,0x25,0x28,0x25,0x25,0x04,
+	0x28,0x04,0x25,0x28,0x26,0x28,0x28,0x22,0x25,0x28,0x26,0x04,0x28,0x25,0x25,0x04,
+	0x26,0x25,0x28,0x28,0x26,0x25,0x04,0x04,0x26,0x28,0x26,0x26,0x26,0x26,0x24,0x25,
+	0x25,0x23,0x25,0x25,0x25,0x23,0x28,0x24,0x22,0x25,0x28,0x27,0x24,0x28,0x26,0x28,
+	0x25,0x26,0x28,0x25,0x28,0x28,0x28,0x28,0x28,0x29,0x25,0x25,0x28,0x25,0x27,0x04,
+	0x28,0x28,0x28,0x25,0x26,0x25,0x25,0x24,0x24,0x24,0x25,0x24,0x26,0x26,0x24,0x26,
+	0x24,0x28,0x25,0x28,0x04,0x28,0x24,0x04,0x26,0x26,0x28,0x26,0x28,0x25,0x22,0x26,
+	0x26,0x04,0x25,0x28,0x28,0x26,0x04,0x04,0x24,0x24,0x23,0x23,0x26,0x25,0x20,0x29,
+	0x29,0x28,0x28,0x25,0x26,0x24,0x29,0x26,0x25,0x25,0x27,0x26,0x28,0x04,0x24,0x24,
+	0x25,0x26,0x04,0x26,0x23,0x25,0x22,0x04,0x23,0x24,0x26,0x24,0x22,0x25,0x24,0x25,
+	0x24,0x25,0x25,0x04,0x23,0x04,0x25,0x25,0x04,0x28,0x28,0x22,0x28,0x23,0x23,0x25,
+	0x23,0x25,0x23,0x23,0x20,0x23,0x04,0x26,0x04,0x27,0x04,0x28,0x26,0x26,0x24,0x04,
+	0x04,0x25,0x26,0x25,0x28,0x25,0x28,0x25,0x25,0x28,0x28,0x04,0x25,0x22,0x28,0x23,
+	0x25,0x28,0x24,0x22,0x25,0x22,0x04,0x26,0x23,0x26,0x28,0x28,0x25,0x25,0x24,0x23,
+	0x26,0x25,0x26,0x28,0x25,0x23,0x28,0x04,0x04,0x24,0x26,0x26,0x04,0x25,0x28,0x26,
+	0x26,0x25,0x28,0x29,0x29,0x24,0x28,0x04,0x04,0x23,0x25,0x29,0x29,0x04,0x04,0x29,
+	0x25,0x29,0x26,0x29,0x25,0x28,0x25,0x28,0x04,0x22,0x26,0x29,0x29,0x28,0x29,0x04,
+	0x04,0x25,0x29,0x28,0x29,0x28,0x25,0x28,0x28,0x28,0x29,0x28,0x28,0x04,0x28,0x28,
+	0x26,0x28,0x28,0x04,0x25,0x25,0x22,0x25,0x25,0x22,0x24,0x24,0x22,0x26,0x25,0x23,
+	0x21,0x22,0x24,0x21,0x20,0x20,0x24,0x22,0x24,0x28,0x25,0x24,0x24,0x22,0x23,0x28,
+	0x22,0x28,0x28,0x25,0x04,0x26,0x26,0x25,0x04,0x26,0x28,0x24,0x28,0x28,0x28,0x28,
+	0x26,0x04,0x04,0x25,0x25,0x26,0x24,0x28,0x26,0x26,0x28,0x24,0x28,0x26,0x24,0x24,
+	0x28,0x04,0x28,0x22,0x26,0x04,0x26,0x24,0x26,0x24,0x26,0x26,0x21,0x25,0x04,0x26,
+	0x23,0x28,0x28,0x28,0x28,0x24,0x28,0x28,0x29,0x25,0x25,0x29,0x28,0x29,0x28,0x28,
+	0x28,0x29,0x24,0x29,0x23,0x28,0x25,0x26,0x28,0x28,0x28,0x04,0x26,0x26,0x26,0x24,
+	0x04,0x25,0x27,0x25,0x25,0x25,0x28,0x25,0x25,0x24,0x04,0x26,0x25,0x26,0x26,0x28,
+	0x28,0x28,0x22,0x28,0x28,0x28,0x26,0x24,0x26,0x28,0x04,0x26,0x26,0x04,0x26,0x28,
+	0x24,0x26,0x25,0x28,0x26,0x25,0x26,0x26,0x26,0x28,0x24,0x04,0x23,0x20,0x23,0x29,
+	0x28,0x25,0x28,0x04,0x27,0x25,0x26,0x28,0x28,0x25,0x28,0x24,0x26,0x25,0x23,0x25,
+	0x25,0x96,0x96,0x96,0x96,0x4A,0x4A,0x4A,0x4A,0x4A,0x96,0x96,0x98,0x98,0x98,0x98,
+	0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,
+	0x9A,0x9A,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x26,0x25,
+	0x24,0x25,0x25,0x28,0x25,0x04,0x26,0x22,0x22,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+	0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,
+	0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+	0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+	0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,
+	0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,
+	0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,
+	0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,
+	0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1E,0x1E,
+	0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,
+	0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,
+	0x1E,0x1E,0x1E,0x1E,0x24,0x28,0x28,0x28,0x25,0x98,0x98,0x98,0x98,0x98,0x98,0x98,
+	0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,
+	0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,
+	0x99,0x99,0x99,0x99,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,
+	0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x22,0x20,0x28,0x29,
+	0x26,0x28,0x26,0x28,0x28,0x23,0x28,0x04,0x25,0x26,0x28,0x23,0x24,0x24,0x25,0x28,
+	0x25,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x22,
+	0x22,0x25,0x25,0x23,0x22,0x23,0x23,0x22,0x23,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2C,0x04,0x28,0x04,0x28,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x24,0x25,0x29,
+	0x28,0x04,0x28,0x26,0x28,0x26,0x26,0x26,0x24,0x26,0x28,0x25,0x22,0x25,0x25,0x28,
+	0x28,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x9F,0x2A,0x26,
+	0x22,0x23,0x25,0x22,0x22,0x20,0x24,0x22,0x24,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2B,0x26,0x04,0x28,0x28,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2E,0x28,0x24,0x29,
+	0x26,0x28,0x24,0x26,0x25,0x25,0x24,0x25,0x26,0x28,0x04,0x28,0x25,0x28,0x04,0x04,
+	0x28,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x2C,
+	0x28,0x23,0x25,0x24,0x04,0x23,0x25,0x25,0x23,0x1A,0x00,0x00,0x18,0x08,0x1D,0x00,
+	0x00,0x00,0x1C,0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,
+	0x08,0x1D,0x00,0x00,0x2B,0x2C,0x24,0x26,0x24,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x29,0x28,0x29,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x08,0x1D,0x1F,0x00,
+	0x00,0x1E,0x08,0x08,0x14,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x1C,0x00,0x1E,0x00,0x00,0x00,0x00,0x07,0x12,
+	0x07,0x00,0x07,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+	0x1D,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x3C,0x38,0x45,0x45,
+	0x38,0xD5,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x4C,0x47,0x47,0x47,0x47,0x4C,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x1D,0x1F,0x1F,0x00,
+	0x00,0x08,0x08,0x08,0x08,0x14,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x20,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x16,0x0F,0x1A,0x18,0x07,0x18,0x17,0x00,0x08,0x07,0x17,0x1A,0x1A,
+	0x16,0x12,0x1A,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,
+	0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x28,0x34,0x33,0x33,0x33,0x33,0x33,
+	0x33,0x34,0x3F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x08,0x1A,0x1A,0x1A,0x1A,0x1A,0x07,0x0F,0x07,0x00,0x00,0x00,0x00,0x28,0x08,0x1A,
+	0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x13,0x1A,0x1A,0x1A,0x1A,0x1A,0x18,0x28,0x16,0x1A,0x1A,0x1A,0x1A,0x1A,
+	0x1A,0x1A,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x12,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2D,
+	0x17,0x07,0x00,0x00,0x00,0x26,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x28,0x21,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
+	0x36,0x36,0xD9,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x96,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x00,0x00,0x32,
+	0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x0F,0x00,0x00,0x24,0x19,0x19,0x19,
+	0x19,0x31,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x11,0x19,0x19,0x19,0x19,0x19,0x07,0x35,0x00,0x18,0x19,0x19,0x19,0x07,0x19,
+	0x19,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x12,0x07,0x19,0x18,
+	0x12,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x1A,
+	0x1A,0x1A,0x11,0x26,0x26,0x1A,0x17,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x29,0x23,0x23,0x23,0x23,0x2A,0xAD,0xAD,0x2A,0x23,
+	0x23,0x27,0xAD,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x4A,0x4C,0x4E,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x00,0x22,0x19,
+	0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x32,0x00,0x00,0x35,0x19,0x19,0x19,
+	0x19,0x19,0x18,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x17,0x18,0x18,0x18,0x0F,0x28,0x2A,0x00,0x00,0x19,0x18,0x18,0x18,0x07,0x04,
+	0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x24,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x04,0x13,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x19,0x19,
+	0x19,0x07,0x12,0x11,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x19,0x19,
+	0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x08,0x00,0x1D,0x13,0x07,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x29,0x25,0x25,0x25,0x28,0x9F,0x9F,0x9F,0xAE,0x27,0x25,
+	0x27,0xAD,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,0x4C,0x4E,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x00,0x32,0x17,
+	0x17,0x17,0x17,0x00,0x0F,0x17,0x17,0x17,0x17,0x0C,0x00,0x1A,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x18,0x18,0x17,0x17,0x0F,0x00,0x00,0x00,0x00,0x08,0x17,0x17,0x17,0x18,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x22,0x17,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x18,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x18,0x18,0x18,
+	0x18,0x18,0x18,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x18,0x18,0x18,
+	0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x12,0x07,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x29,0x26,0x26,0x28,0x2C,0x9F,0x9F,0x9F,0xAF,0x27,0x26,0x27,
+	0xAD,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,0x4D,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x00,0x07,0x14,
+	0x17,0x17,0x2B,0x00,0x0F,0x17,0x17,0x17,0x17,0x36,0x00,0x17,0x17,0x17,0x08,0x17,
+	0x17,0x17,0x17,0x17,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x1A,0x17,0x16,0x16,0x11,0x00,0x00,0x00,0x00,0x04,0x16,0x16,0x16,0x1A,0x00,
+	0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x35,0x16,0x16,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x07,0x08,0x1D,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x26,0x00,
+	0x17,0x17,0x17,0x17,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x07,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x29,0x28,0x28,0x2A,0xE6,0x9F,0x9F,0x9F,0x9F,0x29,0x28,0x28,0xAD,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,
+	0x4D,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x18,0x11,
+	0x16,0x2B,0x00,0x00,0x11,0x16,0x16,0x16,0x16,0x22,0x00,0x07,0x16,0x08,0x00,0x1A,
+	0x16,0x16,0x16,0x16,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x1C,0x16,0x16,0x16,0x13,0x00,0x00,0x00,0x00,0x04,0x16,0x16,0x16,0x08,0x0C,
+	0x0C,0x08,0x00,0x00,0x00,0x1A,0x17,0x0F,0x00,0x00,0x00,0x00,0x0C,0x07,0x00,0x00,
+	0x00,0x1C,0x07,0x12,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x08,0x0F,0x00,0x00,
+	0x18,0x00,0x04,0x16,0x16,0x16,0x0F,0x11,0x13,0x00,0x00,0x00,0x00,0x18,0x13,0x08,
+	0x00,0x00,0x00,0x00,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x00,0x00,0x00,
+	0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,
+	0x16,0x16,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x16,0x16,0x16,0x16,
+	0x00,0x12,0x16,0x16,0x16,0x16,0x00,0x00,0x1E,0x16,0x16,0x16,0x16,0x16,0x17,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0xBE,0xBD,0xBD,0xBD,0xE6,0x9F,0x9F,0x9F,0x9F,0xAD,0xBD,0xBD,0xAD,0x9F,
+	0x9F,0xAE,0xAE,0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x4D,0x49,0x47,0x47,0x47,0x47,0x47,0x47,
+	0x49,0x4E,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0F,
+	0x07,0x04,0x00,0x00,0x12,0x16,0x16,0x16,0x16,0x04,0x00,0x19,0x07,0x08,0x00,0x11,
+	0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x1A,0x11,0x0F,0x07,0x08,0x00,
+	0x00,0x1E,0x16,0x07,0x07,0x07,0x00,0x00,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
+	0x07,0x08,0x00,0x08,0x08,0x16,0x07,0x07,0x0F,0x00,0x00,0x0C,0x07,0x07,0x0F,0x0F,
+	0x00,0x08,0x07,0x07,0x12,0x0F,0x12,0x00,0x00,0x0C,0x24,0x18,0x07,0x12,0x0F,0x07,
+	0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x00,0x00,0x1A,0x19,0x07,0x07,0x0F,
+	0x08,0x00,0x00,0x21,0x19,0x07,0x0F,0x11,0x08,0x00,0x04,0x07,0x12,0x0F,0x00,0x00,
+	0x18,0x07,0x12,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,
+	0x07,0x07,0x07,0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x07,0x07,0x07,0x00,
+	0x00,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x1E,0x08,0x07,0x07,0x07,0x07,0x18,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0xBE,0xBD,0xBD,0xBD,0xAE,0x9F,0x9F,0x9F,0x9F,0xAD,0xBD,0xBD,0xAD,0x9F,0x9F,
+	0xAE,0xBE,0xBE,0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x49,0x47,0x47,0x47,0x47,0x47,
+	0x47,0x4C,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x18,
+	0x14,0x36,0x00,0x00,0x13,0x07,0x07,0x07,0x07,0x04,0x00,0x00,0x07,0x08,0x00,0x12,
+	0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x0F,0x31,
+	0x00,0x1F,0x07,0x14,0x14,0x16,0x00,0x19,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
+	0x18,0x04,0x0C,0x16,0x14,0x14,0x14,0x14,0x07,0x0F,0x0C,0x14,0x14,0x14,0x14,0x14,
+	0x1C,0x18,0x14,0x14,0x14,0x14,0x14,0x21,0x17,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
+	0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x0C,0x19,0x14,0x14,0x14,0x14,0x14,
+	0x0F,0x08,0x0C,0x16,0x14,0x14,0x14,0x14,0x12,0x04,0x14,0x14,0x14,0x14,0x17,0x08,
+	0x14,0x14,0x14,0x14,0x14,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,
+	0x14,0x14,0x14,0x14,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x16,0x14,0x1A,0x00,
+	0x00,0x0C,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x19,0x14,0x14,0x14,0x14,0x1A,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0xBE,0xBD,0xBD,0xBD,0xAE,0x9F,0x9F,0xAE,0xAD,0xAD,0xBD,0xBD,0xAD,0x9F,0x9F,0xAE,
+	0xBE,0xBE,0xAE,0x9F,0x9F,0xAE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xAE,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x98,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x49,0x47,0x47,0x47,0x47,
+	0x47,0x49,0x4E,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x18,0x18,0x00,0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x07,0x07,0x14,
+	0x14,0x14,0x14,0x14,0x04,0x24,0x17,0x14,0x14,0x14,0x04,0x14,0x14,0x14,0x14,0x14,
+	0x19,0x00,0x14,0x13,0x13,0x18,0x00,0x19,0x13,0x08,0x08,0x13,0x13,0x13,0x08,0x00,
+	0x00,0x0C,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x07,0x08,0x13,0x13,0x13,0x13,
+	0x18,0x13,0x13,0x13,0x13,0x13,0x07,0x35,0x13,0x13,0x13,0x13,0x08,0x13,0x13,0x0C,
+	0x08,0x18,0x1C,0x13,0x13,0x13,0x1C,0x08,0x04,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
+	0x13,0x0F,0x08,0x08,0x13,0x13,0x13,0x13,0x04,0x04,0x13,0x13,0x13,0x13,0x13,0x13,
+	0x13,0x13,0x13,0x13,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+	0x13,0x13,0x13,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x1A,0x13,0x1A,0x00,
+	0x00,0x0C,0x13,0x13,0x13,0x13,0x00,0x00,0x00,0x08,0x13,0x13,0x13,0x13,0x08,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xBE,
+	0xBC,0xBC,0xBC,0xBE,0xAE,0x9F,0xAE,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,
+	0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBE,0xAE,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x99,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x4D,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4E,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x07,0x13,0x13,0x13,0x13,0x2C,0x00,0x00,0x00,0x00,0x00,0x16,
+	0x13,0x13,0x13,0x13,0x04,0x21,0x13,0x13,0x13,0x13,0x04,0x0C,0x13,0x13,0x13,0x13,
+	0x19,0x00,0x13,0x12,0x12,0x1A,0x00,0x08,0x08,0x00,0x1D,0x12,0x12,0x12,0x1C,0x00,
+	0x00,0x08,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x04,0x12,0x12,0x12,0x12,
+	0x12,0x12,0x12,0x12,0x12,0x12,0x07,0x21,0x12,0x12,0x12,0x12,0x04,0x25,0x20,0x00,
+	0x00,0x00,0x1E,0x12,0x12,0x12,0x00,0x00,0x08,0x12,0x12,0x12,0x12,0x12,0x12,0x12,
+	0x12,0x12,0x08,0x04,0x12,0x12,0x12,0x12,0x04,0x00,0x08,0x12,0x12,0x12,0x12,0x12,
+	0x12,0x12,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x08,
+	0x11,0x18,0x08,0x00,0x16,0x28,0x28,0x32,0x07,0x07,0x07,0x0F,0x08,0x0F,0x1A,0x00,
+	0x00,0x35,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x1D,0x11,0x11,0x11,0x11,0x1D,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xBE,0xBB,
+	0xBB,0xBB,0xBD,0xAE,0x9F,0xAE,0xBD,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,
+	0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBE,0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x99,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x4F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4D,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x16,0x13,0x12,0x12,0x12,0x2F,0x00,0x07,0x17,0x18,0x00,0x17,
+	0x12,0x12,0x12,0x12,0x27,0x35,0x12,0x12,0x12,0x12,0x04,0x0C,0x12,0x12,0x12,0x12,
+	0x33,0x00,0x12,0x11,0x11,0x18,0x00,0x00,0x00,0x00,0x00,0x10,0x11,0x11,0x1E,0x00,
+	0x00,0x1D,0x10,0x11,0x11,0x11,0x00,0x11,0x11,0x11,0x11,0x0C,0x13,0x11,0x11,0x11,
+	0x11,0x08,0x13,0x11,0x11,0x11,0x07,0x08,0x07,0x11,0x11,0x11,0x00,0x08,0x00,0x00,
+	0x00,0x00,0x08,0x11,0x11,0x11,0x1D,0x00,0x18,0x13,0x11,0x11,0x11,0x00,0x13,0x11,
+	0x11,0x11,0x08,0x04,0x11,0x11,0x11,0x11,0x04,0x00,0x08,0x10,0x11,0x11,0x11,0x16,
+	0x1C,0x10,0x11,0x11,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0F,
+	0x0F,0x0F,0x0F,0x07,0x19,0x04,0x13,0x11,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x1A,0x00,
+	0x00,0x20,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x1F,0x0F,0x0F,0x0F,0x0F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAD,0xBA,0xBA,
+	0xBA,0xBC,0xAE,0x9F,0xAE,0xBD,0xFF,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,
+	0xAB,0xAC,0xAD,0xAE,0xAE,0xAE,0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x99,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4D,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x16,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x19,
+	0x0F,0x0F,0x0F,0x11,0x23,0x23,0x0F,0x0F,0x0F,0x0F,0x1A,0x04,0x16,0x0F,0x0F,0x0F,
+	0x32,0x00,0x0F,0x0F,0x0F,0x16,0x00,0x00,0x00,0x00,0x1F,0x0F,0x0F,0x0F,0x00,0x00,
+	0x00,0x18,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x18,0x0F,0x07,0x07,0x0F,0x0F,0x0F,0x0F,
+	0x18,0x08,0x00,0x07,0x07,0x0F,0x07,0x00,0x00,0x17,0x07,0x07,0x07,0x07,0x07,0x08,
+	0x00,0x00,0x19,0x1A,0x07,0x13,0x19,0x00,0x07,0x00,0x07,0x07,0x07,0x00,0x08,0x08,
+	0x07,0x08,0x00,0x08,0x08,0x07,0x07,0x0F,0x08,0x00,0x08,0x18,0x07,0x07,0x0F,0x08,
+	0x00,0x18,0x07,0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x1E,0x07,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xBC,0xBA,0xB9,
+	0xBB,0xBE,0xAF,0x9F,0xAE,0xAE,0xAE,0xAE,0xAE,0xAE,0xAD,0xBC,0xBA,0xBA,0xBC,0xAB,
+	0xAD,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x99,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4D,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x07,
+	0x00,0x00,0x00,0x17,0x21,0x33,0x00,0x00,0x00,0x00,0x16,0x1F,0x00,0x00,0x00,0x00,
+	0x07,0x00,0x00,0x00,0x1D,0x14,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00,0x2A,0x11,0x00,0x0F,0x1F,0x00,0x00,0x00,
+	0x08,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,
+	0x00,0x00,0x17,0x00,0x00,0x00,0x14,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x19,0x00,0x00,0x17,0x00,0x00,0x00,0x1D,0x07,0x00,0x1D,0x00,0x00,0x00,0x08,0x1C,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x07,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x1E,0x1A,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAC,0xBC,0xBB,0xAA,
+	0xAB,0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAB,0xBC,0xAA,0xBC,0xAC,0xAE,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x99,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4D,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x19,0x2D,0x2D,0x2D,0x2F,0x00,0x2D,0x2D,0x2D,0x2D,0x00,0x2D,
+	0x2D,0x2D,0x2F,0x00,0x26,0x32,0x2D,0x2D,0x2D,0x00,0x12,0x1E,0x2D,0x2D,0x2D,0x00,
+	0x13,0x00,0x2D,0x2B,0x00,0x12,0x00,0x00,0x00,0x00,0x19,0x2B,0x2B,0x2B,0x00,0x00,
+	0x00,0x18,0x2B,0x2B,0x2B,0x00,0x00,0x2A,0x0F,0x00,0x00,0x12,0x2B,0x2B,0x2B,0x00,
+	0x08,0x00,0x2B,0x2B,0x2B,0x00,0x07,0x00,0x00,0x00,0x2B,0x2B,0x2B,0x2B,0x2B,0x1A,
+	0x17,0x00,0x18,0x2B,0x2B,0x2B,0x07,0x00,0x13,0x2B,0x2B,0x2B,0x2B,0x00,0x2A,0x07,
+	0x00,0x00,0x00,0x12,0x2B,0x2B,0x2B,0x00,0x0F,0x00,0x1C,0x2B,0x2B,0x2B,0x08,0x00,
+	0x00,0x2B,0x2B,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x19,0x07,0x08,0x1D,0x12,
+	0x2A,0x2A,0x2A,0x2A,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x2C,0x2A,0x2A,0x2A,0x2A,0x00,0x00,0x00,0x1C,0x2A,0x2A,0x2A,0x2A,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAA,0xAA,0xAA,0xAA,
+	0xAC,0xAF,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAB,0xAA,0xAA,0xAA,0xAA,0xAE,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x99,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x4F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4D,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x1A,0x28,0x27,0x27,0x27,0x2E,0x25,0x27,0x27,0x25,0x2E,0x27,
+	0x27,0x27,0x27,0x0F,0x00,0x07,0x25,0x23,0x24,0x23,0x0F,0x08,0x04,0x25,0x28,0x26,
+	0x11,0x00,0x24,0x28,0x28,0x10,0x00,0x00,0x00,0x00,0x17,0x28,0x28,0x28,0x1E,0x00,
+	0x00,0x1C,0x28,0x28,0x28,0x28,0x28,0x0F,0x00,0x00,0x00,0x17,0x28,0x28,0x28,0x28,
+	0x08,0x00,0x28,0x28,0x28,0x28,0x17,0x00,0x00,0x00,0x00,0x19,0x28,0x28,0x28,0x28,
+	0x07,0x00,0x1A,0x28,0x28,0x28,0x1A,0x00,0x16,0x28,0x28,0x28,0x28,0x28,0x19,0x00,
+	0x00,0x00,0x00,0x11,0x28,0x28,0x28,0x28,0x07,0x00,0x19,0x28,0x28,0x28,0x1C,0x00,
+	0x00,0x28,0x28,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x07,0x26,0x17,0x00,0x00,0x0F,
+	0x26,0x26,0x26,0x26,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x2A,0x26,0x26,0x26,0x26,0x00,0x00,0x07,0x26,0x26,0x26,0x26,0x26,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAC,0xA9,0xA9,0xA9,0xAA,
+	0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAB,0xA9,0xA9,0xA9,0xA9,0xAC,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x4D,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x4E,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x08,0x27,0x27,0x27,0x27,0x27,0x27,0x2B,0x27,0x27,0x27,0x27,
+	0x27,0x27,0x18,0x08,0x00,0x16,0x27,0x27,0x27,0x27,0x0F,0x18,0x04,0x27,0x04,0x04,
+	0x0F,0x00,0x04,0x25,0x25,0x07,0x0F,0x07,0x1E,0x00,0x07,0x25,0x25,0x25,0x1C,0x00,
+	0x00,0x1E,0x25,0x25,0x25,0x25,0x0F,0x00,0x00,0x00,0x1E,0x1A,0x25,0x25,0x25,0x25,
+	0x08,0x00,0x25,0x25,0x25,0x25,0x1A,0x00,0x00,0x07,0x0F,0x17,0x25,0x25,0x25,0x25,
+	0x07,0x00,0x1C,0x25,0x25,0x25,0x17,0x00,0x18,0x25,0x25,0x25,0x25,0x25,0x18,0x00,
+	0x00,0x00,0x00,0x07,0x25,0x25,0x25,0x25,0x07,0x00,0x07,0x25,0x25,0x25,0x17,0x00,
+	0x00,0x25,0x25,0x25,0x18,0x00,0x00,0x00,0x00,0x00,0x07,0x22,0x22,0x17,0x00,0x11,
+	0x22,0x22,0x22,0x22,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x08,0x07,0x22,0x22,0x22,0x22,0x00,0x12,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x87,0xA8,0xA8,0xA8,0xAB,
+	0xAE,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAB,0xA8,0xA8,0xA8,0xA8,0xA8,0xAE,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x49,0x47,0x47,0x47,0x47,
+	0x47,0x49,0x4E,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x08,0x24,0x24,0x24,0x24,0x24,0x24,0x00,0x24,0x24,0x24,0x24,
+	0x24,0x24,0x17,0x00,0x00,0x18,0x24,0x24,0x24,0x24,0x12,0x36,0x24,0x24,0x24,0x24,
+	0x07,0x1E,0x24,0x22,0x22,0x22,0x22,0x22,0x33,0x00,0x0F,0x22,0x22,0x22,0x1A,0x00,
+	0x00,0x00,0x22,0x22,0x22,0x22,0x07,0x0F,0x18,0x00,0x1E,0x08,0x23,0x23,0x23,0x23,
+	0x07,0x08,0x23,0x23,0x23,0x23,0x08,0x00,0x07,0x23,0x23,0x08,0x23,0x23,0x23,0x23,
+	0x13,0x00,0x1C,0x23,0x23,0x23,0x12,0x08,0x1A,0x22,0x22,0x22,0x22,0x23,0x0F,0x13,
+	0x18,0x22,0x08,0x18,0x23,0x23,0x23,0x23,0x07,0x00,0x19,0x23,0x23,0x23,0x11,0x00,
+	0x00,0x23,0x23,0x23,0x12,0x07,0x00,0x00,0x00,0x00,0x17,0x35,0x35,0x35,0x08,0x13,
+	0x35,0x35,0x35,0x35,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x35,0x35,0x35,0x35,0x35,0x35,0x19,0x35,0x35,0x35,0x35,0x35,0x35,0x1C,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x86,0x8C,0x8C,0x8C,0xAC,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAB,0x8C,0x8C,0x8C,0x8C,0x8C,0xAB,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x49,0x47,0x47,0x47,0x47,0x47,
+	0x47,0x4C,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x08,0x36,0x36,0x36,0x36,0x36,0x26,0x00,0x36,0x36,0x36,0x36,
+	0x36,0x16,0x00,0x00,0x00,0x1A,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x18,
+	0x00,0x1D,0x36,0x35,0x35,0x35,0x35,0x35,0x33,0x00,0x16,0x35,0x35,0x35,0x18,0x00,
+	0x00,0x1D,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x1E,0x08,0x35,0x35,0x35,0x35,
+	0x35,0x08,0x35,0x35,0x35,0x35,0x35,0x00,0x25,0x35,0x35,0x35,0x35,0x35,0x35,0x1A,
+	0x07,0x1D,0x1C,0x35,0x35,0x35,0x35,0x1A,0x08,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+	0x35,0x08,0x1E,0x08,0x35,0x35,0x35,0x35,0x35,0x08,0x00,0x35,0x35,0x35,0x35,0x08,
+	0x00,0x35,0x35,0x35,0x35,0x08,0x00,0x00,0x00,0x00,0x18,0x34,0x34,0x34,0x0C,0x34,
+	0x34,0x34,0x34,0x34,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x0C,0x1C,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x85,0x8B,0x8B,0x8B,0xAC,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0xAA,0x85,0x8B,0x8B,0x8B,0x8B,0x85,0xAE,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x4D,0x49,0x47,0x47,0x47,0x47,0x47,0x47,
+	0x49,0x4E,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x1C,0x34,0x34,0x34,0x34,0x34,0x34,0x1D,0x00,0x00,0x34,0x34,0x34,
+	0x18,0x00,0x00,0x00,0x00,0x1D,0x1D,0x34,0x34,0x34,0x34,0x34,0x34,0x0C,0x07,0x00,
+	0x00,0x1C,0x0C,0x33,0x33,0x33,0x33,0x33,0x07,0x00,0x18,0x33,0x33,0x33,0x16,0x00,
+	0x00,0x08,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x08,0x1E,0x00,0x08,0x33,0x33,0x33,
+	0x19,0x00,0x19,0x33,0x33,0x33,0x18,0x00,0x08,0x1E,0x33,0x33,0x07,0x08,0x1E,0x00,
+	0x00,0x1D,0x1A,0x33,0x33,0x33,0x07,0x00,0x1C,0x1C,0x33,0x33,0x33,0x33,0x33,0x33,
+	0x33,0x07,0x00,0x00,0x20,0x33,0x33,0x33,0x18,0x08,0x00,0x33,0x33,0x33,0x08,0x08,
+	0x00,0x33,0x33,0x33,0x08,0x00,0x00,0x00,0x00,0x00,0x16,0x32,0x32,0x32,0x32,0x32,
+	0x32,0x32,0x32,0x32,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,
+	0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x1C,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x84,0x83,0x83,0x83,0xAB,
+	0xAE,0xAF,0xAF,0xAE,0xAA,0x85,0x82,0x83,0x82,0x83,0x83,0x87,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,
+	0x4E,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x19,0x08,0x1C,0x1D,0x1E,0x1F,0x1C,0x00,0x00,0x1F,0x1D,0x1C,0x08,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x08,0x1D,0x1E,0x1F,0x00,0x1E,0x07,0x00,0x00,
+	0x00,0x1D,0x18,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x1A,0x32,0x32,0x32,0x18,0x00,
+	0x00,0x00,0x1C,0x18,0x07,0x08,0x1C,0x1E,0x1E,0x1E,0x00,0x00,0x1D,0x1E,0x17,0x07,
+	0x00,0x00,0x1D,0x1E,0x17,0x07,0x00,0x00,0x00,0x00,0x1F,0x18,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x1D,0x18,0x18,0x00,0x00,0x00,0x1C,0x08,0x18,0x18,0x18,0x18,0x18,
+	0x18,0x08,0x00,0x00,0x1D,0x18,0x18,0x18,0x00,0x00,0x00,0x1D,0x18,0x08,0x00,0x00,
+	0x00,0x19,0x18,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x30,0x30,0x30,0x30,
+	0x07,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,
+	0x07,0x18,0x1C,0x1E,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x83,0x83,0x83,0x83,0x86,
+	0xAA,0xAC,0xAB,0x87,0x85,0x83,0x82,0x83,0x83,0x83,0x84,0xAE,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x2B,0x2A,0x2C,0x2C,0x2B,0x2A,0x2A,0x2C,0x2B,0x2C,0x2A,0x2C,0x2B,0x2B,0x2B,0x2B,
+	0x2B,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,0x4D,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x2F,0x2D,
+	0x2C,0x2B,0x2B,0x2C,0x2C,0x2C,0x2D,0x2D,0x2C,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x19,0x08,0x19,0x31,0x31,0x31,0x1A,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x10,0x12,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+	0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2D,0x2B,0x29,0x29,0x28,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x85,0x82,0x82,0x82,0x84,
+	0x85,0x85,0x84,0x84,0x82,0x82,0x84,0x86,0x83,0x83,0x87,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x2C,0x2B,0x28,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,0x4D,0x4E,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x08,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x12,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,
+	0x00,0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAC,0xF6,0x83,0xF6,0x83,
+	0xF6,0x83,0xF6,0xF6,0x84,0x86,0xAC,0x85,0xF6,0x84,0xAD,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x00,0x00,0x00,0x00,
+	0x24,0x24,0x25,0x22,0x24,0x25,0x21,0x24,0x21,0x23,0x28,0x24,0x21,0x25,0x25,0x22,
+	0x26,0x9A,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x47,0x47,0x9F,0x9F,0x47,0x47,0x47,0x47,
+	0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x49,0x4A,0x4D,0x4E,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x29,
+	0x28,0x26,0x04,0x04,0x25,0x25,0x23,0x28,0x23,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x08,0x30,0x30,0x30,0x30,0x30,0x30,0x14,0x22,0x28,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x1D,0x00,
+	0x1D,0x00,0x1D,0x00,0x2B,0x29,0x28,0x28,0x25,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x86,0xF7,0xF7,0xF7,
+	0xF7,0xF7,0xF7,0xF7,0x87,0x9F,0xAC,0xF7,0xF7,0x86,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x28,0x20,0x29,
+	0x21,0x24,0x26,0x21,0x28,0x04,0x26,0x24,0x22,0x04,0x22,0x25,0x24,0x23,0x24,0x24,
+	0x24,0x9B,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x29,
+	0x25,0x23,0x24,0x24,0x25,0x25,0x23,0x28,0x25,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x1C,0x25,0x25,0x25,0x25,0x32,0x30,0x33,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x1D,0x00,0x2A,0x2A,0x25,0x28,0x26,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x87,0x7C,0x7C,
+	0x7C,0x7C,0x7C,0x87,0x9F,0x9F,0x87,0x7C,0x7C,0xAC,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x29,0x24,0x29,
+	0x28,0x23,0x24,0x22,0x23,0x26,0x21,0x24,0x22,0x22,0x25,0x24,0x23,0x22,0x25,0x25,
+	0x24,0x9B,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x28,
+	0x24,0x28,0x25,0x22,0x21,0x25,0x21,0x22,0x26,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x1E,0x1E,0x00,0x00,0x00,0x2A,0x1A,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2C,0x29,0x28,0x26,0x25,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0xAC,0x87,
+	0x87,0x87,0xAC,0x9F,0x9F,0xAC,0xFC,0xFC,0x87,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x27,0x04,0x29,
+	0x24,0x23,0x24,0x23,0x22,0x25,0x23,0x04,0x24,0x25,0x24,0x25,0x23,0x04,0x25,0x04,
+	0x24,0x9B,0x9F,0x9F,0x4C,0x47,0x47,0x9F,0x9F,0x4C,0x47,0x4C,0x9F,0x9F,0x47,0x47,
+	0x9F,0x9F,0x47,0x47,0x47,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x47,0x47,
+	0x9F,0x9F,0x9F,0x47,0x47,0x4C,0x9F,0x9F,0x9F,0x47,0x47,0x9F,0x9F,0x9F,0x2B,0x2A,
+	0x04,0x22,0x23,0x22,0x26,0x22,0x26,0x25,0x28,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2B,0x29,0x04,0x24,0x04,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x87,0x7D,0x7D,0xAC,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2A,0x2A,0x24,0x29,
+	0x28,0x24,0x23,0x25,0x22,0x22,0x21,0x22,0x24,0x22,0x23,0x23,0x23,0x24,0x22,0x25,
+	0x28,0x9B,0x9F,0x9F,0x47,0x4B,0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x47,0x9F,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x9F,0x2C,0x2A,
+	0x23,0x24,0x25,0x24,0x25,0x23,0x26,0x25,0x04,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,
+	0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x1D,0x1D,0x00,
+	0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x1D,0x1D,0x1D,
+	0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,
+	0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2A,0x28,0x26,0x04,0x26,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0xAC,0x6B,0x6B,0x87,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x2A,0x29,0x29,
+	0x26,0x22,0x22,0x04,0x24,0x25,0x21,0x23,0x22,0x24,0x24,0x04,0x26,0x25,0x25,0x23,
+	0x26,0x9B,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x47,0x47,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x47,0x47,0x47,
+	0x9F,0x9F,0x9F,0x47,0x47,0x9F,0x9F,0x9F,0x9F,0x47,0x47,0x9F,0x9F,0x9F,0x2A,0x2A,
+	0x22,0x22,0x24,0x25,0x22,0x20,0x22,0x22,0x25,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x1D,0x00,0x00,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x1D,
+	0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x00,0x00,0x1D,0x1D,0x00,
+	0x1D,0x00,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,
+	0x1D,0x00,0x1D,0x00,0x00,0x1F,0x1D,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x1D,
+	0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x00,0x00,0x1D,
+	0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2A,0x28,0x26,0x25,0x25,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x6B,0x6B,0x6B,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2C,0x2A,0x04,0x29,
+	0x24,0x23,0x23,0x25,0x26,0x24,0x23,0x24,0x23,0x24,0x04,0x25,0x25,0x24,0x23,0x04,
+	0x24,0x9B,0x9F,0x9F,0x9F,0x4D,0x47,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x47,0x9F,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x9F,0x2A,0x2A,
+	0x22,0x20,0x25,0x22,0x26,0x23,0x04,0x23,0x28,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x1F,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,
+	0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1F,0x1D,0x00,0x00,
+	0x1D,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x00,0x00,0x1D,0x00,0x00,0x1D,0x00,0x1D,0x00,
+	0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x00,0x00,
+	0x1D,0x00,0x1D,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x1D,0x1D,0x00,
+	0x1D,0x1D,0x1D,0x00,0x1F,0x1D,0x1F,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x00,
+	0x1D,0x00,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x1D,
+	0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x1D,
+	0x00,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,
+	0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1F,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2A,0x27,0x04,0x23,0x24,0x9A,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x7F,0x6B,0x6B,0x7E,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2C,0x2A,0x26,0x29,
+	0x28,0x23,0x24,0x24,0x23,0x22,0x22,0x22,0x23,0x22,0x04,0x28,0x24,0x26,0x28,0x26,
+	0x23,0x9C,0x9F,0x9F,0x9F,0x4B,0x47,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x47,0x9F,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x47,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x9F,0x2C,0x28,
+	0x22,0x22,0x25,0x23,0x23,0x22,0x23,0x25,0x22,0x1E,0x00,0x00,0x18,0x08,0x1D,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,
+	0x1F,0x00,0x00,0x1D,0x00,0x1D,0x00,0x00,0x00,0x1D,0x00,0x00,0x1D,0x00,0x1D,0x1D,
+	0x00,0x00,0x00,0x1D,0x00,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,
+	0x1D,0x1D,0x1D,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x1D,0x00,0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x00,
+	0x1D,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x00,0x00,0x1D,
+	0x00,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,
+	0x08,0x1D,0x00,0x00,0x2C,0x29,0x20,0x24,0x24,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x6C,0x6C,0x6C,0x7F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2C,0x2A,0x28,0x29,
+	0x22,0x28,0x26,0x28,0x26,0x28,0x28,0x25,0x22,0x25,0x04,0x28,0x26,0x25,0x28,0x24,
+	0x26,0x9C,0x9F,0x9F,0x47,0x47,0x4C,0x9F,0x9F,0x4C,0x47,0x4C,0x9F,0x9F,0x47,0x9F,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x9F,0x47,
+	0x9F,0x9F,0x9F,0x47,0x9F,0x47,0x9F,0x9F,0x9F,0x47,0x47,0x9F,0x9F,0x9F,0x2B,0x2A,
+	0x20,0x22,0x22,0x22,0x26,0x22,0x24,0x26,0x24,0x1E,0x00,0x00,0x08,0x1D,0x1F,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,
+	0x1D,0x1D,0x00,0x1D,0x00,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x1D,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x00,0x1D,0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x00,0x1D,0x1D,0x00,
+	0x1D,0x00,0x1D,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,0x1D,0x1D,
+	0x00,0x00,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x1D,0x1D,0x00,0x1D,0x00,0x00,0x00,0x1D,
+	0x00,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x00,0x1D,0x1D,
+	0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+	0x1D,0x1F,0x00,0x00,0x2C,0x2A,0x26,0x25,0x22,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x6D,0x6D,0x6D,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x28,0x28,0x29,
+	0x28,0x24,0x25,0x28,0x28,0x24,0x28,0x28,0x28,0x26,0x23,0x04,0x25,0x26,0x25,0x04,
+	0x28,0x9C,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x27,
+	0x22,0x24,0x20,0x20,0x26,0x20,0x24,0x22,0x20,0x1E,0x00,0x00,0x1D,0x1F,0x1F,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0x00,
+	0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,
+	0x1F,0x1F,0x00,0x00,0x2B,0x2A,0x04,0x04,0x25,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2C,0x2B,0x24,0x29,
+	0x28,0x25,0x26,0x25,0x25,0x24,0x25,0x24,0x25,0x25,0x23,0x26,0x04,0x25,0x25,0x24,
+	0x25,0x9C,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x2A,
+	0x25,0x28,0x22,0x25,0x24,0x22,0x20,0x24,0x22,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,
+	0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2C,0x2A,0x26,0x28,0x28,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2C,0x2A,0x25,0x29,
+	0x22,0x25,0x25,0x25,0x23,0x22,0x25,0x25,0x22,0x28,0x25,0x25,0x28,0x25,0x23,0x28,
+	0x28,0x9C,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x29,
+	0x26,0x28,0x25,0x24,0x23,0x26,0x22,0x25,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x00,0x00,0x00,0x2A,0x2B,0x23,0x24,0x26,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,
+	0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x2B,0x29,0x28,0x29,
+	0x23,0x22,0x22,0x25,0x25,0x25,0x22,0x25,0x23,0x26,0x28,0x22,0x25,0x23,0x28,0x28,
+	0x26,0x22,0x2D,0x2A,0x2A,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2A,0x2B,0x2C,0x2A,0x2A,
+	0x2C,0x2B,0x2A,0x2C,0x2B,0x2A,0x2A,0x2C,0x2A,0x2B,0x2B,0x2A,0x2A,0x2A,0x2B,0x2B,
+	0x2A,0x2A,0x2B,0x2A,0x2B,0x2B,0x2A,0x2B,0x2C,0x2B,0x2A,0x2A,0x2C,0x2A,0x2C,0x29,
+	0x26,0x23,0x25,0x25,0x23,0x25,0x22,0x25,0x23,0x25,0x2B,0x2A,0x2B,0x2B,0x2A,0x2A,
+	0x2A,0x2A,0x2A,0x2C,0x2A,0x2A,0x2A,0x2A,0x2B,0x2A,0x29,0x29,0x2A,0x2A,0x2A,0x2A,
+	0x2C,0x2A,0x2B,0x2A,0x2B,0x2A,0x2A,0x2B,0x2C,0x2C,0x2A,0x2B,0x2C,0x2B,0x2B,0x2B,
+	0x2C,0x2C,0x2C,0x2D,0x2D,0x2D,0x2C,0x2D,0x2C,0x2C,0x2B,0x2B,0x2B,0x2C,0x2B,0x2C,
+	0x2A,0x2B,0x2A,0x2B,0x2C,0x2A,0x2C,0x2B,0x2C,0x2B,0x2C,0x2C,0x2C,0x2B,0x2C,0x2B,
+	0x2B,0x2C,0x2B,0x2B,0x29,0x2A,0x2B,0x2C,0x2C,0x2C,0x2C,0x2C,0x2B,0x2A,0x2B,0x2C,
+	0x2C,0x2D,0x2C,0x2C,0x2C,0x2C,0x2C,0x2D,0x2C,0x2C,0x2C,0x2D,0x2C,0x2C,0x2C,0x2C,
+	0x2C,0x2D,0x2C,0x2C,0x2D,0x2C,0x2C,0x2B,0x2C,0x2C,0x2C,0x2B,0x2B,0x2B,0x2B,0x2C,
+	0x2C,0x2A,0x2C,0x2C,0x2D,0x2C,0x2B,0x2C,0x2B,0x2C,0x2C,0x2B,0x2B,0x2B,0x2C,0x2B,
+	0x2B,0x2C,0x29,0x2C,0x2B,0x2C,0x2B,0x2C,0x2C,0x2C,0x2B,0x2B,0x2C,0x2A,0x2C,0x2B,
+	0x2B,0x2C,0x2B,0x2A,0x2A,0x2A,0x2B,0x29,0x2A,0x2A,0x2B,0x2A,0x2A,0x2A,0x2B,0x2C,
+	0x2B,0x2C,0x2C,0x2B,0x2C,0x2A,0x22,0x22,0x04,0x26,0x29,0x2D,0x2C,0x2A,0x2C,0x2B,
+	0x2B,0x2C,0x2C,0x2C,0x2C,0x2B,0x2C,0x2B,0x2C,0x2B,0x2C,0x2B,0x2B,0x2C,0x2B,0x2A,
+	0x2B,0x2C,0x2B,0x2B,0x2B,0x2A,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2B,0x2B,0x2C,0x2B,
+	0x2B,0x2B,0x2C,0x2B,0x2C,0x2A,0x2B,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2B,0x2B,0x2B,
+	0x2B,0x2C,0x2B,0x2C,0x2C,0x2B,0x2C,0x2C,0x2C,0x2C,0x2B,0x2C,0x2E,0x2A,0x28,0x29,
+	0x22,0x04,0x28,0x21,0x25,0x23,0x25,0x25,0x25,0x22,0x20,0x25,0x23,0x22,0x22,0x23,
+	0x24,0x26,0x23,0x28,0x2D,0x28,0x29,0x2A,0x2A,0x29,0x29,0x2A,0x2A,0x2A,0x28,0x2A,
+	0x29,0x29,0x29,0x29,0x28,0x28,0x29,0x2A,0x29,0x29,0x2A,0x29,0x2A,0x2A,0x2A,0x2A,
+	0x28,0x29,0x2A,0x28,0x27,0x28,0x28,0x29,0x28,0x29,0x29,0x29,0x29,0x29,0x28,0x2A,
+	0x25,0x25,0x25,0x22,0x26,0x22,0x22,0x23,0x22,0x25,0x24,0x29,0x2B,0x28,0x27,0x28,
+	0x29,0x28,0x28,0x29,0x29,0x27,0x2A,0x27,0x26,0x27,0x28,0x27,0x27,0x27,0x04,0x28,
+	0x2A,0x2A,0x28,0x2A,0x29,0x29,0x29,0x28,0x28,0x28,0x29,0x29,0x27,0x28,0x2A,0x2A,
+	0x29,0x2A,0x28,0x2A,0x2A,0x2A,0x2A,0x2A,0x28,0x28,0x29,0x2A,0x2A,0x2A,0x2C,0x29,
+	0x28,0x29,0x28,0x28,0x2A,0x2A,0x2A,0x2A,0x27,0x28,0x29,0x2A,0x2A,0x29,0x2A,0x29,
+	0x29,0x2A,0x29,0x27,0x26,0x2A,0x29,0x2A,0x29,0x29,0x2A,0x29,0x28,0x2A,0x28,0x27,
+	0x2A,0x2A,0x2A,0x29,0x2A,0x28,0x2A,0x2A,0x2A,0x2A,0x28,0x29,0x2A,0x29,0x29,0x2A,
+	0x29,0x29,0x29,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x29,0x29,0x29,0x2A,0x2A,0x29,0x29,
+	0x29,0x2A,0x29,0x29,0x2C,0x28,0x2A,0x29,0x2A,0x29,0x28,0x29,0x28,0x28,0x2A,0x29,
+	0x29,0x28,0x27,0x29,0x2A,0x2A,0x29,0x2A,0x29,0x29,0x29,0x28,0x2A,0x29,0x29,0x2A,
+	0x29,0x29,0x27,0x27,0x26,0x29,0x29,0x28,0x29,0x2A,0x29,0x29,0x29,0x29,0x2A,0x2A,
+	0x29,0x2A,0x29,0x2A,0x28,0x2B,0x28,0x24,0x25,0x24,0x04,0x28,0x28,0x2D,0x2A,0x29,
+	0x2A,0x2A,0x29,0x2A,0x2A,0x2A,0x29,0x2A,0x2A,0x2A,0x2A,0x29,0x2A,0x29,0x29,0x29,
+	0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x29,0x29,0x29,0x2A,0x29,0x2A,0x29,0x2A,0x29,0x29,
+	0x28,0x2A,0x2A,0x29,0x29,0x2A,0x2A,0x2A,0x2A,0x28,0x29,0x2A,0x28,0x2A,0x2A,0x2A,
+	0x2B,0x2A,0x2A,0x2A,0x2A,0x2B,0x2A,0x2A,0x2A,0x29,0x2A,0x29,0x2A,0x2A,0x28,0x29,
+	0x24,0x20,0x25,0x25,0x24,0x24,0x20,0x22,0x23,0x25,0x23,0x26,0x25,0x25,0x23,0x20,
+	0x24,0x21,0x22,0x25,0x24,0x23,0x23,0x25,0x04,0x22,0x28,0x26,0x26,0x26,0x04,0x25,
+	0x26,0x26,0x28,0x25,0x28,0x28,0x22,0x04,0x22,0x26,0x24,0x25,0x26,0x25,0x26,0x25,
+	0x04,0x22,0x25,0x22,0x23,0x23,0x04,0x23,0x25,0x22,0x23,0x23,0x28,0x22,0x23,0x24,
+	0x24,0x24,0x04,0x22,0x25,0x23,0x25,0x22,0x24,0x25,0x25,0x24,0x24,0x22,0x21,0x25,
+	0x23,0x25,0x23,0x04,0x24,0x28,0x04,0x25,0x22,0x22,0x26,0x24,0x24,0x23,0x25,0x25,
+	0x24,0x04,0x23,0x25,0x23,0x20,0x23,0x22,0x20,0x24,0x22,0x25,0x25,0x24,0x25,0x26,
+	0x25,0x26,0x04,0x25,0x25,0x25,0x25,0x28,0x24,0x25,0x26,0x24,0x28,0x28,0x25,0x25,
+	0x25,0x04,0x25,0x28,0x24,0x04,0x23,0x28,0x24,0x23,0x25,0x25,0x26,0x28,0x28,0x04,
+	0x26,0x24,0x24,0x23,0x25,0x28,0x25,0x26,0x04,0x28,0x28,0x28,0x04,0x25,0x23,0x26,
+	0x25,0x25,0x04,0x26,0x26,0x25,0x23,0x28,0x25,0x25,0x23,0x24,0x23,0x26,0x26,0x28,
+	0x26,0x28,0x28,0x28,0x25,0x04,0x04,0x28,0x28,0x25,0x28,0x04,0x26,0x28,0x28,0x04,
+	0x28,0x28,0x28,0x04,0x28,0x28,0x04,0x28,0x04,0x26,0x25,0x23,0x24,0x26,0x24,0x26,
+	0x24,0x22,0x04,0x26,0x04,0x28,0x04,0x04,0x25,0x26,0x24,0x26,0x22,0x24,0x26,0x26,
+	0x28,0x25,0x24,0x24,0x28,0x04,0x26,0x25,0x25,0x26,0x04,0x28,0x04,0x04,0x28,0x26,
+	0x28,0x04,0x25,0x26,0x04,0x22,0x24,0x24,0x26,0x28,0x26,0x24,0x24,0x24,0x04,0x04,
+	0x04,0x26,0x25,0x23,0x25,0x26,0x28,0x04,0x04,0x28,0x26,0x28,0x28,0x28,0x28,0x27,
+	0x28,0x25,0x29,0x25,0x28,0x28,0x26,0x25,0x26,0x26,0x28,0x24,0x26,0x28,0x04,0x28,
+	0x04,0x04,0x04,0x04,0x28,0x28,0x28,0x26,0x04,0x25,0x28,0x28,0x25,0x24,0x28,0x29,
+	0x28,0x25,0x28,0x25,0x28,0x26,0x04,0x27,0x27,0x28,0x27,0x27,0x27,0x28,0x04,0x29,
+	0x23,0x26,0x26,0x04,0x25,0x04,0x26,0x25,0x25,0x23,0x25,0x26,0x25,0x28,0x23,0x22,
+	0x20,0x24,0x25,0x25,0x21,0x26,0x23,0x28,0x24,0x28,0x25,0x28,0x28,0x25,0x04,0x04,
+	0x04,0x24,0x25,0x25,0x24,0x26,0x24,0x28,0x04,0x26,0x25,0x04,0x26,0x25,0x25,0x25,
+	0x21,0x28,0x24,0x23,0x26,0x24,0x24,0x25,0x25,0x23,0x23,0x26,0x23,0x22,0x25,0x28,
+	0x25,0x23,0x24,0x25,0x22,0x04,0x23,0x04,0x22,0x23,0x24,0x24,0x23,0x04,0x24,0x26,
+	0x25,0x23,0x25,0x04,0x22,0x26,0x28,0x23,0x23,0x23,0x25,0x04,0x23,0x22,0x20,0x22,
+	0x20,0x22,0x22,0x04,0x22,0x24,0x24,0x24,0x23,0x23,0x04,0x24,0x22,0x23,0x20,0x20,
+	0x22,0x20,0x23,0x23,0x22,0x21,0x28,0x25,0x24,0x25,0x25,0x25,0x22,0x28,0x28,0x25,
+	0x28,0x28,0x24,0x24,0x25,0x04,0x25,0x25,0x23,0x21,0x22,0x25,0x24,0x25,0x23,0x25,
+	0x25,0x24,0x22,0x22,0x25,0x04,0x25,0x04,0x04,0x28,0x23,0x25,0x04,0x25,0x28,0x24,
+	0x25,0x24,0x04,0x22,0x26,0x25,0x25,0x26,0x25,0x24,0x26,0x26,0x26,0x28,0x28,0x24,
+	0x04,0x27,0x25,0x25,0x29,0x28,0x04,0x29,0x28,0x04,0x28,0x28,0x24,0x28,0x28,0x28,
+	0x28,0x04,0x28,0x28,0x04,0x28,0x25,0x24,0x24,0x25,0x25,0x25,0x04,0x25,0x22,0x22,
+	0x23,0x24,0x28,0x24,0x26,0x25,0x28,0x25,0x26,0x24,0x28,0x04,0x24,0x26,0x22,0x25,
+	0x22,0x22,0x25,0x24,0x25,0x26,0x25,0x28,0x25,0x04,0x25,0x24,0x26,0x26,0x28,0x28,
+	0x25,0x26,0x25,0x25,0x25,0x26,0x04,0x25,0x25,0x04,0x28,0x28,0x28,0x26,0x26,0x26,
+	0x28,0x24,0x25,0x25,0x25,0x25,0x26,0x28,0x26,0x26,0x04,0x25,0x04,0x25,0x25,0x28,
+	0x28,0x2A,0x28,0x28,0x28,0x28,0x28,0x25,0x04,0x26,0x28,0x24,0x26,0x27,0x28,0x28,
+	0x28,0x28,0x04,0x28,0x28,0x24,0x28,0x26,0x04,0x28,0x25,0x29,0x04,0x26,0x04,0x25,
+	0x28,0x28,0x28,0x04,0x26,0x24,0x26,0x28,0x04,0x28,0x04,0x28,0x04,0x04,0x25,0x29,
+	0x24,0x28,0x26,0x28,0x26,0x26,0x25,0x26,0x22,0x28,0x23,0x25,0x25,0x22,0x22,0x20,
+	0x24,0x04,0x25,0x23,0x25,0x04,0x25,0x24,0x22,0x26,0x23,0x04,0x26,0x25,0x24,0x23,
+	0x25,0x04,0x26,0x21,0x28,0x24,0x28,0x25,0x25,0x25,0x25,0x25,0x25,0x24,0x25,0x28,
+	0x24,0x28,0x26,0x25,0x23,0x25,0x22,0x25,0x24,0x22,0x22,0x25,0x28,0x23,0x25,0x24,
+	0x04,0x25,0x24,0x24,0x28,0x25,0x23,0x22,0x25,0x26,0x22,0x25,0x23,0x22,0x25,0x24,
+	0x26,0x26,0x24,0x25,0x23,0x23,0x24,0x26,0x25,0x24,0x22,0x24,0x22,0x25,0x21,0x22,
+	0x20,0x25,0x04,0x22,0x25,0x22,0x25,0x22,0x24,0x04,0x28,0x22,0x22,0x26,0x26,0x24,
+	0x28,0x24,0x23,0x26,0x24,0x23,0x23,0x25,0x24,0x25,0x04,0x04,0x23,0x22,0x23,0x25,
+	0x23,0x23,0x28,0x24,0x21,0x22,0x25,0x24,0x24,0x22,0x22,0x23,0x26,0x24,0x20,0x04,
+	0x24,0x20,0x28,0x25,0x25,0x26,0x26,0x28,0x28,0x26,0x22,0x26,0x04,0x28,0x25,0x26,
+	0x28,0x04,0x25,0x28,0x25,0x23,0x26,0x26,0x24,0x26,0x04,0x04,0x04,0x28,0x28,0x29,
+	0x29,0x04,0x25,0x22,0x28,0x26,0x26,0x28,0x24,0x04,0x28,0x25,0x28,0x04,0x25,0x24,
+	0x25,0x28,0x28,0x29,0x24,0x25,0x24,0x28,0x04,0x26,0x26,0x26,0x22,0x24,0x22,0x24,
+	0x28,0x25,0x04,0x23,0x25,0x04,0x25,0x04,0x28,0x26,0x26,0x25,0x24,0x25,0x04,0x26,
+	0x28,0x04,0x24,0x26,0x28,0x04,0x25,0x28,0x28,0x26,0x27,0x22,0x04,0x24,0x28,0x28,
+	0x26,0x26,0x25,0x28,0x28,0x26,0x26,0x26,0x26,0x24,0x25,0x04,0x28,0x04,0x04,0x26,
+	0x28,0x27,0x23,0x24,0x26,0x24,0x28,0x26,0x28,0x28,0x28,0x29,0x29,0x26,0x29,0x29,
+	0x28,0x28,0x26,0x28,0x24,0x28,0x28,0x28,0x26,0x28,0x28,0x28,0x04,0x25,0x25,0x25,
+	0x28,0x29,0x28,0x28,0x28,0x04,0x29,0x28,0x28,0x28,0x28,0x26,0x28,0x28,0x28,0x27,
+	0x26,0x04,0x24,0x25,0x04,0x25,0x26,0x28,0x28,0x28,0x28,0x25,0x26,0x28,0x26,0x29,
+	0x28,0x04,0x25,0x26,0x23,0x22,0x24,0x23,0x04,0x25,0x28,0x28,0x28,0x23,0x21,0x24,
+	0x25,0x25,0x22,0x24,0x22,0x25,0x22,0x26,0x21,0x26,0x24,0x25,0x25,0x24,0x23,0x23,
+	0x26,0x24,0x25,0x25,0x25,0x28,0x26,0x25,0x22,0x26,0x22,0x22,0x26,0x25,0x26,0x26,
+	0x28,0x26,0x24,0x21,0x25,0x26,0x22,0x26,0x23,0x24,0x25,0x23,0x24,0x23,0x21,0x22,
+	0x23,0x25,0x26,0x25,0x25,0x22,0x26,0x22,0x23,0x23,0x24,0x04,0x28,0x25,0x25,0x28,
+	0x22,0x23,0x23,0x24,0x26,0x22,0x25,0x22,0x22,0x23,0x24,0x24,0x25,0x25,0x25,0x24,
+	0x22,0x24,0x25,0x23,0x20,0x25,0x21,0x21,0x23,0x26,0x04,0x25,0x23,0x28,0x22,0x04,
+	0x25,0x28,0x23,0x04,0x20,0x25,0x22,0x20,0x23,0x26,0x04,0x22,0x25,0x23,0x25,0x24,
+	0x24,0x24,0x23,0x25,0x22,0x22,0x22,0x25,0x25,0x22,0x22,0x20,0x22,0x20,0x22,0x26,
+	0x23,0x26,0x22,0x24,0x25,0x25,0x26,0x25,0x28,0x26,0x23,0x23,0x25,0x24,0x04,0x25,
+	0x23,0x28,0x22,0x26,0x24,0x04,0x28,0x04,0x26,0x24,0x28,0x28,0x25,0x04,0x25,0x28,
+	0x25,0x04,0x25,0x25,0x28,0x26,0x04,0x28,0x25,0x25,0x28,0x28,0x04,0x28,0x23,0x28,
+	0x22,0x28,0x28,0x25,0x24,0x28,0x26,0x24,0x26,0x04,0x28,0x23,0x24,0x25,0x25,0x25,
+	0x24,0x25,0x22,0x25,0x26,0x28,0x25,0x24,0x26,0x25,0x28,0x28,0x04,0x28,0x24,0x25,
+	0x22,0x22,0x24,0x24,0x24,0x26,0x26,0x28,0x28,0x28,0x28,0x24,0x28,0x28,0x28,0x26,
+	0x26,0x26,0x24,0x22,0x28,0x26,0x27,0x26,0x28,0x28,0x28,0x28,0x27,0x25,0x26,0x26,
+	0x28,0x28,0x26,0x28,0x25,0x28,0x04,0x28,0x04,0x28,0x28,0x28,0x28,0x26,0x28,0x25,
+	0x25,0x28,0x25,0x28,0x25,0x28,0x28,0x29,0x29,0x26,0x28,0x28,0x24,0x26,0x29,0x28,
+	0x28,0x04,0x28,0x24,0x04,0x26,0x28,0x28,0x28,0x26,0x25,0x27,0x26,0x26,0x26,0x25,
+	0x26,0x04,0x04,0x28,0x28,0x04,0x24,0x04,0x04,0x23,0x25,0x22,0x24,0x28,0x26,0x29,
+	0x28,0x28,0x23,0x28,0x24,0x28,0x25,0x28,0x26,0x22,0x22,0x24,0x24,0x25,0x25,0x24,
+	0x22,0x26,0x25,0x26,0x24,0x24,0x25,0x04,0x26,0x23,0x23,0x21,0x04,0x26,0x23,0x26,
+	0x25,0x28,0x21,0x04,0x24,0x25,0x26,0x04,0x26,0x23,0x24,0x25,0x25,0x24,0x25,0x25,
+	0x26,0x25,0x28,0x26,0x28,0x28,0x25,0x25,0x04,0x25,0x24,0x25,0x28,0x25,0x25,0x04,
+	0x22,0x25,0x22,0x21,0x22,0x22,0x24,0x23,0x22,0x24,0x22,0x21,0x25,0x21,0x22,0x23,
+	0x23,0x23,0x24,0x22,0x23,0x23,0x28,0x22,0x23,0x25,0x23,0x25,0x24,0x25,0x04,0x25,
+	0x25,0x22,0x22,0x24,0x21,0x24,0x25,0x24,0x24,0x22,0x28,0x25,0x24,0x25,0x23,0x23,
+	0x22,0x24,0x24,0x04,0x24,0x22,0x24,0x24,0x24,0x28,0x25,0x22,0x26,0x21,0x26,0x23,
+	0x24,0x23,0x24,0x22,0x26,0x22,0x25,0x20,0x23,0x25,0x23,0x24,0x26,0x25,0x28,0x25,
+	0x25,0x25,0x28,0x28,0x26,0x25,0x28,0x25,0x25,0x28,0x04,0x28,0x29,0x28,0x28,0x26,
+	0x25,0x26,0x26,0x28,0x28,0x25,0x24,0x25,0x28,0x04,0x28,0x04,0x22,0x25,0x26,0x26,
+	0x28,0x28,0x24,0x26,0x28,0x26,0x28,0x26,0x28,0x28,0x28,0x28,0x25,0x28,0x28,0x28,
+	0x28,0x25,0x04,0x28,0x25,0x26,0x26,0x26,0x04,0x26,0x25,0x25,0x24,0x24,0x04,0x04,
+	0x27,0x25,0x28,0x28,0x26,0x28,0x24,0x24,0x25,0x27,0x25,0x04,0x28,0x28,0x26,0x23,
+	0x24,0x28,0x28,0x28,0x28,0x04,0x04,0x26,0x23,0x28,0x22,0x26,0x28,0x24,0x25,0x25,
+	0x23,0x25,0x28,0x28,0x25,0x28,0x28,0x26,0x28,0x28,0x27,0x26,0x28,0x26,0x24,0x26,
+	0x28,0x28,0x28,0x28,0x2A,0x28,0x29,0x29,0x28,0x28,0x28,0x28,0x26,0x28,0x28,0x29,
+	0x23,0x28,0x26,0x28,0x28,0x04,0x28,0x04,0x28,0x28,0x28,0x28,0x04,0x26,0x04,0x28,
+	0x28,0x28,0x28,0x28,0x27,0x25,0x26,0x24,0x25,0x28,0x28,0x28,0x26,0x25,0x26,0x24,
+	0x04,0x26,0x27,0x28,0x28,0x28,0x04,0x28,0x28,0x27,0x27,0x25,0x25,0x27,0x04,0x29,
+	0x23,0x23,0x23,0x21,0x23,0x24,0x25,0x24,0x23,0x25,0x20,0x20,0x24,0x21,0x25,0x22,
+	0x25,0x25,0x22,0x24,0x23,0x24,0x26,0x22,0x24,0x23,0x26,0x25,0x24,0x25,0x22,0x23,
+	0x25,0x04,0x28,0x26,0x25,0x25,0x24,0x25,0x26,0x24,0x25,0x26,0x25,0x22,0x25,0x26,
+	0x22,0x23,0x24,0x26,0x04,0x25,0x25,0x28,0x23,0x25,0x25,0x25,0x04,0x23,0x22,0x04,
+	0x24,0x25,0x20,0x24,0x20,0x20,0x20,0x25,0x20,0x20,0x24,0x20,0x22,0x20,0x24,0x20,
+	0x25,0x20,0x25,0x20,0x24,0x20,0x23,0x25,0x24,0x23,0x24,0x28,0x24,0x25,0x25,0x23,
+	0x25,0x04,0x26,0x25,0x26,0x22,0x23,0x25,0x24,0x21,0x24,0x25,0x22,0x22,0x04,0x22,
+	0x25,0x24,0x22,0x22,0x04,0x25,0x26,0x23,0x21,0x22,0x21,0x23,0x21,0x25,0x20,0x25,
+	0x24,0x26,0x22,0x26,0x26,0x23,0x26,0x24,0x23,0x24,0x23,0x28,0x28,0x23,0x22,0x22,
+	0x26,0x04,0x28,0x04,0x26,0x04,0x24,0x28,0x28,0x26,0x25,0x28,0x27,0x04,0x28,0x29,
+	0x04,0x28,0x04,0x28,0x26,0x26,0x25,0x26,0x28,0x28,0x26,0x25,0x28,0x26,0x25,0x28,
+	0x26,0x04,0x23,0x25,0x28,0x25,0x26,0x28,0x24,0x28,0x26,0x28,0x28,0x28,0x28,0x04,
+	0x26,0x28,0x24,0x28,0x04,0x26,0x28,0x28,0x04,0x26,0x28,0x25,0x25,0x25,0x26,0x04,
+	0x24,0x04,0x28,0x28,0x25,0x28,0x04,0x28,0x28,0x28,0x28,0x28,0x26,0x25,0x28,0x22,
+	0x24,0x24,0x26,0x28,0x28,0x25,0x28,0x25,0x25,0x23,0x24,0x28,0x26,0x26,0x24,0x28,
+	0x24,0x28,0x25,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x04,0x28,0x23,0x28,0x27,0x28,
+	0x25,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x24,0x25,0x04,0x28,0x28,0x28,0x29,0x28,
+	0x25,0x29,0x25,0x26,0x25,0x28,0x25,0x28,0x29,0x29,0x29,0x28,0x28,0x04,0x28,0x28,
+	0x28,0x26,0x25,0x23,0x28,0x25,0x28,0x26,0x26,0x26,0x26,0x04,0x29,0x28,0x26,0x28,
+	0x26,0x29,0x28,0x28,0x04,0x28,0x26,0x28,0x28,0x28,0x04,0x04,0x28,0x28,0x24,0x29,
+	0x26,0x23,0x22,0x22,0x24,0x25,0x20,0x24,0x22,0x25,0x24,0x04,0x22,0x22,0x20,0x23,
+	0x24,0x24,0x24,0x04,0x23,0x04,0x25,0x22,0x25,0x23,0x25,0x26,0x24,0x24,0x23,0x24,
+	0x28,0x26,0x25,0x25,0x26,0x26,0x25,0x23,0x24,0x25,0x28,0x22,0x24,0x25,0x25,0x24,
+	0x28,0x24,0x28,0x26,0x28,0x26,0x25,0x26,0x25,0x25,0x23,0x24,0x23,0x22,0x24,0x26,
+	0x25,0x25,0x25,0x25,0x24,0x23,0x25,0x22,0x23,0x23,0x26,0x28,0x22,0x23,0x22,0x24,
+	0x25,0x23,0x25,0x25,0x22,0x20,0x20,0x04,0x22,0x22,0x25,0x22,0x24,0x23,0x26,0x23,
+	0x04,0x22,0x25,0x23,0x24,0x28,0x24,0x25,0x25,0x21,0x23,0x25,0x22,0x22,0x22,0x04,
+	0x23,0x25,0x22,0x25,0x21,0x22,0x04,0x22,0x22,0x22,0x22,0x23,0x24,0x25,0x24,0x04,
+	0x25,0x04,0x24,0x25,0x24,0x25,0x23,0x22,0x04,0x04,0x24,0x28,0x28,0x23,0x28,0x25,
+	0x25,0x28,0x25,0x26,0x24,0x26,0x28,0x26,0x25,0x24,0x25,0x26,0x25,0x25,0x04,0x26,
+	0x04,0x28,0x25,0x04,0x26,0x28,0x26,0x26,0x28,0x04,0x25,0x26,0x26,0x25,0x25,0x24,
+	0x24,0x24,0x04,0x28,0x25,0x28,0x26,0x04,0x24,0x28,0x28,0x28,0x23,0x29,0x26,0x28,
+	0x28,0x28,0x25,0x28,0x28,0x25,0x25,0x25,0x22,0x22,0x28,0x04,0x28,0x24,0x04,0x25,
+	0x04,0x28,0x04,0x04,0x28,0x25,0x04,0x28,0x28,0x28,0x26,0x28,0x04,0x26,0x25,0x26,
+	0x25,0x25,0x25,0x28,0x25,0x25,0x28,0x04,0x28,0x26,0x28,0x25,0x25,0x28,0x04,0x25,
+	0x28,0x29,0x28,0x29,0x28,0x25,0x28,0x26,0x26,0x28,0x04,0x26,0x04,0x04,0x25,0x28,
+	0x25,0x28,0x28,0x26,0x26,0x04,0x28,0x25,0x25,0x26,0x25,0x24,0x28,0x25,0x04,0x29,
+	0x28,0x28,0x28,0x04,0x28,0x04,0x24,0x24,0x28,0x28,0x27,0x25,0x28,0x04,0x28,0x28,
+	0x29,0x25,0x28,0x29,0x29,0x25,0x28,0x28,0x28,0x28,0x29,0x28,0x29,0x28,0x29,0x28,
+	0x28,0x29,0x28,0x25,0x25,0x29,0x26,0x2A,0x29,0x2A,0x29,0x28,0x26,0x04,0x28,0x29,
+	0x23,0x25,0x23,0x21,0x04,0x28,0x25,0x24,0x22,0x25,0x22,0x28,0x26,0x25,0x28,0x25,
+	0x26,0x22,0x25,0x25,0x25,0x25,0x23,0x25,0x25,0x22,0x22,0x25,0x22,0x22,0x04,0x22,
+	0x25,0x25,0x23,0x26,0x23,0x25,0x22,0x25,0x25,0x25,0x22,0x22,0x04,0x21,0x23,0x24,
+	0x25,0x23,0x25,0x24,0x22,0x22,0x04,0x04,0x04,0x25,0x20,0x22,0x28,0x25,0x25,0x28,
+	0x25,0x26,0x25,0x26,0x24,0x24,0x23,0x24,0x21,0x24,0x24,0x23,0x23,0x22,0x25,0x23,
+	0x24,0x04,0x04,0x26,0x22,0x28,0x22,0x20,0x25,0x20,0x20,0x20,0x24,0x23,0x22,0x23,
+	0x28,0x22,0x24,0x23,0x22,0x25,0x23,0x25,0x21,0x25,0x22,0x24,0x28,0x26,0x04,0x04,
+	0x22,0x24,0x23,0x24,0x22,0x24,0x23,0x04,0x25,0x22,0x22,0x26,0x23,0x25,0x23,0x04,
+	0x23,0x25,0x23,0x26,0x24,0x24,0x04,0x26,0x04,0x22,0x28,0x25,0x04,0x26,0x24,0x04,
+	0x28,0x28,0x04,0x25,0x25,0x26,0x25,0x26,0x24,0x23,0x24,0x25,0x04,0x28,0x28,0x26,
+	0x25,0x25,0x26,0x25,0x26,0x28,0x04,0x25,0x28,0x26,0x26,0x24,0x26,0x24,0x26,0x25,
+	0x04,0x25,0x24,0x24,0x23,0x26,0x26,0x26,0x28,0x28,0x28,0x26,0x26,0x28,0x29,0x28,
+	0x28,0x29,0x29,0x28,0x28,0x26,0x26,0x22,0x24,0x04,0x28,0x24,0x25,0x26,0x28,0x25,
+	0x25,0x23,0x24,0x04,0x28,0x04,0x28,0x28,0x28,0x25,0x04,0x25,0x25,0x26,0x25,0x26,
+	0x24,0x25,0x25,0x04,0x25,0x23,0x26,0x28,0x24,0x04,0x2A,0x04,0x28,0x24,0x2A,0x28,
+	0x28,0x28,0x29,0x28,0x29,0x28,0x24,0x25,0x25,0x25,0x28,0x04,0x28,0x28,0x25,0x25,
+	0x29,0x28,0x29,0x25,0x28,0x28,0x25,0x28,0x04,0x24,0x28,0x28,0x28,0x04,0x26,0x25,
+	0x26,0x04,0x27,0x26,0x25,0x04,0x28,0x25,0x25,0x25,0x28,0x04,0x04,0x23,0x25,0x26,
+	0x28,0x25,0x28,0x28,0x28,0x28,0x04,0x28,0x25,0x28,0x28,0x28,0x28,0x29,0x28,0x26,
+	0x28,0x2A,0x04,0x29,0x29,0x29,0x28,0x28,0x29,0x28,0x29,0x04,0x28,0x29,0x28,0x29,
+	0x28,0x25,0x28,0x22,0x28,0x24,0x25,0x28,0x04,0x22,0x26,0x22,0x22,0x24,0x26,0x28,
+	0x28,0x23,0x22,0x23,0x20,0x26,0x25,0x26,0x04,0x22,0x25,0x23,0x04,0x24,0x23,0x04,
+	0x23,0x24,0x24,0x24,0x22,0x25,0x25,0x22,0x23,0x22,0x21,0x24,0x24,0x20,0x22,0x20,
+	0x04,0x20,0x20,0x22,0x24,0x22,0x25,0x22,0x25,0x25,0x25,0x24,0x25,0x24,0x24,0x24,
+	0x04,0x04,0x28,0x25,0x25,0x25,0x24,0x22,0x25,0x25,0x24,0x22,0x22,0x25,0x24,0x28,
+	0x25,0x25,0x23,0x22,0x25,0x22,0x04,0x26,0x22,0x25,0x04,0x25,0x22,0x24,0x25,0x24,
+	0x20,0x20,0x25,0x26,0x24,0x22,0x20,0x22,0x22,0x25,0x22,0x25,0x28,0x25,0x22,0x25,
+	0x23,0x28,0x22,0x25,0x22,0x24,0x24,0x25,0x25,0x23,0x25,0x23,0x24,0x28,0x04,0x24,
+	0x28,0x04,0x24,0x25,0x04,0x25,0x25,0x28,0x28,0x25,0x26,0x23,0x28,0x26,0x28,0x25,
+	0x23,0x26,0x04,0x26,0x04,0x28,0x26,0x28,0x25,0x25,0x24,0x28,0x04,0x26,0x28,0x28,
+	0x26,0x25,0x25,0x28,0x04,0x28,0x28,0x28,0x28,0x24,0x04,0x24,0x04,0x04,0x23,0x28,
+	0x04,0x28,0x04,0x26,0x28,0x28,0x26,0x28,0x04,0x2A,0x28,0x28,0x25,0x28,0x28,0x28,
+	0x25,0x29,0x2A,0x26,0x04,0x28,0x28,0x25,0x25,0x28,0x26,0x04,0x28,0x28,0x04,0x25,
+	0x28,0x26,0x28,0x28,0x25,0x29,0x28,0x04,0x25,0x28,0x25,0x28,0x22,0x25,0x26,0x24,
+	0x28,0x26,0x27,0x04,0x26,0x28,0x28,0x29,0x28,0x28,0x26,0x25,0x25,0x28,0x28,0x28,
+	0x28,0x28,0x04,0x28,0x26,0x26,0x26,0x24,0x28,0x28,0x24,0x25,0x28,0x26,0x28,0x2A,
+	0x28,0x24,0x26,0x29,0x25,0x29,0x28,0x23,0x28,0x25,0x28,0x25,0x25,0x28,0x28,0x28,
+	0x23,0x28,0x28,0x26,0x25,0x26,0x04,0x26,0x28,0x25,0x25,0x24,0x04,0x28,0x28,0x26,
+	0x25,0x04,0x28,0x28,0x28,0x04,0x28,0x28,0x26,0x29,0x28,0x28,0x29,0x29,0x28,0x29,
+	0x04,0x28,0x04,0x28,0x28,0x28,0x26,0x28,0x24,0x28,0x24,0x28,0x28,0x29,0x25,0x29,
+	0x26,0x25,0x23,0x22,0x22,0x22,0x23,0x22,0x23,0x25,0x04,0x04,0x04,0x25,0x26,0x04,
+	0x22,0x25,0x26,0x04,0x23,0x22,0x22,0x24,0x20,0x22,0x04,0x22,0x04,0x21,0x22,0x23,
+	0x25,0x24,0x26,0x28,0x21,0x21,0x20,0x25,0x24,0x22,0x20,0x25,0x04,0x26,0x23,0x24,
+	0x26,0x24,0x26,0x20,0x22,0x20,0x24,0x20,0x22,0x04,0x26,0x22,0x22,0x24,0x23,0x22,
+	0x28,0x28,0x25,0x04,0x26,0x25,0x04,0x28,0x28,0x26,0x04,0x28,0x23,0x28,0x04,0x25,
+	0x21,0x25,0x23,0x23,0x24,0x21,0x24,0x26,0x25,0x23,0x23,0x26,0x25,0x24,0x25,0x24,
+	0x22,0x25,0x26,0x23,0x28,0x26,0x25,0x23,0x26,0x23,0x23,0x28,0x22,0x25,0x23,0x25,
+	0x24,0x23,0x23,0x23,0x25,0x25,0x26,0x26,0x22,0x24,0x26,0x25,0x26,0x25,0x24,0x23,
+	0x23,0x26,0x28,0x04,0x28,0x28,0x27,0x25,0x28,0x26,0x28,0x04,0x26,0x04,0x28,0x25,
+	0x28,0x26,0x26,0x04,0x26,0x04,0x04,0x04,0x25,0x26,0x26,0x26,0x04,0x04,0x28,0x25,
+	0x25,0x28,0x26,0x04,0x04,0x24,0x04,0x04,0x04,0x26,0x28,0x26,0x28,0x28,0x22,0x04,
+	0x04,0x26,0x25,0x28,0x29,0x26,0x29,0x25,0x04,0x04,0x28,0x28,0x29,0x2A,0x28,0x2A,
+	0x25,0x2A,0x28,0x28,0x2A,0x29,0x28,0x25,0x25,0x2A,0x28,0x04,0x25,0x25,0x28,0x04,
+	0x28,0x28,0x28,0x28,0x28,0x29,0x26,0x28,0x26,0x28,0x25,0x22,0x04,0x28,0x29,0x28,
+	0x28,0x28,0x04,0x28,0x28,0x28,0x25,0x24,0x28,0x27,0x28,0x04,0x28,0x28,0x26,0x25,
+	0x23,0x25,0x28,0x26,0x28,0x28,0x28,0x25,0x04,0x26,0x28,0x28,0x29,0x25,0x04,0x28,
+	0x28,0x2A,0x28,0x28,0x04,0x04,0x28,0x28,0x28,0x26,0x26,0x28,0x04,0x24,0x24,0x25,
+	0x26,0x04,0x26,0x28,0x28,0x28,0x25,0x25,0x28,0x25,0x25,0x26,0x26,0x25,0x25,0x24,
+	0x28,0x28,0x04,0x25,0x28,0x28,0x25,0x25,0x28,0x28,0x28,0x29,0x28,0x04,0x25,0x29,
+	0x26,0x25,0x25,0x28,0x28,0x25,0x04,0x28,0x25,0x04,0x26,0x26,0x24,0x25,0x28,0x29,
+	0x04,0x28,0x23,0x25,0x25,0x26,0x23,0x28,0x25,0x28,0x25,0x23,0x04,0x23,0x26,0x23,
+	0x26,0x28,0x22,0x04,0x23,0x23,0x24,0x24,0x22,0x22,0x22,0x20,0x24,0x23,0x20,0x22,
+	0x04,0x25,0x25,0x23,0x23,0x22,0x20,0x20,0x21,0x24,0x23,0x04,0x24,0x28,0x22,0x25,
+	0x24,0x26,0x22,0x20,0x20,0x20,0x23,0x24,0x25,0x22,0x20,0x20,0x25,0x24,0x25,0x24,
+	0x23,0x26,0x23,0x25,0x28,0x25,0x26,0x25,0x23,0x26,0x24,0x28,0x04,0x26,0x24,0x26,
+	0x24,0x24,0x25,0x24,0x25,0x04,0x22,0x24,0x22,0x24,0x25,0x22,0x24,0x23,0x24,0x23,
+	0x26,0x23,0x24,0x22,0x23,0x28,0x04,0x28,0x24,0x25,0x25,0x25,0x23,0x23,0x24,0x25,
+	0x04,0x25,0x28,0x26,0x23,0x24,0x04,0x24,0x25,0x28,0x26,0x23,0x25,0x22,0x23,0x26,
+	0x26,0x28,0x23,0x28,0x24,0x24,0x04,0x22,0x04,0x23,0x24,0x24,0x26,0x04,0x28,0x04,
+	0x04,0x28,0x26,0x04,0x22,0x24,0x28,0x24,0x25,0x26,0x04,0x27,0x25,0x25,0x28,0x28,
+	0x28,0x04,0x28,0x26,0x04,0x25,0x28,0x23,0x28,0x26,0x04,0x04,0x24,0x25,0x28,0x26,
+	0x25,0x28,0x25,0x28,0x26,0x26,0x29,0x28,0x28,0x29,0x26,0x04,0x26,0x28,0x28,0x29,
+	0x26,0x2A,0x04,0x28,0x04,0x28,0x28,0x27,0x28,0x28,0x28,0x29,0x25,0x22,0x22,0x26,
+	0x29,0x28,0x26,0x28,0x28,0x28,0x04,0x25,0x28,0x26,0x29,0x04,0x2A,0x28,0x28,0x28,
+	0x28,0x28,0x26,0x26,0x28,0x25,0x28,0x28,0x23,0x28,0x28,0x28,0x26,0x25,0x27,0x28,
+	0x27,0x27,0x28,0x25,0x04,0x28,0x28,0x04,0x28,0x04,0x25,0x28,0x29,0x28,0x2A,0x28,
+	0x28,0x2A,0x28,0x28,0x2A,0x24,0x04,0x28,0x25,0x04,0x28,0x25,0x26,0x25,0x24,0x25,
+	0x26,0x25,0x25,0x23,0x28,0x26,0x25,0x25,0x04,0x28,0x26,0x26,0x04,0x04,0x26,0x04,
+	0x26,0x22,0x04,0x04,0x28,0x28,0x28,0x28,0x28,0x28,0x04,0x28,0x25,0x27,0x25,0x28,
+	0x24,0x22,0x26,0x28,0x26,0x04,0x28,0x04,0x28,0x25,0x28,0x28,0x04,0x25,0x24,0x29,
+	0x28,0x25,0x23,0x25,0x22,0x25,0x28,0x26,0x23,0x24,0x04,0x23,0x28,0x22,0x25,0x22,
+	0x28,0x22,0x24,0x25,0x26,0x25,0x25,0x22,0x22,0x22,0x23,0x26,0x23,0x26,0x22,0x24,
+	0x04,0x25,0x22,0x25,0x23,0x22,0x25,0x28,0x22,0x24,0x25,0x23,0x24,0x23,0x25,0x25,
+	0x25,0x21,0x23,0x20,0x20,0x22,0x22,0x23,0x28,0x22,0x23,0x25,0x22,0x28,0x24,0x26,
+	0x23,0x25,0x28,0x26,0x26,0x26,0x28,0x28,0x25,0x25,0x25,0x28,0x28,0x25,0x26,0x28,
+	0x24,0x28,0x24,0x23,0x28,0x28,0x26,0x04,0x26,0x28,0x04,0x26,0x24,0x24,0x04,0x25,
+	0x25,0x25,0x04,0x26,0x04,0x26,0x24,0x28,0x25,0x25,0x23,0x25,0x24,0x25,0x25,0x25,
+	0x24,0x25,0x25,0x23,0x22,0x25,0x25,0x25,0x04,0x23,0x04,0x28,0x26,0x26,0x28,0x04,
+	0x28,0x28,0x28,0x28,0x24,0x28,0x24,0x04,0x04,0x04,0x28,0x28,0x24,0x25,0x04,0x26,
+	0x24,0x25,0x26,0x04,0x26,0x28,0x28,0x28,0x28,0x25,0x26,0x29,0x04,0x28,0x26,0x28,
+	0x28,0x26,0x25,0x28,0x04,0x25,0x24,0x28,0x28,0x26,0x28,0x25,0x25,0x24,0x26,0x25,
+	0x24,0x28,0x27,0x28,0x26,0x04,0x25,0x29,0x28,0x28,0x28,0x04,0x04,0x28,0x26,0x29,
+	0x29,0x29,0x04,0x26,0x25,0x28,0x24,0x24,0x24,0x04,0x28,0x04,0x28,0x24,0x28,0x28,
+	0x27,0x29,0x04,0x26,0x26,0x25,0x28,0x25,0x29,0x04,0x29,0x28,0x28,0x28,0x28,0x28,
+	0x2B,0x29,0x2B,0x2C,0x29,0x28,0x26,0x04,0x28,0x25,0x28,0x26,0x27,0x28,0x28,0x28,
+	0x04,0x25,0x24,0x28,0x28,0x04,0x28,0x25,0x25,0x25,0x26,0x28,0x28,0x28,0x29,0x29,
+	0x28,0x28,0x22,0x28,0x28,0x28,0x28,0x28,0x24,0x24,0x26,0x26,0x25,0x25,0x04,0x28,
+	0x04,0x25,0x28,0x24,0x28,0x25,0x04,0x28,0x26,0x24,0x26,0x04,0x28,0x26,0x26,0x25,
+	0x28,0x28,0x28,0x29,0x25,0x28,0x25,0x28,0x28,0x26,0x04,0x25,0x04,0x28,0x28,0x28,
+	0x04,0x25,0x25,0x28,0x28,0x24,0x28,0x28,0x26,0x24,0x28,0x24,0x26,0x25,0x28,0x29,
+	0x04,0x23,0x22,0x24,0x25,0x25,0x23,0x25,0x23,0x23,0x22,0x04,0x04,0x24,0x26,0x24,
+	0x23,0x24,0x04,0x04,0x04,0x25,0x22,0x28,0x25,0x25,0x22,0x25,0x26,0x25,0x22,0x23,
+	0x22,0x25,0x23,0x25,0x04,0x24,0x23,0x25,0x22,0x28,0x22,0x25,0x22,0x25,0x28,0x22,
+	0x25,0x26,0x25,0x20,0x26,0x04,0x20,0x23,0x23,0x25,0x25,0x25,0x24,0x22,0x25,0x24,
+	0x25,0x24,0x25,0x28,0x04,0x25,0x25,0x24,0x28,0x25,0x28,0x28,0x26,0x25,0x24,0x23,
+	0x26,0x24,0x28,0x25,0x28,0x27,0x28,0x25,0x27,0x26,0x26,0x26,0x26,0x25,0x04,0x26,
+	0x28,0x25,0x25,0x28,0x28,0x26,0x04,0x04,0x26,0x24,0x24,0x24,0x04,0x24,0x28,0x25,
+	0x24,0x24,0x04,0x26,0x26,0x25,0x26,0x25,0x23,0x28,0x25,0x25,0x25,0x29,0x04,0x24,
+	0x28,0x28,0x24,0x25,0x04,0x22,0x26,0x28,0x26,0x04,0x28,0x25,0x25,0x28,0x28,0x24,
+	0x04,0x26,0x04,0x04,0x04,0x26,0x04,0x27,0x25,0x28,0x28,0x28,0x28,0x26,0x26,0x29,
+	0x26,0x28,0x28,0x28,0x28,0x25,0x24,0x28,0x28,0x28,0x26,0x25,0x28,0x25,0x28,0x28,
+	0x28,0x26,0x26,0x28,0x28,0x25,0x2A,0x28,0x28,0x26,0x25,0x25,0x24,0x25,0x24,0x25,
+	0x23,0x26,0x28,0x25,0x24,0x22,0x25,0x25,0x25,0x25,0x28,0x04,0x25,0x04,0x26,0x28,
+	0x04,0x26,0x28,0x29,0x28,0x29,0x28,0x25,0x25,0x28,0x04,0x28,0x28,0x26,0x28,0x28,
+	0x28,0x25,0x2B,0x29,0x29,0x04,0x04,0x28,0x24,0x25,0x29,0x28,0x25,0x28,0x28,0x28,
+	0x28,0x22,0x26,0x25,0x26,0x28,0x28,0x28,0x24,0x28,0x25,0x24,0x24,0x28,0x04,0x26,
+	0x28,0x23,0x28,0x29,0x28,0x04,0x26,0x26,0x04,0x24,0x24,0x25,0x25,0x26,0x24,0x25,
+	0x22,0x04,0x25,0x26,0x26,0x22,0x28,0x24,0x24,0x26,0x28,0x28,0x28,0x26,0x28,0x26,
+	0x26,0x28,0x28,0x04,0x04,0x24,0x04,0x25,0x25,0x04,0x25,0x28,0x26,0x25,0x25,0x25,
+	0x04,0x04,0x25,0x25,0x26,0x24,0x24,0x25,0x28,0x26,0x25,0x25,0x26,0x28,0x25,0x29,
+	0x23,0x04,0x25,0x24,0x25,0x26,0x25,0x26,0x25,0x25,0x28,0x25,0x28,0x28,0x24,0x25,
+	0x26,0x25,0x04,0x25,0x25,0x22,0x22,0x25,0x25,0x24,0x26,0x04,0x22,0x24,0x24,0x24,
+	0x23,0x23,0x26,0x22,0x25,0x24,0x25,0x28,0x25,0x22,0x26,0x26,0x25,0x24,0x28,0x04,
+	0x25,0x22,0x26,0x23,0x26,0x25,0x04,0x28,0x04,0x26,0x04,0x28,0x25,0x22,0x22,0x24,
+	0x20,0x22,0x24,0x25,0x24,0x23,0x25,0x04,0x25,0x28,0x28,0x28,0x28,0x04,0x25,0x28,
+	0x27,0x25,0x25,0x26,0x25,0x24,0x27,0x25,0x26,0x28,0x25,0x25,0x04,0x28,0x27,0x28,
+	0x24,0x25,0x25,0x28,0x25,0x24,0x04,0x28,0x25,0x26,0x26,0x04,0x26,0x26,0x25,0x24,
+	0x25,0x28,0x04,0x28,0x26,0x25,0x28,0x26,0x28,0x22,0x04,0x25,0x28,0x25,0x25,0x28,
+	0x25,0x25,0x28,0x25,0x28,0x24,0x28,0x24,0x26,0x28,0x28,0x04,0x28,0x25,0x24,0x25,
+	0x28,0x27,0x25,0x04,0x04,0x26,0x28,0x24,0x26,0x04,0x28,0x24,0x28,0x04,0x28,0x27,
+	0x24,0x26,0x26,0x28,0x25,0x24,0x28,0x04,0x26,0x23,0x04,0x28,0x04,0x26,0x29,0x28,
+	0x26,0x28,0x26,0x28,0x26,0x28,0x25,0x28,0x29,0x25,0x28,0x27,0x28,0x25,0x28,0x24,
+	0x22,0x22,0x20,0x20,0x25,0x23,0x04,0x26,0x24,0x28,0x28,0x25,0x24,0x24,0x25,0x25,
+	0x28,0x28,0x04,0x28,0x26,0x28,0x28,0x04,0x28,0x28,0x29,0x28,0x26,0x28,0x26,0x25,
+	0x28,0x28,0x28,0x2A,0x24,0x29,0x28,0x28,0x28,0x28,0x28,0x04,0x2A,0x28,0x25,0x04,
+	0x28,0x28,0x26,0x2A,0x2A,0x04,0x24,0x26,0x28,0x26,0x26,0x04,0x28,0x04,0x28,0x28,
+	0x28,0x29,0x29,0x28,0x28,0x28,0x28,0x28,0x24,0x28,0x28,0x28,0x24,0x26,0x25,0x25,
+	0x25,0x28,0x23,0x24,0x28,0x24,0x26,0x28,0x26,0x25,0x28,0x29,0x28,0x04,0x26,0x28,
+	0x28,0x28,0x2A,0x04,0x04,0x04,0x24,0x25,0x04,0x26,0x28,0x25,0x25,0x26,0x26,0x24,
+	0x04,0x04,0x04,0x28,0x04,0x26,0x26,0x04,0x28,0x26,0x24,0x28,0x28,0x26,0x04,0x29,
+	0x24,0x28,0x28,0x23,0x23,0x22,0x25,0x04,0x23,0x24,0x22,0x26,0x25,0x22,0x26,0x23,
+	0x25,0x24,0x23,0x25,0x23,0x04,0x04,0x24,0x25,0x25,0x25,0x22,0x22,0x26,0x22,0x04,
+	0x04,0x25,0x26,0x04,0x04,0x25,0x25,0x23,0x25,0x24,0x28,0x04,0x25,0x04,0x24,0x04,
+	0x24,0x25,0x20,0x22,0x04,0x25,0x28,0x25,0x26,0x23,0x26,0x26,0x28,0x04,0x04,0x26,
+	0x25,0x25,0x25,0x26,0x23,0x24,0x23,0x25,0x04,0x28,0x25,0x28,0x28,0x28,0x04,0x28,
+	0x28,0x04,0x22,0x28,0x25,0x28,0x25,0x26,0x25,0x28,0x27,0x28,0x28,0x25,0x28,0x28,
+	0x28,0x24,0x24,0x22,0x04,0x04,0x25,0x26,0x25,0x28,0x25,0x28,0x04,0x28,0x28,0x26,
+	0x26,0x25,0x04,0x25,0x28,0x26,0x26,0x28,0x25,0x04,0x04,0x26,0x28,0x24,0x28,0x25,
+	0x04,0x28,0x04,0x25,0x21,0x28,0x26,0x24,0x04,0x25,0x28,0x04,0x28,0x28,0x25,0x28,
+	0x28,0x26,0x28,0x04,0x04,0x26,0x26,0x28,0x26,0x24,0x24,0x24,0x28,0x04,0x25,0x26,
+	0x28,0x28,0x24,0x28,0x25,0x25,0x25,0x25,0x28,0x26,0x04,0x28,0x24,0x28,0x26,0x28,
+	0x26,0x29,0x26,0x28,0x26,0x25,0x26,0x25,0x24,0x28,0x25,0x26,0x22,0x26,0x28,0x28,
+	0x04,0x22,0x20,0x24,0x21,0x23,0x25,0x24,0x26,0x25,0x26,0x24,0x25,0x25,0x26,0x28,
+	0x26,0x25,0x24,0x26,0x28,0x04,0x26,0x28,0x28,0x28,0x28,0x28,0x27,0x28,0x28,0x04,
+	0x27,0x24,0x25,0x04,0x29,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x04,0x26,0x2A,0x28,
+	0x2A,0x28,0x25,0x25,0x26,0x04,0x28,0x28,0x28,0x28,0x28,0x28,0x24,0x26,0x25,0x28,
+	0x28,0x28,0x24,0x28,0x25,0x25,0x28,0x28,0x28,0x28,0x28,0x25,0x22,0x28,0x26,0x26,
+	0x25,0x25,0x04,0x28,0x25,0x28,0x28,0x28,0x23,0x25,0x26,0x29,0x25,0x28,0x29,0x25,
+	0x29,0x29,0x25,0x24,0x25,0x25,0x26,0x28,0x28,0x25,0x28,0x28,0x24,0x24,0x25,0x26,
+	0x28,0x25,0x04,0x28,0x28,0x24,0x26,0x28,0x28,0x26,0x28,0x23,0x28,0x04,0x04,0x29,
+	0x22,0x26,0x23,0x26,0x25,0x21,0x04,0x22,0x25,0x04,0x04,0x23,0x25,0x04,0x28,0x24,
+	0x25,0x25,0x24,0x24,0x24,0x25,0x04,0x22,0x24,0x23,0x23,0x04,0x26,0x24,0x24,0x25,
+	0x28,0x28,0x04,0x28,0x25,0x28,0x23,0x25,0x04,0x25,0x24,0x26,0x25,0x28,0x25,0x24,
+	0x23,0x28,0x04,0x25,0x24,0x28,0x25,0x04,0x25,0x25,0x28,0x04,0x28,0x04,0x28,0x25,
+	0x28,0x25,0x20,0x22,0x22,0x21,0x21,0x23,0x25,0x26,0x26,0x22,0x22,0x24,0x25,0x25,
+	0x28,0x26,0x25,0x26,0x23,0x25,0x04,0x28,0x28,0x28,0x04,0x25,0x26,0x22,0x24,0x28,
+	0x26,0x28,0x25,0x28,0x25,0x26,0x23,0x26,0x04,0x28,0x04,0x25,0x04,0x28,0x2A,0x29,
+	0x25,0x25,0x26,0x24,0x25,0x04,0x28,0x25,0x25,0x25,0x28,0x04,0x25,0x23,0x28,0x28,
+	0x04,0x28,0x24,0x25,0x26,0x28,0x04,0x25,0x25,0x28,0x27,0x26,0x28,0x28,0x26,0x26,
+	0x25,0x26,0x26,0x24,0x26,0x04,0x26,0x26,0x04,0x04,0x28,0x28,0x24,0x24,0x26,0x25,
+	0x28,0x29,0x28,0x28,0x26,0x28,0x04,0x28,0x24,0x26,0x28,0x04,0x28,0x04,0x28,0x04,
+	0x29,0x24,0x29,0x29,0x24,0x28,0x28,0x25,0x25,0x28,0x28,0x28,0x04,0x22,0x24,0x20,
+	0x20,0x26,0x23,0x25,0x26,0x28,0x24,0x25,0x04,0x22,0x04,0x26,0x25,0x28,0x28,0x28,
+	0x28,0x24,0x28,0x28,0x04,0x28,0x25,0x04,0x26,0x24,0x04,0x26,0x26,0x28,0x28,0x25,
+	0x04,0x25,0x26,0x04,0x27,0x28,0x23,0x27,0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x28,
+	0x28,0x28,0x04,0x28,0x28,0x25,0x28,0x28,0x29,0x28,0x28,0x28,0x25,0x26,0x24,0x26,
+	0x28,0x26,0x25,0x04,0x25,0x22,0x28,0x28,0x26,0x04,0x29,0x29,0x28,0x25,0x25,0x25,
+	0x04,0x26,0x28,0x28,0x28,0x26,0x28,0x28,0x28,0x29,0x28,0x28,0x04,0x28,0x28,0x28,
+	0x04,0x04,0x26,0x28,0x25,0x23,0x23,0x26,0x25,0x23,0x26,0x04,0x28,0x24,0x26,0x28,
+	0x26,0x04,0x22,0x22,0x22,0x26,0x26,0x04,0x28,0x25,0x25,0x28,0x25,0x26,0x28,0x29,
+	0x24,0x22,0x23,0x22,0x25,0x04,0x25,0x26,0x25,0x28,0x04,0x22,0x23,0x24,0x24,0x25,
+	0x26,0x28,0x04,0x22,0x25,0x26,0x24,0x28,0x04,0x04,0x28,0x26,0x26,0x25,0x28,0x25,
+	0x26,0x26,0x22,0x26,0x26,0x23,0x28,0x22,0x22,0x04,0x26,0x25,0x25,0x26,0x20,0x22,
+	0x24,0x04,0x25,0x26,0x28,0x24,0x04,0x26,0x25,0x24,0x24,0x26,0x28,0x28,0x26,0x28,
+	0x26,0x26,0x24,0x04,0x23,0x22,0x23,0x26,0x04,0x28,0x26,0x04,0x23,0x22,0x22,0x22,
+	0x23,0x22,0x23,0x25,0x20,0x20,0x25,0x25,0x28,0x28,0x25,0x25,0x24,0x23,0x22,0x24,
+	0x25,0x26,0x28,0x04,0x28,0x26,0x29,0x25,0x28,0x28,0x28,0x24,0x28,0x25,0x28,0x29,
+	0x28,0x28,0x28,0x28,0x04,0x28,0x04,0x28,0x25,0x04,0x28,0x28,0x25,0x28,0x28,0x28,
+	0x28,0x27,0x25,0x28,0x28,0x04,0x28,0x25,0x28,0x24,0x28,0x23,0x25,0x28,0x25,0x25,
+	0x28,0x26,0x26,0x28,0x28,0x25,0x28,0x25,0x23,0x04,0x24,0x25,0x28,0x26,0x28,0x26,
+	0x28,0x28,0x29,0x26,0x28,0x28,0x28,0x04,0x28,0x26,0x28,0x25,0x28,0x2A,0x28,0x28,
+	0x26,0x28,0x28,0x28,0x28,0x25,0x26,0x25,0x25,0x26,0x25,0x25,0x25,0x24,0x20,0x20,
+	0x22,0x22,0x04,0x25,0x28,0x25,0x04,0x25,0x24,0x26,0x26,0x04,0x25,0x28,0x26,0x28,
+	0x04,0x28,0x26,0x04,0x24,0x25,0x26,0x28,0x04,0x25,0x25,0x04,0x04,0x28,0x25,0x28,
+	0x24,0x28,0x28,0x26,0x24,0x25,0x23,0x04,0x28,0x28,0x25,0x24,0x28,0x26,0x28,0x28,
+	0x28,0x28,0x04,0x26,0x28,0x25,0x04,0x25,0x22,0x26,0x26,0x04,0x24,0x26,0x04,0x28,
+	0x25,0x28,0x26,0x26,0x04,0x28,0x23,0x26,0x24,0x25,0x28,0x26,0x04,0x28,0x26,0x29,
+	0x28,0x28,0x28,0x29,0x28,0x24,0x29,0x28,0x28,0x28,0x28,0x04,0x04,0x25,0x25,0x24,
+	0x24,0x26,0x25,0x25,0x22,0x20,0x20,0x22,0x24,0x22,0x23,0x20,0x20,0x22,0x20,0x22,
+	0x20,0x22,0x20,0x24,0x23,0x22,0x25,0x23,0x23,0x28,0x26,0x20,0x20,0x20,0x20,0x29,
+	0x28,0x28,0x25,0x28,0x04,0x26,0x25,0x26,0x25,0x26,0x25,0x26,0x28,0x28,0x04,0x04,
+	0x28,0x26,0x24,0x28,0x28,0x28,0x28,0x28,0x26,0x23,0x26,0x28,0x04,0x25,0x25,0x26,
+	0x28,0x28,0x26,0x26,0x26,0x28,0x04,0x22,0x04,0x25,0x25,0x28,0x04,0x26,0x04,0x28,
+	0x28,0x04,0x28,0x04,0x24,0x28,0x28,0x28,0x28,0x28,0x24,0x26,0x24,0x28,0x25,0x04,
+	0x28,0x28,0x23,0x28,0x24,0x24,0x28,0x26,0x25,0x28,0x25,0x25,0x25,0x24,0x22,0x04,
+	0x23,0x25,0x23,0x24,0x24,0x24,0x26,0x26,0x26,0x24,0x28,0x28,0x24,0x22,0x25,0x04,
+	0x25,0x28,0x26,0x29,0x24,0x28,0x25,0x28,0x24,0x28,0x25,0x28,0x24,0x28,0x28,0x26,
+	0x26,0x28,0x25,0x28,0x25,0x28,0x28,0x26,0x28,0x29,0x28,0x28,0x24,0x24,0x24,0x26,
+	0x23,0x26,0x04,0x25,0x04,0x26,0x04,0x25,0x23,0x25,0x04,0x24,0x25,0x24,0x23,0x24,
+	0x26,0x25,0x24,0x24,0x25,0x04,0x25,0x25,0x28,0x28,0x24,0x28,0x25,0x04,0x29,0x25,
+	0x04,0x04,0x28,0x28,0x04,0x28,0x04,0x29,0x04,0x26,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x24,0x28,0x25,0x04,0x24,0x23,0x22,0x25,0x23,0x20,0x25,0x23,0x25,0x25,0x25,
+	0x23,0x24,0x26,0x28,0x28,0x25,0x04,0x26,0x04,0x28,0x25,0x26,0x28,0x26,0x25,0x28,
+	0x04,0x25,0x04,0x26,0x28,0x26,0x25,0x28,0x28,0x28,0x28,0x23,0x25,0x25,0x28,0x25,
+	0x28,0x25,0x28,0x25,0x26,0x25,0x25,0x26,0x04,0x26,0x25,0x28,0x28,0x26,0x25,0x26,
+	0x28,0x04,0x28,0x25,0x26,0x25,0x28,0x04,0x04,0x28,0x29,0x04,0x26,0x28,0x26,0x28,
+	0x28,0x29,0x28,0x28,0x29,0x25,0x29,0x25,0x29,0x28,0x29,0x28,0x29,0x28,0x28,0x28,
+	0x28,0x29,0x24,0x04,0x24,0x04,0x25,0x27,0x28,0x24,0x24,0x28,0x04,0x23,0x24,0x23,
+	0x26,0x22,0x24,0x22,0x20,0x26,0x25,0x28,0x23,0x24,0x04,0x22,0x22,0x23,0x20,0x24,
+	0x26,0x26,0x20,0x22,0x20,0x24,0x22,0x24,0x20,0x24,0x22,0x24,0x25,0x24,0x28,0x29,
+	0x04,0x24,0x28,0x26,0x28,0x23,0x28,0x28,0x28,0x24,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x25,0x25,0x28,0x26,
+	0x25,0x25,0x25,0x25,0x25,0x26,0x28,0x04,0x24,0x26,0x28,0x2A,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,
+	0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,
+	0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2C,
+	0x2C,0x2C,0x2C,0x2C,0x2C,0x26,0x22,0x22,0x28,0x25,0x24,0x24,0x26,0x28,0x25,0x29,
+	0x04,0x28,0x28,0x28,0x24,0x25,0x25,0x04,0x25,0x24,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x25,0x25,0x26,0x25,
+	0x24,0x04,0x04,0x23,0x23,0x26,0x26,0x23,0x2A,0x28,0x25,0x2A,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x23,0x25,0x26,0x25,0x28,0x26,0x24,0x24,0x04,0x24,0x29,
+	0x25,0x28,0x26,0x25,0x28,0x26,0x22,0x25,0x25,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x22,0x25,0x28,0x26,
+	0x22,0x24,0x24,0x24,0x28,0x28,0x04,0x29,0x25,0x28,0x28,0x26,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x20,0x28,0x28,0x04,0x04,0x04,0x28,0x24,0x24,0x28,0x29,
+	0x26,0x25,0x26,0x25,0x28,0x22,0x25,0x25,0x24,0x23,0x2F,0x2F,0x2D,0x2D,0x7A,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,
+	0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x22,0x25,0x28,0x04,
+	0x28,0x28,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x27,0x28,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x04,0x04,0x28,0x24,0x26,0x24,0x28,0x04,0x25,0x29,
+	0x04,0x25,0x22,0x23,0x24,0x25,0x22,0x22,0x23,0x24,0x2F,0x2F,0x2D,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x22,0x28,0x28,0x26,
+	0x29,0x28,0x28,0x04,0x26,0x29,0x28,0x24,0x26,0x28,0x26,0x25,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x04,0x22,0x25,0x23,0x25,0x28,0x26,0x23,0x29,
+	0x25,0x26,0x28,0x26,0x26,0x28,0x04,0x22,0x22,0x25,0x2F,0x2F,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x7A,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x22,0x28,0x28,0x28,
+	0x04,0x04,0x28,0x28,0x28,0x24,0x28,0x26,0x26,0x28,0x25,0x26,0x2F,0x2F,0x2D,0x2D,
+	0x32,0x33,0x33,0x34,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x35,0x35,0x35,0x35,0x36,0x36,
+	0x36,0x36,0x20,0x23,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x28,0x24,0x23,0x28,0x28,0x28,0x25,0x25,0x20,0x29,
+	0x23,0x04,0x28,0x23,0x24,0x24,0x24,0x25,0x20,0x25,0x2F,0x2F,0x2D,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x22,0x28,0x04,0x04,
+	0x04,0x04,0x26,0x28,0x26,0x25,0x04,0x26,0x26,0x23,0x22,0x22,0x2E,0x2F,0x2D,0x2D,
+	0x33,0x36,0x22,0x25,0x27,0x27,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x2C,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x24,0x25,0x24,0x28,0x23,0x22,0x25,0x25,0x04,0x29,
+	0x22,0x24,0x20,0x22,0x22,0x23,0x23,0x23,0x21,0x23,0x2F,0x2F,0x2D,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,
+	0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x7A,0x7A,0x7A,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x7A,0x7A,0x7A,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,
+	0x7A,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x22,0x26,0x26,0x25,
+	0x28,0x26,0x26,0x25,0x28,0x28,0x25,0x04,0x24,0x25,0x25,0x25,0x2E,0x2F,0x2D,0x2D,
+	0x34,0x22,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x28,0x28,0x2C,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x24,0x28,0x23,0x22,0x24,0x04,0x20,0x20,0x23,0x29,
+	0x22,0x20,0x20,0x24,0x22,0x23,0x24,0x22,0x24,0x24,0x2F,0x2F,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x22,0x23,0x24,0x25,
+	0x04,0x28,0x26,0x25,0x23,0x04,0x26,0x24,0x22,0x20,0x25,0x23,0x2E,0x2F,0x2D,0x2D,
+	0x34,0x25,0x27,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2D,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x23,0x22,0x04,0x25,0x25,0x04,0x22,0x22,0x23,0x29,
+	0x20,0x26,0x21,0x24,0x23,0x28,0x23,0x23,0x22,0x26,0x2F,0x2F,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x22,0x25,0x23,0x22,
+	0x22,0x22,0x20,0x26,0x20,0x24,0x20,0x23,0x26,0x28,0x22,0x25,0x2E,0x2F,0x2D,0x2D,
+	0x35,0x27,0x27,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2D,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x28,0x23,0x24,0x04,0x22,0x20,0x22,0x22,0x26,0x29,
+	0x25,0x21,0x25,0x22,0x24,0x23,0x24,0x24,0x04,0x04,0x2F,0x2F,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,
+	0x2D,0x7A,0x7A,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x7A,0x7A,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,
+	0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x7A,0x7A,0x2D,0x2D,0x2D,0x2D,0x22,0x26,0x28,0x28,
+	0x04,0x25,0x20,0x24,0x22,0x24,0x20,0x23,0x25,0x28,0x25,0x24,0x2E,0x2F,0x2D,0x2D,
+	0x36,0x27,0x28,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2E,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x04,0x25,0x04,0x20,0x26,0x24,0x23,0x04,0x04,0x29,
+	0x23,0x22,0x25,0x22,0x25,0x23,0x25,0x25,0x28,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x22,0x25,0x24,0x26,
+	0x04,0x24,0x21,0x24,0x25,0x22,0x22,0x25,0x26,0x23,0x23,0x25,0x2D,0x2F,0x2D,0x2D,
+	0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x2E,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x20,0x23,0x25,0x23,0x26,0x24,0x28,0x28,0x04,0x29,
+	0x25,0x24,0x26,0x26,0x28,0x04,0x28,0x04,0x28,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x22,0x24,0x26,0x23,
+	0x25,0x22,0x25,0x23,0x22,0x26,0x28,0x23,0x20,0x25,0x22,0x24,0x2D,0x2F,0x2D,0x2D,
+	0x23,0x2A,0x2C,0x2C,0x2D,0x2D,0x2D,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x20,0x28,0x26,0x26,0x25,0x28,0x28,0x04,0x24,0x29,
+	0x26,0x26,0x25,0x04,0x04,0x04,0x25,0x25,0x26,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x22,0x25,0x23,0x26,
+	0x25,0x28,0x25,0x28,0x26,0x28,0x28,0x24,0x25,0x25,0x22,0x04,0x2C,0x2F,0x2D,0x2D,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x24,0x28,0x27,0x25,0x28,0x04,0x28,0x24,0x26,0x29,
+	0x28,0x26,0x25,0x25,0x28,0x26,0x25,0x25,0x25,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x22,0x22,0x22,0x23,
+	0x25,0x26,0x25,0x04,0x25,0x28,0x24,0x22,0x26,0x23,0x23,0x26,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x04,0x29,0x28,0x29,0x28,0x28,0x25,0x25,0x26,0x29,
+	0x28,0x04,0x25,0x28,0x04,0x28,0x24,0x26,0x25,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x22,0x26,0x24,0x26,
+	0x28,0x04,0x22,0x26,0x25,0x25,0x22,0x24,0x25,0x23,0x22,0x25,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x33,0x28,0x28,0x28,0x25,0x28,0x29,0x29,0x28,0x25,0x29,
+	0x25,0x26,0x25,0x25,0x26,0x26,0x26,0x28,0x28,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x22,0x24,0x25,0x04,
+	0x24,0x26,0x25,0x04,0x21,0x24,0x20,0x24,0x22,0x25,0x25,0x24,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x33,0x25,0x28,0x25,0x25,0x26,0x25,0x28,0x29,0x25,0x29,
+	0x04,0x04,0x25,0x25,0x24,0x23,0x26,0x04,0x24,0x26,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x22,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x24,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x23,0x2D,0x2D,0x2D,0x2D,0x22,0x24,0x25,0x25,
+	0x22,0x20,0x20,0x20,0x22,0x22,0x26,0x26,0x24,0x23,0x23,0x22,0x28,0x24,0x24,0x24,
+	0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x23,0x23,0x23,0x23,0x23,
+	0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+	0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x36,0x36,0x36,
+	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+	0x35,0x35,0x35,0x35,0x35,0x0C,0x0C,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,
+	0x34,0x34,0x34,0x33,0x33,0x32,0x04,0x25,0x28,0x24,0x25,0x04,0x28,0x24,0x2B,0x29,
+	0x27,0x24,0x25,0x04,0x25,0x25,0x04,0x25,0x22,0x04,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x22,0x23,0x22,
+	0x22,0x04,0x24,0x25,0x26,0x25,0x24,0x04,0x25,0x25,0x24,0x24,0x22,0x26,0x25,0x25,
+	0x24,0x24,0x24,0x26,0x25,0x28,0x25,0x28,0x28,0x28,0x25,0x24,0x26,0x24,0x25,0x28,
+	0x22,0x22,0x25,0x26,0x24,0x24,0x26,0x04,0x26,0x25,0x22,0x04,0x25,0x25,0x28,0x28,
+	0x26,0x26,0x29,0x28,0x28,0x29,0x25,0x29,0x29,0x25,0x29,0x28,0x04,0x29,0x28,0x25,
+	0x04,0x28,0x04,0x26,0x26,0x23,0x26,0x25,0x26,0x28,0x25,0x23,0x25,0x25,0x28,0x26,
+	0x25,0x28,0x26,0x28,0x28,0x25,0x29,0x28,0x28,0x04,0x24,0x28,0x28,0x25,0x28,0x28,
+	0x28,0x28,0x04,0x26,0x26,0x26,0x28,0x26,0x26,0x25,0x26,0x26,0x28,0x28,0x28,0x28,
+	0x28,0x2A,0x29,0x28,0x28,0x29,0x28,0x2A,0x28,0x2A,0x28,0x26,0x28,0x28,0x28,0x28,
+	0x04,0x04,0x28,0x24,0x25,0x25,0x24,0x20,0x20,0x04,0x25,0x25,0x25,0x26,0x24,0x25,
+	0x24,0x23,0x28,0x26,0x24,0x28,0x04,0x26,0x26,0x04,0x04,0x04,0x23,0x26,0x25,0x22,
+	0x28,0x25,0x24,0x04,0x24,0x25,0x25,0x27,0x04,0x28,0x28,0x28,0x28,0x04,0x28,0x29,
+	0x04,0x04,0x25,0x25,0x23,0x26,0x23,0x04,0x24,0x23,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x24,0x25,0x25,
+	0x28,0x24,0x24,0x24,0x25,0x22,0x26,0x25,0x24,0x26,0x23,0x22,0x25,0x04,0x24,0x24,
+	0x28,0x23,0x28,0x23,0x23,0x04,0x26,0x25,0x25,0x25,0x28,0x24,0x26,0x21,0x25,0x24,
+	0x22,0x26,0x24,0x24,0x25,0x04,0x04,0x26,0x25,0x28,0x04,0x25,0x28,0x04,0x26,0x28,
+	0x29,0x29,0x26,0x29,0x04,0x28,0x25,0x04,0x04,0x28,0x25,0x28,0x28,0x28,0x25,0x28,
+	0x28,0x24,0x28,0x04,0x04,0x26,0x24,0x25,0x25,0x26,0x26,0x28,0x28,0x28,0x25,0x26,
+	0x28,0x26,0x25,0x26,0x25,0x28,0x26,0x28,0x29,0x26,0x25,0x28,0x28,0x28,0x26,0x25,
+	0x29,0x04,0x26,0x04,0x24,0x04,0x25,0x25,0x28,0x04,0x25,0x04,0x26,0x28,0x28,0x25,
+	0x28,0x26,0x04,0x29,0x28,0x26,0x25,0x28,0x28,0x25,0x28,0x2A,0x25,0x28,0x28,0x26,
+	0x04,0x23,0x20,0x24,0x22,0x24,0x22,0x25,0x22,0x25,0x25,0x23,0x22,0x22,0x22,0x26,
+	0x25,0x28,0x26,0x28,0x04,0x04,0x28,0x29,0x28,0x25,0x25,0x28,0x28,0x28,0x28,0x26,
+	0x29,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,
+	0x28,0x28,0x25,0x23,0x25,0x23,0x23,0x23,0x25,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x28,0x23,
+	0x26,0x24,0x26,0x25,0x28,0x25,0x25,0x26,0x22,0x23,0x26,0x25,0x23,0x25,0x25,0x24,
+	0x25,0x23,0x25,0x26,0x24,0x26,0x24,0x28,0x25,0x24,0x04,0x22,0x28,0x23,0x28,0x04,
+	0x24,0x04,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x24,0x28,0x28,0x29,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x28,0x28,0x04,0x25,0x26,0x28,0x04,0x28,0x26,0x28,0x28,0x04,0x25,
+	0x26,0x25,0x26,0x25,0x26,0x24,0x28,0x28,0x26,0x04,0x28,0x24,0x25,0x25,0x28,0x04,
+	0x28,0x28,0x04,0x28,0x26,0x28,0x25,0x26,0x28,0x28,0x28,0x28,0x04,0x28,0x28,0x25,
+	0x26,0x04,0x24,0x25,0x04,0x22,0x22,0x20,0x28,0x26,0x26,0x28,0x25,0x25,0x04,0x25,
+	0x04,0x23,0x28,0x22,0x22,0x27,0x28,0x25,0x25,0x28,0x04,0x04,0x26,0x28,0x28,0x28,
+	0x25,0x25,0x25,0x24,0x24,0x25,0x23,0x24,0x23,0x25,0x25,0x23,0x24,0x21,0x04,0x26,
+	0x25,0x28,0x25,0x26,0x28,0x04,0x04,0x26,0x29,0x04,0x28,0x29,0x26,0x29,0x28,0x25,
+	0x29,0x28,0x28,0x28,0x26,0x2A,0x2A,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x2D,0x29,
+	0x25,0x22,0x22,0x25,0x26,0x25,0x04,0x25,0x25,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x20,0x24,0x25,0x24,
+	0x23,0x26,0x24,0x24,0x25,0x26,0x22,0x04,0x22,0x26,0x24,0x28,0x24,0x04,0x24,0x25,
+	0x28,0x25,0x26,0x26,0x25,0x28,0x04,0x25,0x24,0x04,0x25,0x25,0x23,0x25,0x28,0x04,
+	0x24,0x04,0x28,0x24,0x28,0x29,0x26,0x28,0x04,0x29,0x25,0x2A,0x26,0x28,0x28,0x28,
+	0x04,0x24,0x28,0x28,0x28,0x23,0x25,0x28,0x24,0x26,0x26,0x25,0x28,0x22,0x26,0x25,
+	0x28,0x04,0x25,0x04,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x22,0x24,0x26,0x28,0x26,
+	0x26,0x28,0x26,0x28,0x26,0x26,0x25,0x04,0x25,0x24,0x26,0x28,0x26,0x25,0x28,0x24,
+	0x23,0x20,0x24,0x20,0x20,0x23,0x23,0x22,0x28,0x25,0x28,0x04,0x04,0x25,0x28,0x26,
+	0x28,0x24,0x26,0x25,0x28,0x04,0x28,0x28,0x04,0x27,0x28,0x28,0x25,0x28,0x28,0x04,
+	0x25,0x25,0x25,0x04,0x25,0x24,0x20,0x22,0x23,0x22,0x25,0x23,0x25,0x28,0x28,0x28,
+	0x25,0x28,0x25,0x28,0x28,0x04,0x28,0x28,0x28,0x25,0x28,0x28,0x26,0x28,0x26,0x28,
+	0x25,0x25,0x28,0x28,0x28,0x24,0x25,0x04,0x28,0x28,0x2A,0x28,0x28,0x28,0x28,0x29,
+	0x23,0x23,0x23,0x25,0x04,0x24,0x23,0x24,0x21,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x04,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x23,0x27,0x27,0x27,0x27,0x25,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x25,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x20,0x22,0x23,0x04,
+	0x25,0x26,0x28,0x24,0x25,0x23,0x26,0x28,0x28,0x04,0x25,0x28,0x28,0x25,0x25,0x28,
+	0x25,0x24,0x23,0x28,0x04,0x23,0x23,0x26,0x22,0x25,0x25,0x26,0x25,0x26,0x28,0x28,
+	0x25,0x26,0x28,0x28,0x28,0x28,0x28,0x26,0x04,0x28,0x28,0x28,0x25,0x25,0x24,0x26,
+	0x28,0x04,0x25,0x28,0x04,0x26,0x28,0x04,0x26,0x28,0x24,0x28,0x28,0x26,0x25,0x04,
+	0x28,0x25,0x04,0x28,0x04,0x28,0x28,0x28,0x04,0x28,0x28,0x24,0x26,0x26,0x24,0x28,
+	0x04,0x26,0x25,0x26,0x25,0x28,0x25,0x26,0x24,0x25,0x26,0x04,0x26,0x25,0x26,0x28,
+	0x20,0x20,0x22,0x25,0x23,0x24,0x28,0x23,0x25,0x04,0x25,0x28,0x26,0x25,0x25,0x04,
+	0x24,0x26,0x24,0x26,0x28,0x25,0x25,0x26,0x04,0x26,0x28,0x26,0x25,0x24,0x25,0x25,
+	0x22,0x20,0x20,0x22,0x24,0x28,0x28,0x26,0x26,0x04,0x25,0x24,0x28,0x29,0x28,0x28,
+	0x28,0x26,0x28,0x04,0x29,0x28,0x28,0x28,0x28,0x28,0x04,0x28,0x2A,0x2A,0x28,0x26,
+	0x25,0x24,0x28,0x2A,0x26,0x28,0x25,0x2A,0x2A,0x28,0x28,0x28,0x28,0x24,0x22,0x29,
+	0x24,0x22,0x23,0x25,0x23,0x22,0x25,0x23,0x22,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x20,0x26,0x24,0x25,
+	0x25,0x25,0x28,0x23,0x28,0x26,0x26,0x23,0x23,0x25,0x28,0x26,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,
+	0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,
+	0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2C,
+	0x2C,0x2C,0x2C,0x2C,0x2C,0x26,0x26,0x28,0x28,0x29,0x26,0x26,0x28,0x04,0x25,0x29,
+	0x23,0x20,0x20,0x24,0x22,0x22,0x26,0x24,0x22,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x04,0x04,
+	0x25,0x28,0x25,0x25,0x04,0x25,0x26,0x04,0x21,0x23,0x28,0x23,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x23,0x28,0x04,0x28,0x26,0x25,0x23,0x28,0x26,0x24,0x29,
+	0x20,0x20,0x23,0x23,0x22,0x20,0x24,0x22,0x20,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x26,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x23,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x26,0x23,
+	0x22,0x28,0x25,0x28,0x25,0x25,0x25,0x24,0x22,0x25,0x26,0x24,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x20,0x04,0x25,0x25,0x25,0x26,0x26,0x26,0x28,0x28,0x29,
+	0x20,0x26,0x20,0x25,0x22,0x20,0x24,0x20,0x25,0x20,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x21,0x25,0x25,
+	0x23,0x22,0x24,0x22,0x22,0x28,0x04,0x23,0x25,0x28,0x24,0x23,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x26,0x28,0x28,0x04,0x04,0x04,0x28,0x04,0x23,0x29,
+	0x22,0x22,0x23,0x26,0x23,0x20,0x22,0x25,0x22,0x20,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x24,0x04,0x23,
+	0x24,0x24,0x28,0x22,0x25,0x23,0x25,0x25,0x04,0x28,0x25,0x26,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x26,0x24,0x22,0x24,0x24,0x28,0x04,0x25,0x25,0x29,
+	0x20,0x23,0x24,0x20,0x25,0x24,0x28,0x24,0x23,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x24,0x28,
+	0x24,0x23,0x23,0x25,0x24,0x26,0x24,0x25,0x24,0x25,0x25,0x04,0x2F,0x2F,0x2D,0x2D,
+	0x32,0x33,0x33,0x34,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x35,0x35,0x35,0x35,0x36,0x36,
+	0x36,0x36,0x20,0x23,0x2F,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x28,0x28,0x22,0x04,0x28,0x25,0x04,0x04,0x24,0x29,
+	0x24,0x22,0x25,0x21,0x22,0x23,0x22,0x26,0x26,0x23,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x20,0x23,0x23,0x25,
+	0x25,0x25,0x25,0x25,0x23,0x26,0x28,0x25,0x26,0x25,0x26,0x25,0x2E,0x2F,0x2D,0x2D,
+	0x33,0x36,0x22,0x25,0x27,0x27,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x2C,0x2F,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x26,0x24,0x24,0x04,0x28,0x04,0x26,0x25,0x28,0x29,
+	0x25,0x26,0x25,0x23,0x26,0x25,0x24,0x25,0x04,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x24,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x28,0x27,0x27,0x27,0x27,0x25,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x04,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x20,0x22,0x23,0x23,
+	0x26,0x23,0x28,0x24,0x04,0x28,0x28,0x28,0x23,0x28,0x27,0x27,0x2E,0x2F,0x2D,0x2D,
+	0x34,0x22,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x28,0x28,0x2C,0x2F,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x28,0x28,0x25,0x26,0x26,0x26,0x04,0x24,0x20,0x29,
+	0x25,0x26,0x22,0x25,0x24,0x25,0x24,0x04,0x26,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x24,0x26,
+	0x04,0x25,0x26,0x26,0x04,0x28,0x23,0x04,0x04,0x29,0x28,0x28,0x2E,0x2F,0x2D,0x2D,
+	0x34,0x25,0x27,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2D,0x2F,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x26,0x28,0x25,0x25,0x28,0x28,0x28,0x24,0x04,0x29,
+	0x26,0x23,0x23,0x25,0x25,0x04,0x25,0x25,0x26,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x20,0x28,0x25,0x26,
+	0x25,0x25,0x26,0x26,0x25,0x04,0x26,0x28,0x28,0x28,0x26,0x26,0x2E,0x2F,0x2D,0x2D,
+	0x35,0x27,0x27,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2D,0x2F,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x24,0x25,0x24,0x28,0x23,0x25,0x22,0x04,0x25,0x29,
+	0x25,0x25,0x25,0x28,0x25,0x24,0x23,0x25,0x23,0x23,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x24,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x28,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x23,0x28,
+	0x23,0x26,0x29,0x04,0x28,0x29,0x28,0x28,0x26,0x28,0x28,0x04,0x2E,0x2F,0x2D,0x2D,
+	0x36,0x27,0x28,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2E,0x2F,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x04,0x04,0x25,0x26,0x26,0x26,0x28,0x25,0x28,0x29,
+	0x04,0x24,0x23,0x24,0x23,0x24,0x22,0x25,0x24,0x23,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x28,0x25,0x28,
+	0x28,0x25,0x04,0x25,0x29,0x26,0x28,0x28,0x28,0x25,0x23,0x04,0x2D,0x2F,0x2D,0x2D,
+	0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x2E,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x25,0x28,0x26,0x28,0x28,0x25,0x28,0x28,0x28,0x29,
+	0x23,0x25,0x26,0x28,0x22,0x25,0x04,0x28,0x28,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x29,0x29,0x25,
+	0x28,0x04,0x04,0x28,0x28,0x28,0x28,0x28,0x25,0x28,0x25,0x28,0x2D,0x2F,0x2D,0x2D,
+	0x23,0x2A,0x2C,0x2C,0x2D,0x2D,0x2D,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,
+	0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x28,0x26,0x04,0x2A,0x04,0x24,0x28,0x29,0x04,0x29,
+	0x25,0x25,0x25,0x04,0x04,0x24,0x28,0x28,0x28,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x20,0x28,0x28,0x25,
+	0x28,0x28,0x28,0x29,0x28,0x28,0x27,0x25,0x04,0x28,0x26,0x24,0x2C,0x2F,0x2D,0x2D,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x04,0x28,0x29,0x28,0x04,0x2A,0x2A,0x2A,0x28,0x29,
+	0x28,0x25,0x25,0x04,0x24,0x28,0x04,0x26,0x28,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x29,0x28,
+	0x25,0x29,0x28,0x2A,0x25,0x24,0x28,0x25,0x24,0x26,0x04,0x22,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x28,0x28,0x2A,0x25,0x28,0x04,0x25,0x26,0x28,0x29,
+	0x25,0x25,0x25,0x26,0x25,0x24,0x25,0x28,0x28,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x04,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x26,0x27,0x27,0x27,0x27,0x25,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x28,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x26,0x04,
+	0x28,0x26,0x24,0x22,0x25,0x25,0x25,0x28,0x22,0x20,0x26,0x22,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x33,0x25,0x25,0x25,0x28,0x28,0x2A,0x04,0x29,0x28,0x29,
+	0x04,0x23,0x26,0x28,0x25,0x28,0x04,0x28,0x24,0x04,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x28,0x28,
+	0x28,0x25,0x25,0x28,0x22,0x24,0x25,0x25,0x25,0x26,0x04,0x28,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x33,0x25,0x04,0x28,0x25,0x04,0x2A,0x28,0x2A,0x2B,0x29,
+	0x24,0x28,0x22,0x23,0x24,0x26,0x04,0x25,0x24,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x26,0x28,
+	0x25,0x22,0x26,0x23,0x23,0x25,0x22,0x20,0x26,0x20,0x23,0x04,0x28,0x24,0x24,0x24,
+	0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x23,0x23,0x23,0x23,0x23,
+	0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+	0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x36,0x36,0x36,
+	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+	0x35,0x35,0x35,0x35,0x35,0x0C,0x0C,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,
+	0x34,0x34,0x34,0x33,0x33,0x32,0x29,0x25,0x28,0x28,0x2A,0x28,0x29,0x28,0x25,0x29,
+	0x04,0x23,0x23,0x24,0x24,0x04,0x28,0x24,0x26,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x28,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x24,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x22,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x25,0x20,
+	0x24,0x23,0x24,0x20,0x22,0x24,0x25,0x24,0x24,0x25,0x25,0x24,0x28,0x28,0x28,0x04,
+	0x28,0x25,0x28,0x28,0x25,0x04,0x28,0x28,0x04,0x25,0x25,0x28,0x04,0x28,0x28,0x26,
+	0x28,0x24,0x24,0x20,0x22,0x04,0x25,0x23,0x21,0x21,0x26,0x25,0x21,0x25,0x28,0x23,
+	0x25,0x25,0x22,0x23,0x25,0x22,0x22,0x22,0x20,0x23,0x25,0x23,0x28,0x04,0x04,0x28,
+	0x24,0x25,0x25,0x25,0x20,0x22,0x23,0x24,0x26,0x25,0x24,0x26,0x26,0x28,0x22,0x24,
+	0x26,0x26,0x25,0x24,0x23,0x23,0x24,0x25,0x26,0x24,0x25,0x25,0x24,0x20,0x20,0x22,
+	0x28,0x25,0x25,0x24,0x23,0x25,0x24,0x25,0x24,0x25,0x22,0x23,0x04,0x04,0x25,0x23,
+	0x25,0x28,0x28,0x25,0x22,0x24,0x25,0x25,0x25,0x04,0x28,0x25,0x28,0x26,0x24,0x26,
+	0x25,0x23,0x04,0x25,0x26,0x25,0x25,0x24,0x04,0x25,0x24,0x26,0x04,0x28,0x29,0x28,
+	0x28,0x28,0x2A,0x28,0x28,0x28,0x29,0x28,0x26,0x26,0x04,0x24,0x22,0x04,0x25,0x28,
+	0x25,0x26,0x29,0x25,0x28,0x24,0x28,0x26,0x29,0x28,0x25,0x28,0x04,0x26,0x04,0x29,
+	0x04,0x04,0x23,0x28,0x28,0x25,0x25,0x23,0x04,0x26,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x36,0x20,0x22,0x23,
+	0x20,0x24,0x22,0x24,0x22,0x20,0x24,0x25,0x26,0x24,0x25,0x28,0x22,0x04,0x28,0x2A,
+	0x28,0x28,0x26,0x29,0x28,0x29,0x28,0x26,0x25,0x25,0x26,0x24,0x28,0x26,0x28,0x23,
+	0x22,0x20,0x04,0x26,0x24,0x22,0x28,0x28,0x25,0x23,0x04,0x24,0x22,0x04,0x24,0x04,
+	0x25,0x28,0x25,0x28,0x25,0x24,0x26,0x28,0x04,0x24,0x22,0x04,0x23,0x04,0x04,0x24,
+	0x26,0x26,0x26,0x25,0x25,0x28,0x22,0x23,0x28,0x25,0x28,0x25,0x22,0x25,0x23,0x28,
+	0x04,0x26,0x28,0x25,0x28,0x28,0x24,0x25,0x26,0x25,0x28,0x22,0x22,0x25,0x25,0x28,
+	0x25,0x22,0x25,0x20,0x25,0x20,0x25,0x24,0x22,0x24,0x26,0x26,0x04,0x26,0x24,0x26,
+	0x25,0x26,0x24,0x04,0x25,0x26,0x25,0x24,0x26,0x24,0x26,0x26,0x04,0x28,0x26,0x24,
+	0x28,0x25,0x04,0x25,0x28,0x04,0x22,0x24,0x04,0x27,0x26,0x28,0x04,0x25,0x25,0x28,
+	0x28,0x04,0x28,0x29,0x23,0x25,0x28,0x26,0x25,0x22,0x25,0x24,0x22,0x22,0x28,0x29,
+	0x28,0x28,0x28,0x28,0x25,0x04,0x04,0x26,0x29,0x25,0x24,0x04,0x26,0x22,0x24,0x29,
+	0x25,0x28,0x28,0x26,0x04,0x25,0x23,0x04,0x25,0x26,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x36,0x20,0x25,0x22,
+	0x24,0x23,0x22,0x25,0x25,0x28,0x26,0x25,0x04,0x24,0x28,0x28,0x29,0x28,0x25,0x2A,
+	0x28,0x28,0x04,0x28,0x25,0x25,0x22,0x22,0x26,0x20,0x20,0x26,0x24,0x24,0x28,0x26,
+	0x28,0x25,0x28,0x28,0x25,0x25,0x26,0x28,0x28,0x04,0x28,0x25,0x24,0x25,0x04,0x28,
+	0x26,0x26,0x28,0x04,0x26,0x25,0x26,0x24,0x28,0x28,0x25,0x24,0x28,0x04,0x25,0x25,
+	0x25,0x25,0x25,0x04,0x24,0x04,0x24,0x25,0x04,0x26,0x28,0x25,0x28,0x24,0x25,0x26,
+	0x25,0x26,0x26,0x04,0x28,0x26,0x25,0x26,0x25,0x25,0x25,0x22,0x20,0x22,0x25,0x23,
+	0x20,0x20,0x22,0x28,0x28,0x22,0x24,0x23,0x26,0x25,0x28,0x25,0x28,0x28,0x28,0x23,
+	0x25,0x25,0x24,0x28,0x28,0x26,0x26,0x25,0x25,0x28,0x24,0x25,0x24,0x28,0x25,0x28,
+	0x28,0x28,0x04,0x25,0x28,0x28,0x25,0x28,0x28,0x28,0x29,0x28,0x28,0x28,0x28,0x28,
+	0x29,0x28,0x27,0x27,0x25,0x24,0x24,0x25,0x04,0x26,0x25,0x25,0x28,0x29,0x24,0x26,
+	0x25,0x26,0x25,0x24,0x27,0x25,0x25,0x25,0x04,0x28,0x04,0x04,0x28,0x28,0x28,0x29,
+	0x28,0x26,0x04,0x04,0x22,0x25,0x22,0x24,0x25,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x25,0x24,
+	0x24,0x26,0x26,0x04,0x25,0x25,0x28,0x28,0x04,0x2A,0x04,0x28,0x28,0x28,0x26,0x28,
+	0x28,0x28,0x26,0x28,0x22,0x23,0x25,0x22,0x26,0x28,0x24,0x25,0x28,0x26,0x28,0x28,
+	0x04,0x26,0x24,0x28,0x25,0x25,0x28,0x25,0x04,0x25,0x22,0x26,0x26,0x24,0x26,0x04,
+	0x28,0x04,0x28,0x25,0x25,0x04,0x28,0x25,0x24,0x26,0x24,0x04,0x04,0x24,0x28,0x25,
+	0x04,0x26,0x26,0x28,0x25,0x25,0x23,0x26,0x04,0x28,0x26,0x25,0x28,0x25,0x24,0x04,
+	0x24,0x22,0x26,0x24,0x28,0x28,0x28,0x26,0x28,0x26,0x24,0x24,0x20,0x24,0x23,0x20,
+	0x24,0x28,0x24,0x26,0x25,0x28,0x26,0x04,0x26,0x28,0x25,0x26,0x24,0x23,0x26,0x26,
+	0x28,0x26,0x28,0x22,0x25,0x26,0x25,0x25,0x26,0x04,0x24,0x28,0x04,0x25,0x28,0x26,
+	0x28,0x28,0x29,0x26,0x04,0x04,0x28,0x28,0x25,0x28,0x25,0x28,0x26,0x28,0x26,0x28,
+	0x04,0x28,0x25,0x22,0x28,0x26,0x26,0x28,0x04,0x26,0x29,0x25,0x28,0x24,0x26,0x26,
+	0x26,0x25,0x25,0x25,0x28,0x28,0x26,0x26,0x04,0x24,0x23,0x24,0x25,0x28,0x04,0x29,
+	0x22,0x22,0x21,0x24,0x25,0x25,0x26,0x23,0x26,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x04,0x25,
+	0x04,0x25,0x28,0x04,0x26,0x28,0x28,0x28,0x24,0x25,0x28,0x28,0x26,0x04,0x28,0x25,
+	0x26,0x26,0x24,0x23,0x04,0x28,0x24,0x28,0x24,0x26,0x28,0x04,0x26,0x26,0x24,0x25,
+	0x24,0x2A,0x26,0x29,0x28,0x28,0x04,0x26,0x28,0x25,0x26,0x26,0x26,0x28,0x26,0x25,
+	0x26,0x26,0x25,0x25,0x25,0x26,0x04,0x04,0x25,0x26,0x25,0x24,0x26,0x26,0x24,0x25,
+	0x26,0x28,0x25,0x28,0x26,0x28,0x26,0x28,0x28,0x26,0x25,0x25,0x25,0x25,0x28,0x23,
+	0x28,0x28,0x22,0x25,0x04,0x28,0x04,0x24,0x24,0x23,0x25,0x04,0x25,0x22,0x20,0x04,
+	0x26,0x25,0x24,0x26,0x26,0x28,0x26,0x26,0x04,0x26,0x25,0x24,0x25,0x24,0x24,0x28,
+	0x24,0x25,0x04,0x24,0x25,0x26,0x23,0x24,0x27,0x28,0x28,0x28,0x29,0x28,0x25,0x28,
+	0x2A,0x2A,0x2A,0x29,0x2A,0x28,0x26,0x28,0x28,0x26,0x28,0x26,0x24,0x25,0x28,0x26,
+	0x25,0x26,0x04,0x28,0x04,0x28,0x04,0x24,0x28,0x04,0x28,0x28,0x29,0x04,0x28,0x23,
+	0x04,0x28,0x24,0x28,0x26,0x28,0x28,0x28,0x28,0x27,0x25,0x04,0x04,0x28,0x26,0x29,
+	0x22,0x25,0x26,0x04,0x25,0x23,0x26,0x23,0x23,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x25,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x20,0x27,0x27,0x27,0x27,0x25,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x23,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x24,0x26,
+	0x29,0x28,0x29,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x25,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,
+	0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,
+	0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2C,
+	0x2C,0x2C,0x2C,0x2C,0x2C,0x26,0x28,0x26,0x28,0x28,0x25,0x26,0x28,0x29,0x25,0x29,
+	0x24,0x23,0x21,0x22,0x28,0x25,0x23,0x21,0x28,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x28,0x04,
+	0x04,0x28,0x28,0x28,0x29,0x28,0x26,0x28,0x26,0x24,0x28,0x28,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x23,0x28,0x26,0x04,0x28,0x28,0x04,0x29,0x28,0x04,0x29,
+	0x22,0x26,0x22,0x22,0x23,0x04,0x24,0x25,0x24,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x25,0x29,
+	0x26,0x26,0x28,0x28,0x26,0x28,0x28,0x26,0x04,0x25,0x04,0x22,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x20,0x25,0x28,0x28,0x28,0x28,0x25,0x25,0x25,0x27,0x29,
+	0x23,0x24,0x23,0x26,0x04,0x28,0x25,0x26,0x23,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x24,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x24,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x24,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x28,0x28,
+	0x28,0x28,0x25,0x28,0x24,0x04,0x26,0x04,0x28,0x28,0x26,0x20,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x28,0x04,0x04,0x2A,0x04,0x28,0x24,0x28,0x29,
+	0x24,0x24,0x25,0x23,0x28,0x04,0x26,0x26,0x25,0x04,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x26,0x28,
+	0x26,0x04,0x28,0x04,0x28,0x25,0x24,0x26,0x25,0x22,0x25,0x28,0x2F,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x04,0x28,0x28,0x2A,0x29,0x28,0x28,0x2A,0x29,
+	0x28,0x23,0x04,0x25,0x28,0x22,0x26,0x28,0x23,0x04,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x26,0x24,
+	0x26,0x28,0x24,0x04,0x25,0x24,0x22,0x20,0x20,0x23,0x24,0x25,0x2F,0x2F,0x2D,0x2D,
+	0x32,0x33,0x33,0x34,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x35,0x35,0x35,0x35,0x36,0x36,
+	0x36,0x36,0x20,0x23,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x28,0x28,0x28,0x28,0x28,0x26,0x04,0x04,0x28,0x29,
+	0x23,0x25,0x04,0x28,0x25,0x25,0x22,0x24,0x25,0x04,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x36,0x28,0x25,0x26,
+	0x24,0x20,0x22,0x20,0x22,0x26,0x22,0x23,0x25,0x04,0x25,0x04,0x2E,0x2F,0x2D,0x2D,
+	0x33,0x36,0x22,0x25,0x27,0x27,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x2C,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x04,0x29,0x29,0x04,0x28,0x04,0x22,0x22,0x20,0x29,
+	0x04,0x25,0x25,0x23,0x23,0x25,0x22,0x25,0x23,0x26,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x36,0x20,0x25,0x25,
+	0x25,0x22,0x04,0x23,0x04,0x24,0x04,0x04,0x24,0x04,0x04,0x28,0x2E,0x2F,0x2D,0x2D,
+	0x34,0x22,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	0x00,0x28,0x28,0x2C,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x29,0x28,0x27,0x25,0x26,0x22,0x24,0x24,0x20,0x29,
+	0x28,0x24,0x25,0x24,0x26,0x22,0x28,0x24,0x22,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x25,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x28,0x27,0x27,0x27,0x27,0x25,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x28,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x36,0x25,0x25,0x25,
+	0x25,0x25,0x04,0x23,0x04,0x25,0x26,0x25,0x25,0x22,0x26,0x28,0x2E,0x2F,0x2D,0x2D,
+	0x34,0x25,0x27,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2D,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x04,0x04,0x23,0x25,0x24,0x25,0x23,0x23,0x04,0x29,
+	0x23,0x26,0x23,0x25,0x25,0x25,0x04,0x22,0x24,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x04,0x24,0x28,
+	0x25,0x25,0x24,0x23,0x24,0x25,0x28,0x23,0x23,0x04,0x04,0x22,0x2E,0x2F,0x2D,0x2D,
+	0x35,0x27,0x27,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2D,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x25,0x23,0x22,0x04,0x23,0x22,0x28,0x28,0x25,0x29,
+	0x25,0x22,0x23,0x24,0x24,0x20,0x23,0x26,0x23,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x35,0x22,0x24,0x25,
+	0x25,0x24,0x25,0x22,0x25,0x25,0x26,0x25,0x26,0x22,0x28,0x28,0x2E,0x2F,0x2D,0x2D,
+	0x36,0x27,0x28,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
+	0x1F,0x28,0x28,0x2E,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x25,0x20,0x25,0x24,0x25,0x26,0x04,0x24,0x28,0x29,
+	0x23,0x23,0x25,0x24,0x24,0x04,0x04,0x22,0x25,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x28,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x35,0x24,0x28,0x26,
+	0x25,0x04,0x25,0x28,0x24,0x22,0x25,0x26,0x23,0x25,0x25,0x28,0x2D,0x2F,0x2D,0x2D,
+	0x20,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,
+	0x28,0x28,0x28,0x2E,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x0C,0x22,0x24,0x04,0x25,0x25,0x04,0x04,0x28,0x04,0x29,
+	0x25,0x23,0x25,0x23,0x25,0x21,0x22,0x25,0x22,0x23,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x35,0x25,0x25,0x23,
+	0x24,0x24,0x24,0x25,0x21,0x24,0x25,0x25,0x22,0x28,0x04,0x22,0x2D,0x2F,0x2D,0x2D,
+	0x23,0x2A,0x2C,0x2C,0x2D,0x2D,0x2D,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x23,0x28,0x04,0x23,0x04,0x28,0x26,0x26,0x27,0x29,
+	0x26,0x26,0x25,0x22,0x22,0x20,0x25,0x20,0x25,0x04,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x35,0x24,0x04,0x28,
+	0x22,0x26,0x24,0x24,0x25,0x24,0x25,0x28,0x25,0x24,0x24,0x25,0x2C,0x2F,0x2D,0x2D,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,
+	0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,
+	0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x17,0x17,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x26,0x04,0x28,0x26,0x26,0x04,0x04,0x25,0x25,0x29,
+	0x25,0x22,0x24,0x22,0x20,0x23,0x20,0x25,0x24,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x35,0x04,0x04,0x25,
+	0x23,0x22,0x25,0x04,0x25,0x26,0x28,0x25,0x24,0x04,0x28,0x25,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x34,0x25,0x25,0x28,0x04,0x26,0x25,0x26,0x28,0x26,0x29,
+	0x20,0x04,0x22,0x04,0x24,0x24,0x26,0x23,0x25,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x35,0x25,0x28,0x24,
+	0x22,0x24,0x22,0x04,0x25,0x23,0x22,0x25,0x23,0x24,0x04,0x25,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x33,0x04,0x28,0x04,0x28,0x04,0x26,0x28,0x25,0x28,0x29,
+	0x24,0x20,0x26,0x21,0x25,0x22,0x25,0x28,0x04,0x23,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x28,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2B,0x28,0x27,0x27,0x27,0x27,0x25,0x22,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2B,0x25,0x27,0x27,0x27,0x27,0x25,0x22,0x2D,0x2D,0x2D,0x2D,0x35,0x22,0x04,0x28,
+	0x25,0x23,0x23,0x28,0x25,0x25,0x24,0x24,0x23,0x28,0x24,0x26,0x2C,0x2F,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x33,0x25,0x26,0x28,0x04,0x04,0x24,0x28,0x25,0x28,0x29,
+	0x20,0x25,0x04,0x23,0x25,0x22,0x22,0x25,0x25,0x25,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x35,0x25,0x28,0x24,
+	0x04,0x25,0x24,0x24,0x26,0x25,0x22,0x28,0x23,0x26,0x28,0x24,0x28,0x24,0x24,0x24,
+	0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x23,0x23,0x23,0x23,0x23,
+	0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
+	0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
+	0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x36,0x36,0x36,
+	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,
+	0x35,0x35,0x35,0x35,0x35,0x0C,0x0C,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,
+	0x34,0x34,0x34,0x33,0x33,0x32,0x28,0x04,0x25,0x04,0x26,0x04,0x04,0x28,0x04,0x29,
+	0x22,0x26,0x04,0x24,0x22,0x25,0x26,0x23,0x22,0x22,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,
+	0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x00,0x00,0x00,0x00,0x2F,0x2F,0x2B,0x2D,0x2D,0x2D,0x2D,0x35,0x26,0x21,0x24,
+	0x26,0x25,0x23,0x25,0x23,0x25,0x25,0x25,0x24,0x23,0x25,0x26,0x26,0x23,0x25,0x25,
+	0x04,0x26,0x24,0x24,0x21,0x25,0x25,0x25,0x25,0x26,0x04,0x26,0x25,0x04,0x26,0x26,
+	0x04,0x28,0x28,0x28,0x28,0x25,0x26,0x04,0x23,0x25,0x25,0x25,0x26,0x26,0x24,0x26,
+	0x28,0x26,0x25,0x04,0x25,0x26,0x04,0x23,0x23,0x20,0x25,0x22,0x20,0x04,0x22,0x23,
+	0x24,0x04,0x22,0x24,0x26,0x24,0x28,0x28,0x04,0x27,0x04,0x28,0x04,0x25,0x26,0x28,
+	0x28,0x29,0x28,0x26,0x28,0x25,0x28,0x28,0x28,0x28,0x28,0x2A,0x28,0x29,0x28,0x29,
+	0x2A,0x28,0x28,0x25,0x28,0x28,0x28,0x04,0x26,0x28,0x28,0x2B,0x29,0x29,0x28,0x24,
+	0x28,0x25,0x29,0x04,0x28,0x25,0x2A,0x2A,0x28,0x28,0x28,0x29,0x2B,0x28,0x2A,0x2A,
+	0x04,0x28,0x28,0x28,0x04,0x28,0x22,0x22,0x20,0x20,0x22,0x20,0x20,0x22,0x23,0x04,
+	0x04,0x26,0x22,0x24,0x24,0x04,0x24,0x25,0x23,0x25,0x25,0x28,0x25,0x25,0x26,0x28,
+	0x25,0x26,0x04,0x26,0x04,0x24,0x28,0x28,0x28,0x28,0x28,0x26,0x04,0x04,0x26,0x29,
+	0x22,0x22,0x21,0x20,0x20,0x24,0x25,0x20,0x23,0x24,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x2D,0x2D,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x28,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x25,0x2D,0x2D,0x2D,0x2D,0x35,0x24,0x23,0x26,
+	0x22,0x24,0x04,0x04,0x26,0x24,0x26,0x23,0x25,0x28,0x04,0x25,0x26,0x22,0x23,0x23,
+	0x23,0x28,0x23,0x25,0x04,0x23,0x23,0x23,0x25,0x25,0x25,0x04,0x28,0x28,0x04,0x04,
+	0x25,0x26,0x26,0x26,0x26,0x28,0x28,0x28,0x28,0x24,0x25,0x26,0x24,0x28,0x28,0x04,
+	0x24,0x25,0x04,0x23,0x26,0x26,0x25,0x25,0x26,0x20,0x25,0x23,0x26,0x04,0x25,0x25,
+	0x22,0x20,0x26,0x26,0x28,0x26,0x28,0x04,0x26,0x24,0x28,0x26,0x04,0x28,0x28,0x28,
+	0x28,0x28,0x25,0x28,0x25,0x26,0x28,0x29,0x28,0x28,0x28,0x2A,0x28,0x28,0x25,0x2A,
+	0x26,0x2B,0x29,0x28,0x2B,0x2B,0x2B,0x28,0x28,0x28,0x28,0x28,0x04,0x29,0x26,0x28,
+	0x29,0x28,0x28,0x2B,0x04,0x29,0x25,0x04,0x28,0x24,0x25,0x2A,0x28,0x04,0x28,0x28,
+	0x28,0x28,0x28,0x04,0x21,0x23,0x25,0x23,0x24,0x26,0x24,0x25,0x25,0x24,0x28,0x26,
+	0x24,0x28,0x26,0x24,0x25,0x04,0x24,0x23,0x04,0x28,0x25,0x22,0x28,0x24,0x28,0x28,
+	0x28,0x28,0x28,0x28,0x28,0x04,0x28,0x23,0x23,0x04,0x04,0x26,0x28,0x24,0x25,0x29,
+	0x20,0x20,0x20,0x26,0x25,0x22,0x28,0x25,0x04,0x28,0x2F,0x2F,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x17,0x17,0x2D,0x2D,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,
+	0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,
+	0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,
+	0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x2D,0x17,0x17,0x17,0x17,0x17,0x17,
+	0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x17,0x17,0x2D,0x2D,0x17,0x17,0x2D,0x2D,
+	0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x27,0x2D,0x2D,0x2D,0x2D,0x35,0x04,0x24,0x23,
+	0x28,0x04,0x04,0x25,0x25,0x24,0x22,0x24,0x24,0x26,0x25,0x25,0x25,0x28,0x28,0x26,
+	0x24,0x24,0x04,0x23,0x04,0x25,0x04,0x26,0x26,0x26,0x25,0x04,0x26,0x24,0x25,0x28,
+	0x26,0x04,0x26,0x28,0x23,0x28,0x28,0x23,0x25,0x04,0x25,0x25,0x26,0x28,0x28,0x25,
+	0x26,0x28,0x26,0x22,0x26,0x23,0x23,0x22,0x22,0x20,0x26,0x04,0x25,0x28,0x25,0x23,
+	0x23,0x24,0x24,0x28,0x25,0x28,0x28,0x26,0x26,0x23,0x26,0x04,0x28,0x26,0x25,0x24,
+	0x04,0x28,0x26,0x28,0x28,0x28,0x28,0x28,0x22,0x25,0x28,0x26,0x28,0x23,0x24,0x26,
+	0x28,0x26,0x29,0x28,0x29,0x28,0x25,0x28,0x25,0x04,0x28,0x28,0x28,0x2A,0x25,0x2A,
+	0x2B,0x28,0x29,0x04,0x28,0x28,0x04,0x28,0