diff --git a/CMakeLists.txt b/CMakeLists.txt index b8ff999508b2c89cf0592fb2733b6bd87686df82..b301febcb7506c845c17516ca956349d42fb74d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,52 @@ cmake_minimum_required(VERSION 3.11) project (XPDevPlus CXX) -add_subdirectory(ciolib) -add_subdirectory(comio) -add_subdirectory(encode) -add_subdirectory(hash) -add_subdirectory(uifc) -add_subdirectory(xpdev) +include("FetchContent") + +include(ExternalProject) + +add_compile_options(-include xpdevplus.h) + +FetchContent_Declare( + CONIO + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/conio + SOURCE_SUBDIR src/conio +) +FetchContent_MakeAvailable(CONIO) + +FetchContent_Declare( + COMIO + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/comio + SOURCE_SUBDIR src/comio +) +FetchContent_MakeAvailable(COMIO) + +FetchContent_Declare( + Encode + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/encode + SOURCE_SUBDIR src/encode +) +FetchContent_MakeAvailable(Encode) + +FetchContent_Declare( + Hash + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/hash + SOURCE_SUBDIR src/hash +) +FetchContent_MakeAvailable(Hash) + +FetchContent_Declare( + UIFC + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/uifc + SOURCE_SUBDIR src/uifc +) +FetchContent_MakeAvailable(UIFC) + +FetchContent_Declare( + XPDev + URL https://gitlab.synchro.net/main/sbbs/-/archive/master/sbbs-master.tar.gz?path=src/xpdev + SOURCE_SUBDIR src/xpdev +) +FetchContent_MakeAvailable(XPDev) enable_language(C) set(SOURCE diff --git a/ciolib/CMakeLists.txt b/ciolib/CMakeLists.txt deleted file mode 100644 index bfd25ed21d5353e31b2c49f4af80b8011f56af28..0000000000000000000000000000000000000000 --- a/ciolib/CMakeLists.txt +++ /dev/null @@ -1,129 +0,0 @@ -project (ConIOLib C) - -cmake_minimum_required(VERSION 3.11) - -INCLUDE (CheckFunctionExists) -find_package(X11) -# So on BSD, this causes the find to fail. However, it's required for Linux -# This is because on BSD, ncursesw.h does not exist, but libraries use -# ncurses.h -set(CURSES_NEED_WIDE TRUE) -find_package(Threads REQUIRED) -if(NOT WIN32) - find_package(Curses) - find_package(PkgConfig) - pkg_check_modules(SDL2 sdl2) -endif() - -set(SOURCE - allfonts.c - ansi_cio.c - ciolib.c - ciolib.rc - cterm.c - mouse.c - syncicon64.c - utf8_codepages.c - vidmodes.c - xbr.c -) - -set(HEADER - ciolib.h - cterm.h - keys.h - mouse.h - utf8_codepages.h - vidmodes.h -) - -if(WIN32) - list(APPEND SOURCE win32cio.c ciolib.rc) -endif() - -if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows") - if(CURSES_FOUND) - list(APPEND SOURCE curs_cio.c) - set(USE_CURSES_ANYWAY TRUE) - else() - if(${CMAKE_SYSTEM_NAME} MATCHES "(Free|Open|Net)BSD") - list(APPEND SOURCE curs_cio.c) - set(USE_CURSES_ANYWAY TRUE) - else() - message(FATAL_ERROR "ncursesw not found") - endif() - endif() -endif() - -if(X11_FOUND) - list(APPEND SOURCE x_events.c x_cio.c) - set(NEED_BITMAP TRUE) - set(NEED_DLOPEN TRUE) - set(NEED_SCALE TRUE) -endif() - -if(SDL2_INCLUDE_DIRS) - list(APPEND SOURCE sdl_con.c) - list(APPEND SOURCE sdlfuncs.c) - set(NEED_SCALE TRUE) - if(WIN32) - list(APPEND SOURCE SDL_win32_main.c) - endif() - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - list(APPEND SOURCE SDLMain.m) - endif() - set(NEED_BITMAP TRUE) - set(NEED_DLOPEN TRUE) -endif() - -if(NEED_BITMAP) - list(APPEND SOURCE bitmap_con.c) -endif() - -if(NEED_SCALE) - list(APPEND SOURCE scale.c) -endif() - -add_library(ciolib OBJECT ${SOURCE}) -target_include_directories(ciolib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -if(CURSES_FOUND) - if(${CMAKE_SYSTEM_NAME} MATCHES "(Free|Open|Net)BSD") - list(APPEND SOURCE curs_cio.c) - set(USE_CURSES_ANYWAY TRUE) - endif() -endif() - -if(X11_FOUND) - target_include_directories(ciolib PRIVATE ${X11_INCLUDE_DIR}) -else() - target_compile_definitions(ciolib PRIVATE NO_X) -endif() - -if(SDL2_INCLUDE_DIRS) - target_include_directories(ciolib PUBLIC ${SDL2_INCLUDE_DIRS}) - set(WITH_SDL TRUE PARENT_SCOPE) -endif() - -if(NOT WIN32) - target_link_libraries(ciolib pthread) -endif() - -if(USE_CURSES_ANYWAY) - if(CURSES_FOUND) - if (CURSES_HAVE_NCURSES_NCURSES_H) - target_compile_definitions(ciolib PRIVATE DEBIAN_HATES_YOU) - elseif(CURSES_HAVE_NCURSES_H) - target_compile_definitions(ciolib PRIVATE N_CURSES_LIB) - endif() - target_link_libraries(ciolib ${NCURSES_LIBRARIES}) - else() - target_link_libraries(ciolib ${CURSES_NCURSES_LIBRARY}) - target_link_libraries(ciolib ${CURSES_TINFO_LIBRARY_NAME}) - endif() -endif() - -CHECK_FUNCTION_EXISTS(vasprintf HAVE_VASPRINTF) -if(HAVE_VASPRINTF) - target_compile_definitions(ciolib PRIVATE HAVE_VASPRINTF) -endif() -target_link_libraries(ciolib hash encode xpdev) diff --git a/ciolib/CVS/Entries b/ciolib/CVS/Entries deleted file mode 100644 index 1cdbe4100a30bb1c644a396ec10539316d65922e..0000000000000000000000000000000000000000 --- a/ciolib/CVS/Entries +++ /dev/null @@ -1,3 +0,0 @@ -/conio.dsp/1.15/Thu Jun 1 21:57:02 2006// -/conio_sdl.dsp/1.1/Thu Oct 11 06:30:16 2007// -D diff --git a/ciolib/CVS/Repository b/ciolib/CVS/Repository deleted file mode 100644 index 88f933e283e7658742d29f7326f3c5f223962280..0000000000000000000000000000000000000000 --- a/ciolib/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -src/conio diff --git a/ciolib/CVS/Root b/ciolib/CVS/Root deleted file mode 100644 index 008bd82c7aed529de99eded0875165f6284f0ec3..0000000000000000000000000000000000000000 --- a/ciolib/CVS/Root +++ /dev/null @@ -1 +0,0 @@ -:pserver:deuce@cvs.synchro.net:/cvsroot/sbbs diff --git a/ciolib/CVS/Template b/ciolib/CVS/Template deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/ciolib/OverhaulNotes.txt b/ciolib/OverhaulNotes.txt deleted file mode 100644 index 2822c71f6a9bb922d43f814db5c54ed061e875ac..0000000000000000000000000000000000000000 --- a/ciolib/OverhaulNotes.txt +++ /dev/null @@ -1,113 +0,0 @@ -1) NO GLOBALS (ESCDELAY etc will be in the struct with accessors) -2) An init function that returns a struct with a bunch of function pointers in - it. -3) UIFC will need to have the ability for the ciolib struct to be passed to - it. -4) Will support multiple independent windows. -5) There will be a compatability library for JUST conio stuff. -6) Any advanced features not in the conio API will not be present. -7) Unicode (UTF-8) support... likely X11 first, followed by Curses, SDL and - Win32. -8) ANSI mode may never get proper unicode support... or at least not until - everything else works. -9) Unicode support will support GR access of the C1 set. Most importantly, - this means CSI (\x9b). This is actually somewhat silly since it will take - two bytes regardless, but if UCS-2 or something gets added in the future, - it may make a difference, and there's no reason to show control codes. -10) Greatly expanded attribute sets, and in UTF-8 mode there will be no - hackiness. The great bright/bold debate will rage on though... possibly a - new set/reset mode will be added to control it. -11) Double-height/Double-width/Double-size modes. As is tradition, all the - cells covered by the glyph must be the same character and attributes. This - opens a whole can of worms regarding how further updates work etc. I'll - strive to keep it sane and compatible, which may be impossible. -12) A Unicode cell will potentially have multiple codepoints "in" it. -13) We need a way to specify the initial mode. - -Some sort of state checkpoint thing... you "save" the checkpoint, and send that -ID back and you get the same state returned. - -Stack and state save thing - -For CONIOng: -Layers: -0 - Solid fixed background (doesn't scoll) -1 - Text area background (scrolls, text area) -2 - Text area background bitmap (scrolls, text area) -3 - Text area background pixel (scrolls, text area) -4 - Bitmap background (doesn't scroll) -5 - Pixel background (doesn't scroll) -6 - Text area foreground (scrolls, text area) -7 - Text area foreground bitmap (scrolls, text area) -8 - Text area foreground pixel (scrolls, text area) -9 - Bitmap foreground (doesn't scroll) -10 - Pixel foreground layer (doesn't scroll) - -Layer Attributes: -Layer 0: "colour" -Layer 1: <none> -Layer 2: <none> -Layer 3: "hidden" -Layer 4: <none> -Layer 5: "hidden" -Layer 6: <none> -Layer 7: <none> -Layer 8: "hidden" -Layer 9: <none> -Layer 10: "hidden" - -A text area can be defined as having a given width and height with the -top-left corner positioned at any pixel location. Text areas use a fixed -width font, and have multiple planes... text background, background bitmap, -background pixels, text foreground, foreground bitmap, foreground pixels -It will have the following attributes: -Fonts -Codepage -Tab stops -Cursor position -Auto-wrap -Blink enabled -Cursor vidible -Palette definition -Foreground visible -Foreground bitmaps visible -Foreground pixels visible -Background visible -Background bitmaps visible -Background pixels visible -Z-index -"Current" cell attributes (see below) - -Each character cell will have the following attributes: -Codepoints (array) -Foreground colour -Background colour -Font -Flags -- Fast Blink -- Slow Blink -- Bold -- Italic -- Negative -- Concealed -- Underline -- Overstrike -- Double underline -- Double overstrike -- Double-wide -- Double-high -- Superscript -- Subscript - -Bitmap layers contain zero or more bitmaps (likely WebP, maybe others) -which have a stacking order in the layer. Attributes: -position -hidden -paused (not animated) -Z-index - -Pixel layers are simply an array of pixels that may be directly -manipulated. No attributes are planned. - -For the bitmap and pixel layers associated with a text area, they will -scroll with the text in that area. diff --git a/ciolib/SDLMain.h b/ciolib/SDLMain.h deleted file mode 100644 index 4683df57a5e61fc41b189e67245f4a0a32d7552d..0000000000000000000000000000000000000000 --- a/ciolib/SDLMain.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#import <Cocoa/Cocoa.h> - -@interface SDLMain : NSObject -@end diff --git a/ciolib/SDLMain.m b/ciolib/SDLMain.m deleted file mode 100644 index f9c6394b012da9a7758380695bca74321ce92d06..0000000000000000000000000000000000000000 --- a/ciolib/SDLMain.m +++ /dev/null @@ -1,387 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#include "SDL.h" -#include "SDLMain.h" -#include <sys/param.h> /* for MAXPATHLEN */ -#include <unistd.h> - -/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, - but the method still is there and works. To avoid warnings, we declare - it ourselves here. */ -@interface NSApplication(SDL_Missing_Methods) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -/* Use this flag to determine whether we use SDLMain.nib or not */ -#define SDL_USE_NIB_FILE 0 - -/* Use this flag to determine whether we use CPS (docking) or not */ -#define SDL_USE_CPS 1 -#ifdef SDL_USE_CPS -/* Portions of CPS.h */ -typedef struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -} CPSProcessSerNum; - -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); - -#endif /* SDL_USE_CPS */ - -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - -static NSString *getApplicationName(void) -{ - const NSDictionary *dict; - NSString *appName = 0; - - /* Determine the application name */ - dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); - if (dict) - appName = [dict objectForKey: @"CFBundleName"]; - - if (![appName length]) - appName = [[NSProcessInfo processInfo] processName]; - - return appName; -} - -#if SDL_USE_NIB_FILE -/* A helper category for NSString */ -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@end -#endif - -@interface NSApplication (SDLApplication) -@end - -@implementation NSApplication (SDLApplication) -/* Invoked from the Quit menu item */ -- (void)terminate:(id)sender -{ - /* Post a SDL_QUIT event */ - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); -} -@end - -/* The main class of the application, the application's delegate */ -@implementation SDLMain - -/* Set the working directory to the .app's parent directory */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir -{ - if (shouldChdir) - { - char parentdir[MAXPATHLEN]; - CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); - if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { - chdir(parentdir); /* chdir to the binary app's parent */ - } - CFRelease(url); - CFRelease(url2); - } -} - -#if SDL_USE_NIB_FILE - -/* Fix menu to contain the real app name instead of "SDL App" */ -- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName -{ - NSRange aRange; - NSEnumerator *enumerator; - NSMenuItem *menuItem; - - aRange = [[aMenu title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; - - enumerator = [[aMenu itemArray] objectEnumerator]; - while ((menuItem = [enumerator nextObject])) - { - aRange = [[menuItem title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; - if ([menuItem hasSubmenu]) - [self fixMenu:[menuItem submenu] withAppName:appName]; - } -} - -#else - -static void setApplicationMenu(void) -{ - /* warning: this code is very odd */ - NSMenu *appleMenu; - NSMenuItem *menuItem; - NSString *title; - NSString *appName; - - appName = getApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@""]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@""]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@""]; - - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - - /* Finally give up our references to the objects */ - [appleMenu release]; - [menuItem release]; -} - -/* Create a window menu */ -static void setupWindowMenu(void) -{ - NSMenu *windowMenu; - NSMenuItem *windowMenuItem; - NSMenuItem *menuItem; - - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* "Minimize" item */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""]; - [windowMenu addItem:menuItem]; - [menuItem release]; - - /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [windowMenuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:windowMenuItem]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - - /* Finally give up our references to the objects */ - [windowMenu release]; - [windowMenuItem release]; -} - -/* Replacement for NSApplicationMain */ -static void CustomApplicationMain (int argc, char **argv) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; - - /* If there's no Window Server (ie: remote headless), go in dry. */ - if (_CGSDefaultConnection() == NULL) { - XPDEV_main(argc, argv, environ); - return; - } - - /* Ensure the application object is initialised */ - [NSApplication sharedApplication]; - -#ifdef SDL_USE_CPS - { - CPSProcessSerNum PSN; - /* Tell the dock about us */ - if (!CPSGetCurrentProcess(&PSN)) - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) - if (!CPSSetFrontProcess(&PSN)) - [NSApplication sharedApplication]; - } -#endif /* SDL_USE_CPS */ - - /* Set up the menubar */ - [NSApp setMainMenu:[[NSMenu alloc] init]]; - setApplicationMenu(); - setupWindowMenu(); - - /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; - - /* Start the main event loop */ - [NSApp run]; - - [sdlMain release]; - [pool release]; -} - -#endif - - -/* - * Catch document open requests...this lets us notice files when the app - * was launched by double-clicking a document, or when a document was - * dragged/dropped on the app's icon. You need to have a - * CFBundleDocumentsType section in your Info.plist to get this message, - * apparently. - * - * Files are added to gArgv, so to the app, they'll look like command line - * arguments. Previously, apps launched from the finder had nothing but - * an argv[0]. - * - * This message may be received multiple times to open several docs on launch. - * - * This message is ignored once the app's mainline has been called. - */ -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - const char *temparg; - size_t arglen; - char *arg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; - return TRUE; -} - -extern char **environ; -/* Called when the internal event loop has just started running */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - - /* Set the working directory to the .app's parent directory */ - [self setupWorkingDirectory:gFinderLaunch]; - -#if SDL_USE_NIB_FILE - /* Set the main menu to contain the real app name instead of "SDL App" */ - [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; -#endif - - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main_env (gArgc, gArgv, environ); - - /* We're done, thank you for playing */ - exit(status); -} -@end - - -@implementation NSString (ReplaceSubString) - -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString -{ - unsigned int bufferSize; - unsigned int selfLen = [self length]; - unsigned int aStringLen = [aString length]; - unichar *buffer; - NSRange localRange; - NSString *result; - - bufferSize = selfLen + aStringLen - aRange.length; - buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - - /* Get first part into buffer */ - localRange.location = 0; - localRange.length = aRange.location; - [self getCharacters:buffer range:localRange]; - - /* Get middle part into buffer */ - localRange.location = 0; - localRange.length = aStringLen; - [aString getCharacters:(buffer+aRange.location) range:localRange]; - - /* Get last part into buffer */ - localRange.location = aRange.location + aRange.length; - localRange.length = selfLen - localRange.location; - [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - - /* Build output string */ - result = [NSString stringWithCharacters:buffer length:bufferSize]; - - NSDeallocateMemoryPages(buffer, bufferSize); - - return result; -} - -@end - - - -#ifdef main -# undef main -#endif - - -/* Main entry point to executable - should *not* be SDL_main! */ -int main (int argc, char **argv) -{ - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - -#if SDL_USE_NIB_FILE - NSApplicationMain (argc, argv); -#else - CustomApplicationMain (argc, argv); -#endif - return 0; -} - diff --git a/ciolib/SDL_win32_main.c b/ciolib/SDL_win32_main.c deleted file mode 100644 index 96f87f245a5378b395da1b5f2da8693a19a29476..0000000000000000000000000000000000000000 --- a/ciolib/SDL_win32_main.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98 - - The WinMain function -- calls your program's main() function -*/ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <stdlib.h> - -#include <windows.h> -#include <malloc.h> /* For _alloca() */ - -#define DIR_SEPERATOR TEXT("/") -#include <direct.h> - -#include "ciolib.h" /* ciolib_appname */ - -/* 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); -} - -extern int CIOLIB_main(int argc, char **argv); - -/* This is where execution begins [console apps] */ -static int console_main(int argc, char *argv[], char **env) -{ - int n; - char *bufp, *appname; - - /* Get the class name from argv[0] */ - appname = argv[0]; - if ( (bufp=strrchr(argv[0], '\\')) != NULL ) { - appname = bufp+1; - } else - if ( (bufp=strrchr(argv[0], '/')) != NULL ) { - appname = bufp+1; - } - - if ( (bufp=strrchr(appname, '.')) == NULL ) - n = strlen(appname); - else - n = (bufp-appname); - - bufp = (char *)alloca(n+1); - if ( bufp == NULL ) { - return 1; - } - strncpy(bufp, appname, n); - bufp[n] = '\0'; - ciolib_appname = bufp; - - /* Run the application main() code */ - n=CIOLIB_main(argc, argv); - - /* Exit cleanly, calling atexit() functions */ - exit(n); - - /* Hush little compiler, don't you cry... */ - return(n); -} - -/* This is where execution begins [windowed apps] */ -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) -{ - HINSTANCE handle; - char **argv; - int argc; - char *cmdline; - char *bufp; - - /* 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); - } - - /* Grab the command line (use alloca() on Windows) */ - bufp = GetCommandLine(); - cmdline = (char *)alloca(strlen(bufp)+1); - if ( cmdline == NULL ) { - return 1; - } - strcpy(cmdline, bufp); - - /* Parse it into argv and argc */ - argc = ParseCommandLine(cmdline, NULL); - argv = (char **)alloca((argc+1)*(sizeof *argv)); - if ( argv == NULL ) { - return 1; - } - ParseCommandLine(cmdline, argv); - - /* Run the main program (after a little SDL initialization) */ - return(console_main(argc, argv, _environ)); -} diff --git a/ciolib/allfonts.c b/ciolib/allfonts.c deleted file mode 100644 index f2d6a5452fa3898abb004efbf3405f108f27cc4f..0000000000000000000000000000000000000000 --- a/ciolib/allfonts.c +++ /dev/null @@ -1,23825 +0,0 @@ -#include <stdio.h> /* NULL */ - -#include "ciolib.h" - -#ifdef NO_FONTS -CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { - {NULL, NULL, NULL, "Codepage 437 English", CIOLIB_CP437}, - {NULL, NULL, NULL, "Codepage 1251 Cyrillic, (swiss)", CIOLIB_CP1251}, - {NULL, NULL, NULL, "Russian koi8-r", CIOLIB_KOI8_R}, - {NULL, NULL, NULL, "ISO-8859-2 Central European", CIOLIB_ISO_8859_2}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic wide (VGA 9bit mapped)", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "Codepage 866 (c) Russian", CIOLIB_CP866M}, - {NULL, NULL, NULL, "ISO-8859-9 Turkish", CIOLIB_ISO_8859_9}, - {NULL, NULL, NULL, "haik8 codepage (use only with armscii8 screenmap)", CIOLIB_HAIK8}, - {NULL, NULL, NULL, "ISO-8859-8 Hebrew", CIOLIB_ISO_8859_8}, - {NULL, NULL, NULL, "Ukrainian font koi8-u", CIOLIB_KOI8_U}, - {NULL, NULL, NULL, "ISO-8859-15 West European, (thin)", CIOLIB_ISO_8859_15}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic (VGA 9bit mapped)", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "Russian koi8-r (b)", CIOLIB_KOI8_R}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic wide", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "ISO-8859-5 Cyrillic", CIOLIB_ISO_8859_5}, - {NULL, NULL, NULL, "ARMSCII-8 Character set", CIOLIB_ARMSCII8}, - {NULL, NULL, NULL, "ISO-8859-15 West European", CIOLIB_ISO_8859_15}, - {NULL, NULL, NULL, "Codepage 850 Multilingual Latin I, (thin)", CIOLIB_CP850}, - {NULL, NULL, NULL, "Codepage 850 Multilingual Latin I", CIOLIB_CP850}, - {NULL, NULL, NULL, "Codepage 865 Norwegian, (thin)", CIOLIB_CP865}, - {NULL, NULL, NULL, "Codepage 1251 Cyrillic", CIOLIB_CP1251}, - {NULL, NULL, NULL, "ISO-8859-7 Greek", CIOLIB_ISO_8859_7}, - {NULL, NULL, NULL, "Russian koi8-r (c)", CIOLIB_KOI8_R}, - {NULL, NULL, NULL, "ISO-8859-4 Baltic", CIOLIB_ISO_8859_4}, - {NULL, NULL, NULL, "ISO-8859-1 West European", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Codepage 866 Russian", CIOLIB_CP866M2}, - {NULL, NULL, NULL, "Codepage 437 English, (thin)", CIOLIB_CP437}, - {NULL, NULL, NULL, "Codepage 866 (b) Russian", CIOLIB_CP866M2}, - {NULL, NULL, NULL, "Codepage 865 Norwegian", CIOLIB_CP865}, - {NULL, NULL, NULL, "Ukrainian font cp866u", CIOLIB_CP866U}, - {NULL, NULL, NULL, "ISO-8859-1 West European, (thin)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Codepage 1131 Belarusian, (swiss)", CIOLIB_CP1131}, - {NULL, NULL, NULL, "Commodore 64 (UPPER)", CIOLIB_PETSCIIU}, - {NULL, NULL, NULL, "Commodore 64 (Lower)", CIOLIB_PETSCIIL}, - {NULL, NULL, NULL, "Commodore 128 (UPPER)", CIOLIB_PETSCIIU}, - {NULL, NULL, NULL, "Commodore 128 (Lower)", CIOLIB_PETSCIIL}, - {NULL, NULL, NULL, "Atari", CIOLIB_ATASCII}, - {NULL, NULL, NULL, "P0T NOoDLE (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "mO'sOul (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL , "MicroKnight Plus (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Topaz Plus (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "MicroKnight (Amiga)", CIOLIB_ISO_8859_1}, - {NULL, NULL, NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1} -}; -#else -CIOLIBEXPORT struct conio_font_data_struct conio_fontdata[257] = { - {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x0c\x06\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\x76\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x18\x3c\x66\x60\x60\x60\x66\x3c\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xcc\xc6\x00\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\x18\x18\xd8\x70\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x9e\x3e\x06\x06\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xd8\xdc\x76\x00\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x60\x30\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x18\x3c\x66\x66\x66\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\x6c\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xdb\xdb\xdb\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x60\x30\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\xff\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\xd8\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x7e\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00" - "\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x66\x3c\x0c\x06\x3c\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\xcc\xcc\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xc6\xc6\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xcc\x76\x36\x7e\xd8\xd8\x6e\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xce\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xc6\xc6\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\xc6\x38\x6c\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x18\x3c\x66\x60\x60\x66\x3c\x18\x18\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xe6\xfc\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00\x00" - "\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xc6\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\x18\xd8\x70\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\x00\x00\x00" - "\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00\x00" - "\x00\xc0\xc0\xc6\xcc\xd8\x30\x60\xdc\x86\x0c\x18\x3e\x00" - "\x00\xc0\xc0\xc6\xcc\xd8\x30\x66\xce\x9e\x3e\x06\x06\x00" - "\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xdc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xfc\xc6\xc6\xfc\xc0\xc0\x40\x00" - "\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00" - "\x00\x00\xfe\xc6\x60\x30\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x7c\x60\x60\xc0\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x7e\x18\x3c\x66\x66\x66\x3c\x18\x7e\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\xee\x00\x00\x00" - "\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xdb\xdb\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x30\x1c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\xff\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\xd8\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\x7c\x38\x7c" - "\x10\x10\x38\x7c\xfe\x7c\x38\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x63\x38\x6c\x6c\x38\xcc\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x78\xcc\xc0\xcc\x78\x18\x0c\x78" - "\x00\xcc\x00\xcc\xcc\xcc\x7e\x00" - "\x1c\x00\x78\xcc\xfc\xc0\x78\x00" - "\x7e\xc3\x3c\x06\x3e\x66\x3f\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x7e\x00" - "\xe0\x00\x78\x0c\x7c\xcc\x7e\x00" - "\x30\x30\x78\x0c\x7c\xcc\x7e\x00" - "\x00\x00\x78\xc0\xc0\x78\x0c\x38" - "\x7e\xc3\x3c\x66\x7e\x60\x3c\x00" - "\xcc\x00\x78\xcc\xfc\xc0\x78\x00" - "\xe0\x00\x78\xcc\xfc\xc0\x78\x00" - "\xcc\x00\x70\x30\x30\x30\x78\x00" - "\x7c\xc6\x38\x18\x18\x18\x3c\x00" - "\xe0\x00\x70\x30\x30\x30\x78\x00" - "\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00" - "\x30\x30\x00\x78\xcc\xfc\xcc\x00" - "\x1c\x00\xfc\x60\x78\x60\xfc\x00" - "\x00\x00\x7f\x0c\x7f\xcc\x7f\x00" - "\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00" - "\x78\xcc\x00\x78\xcc\xcc\x78\x00" - "\x00\xcc\x00\x78\xcc\xcc\x78\x00" - "\x00\xe0\x00\x78\xcc\xcc\x78\x00" - "\x78\xcc\x00\xcc\xcc\xcc\x7e\x00" - "\x00\xe0\x00\xcc\xcc\xcc\x7e\x00" - "\x00\xcc\x00\xcc\xcc\x7c\x0c\xf8" - "\xc3\x18\x3c\x66\x66\x3c\x18\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\x78\x00" - "\x18\x18\x7e\xc0\xc0\x7e\x18\x18" - "\x38\x6c\x64\xf0\x60\xe6\xfc\x00" - "\xcc\xcc\x78\xfc\x30\xfc\x30\x30" - "\xf8\xcc\xcc\xfa\xc6\xcf\xc6\xc7" - "\x0e\x1b\x18\x3c\x18\x18\xd8\x70" - "\x1c\x00\x78\x0c\x7c\xcc\x7e\x00" - "\x38\x00\x70\x30\x30\x30\x78\x00" - "\x00\x1c\x00\x78\xcc\xcc\x78\x00" - "\x00\x1c\x00\xcc\xcc\xcc\x7e\x00" - "\x00\xf8\x00\xf8\xcc\xcc\xcc\x00" - "\xfc\x00\xcc\xec\xfc\xdc\xcc\x00" - "\x3c\x6c\x6c\x3e\x00\x7e\x00\x00" - "\x38\x6c\x6c\x38\x00\x7c\x00\x00" - "\x30\x00\x30\x60\xc0\xcc\x78\x00" - "\x00\x00\x00\xfc\xc0\xc0\x00\x00" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\xc3\xc6\xcc\xde\x33\x66\xcc\x0f" - "\xc3\xc6\xcc\xdb\x37\x6f\xcf\x03" - "\x18\x18\x00\x18\x18\x18\x18\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdb\x77\xdb\xee\xdb\x77\xdb\xee" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x76\xdc\xc8\xdc\x76\x00" - "\x00\x78\xcc\xf8\xcc\xf8\xc0\xc0" - "\x00\xfc\xcc\xc0\xc0\xc0\xc0\x00" - "\x00\xfe\x6c\x6c\x6c\x6c\x6c\x00" - "\xfc\xcc\x60\x30\x60\xcc\xfc\x00" - "\x00\x00\x7e\xd8\xd8\xd8\x70\x00" - "\x00\x66\x66\x66\x66\x7c\x60\xc0" - "\x00\x76\xdc\x18\x18\x18\x18\x00" - "\xfc\x30\x78\xcc\xcc\x78\x30\xfc" - "\x38\x6c\xc6\xfe\xc6\x6c\x38\x00" - "\x38\x6c\xc6\xc6\x6c\x6c\xee\x00" - "\x1c\x30\x18\x7c\xcc\xcc\x78\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x00\x00" - "\x06\x0c\x7e\xdb\xdb\x7e\x60\xc0" - "\x38\x60\xc0\xf8\xc0\x60\x38\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\x00" - "\x00\xfc\x00\xfc\x00\xfc\x00\x00" - "\x30\x30\xfc\x30\x30\x00\xfc\x00" - "\x60\x30\x18\x30\x60\x00\xfc\x00" - "\x18\x30\x60\x30\x18\x00\xfc\x00" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x30\x30\x00\xfc\x00\x30\x30\x00" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xec\x6c\x3c\x1c" - "\x78\x6c\x6c\x6c\x6c\x00\x00\x00" - "\x70\x18\x30\x60\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 437 English", CIOLIB_CP437} - ,{"\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x81\xe7\xa5\x99\x81\x99\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x7e\xff\x99\xdb\xe7\xff\xe7\x7e\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x38\x38\x10\xd6\xfe\xd6\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\xfe\xfe\x54\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x30\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\x20\x30\x38\x3c\x36\x36\x30\x70\xf0\xf0\x60\x00\x00\x00\x00" - "\x00\x00\x3e\x22\x3e\x22\x22\x22\x22\x26\x6e\xe4\x40\x00\x00\x00" - "\x00\x00\x00\x10\x92\x54\x28\xc6\x28\x54\x92\x10\x00\x00\x00\x00" - "\x00\x00\x40\x60\x70\x78\x7c\x7e\x7c\x78\x70\x60\x40\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x1e\x3e\x7e\x3e\x1e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x1e\x30\x78\xdc\xce\xe7\x73\x3b\x1e\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\xff\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x06\xff\x06\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xff\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x66\xff\x66\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x3c\x3c\x7e\x7e\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x7e\x7e\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x77\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x10\x7c\xd6\xd0\xd0\x70\x38\x1c\x16\x16\xd6\x7c\x10\x00\x00" - "\x00\x00\xc6\xc6\x0c\x0c\x18\x30\x30\x60\x60\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x70\xd6\xdc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x1c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\xff\x3c\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xd6\xd6\xd6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x60\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x0c\xcc\xcc\xcc\xcc\xfe\x0c\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\x06\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\x0c\x18\x70\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x1c\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x30\x00\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xcc\xf8\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xce\xc6\xc6\xc6\x66\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xf6\xde\x7c\x0c\x06\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xd8\xcc\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x60\x38\x0c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xfe\x06\x0c\x0c\x18\x18\x30\x60\x60\xc0\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x00\x70\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x06\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x66\x60\x60\xf0\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\x7c" - "\x00\x00\x00\xc0\xc0\xc0\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xfe\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc0\x70\x1c\x06\x06\x7c\x00\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xfe\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x0c\x18\x30\x60\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x30\x60\x30\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0c\x06\x0c\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\xfc\x60\x60\x60\x7e\x63\x63\x63\x63\x67\x6c\x00\x00\x00" - "\x18\x30\x00\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x18\x30\x00\x00" - "\x00\x00\x00\x18\x30\x00\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x66\xcc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xdb\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x7e\x18\x18\x18\x00\x00\x00" - "\x00\x00\x1e\x32\x30\x7e\x30\x7e\x30\x30\x32\x1e\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x0c\x0c\x18\x30\x30\x60\x60\xdb\xdb\x00\x00\x00" - "\x00\x00\x38\x78\xd8\xd8\xde\xdb\xdb\xdb\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x18\x30\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xd8\xfe\xdb\xdb\xdb\xdb\xde\x00\x00\x00" - "\x18\x30\x00\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x66\x66\x0c\x18\x00" - "\x00\x00\x0c\x18\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x1c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x77\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf1\x5b\x55\x51\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x58\xd8\xde\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x30\x18\x18\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd8\xd8\xd8\xfe\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x18\x30\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x44\x38\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x1e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x66\x66\x66\x66\x3c\x66\x66\x00\x00\x00" - "\x06\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x1e\x30\x78\xdc\xce\xe7\x73\x3b\x1e\x0c\x78\x00\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x3e\x63\x5d\x51\x51\x5d\x63\x3e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xfc\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x63\x5d\x55\x59\x55\x63\x3e\x00\x00\x00\x00\x00\x00" - "\x66\x66\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\xc8\xc8\xea\xed\xdd\xda\xc8\xcf\xc8\xc8\xc8\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf8\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x36\x6c\xd8\x00\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\x7c" - "\x00\x00\x7c\xc6\xc0\xc0\x60\x38\x0c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc0\x70\x1c\x06\x06\x7c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7e\xc3\x66\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\x54\x7c\x38\x38\x38\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x44\x38\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\xf0\xb0\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xf6\xde\xde\xde\xde\xde\xf6\x00\x00\x00" - "\x00\x00\x30\x30\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3e\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\x66\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x66\xff\xc3\x66\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\x7c\x38\x38\x38\x7c\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xf0\xb0\x30\x3c\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfa\xce\xce\xfa\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x60\x60\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xd6\xd6\xf6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - , NULL, NULL, "Codepage 1251 Cyrillic, (swiss)", CIOLIB_CP1251} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x00\x0c\x18\x30\x60\x30\x18\x0c" - "\x00\x30\x18\x0c\x06\x0c\x18\x30" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x38\x6c\x6c\x38\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x18\x18\x00\x7e\x00\x18\x18" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x00\x3f\x36\x36\x36\x36" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x00\xf8\x18\xf8\x18\x18\x18\x18" - "\x00\x00\x00\xfe\x36\x36\x36\x36" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x36\x36\x36\xfe\x00\x00\x00\x00" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x36\x36\x36\xf6\x36\x36\x36\x36" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x00\xff\x00\xff\x18\x18\x18\x18" - "\x00\x00\x00\xff\x36\x36\x36\x36" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x36\x36\x36\xff\x36\x36\x36\x36" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - , "Russian koi8-r", CIOLIB_KOI8_R} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x78\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x18\x30\x1e\x00" - "\x00\xc6\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf0\x64\x6c\x78\x70\xe0\xe0\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x18\x0c\x78\x00" - "\x36\x1c\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x18\x18\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x18\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x60\x3c\x00" - "\x00\x00\x38\x1a\x1e\x1c\x18\x38\x78\x58\x18\x3c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x18\x0c\x78\x00" - "\x6c\x38\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x0c\x18\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\xc6\x7c\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xf6\x6c\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00" - "\x6c\x38\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x60\x78\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x18\x30\x1e\x00" - "\x00\xc6\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x1c\x36\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x6c\x38\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x0c\x18\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x6c\x38\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x38\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x36\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x18\x0c\x78\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe6\x6c\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x0c\x78\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x30\x60\x3c\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x6c\x38\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x0c\x0c\x7e\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x36\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x18\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xd6\xd6\xd6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xce\x18\x0e\x00" - "\x00\xc6\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf0\x64\x6c\x78\x70\xe0\xe2\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\x70\x1c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0e\xc6\x7c\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x70\x1c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x18\x70\x00" - "\x36\x1c\x00\x7e\x7e\x5a\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x0c\x18\x00\xfe\xc6\x8c\x18\x30\x62\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x8c\x18\x30\x62\xc6\xfe\x00\x00\x00" - "\x18\x18\x00\xfe\xc6\x8c\x18\x30\x62\xc6\xfe\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x30\x1c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x1c\x00" - "\x00\x00\x38\x1a\x1e\x1c\x18\x38\x78\x58\x3c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x1b\xee\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x70\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x18\x70\x00" - "\x6c\x38\x00\x10\x30\x30\xfc\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x18\x18\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\xfc\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x0c\x18\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\xc6\x7c\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xf6\x6c\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\x3c\x66\xc2\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00" - "\x6c\x38\x00\x3c\x66\xc2\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x30\x1c\x00" - "\x00\xc6\x00\xfe\x66\x62\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x6c\x38\x00\xfe\x66\x62\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x1c\x36\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x6c\x38\x00\xf8\x6c\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x6c\xf8\x00\x00\x00" - "\x0c\x18\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\x00\x00\x00" - "\x6c\x38\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\x00\x00\x00" - "\x0c\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00" - "\x6c\x38\x00\xfc\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x38\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x0c\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x36\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x0c\x38\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xcc\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xc6\x7c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe6\x6c\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x18\x70\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x30\x1c\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x6c\x38\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x6c\x38\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x0c\x0c\x7e\x0c\x3c\x6c\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x36\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x6c\x38\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x38\x6c\x38\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x6c\xd8\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x0c\x38\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xc6\xd6\xc6\xc6\x7c\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x1c\x30\x66\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x1c\x30\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x06\x0c\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x0c\x38\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x0c\x18\x30\x60\x30\x18\x0c\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x18\x3c\x66\x66\x7e\x66\x66\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x3c\x66\x66\x66\x6e\x3c\x0e\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x6c\x38\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x1c\x36\x30\x78\x30\x30\x78\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x7c" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x6e\x18\x0e" - "\xc6\x7c\x00\x00\x00\x00\x00\x00" - "\xf0\x68\x78\xf0\xe2\x66\xfe\x00" - "\x00\x42\x3c\x66\x66\x3c\x42\x00" - "\xfb\x6e\x60\x60\x62\x66\xfe\x00" - "\x0c\x18\x7c\xc2\x38\x86\x7c\x00" - "\x3c\x66\x38\x6c\x6c\x38\xcc\x78" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x7c\xc2\x38\x86\x7c\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x38" - "\x36\x1c\x7e\x5a\x18\x18\x3c\x00" - "\x0c\x18\xfe\x86\x18\x62\xfe\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x6c\x38\xfe\x86\x18\x62\xfe\x00" - "\x18\x00\xfe\x86\x18\x62\xfe\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x1c" - "\x00\x00\x00\x00\x00\x00\x30\x1c" - "\x38\x1a\x1e\x3c\x78\x18\x3c\x00" - "\x0c\x18\x00\x00\x00\x00\x00\x00" - "\xfb\x6e\x60\x60\x60\x60\xf0\x00" - "\x0c\x18\x3c\x40\x38\x04\x78\x00" - "\x6c\x38\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x0c\x38" - "\x6c\x38\x3c\x40\x38\x04\x78\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x38" - "\x6c\x38\x30\x7c\x30\x34\x18\x00" - "\x0c\x18\x00\x7c\x18\x30\x7c\x00" - "\x36\x6c\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\x18\x30\x7c\x00" - "\x00\x18\x00\x7c\x18\x30\x7c\x00" - "\x0c\x18\xfc\xc6\xfc\xcc\xc6\x00" - "\x0c\x18\x3c\x66\x7e\x66\x66\x00" - "\x1c\x36\x3c\x66\x7e\x66\x66\x00" - "\x66\x3c\x3c\x66\x7e\x66\x66\x00" - "\x66\x18\x3c\x66\x7e\x66\x66\x00" - "\xe6\x6c\x60\x60\x62\x66\xfe\x00" - "\x0c\x18\x7c\xc6\xc0\xc6\x7c\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x38" - "\x6c\x38\x7c\xc6\xc0\xc6\x7c\x00" - "\x0c\x18\xfe\x60\x78\x60\xfe\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x1c" - "\xc6\x00\xfe\x60\x78\x60\xfe\x00" - "\x6c\x38\xfe\x60\x78\x60\xfe\x00" - "\x0c\x18\x3c\x18\x18\x18\x3c\x00" - "\x1c\x36\x3c\x18\x18\x18\x3c\x00" - "\x6c\x38\xfc\x66\x66\x66\xfc\x00" - "\xf8\x6c\x66\xf6\x66\x6c\xf8\x00" - "\x0c\x18\xe6\xf6\xde\xce\xc6\x00" - "\x6c\x38\xe6\xf6\xde\xce\xc6\x00" - "\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x38\x6c\x7c\xc6\xc6\xc6\x7c\x00" - "\x36\x6c\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x6c\x38\xfc\xc6\xfc\xcc\xc6\x00" - "\x38\x6c\xf6\xc6\xc6\xc6\x7c\x00" - "\x0c\x18\xc6\xc6\xc6\xc6\x7c\x00" - "\x36\x6c\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x0c\x7e\x66\x66\x3c\x18\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x0e" - "\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00" - "\x0c\x18\xdc\x76\x66\x60\xf0\x00" - "\x0c\x18\x78\x0c\x7c\xcc\x76\x00" - "\x38\x6c\x78\x0c\x7c\xcc\x76\x00" - "\xc6\x7c\x78\x0c\x7c\xcc\x76\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x76\x00" - "\x73\x36\x30\x30\x30\x30\x78\x00" - "\x0c\x18\x00\x3c\x60\x60\x3c\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x38" - "\x36\x1c\x00\x3c\x60\x60\x3c\x00" - "\x0c\x18\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x1c" - "\x66\x00\x3c\x66\x7e\x60\x3c\x00" - "\x36\x1c\x3c\x66\x7e\x60\x3c\x00" - "\x0c\x18\x38\x18\x18\x18\x3c\x00" - "\x1c\x36\x38\x18\x18\x18\x3c\x00" - "\x6c\x38\x0c\x0c\x7c\xcc\x76\x00" - "\x0c\x3e\x0c\x7c\xcc\xcc\x76\x00" - "\x0c\x18\x7c\x66\x66\x66\x66\x00" - "\x6c\x38\x7c\x66\x66\x66\x66\x00" - "\x0c\x18\x00\x3c\x66\x66\x3c\x00" - "\x1c\x36\x00\x3c\x66\x66\x3c\x00" - "\x36\x6c\x00\x3c\x66\x66\x3c\x00" - "\x66\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x6c\x38\xdc\x76\x66\x60\xf0\x00" - "\x30\xcc\x30\xcc\xcc\xcc\x76\x00" - "\x18\x30\x00\xcc\xcc\xcc\x76\x00" - "\x6c\xd8\x00\xcc\xcc\xcc\x76\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x0c\x18\x66\x66\x66\x3e\x06\x7c" - "\x10\x30\x7c\x30\x30\x34\x18\x0e" - "\x18\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-2 Central European", CIOLIB_ISO_8859_2} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\x1b\xdb\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00" - "\x00\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00" - "\x00\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x00\x00" - "\x00\x00\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xe3\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0f" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x38\x7c\xee\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\x66\x66\x3c\x18\x18\x30\x30\xe0" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x20\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x00\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x0e\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x18\x0f" - "\x66\x24\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x18\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x0e\x18\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\xf3\xf3\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7e\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x06\x3c" - "\x3c\x66\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x76\xdc\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x66\x66\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x01\x3d\x66\xc7\xcb\xcb\xdb\xdb\xdb\xd3\xd3\x66\xbc\x80\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x19\x0e" - "\x18\x30\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xfe\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xdc\xc6\xc3\xc3\xc3\xc3\xc6\xcc\xc0\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xff\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xce\x18\x0f" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x18\xf0" - "\x00\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x0e\x3c" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x3c\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x7e\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1b\x1e\x3c\x78\xd8\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x00\x00\x00\x00\x00" - "\x6c\x38\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x18\x0f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x18\xf0" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x30\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\x06\x1c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x1b\x1b\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x30\x1c" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x30\x1e" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0e\x06\x7f\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x18\xf0" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xd6\xf6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x60\x3c" - "\x00\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "ISO-8859-4 Baltic wide (VGA 9bit mapped)", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xdb\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x06\x0e\x1a\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x10\xfe\x66\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xe8\xd0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x36\x24\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x6c\x76\x66\x66\x66\x66\xe6\x06\x0c\x30\x00" - "\x00\x00\x0c\x08\x00\x3c\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00" - "\x00\x00\x24\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x02\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x00\x00\x00\x07\x88\xcb\xab\xa8\xab\x9b\x88\x00\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x60\x7c\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00\x00" - "\x00\x60\xf8\x60\x60\x7c\x76\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00" - "\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x6c\x6c\x6c\x6e\x69\x69\x69\x69\xce\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xfe\xc9\xc9\xc9\xc9\xce\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x36\x24\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xfe\xc9\xc9\xce\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x4c\x4c\x4e\x49\x49\xce\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\xfe\xc2\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x62\xc0\xf8\xc0\x62\x3c\x00\x00\x00\x00" - "\x02\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x18\x10\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "Codepage 866 (c) Russian", CIOLIB_CP866M} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00\x00" - "\x00\x00\xc3\x66\x3c\x18\xff\x18\xff\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xa2\xa2\xba\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\x70\x18\x78\xc8\x78\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xaa\xb2\xaa\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf8\x18\x30\x18\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7e\x63\x60\xc0\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x06\x3c\x00\x00" - "\x00\x60\xe0\x60\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x88\xd8\x70\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xce\x9b\x06\x0c\x1f\x00\x00" - "\x00\xf0\x30\x72\x36\xec\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x60\x30\x18\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x30\x00\x00" - "\x30\x18\x0c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x60\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x0c\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x42\x3c\x00\x3c\x66\xc2\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x6c\x38\x10\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x02\x06\x7c\xce\xce\xde\xd6\xd6\xf6\xe6\xe6\x7c\xc0\x80\x00\x00" - "\x60\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x18\x30\x00\x00" - "\x00\x00\x38\x6c\xc6\xce\xdc\xd8\xcc\xc6\xd6\xdc\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x1b\x7e\xd8\xdc\x77\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x30\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x44\x38\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x02\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x18\x30\x00\x00" - "\x00\x00\x66\x66\x00\xee\x66\x66\x66\x66\x66\x3e\x06\x0c\x38\x00" - , NULL, NULL, "ISO-8859-9 Turkish", CIOLIB_ISO_8859_9} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x18\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00\x00" - "\x00\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00\x00" - "\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00\x00" - "\x00\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00\x00" - "\x00\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00\x00" - "\x0e\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x70\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00\x00" - "\x00\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00\x00" - "\x00\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00" - "\x00\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00" - "\x00\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0\x00" - "\x00\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x00\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0\x00" - "\x00\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x00" - "\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00\x00" - "\x00\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00" - "\x00\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00\x00" - "\x00\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00\x00" - "\x00\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70\x00" - "\x00\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00" - "\x00\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e\x00" - "\x00\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03\x00" - "\x00\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00\x00" - "\x00\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10\x00" - "\x00\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\xfe" - "\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00" - "\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00" - "\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00" - "\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00" - "\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00" - "\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc" - "\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00" - "\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c" - "\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00" - "\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00" - "\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00" - "\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00" - "\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00" - "\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c" - "\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe" - "\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0" - "\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e" - "\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0" - "\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00" - "\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f" - "\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00" - "\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00" - "\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70" - "\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00" - "\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00" - "\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00" - "\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e" - "\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03" - "\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e" - "\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00" - "\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00" - "\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10" - "\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x12\xca\x2c\x79\x9e\x34\x53\x48" - "\xc0\xc0\xc0\xd8\xd8\xd8\x76\x00" - "\x00\x00\x30\x30\x00\x30\x30\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x00\x6c\x36\x1b\x36\x6c\x00\x00" - "\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\x00\x00\x30\x30\x00\x00" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x70\x3f\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\x00\x00" - "\x01\x0e\x70\x80\x00\x00\x00\x00" - "\x1c\x30\x40\x00\x00\x00\x00\x00" - "\x1e\x35\x26\x00\x00\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\x6f\x3b\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x7c\xc6\xc6\xc0\xc0\xf8\xc0\x00" - "\x00\x00\x78\xcc\xc0\xc0\xf0\xc0" - "\x7c\xc6\xc6\xc6\xc6\x7f\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x7e\x0c" - "\x7c\xc6\xc6\xc6\xc6\x07\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0e\x0c" - "\xc0\xc0\xfe\xc0\xc6\xc6\x7c\x00" - "\xc0\xc0\xfc\xc0\xcc\xcc\x78\x00" - "\x3e\x63\x36\x1c\xb8\xfe\x83\x00" - "\x00\x00\x78\xcc\xcc\x7c\x0c\x0e" - "\xc0\xc0\xfc\xc0\xc0\xfe\x03\x00" - "\x00\xc0\xc0\xf8\xc0\xc0\xf8\x0c" - "\x7c\xc6\xc6\xc6\xc0\xc0\xfe\x00" - "\x00\x00\x78\xcc\xcc\xc0\xc0\xfc" - "\x7c\xc6\xdf\xd6\xde\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xcf\xd6\xdc\xc0" - "\x06\x06\x7f\xc6\xc6\xc6\x7c\x00" - "\x00\x0c\x0c\x7e\xcc\xcc\x78\x00" - "\xc0\xfc\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xf8\xcc\xcc\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xf8" - "\xc0\xc0\xf3\xdb\xdb\xce\xc0\x00" - "\x00\xc0\xc0\xc0\xf3\xdb\xce\xc0" - "\xe7\x3c\x66\xc3\xc3\x66\x3c\x00" - "\xc0\x37\x0c\x66\xc3\xc6\x7c\x00" - "\xc0\xc0\xc6\xc6\x7e\x06\x06\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\x7c\x0c" - "\xfc\xfe\x06\xfc\xfe\x06\x06\x00" - "\xc0\xc0\xf8\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\xc6\x0c\x68\x9a\x66\x00" - "\x00\x10\x30\x78\xcc\xcc\x7a\x00" - "\x7c\xc6\xc6\xc6\xc6\x06\x07\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0c\x0e" - "\x0f\xf0\x6c\x66\xc3\xc3\xff\x00" - "\x1c\xe0\x30\xc8\xcc\xcc\xfc\x00" - "\xc7\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x0e\x0c\x0c\xcc\xcc\xcc\x78\x00" - "\x38\x7e\x06\xf8\x06\x7e\x38\x00" - "\x00\x38\x7e\x06\xfc\x06\x7e\x38" - "\xe0\x60\x60\x63\x63\x63\x3e\x00" - "\xe0\x60\x66\x66\x66\x66\x3c\x00" - "\xe0\x7e\x1e\x30\x60\x33\x1e\x00" - "\x00\x78\xcc\x0c\x30\x60\xc0\xfc" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\x06\xcc\x70\x18\x0c\x00" - "\x00\x30\x60\x30\x18\x30\x62\x3c" - "\x7e\xdb\xdb\xdb\x1b\x03\x03\x00" - "\x00\x00\xdb\xdb\xdb\xdb\x6f\x03" - "\x3c\x66\x66\x1c\xb8\xfe\x83\x00" - "\x00\x3c\x66\x66\x66\x1c\x70\xfe" - "\x7c\xc6\xc6\xc6\xc7\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xce\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x78\x00" - "\x06\x06\xc6\xc6\x7e\x06\x07\x00" - "\x0c\x0c\xcc\xcc\xcc\xfc\x0c\x0e" - "\x7e\xe7\x30\x18\x0c\xe7\x7e\x00" - "\x00\x00\xd6\xdb\xdb\xdb\x6b\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\x00\x78\xcc\xcc\xcc\xc0\xc0" - "\x7c\xc6\x7c\xfc\x03\x83\x7e\x00" - "\x00\x00\x78\xcc\x78\x0c\xcc\x78" - "\xc0\xc0\xc0\xf0\xc0\xc0\xc0\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xe0\x00" - "\x18\x7e\xdb\xdb\xdb\x7e\x18\x00" - "\x18\x18\xde\xdb\xdb\xdb\x7b\x18" - "\x3e\x63\x63\x7e\x60\xff\x60\x00" - "\x00\x3c\x66\x66\x7c\x60\xfc\x60" - "\x3c\x66\xc3\xc3\xc3\x66\x3c\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x18" - "\x30\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "haik8 codepage (use only with armscii8 screenmap)", CIOLIB_HAIK8} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\xdc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x9a\xa2\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xb2\xaa\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x06\x3c\x06\x06\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78\x00\x00" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\xe0\x30\x62\x36\xec\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00" - "\x00\x00\x00\x00\xc6\xc6\x66\x76\xdc\xcc\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x0c\x0c\x0c\x0c\x0c\x0c\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x38\x0c\x0c\x0c\x0c\x1c\x36\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x70\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x30\x30\x30\x18\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xd6\xd6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x70\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\x0c\x0c\x0c\x0c\x0c\x0c\x0e\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\x06\x06\x06\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xfc\x06\x06\x06\x06\x0c\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x76\x66\xc6\xc6\xc6\xc6\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x38\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x1c\x00" - "\x00\x00\x00\x00\x38\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\xc6\xc6\xc6\xc6\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\xee\x66\x66\x66\x66\x66\x2c\xf8\x00\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x4c\xcc\xcc\xec\x0c\x0c\x0c\x0c\x0c\x0e\x00" - "\x00\x00\x00\x00\xfc\x46\xc6\xc6\xe6\x06\x06\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xee\x66\x66\x6c\x78\x60\x60\x60\x60\x60\x70\x00" - "\x00\x00\x00\x00\xee\x66\x66\x34\x18\x0c\x06\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x66\x64\x6c\x6e\x60\x60\x60\x60\x00" - "\x00\x00\x00\x00\xfc\x06\x06\x06\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xf6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x66\x66\x66\x66\x66\xe6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x63\x63\x63\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x36\x7f\x36\x36\x36\x7f\x36\x36\x00\x00\x00" - "\x0c\x0c\x3e\x63\x61\x60\x3e\x03\x43\x63\x3e\x0c\x0c\x00" - "\x00\x00\x00\x00\x61\x63\x06\x0c\x18\x33\x63\x00\x00\x00" - "\x00\x00\x1c\x36\x36\x1c\x3b\x6e\x66\x66\x3b\x00\x00\x00" - "\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x18\x0c\x06\x06\x06\x06\x06\x0c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x01\x03\x06\x0c\x18\x30\x60\x40\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x6b\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x0c\x0c\x0c\x0c\x0c\x3f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x06\x0c\x18\x30\x63\x7f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x03\x1e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x06\x0e\x1e\x36\x66\x7f\x06\x06\x0f\x00\x00\x00" - "\x00\x00\x7f\x60\x60\x60\x7e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7f\x63\x03\x06\x0c\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3f\x03\x03\x06\x3c\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x06\x0c\x0c\x00\x0c\x0c\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x6f\x6f\x6f\x6c\x60\x3e\x00\x00\x00" - "\x00\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x63\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x33\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x1e\x33\x61\x60\x60\x60\x61\x33\x1e\x00\x00\x00" - "\x00\x00\x7c\x36\x33\x33\x33\x33\x33\x36\x7c\x00\x00\x00" - "\x00\x00\x7f\x33\x31\x34\x3c\x34\x31\x33\x7f\x00\x00\x00" - "\x00\x00\x7f\x33\x31\x34\x3c\x34\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1e\x33\x61\x60\x60\x6f\x63\x33\x1d\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x7f\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x73\x33\x36\x36\x3c\x36\x36\x33\x73\x00\x00\x00" - "\x00\x00\x78\x30\x30\x30\x30\x30\x31\x33\x7f\x00\x00\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x63\x63\x6b\x6f\x3e\x07\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x36\x33\x33\x73\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x30\x1c\x06\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x6b\x6b\x7f\x36\x36\x00\x00\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x3c\x66\x66\x66\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7f\x63\x46\x0c\x18\x30\x61\x63\x7f\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x40\x60\x70\x38\x1c\x0e\x07\x03\x01\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x08\x1c\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x70\x30\x30\x3c\x36\x33\x33\x33\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x0e\x06\x06\x1e\x36\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x7c\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x36\x3b\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x33\x36\x3c\x36\x33\x73\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x7f\x6b\x6b\x6b\x6b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x3e\x30\x30\x78\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x06\x0f\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x33\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00" - "\x00\x00\x08\x18\x18\x7e\x18\x18\x18\x1b\x0e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x63\x3f\x03\x06\x3c\x00" - "\x00\x00\x00\x00\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x3b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00" - "\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x73\x7e\x00\x00\x00" - "\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x18\x18\x18\x18\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x3e\x63\x30\x1c\x36\x63\x63\x36\x1c\x06\x63\x3e\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x9a\xa2\xa2\xa2\x9a\x44\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x1b\x36\x6c\x36\x1b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x03\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\xba\xaa\xb2\xaa\xaa\x44\x38\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\x0c\x38\x0c\x0c\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x33\x33\x33\x33\x33\x3e\x30\x60\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x36\x1b\x36\x6c\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x36\x6e\xda\x3f\x06\x06\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f\x00" - "\x00\xe0\x30\x63\x36\xec\x18\x36\x6e\xda\x3f\x06\x06\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00" - "\x00\x00\x00\x63\x63\x33\x3b\x6e\x66\x63\x63\x00\x00\x00" - "\x00\x00\x00\x7c\x06\x06\x06\x06\x06\x06\x7f\x00\x00\x00" - "\x00\x00\x00\x1c\x06\x06\x06\x06\x1e\x36\x63\x00\x00\x00" - "\x00\x00\x00\x7f\x06\x06\x06\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\x7e\x03\x03\x03\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x00\x38\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x7e\x18\x18\x18\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x7e\x33\x63\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x00\x66\x6b\x6b\x63\x63\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x3c\x06\x06\x06\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x03\x03\x06\x06\x06\x06\x06\x06\x07\x00" - "\x00\x00\x00\x7e\x03\x03\x03\x03\x03\x06\x7c\x00\x00\x00" - "\x00\x60\x60\x7e\x03\x03\x03\x06\x0c\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7e\x63\x63\x63\x63\x63\x63\x7f\x00\x00\x00" - "\x00\x00\x00\x6e\x7b\x33\x63\x63\x63\x63\x6f\x00\x00\x00" - "\x00\x00\x00\x1c\x06\x06\x0c\x0c\x0c\x0c\x0c\x0c\x0e\x00" - "\x00\x00\x00\x1c\x06\x06\x06\x06\x06\x06\x3e\x00\x00\x00" - "\x00\x00\x00\x7e\x33\x63\x63\x63\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x33\x33\x33\x33\x33\x1b\x0e\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\x26\x66\x76\x06\x06\x06\x06\x06\x07\x00" - "\x00\x00\x00\x7e\x23\x63\x73\x03\x03\x03\x7f\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x6c\x78\x60\x60\x60\x70\x00" - "\x00\x00\x00\x63\x63\x33\x1e\x0c\x06\x03\x7f\x00\x00\x00" - "\x00\x00\x00\x7e\x03\x03\x33\x36\x36\x37\x30\x30\x30\x00" - "\x00\x00\x00\x7e\x03\x03\x03\x03\x03\x03\x03\x00\x00\x00" - "\x00\x00\x00\x6b\x6b\x6b\x6b\x6b\x7b\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x7e\x33\x33\x33\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x30\x30\x60\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x1c\x30\x66\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x1c\x30\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x06\x0c\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x0c\x38\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x0c\x18\x30\x60\x30\x18\x0c\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x30\x18\x0c\x06\x0c\x18\x30\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x18\x3c\x66\x66\x7e\x66\x66\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x70\x38\x0e\x66\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x1c\x36\x30\x78\x30\x30\x78\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x7c" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x7e\xc0\xc0\x7e\x18\x18" - "\x38\x6c\x64\xf0\x60\xe6\xfc\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\x66\x66\x3c\x7e\x18\x7e\x18\x18" - "\x18\x18\x18\x00\x00\x18\x18\x18" - "\x3e\x63\x3c\x66\x66\x3c\xc6\x7c" - "\x00\xc6\x00\x00\x00\x00\x00\x00" - "\x7e\x81\x9d\xa1\xa1\x9d\x81\x7e" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\x00\x00\x7e\x06\x06\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x7e\x81\xb9\xa5\xb9\xa5\x81\x7e" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x78\x0c\x38\x0c\x78\x00\x00\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x7c\xc0" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\x38" - "\x18\x38\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\xc3\xc6\xcc\xda\x36\x6e\xdf\x06" - "\xc3\xc6\xcc\xde\x33\x66\xcc\x0f" - "\xe1\x32\xe4\x3a\xf6\x2a\x5f\x86" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff" - "\x00\xc6\x66\x76\xdc\xcc\xc6\x00" - "\x00\xf8\x0c\x0c\x0c\x0c\xfe\x00" - "\x00\x38\x0c\x0c\x1c\x34\xe6\x00" - "\x00\xfe\x0c\x0c\x0c\x0c\x0c\x00" - "\x00\xfc\x06\x06\xc6\xc6\xc6\x00" - "\x00\x70\x18\x18\x18\x18\x18\x00" - "\x00\x3c\x18\x18\x0c\x18\x30\x00" - "\x00\xfc\x66\xc6\xc6\xc6\xc6\x00" - "\x00\xcc\xd6\xd6\xc6\xcc\x78\x00" - "\x00\x38\x0c\x0c\x18\x00\x00\x00" - "\x00\xfc\x06\x06\x0c\x0c\x0c\x0e" - "\x00\xfc\x06\x06\x06\x06\xfc\x00" - "\xc0\xfc\x06\x06\x0c\x18\x18\x00" - "\x00\xfc\x66\xc6\xc6\xc6\xfe\x00" - "\x00\xdc\x76\x66\xc6\xc6\xde\x00" - "\x00\x38\x0c\x18\x18\x18\x18\x1c" - "\x00\x38\x0c\x0c\x0c\x0c\x7c\x00" - "\x00\xfc\x66\xc6\xc6\xcc\x78\x00" - "\x00\x66\x66\x66\x66\x36\xfc\x00" - "\x00\xf8\x4c\xcc\xec\x0c\x0c\x0e" - "\x00\xfc\x46\xc6\xe6\x06\xfe\x00" - "\x00\x66\x66\x66\x7c\x60\x60\x70" - "\x00\x66\x36\x1c\x0c\x06\x7e\x00" - "\x00\xfc\x06\x66\x6c\x6e\x60\x60" - "\x00\xfc\x06\x06\x06\x06\x06\x00" - "\x00\xd6\xd6\xd6\xf6\xc6\x7c\x00" - "\x00\xfc\x66\x66\x66\xe6\xe6\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-8 Hebrew", CIOLIB_ISO_8859_8} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf8\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x00\x0c\x18\x30\x60\x30\x18\x0c" - "\x00\x30\x18\x0c\x06\x0c\x18\x30" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x38\x6c\x6c\x38\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x18\x18\x00\x7e\x00\x18\x18" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x7c\xc0\xf8\xc0\x7c\x00" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x20\x00\x70\x30\x30\x30\x78\x00" - "\x50\x00\x70\x30\x30\x30\x78\x00" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x00\x06\x7e\x60\x60\x60\x60\x00" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x3c\x66\xc0\xf8\xc0\x66\x3c\x00" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x30\x78\x30\x30\x30\x30\x78\x00" - "\x48\x78\x30\x30\x30\x30\x78\x00" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x06\x7e\x60\x60\x60\x60\x60\x00" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - , "Ukrainian font koi8-u", CIOLIB_KOI8_U} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x24\x24\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x24\x24\x24\x7e\x24\x24\x24\x7e\x24\x24\x24\x00\x00\x00" - "\x00\x00\x08\x3f\x48\x48\x48\x3e\x09\x09\x09\x7e\x08\x00\x00\x00" - "\x00\x00\x00\x30\x49\x32\x04\x08\x10\x26\x49\x06\x00\x00\x00\x00" - "\x00\x00\x00\x18\x24\x24\x18\x25\x22\x22\x22\x1d\x00\x00\x00\x00" - "\x00\x18\x08\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x10\x08\x04\x04\x04\x04\x04\x04\x08\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\x7e\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x08\x7f\x08\x08\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x08\x10\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x42\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x08\x18\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x1c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x06\x0a\x12\x22\x42\x7f\x02\x02\x02\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x40\x40\x40\x7c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x04\x08\x08\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x3c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x3e\x02\x02\x02\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x08\x08\x10\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x20\x10\x08\x04\x02\x04\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x00\x1c\x22\x49\x55\x55\x56\x4c\x20\x1e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x7c\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\x42\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x40\x40\x40\x4e\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x0e\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x42\x44\x48\x50\x60\x60\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x40\x40\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x41\x63\x55\x49\x41\x41\x41\x41\x41\x41\x00\x00\x00\x00" - "\x00\x00\x42\x62\x52\x52\x4a\x4a\x46\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x4a\x3c\x04\x02\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x3c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7f\x08\x08\x08\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x22\x22\x14\x14\x08\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x41\x49\x55\x63\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x22\x14\x08\x08\x14\x22\x41\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x08\x10\x20\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x00\x00\x08\x14\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x18\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x02\x02\x3e\x42\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x7e\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x08\x08\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x0e\x02\x02\x02\x02\x02\x02\x02\x42\x3c\x00" - "\x00\x00\x40\x40\x40\x42\x44\x48\x70\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x70\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x49\x49\x49\x49\x49\x49\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x7c\x40\x40\x40\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x02\x00" - "\x00\x00\x00\x00\x00\x5c\x62\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x3c\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x49\x49\x49\x49\x49\x49\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x24\x18\x24\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x00\x00\x00\x7e\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x0c\x10\x10\x10\x10\x20\x10\x10\x10\x10\x0c\x00\x00\x00\x00" - "\x00\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00" - "\x00\x30\x08\x08\x08\x08\x04\x08\x08\x08\x08\x30\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3c\x4a\x48\x48\x4a\x3c\x08\x08\x00\x00\x00" - "\x00\x00\x1c\x22\x22\x20\x78\x20\x20\x20\x21\x7e\x00\x00\x00\x00" - "\x00\x00\x1e\x21\x20\x7e\x20\x7e\x20\x21\x1e\x00\x00\x00\x00\x00" - "\x00\x00\x41\x22\x14\x08\x08\x3e\x08\x3e\x08\x08\x00\x00\x00\x00" - "\x24\x18\x00\x3c\x42\x40\x40\x3c\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x20\x3c\x42\x42\x42\x3c\x04\x42\x3c\x00\x00\x00" - "\x00\x00\x24\x18\x00\x3c\x42\x40\x3c\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3e\x41\x41\x5d\x51\x51\x5d\x41\x41\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x09\x12\x24\x48\x90\x48\x24\x12\x09\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x02\x02\x02\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x3e\x41\x5d\x55\x5d\x59\x55\x55\x41\x3e\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x24\x24\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x08\x3e\x08\x08\x00\x3e\x00\x00\x00\x00" - "\x00\x00\x30\x48\x10\x20\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x70\x08\x30\x08\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x24\x18\x00\x7e\x02\x04\x08\x10\x20\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7e\x41\x40\x40\x80\x00" - "\x00\x00\x3e\x4a\x4a\x4a\x3a\x0a\x0a\x0a\x0a\x0a\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x24\x18\x00\x7e\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x10\x70\x10\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x18\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x90\x48\x24\x12\x09\x12\x24\x48\x90\x00\x00\x00\x00" - "\x00\x00\x7f\x88\x88\x88\x8e\x88\x88\x88\x88\x7f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x91\x91\x9f\x90\x91\x6e\x00\x00\x00\x00" - "\x14\x14\x00\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x10\x10\x00\x10\x10\x10\x20\x40\x40\x42\x3c\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x18\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3f\x48\x48\x48\x7e\x48\x48\x48\x48\x4f\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x04\x02\x3c\x00" - "\x18\x06\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x06\x18\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x0c\x12\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x14\x14\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x18\x06\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x06\x18\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x08\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x14\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\xf2\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x19\x26\x00\x41\x61\x51\x49\x45\x43\x41\x41\x00\x00\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00" - "\x00\x00\x19\x26\x44\x4a\x4a\x52\x52\x22\x64\x98\x00\x00\x00\x00" - "\x30\x0c\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x04\x08\x10\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x20\x20\x20\x3e\x21\x21\x21\x31\x2e\x20\x20\x20\x20\x00\x00" - "\x00\x00\x1e\x21\x21\x21\x3e\x21\x21\x21\x31\x2e\x20\x00\x00\x00" - "\x00\x10\x08\x04\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x1c\x22\x1c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x09\x09\x3e\x48\x48\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x08\x04\x78\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x10\x08\x04\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x08\x14\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x22\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x30\x4c\x04\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\xff\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1d\x22\x45\x49\x51\x22\x5c\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x20\x20\x20\x3e\x21\x21\x21\x21\x31\x2e\x20\x20\x20\x00\x00" - "\x00\x00\x24\x24\x00\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - , NULL, NULL, "ISO-8859-15 West European, (thin)", CIOLIB_ISO_8859_15} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x18\x18\x7e\xdb\xd8\x58\x38\x1c\x1e\xdb\xdb\x7e\x18\x18\x00" - "\x00\x00\x00\xe2\xa6\xec\x18\x18\x30\x60\x6e\xca\x8e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x18\x30\x60\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x18\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x00\x00\x00\x80\xc0\x60\x60\x30\x18\x0c\x0c\x06\x02\x00\x00\x00" - "\x00\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x36\x30\xfc\x30\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x0c\x18\x20\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x76\xdc\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x6c\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e\x00" - "\x66\x3c\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x18\x30\x40\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e\x00" - "\x6c\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x18\x18\x00\xfe\x66\x60\x60\x78\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x3c\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x0c\x78\x00" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x02\x06\x7c\xce\xde\xd6\xd6\xd6\xd6\xf6\xe6\x7c\xc0\x80\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x60\x3c\x00" - "\x0c\x18\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xf6\x18\xf0\x00" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7c\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x0c\x78\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x18\xf0\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00\x00" - "\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\x06\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1c\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x30\x1e\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x18\xf0\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x60\x3c\x00" - "\x00\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xd8\x78\x1c\x1e\x9b\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x1c\x18\x30\x70\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x30\x30\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x18\x18\x0c\x06\x06\x00\x00" - "\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x36\x30\x30\xfc\x30\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0e" - "\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0" - "\x00\x00\x00\x00\x00\xfe\x86\x0c\x18\x30\x62\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x0e\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e" - "\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x18\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\x18\x3c\x66\x00\x00\x00\x00" - "\x02\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x80" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1c" - "\x0c\x18\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00" - "\x00\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e" - "\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x0c\x78" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\xce\xc6\x7c\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\x7c\x00\x00" - "\x7c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00" - "\x66\x3c\x00\xfe\xc6\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x18\x0e" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x0e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x30\xe0" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x18\xf0" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x70" - "\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x3c\x60\x38\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\x06\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x18\x1e" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x0c\x78" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x06\x7c\xce\xd6\xd6\xd6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x30\x1e" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x18\x18\x00\x18" - "\x00\xee\x66\xcc\x00\x00\x00\x00" - "\x00\x6c\xfe\x6c\x6c\x6c\xfe\x6c" - "\x18\x7e\xdb\xd8\x7e\x1b\xdb\x7e" - "\x00\x00\xc6\xcc\x18\x30\x66\xc6" - "\x00\x38\x6c\x3a\x7e\xcc\xcc\x76" - "\x00\x38\x18\x70\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x30\x30\x18\x0c" - "\x00\x30\x18\x0c\x0c\x0c\x18\x30" - "\x00\x00\x6c\x38\xfe\x38\x6c\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00" - "\x00\x00\x00\x00\x00\x38\x18\x70" - "\x00\x00\x00\x00\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18" - "\x00\x06\x0c\x18\x18\x30\x60\xc0" - "\x00\x7c\xc6\xce\xd6\xe6\xc6\x7c" - "\x00\x18\x78\x18\x18\x18\x18\x7e" - "\x00\x7c\xc6\x8c\x38\x60\xc2\xfe" - "\x00\x7c\xc6\x06\x3c\x06\xc6\x7c" - "\x00\x1c\x3c\x6c\xcc\xfe\x0c\x1e" - "\x00\xfe\xc0\xfc\x06\x06\xc6\x7c" - "\x00\x7c\xc6\xc0\xfc\xc6\xc6\x7c" - "\x00\xfe\xc6\x06\x0c\x18\x30\x30" - "\x00\x7c\xc6\xc6\x7c\xc6\xc6\x7c" - "\x00\x7c\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x18\x18\x00\x18\x18\x00" - "\x00\x00\x18\x18\x00\x18\x18\x70" - "\x00\x00\x18\x30\x60\x30\x18\x00" - "\x00\x00\x00\xfe\x00\xfe\x00\x00" - "\x00\x00\x30\x18\x0c\x18\x30\x00" - "\x00\x7c\xc6\xcc\x18\x18\x00\x18" - "\x00\x7c\xc6\xc6\xde\xdc\xc0\x7e" - "\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x00\xfc\x66\x66\x7c\x66\x66\xfc" - "\x00\x3c\x66\xc2\xc0\xc2\x66\x3c" - "\x00\xf8\x6c\x66\x66\x66\x6c\xf8" - "\x00\xfe\x66\x60\x7c\x60\x66\xfe" - "\x00\xfe\x66\x60\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc0\xce\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6" - "\x00\x3c\x18\x18\x18\x18\x18\x3c" - "\x00\x3c\x18\x18\x18\xd8\xd8\x70" - "\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6" - "\x00\xf0\x60\x60\x60\x62\x66\xfe" - "\x00\xc6\xc6\xee\xfe\xd6\xc6\xc6" - "\x00\xc6\xe6\xf6\xde\xce\xc6\xc6" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xfc\x66\x66\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc6\xd6\xd6\x7c\x06" - "\x00\xfc\x66\x66\x7c\x78\x66\xe6" - "\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c" - "\x00\xff\xdb\x99\x18\x18\x18\x3c" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xc6\x6c\x38\x10" - "\x00\xc6\xc6\xd6\xd6\xfe\xee\x6c" - "\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6" - "\x00\x66\x66\x66\x3c\x18\x18\x3c" - "\x00\xfe\xc6\x8c\x38\x62\xc6\xfe" - "\x00\x7c\x60\x60\x60\x60\x60\x7c" - "\x00\xc0\x60\x30\x30\x18\x0c\x06" - "\x00\x7c\x0c\x0c\x0c\x0c\x0c\x7c" - "\x00\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x30\x18\x00\x00\x00\x00" - "\x00\x00\x00\x78\x0c\x7c\xcc\x76" - "\x00\xe0\x60\x7c\x66\x66\x66\xfc" - "\x00\x00\x00\x78\xcc\xc0\xcc\x78" - "\x00\x0e\x0c\x7c\xcc\xcc\xcc\x7e" - "\x00\x00\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x1c\x36\x30\xfc\x30\x30\x78" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xe0\x60\x7c\x66\x66\xe6" - "\x18\x18\x00\x38\x18\x18\x18\x3c" - "\x0c\x0c\x00\x1c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x66\x6c\x78\x6c\xe6" - "\x00\x38\x18\x18\x18\x18\x18\x3c" - "\x00\x00\x00\xec\xfe\xd6\xd6\xc6" - "\x00\x00\x00\xdc\x66\x66\x66\x66" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0e\x0e" - "\x00\x00\x00\xdc\x66\x60\x60\xf0" - "\x00\x00\x00\x7c\xc0\x7c\x06\xfc" - "\x00\x30\x30\xfc\x30\x30\x36\x1c" - "\x00\x00\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x00\x00\xc6\xc6\x6c\x38\x10" - "\x00\x00\x00\xc6\xd6\xd6\xfe\x6c" - "\x00\x00\x00\xc6\x6c\x38\x6c\xc6" - "\x00\x00\x00\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\x00\xfe\x8c\x38\x62\xfe" - "\x00\x0e\x18\x18\x70\x18\x18\x0e" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x70\x18\x18\x0e\x18\x18\x70" - "\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x00\x7c\xc6\xc6\xfe\xc6\xc6" - "\x0c\x18\x7c\xc6\xc6\xfe\xc6\xc6" - "\x7c\x82\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x7c\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x38\x6c\x38\x6c\xc6\xfe\xc6\xc6" - "\x00\x3e\x78\xd8\xfe\xd8\xd8\xde" - "\x78\x30\x30\x30\x30\x78\x30\x1c" - "\x6c\x38\x7c\xc6\xc0\xc0\xc6\x7c" - "\x0e\x18\xfe\x62\x78\x60\x66\xfe" - "\xfe\x66\x60\x78\x60\x66\xfe\x1c" - "\x6c\xfe\x66\x60\x7c\x60\x66\xfe" - "\x18\xfe\x66\x60\x7c\x60\x66\xfe" - "\x0c\x18\x3c\x18\x18\x18\x18\x3c" - "\x3c\x42\x3c\x18\x18\x18\x18\x3c" - "\x3c\x00\x3c\x18\x18\x18\x18\x3c" - "\x00\xf8\x6c\x66\xf6\xf6\x6c\xf8" - "\xc6\xe6\xf6\xde\xce\xc6\x0c\x38" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\xcc\xf8\xd8\xcc\xc6\x0c\x38" - "\x7c\x82\x7c\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x03\x7e\xce\xde\xd6\xf6\xe6\xfc" - "\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1e" - "\x1c\x30\xc6\xc6\xc6\xc6\xc6\x7c" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\x7c" - "\xc6\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\x7c" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x7c\xc6\xfc\xc6\xc6\xfc\xc0" - "\x00\x00\x00\x00\x00\x00\xc6\xfe" - "\x38\x6c\xc6\xfe\xc6\xce\x18\x0e" - "\x00\x00\x00\xe6\x6c\x78\x6c\xe6" - "\xfc\x66\x7e\x6c\x66\xe6\x18\x70" - "\x00\x42\x3c\x66\x66\x3c\x42\x00" - "\x76\xdc\x38\x18\x18\x18\x18\x3c" - "\xf0\x60\x60\x62\x66\xfe\x18\x70" - "\x3c\x66\x38\x6c\x6c\x38\xcc\x78" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x7c\xc0\x7c\x06\xc6\x7c" - "\x7c\x00\xfe\x60\x7c\x60\x66\xfe" - "\x3c\x66\xc0\xce\x66\x3e\x18\x70" - "\x00\xff\x99\x1e\x3c\x78\x18\x3c" - "\x00\x00\x00\x00\x00\x3c\x00\x00" - "\x6c\x38\xfe\x8c\x18\x32\x66\xfe" - "\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x0f" - "\x00\x00\x00\x00\x00\x00\x10\x1c" - "\x00\x00\xdc\x76\x66\xf0\x30\xe0" - "\x18\x30\x00\x00\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x18\x18\x3c" - "\x38\x18\x18\x18\x18\x3c\x18\x70" - "\x6c\x38\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x04\x1c" - "\x00\x6c\x38\x7c\xc0\x7c\x06\xfc" - "\x00\x7c\x00\x7c\xc6\xfe\xc0\x7c" - "\x38\x60\x30\x7e\xcc\x7c\x0c\xf8" - "\x00\x30\x30\xfc\x30\x38\x76\x1c" - "\x00\xdc\xfe\xf6\xc6\xc6\xc6\xdc" - "\x6c\x38\x00\xfe\x8c\x38\x62\xfe" - "\x00\x00\xdc\xfe\xf6\xc6\x06\x1c" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x00\x78\x0c\x7c\xcc\x76" - "\x0c\x18\x20\x78\x0c\x7c\xcc\x76" - "\x00\x78\x84\x78\x0c\x7c\xcc\x76" - "\x6c\x38\x00\x78\x0c\x7c\xcc\x76" - "\x00\xcc\x00\x78\x0c\x7c\xcc\x76" - "\x00\x38\x6c\x78\x0c\x7c\xcc\x76" - "\x00\x00\x00\x6e\x3b\x7e\xd8\x7e" - "\x18\x00\x38\x18\x18\x3c\x18\x0e" - "\x00\xcc\x78\x78\xcc\xc0\xcc\x78" - "\x0c\x18\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x00\x7c\xc6\xfe\xc0\x7a\x1e" - "\x00\x6c\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x38\x00\x7c\xc6\xfe\xc0\x7c" - "\x0c\x18\x20\x38\x18\x18\x18\x3c" - "\x00\x3c\x42\x38\x18\x18\x18\x3c" - "\x00\x3c\x00\x38\x18\x18\x18\x3c" - "\x00\x0c\x3e\x0c\x7c\xcc\xcc\x76" - "\x00\x00\xdc\xe6\xc6\xc6\x18\x70" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\xe0\x66\x6c\x78\x6c\xe6\x1c" - "\x7c\xc6\x00\x7c\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x6c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x06\x7c\xce\xd6\xe6\x7c\xc0" - "\x00\x00\xcc\xcc\xcc\x7e\x30\x1c" - "\x0c\x18\x20\xcc\xcc\xcc\xcc\x76" - "\x78\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x76\xdc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x78\x00\xcc\xcc\xcc\xcc\x76" - "\x18\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-4 Baltic (VGA 9bit mapped)", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x63\x63\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00\x00" - "\x00\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00\x00" - "\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00\x00" - "\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x03\x06\x0c\x18\x30\x70\x30\x18\x0c\x06\x03\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x67\x3d\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\xf7\x00\x00\x00" - "\x00\x7e\xc3\xc3\xc0\xc0\x7e\x03\x03\x03\xc3\xc3\x7e\x00\x00\x00" - "\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x0f" - "\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x0c\x18\x70" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10" - "\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18" - "\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x7c\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x42\x7e\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xf8\x70\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x60\x88\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x6c\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x3c\x42\x99\xa1\xa1\x99\x42\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xce\xdb\xdb\xfb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x02\x06\x3c\x60\x60\x7c\x66\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x36\x66\x66\x66\xff\xc3\xc3\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c" - "\x00\x00\x00\x00\x00\x00\x7e\x32\x32\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x38\x38\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xcc\xcc\xfc\x6c\xcc\xce\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\x54\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\x66\x66\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf0\x60\x60\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xf6\xde\xde\xf6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x06\x0c\x06\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3e\x67\x03\x1f\x03\x67\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x03\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xb0\x30\x3e\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x00\xce\xdb\xdb\xdb\xfb\xdb\xdb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x66\x66\xff\xc3\x81\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\xdb\x7e\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x38\x38\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3f\x66\x66\x66\x3e\x3e\x66\x66\x66\xe7\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xd6\xd6\x54\x54\x7c\x7c\x54\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xc3\xc3\xc3\xc3\xf3\xdb\xdb\xdb\xdb\xf3\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00\x00\x00" - "\x00\x00\x00\x78\xcc\x06\x26\x3e\x26\x06\x06\xcc\x78\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03\x03\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\xf8\xb0\x30\x30\x3c\x36\x36\x36\x36\x7c\x00\x00\x00" - , NULL, NULL, "Russian koi8-r (b)", CIOLIB_KOI8_R} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\x1b\xdb\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00" - "\x00\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00" - "\x00\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x00\x00" - "\x00\x00\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xe3\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0f" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc3\xc3\x66\x66\x3c\x18\x18\x30\x30\xe0" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xff\x00" - "\x00\x00\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xce\x18\x0f" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xfe\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\x66\xf7\x18\xf0" - "\x00\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x0e\x3c" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x3c\x7e\xc3\xc7\xc0\x60\x3c\x06\x03\xe3\xe3\xc3\x7e\x00\x00" - "\x7e\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x66\x3c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1b\x1e\x3c\x78\xd8\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x00\x00\x00\x00\x00" - "\x6c\x38\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x18\x0f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e" - "\x00\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x18\xf0" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x7b\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x30\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\x06\x1c\x00" - "\x00\x7c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x20\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x10\x38\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x00\x7c\xee\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00" - "\x0e\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x00\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x18\x0f" - "\x66\x24\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x18\x18\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00" - "\x0e\x18\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfc\x66\x63\x63\x63\xf3\xf3\x63\x63\x63\x66\xfc\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7e\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x06\x3c" - "\x3c\x66\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x76\xdc\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x66\x66\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x01\x3d\x66\xc7\xcb\xcb\xdb\xdb\xdb\xd3\xd3\x66\xbc\x80\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x19\x0e" - "\x18\x30\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xfe\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xdc\xc6\xc3\xc3\xc3\xc3\xc6\xcc\xc0\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x7c\x06\x7e\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x1b\x1b\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x30\x1c" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x30\x1e" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0e\x06\x7f\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x18\xf0" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xd6\xf6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x60\x3c" - "\x00\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x00\x00\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "ISO-8859-4 Baltic wide", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xf8\x60\x60\x60\x7c\x66\x66\x66\x66\x6c\x00\x00\x00\x00" - "\x18\x30\x00\x7e\x60\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf8\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xd8\xde\xdb\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xd8\xfe\xdb\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\xfc\x30\x30\x30\x3c\x36\x36\x36\x36\x36\x00\x00\x00\x00" - "\x18\x30\x00\xc6\xcc\xd8\xf0\xf8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x88\x8a\xcd\xea\xb8\x98\x8b\x88\x8b\x88\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x60\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x0c\x00\x00\x00" - "\x00\x00\x18\x30\x00\x7c\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x04\x04\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x18\x38\x78\xde\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xd8\xfe\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x3c\x36\x36\x36\x36\x00\x00\x00\x00" - "\x00\x00\x18\x30\x00\xc4\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x28\x10\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xf8\x60\x60\x60\x7c\x66\x66\x66\x6c\x00\x00\x00" - "\x18\x30\x00\x7e\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xde\xdb\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xfe\xdb\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\xfc\x30\x30\x30\x3c\x36\x36\x36\x36\x00\x00\x00" - "\x18\x30\x00\xcc\xd8\xf0\xf0\xd8\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\x00\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x88\x8a\xcd\xea\xb8\x98\x8b\x88\x8b\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x66\x66\x66\x66\x0c\x00\x00" - "\x00\x00\x18\x30\x00\x7c\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x04\x04\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x38\x78\xde\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xfe\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x30\x30\xfc\x30\x3c\x36\x36\x36\x36\x00\x00\x00" - "\x00\x00\x18\x30\x00\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x28\x10\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\xf8\x60\x60\x7c\x66\x66\x6c\x00" - "\x18\x7e\x60\x60\x60\x60\x60\x00" - "\x3c\x66\xc0\xf8\xc0\x66\x3c\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\x30\x78\x30\x30\x30\x30\x78\x00" - "\x48\x78\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x38\x78\xd8\xde\xdb\xdb\xde\x00" - "\xd8\xd8\xd8\xfe\xdb\xdb\xde\x00" - "\xfc\x30\x30\x3c\x36\x36\x36\x00" - "\x18\xd6\xcc\xf8\xf8\xcc\xc6\x00" - "\x00\x00\x00\x78\x00\x00\x00\x00" - "\x18\x66\x66\x3e\x06\x66\x3c\x00" - "\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x8a\xcd\xea\xb8\x9b\x88\x8b\x00" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x60\x60\xf8\x60\x7c\x66\x66\x0c" - "\x18\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x7c\xc0\xf8\xc0\x7c\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x20\x00\x70\x30\x30\x30\x78\x00" - "\x50\x00\x70\x30\x30\x30\x78\x00" - "\x08\x00\x1c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\x38\x78\xde\xdb\xde\x00" - "\x00\x00\xd8\xd8\xfe\xdb\xde\x00" - "\x30\x30\xfc\x30\x3c\x36\x36\x00" - "\x18\x10\xcc\xd8\xf0\xd8\xcc\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\x18\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\xc6\xc6\xfe\x38\x38\x00" - , "ISO-8859-5 Cyrillic", CIOLIB_ISO_8859_5} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x18\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00\x00" - "\x00\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00\x00" - "\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00\x00" - "\x00\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00\x00" - "\x00\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00\x00" - "\x00\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00\x00" - "\x0e\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x70\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00\x00" - "\x00\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00\x00" - "\x00\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00\x00" - "\x00\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00" - "\x00\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00" - "\x00\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0\x00" - "\x00\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x00\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0\x00" - "\x00\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c\x00" - "\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00\x00" - "\x00\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00\x00" - "\x00\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00" - "\x00\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00\x00" - "\x00\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00\x00" - "\x00\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70\x00" - "\x00\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00" - "\x00\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e\x00" - "\x00\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03\x00" - "\x00\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00\x00" - "\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00\x00" - "\x00\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00\x00" - "\x00\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f\x00" - "\x00\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00" - "\x00\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00\x00" - "\x00\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10\x00" - "\x00\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60\x00" - "\x00\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00\x00" - "\x00\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\xfe" - "\x66\x66\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x18\x7e\xdb\xd8\xd8\x7e\x1b\x1b\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xac\xec\x18\x18\x30\x30\x6e\x6a\xce\x00\x00\x00" - "\x38\x6c\x6c\x6c\x38\x76\xdc\xdc\xcc\xcc\x76\x00\x00\x00" - "\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x30\x00\x00\x00" - "\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x38\x6c\xce\xde\xde\xd6\xf6\xf6\xe6\x6c\x38\x00\x00\x00" - "\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x38\x6c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\xfc\x8c\x18\x30\x38\x0c\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\xfe\xc0\xc0\xf8\xcc\x06\x06\x06\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc0\xc0\xf8\xec\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x38\x6c\xc6\xc6\x6c\x38\x6c\xc6\xc6\x6c\x38\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\x6e\x3e\x06\x06\x6c\x38\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x60\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x3c\x66\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x10\x38\x7c\xee\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\xf8\x6c\x66\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\xfe\x66\x62\x60\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xce\xc6\xc6\xce\x7a\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\xe6\x66\x6c\x6c\x78\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\xf0\x60\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x82\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xfc\x66\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xde\xfe\x7c\x0e\x06\x00" - "\xfc\x66\x66\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x7c\xc6\xc6\xc0\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\xfe\xc6\x8c\x0c\x18\x10\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x00\x00\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xdc\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x1c\x0c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\xcc" - "\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xcc\xcc" - "\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\x60" - "\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00" - "\x10\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xee\x7c\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x7c" - "\x00\x00\x00\x00\xfe\xc6\x0c\x38\x60\xc6\xfe\x00\x00\x00" - "\x18\x18\x18\x18\x30\xe0\x30\x18\x18\x18\x18\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x0c\x07\x0c\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x4c\x52\xba\x94\x64\x18\x00\x00\x00\x00" - "\xe0\x60\x60\x60\x60\x60\x60\x6c\x6c\x6c\x3f\x00\x00\x00" - "\x00\x00\x00\x00\x30\x78\x30\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x38\x1c\x1c\x1c\x1c\x1c\x1c\x38\x30\x60\x00\x00" - "\x0c\x18\x38\x70\x70\x70\x70\x70\x70\x38\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x36\x1b\x1b\x36\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\xd8\x6c\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x78\x30\x00\x00" - "\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x3c\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc2\xe6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x92\x92\x92\x00\x00\x00" - "\x03\x76\xdc\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x46\x96\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xde\xcf\x7b\x00\x00\x00" - "\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x6a\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xc0\xc0\xfe\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\xcc\xcc\xcc\xcc\xcc\x7f\x0c\x0c\x0c" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x0c\x0c\x0c" - "\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xfe\xc0\xc0\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x66\x3e\x06\x0c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\xc0\xc0\xc0\xfe\xc0\xc0\xc0\xc0\xf8\x0c\x0c\x78\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xf8\x0c\x38\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\xfe" - "\x7c\xc6\xc6\xc6\xcf\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xfc\xc6\xcf\xd6\xd6\xd6\xcc\xc0\xc0\xc0" - "\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0c\x0c\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xc0\xc0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e" - "\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xd6\xcc\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xf6\xd6\xd6\xd6\xd6\xd6\xce\xc0\xc0\xc0" - "\xc0\x7e\xfb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\x78\x0c\x0c\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x18\x30\x18\x0c\x18\x30\x60\xc0\xf0\x3c\x0e\x0c\x00\x00" - "\xc0\xc0\xc0\xc0\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x3c\x66\x66\x66\x66\x06\x06\x06\x6c\xd8\x6e\x00\x00\x00" - "\x30\x7e\x0c\x18\x30\x70\xd8\xd8\xcc\xce\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x0c\x0c\x0f" - "\x0e\xdb\x70\x30\x78\xcc\xcc\xcc\xcc\xdc\x6c\x00\x00\x00" - "\x1c\x36\x60\x60\xf8\x6c\x66\x66\x66\x6e\x3a\x00\x00\x00" - "\xcf\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x78\xcc\x0c\x1c\x38\x6c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\xdc\x70" - "\xe0\x60\x60\x66\x66\x66\x66\x66\x66\x66\x3c\x00\x00\x00" - "\xe0\x60\x60\x60\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00" - "\xf8\x0c\x7c\xcc\xcc\xc0\xc0\xc0\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\x0c\x18\x30\x60\xc0\x7e" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\x0c\x0c\x0c\xd8\x70\x30\x18\x00\x00" - "\x00\x00\x00\x00\x18\x30\x18\x0c\x18\x30\x60\xc0\xc0\x7e" - "\x7e\xdb\xdb\xdb\xdb\xdb\xdb\x1b\x1b\x03\x03\x00\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x03\x03\x03" - "\x60\xf0\xd8\xcc\xc6\x66\x36\x16\x1c\xd8\xfe\xc3\x00\x00" - "\x00\x00\x00\x00\x70\xd8\xcc\xcc\x6c\x38\x30\x60\xc0\x7e" - "\x78\xcc\xcc\xcc\xcc\xcc\xcf\xcc\xcc\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x00\x00\x00" - "\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0f\x00\x00\x00" - "\x0c\x0c\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0f" - "\x78\xcc\xcc\xc0\x60\x30\x18\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xdc\xd6\xd6\xd6\xd6\xd6\x76\x00\x00\x00" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\xf8\xcc\xcc\xcc\xcc\xcc\xcc\xc0\xc0\xc0" - "\x78\xcc\xcc\xcc\x78\xcc\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\xc0\xc0\xf0\xd8\xd8\xd8\xd8\xd8\xce\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x10\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x00\x00\x00" - "\x00\x10\x10\x10\xdc\xd6\xd6\xd6\xd6\xd6\x76\x10\x10\x10" - "\x3c\x66\x66\x66\x66\x7c\x60\x60\xfe\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x66\x66\x66\x66\x7c\x60\xfe\x60\x60" - "\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x00\x00\x00" - "\x70\xd0\xd0\xd0\x7c\x16\x16\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x38\x38\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x12\xca\x2c\x79\x9e\x34\x53\x48" - "\xc0\xc0\xc0\xd8\xd8\xd8\x76\x00" - "\x00\x00\x30\x30\x00\x30\x30\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x00\x6c\x36\x1b\x36\x6c\x00\x00" - "\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\x00\x00\x30\x30\x00\x00" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x70\x3f\x00\x00" - "\x00\x00\x00\x00\xdb\xdb\x00\x00" - "\x01\x0e\x70\x80\x00\x00\x00\x00" - "\x1c\x30\x40\x00\x00\x00\x00\x00" - "\x1e\x35\x26\x00\x00\x00\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\x6f\x3b\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x7c\xc6\xc6\xc0\xc0\xf8\xc0\x00" - "\x00\x00\x78\xcc\xc0\xc0\xf0\xc0" - "\x7c\xc6\xc6\xc6\xc6\x7f\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x7e\x0c" - "\x7c\xc6\xc6\xc6\xc6\x07\x06\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0e\x0c" - "\xc0\xc0\xfe\xc0\xc6\xc6\x7c\x00" - "\xc0\xc0\xfc\xc0\xcc\xcc\x78\x00" - "\x3e\x63\x36\x1c\xb8\xfe\x83\x00" - "\x00\x00\x78\xcc\xcc\x7c\x0c\x0e" - "\xc0\xc0\xfc\xc0\xc0\xfe\x03\x00" - "\x00\xc0\xc0\xf8\xc0\xc0\xf8\x0c" - "\x7c\xc6\xc6\xc6\xc0\xc0\xfe\x00" - "\x00\x00\x78\xcc\xcc\xc0\xc0\xfc" - "\x7c\xc6\xdf\xd6\xde\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xcf\xd6\xdc\xc0" - "\x06\x06\x7f\xc6\xc6\xc6\x7c\x00" - "\x00\x0c\x0c\x7e\xcc\xcc\x78\x00" - "\xc0\xfc\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\xc0\xc0\xf8\xcc\xcc\xc0\xc0" - "\xc0\xc0\xc0\xc0\xc0\xfc\x06\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xf8" - "\xc0\xc0\xf3\xdb\xdb\xce\xc0\x00" - "\x00\xc0\xc0\xc0\xf3\xdb\xce\xc0" - "\xe7\x3c\x66\xc3\xc3\x66\x3c\x00" - "\xc0\x37\x0c\x66\xc3\xc6\x7c\x00" - "\xc0\xc0\xc6\xc6\x7e\x06\x06\x00" - "\xc0\xc0\xcc\xcc\xcc\xcc\x7c\x0c" - "\xfc\xfe\x06\xfc\xfe\x06\x06\x00" - "\xc0\xc0\xf8\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\xc6\x0c\x68\x9a\x66\x00" - "\x00\x10\x30\x78\xcc\xcc\x7a\x00" - "\x7c\xc6\xc6\xc6\xc6\x06\x07\x00" - "\x00\x00\x78\xcc\xcc\xcc\x0c\x0e" - "\x0f\xf0\x6c\x66\xc3\xc3\xff\x00" - "\x1c\xe0\x30\xc8\xcc\xcc\xfc\x00" - "\xc7\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x0e\x0c\x0c\xcc\xcc\xcc\x78\x00" - "\x38\x7e\x06\xf8\x06\x7e\x38\x00" - "\x00\x38\x7e\x06\xfc\x06\x7e\x38" - "\xe0\x60\x60\x63\x63\x63\x3e\x00" - "\xe0\x60\x66\x66\x66\x66\x3c\x00" - "\xe0\x7e\x1e\x30\x60\x33\x1e\x00" - "\x00\x78\xcc\x0c\x30\x60\xc0\xfc" - "\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xcc\x00" - "\x7c\xc6\x06\xcc\x70\x18\x0c\x00" - "\x00\x30\x60\x30\x18\x30\x62\x3c" - "\x7e\xdb\xdb\xdb\x1b\x03\x03\x00" - "\x00\x00\xdb\xdb\xdb\xdb\x6f\x03" - "\x3c\x66\x66\x1c\xb8\xfe\x83\x00" - "\x00\x3c\x66\x66\x66\x1c\x70\xfe" - "\x7c\xc6\xc6\xc6\xc7\xc6\xc6\x00" - "\x00\x00\x78\xcc\xcc\xcc\xce\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x78\x00" - "\x06\x06\xc6\xc6\x7e\x06\x07\x00" - "\x0c\x0c\xcc\xcc\xcc\xfc\x0c\x0e" - "\x7e\xe7\x30\x18\x0c\xe7\x7e\x00" - "\x00\x00\xd6\xdb\xdb\xdb\x6b\x00" - "\x7c\xc6\xc6\xc6\xc0\xc0\xc0\x00" - "\x00\x00\x78\xcc\xcc\xcc\xc0\xc0" - "\x7c\xc6\x7c\xfc\x03\x83\x7e\x00" - "\x00\x00\x78\xcc\x78\x0c\xcc\x78" - "\xc0\xc0\xc0\xf0\xc0\xc0\xc0\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xe0\x00" - "\x18\x7e\xdb\xdb\xdb\x7e\x18\x00" - "\x18\x18\xde\xdb\xdb\xdb\x7b\x18" - "\x3e\x63\x63\x7e\x60\xff\x60\x00" - "\x00\x3c\x66\x66\x7c\x60\xfc\x60" - "\x3c\x66\xc3\xc3\xc3\x66\x3c\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x00" - "\x38\x58\x3e\x1b\x1b\xdb\x7e\x18" - "\x30\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "ARMSCII-8 Character set", CIOLIB_ARMSCII8} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x1e\x31\x60\x60\xfe\x60\xfc\x60\x31\x1e\x00\x00\x00\x00" - "\x00\x00\xc3\x66\x3c\x18\xff\x18\xff\x18\x18\x18\x00\x00\x00\x00" - "\x6c\x38\x10\x00\x7c\xc6\x60\x30\x18\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x38\x10\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xa2\xa2\xba\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\x70\x18\x78\xc8\x78\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xaa\xb2\xaa\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf8\x18\x30\x18\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x10\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7e\x63\x60\xc0\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x38\x10\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x60\xe0\x60\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x88\xd8\x70\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\xcc\xcc\xcc\xce\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\xdb\xdb\xde\xd8\xdc\x67\x00\x00\x00\x00" - "\x00\xc3\x00\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x60\x30\x18\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00\x00" - "\x30\x18\x0c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x60\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x0c\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x6c\x66\x66\x66\xf6\x66\x66\x6c\x78\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x6c\x38\x10\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x02\x06\x7c\xce\xce\xde\xd6\xd6\xf6\xe6\xe6\x7c\xc0\x80\x00\x00" - "\x60\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc3\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\xf0\x60\x7c\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xce\xdc\xd8\xcc\xc6\xd6\xdc\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x1b\x7e\xd8\xdc\x77\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x0c\x06\x3c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x6c\x38\x38\x6c\x0c\x3c\x6c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x02\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\xf0\x60\x7c\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x66\x66\x00\xee\x66\x66\x66\x66\x66\x3e\x06\x0c\x38\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x36\x7f\x36\x36\x36\x7f\x36\x36\x00\x00\x00" - "\x08\x08\x3e\x63\x60\x60\x3e\x03\x03\x63\x3e\x08\x08\x00" - "\x00\x00\x00\x61\x63\x06\x0c\x18\x30\x63\x43\x00\x00\x00" - "\x00\x00\x1c\x36\x36\x1c\x3b\x6e\x66\x66\x3b\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\x7e\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x01\x03\x06\x0c\x18\x30\x60\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x63\x67\x6f\x7b\x73\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x0c\x0c\x0c\x0c\x0c\x3f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x06\x0c\x18\x30\x63\x7f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x03\x1e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x06\x0e\x1e\x36\x66\x7f\x06\x06\x0f\x00\x00\x00" - "\x00\x00\x7e\x60\x60\x60\x7e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7f\x63\x03\x06\x0c\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3f\x03\x03\x06\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x06\x0c\x0c\x00\x0c\x0c\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x6f\x6f\x6f\x6e\x60\x3e\x00\x00\x00" - "\x00\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x63\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x33\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x00\x00\x00" - "\x00\x00\x7c\x36\x33\x33\x33\x33\x33\x36\x7c\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x6f\x63\x33\x1d\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x7f\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x73\x33\x36\x36\x3c\x36\x36\x33\x73\x00\x00\x00" - "\x00\x00\x78\x30\x30\x30\x30\x30\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x63\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x6b\x3e\x1c\x06\x03\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x36\x33\x33\x73\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x30\x1c\x06\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x63\x63\x63\x36\x1c\x36\x63\x63\x63\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7f\x63\x06\x0c\x18\x30\x60\x63\x7f\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x40\x60\x30\x18\x0c\x06\x03\x01\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x08\x1c\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x70\x30\x30\x3e\x33\x33\x33\x33\x6e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x0e\x06\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x1e\x33\x30\x7c\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x36\x3b\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\x78\x00" - "\x00\x00\x70\x30\x30\x33\x36\x3c\x36\x33\x73\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x7f\x6b\x6b\x6b\x6b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x3e\x30\x30\x78\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x06\x0f\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x08\x18\x7e\x18\x18\x18\x1b\x0e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3e\x63\x60\x60\x63\x3e\x08\x08\x00" - "\x00\x00\x1c\x36\x30\x30\x7c\x30\x30\x73\x7e\x00\x00\x00" - "\x00\x1e\x31\x60\xfe\x60\xfc\x60\x33\x1e\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x7e\x18\x7e\x18\x00\x00\x00" - "\x1c\x08\x00\x3e\x63\x30\x1c\x06\x63\x3e\x00\x00\x00\x00" - "\x00\x3e\x63\x30\x1c\x36\x63\x63\x36\x1c\x06\x63\x3e\x00" - "\x36\x1c\x08\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x51\x51\x5d\x41\x3e\x00\x00\x00" - "\x00\x38\x04\x3c\x44\x3c\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x1b\x36\x6c\x36\x1b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x03\x03\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x55\x59\x55\x41\x3e\x00\x00\x00" - "\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00" - "\x00\x38\x6c\x18\x30\x64\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x0c\x38\x0c\x6c\x38\x00\x00\x00\x00\x00\x00\x00" - "\x1c\x08\x00\x7f\x66\x0c\x18\x30\x63\x7f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x60\xc0\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x36\x1c\x08\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00\x00" - "\x00\x30\x70\x30\x30\x30\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x36\x1b\x36\x6c\x00\x00\x00\x00\x00" - "\x00\x1f\x36\x66\x66\x67\x66\x66\x36\x1f\x00\x00\x00\x00" - "\x00\x00\x00\x00\x36\x6b\x6b\x6e\x68\x37\x00\x00\x00\x00" - "\x66\x00\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x30\x63\x63\x3e\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x3b\x6e\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x63\x63\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x1c\x36\x1c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x00\x1f\x36\x66\x66\x67\x7e\x66\x66\x67\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x0c\x06\x1c" - "\x60\x30\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x06\x0c\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x08\x1c\x36\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x00\x63\x63\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x60\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x06\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x3c\x36\x33\x33\x7b\x33\x33\x36\x3c\x00\x00\x00" - "\x3b\x6e\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x3b\x6e\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x63\x63\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x63\x36\x1c\x08\x1c\x36\x63\x00\x00\x00\x00" - "\x00\x03\x1e\x36\x67\x6f\x6b\x7b\x73\x36\x3c\x60\x00\x00" - "\x60\x30\x18\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x03\x06\x0c\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x08\x1c\x36\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x63\x63\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x06\x0c\x18\x00\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x78\x30\x3e\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x66\x6c\x67\x63\x6b\x6e\x60\x60\x00" - "\x00\x60\x30\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x1c\x36\x1c\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x0b\x3b\x6e\x68\x37\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x0c\x06\x1c" - "\x00\x30\x18\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x03\x06\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x36\x1c\x36\x06\x3e\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x60\x30\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x03\x3e\x67\x6f\x7b\x73\x3e\x60\x00\x00" - "\x00\x60\x30\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x78\x30\x3e\x33\x33\x33\x33\x3e\x30\x78\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x3e\x06\x66\x3c\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x00\x30\x30\x78\x78\x30\x00" - "\x00\x00\x10\x7c\xc0\xc0\x7c\x10" - "\x00\x38\x60\x60\xf0\x60\xfc\x00" - "\x0e\x19\x30\x7e\x30\x19\x0e\x00" - "\x00\xcc\xcc\x78\x30\xfc\x30\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x00\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x00\x00" - "\x7c\x82\xba\xa2\xba\x82\x7c\x00" - "\x1c\x06\x1e\x22\x1f\x3f\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xfe\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x82\xba\xb2\xaa\x82\x7c\x00" - "\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x00\x00\x00\x00" - "\x00\x10\x7c\x10\x00\x7c\x00\x00" - "\x1c\x36\x06\x18\x3e\x00\x00\x00" - "\x1e\x02\x0e\x02\x1e\x00\x00\x00" - "\x30\xfc\x98\x30\x64\xfc\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\xc0" - "\x7e\xca\xca\x7e\x0a\x0a\x0a\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x30\xfc\x98\x30\x64\xfc\x00\x00" - "\x06\x0e\x06\x06\x06\x00\x00\x00" - "\x0e\x11\x11\x11\x0e\x1f\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x58\xd8\xdc\xd8\x58\x3e\x00\x00" - "\x00\x6c\xd2\xde\xd0\x6e\x00\x00" - "\x00\xcc\xcc\x78\x30\x78\x00\x00" - "\x30\x00\x30\x60\xc0\xcc\x78\x00" - "\x18\x0c\x30\x78\xcc\xfc\xcc\x00" - "\x60\xc0\x30\x78\xcc\xfc\xcc\x00" - "\x78\x84\x30\x78\xcc\xfc\xcc\x00" - "\x66\x98\x30\x78\xcc\xfc\xcc\x00" - "\xcc\x00\x30\x78\xcc\xfc\xcc\x00" - "\x30\x48\x30\x78\xcc\xfc\xcc\x00" - "\x3e\x78\x98\x9c\xf8\x98\x9e\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x1c\x30" - "\x30\x18\xfe\x62\x78\x62\xfe\x00" - "\x18\x30\xfe\x62\x78\x62\xfe\x00" - "\x38\x44\xfe\x62\x78\x62\xfe\x00" - "\x66\x00\xfe\x62\x78\x62\xfe\x00" - "\x60\x30\x78\x30\x30\x30\x78\x00" - "\x18\x30\x78\x30\x30\x30\x78\x00" - "\x78\x84\x78\x30\x30\x30\x78\x00" - "\xcc\x00\x78\x30\x30\x30\x78\x00" - "\x78\x6c\x66\xf6\x66\x6c\x78\x00" - "\x66\x98\xe6\xf6\xde\xce\xc6\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\x7c\xc6\xc6\xc6\x7c\x00" - "\x38\x44\x7c\xc6\xc6\xc6\x7c\x00" - "\x66\x98\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x06\x7c\xce\x9a\xb2\xe6\x78\xc0" - "\x60\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x78\x84\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\x78\x30\x78\x00" - "\x60\x78\x6c\x78\x60\x60\x60\x00" - "\x78\xcc\xc4\xdc\xc6\xc6\xdc\xc0" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x78\x84\x78\x0c\x7c\xcc\x76\x00" - "\x66\x98\x78\x0c\x7c\xcc\x76\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x48\x38\x0c\x7c\xcc\x76\x00" - "\x00\x00\xec\x32\x7e\xb0\x6e\x00" - "\x00\x00\x3c\x66\xc0\x66\x1c\x30" - "\x30\x18\x78\xcc\xfc\xc0\x78\x00" - "\x18\x30\x78\xcc\xfc\xc0\x78\x00" - "\x78\x84\x78\xcc\xfc\xc0\x78\x00" - "\xcc\x00\x78\xcc\xfc\xc0\x78\x00" - "\x60\x30\x00\x70\x30\x30\x78\x00" - "\x18\x30\x00\x70\x30\x30\x78\x00" - "\x70\x88\x00\x70\x30\x30\x78\x00" - "\xcc\x00\x00\x70\x30\x30\x78\x00" - "\x6c\x38\x6c\x0c\x6c\xcc\x78\x00" - "\x66\x98\xf8\xcc\xcc\xcc\xcc\x00" - "\x60\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x18\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x38\x44\x00\x7c\xc6\xc6\x7c\x00" - "\x66\x98\x00\x7c\xc6\xc6\x7c\x00" - "\xc6\x00\x00\x7c\xc6\xc6\x7c\x00" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x00\x06\x7c\xde\xf6\x7c\xc0" - "\x60\x30\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\x00\xcc\xcc\xcc\x76\x00" - "\x30\x48\x00\xcc\xcc\xcc\x76\x00" - "\xcc\x00\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\xcc\xcc\xcc\x7c\x0c\xf8" - "\xe0\x78\x6c\x66\x6c\x78\xe0\x00" - "\xcc\x00\xcc\xcc\xcc\x7c\x0c\xf8" - , "ISO-8859-15 West European", CIOLIB_ISO_8859_15} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x3e\x0a\x12\x22\x78\x84\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x44\x44\x38\x10\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x20\x20\x20\x20\x60\xe0\xc0\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x21\x21\x21\x21\x23\x67\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x10\x10\xd6\x38\xee\x38\xd6\x10\x10\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x00\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7f\x89\x89\x89\x79\x09\x09\x09\x09\x09\x00\x00\x00\x00" - "\x00\x7c\x86\x40\x38\x44\x82\x82\x44\x38\x04\xc2\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x04\xfe\x04\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x20\x40\xfe\x40\x20\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x80\x80\x80\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x38\x38\x10\x10\x10\x00\x10\x10\x00\x00\x00\x00" - "\x00\x42\x42\x42\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x44\x44\xfe\x44\x44\x44\xfe\x44\x44\x00\x00\x00\x00" - "\x10\x10\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x82\x84\x08\x10\x20\x42\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x38\x38\x47\x44\x44\x44\x3b\x00\x00\x00\x00" - "\x00\x20\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x20\x10\x08\x08\x08\x08\x08\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\xff\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x20\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x92\x92\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x08\x18\x38\x08\x08\x08\x08\x08\x08\x3e\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x04\x08\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x02\x3c\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x14\x24\x44\x84\xfe\x04\x04\x04\x0e\x00\x00\x00\x00" - "\x00\x00\xfe\x80\x80\x80\xfc\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x40\x80\x80\xfc\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x02\x02\x04\x08\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7c\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7e\x02\x02\x02\x04\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x40\x20\x10\x08\x04\x08\x10\x20\x40\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x02\x04\x08\x08\x00\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x9e\x92\x92\x8c\x80\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x42\x42\x42\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x80\x82\x42\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\x42\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x9e\x82\x82\x46\x3a\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\xfe\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x0e\x04\x04\x04\x04\x04\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\xc2\x42\x42\x44\x48\x78\x44\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\xe0\x40\x40\x40\x40\x40\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x82\xc6\xaa\x92\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x82\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x92\x8a\x7c\x04\x02\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x44\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x92\x92\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x44\x28\x10\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x44\x28\x10\x28\x44\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x44\x38\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x04\x18\x20\x40\x82\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x78\x44\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x80\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x04\x04\x3c\x44\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x84\x78\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x30\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x06\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00" - "\x00\x00\xc0\x40\x40\x42\x44\x48\x78\x44\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x30\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x92\x92\x92\x92\x92\x92\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x04\x0e\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x7c\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x20\x20\x20\xf8\x20\x20\x20\x20\x22\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x00\x00\x00\x00\xfe\x84\x08\x10\x20\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x10\x60\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x70\x08\x08\x08\x06\x08\x08\x08\x08\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x44\x82\x82\x82\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x82\x42\x3c\x04\x02\x7c\x00\x00" - "\x00\x00\x84\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x84\x84\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x38\x44\x38\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x42\x40\x40\x42\x3c\x04\x02\x3c\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x84\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x44\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x82\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x38\x44\x38\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x08\x10\x20\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8c\x52\x32\x7e\x88\x98\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x44\x84\x84\xfe\x84\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x30\x48\x84\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x82\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x86\x8a\x92\xa2\xc2\x7c\x00\x00\x00\x00" - "\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\x42\xfc\x00\x00\x00\x00" - "\x00\x02\x3c\x4c\x8a\x92\x92\xa2\xa2\xc2\xc4\xb8\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x06\x09\x08\x08\x08\x3e\x08\x08\x08\x08\x08\x48\x30\x00\x00" - "\x00\x08\x10\x20\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x76\xdc\x00\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x3c\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x20\x20\x00\x20\x20\x40\x80\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xb2\xaa\xb2\xaa\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x40\x9c\x02\x04\x08\x1e\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x46\x8a\x12\x3e\x02\x02\x00\x00" - "\x00\x00\x10\x10\x00\x10\x10\x10\x38\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x88\x44\x22\x44\x88\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x08\x10\x20\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x00\x7c\x82\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x20\x10\x08\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x9a\xa2\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x38\x44\x40\x40\x40\x48\x38\x10\x10\x00\x00\x00\x00" - "\x00\x00\x44\x44\x28\x10\x7c\x10\x7c\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x76\xdc\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x76\xdc\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x82\x7c\x82\x82\x82\x82\x7c\x82\x00\x00\x00\x00" - "\x00\x00\x34\x18\x2c\x06\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\xf2\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x7c\x82\x00\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x44\x00\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x20\x10\x08\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x08\x08\x08\x08\x08\x18\x00\x00\x00\x00" - "\x08\x10\x20\x3c\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x38\x44\x00\x38\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x44\x00\x38\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x20\x10\x08\x3c\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x08\x10\x20\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x78\x84\x84\x84\xb8\x84\x82\x82\x82\xbc\x80\x00\x00\x00" - "\x7c\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x10\x08\x04\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7c\x40\x40\xc0\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\xe0\x40\x7c\x42\x42\x42\x42\x7c\x40\xe0\x00\x00\x00\x00" - "\x04\x08\x10\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x7c\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x20\x10\x08\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x04\x08\x10\x82\x82\x82\x44\x38\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\xe0\x31\x62\x34\xe8\x10\x2c\x54\xa4\xef\x04\x04\x00\x00" - "\x00\x00\x7e\x8a\x8a\x8a\x7a\x0a\x0a\x0a\x0a\x0a\x00\x00\x00\x00" - "\x00\x7c\x82\x40\x38\x44\x82\x82\x44\x38\x04\x82\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x7c\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x3c\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x08\x08\x08\x08\x08\x18\x00\x00\x00\x00" - "\x00\x7c\x02\x3c\x02\x02\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x20\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xd6\x10\x10\x7c" - "\x10\x10\x38\xec\xfe\x7c\x10\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x1f\x03\x05\x7d\x84\x84\x84\x78" - "\x3e\x41\x41\x41\x3e\x08\x3e\x08" - "\x3f\x21\x3f\x20\x20\x20\x60\xc0" - "\x3f\x21\x3f\x21\x21\x23\x66\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x10\x38\x7c\x10\x10\x7c\x38\x10" - "\x24\x24\x24\x24\x24\x00\x24\x00" - "\x7f\x92\x92\x72\x12\x12\x12\x00" - "\x3e\x61\x38\x44\x44\x38\x8c\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x10\x38\x7c\x10\x7c\x38\x10\xfe" - "\x10\x38\x7c\x10\x10\x10\x10\x00" - "\x10\x10\x10\x10\x7c\x38\x10\x00" - "\x00\x08\x04\xfe\x04\x08\x00\x00" - "\x00\x20\x40\xfe\x40\x20\x00\x00" - "\x00\x00\x80\x80\x80\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x38\x38\x10\x10\x00\x10\x00" - "\x24\x24\x24\x00\x00\x00\x00\x00" - "\x24\x24\xff\x24\xff\x24\x24\x00" - "\x10\x7c\x80\x78\x04\xf8\x10\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x44\x38\x56\x84\x84\x76\x00" - "\x20\x20\x40\x00\x00\x00\x00\x00" - "\x10\x20\x40\x40\x40\x20\x10\x00" - "\x20\x10\x08\x08\x08\x10\x20\x00" - "\x00\x44\x38\xfe\x38\x44\x00\x00" - "\x00\x10\x10\xfe\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x20" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x00" - "\x02\x04\x08\x10\x20\x40\x80\x00" - "\x7c\x82\x86\x8a\x92\xa2\x7c\x00" - "\x10\x30\x10\x10\x10\x10\x7c\x00" - "\x78\x84\x04\x10\x40\x84\xfc\x00" - "\x78\x84\x04\x38\x04\x84\x78\x00" - "\x08\x18\x28\x48\xfe\x08\x1c\x00" - "\xfc\x80\xf8\x04\x04\x84\x78\x00" - "\x38\x40\x80\xf8\x84\x84\x78\x00" - "\xfc\x84\x08\x10\x20\x20\x20\x00" - "\x78\x84\x84\x78\x84\x84\x78\x00" - "\x78\x84\x84\x7c\x04\x08\x70\x00" - "\x00\x10\x10\x00\x00\x10\x10\x00" - "\x00\x10\x10\x00\x00\x10\x10\x20" - "\x10\x20\x40\x80\x40\x20\x10\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x20\x10\x08\x04\x08\x10\x20\x00" - "\x78\x84\x04\x08\x10\x00\x10\x00" - "\x7c\x82\x9e\x92\x9e\x80\x78\x00" - "\x30\x48\x84\x84\xfc\x84\x84\x00" - "\xfc\x42\x42\x7c\x42\x42\xfc\x00" - "\x3c\x42\x80\x80\x80\x42\x3c\x00" - "\xf8\x44\x42\x42\x42\x44\xf8\x00" - "\xfe\x42\x48\x78\x48\x42\xfe\x00" - "\xfe\x42\x48\x78\x48\x40\xe0\x00" - "\x3c\x42\x80\x80\x8e\x42\x3e\x00" - "\x84\x84\x84\xfc\x84\x84\x84\x00" - "\x38\x10\x10\x10\x10\x10\x38\x00" - "\x0e\x04\x04\x04\x44\x44\x38\x00" - "\xc2\x44\x48\x70\x44\x42\xc2\x00" - "\xe0\x40\x40\x40\x40\x42\xfe\x00" - "\x82\xc6\xaa\x92\x82\x82\x82\x00" - "\x82\xc2\xa2\x92\x8a\x86\x82\x00" - "\x38\x44\x82\x82\x82\x44\x38\x00" - "\xfc\x42\x42\x7c\x40\x40\xe0\x00" - "\x38\x44\x82\x82\x82\x54\x38\x04" - "\xfc\x42\x42\x7c\x44\x42\xc2\x00" - "\x38\x84\x80\x78\x04\x84\x74\x00" - "\xfe\x92\x10\x10\x10\x10\x38\x00" - "\x84\x84\x84\x84\x84\x84\xfc\x00" - "\x84\x84\x84\x84\x84\x48\x30\x00" - "\x82\x82\x82\x92\xaa\xc6\x82\x00" - "\x82\x44\x28\x10\x28\x44\x82\x00" - "\x82\x44\x28\x10\x10\x10\x38\x00" - "\xfe\x84\x88\x10\x22\x42\xfe\x00" - "\x78\x40\x40\x40\x40\x40\x78\x00" - "\x80\x40\x20\x10\x08\x04\x02\x00" - "\x78\x08\x08\x08\x08\x08\x78\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x20\x20\x10\x00\x00\x00\x00\x00" - "\x00\x00\x78\x04\x7c\x84\x76\x00" - "\xc0\x40\x7c\x42\x42\x42\xdc\x00" - "\x00\x00\x78\x84\x80\x84\x78\x00" - "\x0c\x04\x7c\x84\x84\x84\x76\x00" - "\x00\x00\x78\x84\xfc\x80\x78\x00" - "\x38\x44\x40\xe0\x40\x40\xe0\x00" - "\x00\x00\x76\x84\x84\x7c\x04\xf8" - "\xc0\x40\x4c\x62\x42\x42\xc2\x00" - "\x10\x00\x30\x10\x10\x10\x38\x00" - "\x04\x00\x04\x04\x04\x84\x84\x78" - "\xc0\x40\x42\x44\x78\x44\xc2\x00" - "\x30\x10\x10\x10\x10\x10\x38\x00" - "\x00\x00\xec\x92\x92\x92\x82\x00" - "\x00\x00\xf8\x84\x84\x84\x84\x00" - "\x00\x00\x78\x84\x84\x84\x78\x00" - "\x00\x00\xdc\x42\x42\x7c\x40\xe0" - "\x00\x00\x76\x84\x84\x7c\x04\x0e" - "\x00\x00\xdc\x62\x40\x40\xe0\x00" - "\x00\x00\x7c\x80\x78\x04\xf8\x00" - "\x10\x10\x7c\x10\x10\x12\x0c\x00" - "\x00\x00\x84\x84\x84\x84\x76\x00" - "\x00\x00\x84\x84\x84\x48\x30\x00" - "\x00\x00\x82\x92\xaa\xc6\x82\x00" - "\x00\x00\x84\x48\x30\x48\x84\x00" - "\x00\x00\x84\x84\x84\x7c\x04\xf8" - "\x00\x00\xfc\x88\x30\x44\xfc\x00" - "\x18\x20\x20\xc0\x20\x20\x18\x00" - "\x10\x10\x10\x00\x10\x10\x10\x00" - "\x60\x10\x10\x0c\x10\x10\x60\x00" - "\x64\x98\x00\x00\x00\x00\x00\x00" - "\x00\x10\x28\x44\x82\x82\xfe\x00" - "\x78\x84\x80\x84\x78\x18\x04\x78" - "\x00\x84\x00\x84\x84\x84\x7a\x00" - "\x0c\x00\x78\x84\xfc\x80\x78\x00" - "\x7e\x81\x3c\x02\x3e\x42\x3d\x00" - "\x84\x00\x78\x04\x7c\x84\x7a\x00" - "\xc0\x00\x78\x04\x7c\x84\x7a\x00" - "\x20\x20\x78\x04\x7c\x84\x7a\x00" - "\x00\x00\x78\x80\x80\x78\x04\x38" - "\x7e\x81\x3c\x42\x7e\x40\x3c\x00" - "\x84\x00\x78\x84\xfc\x80\x78\x00" - "\x60\x00\x78\x84\xfc\x80\x78\x00" - "\x48\x00\x30\x10\x10\x10\x38\x00" - "\x7c\x82\x30\x10\x10\x10\x38\x00" - "\x60\x00\x30\x10\x10\x10\x38\x00" - "\x82\x38\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x0c\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x67\x19\x7f\x98\x77\x00" - "\x3f\x48\x88\xff\x88\x88\x8f\x00" - "\x78\x84\x78\x84\x84\x84\x78\x00" - "\x84\x00\x78\x84\x84\x84\x78\x00" - "\xc0\x00\x78\x84\x84\x84\x78\x00" - "\x7e\x81\x42\x42\x42\x42\x3c\x00" - "\x20\x10\x42\x42\x42\x42\x3c\x00" - "\x84\x00\x84\x84\x84\x7c\x04\xf8" - "\x42\x18\x24\x42\x42\x24\x18\x00" - "\x84\x00\x84\x84\x84\x84\x78\x00" - "\x00\x02\x7c\x8a\x82\xa2\x7c\x80" - "\x38\x44\x44\xe0\x40\x82\xfc\x00" - "\x3a\x44\x8a\x92\xa2\x44\xb8\x00" - "\x00\x42\x24\x18\x18\x24\x42\x00" - "\x0c\x12\x10\x38\x10\x10\x90\x60" - "\x1c\x00\x78\x04\x7c\x84\x7a\x00" - "\x18\x00\x30\x10\x10\x10\x38\x00" - "\x08\x10\x78\x84\x84\x84\x78\x00" - "\x08\x10\x84\x84\x84\x84\x7a\x00" - "\x64\x98\xb8\xc4\x84\x84\x84\x00" - "\x64\x98\x84\xa4\x94\x84\x84\x00" - "\x3c\x44\x44\x3a\x00\x7e\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x20\x00\x20\x40\x80\x84\x78\x00" - "\x7e\x81\xb9\xa5\xb9\xa5\x81\x7e" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\x42\x44\x48\x56\x69\x42\x84\x0f" - "\x42\x44\x48\x53\x65\x49\x8f\x01" - "\x10\x10\x00\x10\x38\x38\x10\x00" - "\x00\x22\x44\x88\x44\x22\x00\x00" - "\x00\x44\x22\x11\x22\x44\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x0c\x10\x44\x82\xfe\x82\x82\x00" - "\x7e\x10\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x7e\x81\x9d\xa1\xa1\x9d\x81\x7e" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x10\x10\x7c\x80\x80\x7c\x10\x10" - "\x82\x44\x38\x7c\x10\x7c\x10\x10" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x64\x98\x3c\x02\x3e\x42\x3d\x00" - "\x64\x98\x38\x44\x82\xfe\x82\x82" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x00\x82\x7c\x82\x82\x7c\x82\x00" - "\x20\x7e\x04\x7c\x84\x84\x78\x00" - "\xf8\x44\x42\xf2\x42\x44\xf8\x00" - "\x78\xfc\x40\x78\x40\x40\xfc\x00" - "\x44\xfc\x40\x78\x40\x40\xfc\x00" - "\x60\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x18\x08\x08\x08\x1c\x00" - "\x08\x10\x38\x10\x10\x10\x38\x00" - "\x38\x44\x38\x10\x10\x10\x38\x00" - "\x28\x00\x38\x10\x10\x10\x38\x00" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\x10\x10\x10\x00\x00\x10\x10\x10" - "\x10\x08\x38\x10\x10\x10\x38\x00" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x0c\x18\x24\x42\x42\x24\x18\x00" - "\x00\x78\x84\xf8\x84\xf8\x80\x80" - "\x3c\x18\x24\x42\x42\x24\x18\x00" - "\x30\x18\x24\x42\x42\x24\x18\x00" - "\x64\x98\x78\x84\x84\x84\x78\x00" - "\x64\x98\x18\x24\x42\x42\x24\x18" - "\x00\x42\x42\x42\x42\x7c\x40\x80" - "\xc0\x40\x78\x44\x44\x78\x40\xe0" - "\xe0\x40\x78\x44\x78\x40\xe0\x00" - "\x04\x08\x84\x84\x84\x84\x78\x00" - "\x78\x00\x84\x84\x84\x84\x78\x00" - "\x20\x80\x84\x84\x84\x84\x78\x00" - "\x04\x08\x84\x84\x84\x7c\x04\xf8" - "\x04\x08\x42\x24\x10\x10\x38\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x08\x10\x20\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x20\x20\xfc\x20\x20\x00\xfc\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff" - "\xe1\x12\xe4\x1a\xf6\x2a\x5f\x82" - "\x3e\x4a\x4a\x3a\x0a\x0a\x0a\x00" - "\x3e\x41\x3c\x42\x42\x3c\x82\x7c" - "\x20\x20\x00\xf8\x00\x20\x20\x00" - "\x00\x00\x00\x00\x00\x08\x04\x38" - "\x38\x44\x44\x38\x00\x00\x00\x00" - "\x00\x44\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x08\x18\x08\x08\x1c\x00\x00\x00" - "\x78\x04\x38\x04\x78\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 850 Multilingual Latin I, (thin)", CIOLIB_CP850} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x70\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x36\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xce\xde\xf6\xe6\xc6\x7c\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xb2\xaa\xb2\xaa\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x60\xc0\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x7c\xc6\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x06\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x9a\xa2\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7c\xc6\xc0\xc0\xc6\x7c\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x00\x00\x34\x18\x2c\x06\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x38\x6c\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\xf0\x60\x7c\x66\x66\x66\x66\x7c\x60\xf0\x00\x00\x00\x00" - "\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00" - "\x00\xe0\x30\x62\x36\xec\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x06\x3c\x06\x06\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x7e\x00\x00" - "\x00\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff" - "\x00\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00" - "\x00\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00" - "\x00\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00" - "\x00\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00" - "\x00\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18" - "\x00\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00" - "\x00\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xd6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0e\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x7c\x38\x7c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x36\x32\x30\x7c\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\x00\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c" - "\x00\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x78" - "\x00\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\x36\x76\xdc\xd8\x6e\x00\x00" - "\x00\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xce\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xce\xde\xf6\xe6\x7c\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xe6\xfc\x00\x00" - "\x00\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00" - "\x00\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x30\x00\x30\x30\x60\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x44\xba\xaa\xb2\xaa\xaa\x44\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00" - "\x00\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f" - "\x00\x00\x60\xe0\x63\x66\x6c\x1a\x36\x6e\xda\x3f\x06\x06" - "\x00\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x30\x60\xc0\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x38\x6c\xc6\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x18\x0c\x06\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x38\x44\x9a\xa2\xa2\xa2\x9a\x44\x38\x00\x00" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7c\xc6\xc0\xc0\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x18\x7e\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x76\xdc\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x00\x00\x00\x34\x18\x2c\x06\x3e\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\xf6\x66\x66\x6c\xf8\x00\x00" - "\x38\x6c\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\xc6\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x30\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x18\x18\x18\x18\x00" - "\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xcc\x00\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7c\x60\xc0" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x60\xf0" - "\x00\x00\x00\xf0\x60\x7c\x66\x66\x66\x7c\x60\xf0\x00\x00" - "\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8" - "\x0c\x18\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xff" - "\x00\xe0\x30\x63\x36\xec\x18\x36\x6e\xda\x3f\x06\x06\x00" - "\x00\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x78" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x18\x38\x18\x18\x18\x3c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\x0c\x38\x0c\x0c\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\xd6\x10\x38" - "\x10\x38\x7c\xfe\xfe\x7c\x10\x38" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x61\x3c\x66\x66\x3c\x86\x7c" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x66\x66\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x7c\xc6\x06\x1c\x30\x66\xfe\x00" - "\x7c\xc6\x06\x3c\x06\xc6\x7c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00" - "\x38\x60\xc0\xfc\xc6\xc6\x7c\x00" - "\xfe\xc6\x0c\x18\x30\x30\x30\x00" - "\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00" - "\x7c\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x7c\xc6\x0c\x18\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3a\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x7e\x5a\x18\x18\x18\x3c\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00" - "\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x7c\x66\x66\x66\xdc\x00" - "\x00\x00\x7c\xc6\xc0\xc6\x7c\x00" - "\x1c\x0c\x7c\xcc\xcc\xcc\x76\x00" - "\x00\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x3c\x66\x60\xf8\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xec\xfe\xd6\xd6\xd6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x60\x60\xf0\x00" - "\x00\x00\x7e\xc0\x7c\x06\xfc\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x00" - "\x00\x00\xc6\xd6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\xcc\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x0c\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x7c\x82\x78\x0c\x7c\xcc\x76\x00" - "\xc6\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x30\x30\x78\x0c\x7c\xcc\x76\x00" - "\x00\x00\x7e\xc0\xc0\x7e\x0c\x38" - "\x7c\x82\x7c\xc6\xfe\xc0\x7c\x00" - "\xc6\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x30\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x66\x00\x38\x18\x18\x18\x3c\x00" - "\x7c\x82\x38\x18\x18\x18\x3c\x00" - "\x30\x18\x00\x38\x18\x18\x3c\x00" - "\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00" - "\x38\x6c\x7c\xc6\xfe\xc6\xc6\x00" - "\x18\x30\xfe\xc0\xf8\xc0\xfe\x00" - "\x00\x00\x7e\x12\xfe\x90\xfe\x00" - "\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00" - "\x7c\x82\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x78\x84\x00\xcc\xcc\xcc\x76\x00" - "\x60\x30\xcc\xcc\xcc\xcc\x76\x00" - "\xc6\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\xc6\x38\x6c\xc6\xc6\x6c\x38\x00" - "\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x02\x7c\xce\xd6\xe6\x7c\x80" - "\x38\x6c\x64\xf0\x60\x66\xfc\x00" - "\x3a\x6c\xce\xd6\xe6\x6c\xb8\x00" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x0e\x1b\x18\x3c\x18\xd8\x70\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x0c\x18\x00\x38\x18\x18\x3c\x00" - "\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\xcc\xcc\xcc\xcc\x76\x00" - "\x76\xdc\x00\xdc\x66\x66\x66\x00" - "\x76\xdc\x00\xe6\xf6\xde\xce\x00" - "\x3c\x6c\x6c\x3e\x00\x7e\x00\x00" - "\x38\x6c\x6c\x38\x00\x7c\x00\x00" - "\x18\x00\x18\x18\x30\x63\x3e\x00" - "\x7e\x81\xb9\xa5\xb9\xa5\x81\x7e" - "\x00\x00\x00\xfe\x06\x06\x00\x00" - "\x63\xe6\x6c\x7e\x33\x66\xcc\x0f" - "\x63\xe6\x6c\x7a\x36\x6a\xdf\x06" - "\x18\x00\x18\x18\x3c\x3c\x18\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x30\x60\x38\x6c\xc6\xfe\xc6\x00" - "\x7c\x82\x38\x6c\xc6\xfe\xc6\x00" - "\x18\x0c\x38\x6c\xc6\xfe\xc6\x00" - "\x7e\x81\x9d\xa1\xa1\x9d\x81\x7e" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x18\x18\x7e\xc0\xc0\x7e\x18\x18" - "\x66\x66\x3c\x7e\x18\x7e\x18\x18" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x76\xdc\x7c\x06\x7e\xc6\x7e\x00" - "\x76\xdc\x38\x6c\xc6\xfe\xc6\x00" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\x30\x7e\x0c\x7c\xcc\xcc\x78\x00" - "\xf8\x6c\x66\xf6\x66\x6c\xf8\x00" - "\x7c\x82\xfe\xc0\xfc\xc0\xfe\x00" - "\xc6\x00\xfe\xc0\xfc\xc0\xfe\x00" - "\x30\x18\xfe\xc0\xfc\xc0\xfe\x00" - "\x00\x00\x38\x18\x18\x18\x3c\x00" - "\x0c\x18\x3c\x18\x18\x18\x3c\x00" - "\x3c\x42\x3c\x18\x18\x18\x3c\x00" - "\x66\x00\x3c\x18\x18\x18\x3c\x00" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\x18\x18\x18\x00\x00\x18\x18\x18" - "\x30\x18\x3c\x18\x18\x18\x3c\x00" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x60\x38\x6c\xc6\x6c\x38\x00" - "\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00" - "\x7c\x82\x38\x6c\xc6\x6c\x38\x00" - "\x0c\x06\x38\x6c\xc6\x6c\x38\x00" - "\x76\xdc\x7c\xc6\xc6\xc6\x7c\x00" - "\x76\xdc\x38\x6c\xc6\x6c\x38\x00" - "\x00\x00\x66\x66\x66\x66\x7c\xc0" - "\xe0\x60\x7c\x66\x66\x7c\x60\xf0" - "\xf0\x60\x7c\x66\x7c\x60\xf0\x00" - "\x18\x30\xc6\xc6\xc6\xc6\x7c\x00" - "\x7c\x82\x00\xc6\xc6\xc6\x7c\x00" - "\x60\x30\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x30\xc6\xc6\xc6\x7e\x06\xfc" - "\x0c\x18\x66\x66\x3c\x18\x3c\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff" - "\xe1\x32\xe4\x3a\xf6\x2a\x5f\x86" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x61\x3c\x66\x66\x3c\x86\x7c" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\x38" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x18\x38\x18\x18\x3c\x00\x00\x00" - "\x78\x0c\x38\x0c\x78\x00\x00\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 850 Multilingual Latin I", CIOLIB_CP850} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x3e\x0a\x12\x22\x78\x84\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x44\x44\x38\x10\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x20\x20\x20\x20\x60\xe0\xc0\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x21\x21\x21\x21\x23\x67\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x10\x10\xd6\x38\xee\x38\xd6\x10\x10\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x00\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7f\x89\x89\x89\x79\x09\x09\x09\x09\x09\x00\x00\x00\x00" - "\x00\x7c\x86\x40\x38\x44\x82\x82\x44\x38\x04\xc2\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x04\xfe\x04\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x20\x40\xfe\x40\x20\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x80\x80\x80\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x38\x38\x10\x10\x10\x00\x10\x10\x00\x00\x00\x00" - "\x00\x42\x42\x42\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x44\x44\xfe\x44\x44\x44\xfe\x44\x44\x00\x00\x00\x00" - "\x10\x10\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x82\x84\x08\x10\x20\x42\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x38\x38\x47\x44\x44\x44\x3b\x00\x00\x00\x00" - "\x00\x20\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x20\x10\x08\x08\x08\x08\x08\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\xff\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x20\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x92\x92\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x08\x18\x38\x08\x08\x08\x08\x08\x08\x3e\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x04\x08\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x02\x3c\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x14\x24\x44\x84\xfe\x04\x04\x04\x0e\x00\x00\x00\x00" - "\x00\x00\xfe\x80\x80\x80\xfc\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x40\x80\x80\xfc\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x02\x02\x04\x08\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7c\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7e\x02\x02\x02\x04\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x40\x20\x10\x08\x04\x08\x10\x20\x40\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x02\x04\x08\x08\x00\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x9e\x92\x92\x8c\x80\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x42\x42\x42\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x80\x82\x42\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\x42\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x9e\x82\x82\x46\x3a\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\xfe\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x0e\x04\x04\x04\x04\x04\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\xc2\x42\x42\x44\x48\x78\x44\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\xe0\x40\x40\x40\x40\x40\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x82\xc6\xaa\x92\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x82\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x92\x8a\x7c\x04\x02\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x44\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x92\x92\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x44\x28\x10\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x44\x28\x10\x28\x44\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x44\x38\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x04\x18\x20\x40\x82\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x78\x44\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x80\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x04\x04\x3c\x44\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x84\x78\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x30\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x06\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00" - "\x00\x00\xc0\x40\x40\x42\x44\x48\x78\x44\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x30\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x92\x92\x92\x92\x92\x92\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x04\x0e\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x7c\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x20\x20\x20\xf8\x20\x20\x20\x20\x22\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x00\x00\x00\x00\xfe\x84\x08\x10\x20\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x10\x60\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x70\x08\x08\x08\x06\x08\x08\x08\x08\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x44\x82\x82\x82\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x82\x42\x3c\x04\x02\x7c\x00\x00" - "\x00\x00\x84\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x84\x84\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x38\x44\x38\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x42\x40\x40\x42\x3c\x04\x02\x3c\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x84\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x44\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x82\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x38\x44\x38\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x08\x10\x20\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8c\x52\x32\x7e\x88\x98\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x44\x84\x84\xfe\x84\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x30\x48\x84\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x82\x00\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x86\x8a\x92\xa2\xc2\x7c\x00\x00\x00\x00" - "\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\x42\xfc\x00\x00\x00\x00" - "\x00\x02\x3c\x4c\x8a\x92\x92\xa2\xa2\xc2\xc4\xb8\x00\x00\x00\x00" - "\x00\xf8\x84\x84\xf8\x84\x84\x9e\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x06\x09\x08\x08\x08\x3e\x08\x08\x08\x08\x08\x48\x30\x00\x00" - "\x00\x08\x10\x20\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x76\xdc\x00\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x3c\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x20\x20\x00\x20\x20\x40\x80\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x40\x9c\x02\x04\x08\x1e\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x46\x8a\x12\x3e\x02\x02\x00\x00" - "\x00\x00\x10\x10\x00\x10\x10\x10\x38\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x82\x7c\x82\x82\x82\x82\x7c\x82\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x62\x94\x98\x88\x98\x94\x62\x00\x00\x00\x00" - "\x00\x00\x78\x84\x84\x84\xb8\x84\x82\x82\x82\xbc\x80\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x80\x80\x80\x80\x80\x80\x80\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x44\x44\x44\x44\x44\x44\x44\x00\x00\x00\x00" - "\x00\x00\x00\xfe\x82\x40\x20\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x88\x88\x88\x88\x88\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7c\x40\x40\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x72\xd4\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x10\x38\x44\x44\x44\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x82\x82\xfe\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x44\x28\x28\x28\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x10\x08\x04\x3e\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x99\x99\x99\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x7e\x89\x91\xa1\x7e\x40\x80\x00\x00\x00\x00" - "\x00\x00\x1c\x20\x40\x40\x78\x40\x40\x40\x20\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x10\x08\x04\x02\x04\x08\x10\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x08\x10\x20\x40\x20\x10\x08\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x11\x11\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x88\x88\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x7c\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x08\x08\x08\x08\x08\xe8\x28\x28\x28\x18\x00\x00\x00\x00" - "\x00\xd8\x64\x44\x44\x44\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x20\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xd6\x10\x10\x7c" - "\x10\x10\x38\xec\xfe\x7c\x10\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x1f\x03\x05\x7d\x84\x84\x84\x78" - "\x3e\x41\x41\x41\x3e\x08\x3e\x08" - "\x3f\x21\x3f\x20\x20\x20\x60\xc0" - "\x3f\x21\x3f\x21\x21\x23\x66\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x10\x38\x7c\x10\x10\x7c\x38\x10" - "\x24\x24\x24\x24\x24\x00\x24\x00" - "\x7f\x92\x92\x72\x12\x12\x12\x00" - "\x3e\x61\x38\x44\x44\x38\x8c\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x10\x38\x7c\x10\x7c\x38\x10\xfe" - "\x10\x38\x7c\x10\x10\x10\x10\x00" - "\x10\x10\x10\x10\x7c\x38\x10\x00" - "\x00\x08\x04\xfe\x04\x08\x00\x00" - "\x00\x20\x40\xfe\x40\x20\x00\x00" - "\x00\x00\x80\x80\x80\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x38\x38\x10\x10\x00\x10\x00" - "\x24\x24\x24\x00\x00\x00\x00\x00" - "\x24\x24\xff\x24\xff\x24\x24\x00" - "\x10\x7c\x80\x78\x04\xf8\x10\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x44\x38\x56\x84\x84\x76\x00" - "\x20\x20\x40\x00\x00\x00\x00\x00" - "\x10\x20\x40\x40\x40\x20\x10\x00" - "\x20\x10\x08\x08\x08\x10\x20\x00" - "\x00\x44\x38\xfe\x38\x44\x00\x00" - "\x00\x10\x10\xfe\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x20" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x00" - "\x02\x04\x08\x10\x20\x40\x80\x00" - "\x7c\x82\x86\x8a\x92\xa2\x7c\x00" - "\x10\x30\x10\x10\x10\x10\x7c\x00" - "\x78\x84\x04\x10\x40\x84\xfc\x00" - "\x78\x84\x04\x38\x04\x84\x78\x00" - "\x08\x18\x28\x48\xfe\x08\x1c\x00" - "\xfc\x80\xf8\x04\x04\x84\x78\x00" - "\x38\x40\x80\xf8\x84\x84\x78\x00" - "\xfc\x84\x08\x10\x20\x20\x20\x00" - "\x78\x84\x84\x78\x84\x84\x78\x00" - "\x78\x84\x84\x7c\x04\x08\x70\x00" - "\x00\x10\x10\x00\x00\x10\x10\x00" - "\x00\x10\x10\x00\x00\x10\x10\x20" - "\x10\x20\x40\x80\x40\x20\x10\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x20\x10\x08\x04\x08\x10\x20\x00" - "\x78\x84\x04\x08\x10\x00\x10\x00" - "\x7c\x82\x9e\x92\x9e\x80\x78\x00" - "\x30\x48\x84\x84\xfc\x84\x84\x00" - "\xfc\x42\x42\x7c\x42\x42\xfc\x00" - "\x3c\x42\x80\x80\x80\x42\x3c\x00" - "\xf8\x44\x42\x42\x42\x44\xf8\x00" - "\xfe\x42\x48\x78\x48\x42\xfe\x00" - "\xfe\x42\x48\x78\x48\x40\xe0\x00" - "\x3c\x42\x80\x80\x8e\x42\x3e\x00" - "\x84\x84\x84\xfc\x84\x84\x84\x00" - "\x38\x10\x10\x10\x10\x10\x38\x00" - "\x0e\x04\x04\x04\x44\x44\x38\x00" - "\xc2\x44\x48\x70\x44\x42\xc2\x00" - "\xe0\x40\x40\x40\x40\x42\xfe\x00" - "\x82\xc6\xaa\x92\x82\x82\x82\x00" - "\x82\xc2\xa2\x92\x8a\x86\x82\x00" - "\x38\x44\x82\x82\x82\x44\x38\x00" - "\xfc\x42\x42\x7c\x40\x40\xe0\x00" - "\x38\x44\x82\x82\x82\x54\x38\x04" - "\xfc\x42\x42\x7c\x44\x42\xc2\x00" - "\x38\x84\x80\x78\x04\x84\x74\x00" - "\xfe\x92\x10\x10\x10\x10\x38\x00" - "\x84\x84\x84\x84\x84\x84\xfc\x00" - "\x84\x84\x84\x84\x84\x48\x30\x00" - "\x82\x82\x82\x92\xaa\xc6\x82\x00" - "\x82\x44\x28\x10\x28\x44\x82\x00" - "\x82\x44\x28\x10\x10\x10\x38\x00" - "\xfe\x84\x88\x10\x22\x42\xfe\x00" - "\x78\x40\x40\x40\x40\x40\x78\x00" - "\x80\x40\x20\x10\x08\x04\x02\x00" - "\x78\x08\x08\x08\x08\x08\x78\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x20\x20\x10\x00\x00\x00\x00\x00" - "\x00\x00\x78\x04\x7c\x84\x76\x00" - "\xc0\x40\x7c\x42\x42\x42\xdc\x00" - "\x00\x00\x78\x84\x80\x84\x78\x00" - "\x0c\x04\x7c\x84\x84\x84\x76\x00" - "\x00\x00\x78\x84\xfc\x80\x78\x00" - "\x38\x44\x40\xe0\x40\x40\xe0\x00" - "\x00\x00\x76\x84\x84\x7c\x04\xf8" - "\xc0\x40\x4c\x62\x42\x42\xc2\x00" - "\x10\x00\x30\x10\x10\x10\x38\x00" - "\x04\x00\x04\x04\x04\x84\x84\x78" - "\xc0\x40\x42\x44\x78\x44\xc2\x00" - "\x30\x10\x10\x10\x10\x10\x38\x00" - "\x00\x00\xec\x92\x92\x92\x82\x00" - "\x00\x00\xf8\x84\x84\x84\x84\x00" - "\x00\x00\x78\x84\x84\x84\x78\x00" - "\x00\x00\xdc\x42\x42\x7c\x40\xe0" - "\x00\x00\x76\x84\x84\x7c\x04\x0e" - "\x00\x00\xdc\x62\x40\x40\xe0\x00" - "\x00\x00\x7c\x80\x78\x04\xf8\x00" - "\x10\x10\x7c\x10\x10\x12\x0c\x00" - "\x00\x00\x84\x84\x84\x84\x76\x00" - "\x00\x00\x84\x84\x84\x48\x30\x00" - "\x00\x00\x82\x92\xaa\xc6\x82\x00" - "\x00\x00\x84\x48\x30\x48\x84\x00" - "\x00\x00\x84\x84\x84\x7c\x04\xf8" - "\x00\x00\xfc\x88\x30\x44\xfc\x00" - "\x18\x20\x20\xc0\x20\x20\x18\x00" - "\x10\x10\x10\x00\x10\x10\x10\x00" - "\x60\x10\x10\x0c\x10\x10\x60\x00" - "\x64\x98\x00\x00\x00\x00\x00\x00" - "\x00\x10\x28\x44\x82\x82\xfe\x00" - "\x78\x84\x80\x84\x78\x18\x04\x78" - "\x00\x84\x00\x84\x84\x84\x7a\x00" - "\x0c\x00\x78\x84\xfc\x80\x78\x00" - "\x7e\x81\x3c\x02\x3e\x42\x3d\x00" - "\x84\x00\x78\x04\x7c\x84\x7a\x00" - "\xc0\x00\x78\x04\x7c\x84\x7a\x00" - "\x20\x20\x78\x04\x7c\x84\x7a\x00" - "\x00\x00\x78\x80\x80\x78\x04\x38" - "\x7e\x81\x3c\x42\x7e\x40\x3c\x00" - "\x84\x00\x78\x84\xfc\x80\x78\x00" - "\x60\x00\x78\x84\xfc\x80\x78\x00" - "\x48\x00\x30\x10\x10\x10\x38\x00" - "\x7c\x82\x30\x10\x10\x10\x38\x00" - "\x60\x00\x30\x10\x10\x10\x38\x00" - "\x82\x38\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x0c\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x67\x19\x7f\x98\x77\x00" - "\x3f\x48\x88\xff\x88\x88\x8f\x00" - "\x78\x84\x78\x84\x84\x84\x78\x00" - "\x84\x00\x78\x84\x84\x84\x78\x00" - "\xc0\x00\x78\x84\x84\x84\x78\x00" - "\x7e\x81\x42\x42\x42\x42\x3c\x00" - "\x20\x10\x42\x42\x42\x42\x3c\x00" - "\x84\x00\x84\x84\x84\x7c\x04\xf8" - "\x42\x18\x24\x42\x42\x24\x18\x00" - "\x84\x00\x84\x84\x84\x84\x78\x00" - "\x00\x02\x7c\x8a\x82\xa2\x7c\x80" - "\x38\x44\x44\xe0\x40\x82\xfc\x00" - "\x3a\x44\x8a\x92\xa2\x44\xb8\x00" - "\xf8\x84\x84\xf8\x82\x87\x82\x83" - "\x0c\x12\x10\x38\x10\x10\x90\x60" - "\x1c\x00\x78\x04\x7c\x84\x7a\x00" - "\x18\x00\x30\x10\x10\x10\x38\x00" - "\x08\x10\x78\x84\x84\x84\x78\x00" - "\x08\x10\x84\x84\x84\x84\x7a\x00" - "\x64\x98\xb8\xc4\x84\x84\x84\x00" - "\x64\x98\x84\xa4\x94\x84\x84\x00" - "\x3c\x44\x44\x3a\x00\x7e\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x20\x00\x20\x40\x80\x84\x78\x00" - "\x00\x00\x00\xfc\xc0\xc0\x00\x00" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\x42\x44\x48\x56\x69\x42\x84\x0f" - "\x42\x44\x48\x53\x65\x49\x8f\x01" - "\x10\x10\x00\x10\x38\x38\x10\x00" - "\x00\x22\x44\x88\x44\x22\x00\x00" - "\x00\x82\x7c\x82\x82\x7c\x82\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x62\x94\x88\x94\x62\x00" - "\x00\x78\x84\xf8\x84\xf8\x80\x80" - "\x00\xfc\x84\x80\x80\x80\x80\x00" - "\x00\xfe\x28\x28\x28\x28\x28\x00" - "\xfc\x84\x40\x20\x40\x84\xfc\x00" - "\x00\x00\x7e\x88\x88\x88\x70\x00" - "\x00\x42\x42\x42\x42\x7c\x40\x80" - "\x00\x76\x88\x08\x08\x08\x08\x00" - "\xf8\x20\x70\x88\x88\x70\x20\xf8" - "\x38\x44\x82\xfe\x82\x44\x38\x00" - "\x38\x44\x82\x82\x28\x28\x6c\x00" - "\x1c\x10\x08\x7c\x84\x84\x78\x00" - "\x00\x00\x7c\x92\x92\x7c\x00\x00" - "\x02\x04\x7e\x89\x91\x7e\x40\x80" - "\x38\x40\x80\xf8\x80\x40\x38\x00" - "\x78\x84\x84\x84\x84\x84\x84\x00" - "\x00\xfc\x00\xfc\x00\xfc\x00\x00" - "\x20\x20\xfc\x20\x20\x00\xfc\x00" - "\x40\x20\x10\x20\x40\x00\xfc\x00" - "\x10\x20\x40\x20\x10\x00\xfc\x00" - "\x0e\x11\x11\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x88\x88\x70" - "\x20\x20\x00\xf8\x00\x20\x20\x00" - "\x00\x64\x98\x00\x64\x98\x00\x00" - "\x38\x44\x44\x38\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x07\x04\x04\x04\x64\x24\x1c\x0c" - "\x58\x44\x44\x44\x44\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 865 Norwegian, (thin)", CIOLIB_CP865} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf8\xf8\x60\x60\x7c\x7e\x66\x66\x6e\x6c\x00\x00\x00\x00" - "\x18\x10\x7e\x7e\x60\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x60\x60\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x10\x7c\x7c\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x66\x66\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\xfe\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\xfe\x18\x18\xfe\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xf8\xc0\xc0\xf8\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x86\x8c\x18\x30\x6a\xca\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xd8\xde\xdb\xdb\xdb\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xc0\xc0\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\xd8\xd8\xd8\xd8\xfe\xdb\xd9\xdb\xde\x00\x00\x00\x00" - "\x18\x10\xc2\xc6\xcc\xd8\xf0\xf8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xfc\x30\x30\x3c\x3e\x36\x36\x36\x36\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\xfe\x38\x38\x00\x00\x00\x00" - "\x00\x00\x60\x60\x60\xf8\x60\x7c\x7e\x66\x66\x66\x0c\x0c\x00\x00" - "\x00\x00\xc0\xc0\xc0\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x60\xc0\xc0\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf1\x5b\x55\x51\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x78\x78\xde\xd9\xd9\xde\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\x60\x30\x30\x60\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xd8\xfe\xd9\xd9\xde\x00\x00\x00\x00" - "\x00\x00\x00\x18\x10\xc4\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xfc\x30\x3c\x36\x36\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x5a\x3c\x66\x66\x3c\x5a\x00\x00\x00\x00\x00" - "\x00\x00\x06\x06\x7e\x7e\x60\x60\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x30\x40\x40\x30\x48\x48\x30\x08\x08\x30\x00\x00\x00\x00" - "\x6c\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x7c\x82\x9a\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf0\xf0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x33\x66\xcc\xcc\x66\x33\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\x02\x02\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x92\xaa\xb2\xaa\x82\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x28\x10\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7e\x7e\x60\x60\x60\x60\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\xcc\xfc\xcc\xc6\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xe8\xe8\xe8\x68\x28\x28\x28\x28\x28\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8a\xcd\xea\xb8\x9b\x88\x8b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\x66\x33\x33\x66\xcc\x00\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xf8\xf8\x60\x60\x7c\x7e\x66\x6e\x6c\x00\x00\x00" - "\x18\x10\x7e\x7e\x60\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x60\x60\x60\xc0\x00\x00" - "\x00\x00\x00\x18\x10\x7c\x7c\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x66\x66\x66\xcc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xdb\x00\x00\x00" - "\x00\x00\x18\x18\xfe\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\xfe\x18\x18\x18\xfe\x18\x18\x00\x00\x00" - "\x00\x00\x3c\x62\x60\xfe\xc0\xfe\x60\x62\x3c\x00\x00\x00" - "\x00\x00\x00\x86\x8c\x18\x30\x6a\xca\x00\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\xd8\xd8\xde\xdb\xdb\xde\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xc0\xc0\x60\x30\x00\x00\x00\x00" - "\x00\x00\xd8\xd8\xd8\xd8\xfe\xdb\xd9\xdb\xde\x00\x00\x00" - "\x18\x10\xc6\xcc\xd8\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xfc\x30\x30\x3c\x3e\x36\x36\x36\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x38\x38\x00\x00" - "\x00\x00\x60\x60\xf8\x60\x7c\x7e\x66\x66\x66\x0e\x0c\x00" - "\x00\x00\x00\xc0\xc0\xc0\x60\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xc0\x60\x60\x60\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\x66\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf1\x5b\x55\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x38\x78\xd8\xde\xd9\xde\x00\x00\x00" - "\x00\x00\x00\x00\xc0\x60\x30\x30\x60\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\xd8\xfe\xd9\xd9\xde\x00\x00\x00" - "\x00\x00\x00\x18\x10\xcc\xd8\xf0\xd8\xcc\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xfc\x30\x3c\x36\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\x38\x38\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x28\x10\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x00\x5a\x3c\x66\x66\x3c\x5a\x00\x00\x00\x00" - "\x00\x00\x06\x06\x7e\x7e\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x30\x40\x40\x30\x48\x48\x30\x08\x08\x30\x00\x00" - "\x6c\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfc\x00\x00\x00" - "\x00\x7c\x82\x9a\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xf0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x33\x66\xcc\xcc\x66\x33\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xfe\x02\x02\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x92\xaa\xb2\xaa\x82\x7c\x00\x00\x00\x00\x00\x00" - "\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x28\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7e\x7e\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\xcc\xfc\xcc\xc6\xc0\xc0\xc0\x00" - "\x00\x00\x7c\xe8\xe8\xe8\x68\x28\x28\x28\x28\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x8a\xcd\xea\xb8\x9b\x88\x8b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\xcc\x66\x33\x33\x66\xcc\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\x00\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfc\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xfc\xfc\x30\x3c\x36\x33\x36\x00" - "\x10\x7e\x60\x60\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\x60\x30\x30" - "\x00\x00\x10\x7e\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\xcc\x66\x66" - "\x00\x00\x00\x00\x00\xdb\xdb\x00" - "\x00\x18\xfe\x18\x18\x18\x18\x00" - "\x00\x18\xfe\x18\x18\xfe\x18\x00" - "\x3c\x62\xf8\xc0\xf8\x62\x3c\x00" - "\x00\x86\x8c\x18\x30\x6a\xca\x00" - "\x38\x78\xd8\xde\xdb\xdb\xde\x00" - "\x00\x30\x60\xc0\xc0\x60\x30\x00" - "\xd8\xd8\xd8\xfe\xd9\xd9\xde\x00" - "\x18\xd6\xcc\xf8\xf8\xcc\xc6\x00" - "\xfc\xfc\x30\x3c\x36\x36\x36\x00" - "\xc6\xc6\xc6\xc6\xfe\x38\x38\x00" - "\x60\xf8\x60\x7c\x7e\x66\x66\x0c" - "\xc0\xc0\x60\x00\x00\x00\x00\x00" - "\xc0\x60\x60\x00\x00\x00\x00\x00" - "\xcc\xcc\x66\x00\x00\x00\x00\x00" - "\xcc\x66\x66\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf1\x5b\x55\x51\x00\x00\x00\x00" - "\x00\x00\x38\x78\xde\xd9\xde\x00" - "\x00\xc0\x60\x30\x30\x60\xc0\x00" - "\x00\x00\xd8\xd8\xfe\xd9\xde\x00" - "\x18\x10\xcc\xd8\xf0\xd8\xcc\x00" - "\x00\x00\xfc\x30\x3c\x36\x36\x00" - "\x00\x00\xc6\xc6\xfe\x38\x38\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6b\x63\x63\x3f\x03\x63\x3e\x00" - "\x00\x10\xcc\xcc\xcc\x7c\x0c\xf8" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x00\x5a\x3c\x66\x66\x3c\x5a\x00" - "\x06\x7e\x7e\x60\x60\x60\x60\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x30\x40\x30\x48\x30\x08\x30\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x7c\x82\x9a\xa2\x9a\x82\x7c\x00" - "\x3c\x62\xc0\xf8\xc0\x62\x3c\x00" - "\x00\x33\x66\xcc\xcc\x66\x33\x00" - "\x00\x00\x00\x00\xfe\xfe\x02\x00" - "\x00\x00\x00\x00\xf8\xf8\x00\x00" - "\x7c\x92\xaa\xb2\xaa\x82\x7c\x00" - "\x66\x00\x18\x18\x18\x18\x18\x00" - "\x00\x10\x28\x28\x10\x00\x00\x00" - "\x00\x00\x18\x7e\x18\x00\x7e\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x00\x00\x06\x7e\x60\x60\x60\x00" - "\x00\x84\xcc\xfc\xcc\xc6\xc0\xc0" - "\x7c\xe8\xe8\x68\x28\x28\x28\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x6c\x00\x78\xcc\xfc\xc0\x78\x00" - "\x8a\xcd\xea\xb8\x9b\x88\x8b\x00" - "\x00\x00\x3e\x60\x7c\x60\x3e\x00" - "\x00\xcc\x66\x33\x33\x66\xcc\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x00\x66\x00\x18\x18\x18\x18\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - , "Codepage 1251 Cyrillic", CIOLIB_CP1251} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x30\x60\x60\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x06\x06\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xec\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x66\xc3\x99\xa1\xa1\x99\xc3\x66\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x03\x03\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x1e\x06\x66\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc0\x90\xb8\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xbf\xb1\x30\x30\x3e\x30\x30\x31\x31\x3f\x00\x00\x00\x00" - "\x00\x00\xb3\xb3\x33\x33\x3f\x33\x33\x33\x33\x00\x00\x00\x00\x00" - "\x00\x00\xbc\x98\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x9e\xb3\x33\x33\x33\x33\x33\x33\x1e\x00\x00\x00\x00\x00" - "\x00\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x1e\x00" - "\x00\x00\xb3\xb3\x33\x33\x1e\x0c\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\x9e\xb3\x21\x21\x21\x21\x21\x33\x12\x33\x00\x00\x00\x00" - "\x0c\x08\x00\x66\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\x62\x60\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x00\x00\x7c\x00\x00\x00\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\x60\x30\x18\x18\x30\x60\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x7e\x99\x99\x99\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x18\xdb\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\x66\x24\xe7\x00\x00\x00\x00" - "\x00\xc3\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\xc3\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x7b\xce\xcc\xcc\xcc\xcc\x7b\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\xdc\x66\x66\x66\x66\x66\x66\x06\x06\x06\x00" - "\x00\x00\x38\x10\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x18\xc3\x00\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7b\xce\xcc\xcc\xcc\xcc\x7b\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\x42\x66\x3c\x00\x00" - "\x00\x7c\x60\x30\x18\x78\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x0c\x18\x30\x60\xc0\xc0\xc0\xc0\x78\x0c\x0c\x78\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x06\x06\x06\x00" - "\x00\x00\x3e\x63\x63\x63\x7f\x63\x63\x63\x63\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x0c\x0c\x0c\x36\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7f\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\x82\xc6\xc6\x6c\x6c\x38\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x60\xc0\x78\x30\x60\xc0\xc0\xc0\x7c\x06\x06\x3c\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x66\x7c\x60\x60\x60\x00" - "\x00\x00\x00\x00\x00\x3e\x63\xc0\xc0\x60\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x7f\xcc\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x5c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x00" - "\x00\x00\x00\x00\x00\x66\xc3\xc3\xc3\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\xc3\x00\x00\x18\x18\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\xc3\x00\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\xe7\x66\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x38\x10\x00\x66\xc3\xc3\xc3\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x00\x00" - "\x00\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18" - "\x00\x00\x00\x00\xc2\xc6\x1c\x38\x60\xc6\x86\x00\x00\x00" - "\x00\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00" - "\x00\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xd6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x06\x0c\x18\x30\x30\x18\x0c\x06\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xdc\xc0\x7c\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x1e\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\xe6\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x7c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x62\xc6\xfe\x00\x00" - "\x00\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x60\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\x00\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c" - "\x00\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x7c\x60\x60\x60" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8" - "\x00\x00\x00\x00\x00\x00\xfe\x8c\x38\x70\xc6\xfe\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x30\x60\x60\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x06\x06\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xec\xfc\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18" - "\x00\x00\x00\x7c\xc6\x60\x38\x6c\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x66\xc3\x99\xa1\xa1\x99\xc3\x66\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x03\x03\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x1e\x06\x66\x3c\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x06\x0c\x18\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x90\xb8\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xbf\xb1\x30\x30\x3e\x30\x31\x31\x3f\x00\x00" - "\x00\x00\x00\xb3\xb3\x33\x33\x3f\x33\x33\x33\x33\x00\x00" - "\x00\x00\x00\xbc\x98\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00" - "\x00\x00\x00\x9e\xb3\x33\x33\x33\x33\x33\x33\x1e\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e" - "\x00\x00\x00\xb3\xb3\x33\x33\x1e\x0c\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\x9e\xb3\x21\x21\x21\x21\x33\x12\x33\x00\x00" - "\x00\x0c\x08\x00\x66\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\xfe\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x62\xc6\xfe\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xe6\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfe\x82\x00\x00\x7c\x00\x00\x82\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xc0\x60\x30\x18\x30\x60\xc0\xfe\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x3c\x18\x7e\x99\x99\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x7c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x18\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x3c\x66\xc3\xc3\xc3\xc3\x66\x24\xe7\x00\x00" - "\x00\x00\xc3\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\xc3\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x38\x10\x00\x7b\xce\xcc\xcc\xcc\x7b\x00\x00" - "\x00\x00\x38\x10\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x10\x00\xdc\x66\x66\x66\x66\x66\x06\x06" - "\x00\x00\x00\x38\x10\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\xc3\x00\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7b\xce\xcc\xcc\xcc\x7b\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\xc0\xc0" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\x42\x66\x3c" - "\x00\x00\x7c\x60\x30\x18\x78\xcc\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x78\xc0\xc6\x7c\x00\x00" - "\x00\xfc\x0c\x18\x30\x60\xc0\xc0\xc0\xc0\x78\x0c\x0c\x78" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x06\x06" - "\x00\x00\x00\x3e\x63\x63\x63\x7f\x63\x63\x63\x3e\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x6c\x0c\x0c\x0c\x36\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7f\x60\x60" - "\x00\x00\x00\x00\x00\x00\x82\xc6\xc6\x6c\x6c\x38\x00\x00" - "\x00\xfc\x60\xc0\x78\x30\x60\xc0\xc0\xc0\x7c\x06\x06\x7c" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x7c\x60\x60" - "\x00\x00\x00\x00\x00\x00\x3e\x63\xc0\x60\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x7f\xcc\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x5c\xd6\xd6\xd6\xd6\x7c\x10\x10" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10" - "\x00\x00\x00\x00\x00\x00\x66\xc3\xc3\xdb\xff\x66\x00\x00" - "\x00\x00\x00\xc3\x00\x00\x18\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\xc3\x00\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x38\x10\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x10\x00\xe7\x66\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x38\x10\x00\x66\xc3\xc3\xdb\xff\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x66\x66\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x7c\xc6\x06\x1c\x30\x66\xfe\x00" - "\x7c\xc6\x06\x3c\x06\xc6\x7c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00" - "\x3c\x60\xc0\xfc\xc6\xc6\x7c\x00" - "\xfe\xc6\x06\x0c\x18\x30\x30\x00" - "\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00" - "\x7c\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x7c\xc6\x0c\x18\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3a\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x5a\x18\x18\x18\x18\x3c\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00" - "\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x7c\xc6\xc0\xc6\x7c\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x3c\x66\x60\xf8\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xec\xfe\xd6\xd6\xc6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x60\x60\xf0\x00" - "\x00\x00\x7e\xc0\x7c\x06\xfc\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x00" - "\x00\x00\xc6\xd6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x40\x30\x00\x00\x00\x00\x00" - "\x0c\x02\x0c\x00\x00\x00\x00\x00" - "\x3c\x66\x60\xf8\x60\x66\xfe\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x38\x44\xba\xa2\xba\x44\x38\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xcc\x66\x33\x00" - "\x00\x00\x00\xff\x03\x00\x00\x00" - "\x00\x00\x00\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x00\x00\x00\x00" - "\x30\x30\xfc\x30\x30\x00\xfc\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x70\x08\x30\x08\x70\x00\x00\x00" - "\x08\x10\x00\x00\x00\x00\x00\x00" - "\x08\xd3\x00\x00\x00\x00\x00\x00" - "\x5c\xb6\x63\x7f\x63\x63\x63\x00" - "\x18\x18\x00\x00\x00\x00\x00\x00" - "\x5f\x90\x10\x1e\x10\x10\x1f\x00" - "\xb3\xb3\x33\x3f\x33\x33\x33\x00" - "\x5e\x8c\x0c\x0c\x0c\x0c\x1e\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x5c\xb6\x63\x63\x63\x36\x1c\x00" - "\x40\xc0\x4c\x52\x04\x08\x1e\x00" - "\xb3\xb3\x33\x1e\x0c\x0c\x1e\x00" - "\x5c\xb6\x63\x63\x36\x14\x77\x00" - "\x08\xd3\x00\x30\x30\x30\x3c\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00" - "\x10\x38\x6c\xc6\xc6\xc6\xfe\x00" - "\xfe\xc0\xc0\xfc\xc0\xc0\xfe\x00" - "\xfe\x06\x0c\x18\x30\x60\xfe\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x7c\xc6\xc6\xfe\xc6\xc6\x7c\x00" - "\x7e\x18\x18\x18\x18\x18\x7e\x00" - "\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\x10\x38\x6c\xc6\xc6\xc6\xc6\x00" - "\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\xfe\xc6\x00\x38\x00\xc6\xfe\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xff\x66\x66\x66\x66\x66\x66\x00" - "\xfc\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xfe\xc0\x60\x30\x60\xc0\xfe\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x10\x7c\xd6\xd6\x7c\x10\x38\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x10\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x38\x6c\xc6\xc6\x6c\x28\xee\x00" - "\xc3\x3c\x18\x18\x18\x18\x3c\x00" - "\x66\x00\x66\x66\x3c\x18\x3c\x00" - "\x08\x10\x76\xcc\xcc\xcc\x76\x00" - "\x08\x10\x7e\xc0\x7c\xc0\x7e\x00" - "\x08\x10\xbc\x66\x66\x66\x66\x06" - "\x08\x10\x30\x30\x30\x30\x3c\x00" - "\x08\xd3\x00\xe6\x66\x66\x3c\x00" - "\x00\x00\x7a\xcc\xcc\xcc\x7a\x00" - "\x78\xcc\xd8\xfc\xc6\xc6\xfc\x80" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x7c" - "\x7e\x30\x18\x7c\xc6\xc6\x7c\x00" - "\x00\x00\x7e\xc0\x7c\xc0\x7e\x00" - "\x7e\x06\x1c\x30\x60\x3e\x02\x1c" - "\x00\x00\xbc\x66\x66\x66\x66\x06" - "\x7c\xc6\xe6\x3e\x86\xc6\x7c\x00" - "\x00\x00\x30\x30\x30\x30\x1c\x00" - "\x00\x00\xc6\xdc\xf0\xdc\xc6\x00" - "\x7c\xc6\x06\x1e\x36\x66\xc6\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xdd\xc0" - "\x00\x00\x82\xc6\xc6\x6c\x38\x00" - "\x7e\x18\x30\x3c\x60\x3e\x02\x1c" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xff\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xfc\xc0\xc0" - "\x00\x00\x7e\xc0\xc0\x7c\x06\x1c" - "\x00\x00\x7e\xd8\xcc\xcc\x78\x00" - "\x00\x00\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xe6\x66\x66\x66\x3c\x00" - "\x00\x00\x1c\x56\xd6\xd6\x7c\x10" - "\x00\x00\xc2\x6c\x38\x6c\x86\x00" - "\x00\x00\x10\xd6\xd6\xd6\x7c\x10" - "\x00\x00\x44\xd6\xd6\xd6\x6c\x00" - "\xcc\x00\x30\x30\x30\x30\x3c\x00" - "\x66\x00\xe6\x66\x66\x66\x3c\x00" - "\x08\x10\x7c\xc6\xc6\xc6\x7c\x00" - "\x08\x10\xe6\x66\x66\x66\x3c\x00" - "\x08\x10\x44\xd6\xd6\xd6\x6c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-7 Greek", CIOLIB_ISO_8859_7} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x6c\x76\x66\x66\x66\x66\xe6\x06\x0c\x30\x00" - "\x00\x00\x18\x10\x00\xfe\xc2\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x62\xc0\xf8\xc0\x62\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x36\x24\x00\x78\x30\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x0c\x08\x00\x3c\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00" - "\x00\x00\x00\x00\x00\x3c\x4c\x4c\x4e\x49\x49\xce\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xfe\xc9\xc9\xce\x00\x00\x00\x00" - "\x00\x00\x60\xf0\x60\x60\x7c\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x10\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x24\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x00\x00\x00\x07\x88\xcb\xab\xa8\xab\x9b\x88\x00\x00\x00\x00" - "\x00\x60\xf8\x60\x60\x7c\x76\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x18\x10\xfe\x66\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xe8\xd0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x36\x24\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\xb0\x60\x00\x00" - "\x00\x00\x7c\x6c\x6c\x6c\x6e\x69\x69\x69\x69\xce\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xfe\xc9\xc9\xc9\xc9\xce\x00\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\xe7\x00\x00\x00\x00" - "\x18\x10\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00\x00" - "\x02\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x6c\x38\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x10\x10\x38\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - , NULL, NULL, "Russian koi8-r (c)", CIOLIB_KOI8_R} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x18\x18\x7e\xdb\xd8\x58\x38\x1c\x1e\xdb\xdb\x7e\x18\x18\x00" - "\x00\x00\x00\xe2\xa6\xec\x18\x18\x30\x60\x6e\xca\x8e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x18\x30\x60\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x18\x78\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30\x00" - "\x00\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00\x00" - "\x00\x00\x00\x80\xc0\x60\x60\x30\x18\x0c\x0c\x06\x02\x00\x00\x00" - "\x00\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x1c\x36\x30\xfc\x30\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xf6\x18\xf0\x00" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\xc6\xc6\x7c\x00\x00\x00" - "\x7c\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7c\x0c\x78\x00" - "\x00\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x1e\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x18\xf0\x00" - "\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x0c\x78\x00" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x78\x00\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\x30\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00\x00" - "\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00\x00" - "\x00\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\xfe\xe6\xc6\xc6\xc6\x06\x1c\x00\x00\x00" - "\x00\x7c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x0c\x18\x20\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x76\xdc\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x6c\x6c\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e\x00" - "\x66\x3c\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x18\x30\x40\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e\x00" - "\x6c\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x18\x18\x00\xfe\x66\x60\x60\x78\x60\x60\x60\x66\xfe\x00\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x3c\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x0c\x78\x00" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78\x00" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x02\x06\x7c\xce\xde\xd6\xd6\xd6\xd6\xf6\xe6\x7c\xc0\x80\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x60\x3c\x00" - "\x0c\x18\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1c\x00" - "\x00\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x30\x1e\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x10\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78\x00" - "\x00\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x18\xf0\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x60\x3c\x00" - "\x00\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\xee\xee\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xd8\x78\x1c\x1e\x9b\xdb\x7e\x18\x18" - "\x00\x00\xe6\xa6\xec\x1c\x18\x30\x70\x6e\xca\xce\x00\x00" - "\x00\x00\x38\x6c\x38\x30\x76\x7e\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x38\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x6c\x38\xfe\x38\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x30\x30\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\xc6\xce\xd6\xd6\xd6\xd6\xe6\xc6\x7c\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x7c\xc6\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x00\x00" - "\x00\x00\x00\x00\x00\x38\x38\x00\x00\x00\x38\x38\x18\x30" - "\x00\x00\x00\x0c\x18\x30\x60\x60\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xdc\xc0\x7e\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x06\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x70\x1c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x7c\x60\x60\x60\x60\x60\x60\x60\x60\x7c\x00\x00" - "\x00\x00\xc0\xc0\x60\x60\x30\x18\x18\x0c\x06\x06\x00\x00" - "\x00\x00\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7c\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x38\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x0c\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x1c\x36\x30\x30\xfc\x30\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc" - "\x00\x00\xe0\x60\x60\x7c\x66\x66\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\xf0" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0e" - "\x00\x00\x00\x00\x00\xdc\x66\x60\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x30\x30\x60\xc0" - "\x00\x00\x00\x00\x00\xfe\x86\x0c\x18\x30\x62\xfe\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xfe\x00" - "\x00\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xce\x18\x0e" - "\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x78\x6c\x66\x66\xe6\x0c\x78" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x76\xdc\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x0c\x78" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\xce\xc6\x7c\x00" - "\x00\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\x7c\x00\x00" - "\x7c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xce\xc6\xc6\xc6\x7c\x0c\x78" - "\x00\x00\xff\xdb\x99\x18\x1e\x3c\x78\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00" - "\x66\x3c\x00\xfe\xc6\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00" - "\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x18\x0e" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x0e" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x30\xe0" - "\x00\x0c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x18\xf0" - "\x00\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x70" - "\x00\x00\x6c\x38\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x3c\x60\x38\x00\x76\xce\xc6\xc6\xc6\xce\x76\x06\xfc\x00" - "\x00\x00\x30\x30\x30\xfc\x30\x3c\x78\xf0\x36\x1c\x00\x00" - "\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\xdc\x00\x00" - "\x00\x00\x6c\x38\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\xdc\xfe\xf6\xe6\xc6\xc6\x06\x1c\x00\x00" - "\x7c\x00\x38\x7c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x76\xdc\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\x38\x6c\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3f\x6c\xcc\xcc\xff\xcc\xcc\xcc\xcc\xcf\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x66\x3c\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x0e\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x00\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x30\x1e" - "\x6c\x00\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x18\x18\xfe\x66\x60\x60\x7c\x60\x60\x60\x66\xfe\x00\x00" - "\x0c\x18\x20\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x7e\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\xf6\xf6\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\xc6\xc6\xe6\xe6\xf6\xde\xce\xce\xc6\xc6\x0c\x78" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x0c\x78" - "\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\x18\x3c\x66\x00\x00\x00\x00" - "\x02\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x80" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1c" - "\x0c\x18\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\xc6\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00" - "\x00\x00\x00\x7c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x19\x7f\xd8\xd8\xd8\x6f\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x30\x1e" - "\x00\x00\x6c\x38\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x18\x1e" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x7c\xc6\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x7c\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x7e\x0c\x7c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x0c\x78" - "\x00\x00\x00\x7c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\xe0\x60\x60\x66\x66\x6c\x78\x6c\x66\xe6\x0c\x78" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x06\x7c\xce\xd6\xd6\xd6\xe6\x7c\xc0\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x30\x1e" - "\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x10\x38\x6c\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x76\xdc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xfc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x18\x18\x00\x18" - "\x00\xee\x66\xcc\x00\x00\x00\x00" - "\x00\x6c\xfe\x6c\x6c\x6c\xfe\x6c" - "\x18\x7e\xdb\xd8\x7e\x1b\xdb\x7e" - "\x00\x00\xc6\xcc\x18\x30\x66\xc6" - "\x00\x38\x6c\x3a\x7e\xcc\xcc\x76" - "\x00\x38\x18\x70\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x30\x30\x18\x0c" - "\x00\x30\x18\x0c\x0c\x0c\x18\x30" - "\x00\x00\x6c\x38\xfe\x38\x6c\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00" - "\x00\x00\x00\x00\x00\x38\x18\x70" - "\x00\x00\x00\x00\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18" - "\x00\x06\x0c\x18\x18\x30\x60\xc0" - "\x00\x7c\xc6\xce\xd6\xe6\xc6\x7c" - "\x00\x18\x78\x18\x18\x18\x18\x7e" - "\x00\x7c\xc6\x8c\x38\x60\xc2\xfe" - "\x00\x7c\xc6\x06\x3c\x06\xc6\x7c" - "\x00\x1c\x3c\x6c\xcc\xfe\x0c\x1e" - "\x00\xfe\xc0\xfc\x06\x06\xc6\x7c" - "\x00\x7c\xc6\xc0\xfc\xc6\xc6\x7c" - "\x00\xfe\xc6\x06\x0c\x18\x30\x30" - "\x00\x7c\xc6\xc6\x7c\xc6\xc6\x7c" - "\x00\x7c\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x18\x18\x00\x18\x18\x00" - "\x00\x00\x18\x18\x00\x18\x18\x70" - "\x00\x00\x18\x30\x60\x30\x18\x00" - "\x00\x00\x00\xfe\x00\xfe\x00\x00" - "\x00\x00\x30\x18\x0c\x18\x30\x00" - "\x00\x7c\xc6\xcc\x18\x18\x00\x18" - "\x00\x7c\xc6\xc6\xde\xdc\xc0\x7e" - "\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x00\xfc\x66\x66\x7c\x66\x66\xfc" - "\x00\x3c\x66\xc2\xc0\xc2\x66\x3c" - "\x00\xf8\x6c\x66\x66\x66\x6c\xf8" - "\x00\xfe\x66\x60\x7c\x60\x66\xfe" - "\x00\xfe\x66\x60\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc0\xce\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6" - "\x00\x3c\x18\x18\x18\x18\x18\x3c" - "\x00\x3c\x18\x18\x18\xd8\xd8\x70" - "\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6" - "\x00\xf0\x60\x60\x60\x62\x66\xfe" - "\x00\xc6\xc6\xee\xfe\xd6\xc6\xc6" - "\x00\xc6\xe6\xf6\xde\xce\xc6\xc6" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xfc\x66\x66\x7c\x60\x60\xf0" - "\x00\x7c\xc6\xc6\xd6\xd6\x7c\x06" - "\x00\xfc\x66\x66\x7c\x78\x66\xe6" - "\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c" - "\x00\xff\xdb\x99\x18\x18\x18\x3c" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\xc6\xc6\xc6\xc6\x6c\x38\x10" - "\x00\xc6\xc6\xd6\xd6\xfe\xee\x6c" - "\x00\xc6\xc6\x6c\x38\x6c\xc6\xc6" - "\x00\x66\x66\x66\x3c\x18\x18\x3c" - "\x00\xfe\xc6\x8c\x38\x62\xc6\xfe" - "\x00\x7c\x60\x60\x60\x60\x60\x7c" - "\x00\xc0\x60\x30\x30\x18\x0c\x06" - "\x00\x7c\x0c\x0c\x0c\x0c\x0c\x7c" - "\x00\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x38\x30\x18\x00\x00\x00\x00" - "\x00\x00\x00\x78\x0c\x7c\xcc\x76" - "\x00\xe0\x60\x7c\x66\x66\x66\xfc" - "\x00\x00\x00\x78\xcc\xc0\xcc\x78" - "\x00\x0e\x0c\x7c\xcc\xcc\xcc\x7e" - "\x00\x00\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x1c\x36\x30\xfc\x30\x30\x78" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xe0\x60\x7c\x66\x66\xe6" - "\x18\x18\x00\x38\x18\x18\x18\x3c" - "\x0c\x0c\x00\x1c\x0c\x0c\xcc\x78" - "\x00\xe0\x60\x66\x6c\x78\x6c\xe6" - "\x00\x38\x18\x18\x18\x18\x18\x3c" - "\x00\x00\x00\xec\xfe\xd6\xd6\xc6" - "\x00\x00\x00\xdc\x66\x66\x66\x66" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0e\x0e" - "\x00\x00\x00\xdc\x66\x60\x60\xf0" - "\x00\x00\x00\x7c\xc0\x7c\x06\xfc" - "\x00\x30\x30\xfc\x30\x30\x36\x1c" - "\x00\x00\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x00\x00\xc6\xc6\x6c\x38\x10" - "\x00\x00\x00\xc6\xd6\xd6\xfe\x6c" - "\x00\x00\x00\xc6\x6c\x38\x6c\xc6" - "\x00\x00\x00\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\x00\xfe\x8c\x38\x62\xfe" - "\x00\x0e\x18\x18\x70\x18\x18\x0e" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x70\x18\x18\x0e\x18\x18\x70" - "\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xfe" - "\x38\x6c\xc6\xfe\xc6\xce\x18\x0e" - "\x00\x00\x00\xe6\x6c\x78\x6c\xe6" - "\xfc\x66\x7e\x6c\x66\xe6\x18\x70" - "\x00\x42\x3c\x66\x66\x3c\x42\x00" - "\x76\xdc\x38\x18\x18\x18\x18\x3c" - "\xf0\x60\x60\x62\x66\xfe\x18\x70" - "\x3c\x66\x38\x6c\x6c\x38\xcc\x78" - "\x66\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x38\x7c\xc0\x7c\x06\xc6\x7c" - "\x7c\x00\xfe\x60\x7c\x60\x66\xfe" - "\x3c\x66\xc0\xce\x66\x3e\x18\x70" - "\x00\xff\x99\x1e\x3c\x78\x18\x3c" - "\x00\x00\x00\x00\x00\x3c\x00\x00" - "\x6c\x38\xfe\x8c\x18\x32\x66\xfe" - "\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x0f" - "\x00\x00\x00\x00\x00\x00\x10\x1c" - "\x00\x00\xdc\x76\x66\xf0\x30\xe0" - "\x18\x30\x00\x00\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x18\x18\x3c" - "\x38\x18\x18\x18\x18\x3c\x18\x70" - "\x6c\x38\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x04\x1c" - "\x00\x6c\x38\x7c\xc0\x7c\x06\xfc" - "\x00\x7c\x00\x7c\xc6\xfe\xc0\x7c" - "\x38\x60\x30\x7e\xcc\x7c\x0c\xf8" - "\x00\x30\x30\xfc\x30\x38\x76\x1c" - "\x00\xdc\xfe\xf6\xc6\xc6\xc6\xdc" - "\x6c\x38\x00\xfe\x8c\x38\x62\xfe" - "\x00\x00\xdc\xfe\xf6\xc6\x06\x1c" - "\x7c\x00\x7c\xc6\xc6\xfe\xc6\xc6" - "\x0c\x18\x7c\xc6\xc6\xfe\xc6\xc6" - "\x7c\x82\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x7c\x7c\xc6\xc6\xfe\xc6\xc6" - "\xc6\x38\x6c\xc6\xc6\xfe\xc6\xc6" - "\x38\x6c\x38\x6c\xc6\xfe\xc6\xc6" - "\x00\x3e\x78\xd8\xfe\xd8\xd8\xde" - "\x78\x30\x30\x30\x30\x78\x30\x1c" - "\x6c\x38\x7c\xc6\xc0\xc0\xc6\x7c" - "\x0e\x18\xfe\x62\x78\x60\x66\xfe" - "\xfe\x66\x60\x78\x60\x66\xfe\x1c" - "\x6c\xfe\x66\x60\x7c\x60\x66\xfe" - "\x18\xfe\x66\x60\x7c\x60\x66\xfe" - "\x0c\x18\x3c\x18\x18\x18\x18\x3c" - "\x3c\x42\x3c\x18\x18\x18\x18\x3c" - "\x3c\x00\x3c\x18\x18\x18\x18\x3c" - "\x00\xf8\x6c\x66\xf6\xf6\x6c\xf8" - "\xc6\xe6\xf6\xde\xce\xc6\x0c\x38" - "\x7c\x00\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\xcc\xf8\xd8\xcc\xc6\x0c\x38" - "\x7c\x82\x7c\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\x7c" - "\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x03\x7e\xce\xde\xd6\xf6\xe6\xfc" - "\xc6\xc6\xc6\xc6\xc6\x7c\x30\x1e" - "\x1c\x30\xc6\xc6\xc6\xc6\xc6\x7c" - "\x38\x6c\x00\xc6\xc6\xc6\xc6\x7c" - "\xc6\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\xc6\xc6\xc6\xc6\x7c" - "\x7c\x00\xc6\xc6\xc6\xc6\xc6\x7c" - "\x00\x7c\xc6\xfc\xc6\xc6\xfc\xc0" - "\x00\x7c\x00\x78\x0c\x7c\xcc\x76" - "\x0c\x18\x20\x78\x0c\x7c\xcc\x76" - "\x00\x78\x84\x78\x0c\x7c\xcc\x76" - "\x6c\x38\x00\x78\x0c\x7c\xcc\x76" - "\x00\xcc\x00\x78\x0c\x7c\xcc\x76" - "\x00\x38\x6c\x78\x0c\x7c\xcc\x76" - "\x00\x00\x00\x6e\x3b\x7e\xd8\x7e" - "\x18\x00\x38\x18\x18\x3c\x18\x0e" - "\x00\xcc\x78\x78\xcc\xc0\xcc\x78" - "\x0c\x18\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x00\x7c\xc6\xfe\xc0\x7a\x1e" - "\x00\x6c\x00\x7c\xc6\xfe\xc0\x7c" - "\x00\x38\x00\x7c\xc6\xfe\xc0\x7c" - "\x0c\x18\x20\x38\x18\x18\x18\x3c" - "\x00\x3c\x42\x38\x18\x18\x18\x3c" - "\x00\x3c\x00\x38\x18\x18\x18\x3c" - "\x00\x0c\x3e\x0c\x7c\xcc\xcc\x76" - "\x00\x00\xdc\xe6\xc6\xc6\x18\x70" - "\x00\x7c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\xe0\x66\x6c\x78\x6c\xe6\x1c" - "\x7c\xc6\x00\x7c\xc6\xc6\xc6\x7c" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x6c\x00\x7c\xc6\xc6\xc6\x7c" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x06\x7c\xce\xd6\xe6\x7c\xc0" - "\x00\x00\xcc\xcc\xcc\x7e\x30\x1c" - "\x0c\x18\x20\xcc\xcc\xcc\xcc\x76" - "\x78\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\xcc\x00\xcc\xcc\xcc\xcc\x76" - "\x76\xdc\x00\xcc\xcc\xcc\xcc\x76" - "\x00\x78\x00\xcc\xcc\xcc\xcc\x76" - "\x18\x00\x00\x00\x00\x00\x00\x00" - , "ISO-8859-4 Baltic", CIOLIB_ISO_8859_4} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc3\xc3\xdb\xdb\xc3\xc3\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc3\xe7\xff\xff\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\xc3\xc3\xdb\xdb\xff\x66\x66\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x3c\x18\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00" - "\x00\x00\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xff\xc3\x86\x0c\x18\x30\x60\xc1\xc3\xff\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xdb\xdb\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xc3\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xc3\xdb\xdb\xff\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\x66\x3c\x18\x3c\x66\xc3\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x18\x18\x7e\xc3\xc0\xc0\xc0\xc3\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x82\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x82\x00\x00\x00" - "\x00\x00\xc3\x66\x3c\x18\xff\x18\xff\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xa2\xa2\xba\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\x70\x18\x78\xc8\x78\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x82\xba\xaa\xb2\xaa\x82\xc6\x7c\x00\x00\x00\x00" - "\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf8\x18\x30\x18\xd8\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7e\x63\x60\xc0\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x0c\x06\x3c\x00\x00" - "\x00\x60\xe0\x60\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x88\xd8\x70\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\xc0\xc0\xc2\xc6\xcc\x18\x30\x60\xce\x9b\x06\x0c\x1f\x00\x00" - "\x00\xf0\x30\x72\x36\xec\x18\x30\x66\xce\x96\x3e\x06\x06\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x60\x30\x18\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x06\x7c\x00\x00" - "\x30\x18\x0c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x18\x30\x60\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x00\xc6\x00\xfe\x66\x60\x60\x7c\x60\x60\x66\xfe\x00\x00\x00\x00" - "\x30\x18\x0c\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x6c\x66\x66\x66\xf6\x66\x66\x6c\x78\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x6c\x38\x10\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x02\x06\x7c\xce\xce\xde\xd6\xd6\xf6\xe6\xe6\x7c\xc0\x80\x00\x00" - "\x60\x30\x18\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x10\x38\x6c\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x0c\x18\x30\x00\xc3\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00" - "\xf0\x60\x7c\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xce\xdc\xd8\xcc\xc6\xd6\xdc\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x3b\x1b\x7e\xd8\xdc\x77\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x0c\x06\x3c\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x6c\x38\x38\x6c\x0c\x3c\x6c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x02\x06\x7c\xce\xde\xd6\xf6\xe6\x7c\xc0\x80\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\xf0\x60\x7c\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x66\x66\x00\xee\x66\x66\x66\x66\x66\x3e\x06\x0c\x38\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x36\x7f\x36\x36\x36\x7f\x36\x36\x00\x00\x00" - "\x08\x08\x3e\x63\x60\x60\x3e\x03\x03\x63\x3e\x08\x08\x00" - "\x00\x00\x00\x61\x63\x06\x0c\x18\x30\x63\x43\x00\x00\x00" - "\x00\x00\x1c\x36\x36\x1c\x3b\x6e\x66\x66\x3b\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\x7e\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x01\x03\x06\x0c\x18\x30\x60\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x63\x67\x6f\x7b\x73\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x0c\x0c\x0c\x0c\x0c\x3f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x06\x0c\x18\x30\x63\x7f\x00\x00\x00" - "\x00\x00\x3e\x63\x03\x03\x1e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x06\x0e\x1e\x36\x66\x7f\x06\x06\x0f\x00\x00\x00" - "\x00\x00\x7e\x60\x60\x60\x7e\x03\x03\x63\x3e\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7f\x63\x03\x06\x0c\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3e\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x63\x3f\x03\x03\x06\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x06\x0c\x0c\x00\x0c\x0c\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x6f\x6f\x6f\x6e\x60\x3e\x00\x00\x00" - "\x00\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x63\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x33\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x00\x00\x00" - "\x00\x00\x7c\x36\x33\x33\x33\x33\x33\x36\x7c\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x7f\x33\x30\x34\x3c\x34\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x6f\x63\x33\x1d\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x7f\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x0f\x06\x06\x06\x06\x06\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x73\x33\x36\x36\x3c\x36\x36\x33\x73\x00\x00\x00" - "\x00\x00\x78\x30\x30\x30\x30\x30\x30\x33\x7f\x00\x00\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x63\x63\x63\x63\x00\x00\x00" - "\x00\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x63\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x63\x63\x63\x6b\x3e\x1c\x06\x03\x00" - "\x00\x00\x7e\x33\x33\x33\x3e\x36\x33\x33\x73\x00\x00\x00" - "\x00\x00\x3e\x63\x63\x30\x1c\x06\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x63\x63\x63\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x63\x63\x63\x36\x1c\x36\x63\x63\x63\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x7f\x63\x06\x0c\x18\x30\x60\x63\x7f\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x40\x60\x30\x18\x0c\x06\x03\x01\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x08\x1c\x36\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x70\x30\x30\x3e\x33\x33\x33\x33\x6e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x0e\x06\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x1e\x33\x30\x7c\x30\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x70\x30\x30\x36\x3b\x33\x33\x33\x73\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x0c\x0c\x00\x1c\x0c\x0c\x0c\x0c\x0c\xcc\x78\x00" - "\x00\x00\x70\x30\x30\x33\x36\x3c\x36\x33\x73\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x7f\x6b\x6b\x6b\x6b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x33\x33\x3e\x30\x30\x78\x00" - "\x00\x00\x00\x00\x00\x3b\x66\x66\x66\x3e\x06\x06\x0f\x00" - "\x00\x00\x00\x00\x00\x6e\x33\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x38\x0e\x63\x3e\x00\x00\x00" - "\x00\x00\x00\x08\x18\x7e\x18\x18\x18\x1b\x0e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x63\x36\x1c\x08\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x36\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x00\x00\x7f\x66\x0c\x18\x33\x7f\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3e\x63\x60\x60\x63\x3e\x08\x08\x00" - "\x00\x00\x1c\x36\x30\x30\x7c\x30\x30\x73\x7e\x00\x00\x00" - "\x00\x00\x00\x42\x3c\x66\x66\x66\x3c\x42\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x7e\x18\x7e\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x3e\x63\x30\x1c\x36\x63\x63\x36\x1c\x06\x63\x3e\x00" - "\x00\x63\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x51\x51\x5d\x41\x3e\x00\x00\x00" - "\x00\x38\x04\x3c\x44\x3c\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x1b\x36\x6c\x36\x1b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x03\x03\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x41\x5d\x55\x59\x55\x41\x3e\x00\x00\x00" - "\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00" - "\x00\x38\x6c\x18\x30\x64\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x0c\x38\x0c\x6c\x38\x00\x00\x00\x00\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x60\xc0\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x0c\x06\x1c" - "\x00\x30\x70\x30\x30\x30\x78\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\x36\x1b\x36\x6c\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x33\x67\xcf\x1f\x03\x03\x00" - "\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f\x00" - "\x00\xf0\x30\x63\xf6\x6c\x18\x33\x67\xcf\x1f\x03\x03\x00" - "\x00\x00\x18\x18\x00\x18\x18\x30\x63\x63\x3e\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x3b\x6e\x00\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x63\x63\x08\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x1c\x36\x1c\x00\x1c\x36\x63\x63\x7f\x63\x63\x00\x00\x00" - "\x00\x00\x1f\x36\x66\x66\x67\x7e\x66\x66\x67\x00\x00\x00" - "\x00\x00\x1e\x33\x60\x60\x60\x60\x60\x33\x1e\x0c\x06\x1c" - "\x60\x30\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x06\x0c\x18\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x08\x1c\x36\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x00\x63\x63\x00\x7f\x33\x30\x3e\x30\x33\x7f\x00\x00\x00" - "\x60\x30\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x06\x0c\x18\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x18\x3c\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x66\x00\x3c\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x3c\x36\x33\x33\x7b\x33\x33\x36\x3c\x00\x00\x00" - "\x3b\x6e\x00\x63\x73\x7b\x7f\x6f\x67\x63\x63\x00\x00\x00" - "\x60\x30\x18\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x03\x06\x0c\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x08\x1c\x36\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x3b\x6e\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x63\x63\x00\x1c\x36\x63\x63\x63\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x63\x36\x1c\x08\x1c\x36\x63\x00\x00\x00\x00" - "\x00\x03\x1e\x36\x67\x6f\x6b\x7b\x73\x36\x3c\x60\x00\x00" - "\x60\x30\x18\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x03\x06\x0c\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x08\x1c\x36\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x63\x63\x00\x63\x63\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x06\x0c\x18\x00\x66\x66\x66\x3c\x18\x18\x3c\x00\x00\x00" - "\x00\x78\x30\x3e\x33\x33\x3e\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x1c\x36\x63\x66\x6c\x67\x63\x6b\x6e\x60\x60\x00" - "\x00\x60\x30\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x1c\x36\x1c\x00\x3c\x06\x3e\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x0b\x3b\x6e\x68\x37\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x63\x60\x60\x63\x3e\x0c\x06\x1c" - "\x00\x30\x18\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x03\x06\x0c\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x7f\x60\x63\x3e\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x36\x1c\x36\x06\x3e\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x6e\x33\x33\x33\x33\x33\x00\x00\x00" - "\x00\x60\x30\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x08\x1c\x36\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x3b\x6e\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x63\x63\x00\x3e\x63\x63\x63\x63\x3e\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x03\x3e\x67\x6f\x7b\x73\x3e\x60\x00\x00" - "\x00\x60\x30\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\x06\x0c\x18\x00\x63\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x00\x78\x30\x3e\x33\x33\x33\x33\x3e\x30\x78\x00" - "\x00\x00\x66\x66\x00\x66\x66\x66\x66\x3e\x06\x66\x3c\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\xc6\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x60\x7c\x66\x66\xdc\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x1c\x0c\x0c\x7c\xcc\xcc\x76\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\xcc\xcc\x78" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x00\x30\x30\x78\x78\x30\x00" - "\x00\x00\x10\x7c\xc0\xc0\x7c\x10" - "\x00\x38\x60\x60\xf0\x60\xfc\x00" - "\x00\xc3\x3c\x66\x66\x3c\xc3\x00" - "\x00\xcc\xcc\x78\x30\xfc\x30\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x7e\xc0\x7c\xc6\x7c\x06\xfc\x00" - "\xc6\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x82\xba\xa2\xba\x82\x7c\x00" - "\x1c\x06\x1e\x22\x1f\x3f\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xfe\x06\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x82\xba\xb2\xaa\x82\x7c\x00" - "\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x38\x00\x00\x00\x00\x00" - "\x00\x10\x7c\x10\x00\x7c\x00\x00" - "\x1c\x36\x06\x18\x3e\x00\x00\x00" - "\x1e\x02\x0e\x02\x1e\x00\x00\x00" - "\x18\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\xc0" - "\x7e\xca\xca\x7e\x0a\x0a\x0a\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x30" - "\x06\x0e\x06\x06\x06\x00\x00\x00" - "\x0e\x11\x11\x11\x0e\x1f\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x60\xe0\x66\x6c\x33\x67\x0f\x03" - "\x60\xe0\x66\x6c\x36\x6a\x04\x0e" - "\xf0\x20\x96\x6c\x33\x67\x0f\x03" - "\x30\x00\x30\x60\xc0\xcc\x78\x00" - "\x18\x0c\x30\x78\xcc\xfc\xcc\x00" - "\x60\xc0\x30\x78\xcc\xfc\xcc\x00" - "\x78\x84\x30\x78\xcc\xfc\xcc\x00" - "\x66\x98\x30\x78\xcc\xfc\xcc\x00" - "\xcc\x00\x30\x78\xcc\xfc\xcc\x00" - "\x30\x48\x30\x78\xcc\xfc\xcc\x00" - "\x3e\x78\x98\x9c\xf8\x98\x9e\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x1c\x30" - "\x30\x18\xfe\x62\x78\x62\xfe\x00" - "\x18\x30\xfe\x62\x78\x62\xfe\x00" - "\x38\x44\xfe\x62\x78\x62\xfe\x00" - "\x66\x00\xfe\x62\x78\x62\xfe\x00" - "\x60\x30\x78\x30\x30\x30\x78\x00" - "\x18\x30\x78\x30\x30\x30\x78\x00" - "\x78\x84\x78\x30\x30\x30\x78\x00" - "\xcc\x00\x78\x30\x30\x30\x78\x00" - "\x78\x6c\x66\xf6\x66\x6c\x78\x00" - "\x66\x98\xe6\xf6\xde\xce\xc6\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\x7c\xc6\xc6\xc6\x7c\x00" - "\x38\x44\x7c\xc6\xc6\xc6\x7c\x00" - "\x66\x98\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x06\x7c\xce\x9a\xb2\xe6\x78\xc0" - "\x60\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\xcc\xcc\xfc\x00" - "\x78\x84\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\x00\xcc\xcc\xcc\xcc\xfc\x00" - "\x18\x30\xcc\xcc\x78\x30\x78\x00" - "\x60\x78\x6c\x78\x60\x60\x60\x00" - "\x78\xcc\xc4\xdc\xc6\xc6\xdc\xc0" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x78\x84\x78\x0c\x7c\xcc\x76\x00" - "\x66\x98\x78\x0c\x7c\xcc\x76\x00" - "\xcc\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x48\x38\x0c\x7c\xcc\x76\x00" - "\x00\x00\xec\x32\x7e\xb0\x6e\x00" - "\x00\x00\x3c\x66\xc0\x66\x1c\x30" - "\x30\x18\x78\xcc\xfc\xc0\x78\x00" - "\x18\x30\x78\xcc\xfc\xc0\x78\x00" - "\x78\x84\x78\xcc\xfc\xc0\x78\x00" - "\xcc\x00\x78\xcc\xfc\xc0\x78\x00" - "\x60\x30\x00\x70\x30\x30\x78\x00" - "\x18\x30\x00\x70\x30\x30\x78\x00" - "\x70\x88\x00\x70\x30\x30\x78\x00" - "\xcc\x00\x00\x70\x30\x30\x78\x00" - "\x6c\x38\x6c\x0c\x6c\xcc\x78\x00" - "\x66\x98\xf8\xcc\xcc\xcc\xcc\x00" - "\x60\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x18\x30\x00\x7c\xc6\xc6\x7c\x00" - "\x38\x44\x00\x7c\xc6\xc6\x7c\x00" - "\x66\x98\x00\x7c\xc6\xc6\x7c\x00" - "\xc6\x00\x00\x7c\xc6\xc6\x7c\x00" - "\x00\x00\x18\x00\x7e\x00\x18\x00" - "\x00\x00\x06\x7c\xde\xf6\x7c\xc0" - "\x60\x30\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\x00\xcc\xcc\xcc\x76\x00" - "\x30\x48\x00\xcc\xcc\xcc\x76\x00" - "\xcc\x00\x00\xcc\xcc\xcc\x76\x00" - "\x18\x30\xcc\xcc\xcc\x7c\x0c\xf8" - "\xe0\x78\x6c\x66\x6c\x78\xe0\x00" - "\xcc\x00\xcc\xcc\xcc\x7c\x0c\xf8" - , "ISO-8859-1 West European", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xdb\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x06\x0e\x1a\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x7e\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\x7c\x38\x7c" - "\x10\x10\x38\x7c\xfe\x7c\x38\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x63\x38\x6c\x6c\x38\xcc\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\x36\x36\xf6\x36\x36\x36\x36" - "\x00\x00\x00\xfe\x36\x36\x36\x36" - "\x00\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x36\x36\x36\xfe\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x00\xff\x00\xff\x18\x18\x18\x18" - "\x00\x00\x00\xff\x36\x36\x36\x36" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\x3f\x36\x36\x36\x36" - "\x36\x36\x36\xff\x36\x36\x36\x36" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x30\x18\x0c\x06\x0c\x18\x30" - "\x00\x0c\x18\x30\x60\x30\x18\x0c" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x18\x18\x00\x7e\x00\x18\x18" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - , "Codepage 866 Russian", CIOLIB_CP866M2} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x3e\x0a\x12\x22\x78\x84\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x44\x44\x38\x10\x7c\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x20\x20\x20\x20\x60\xe0\xc0\x00\x00\x00\x00" - "\x00\x00\x3f\x21\x3f\x21\x21\x21\x21\x23\x67\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x10\x10\xd6\x38\xee\x38\xd6\x10\x10\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x00\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7f\x89\x89\x89\x79\x09\x09\x09\x09\x09\x00\x00\x00\x00" - "\x00\x7c\x86\x40\x38\x44\x82\x82\x44\x38\x04\xc2\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x7c\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x04\xfe\x04\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x20\x40\xfe\x40\x20\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x80\x80\x80\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x38\x38\x38\x10\x10\x10\x00\x10\x10\x00\x00\x00\x00" - "\x00\x42\x42\x42\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x44\x44\xfe\x44\x44\x44\xfe\x44\x44\x00\x00\x00\x00" - "\x10\x10\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x82\x84\x08\x10\x20\x42\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x38\x38\x47\x44\x44\x44\x3b\x00\x00\x00\x00" - "\x00\x20\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x20\x10\x08\x08\x08\x08\x08\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\xff\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x10\x20\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x92\x92\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x08\x18\x38\x08\x08\x08\x08\x08\x08\x3e\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x04\x08\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x02\x02\x3c\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x14\x24\x44\x84\xfe\x04\x04\x04\x0e\x00\x00\x00\x00" - "\x00\x00\xfe\x80\x80\x80\xfc\x02\x02\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x40\x80\x80\xfc\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x02\x02\x04\x08\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7c\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x7e\x02\x02\x02\x04\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x00\x00\x10\x10\x20\x00\x00\x00\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x40\x20\x10\x08\x04\x08\x10\x20\x40\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x02\x04\x08\x08\x00\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x9e\x92\x92\x8c\x80\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x42\x42\x42\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x80\x82\x42\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x44\x42\x42\x42\x42\x42\x42\x44\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x42\x42\x48\x78\x48\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x9e\x82\x82\x46\x3a\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\xfe\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x0e\x04\x04\x04\x04\x04\x84\x84\x84\x78\x00\x00\x00\x00" - "\x00\x00\xc2\x42\x42\x44\x48\x78\x44\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\xe0\x40\x40\x40\x40\x40\x40\x42\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x82\xc6\xaa\x92\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x82\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x92\x8a\x7c\x04\x02\x00\x00" - "\x00\x00\xfc\x42\x42\x42\x7c\x44\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x7c\x82\x82\x40\x30\x0c\x04\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\x92\x92\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x82\x44\x28\x10\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x44\x28\x10\x28\x44\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x82\x82\x82\x44\x38\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x04\x18\x20\x40\x82\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\xc0\x40\x40\x78\x44\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x80\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x04\x04\x3c\x44\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x84\x78\x00" - "\x00\x00\xc0\x40\x40\x7c\x42\x42\x42\x42\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x30\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x06\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00" - "\x00\x00\xc0\x40\x40\x42\x44\x48\x78\x44\x42\xc2\x00\x00\x00\x00" - "\x00\x00\x30\x10\x10\x10\x10\x10\x10\x10\x10\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x92\x92\x92\x92\x92\x92\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x42\x42\x42\x7c\x40\x40\xe0\x00" - "\x00\x00\x00\x00\x00\x76\x8c\x84\x84\x84\x84\x7c\x04\x04\x0e\x00" - "\x00\x00\x00\x00\x00\xdc\x62\x42\x40\x40\x40\xe0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x82\x80\x7c\x02\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x20\x20\x20\xf8\x20\x20\x20\x20\x22\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x92\xaa\xc6\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x44\x28\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x82\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x00\x00\x00\x00\xfe\x84\x08\x10\x20\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x10\x60\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x00\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x70\x08\x08\x08\x06\x08\x08\x08\x08\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x28\x44\x82\x82\x82\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x82\x80\x80\x80\x82\x42\x3c\x04\x02\x7c\x00\x00" - "\x00\x00\x84\x00\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x84\x84\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x38\x44\x38\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x42\x40\x40\x42\x3c\x04\x02\x3c\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x84\x00\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\xfe\x80\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x44\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x82\x00\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x38\x44\x38\x10\x28\x44\x82\x82\xfe\x82\x82\x82\x00\x00\x00\x00" - "\x08\x10\x20\xfe\x42\x40\x40\x7c\x40\x40\x42\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x8c\x52\x32\x7e\x88\x98\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x44\x84\x84\xfe\x84\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x44\x00\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x30\x48\x84\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x40\x20\x10\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x82\x00\x00\x00\x82\x82\x82\x82\x82\x7e\x02\x04\x78\x00" - "\x00\x82\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x82\x00\x82\x82\x82\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x10\x10\x38\x44\x40\x40\x40\x48\x38\x10\x10\x00\x00\x00\x00" - "\x00\x38\x44\x44\x40\xe0\x40\x40\x40\x40\x42\xfc\x00\x00\x00\x00" - "\x00\x00\x44\x44\x28\x10\x7c\x10\x7c\x10\x10\x10\x00\x00\x00\x00" - "\x00\xf8\x84\x84\xf8\x84\x84\x9e\x84\x84\x84\x86\x00\x00\x00\x00" - "\x00\x06\x09\x08\x08\x08\x3e\x08\x08\x08\x08\x08\x48\x30\x00\x00" - "\x00\x08\x10\x20\x00\x78\x04\x7c\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x18\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x7c\x82\x82\x82\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x84\x84\x84\x84\x84\x8c\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x62\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x76\xdc\x00\x82\xc2\xa2\x92\x8a\x86\x82\x82\x82\x00\x00\x00\x00" - "\x00\x3c\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x20\x20\x00\x20\x20\x40\x80\x82\x82\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x40\x9c\x02\x04\x08\x1e\x00\x00" - "\x00\x80\x80\x82\x84\x88\x10\x20\x46\x8a\x12\x3e\x02\x02\x00\x00" - "\x00\x00\x10\x10\x00\x10\x10\x10\x38\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x88\x44\x22\x44\x88\x00\x00\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x62\x94\x98\x88\x98\x94\x62\x00\x00\x00\x00" - "\x00\x00\x78\x84\x84\x84\xb8\x84\x82\x82\x82\xbc\x80\x00\x00\x00" - "\x00\x00\xfe\x82\x82\x80\x80\x80\x80\x80\x80\x80\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x44\x44\x44\x44\x44\x44\x44\x00\x00\x00\x00" - "\x00\x00\x00\xfe\x82\x40\x20\x10\x20\x40\x82\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x88\x88\x88\x88\x88\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7c\x40\x40\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x72\xd4\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x10\x38\x44\x44\x44\x38\x10\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x82\x82\xfe\x82\x82\x44\x38\x00\x00\x00\x00" - "\x00\x00\x38\x44\x82\x82\x82\x44\x28\x28\x28\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x10\x08\x04\x3e\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x99\x99\x99\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x7e\x89\x91\xa1\x7e\x40\x80\x00\x00\x00\x00" - "\x00\x00\x1c\x20\x40\x40\x78\x40\x40\x40\x20\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x82\x82\x82\x82\x82\x82\x82\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x7c\x10\x10\x00\x00\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x10\x08\x04\x02\x04\x08\x10\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x08\x10\x20\x40\x20\x10\x08\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x11\x11\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x88\x88\x70\x70\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x00\x7c\x00\x10\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x44\x44\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x08\x08\x08\x08\x08\xe8\x28\x28\x28\x18\x00\x00\x00\x00" - "\x00\xd8\x64\x44\x44\x44\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x20\x48\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xd6\x10\x10\x7c" - "\x10\x10\x38\xec\xfe\x7c\x10\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x1f\x03\x05\x7d\x84\x84\x84\x78" - "\x3e\x41\x41\x41\x3e\x08\x3e\x08" - "\x3f\x21\x3f\x20\x20\x20\x60\xc0" - "\x3f\x21\x3f\x21\x21\x23\x66\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x10\x38\x7c\x10\x10\x7c\x38\x10" - "\x24\x24\x24\x24\x24\x00\x24\x00" - "\x7f\x92\x92\x72\x12\x12\x12\x00" - "\x3e\x61\x38\x44\x44\x38\x8c\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x10\x38\x7c\x10\x7c\x38\x10\xfe" - "\x10\x38\x7c\x10\x10\x10\x10\x00" - "\x10\x10\x10\x10\x7c\x38\x10\x00" - "\x00\x08\x04\xfe\x04\x08\x00\x00" - "\x00\x20\x40\xfe\x40\x20\x00\x00" - "\x00\x00\x80\x80\x80\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x38\x38\x10\x10\x00\x10\x00" - "\x24\x24\x24\x00\x00\x00\x00\x00" - "\x24\x24\xff\x24\xff\x24\x24\x00" - "\x10\x7c\x80\x78\x04\xf8\x10\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x44\x38\x56\x84\x84\x76\x00" - "\x20\x20\x40\x00\x00\x00\x00\x00" - "\x10\x20\x40\x40\x40\x20\x10\x00" - "\x20\x10\x08\x08\x08\x10\x20\x00" - "\x00\x44\x38\xfe\x38\x44\x00\x00" - "\x00\x10\x10\xfe\x10\x10\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x20" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x10\x00" - "\x02\x04\x08\x10\x20\x40\x80\x00" - "\x7c\x82\x86\x8a\x92\xa2\x7c\x00" - "\x10\x30\x10\x10\x10\x10\x7c\x00" - "\x78\x84\x04\x10\x40\x84\xfc\x00" - "\x78\x84\x04\x38\x04\x84\x78\x00" - "\x08\x18\x28\x48\xfe\x08\x1c\x00" - "\xfc\x80\xf8\x04\x04\x84\x78\x00" - "\x38\x40\x80\xf8\x84\x84\x78\x00" - "\xfc\x84\x08\x10\x20\x20\x20\x00" - "\x78\x84\x84\x78\x84\x84\x78\x00" - "\x78\x84\x84\x7c\x04\x08\x70\x00" - "\x00\x10\x10\x00\x00\x10\x10\x00" - "\x00\x10\x10\x00\x00\x10\x10\x20" - "\x10\x20\x40\x80\x40\x20\x10\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x20\x10\x08\x04\x08\x10\x20\x00" - "\x78\x84\x04\x08\x10\x00\x10\x00" - "\x7c\x82\x9e\x92\x9e\x80\x78\x00" - "\x30\x48\x84\x84\xfc\x84\x84\x00" - "\xfc\x42\x42\x7c\x42\x42\xfc\x00" - "\x3c\x42\x80\x80\x80\x42\x3c\x00" - "\xf8\x44\x42\x42\x42\x44\xf8\x00" - "\xfe\x42\x48\x78\x48\x42\xfe\x00" - "\xfe\x42\x48\x78\x48\x40\xe0\x00" - "\x3c\x42\x80\x80\x8e\x42\x3e\x00" - "\x84\x84\x84\xfc\x84\x84\x84\x00" - "\x38\x10\x10\x10\x10\x10\x38\x00" - "\x0e\x04\x04\x04\x44\x44\x38\x00" - "\xc2\x44\x48\x70\x44\x42\xc2\x00" - "\xe0\x40\x40\x40\x40\x42\xfe\x00" - "\x82\xc6\xaa\x92\x82\x82\x82\x00" - "\x82\xc2\xa2\x92\x8a\x86\x82\x00" - "\x38\x44\x82\x82\x82\x44\x38\x00" - "\xfc\x42\x42\x7c\x40\x40\xe0\x00" - "\x38\x44\x82\x82\x82\x54\x38\x04" - "\xfc\x42\x42\x7c\x44\x42\xc2\x00" - "\x38\x84\x80\x78\x04\x84\x74\x00" - "\xfe\x92\x10\x10\x10\x10\x38\x00" - "\x84\x84\x84\x84\x84\x84\xfc\x00" - "\x84\x84\x84\x84\x84\x48\x30\x00" - "\x82\x82\x82\x92\xaa\xc6\x82\x00" - "\x82\x44\x28\x10\x28\x44\x82\x00" - "\x82\x44\x28\x10\x10\x10\x38\x00" - "\xfe\x84\x88\x10\x22\x42\xfe\x00" - "\x78\x40\x40\x40\x40\x40\x78\x00" - "\x80\x40\x20\x10\x08\x04\x02\x00" - "\x78\x08\x08\x08\x08\x08\x78\x00" - "\x10\x28\x44\x82\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x20\x20\x10\x00\x00\x00\x00\x00" - "\x00\x00\x78\x04\x7c\x84\x76\x00" - "\xc0\x40\x7c\x42\x42\x42\xdc\x00" - "\x00\x00\x78\x84\x80\x84\x78\x00" - "\x0c\x04\x7c\x84\x84\x84\x76\x00" - "\x00\x00\x78\x84\xfc\x80\x78\x00" - "\x38\x44\x40\xe0\x40\x40\xe0\x00" - "\x00\x00\x76\x84\x84\x7c\x04\xf8" - "\xc0\x40\x4c\x62\x42\x42\xc2\x00" - "\x10\x00\x30\x10\x10\x10\x38\x00" - "\x04\x00\x04\x04\x04\x84\x84\x78" - "\xc0\x40\x42\x44\x78\x44\xc2\x00" - "\x30\x10\x10\x10\x10\x10\x38\x00" - "\x00\x00\xec\x92\x92\x92\x82\x00" - "\x00\x00\xf8\x84\x84\x84\x84\x00" - "\x00\x00\x78\x84\x84\x84\x78\x00" - "\x00\x00\xdc\x42\x42\x7c\x40\xe0" - "\x00\x00\x76\x84\x84\x7c\x04\x0e" - "\x00\x00\xdc\x62\x40\x40\xe0\x00" - "\x00\x00\x7c\x80\x78\x04\xf8\x00" - "\x10\x10\x7c\x10\x10\x12\x0c\x00" - "\x00\x00\x84\x84\x84\x84\x76\x00" - "\x00\x00\x84\x84\x84\x48\x30\x00" - "\x00\x00\x82\x92\xaa\xc6\x82\x00" - "\x00\x00\x84\x48\x30\x48\x84\x00" - "\x00\x00\x84\x84\x84\x7c\x04\xf8" - "\x00\x00\xfc\x88\x30\x44\xfc\x00" - "\x18\x20\x20\xc0\x20\x20\x18\x00" - "\x10\x10\x10\x00\x10\x10\x10\x00" - "\x60\x10\x10\x0c\x10\x10\x60\x00" - "\x64\x98\x00\x00\x00\x00\x00\x00" - "\x00\x10\x28\x44\x82\x82\xfe\x00" - "\x78\x84\x80\x84\x78\x18\x04\x78" - "\x00\x84\x00\x84\x84\x84\x7a\x00" - "\x0c\x00\x78\x84\xfc\x80\x78\x00" - "\x7e\x81\x3c\x02\x3e\x42\x3d\x00" - "\x84\x00\x78\x04\x7c\x84\x7a\x00" - "\xc0\x00\x78\x04\x7c\x84\x7a\x00" - "\x20\x20\x78\x04\x7c\x84\x7a\x00" - "\x00\x00\x78\x80\x80\x78\x04\x38" - "\x7e\x81\x3c\x42\x7e\x40\x3c\x00" - "\x84\x00\x78\x84\xfc\x80\x78\x00" - "\x60\x00\x78\x84\xfc\x80\x78\x00" - "\x48\x00\x30\x10\x10\x10\x38\x00" - "\x7c\x82\x30\x10\x10\x10\x38\x00" - "\x60\x00\x30\x10\x10\x10\x38\x00" - "\x82\x38\x44\x82\xfe\x82\x82\x00" - "\x30\x10\x44\x82\xfe\x82\x82\x00" - "\x0c\xfc\x40\x78\x40\x40\xfc\x00" - "\x00\x00\x67\x19\x7f\x98\x77\x00" - "\x3f\x48\x88\xff\x88\x88\x8f\x00" - "\x78\x84\x78\x84\x84\x84\x78\x00" - "\x84\x00\x78\x84\x84\x84\x78\x00" - "\xc0\x00\x78\x84\x84\x84\x78\x00" - "\x7e\x81\x42\x42\x42\x42\x3c\x00" - "\x20\x10\x42\x42\x42\x42\x3c\x00" - "\x84\x00\x84\x84\x84\x7c\x04\xf8" - "\x42\x18\x24\x42\x42\x24\x18\x00" - "\x84\x00\x84\x84\x84\x84\x78\x00" - "\x10\x10\x7e\x80\x80\x7e\x10\x10" - "\x38\x44\x44\xe0\x40\x82\xfc\x00" - "\x44\x28\x10\x7c\x10\x7c\x10\x10" - "\xf8\x84\x84\xf8\x82\x87\x82\x83" - "\x0c\x12\x10\x38\x10\x10\x90\x60" - "\x1c\x00\x78\x04\x7c\x84\x7a\x00" - "\x18\x00\x30\x10\x10\x10\x38\x00" - "\x08\x10\x78\x84\x84\x84\x78\x00" - "\x08\x10\x84\x84\x84\x84\x7a\x00" - "\x64\x98\xb8\xc4\x84\x84\x84\x00" - "\x64\x98\x84\xa4\x94\x84\x84\x00" - "\x3c\x44\x44\x3a\x00\x7e\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x20\x00\x20\x40\x80\x84\x78\x00" - "\x00\x00\x00\xfc\xc0\xc0\x00\x00" - "\x00\x00\x00\xfc\x0c\x0c\x00\x00" - "\x42\x44\x48\x56\x69\x42\x84\x0f" - "\x42\x44\x48\x53\x65\x49\x8f\x01" - "\x10\x10\x00\x10\x38\x38\x10\x00" - "\x00\x22\x44\x88\x44\x22\x00\x00" - "\x00\x44\x22\x11\x22\x44\x00\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x62\x94\x88\x94\x62\x00" - "\x00\x78\x84\xf8\x84\xf8\x80\x80" - "\x00\xfc\x84\x80\x80\x80\x80\x00" - "\x00\xfe\x28\x28\x28\x28\x28\x00" - "\xfc\x84\x40\x20\x40\x84\xfc\x00" - "\x00\x00\x7e\x88\x88\x88\x70\x00" - "\x00\x42\x42\x42\x42\x7c\x40\x80" - "\x00\x76\x88\x08\x08\x08\x08\x00" - "\xf8\x20\x70\x88\x88\x70\x20\xf8" - "\x38\x44\x82\xfe\x82\x44\x38\x00" - "\x38\x44\x82\x82\x28\x28\x6c\x00" - "\x1c\x10\x08\x7c\x84\x84\x78\x00" - "\x00\x00\x7c\x92\x92\x7c\x00\x00" - "\x02\x04\x7e\x89\x91\x7e\x40\x80" - "\x38\x40\x80\xf8\x80\x40\x38\x00" - "\x78\x84\x84\x84\x84\x84\x84\x00" - "\x00\xfc\x00\xfc\x00\xfc\x00\x00" - "\x20\x20\xfc\x20\x20\x00\xfc\x00" - "\x40\x20\x10\x20\x40\x00\xfc\x00" - "\x10\x20\x40\x20\x10\x00\xfc\x00" - "\x0e\x11\x11\x10\x10\x10\x10\x10" - "\x08\x08\x08\x08\x08\x88\x88\x70" - "\x20\x20\x00\xf8\x00\x20\x20\x00" - "\x00\x64\x98\x00\x64\x98\x00\x00" - "\x38\x44\x44\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x07\x04\x04\x04\x64\x24\x1c\x0c" - "\x58\x44\x44\x44\x44\x00\x00\x00" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 437 English, (thin)", CIOLIB_CP437} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00" - "\x00\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x66\xff\xff\xff\xff\x7e\x7e\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\xff\x7e\x7e\x3c\x3c\x18\x18\x00" - "\x00\x00\x00\x18\x3c\x3c\x18\x66\xff\xff\x66\x18\x3c\x7e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\xff\xff\xff\x7e\x18\x3c\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x00\x3f\x33\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x00\x7f\x63\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\xf8\xfe\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x02\x06\x0e\x3e\xfe\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\xfe\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x18\x3c\x7e\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\xff\x7e\x3c\x18\x00" - "\x00\x00\x00\x00\x00\x08\x0c\x0e\xff\x0e\x0c\x08\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x30\x70\xff\x70\x30\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x24\x66\xff\x66\x24\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x3c\x3c\x3c\x3c\x18\x18\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x63\x63\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x00\x00" - "\x00\x18\x7e\xdb\xdb\xe8\x78\x3c\x1e\x17\xdb\xdb\x7e\x18\x18\x00" - "\x00\xe6\xa6\xec\x0c\x18\x18\x30\x30\x60\x6e\xca\xce\x00\x00\x00" - "\x00\x38\x6c\x6c\x6c\x38\x38\x6d\xcd\xc6\xc6\xcb\x73\x00\x00\x00" - "\x00\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\xff\xff\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x30\x60\xc3\xff\x00\x00\x00" - "\x00\xfe\xc6\x0c\x18\x3c\x06\x03\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcd\xff\x0d\x0c\x1e\x00\x00\x00" - "\x00\xfe\xc0\xc0\xc0\xfc\xe6\xc3\x03\x03\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc6\xc0\xfc\xe6\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\xc6\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x66\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\x67\x3f\x03\x63\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x03\x06\x0c\x18\x30\x70\x30\x18\x0c\x06\x03\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\x03\x06\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x7e\xc3\xc3\xdf\xdb\xdb\xde\xc0\xc0\x7c\x00\x00\x00" - "\x00\x10\x38\x7c\xee\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x7e\x63\x63\x63\x63\x63\xfe\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xc0\xc0\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfc\x66\x63\x63\x63\x63\x63\x63\x63\x63\x66\xfc\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xff\x63\x61\x60\x64\x7c\x64\x60\x60\x60\x60\xf8\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc0\xc0\xcf\xc3\xc3\xc3\x67\x3d\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x0f\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xe3\x63\x66\x66\x6c\x7c\x6c\x66\x66\x63\x63\xe3\x00\x00\x00" - "\x00\xf0\x60\x60\x60\x60\x60\x60\x60\x60\x61\x63\xff\x00\x00\x00" - "\x00\xc3\xe7\xff\xff\xdb\xdb\xdb\xc3\xc3\xc3\xc3\xc3\x00\x00\x00" - "\x00\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\x66\x3c\x00\x00\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x3c\x66\xc3\xc3\xc3\xc3\xc3\xc3\xcb\xcf\x7e\x3c\x06\x07\x00" - "\x00\xfe\x63\x63\x63\x63\x63\x7e\x6c\x66\x66\x66\xf7\x00\x00\x00" - "\x00\x7e\xc3\xc3\xc0\xc0\x7e\x03\x03\x03\xc3\xc3\x7e\x00\x00\x00" - "\x00\xff\xdb\x99\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x38\x10\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xdb\xdb\xdb\xdb\xdb\xff\x66\x66\x00\x00\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\xc3\xc3\xc3\xc3\xe7\x7e\x3c\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\xfe\xc6\x8c\x0c\x18\x18\x30\x30\x60\x62\xc6\xfe\x00\x00\x00" - "\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00\x00" - "\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x18\x3c\x66\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x06\x3e\x66\x66\x66\x66\x3b\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x7e\x63\x63\x63\x63\x63\x63\xde\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x0e\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x3c\x66\x66\x60\xf0\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\xe0\x60\x60\x60\x7c\x66\x66\x66\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c" - "\x00\xe0\x60\x60\x60\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xe6\xff\xdb\xdb\xdb\xc3\xc3\xc3\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xde\x63\x63\x63\x63\x63\x63\x7e\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x7b\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x0f" - "\x00\x00\x00\x00\x00\xde\x73\x63\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\x70\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7b\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xee\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc3\xc3\xdb\xdb\xdb\xdb\xff\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\x7c\x38\x38\x7c\xee\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x0c\x18\x70" - "\x00\x00\x00\x00\x00\xfe\xc6\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x70\x18\x18\x18\x18\x1e\x1e\x18\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\xfe\x62\x62\x60\x60\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x66\x66\xff\xc3\x81\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xd6\xd6\x54\x54\x7c\x7c\x54\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x38\x38\xc6\xc6\xce\xce\xd6\xe6\xe6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\xdb\x7e\x18\x3c\x00\x00\x00" - "\x00\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00\x00\x00" - "\x00\x00\x00\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03\x03\x00" - "\x00\x00\x00\xf8\xb0\x30\x30\x3c\x36\x36\x36\x36\x7c\x00\x00\x00" - "\x00\x00\x00\xc3\xc3\xc3\xc3\xf3\xdb\xdb\xdb\xdb\xf3\x00\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x7c\x66\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x78\xcc\x06\x26\x3e\x26\x06\x06\xcc\x78\x00\x00\x00" - "\x00\x00\x00\xce\xdb\xdb\xdb\xfb\xdb\xdb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x3f\x66\x66\x66\x3e\x3e\x66\x66\x66\xe7\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x02\x06\x3c\x60\x60\x7c\x66\x66\x66\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\x66\x66\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x32\x32\x30\x30\x30\x78\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x36\x66\x66\x66\xff\xc3\xc3\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\x54\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x06\x0c\x06\x66\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x38\x38\xc6\xc6\xce\xd6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xe6\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1e\x36\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10\x82\x10" - "\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18\xc3\x18" - "\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13\xd8\x83\xda\x13" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x3c\x18\x7e\xdb\xdb\xdb\xdb\x7e\x18\x18\x3c" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x06\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x03\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xb0\x30\x3e\x33\x33\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xf6\xde\xde\xf6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf0\x60\x60\x7c\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3e\x67\x03\x1f\x03\x67\x3e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xce\xdb\xdb\xfb\xdb\xdb\xce\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xcc\xcc\xfc\x6c\xcc\xce\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\xfe\x66\x60\x7c\x60\x60\x66\xfe\x00\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x7e\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x7c\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xf8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x7e\x7e\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x00\x3c\x42\x99\xa1\xa1\x99\x42\x3c\x00\x00\x00\x00\x00" - "\x00\x70\x88\x10\x60\x88\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x42\x7e\x00\x00\x00" - , NULL, NULL, "Codepage 866 (b) Russian", CIOLIB_CP866M2} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x36\x32\x30\x78\x30\x30\x30\x30\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x18\x70\x00\x00" - "\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xcc\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x18\x70\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\x36\x36\x7e\xd8\xd8\x6e\x00\x00\x00\x00" - "\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xcc\xce\x00\x00\x00\x00" - "\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xce\xd6\xe6\xc6\x7c\x00\x00\x00\x00" - "\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xe6\xfc\x00\x00\x00\x00" - "\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00\x00\x00" - "\x00\xf8\xcc\xcc\xf8\xc4\xcc\xde\xcc\xcc\xcc\xc6\x00\x00\x00\x00" - "\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x30\x60\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x30\x30\x00\x30\x30\x60\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\xc0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x06\x00\x00\x00\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x60\xdc\x86\x0c\x18\x3e\x00\x00" - "\x00\x60\xe0\x62\x66\x6c\x18\x30\x66\xce\x9a\x3f\x06\x06\x00\x00" - "\x00\x00\x18\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\xc6\x7c\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xd8\xdc\x76\x00\x00\x00\x00" - "\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xc6\xcc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x60\x30\x18\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\xd8\x70\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x7c\x60\x60\xc0\x00" - "\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x7e\x18\x3c\x66\x66\x66\x66\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\x6c\xee\x00\x00\x00\x00" - "\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xdb\xdb\xdb\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00\x00\x00" - "\x00\x00\x1c\x30\x60\x60\x7c\x60\x60\x60\x30\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x6c\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x81\xa5\x81\x81\xbd\x99\x81\x7e\x00\x00" - "\x00\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff" - "\x00\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00" - "\x00\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00" - "\x00\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00" - "\x00\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00" - "\x00\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00" - "\x00\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18" - "\x00\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00" - "\x00\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00" - "\x00\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00" - "\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xd6\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00" - "\x00\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00" - "\x00\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00" - "\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00" - "\x00\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00" - "\x00\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00" - "\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0e\x00" - "\x00\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\xc6\xc6\xc6\x7c\x38\x7c\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00" - "\x00\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00" - "\x00\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff" - "\x00\x30\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x1c\x36\x32\x30\x7c\x30\x30\x30\x78\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78" - "\x00\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00" - "\x00\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c" - "\x00\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00" - "\x00\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0" - "\x00\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e" - "\x00\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x6c\x38\x10\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00" - "\x00\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00" - "\x00\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00" - "\x00\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x0c\x78" - "\x00\x00\x00\xcc\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x38\x6c\x38\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00" - "\x00\x00\x00\x66\x00\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x18\x3c\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\xc6\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x38\x6c\x38\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00" - "\x0c\x18\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\x36\x76\xdc\xd8\x6e\x00\x00" - "\x00\x00\x00\x3e\x6c\xcc\xcc\xfe\xcc\xcc\xcc\xce\x00\x00" - "\x00\x00\x10\x38\x6c\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\xc6\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x60\x30\x18\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x30\x78\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x60\x30\x18\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\xc6\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\x78" - "\x00\xc6\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\xc6\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xce\xde\xf6\xe6\x7c\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xe6\xfc\x00\x00" - "\x00\x00\x04\x7c\xce\xce\xd6\xd6\xd6\xe6\xe6\x7c\x40\x00" - "\x00\x00\xfc\x66\x66\x7c\x62\x66\x6f\x66\x66\xf3\x00\x00" - "\x00\x00\x0e\x1b\x18\x18\x18\x7e\x18\x18\x18\xd8\x70\x00" - "\x00\x00\x0c\x18\x30\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x38\x18\x18\x18\x18\x3c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00" - "\x00\x00\x0c\x18\x30\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00" - "\x00\x00\x00\x76\xdc\x00\xdc\x66\x66\x66\x66\x66\x00\x00" - "\x76\xdc\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00" - "\x00\x00\x3c\x6c\x6c\x3e\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x00\x7c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x30\x30\x00\x30\x30\x60\xc6\xc6\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x06\x06\x06\x00\x00\x00" - "\x00\x00\x60\xe0\x63\x66\x6c\x18\x30\x6e\xc3\x06\x0c\x1f" - "\x00\x00\x60\xe0\x63\x66\x6c\x1a\x36\x6e\xda\x3f\x06\x06" - "\x00\x00\x00\x18\x18\x00\x18\x18\x3c\x3c\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x7c\xc6\xc6\xc6\x7c\xc6\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x76\xdc\xd8\xd8\xdc\x76\x00\x00" - "\x00\x00\x00\x78\xcc\xcc\xcc\xd8\xcc\xc6\xc6\xcc\x00\x00" - "\x00\x00\x00\xfe\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x6c\x6c\x6c\x6c\x6c\x00\x00" - "\x00\x00\x00\xfe\xc6\x60\x30\x18\x30\x60\xc6\xfe\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xd8\xd8\xd8\xd8\x70\x00\x00" - "\x00\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x7c\x60\xc0" - "\x00\x00\x00\x00\x00\x76\xdc\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x7e\x18\x3c\x66\x66\x66\x3c\x18\x7e\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xfe\xc6\xc6\x6c\x38\x00\x00" - "\x00\x00\x00\x38\x6c\xc6\xc6\xc6\x6c\x6c\x6c\xee\x00\x00" - "\x00\x00\x00\x1e\x30\x18\x0c\x3e\x66\x66\x66\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xdb\xdb\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x03\x06\x7e\xdb\xdb\xf3\x7e\x60\xc0\x00\x00" - "\x00\x00\x00\x1e\x30\x60\x60\x7e\x60\x60\x30\x1e\x00\x00" - "\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xfe\x00\x00\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x7e\x00\x00" - "\x00\x00\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x7e\x00\x00" - "\x00\x00\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x7e\x00\x00" - "\x00\x00\x0e\x1b\x1b\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xd8\xd8\x70\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x00\x7e\x00\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xdc\x00\x76\xdc\x00\x00\x00\x00" - "\x00\x38\x6c\x6c\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00" - "\x00\x6c\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x0c\x18\x32\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x7e\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\xd6\x10\x38" - "\x10\x38\x7c\xfe\xfe\x7c\x10\x38" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x18\xdb\x3c\xe7\xe7\x3c\xdb\x18" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x61\x3c\x66\x66\x3c\x86\x7c" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x18\x18\x00\x18\x00" - "\x66\x66\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x38\x6c\xc6\xd6\xc6\x6c\x38\x00" - "\x18\x38\x18\x18\x18\x18\x7e\x00" - "\x7c\xc6\x06\x1c\x30\x66\xfe\x00" - "\x7c\xc6\x06\x3c\x06\xc6\x7c\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfe\xc0\xc0\xfc\x06\xc6\x7c\x00" - "\x38\x60\xc0\xfc\xc6\xc6\x7c\x00" - "\xfe\xc6\x0c\x18\x30\x30\x30\x00" - "\x7c\xc6\xc6\x7c\xc6\xc6\x7c\x00" - "\x7c\xc6\xc6\x7e\x06\x0c\x78\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x7c\xc6\x0c\x18\x18\x00\x18\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x38\x6c\xc6\xfe\xc6\xc6\xc6\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3a\x00" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x7c\xc6\xc6\xc6\xc6\xce\x7c\x0e" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x3c\x66\x30\x18\x0c\x66\x3c\x00" - "\x7e\x7e\x5a\x18\x18\x18\x3c\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00" - "\xc6\xc6\xc6\xd6\xd6\xfe\x6c\x00" - "\xc6\xc6\x6c\x38\x6c\xc6\xc6\x00" - "\x66\x66\x66\x3c\x18\x18\x3c\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\xe0\x60\x7c\x66\x66\x66\xdc\x00" - "\x00\x00\x7c\xc6\xc0\xc6\x7c\x00" - "\x1c\x0c\x7c\xcc\xcc\xcc\x76\x00" - "\x00\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x3c\x66\x60\xf8\x60\x60\xf0\x00" - "\x00\x00\x76\xcc\xcc\x7c\x0c\xf8" - "\xe0\x60\x6c\x76\x66\x66\xe6\x00" - "\x18\x00\x38\x18\x18\x18\x3c\x00" - "\x06\x00\x06\x06\x06\x66\x66\x3c" - "\xe0\x60\x66\x6c\x78\x6c\xe6\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\xec\xfe\xd6\xd6\xd6\x00" - "\x00\x00\xdc\x66\x66\x66\x66\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x00\x00\xdc\x66\x66\x7c\x60\xf0" - "\x00\x00\x76\xcc\xcc\x7c\x0c\x1e" - "\x00\x00\xdc\x76\x60\x60\xf0\x00" - "\x00\x00\x7e\xc0\x7c\x06\xfc\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x00\x00\xc6\xc6\xc6\x6c\x38\x00" - "\x00\x00\xc6\xd6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\x00\x00\x7e\x4c\x18\x32\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x7c\xc6\xc0\xc0\xc6\x7c\x0c\x78" - "\xcc\x00\xcc\xcc\xcc\xcc\x76\x00" - "\x0c\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x7c\x82\x78\x0c\x7c\xcc\x76\x00" - "\xc6\x00\x78\x0c\x7c\xcc\x76\x00" - "\x30\x18\x78\x0c\x7c\xcc\x76\x00" - "\x30\x30\x78\x0c\x7c\xcc\x76\x00" - "\x00\x00\x7e\xc0\xc0\x7e\x0c\x38" - "\x7c\x82\x7c\xc6\xfe\xc0\x7c\x00" - "\xc6\x00\x7c\xc6\xfe\xc0\x7c\x00" - "\x30\x18\x7c\xc6\xfe\xc0\x7c\x00" - "\x66\x00\x38\x18\x18\x18\x3c\x00" - "\x7c\x82\x38\x18\x18\x18\x3c\x00" - "\x30\x18\x00\x38\x18\x18\x3c\x00" - "\xc6\x38\x6c\xc6\xfe\xc6\xc6\x00" - "\x38\x6c\x7c\xc6\xfe\xc6\xc6\x00" - "\x18\x30\xfe\xc0\xf8\xc0\xfe\x00" - "\x00\x00\x7e\x12\xfe\x90\xfe\x00" - "\x3e\x6c\xcc\xfe\xcc\xcc\xce\x00" - "\x7c\x82\x7c\xc6\xc6\xc6\x7c\x00" - "\xc6\x00\x7c\xc6\xc6\xc6\x7c\x00" - "\x30\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x78\x84\x00\xcc\xcc\xcc\x76\x00" - "\x60\x30\xcc\xcc\xcc\xcc\x76\x00" - "\xc6\x00\xc6\xc6\xc6\x7e\x06\xfc" - "\xc6\x38\x6c\xc6\xc6\x6c\x38\x00" - "\xc6\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x00\x02\x7c\xce\xd6\xe6\x7c\x80" - "\x38\x6c\x64\xf0\x60\x66\xfc\x00" - "\x3a\x6c\xce\xd6\xe6\x6c\xb8\x00" - "\xf8\xcc\xcc\xfa\xc6\xcf\xc6\xc7" - "\x0e\x1b\x18\x3c\x18\xd8\x70\x00" - "\x18\x30\x78\x0c\x7c\xcc\x76\x00" - "\x0c\x18\x00\x38\x18\x18\x3c\x00" - "\x0c\x18\x7c\xc6\xc6\xc6\x7c\x00" - "\x18\x30\xcc\xcc\xcc\xcc\x76\x00" - "\x76\xdc\x00\xdc\x66\x66\x66\x00" - "\x76\xdc\x00\xe6\xf6\xde\xce\x00" - "\x3c\x6c\x6c\x3e\x00\x7e\x00\x00" - "\x38\x6c\x6c\x38\x00\x7c\x00\x00" - "\x18\x00\x18\x18\x30\x63\x3e\x00" - "\x00\x00\x00\xfe\xc0\xc0\x00\x00" - "\x00\x00\x00\xfe\x06\x06\x00\x00" - "\x63\xe6\x6c\x7e\x33\x66\xcc\x0f" - "\x63\xe6\x6c\x7a\x36\x6a\xdf\x06" - "\x18\x00\x18\x18\x3c\x3c\x18\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\x22\x88\x22\x88\x22\x88\x22\x88" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x18\x18\x18" - "\x18\x18\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\x36\x36\xf6\x36\x36\x36" - "\x00\x00\x00\x00\xfe\x36\x36\x36" - "\x00\x00\xf8\x18\xf8\x18\x18\x18" - "\x36\x36\xf6\x06\xf6\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\xfe\x06\xf6\x36\x36\x36" - "\x36\x36\xf6\x06\xfe\x00\x00\x00" - "\x36\x36\x36\x36\xfe\x00\x00\x00" - "\x18\x18\xf8\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\xf8\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x00\x00\x00" - "\x18\x18\x18\x18\xff\x00\x00\x00" - "\x00\x00\x00\x00\xff\x18\x18\x18" - "\x18\x18\x18\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x18\x18\xff\x18\x18\x18" - "\x18\x18\x1f\x18\x1f\x18\x18\x18" - "\x36\x36\x36\x36\x37\x36\x36\x36" - "\x36\x36\x37\x30\x3f\x00\x00\x00" - "\x00\x00\x3f\x30\x37\x36\x36\x36" - "\x36\x36\xf7\x00\xff\x00\x00\x00" - "\x00\x00\xff\x00\xf7\x36\x36\x36" - "\x36\x36\x37\x30\x37\x36\x36\x36" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x36\x36\xf7\x00\xf7\x36\x36\x36" - "\x18\x18\xff\x00\xff\x00\x00\x00" - "\x36\x36\x36\x36\xff\x00\x00\x00" - "\x00\x00\xff\x00\xff\x18\x18\x18" - "\x00\x00\x00\x00\xff\x36\x36\x36" - "\x36\x36\x36\x36\x3f\x00\x00\x00" - "\x18\x18\x1f\x18\x1f\x00\x00\x00" - "\x00\x00\x1f\x18\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x3f\x36\x36\x36" - "\x36\x36\x36\x36\xff\x36\x36\x36" - "\x18\x18\xff\x18\xff\x18\x18\x18" - "\x18\x18\x18\x18\xf8\x00\x00\x00" - "\x00\x00\x00\x00\x1f\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x00\x00\x76\xdc\xc8\xdc\x76\x00" - "\x78\xcc\xcc\xd8\xcc\xc6\xcc\x00" - "\xfe\xc6\xc0\xc0\xc0\xc0\xc0\x00" - "\x00\x00\xfe\x6c\x6c\x6c\x6c\x00" - "\xfe\xc6\x60\x30\x60\xc6\xfe\x00" - "\x00\x00\x7e\xd8\xd8\xd8\x70\x00" - "\x00\x00\x66\x66\x66\x66\x7c\xc0" - "\x00\x76\xdc\x18\x18\x18\x18\x00" - "\x7e\x18\x3c\x66\x66\x3c\x18\x7e" - "\x38\x6c\xc6\xfe\xc6\x6c\x38\x00" - "\x38\x6c\xc6\xc6\x6c\x6c\xee\x00" - "\x0e\x18\x0c\x3e\x66\x66\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x00\x00" - "\x06\x0c\x7e\xdb\xdb\x7e\x60\xc0" - "\x1e\x30\x60\x7e\x60\x30\x1e\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\x00" - "\x00\xfe\x00\xfe\x00\xfe\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x30\x18\x0c\x18\x30\x00\x7e\x00" - "\x0c\x18\x30\x18\x0c\x00\x7e\x00" - "\x0e\x1b\x1b\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xd8\xd8\x70" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\x76\xdc\x00\x76\xdc\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x00\x18\x00\x00\x00\x00" - "\x0f\x0c\x0c\x0c\xec\x6c\x3c\x1c" - "\x6c\x36\x36\x36\x36\x00\x00\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x00\x00\x3c\x3c\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - , "Codepage 865 Norwegian", CIOLIB_CP865} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x81\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xdb\xe7\xff\xff\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x06\x0e\x1a\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x30\x70\xf0\xe0\x00\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00\x00" - "\x00\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00\x00" - "\x00\x80\xc0\xe0\xf0\xf8\xfe\xf8\xf0\xe0\xc0\x80\x00\x00\x00\x00" - "\x00\x02\x06\x0e\x1e\x3e\xfe\x3e\x1e\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x1b\x00\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x06\x86\xc6\x7c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x60\xc6\x86\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xd6\xd6\xc6\xc6\x6c\x38\x00\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x0c\x1e\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x06\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x18\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\x66\xfc\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\xc6\x66\x3a\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\xe6\x66\x66\x6c\x78\x78\x6c\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xd6\xfe\xee\x6c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x7c\x38\x38\x7c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\x86\x0c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x78\x6c\x66\xe6\x00\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xd6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x60\x38\x0c\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x36\x1c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x66\x3c\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xd6\xfe\x6c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x60\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x18\x0e\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x18\x70\x00\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x04\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\xe0\xe0\x60\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x78\xcc\x06\x06\x1e\x1e\x06\x06\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc2\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1c\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf8\xd8\xcc\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\x66\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc2\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x04\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x66\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xb6\xe6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x06\x1e\x06\xc6\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\xb6\x9c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00\x00" - "\x66\x66\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xc6\xfc\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xf8\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf0\xc0\xc6\x7c\x00\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x6c\x3c\x1c\x00\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xa2\xaa\xba\x82\x7c\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7e\x81\xa5\x81\x81\xa5\x99\x81\x7e\x00\x00\x00" - "\x00\x00\x7e\xff\xdb\xff\xff\xc3\xe7\xff\x7e\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00" - "\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\xe7\xe7\xe7\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\xff\xff\x7e\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00" - "\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x32\x78\xcc\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x00\x00\x00" - "\x00\x00\x3f\x33\x3f\x30\x30\x30\x70\xf0\xe0\x00\x00\x00" - "\x00\x00\x7f\x63\x7f\x63\x63\x63\x67\xe7\xe6\xc0\x00\x00" - "\x00\x00\x18\x18\xdb\x3c\xe7\x3c\xdb\x18\x18\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\xf8\xfe\xf8\xe0\xc0\x80\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x3e\xfe\x3e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00" - "\x00\x00\x7f\xdb\xdb\xdb\x7b\x1b\x1b\x1b\x1b\x00\x00\x00" - "\x00\x7c\xc6\x60\x38\x6c\xc6\xc6\x6c\x38\x0c\xc6\x7c\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x7e\x3c\x18\x7e\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x18\x0c\xfe\x0c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x30\x60\xfe\x60\x30\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xc0\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x28\x6c\xfe\x6c\x28\x00\x00\x00\x00\x00" - "\x00\x00\x00\x10\x38\x38\x7c\x7c\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x00\xfe\xfe\x7c\x7c\x38\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x3c\x3c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x66\x66\x66\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00" - "\x18\x18\x7c\xc6\xc2\xc0\x7c\x06\x86\xc6\x7c\x18\x18\x00" - "\x00\x00\x00\x00\xc2\xc6\x0c\x18\x30\x66\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x76\xdc\xcc\xcc\x76\x00\x00\x00" - "\x00\x30\x30\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00" - "\x00\x00\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x66\x3c\xff\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x02\x06\x0c\x18\x30\x60\xc0\x80\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xce\xde\xf6\xe6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x38\x78\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x0c\x18\x30\x60\xc6\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x60\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\x06\x0c\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x0c\x78\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x0c\x18\x18\x00\x18\x18\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x10\x38\x6c\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xc0\xc2\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xfe\x66\x62\x68\x78\x68\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x3c\x66\xc2\xc0\xc0\xde\xc6\x66\x3a\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x0c\x0c\x0c\x0c\x0c\xcc\xcc\x78\x00\x00\x00" - "\x00\x00\xe6\x66\x6c\x6c\x78\x6c\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xd6\xde\x7c\x0c\x0e\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x7c\x6c\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\x60\x38\x0c\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\x7c\x6c\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x38\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\xfe\xc6\x8c\x18\x30\x60\xc2\xc6\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\x00\x80\xc0\xe0\x70\x38\x1c\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x30\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x78\x0c\x7c\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\xe0\x60\x60\x78\x6c\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x1c\x0c\x0c\x3c\x6c\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x38\x6c\x64\x60\xf0\x60\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\xcc\x78\x00" - "\x00\x00\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x06\x06\x00\x0e\x06\x06\x06\x06\x66\x66\x3c\x00" - "\x00\x00\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xec\xfe\xd6\xd6\xd6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x66\x66\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00" - "\x00\x00\x00\x00\x00\x76\xcc\xcc\xcc\x7c\x0c\x0c\x1e\x00" - "\x00\x00\x00\x00\x00\xdc\x76\x66\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x70\x1c\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x36\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xd6\xd6\xfe\x6c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x7e\x06\x0c\xf8\x00" - "\x00\x00\x00\x00\x00\xfe\xcc\x18\x30\x66\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xfe\x00\x00\x00\x00" - "\x00\x00\x3e\x66\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\xfe\xc6\xc0\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\x54\x7c\xd6\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1c\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x0c\xda\xc6\xc6\xce\xde\xf6\xe6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xcc\xd8\xf0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x1e\x36\x66\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x82\xc6\xc6\xee\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc0\xc0\xc0\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7e\x7e\x5a\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x38\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x38\x38\x6c\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xfe\x02\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\xe0\xe0\x60\x7c\x66\x66\x66\x66\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xe6\xb6\xb6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x1e\x06\x06\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc2\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x6c\x6c\x6c\x6c\xfe\xc6\x82\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\x7c\xd6\xd6\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x0c\x18\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xcc\xf8\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x66\x66\x66\x66\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xee\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x5a\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x7c\x00" - "\x00\x00\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x38\x00" - "\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\xcc\xfe\x06\x0c\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xfe\x02\x06\x00" - "\x00\x00\x00\x00\x00\xe0\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc6\xc6\xe6\xb6\xb6\xe6\x00\x00\x00" - "\x00\x00\x00\x00\x00\xc0\xc0\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\x1e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x9c\xb6\xb6\xf6\xb6\x9c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc6\xc0\xf0\xc0\xc0\xc6\xfe\x00\x00\x00" - "\x00\x00\x6c\x6c\x00\x7c\xc6\xfc\xc0\xc6\x7c\x00\x00\x00" - "\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x06\xfe\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\xc6\xf0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x10\x10\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x66\x00\x3c\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x28\x28\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00" - "\x00\x0f\x0c\x0c\x0c\x0c\x0c\xec\x6c\x3c\x1c\x00\x00\x00" - "\x00\x00\x7c\x82\xba\xaa\xa2\xa2\xaa\xba\x82\x7c\x00\x00" - "\x00\x70\xd8\x30\x60\xc8\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x7c\x7c\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xa5\x81\xbd\x99\x81\x7e" - "\x7e\xff\xdb\xff\xc3\xe7\xff\x7e" - "\x6c\xfe\xfe\xfe\x7c\x38\x10\x00" - "\x10\x38\x7c\xfe\x7c\x38\x10\x00" - "\x38\x7c\x38\xfe\xfe\x7c\x38\x7c" - "\x10\x10\x38\x7c\xfe\x7c\x38\x7c" - "\x00\x00\x18\x3c\x3c\x18\x00\x00" - "\xff\xff\xe7\xc3\xc3\xe7\xff\xff" - "\x00\x3c\x66\x42\x42\x66\x3c\x00" - "\xff\xc3\x99\xbd\xbd\x99\xc3\xff" - "\x0f\x07\x0f\x7d\xcc\xcc\xcc\x78" - "\x3c\x66\x66\x66\x3c\x18\x7e\x18" - "\x3f\x33\x3f\x30\x30\x70\xf0\xe0" - "\x7f\x63\x7f\x63\x63\x67\xe6\xc0" - "\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" - "\x80\xe0\xf8\xfe\xf8\xe0\x80\x00" - "\x02\x0e\x3e\xfe\x3e\x0e\x02\x00" - "\x18\x3c\x7e\x18\x18\x7e\x3c\x18" - "\x66\x66\x66\x66\x66\x00\x66\x00" - "\x7f\xdb\xdb\x7b\x1b\x1b\x1b\x00" - "\x3e\x63\x38\x6c\x6c\x38\xcc\x78" - "\x00\x00\x00\x00\x7e\x7e\x7e\x00" - "\x18\x3c\x7e\x18\x7e\x3c\x18\xff" - "\x18\x3c\x7e\x18\x18\x18\x18\x00" - "\x18\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x0c\xfe\x0c\x18\x00\x00" - "\x00\x30\x60\xfe\x60\x30\x00\x00" - "\x00\x00\xc0\xc0\xc0\xfe\x00\x00" - "\x00\x24\x66\xff\x66\x24\x00\x00" - "\x00\x18\x3c\x7e\xff\xff\x00\x00" - "\x00\xff\xff\x7e\x3c\x18\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x78\x78\x30\x30\x00\x30\x00" - "\x6c\x6c\x6c\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x30\x7c\xc0\x78\x0c\xf8\x30\x00" - "\x00\xc6\xcc\x18\x30\x66\xc6\x00" - "\x38\x6c\x38\x76\xdc\xcc\x76\x00" - "\x60\x60\xc0\x00\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x60\x30\x18\x18\x18\x30\x60\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x30\x30\xfc\x30\x30\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x60" - "\x00\x00\x00\xfc\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x30\x00" - "\x06\x0c\x18\x30\x60\xc0\x80\x00" - "\x7c\xc6\xce\xde\xf6\xe6\x7c\x00" - "\x30\x70\x30\x30\x30\x30\xfc\x00" - "\x78\xcc\x0c\x38\x60\xcc\xfc\x00" - "\x78\xcc\x0c\x38\x0c\xcc\x78\x00" - "\x1c\x3c\x6c\xcc\xfe\x0c\x1e\x00" - "\xfc\xc0\xf8\x0c\x0c\xcc\x78\x00" - "\x38\x60\xc0\xf8\xcc\xcc\x78\x00" - "\xfc\xcc\x0c\x18\x30\x30\x30\x00" - "\x78\xcc\xcc\x78\xcc\xcc\x78\x00" - "\x78\xcc\xcc\x7c\x0c\x18\x70\x00" - "\x00\x30\x30\x00\x00\x30\x30\x00" - "\x00\x30\x30\x00\x00\x30\x30\x60" - "\x18\x30\x60\xc0\x60\x30\x18\x00" - "\x00\x00\xfc\x00\x00\xfc\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x78\xcc\x0c\x18\x30\x00\x30\x00" - "\x7c\xc6\xde\xde\xde\xc0\x78\x00" - "\x30\x78\xcc\xcc\xfc\xcc\xcc\x00" - "\xfc\x66\x66\x7c\x66\x66\xfc\x00" - "\x3c\x66\xc0\xc0\xc0\x66\x3c\x00" - "\xf8\x6c\x66\x66\x66\x6c\xf8\x00" - "\xfe\x62\x68\x78\x68\x62\xfe\x00" - "\xfe\x62\x68\x78\x68\x60\xf0\x00" - "\x3c\x66\xc0\xc0\xce\x66\x3e\x00" - "\xcc\xcc\xcc\xfc\xcc\xcc\xcc\x00" - "\x78\x30\x30\x30\x30\x30\x78\x00" - "\x1e\x0c\x0c\x0c\xcc\xcc\x78\x00" - "\xe6\x66\x6c\x78\x6c\x66\xe6\x00" - "\xf0\x60\x60\x60\x62\x66\xfe\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x38\x6c\xc6\xc6\xc6\x6c\x38\x00" - "\xfc\x66\x66\x7c\x60\x60\xf0\x00" - "\x78\xcc\xcc\xcc\xdc\x78\x1c\x00" - "\xfc\x66\x66\x7c\x6c\x66\xe6\x00" - "\x78\xcc\xe0\x70\x1c\xcc\x78\x00" - "\xfc\xb4\x30\x30\x30\x30\x78\x00" - "\xcc\xcc\xcc\xcc\xcc\xcc\xfc\x00" - "\xcc\xcc\xcc\xcc\xcc\x78\x30\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x44\x6c\x38\x38\x6c\xc6\x00" - "\xcc\xcc\xcc\x78\x30\x30\x78\x00" - "\xfe\xc6\x8c\x18\x32\x66\xfe\x00" - "\x78\x60\x60\x60\x60\x60\x78\x00" - "\xc0\x60\x30\x18\x0c\x06\x02\x00" - "\x78\x18\x18\x18\x18\x18\x78\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x30\x30\x18\x00\x00\x00\x00\x00" - "\x00\x00\x78\x0c\x7c\xcc\x7c\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x78\xcc\xc0\xcc\x78\x00" - "\x0c\x0c\x0c\x7c\xcc\xcc\x7c\x00" - "\x00\x00\x78\xcc\xfc\xc0\x78\x00" - "\x38\x6c\x60\xf0\x60\x60\xf0\x00" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\xf8" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x30\x00\x70\x30\x30\x30\x78\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x6c\x38" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x70\x30\x30\x30\x30\x30\x78\x00" - "\x00\x00\xcc\xfe\xfe\xd6\xc6\x00" - "\x00\x00\xf8\xcc\xcc\xcc\xcc\x00" - "\x00\x00\x78\xcc\xcc\xcc\x78\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x7c\xcc\xcc\x7c\x0c\x0c" - "\x00\x00\xdc\x76\x66\x60\xf0\x00" - "\x00\x00\x7c\xc0\x78\x0c\xf8\x00" - "\x10\x30\x7c\x30\x30\x34\x18\x00" - "\x00\x00\xcc\xcc\xcc\xcc\x7c\x00" - "\x00\x00\xcc\xcc\xcc\x78\x30\x00" - "\x00\x00\xc6\xd6\xfe\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\xcc\xcc\xcc\x7c\x0c\xf8" - "\x00\x00\xfc\x98\x30\x64\xfc\x00" - "\x1c\x30\x30\xe0\x30\x30\x1c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\xe0\x30\x30\x1c\x30\x30\xe0\x00" - "\x76\xdc\x00\x00\x00\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\xc6\xfe\x00" - "\x1e\x36\x66\x66\x7e\x66\x66\x00" - "\x7c\x60\x60\x7c\x66\x66\x7c\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x60\x60\x60\x00" - "\x38\x6c\x6c\x6c\x6c\x6c\xfe\xc6" - "\x7e\x60\x60\x7c\x60\x60\x7e\x00" - "\xdb\xdb\x7e\x3c\x7e\xdb\xdb\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x66\x66\x6e\x7e\x76\x66\x66\x00" - "\x3c\x66\x6e\x7e\x76\x66\x66\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x1e\x36\x66\x66\x66\x66\x66\x00" - "\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7e\x66\x66\x66\x66\x66\x66\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x3e\x06\x66\x3c\x00" - "\x7e\xdb\xdb\xdb\x7e\x18\x18\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x66\x66\x66\x7f\x03" - "\x66\x66\x66\x3e\x06\x06\x06\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x00" - "\xdb\xdb\xdb\xdb\xdb\xdb\xff\x03" - "\xe0\x60\x60\x7c\x66\x66\x7c\x00" - "\xc6\xc6\xc6\xf6\xde\xde\xf6\x00" - "\x60\x60\x60\x7c\x66\x66\x7c\x00" - "\x78\x8c\x06\x3e\x06\x8c\x78\x00" - "\xce\xdb\xdb\xfb\xdb\xdb\xce\x00" - "\x3e\x66\x66\x66\x3e\x36\x66\x00" - "\x00\x00\x78\x0c\x7c\xcc\x76\x00" - "\x00\x3c\x60\x3c\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x7c\x66\x7c\x00" - "\x00\x00\x7e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x6c\x6c\x6c\xfe\xc6" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x00\xdb\x7e\x3c\x7e\xdb\x00" - "\x00\x00\x3c\x66\x0c\x66\x3c\x00" - "\x00\x00\x66\x6e\x7e\x76\x66\x00" - "\x00\x18\x66\x6e\x7e\x76\x66\x00" - "\x00\x00\x66\x6c\x78\x6c\x66\x00" - "\x00\x00\x1e\x36\x66\x66\x66\x00" - "\x00\x00\xc6\xfe\xfe\xd6\xc6\x00" - "\x00\x00\x66\x66\x7e\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7e\x66\x66\x66\x66\x00" - "\x11\x44\x11\x44\x11\x44\x11\x44" - "\x55\xaa\x55\xaa\x55\xaa\x55\xaa" - "\xdd\x77\xdd\x77\xdd\x77\xdd\x77" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x18\x18\x18\x18" - "\x18\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\x36\x36\xf6\x36\x36\x36\x36" - "\x00\x00\x00\xfe\x36\x36\x36\x36" - "\x00\xf8\x18\xf8\x18\x18\x18\x18" - "\x36\xf6\x06\xf6\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\xfe\x06\xf6\x36\x36\x36\x36" - "\x36\xf6\x06\xfe\x00\x00\x00\x00" - "\x36\x36\x36\xfe\x00\x00\x00\x00" - "\x18\xf8\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\xf8\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x00\x00\x00\x00" - "\x18\x18\x18\xff\x00\x00\x00\x00" - "\x00\x00\x00\xff\x18\x18\x18\x18" - "\x18\x18\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x18\x18\x18\xff\x18\x18\x18\x18" - "\x18\x1f\x18\x1f\x18\x18\x18\x18" - "\x36\x36\x36\x37\x36\x36\x36\x36" - "\x36\x37\x30\x3f\x00\x00\x00\x00" - "\x00\x3f\x30\x37\x36\x36\x36\x36" - "\x36\xf7\x00\xff\x00\x00\x00\x00" - "\x00\xff\x00\xf7\x36\x36\x36\x36" - "\x36\x37\x30\x37\x36\x36\x36\x36" - "\x00\xff\x00\xff\x00\x00\x00\x00" - "\x36\xf7\x00\xf7\x36\x36\x36\x36" - "\x18\xff\x00\xff\x00\x00\x00\x00" - "\x36\x36\x36\xff\x00\x00\x00\x00" - "\x00\xff\x00\xff\x18\x18\x18\x18" - "\x00\x00\x00\xff\x36\x36\x36\x36" - "\x36\x36\x36\x3f\x00\x00\x00\x00" - "\x18\x1f\x18\x1f\x00\x00\x00\x00" - "\x00\x1f\x18\x1f\x18\x18\x18\x18" - "\x00\x00\x00\x3f\x36\x36\x36\x36" - "\x36\x36\x36\xff\x36\x36\x36\x36" - "\x18\xff\x18\xff\x18\x18\x18\x18" - "\x18\x18\x18\xf8\x00\x00\x00\x00" - "\x00\x00\x00\x1f\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x00\x00\x7e\x18\x18\x18\x18\x00" - "\x00\x00\x66\x66\x3e\x06\x3c\x00" - "\x00\x00\x7e\xdb\xdb\x7e\x18\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x03" - "\x00\x00\x66\x66\x3e\x06\x06\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x00" - "\x00\x00\xdb\xdb\xdb\xdb\xff\x03" - "\x00\x00\xe0\x60\x7c\x66\x7c\x00" - "\x00\x00\xc6\xc6\xf6\xde\xf6\x00" - "\x00\x00\x60\x60\x7c\x66\x7c\x00" - "\x00\x00\x7c\x06\x3e\x06\x7c\x00" - "\x00\x00\xce\xdb\xfb\xdb\xce\x00" - "\x00\x00\x3e\x66\x3e\x36\x66\x00" - "\x66\x00\x7e\x60\x7c\x60\x7e\x00" - "\x24\x00\x3c\x66\x7e\x60\x3c\x00" - "\x06\x7e\x60\x60\x60\x60\x60\x00" - "\x00\x06\x7e\x60\x60\x60\x60\x00" - "\x3c\x66\xc0\xf8\xc0\x66\x3c\x00" - "\x00\x00\x7c\xc0\xf8\xc0\x7c\x00" - "\x30\x78\x30\x30\x30\x30\x78\x00" - "\x20\x00\x70\x30\x30\x30\x78\x00" - "\x48\x78\x30\x30\x30\x30\x78\x00" - "\x50\x00\x70\x30\x30\x30\x78\x00" - "\x00\x00\x00\x38\x38\x00\x00\x00" - "\x03\x02\x06\x04\xcc\x68\x38\x10" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x30\x48\x10\x20\x78\x00\x00\x00" - "\x00\x00\x7c\x7c\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x00\x42\x7e\x00" - , "Ukrainian font cp866u", CIOLIB_CP866U} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x24\x24\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x24\x24\x24\x7e\x24\x24\x24\x7e\x24\x24\x24\x00\x00\x00" - "\x00\x00\x08\x3f\x48\x48\x48\x3e\x09\x09\x09\x7e\x08\x00\x00\x00" - "\x00\x00\x00\x30\x49\x32\x04\x08\x10\x26\x49\x06\x00\x00\x00\x00" - "\x00\x00\x00\x18\x24\x24\x18\x25\x22\x22\x22\x1d\x00\x00\x00\x00" - "\x00\x18\x08\x08\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x04\x08\x10\x10\x10\x10\x10\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x10\x08\x04\x04\x04\x04\x04\x04\x08\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x18\x7e\x18\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x08\x7f\x08\x08\x08\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x08\x10\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x01\x02\x04\x08\x10\x20\x40\x80\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x42\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x08\x18\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x1c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x06\x0a\x12\x22\x42\x7f\x02\x02\x02\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x40\x40\x40\x7c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x04\x08\x08\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x3c\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x3e\x02\x02\x02\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x18\x08\x08\x10\x00" - "\x00\x00\x00\x04\x08\x10\x20\x40\x20\x10\x08\x04\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x20\x10\x08\x04\x02\x04\x08\x10\x20\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x02\x02\x04\x08\x10\x00\x00\x10\x10\x00\x00\x00" - "\x00\x00\x00\x1c\x22\x49\x55\x55\x56\x4c\x20\x1e\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x7c\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\x42\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x7e\x40\x40\x40\x7c\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3e\x40\x40\x40\x4e\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x7e\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x0e\x02\x02\x02\x02\x02\x02\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x42\x44\x48\x50\x60\x60\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x40\x40\x40\x40\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x41\x63\x55\x49\x41\x41\x41\x41\x41\x41\x00\x00\x00\x00" - "\x00\x00\x42\x62\x52\x52\x4a\x4a\x46\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x4a\x3c\x04\x02\x00\x00" - "\x00\x00\x7c\x42\x42\x42\x42\x7c\x50\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x3c\x02\x02\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x7f\x08\x08\x08\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x42\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x22\x22\x14\x14\x08\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x41\x41\x41\x49\x55\x63\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x22\x14\x08\x08\x14\x22\x41\x41\x00\x00\x00\x00" - "\x00\x00\x41\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x7e\x02\x02\x04\x08\x10\x20\x40\x40\x7e\x00\x00\x00\x00" - "\x00\x00\x3c\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x80\x40\x20\x10\x08\x04\x02\x01\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x04\x04\x04\x04\x04\x04\x04\x04\x3c\x00\x00\x00\x00" - "\x00\x00\x08\x14\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00" - "\x00\x18\x10\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x02\x02\x02\x3e\x42\x42\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x0e\x10\x10\x7e\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x40\x40\x40\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x08\x08\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x02\x02\x00\x0e\x02\x02\x02\x02\x02\x02\x02\x42\x3c\x00" - "\x00\x00\x40\x40\x40\x42\x44\x48\x70\x48\x44\x42\x00\x00\x00\x00" - "\x00\x00\x70\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x76\x49\x49\x49\x49\x49\x49\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x7c\x42\x42\x42\x42\x42\x7c\x40\x40\x40\x00" - "\x00\x00\x00\x00\x00\x3e\x42\x42\x42\x42\x42\x3e\x02\x02\x02\x00" - "\x00\x00\x00\x00\x00\x5c\x62\x40\x40\x40\x40\x40\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x3c\x02\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x0e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x24\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x49\x49\x49\x49\x49\x49\x36\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x24\x18\x24\x42\x42\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x00\x00\x00\x7e\x04\x08\x10\x20\x40\x7e\x00\x00\x00\x00" - "\x00\x0c\x10\x10\x10\x10\x20\x10\x10\x10\x10\x0c\x00\x00\x00\x00" - "\x00\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00" - "\x00\x30\x08\x08\x08\x08\x04\x08\x08\x08\x08\x30\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x10\x10\x00\x00\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\x00" - "\x00\x00\x00\x08\x08\x3c\x4a\x48\x48\x4a\x3c\x08\x08\x00\x00\x00" - "\x00\x00\x1c\x22\x22\x20\x78\x20\x20\x20\x21\x7e\x00\x00\x00\x00" - "\x00\x00\x41\x3e\x22\x22\x22\x3e\x41\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x41\x22\x14\x08\x08\x3e\x08\x3e\x08\x08\x00\x00\x00\x00" - "\x00\x08\x08\x08\x08\x08\x00\x00\x08\x08\x08\x08\x08\x00\x00\x00" - "\x00\x00\x3c\x42\x20\x3c\x42\x42\x42\x3c\x04\x42\x3c\x00\x00\x00" - "\x00\x24\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x41\x41\x5d\x51\x51\x5d\x41\x41\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x38\x44\x44\x3e\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x09\x12\x24\x48\x90\x48\x24\x12\x09\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x02\x02\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3e\x41\x5d\x55\x59\x55\x55\x41\x41\x3e\x00\x00\x00\x00" - "\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x24\x24\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x08\x08\x3e\x08\x08\x00\x3e\x00\x00\x00\x00" - "\x00\x00\x30\x48\x10\x20\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x70\x08\x30\x08\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x02\x04\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x42\x42\x42\x42\x42\x7e\x41\x40\x40\x80\x00" - "\x00\x00\x7c\x52\x52\x52\x5c\x50\x50\x50\x50\x50\x50\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04\x08\x00" - "\x00\x00\x10\x30\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x24\x18\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x90\x48\x24\x12\x09\x12\x24\x48\x90\x00\x00\x00\x00" - "\x00\x10\x30\x10\x11\x12\x04\x08\x11\x23\x45\x0f\x01\x01\x00\x00" - "\x00\x10\x30\x10\x11\x12\x04\x08\x10\x26\x49\x02\x04\x0f\x00\x00" - "\x00\x30\x48\x10\x09\x4a\x34\x08\x11\x23\x45\x0f\x01\x01\x00\x00" - "\x00\x00\x00\x10\x10\x00\x10\x10\x10\x20\x40\x40\x42\x3c\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x24\x00\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x18\x24\x18\x3c\x42\x42\x42\x7e\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x00\x3f\x48\x48\x48\x7e\x48\x48\x48\x48\x4f\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x40\x40\x40\x40\x40\x40\x42\x3c\x04\x02\x3c\x00" - "\x18\x06\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x06\x18\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x0c\x12\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x14\x14\x00\x3e\x20\x20\x20\x3c\x20\x20\x20\x3e\x00\x00\x00\x00" - "\x18\x06\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x06\x18\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x08\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x14\x14\x00\x1c\x08\x08\x08\x08\x08\x08\x08\x1c\x00\x00\x00\x00" - "\x00\x00\x78\x44\x42\x42\xf2\x42\x42\x42\x44\x78\x00\x00\x00\x00" - "\x00\x19\x26\x00\x41\x61\x51\x49\x45\x43\x41\x41\x00\x00\x00\x00" - "\x30\x0c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x3c\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x22\x14\x08\x14\x22\x00\x00\x00\x00\x00\x00" - "\x00\x00\x01\x1a\x24\x4a\x4a\x52\x52\x24\x58\x80\x00\x00\x00\x00" - "\x30\x0c\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x0c\x30\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x18\x24\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x66\x00\x42\x42\x42\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x04\x08\x00\x41\x41\x22\x14\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x20\x20\x38\x24\x22\x22\x22\x24\x38\x20\x20\x20\x00\x00\x00" - "\x00\x00\x1e\x21\x21\x21\x3e\x21\x21\x21\x3e\x20\x20\x20\x00\x00" - "\x00\x10\x08\x04\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x10\x28\x44\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x1c\x22\x1c\x00\x3c\x42\x02\x3e\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x36\x09\x09\x3e\x48\x48\x3e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x3c\x42\x40\x40\x40\x42\x3c\x08\x04\x78\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x3c\x42\x42\x7e\x40\x42\x3c\x00\x00\x00\x00" - "\x00\x10\x08\x04\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x04\x08\x10\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x08\x14\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x22\x22\x00\x38\x08\x08\x08\x08\x08\x08\x00\x00\x00\x00" - "\x00\x00\x1d\x02\x06\x0a\x02\x3e\x42\x42\x42\x3e\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x7c\x42\x42\x42\x42\x42\x42\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x18\x24\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x32\x4c\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x24\x00\x00\x3c\x42\x42\x42\x42\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x08\x00\x3e\x00\x08\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x1d\x22\x45\x49\x51\x22\x5c\x00\x00\x00\x00" - "\x00\x20\x10\x08\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x08\x10\x20\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x18\x24\x42\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x24\x24\x00\x42\x42\x42\x42\x42\x42\x3d\x00\x00\x00\x00" - "\x00\x00\x04\x08\x00\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - "\x00\x00\x20\x20\x38\x24\x24\x24\x28\x30\x20\x20\x20\x00\x00\x00" - "\x00\x00\x24\x24\x00\x00\x42\x42\x42\x42\x42\x3e\x02\x02\x3c\x00" - , NULL, NULL, "ISO-8859-1 West European, (thin)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x42\x81\xe7\xa5\x99\x81\x99\x42\x3c\x00\x00\x00\x00" - "\x00\x00\x3c\x7e\xff\x99\xdb\xe7\xff\xe7\x7e\x3c\x00\x00\x00\x00" - "\x00\x00\x00\x6c\xfe\xfe\xfe\xfe\xfe\x7c\x38\x10\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x7c\xfe\x7c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x00\x38\x38\x10\xd6\xfe\xd6\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x10\x38\x7c\xfe\xfe\x54\x10\x38\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xe7\xc3\xc3\xe7\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x3c\x66\x42\x42\x66\x3c\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xff\xff\xff\xff" - "\x00\x00\x1e\x0e\x1a\x30\x78\xcc\xcc\xcc\xcc\x78\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x18\x7e\x18\x18\x18\x00\x00\x00\x00" - "\x00\x20\x30\x38\x3c\x36\x36\x30\x70\xf0\xf0\x60\x00\x00\x00\x00" - "\x00\x00\x3e\x22\x3e\x22\x22\x22\x22\x26\x6e\xe4\x40\x00\x00\x00" - "\x00\x00\x00\x10\x92\x54\x28\xc6\x28\x54\x92\x10\x00\x00\x00\x00" - "\x00\x00\x40\x60\x70\x78\x7c\x7e\x7c\x78\x70\x60\x40\x00\x00\x00" - "\x00\x00\x02\x06\x0e\x1e\x3e\x7e\x3e\x1e\x0e\x06\x02\x00\x00\x00" - "\x00\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x00\x66\x66\x00\x00\x00\x00" - "\x00\x00\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x1e\x30\x78\xdc\xce\xe7\x73\x3b\x1e\x0c\x78\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe\xfe\xfe\x00\x00\x00\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\xff\x00" - "\x00\x00\x18\x3c\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x3c\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x0c\x06\xff\x06\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x30\x60\xff\x60\x30\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x24\x66\xff\x66\x24\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x3c\x3c\x7e\x7e\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x7e\x7e\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00\x00" - "\x00\x00\x77\x66\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x6c\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x6c\x00\x00\x00" - "\x00\x10\x7c\xd6\xd0\xd0\x70\x38\x1c\x16\x16\xd6\x7c\x10\x00\x00" - "\x00\x00\xc6\xc6\x0c\x0c\x18\x30\x30\x60\x60\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x6c\x6c\x38\x70\xd6\xdc\xcc\xcc\xcc\x76\x00\x00\x00" - "\x00\x00\x1c\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x00\x00" - "\x00\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\xff\x3c\x3c\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x18\x30\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00" - "\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xd6\xd6\xd6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x18\x18\x38\x78\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x60\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x0c\x0c\xcc\xcc\xcc\xcc\xfe\x0c\x0c\x0c\x0c\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x60\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\x06\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x7e\x06\x06\x0c\x18\x70\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x1c\x18\x30\x00\x00\x00" - "\x00\x00\x06\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc0\x60\x30\x18\x0c\x06\x0c\x18\x30\x60\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x0c\x18\x30\x30\x00\x30\x30\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xde\xde\xde\xde\xdc\xc0\x7c\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xf8\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xcc\xf8\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xce\xc6\xc6\xc6\x66\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x1e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xe6\xf6\xfe\xde\xce\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xf6\xde\x7c\x0c\x06\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xd8\xcc\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\x60\x38\x0c\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xee\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xfe\x06\x0c\x0c\x18\x18\x30\x60\x60\xc0\xfe\x00\x00\x00" - "\x00\x00\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00" - "\x00\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x00" - "\x00\x00\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00" - "\x00\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00" - "\x00\x00\x70\x30\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x06\x06\x06\x06\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x3c\x66\x60\x60\xf0\x60\x60\x60\x60\x60\x60\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\xc0\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\xc6\xc6\x7c" - "\x00\x00\x00\xc0\xc0\xc0\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xec\xfe\xfe\xd6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc0\x70\x1c\x06\x06\x7c\x00\x00\x00" - "\x00\x00\x00\x10\x30\x30\xfc\x30\x30\x30\x30\x30\x1c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x10\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xd6\xd6\xfe\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\xfe\x06\x0c\x18\x30\x60\xfe\x00\x00\x00" - "\x00\x00\x0e\x18\x18\x18\x30\x60\x30\x18\x18\x18\x0e\x00\x00\x00" - "\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x70\x18\x18\x18\x0c\x06\x0c\x18\x18\x18\x70\x00\x00\x00" - "\x00\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x10\x38\x6c\xc6\xc6\xc6\xfe\x00\x00\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x7c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc0\xc0\xc0\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xfc\xc6\xc6\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7e\xc3\x66\x00" - "\x00\x00\xfe\xc0\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\x54\x7c\x38\x38\x38\x7c\x54\xd6\xd6\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3c\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x44\x38\xc6\xce\xde\xfe\xf6\xe6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xcc\xd8\xf0\xe0\xf0\xd8\xcc\xc6\xc6\x00\x00\x00" - "\x00\x00\x38\x38\x38\x6c\x6c\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xfe\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\xfc\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x3c\x66\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00" - "\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x10\x7c\xd6\xd6\xd6\xd6\x7c\x10\x10\x10\x10\x00\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\x06\x06\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\xf0\xb0\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xf2\xda\xda\xda\xda\xda\xf6\x00\x00\x00" - "\x00\x00\x30\x30\x30\x30\x3c\x36\x36\x36\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x7c\xc6\x06\x06\x3e\x06\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x9c\xb6\xb6\xb6\xf6\xb6\xb6\xb6\xb6\xb6\x9c\x00\x00\x00" - "\x00\x00\x7e\xc6\xc6\xc6\xc6\x7e\x36\x66\x66\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\x06\x7e\xc6\xc6\xc6\x7e\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xfc\xc6\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xfc\xc6\xc6\xfc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3c\x66\x66\x66\x66\x66\xff\xc3\x66\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\x7c\x38\x38\x38\x7c\xd6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3c\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xce\xde\xf6\xe6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xee\xfe\xfe\xd6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00\x00" - "\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11\x44\x11" - "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" - "\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd\x77\xdd" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xf8\x18\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xfe\x06\xf6\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf6\x06\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xfe\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x36\x36\x36\x36\x36\x36\x36\x36\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x3f\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x37\x30\x37\x36\x36\x36\x36\x36\x36\x36" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\xf7\x00\xf7\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\x3f\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x18\x1f\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1f\x18\x1f\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x36\x36\x36\x36\x36\x36\x36" - "\x36\x36\x36\x36\x36\x36\x36\x36\xff\x36\x36\x36\x36\x36\x36\x36" - "\x18\x18\x18\x18\x18\x18\xff\x00\xff\x18\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\x18\x18\xf8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x18\x18\x18\x18\x18\x18" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xfc\xc6\xc6\xc6\xc6\xc6\xfc\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x00\x00\x00\x00\x00\x00\x7c\xd6\xd6\xd6\xd6\xd6\x7c\x10\x10\x10" - "\x00\x00\x00\x00\x00\x00\xc6\x6c\x38\x38\x38\x6c\xc6\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\x7e\x06\x06\x06\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xd6\xd6\xd6\xd6\xd6\xd6\xfe\x03\x06\x00" - "\x00\x00\x00\x00\x00\x00\xf0\xb0\x30\x3c\x36\x36\x3c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xc6\xc6\xc6\xfa\xce\xce\xfa\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x60\x60\x60\x7c\x66\x66\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\x06\x3e\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xcc\xd6\xd6\xf6\xd6\xd6\xcc\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\xc6\xc6\x7e\x36\x66\xc6\x00\x00\x00" - "\x6c\x6c\x00\xfe\xc0\xc0\xfc\xc0\xc0\xc0\xc0\xc0\xfe\x00\x00\x00" - "\x00\x00\x00\x6c\x6c\x00\x7c\xc6\xfe\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xf8\xc0\xc0\xc0\xc0\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7c\xc6\xc0\xf8\xc0\xc6\x7c\x00\x00\x00" - "\x24\x24\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x36\x36\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x44\x38\x00\xc6\xc6\xc6\xc6\x7e\x06\x06\x06\xc6\x7c\x00\x00\x00" - "\x00\x00\x00\x44\x38\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x06\xc6\x7c" - "\x18\x18\x00\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x3c\x66\x66\x66\x66\x3c\x66\x66\x00\x00\x00" - "\x06\x06\xfe\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x0c\x0c\xfc\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x3c\x3c\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - , NULL, NULL, "Codepage 1131 Belarusian, (swiss)", CIOLIB_CP1131} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x10 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x03\x3e\x76\x36\x36\x00" - , "Commodore 64 (UPPER)", CIOLIB_PETSCIIU} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x0e\x0e\x18\x18\x3e\x3e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x3c\x3c" - "\x00\x00\x60\x60\x60\x60\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x7f\x7f\x7f\x7f\x6b\x6b\x63\x63\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x7e\x7e\x18\x18\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x7f\x3e\x3e\x36\x36\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x0c\x0c\x78\x78" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x00\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x00" - "\x00\x06\x06\x3e\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x0e\x18\x3e\x18\x18\x18\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x7c" - "\x00\x60\x60\x7c\x66\x66\x66\x00" - "\x00\x18\x00\x38\x18\x18\x3c\x00" - "\x00\x06\x00\x06\x06\x06\x06\x3c" - "\x00\x60\x60\x6c\x78\x6c\x66\x00" - "\x00\x38\x18\x18\x18\x18\x3c\x00" - "\x00\x00\x66\x7f\x7f\x6b\x63\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - // 0x10 - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x7c\x66\x60\x60\x60\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x00\x18\x7e\x18\x18\x18\x0e\x00" - "\x00\x00\x66\x66\x66\x66\x3e\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\x63\x6b\x7f\x3e\x36\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x3e\x0c\x78" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - , "Commodore 64 (Lower)", CIOLIB_PETSCIIL} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x7f\x7f\x1c\x1c\x3e\x3e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\x00\x00\x00\xe0\xe0\xf0\xf0\x38\x38\x18\x18\x18\x18" - "\x18\x18\x18\x18\x1c\x1c\x0f\x0f\x07\x07\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x38\x38\xf0\xf0\xe0\xe0\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\xff\xff" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xff\xff\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\xff\xff\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00" - "\x36\x36\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x00\x00\x00\x07\x07\x0f\x0f\x1c\x1c\x18\x18\x18\x18" - "\xc3\xc3\xe7\xe7\x7e\x7e\x3c\x3c\x3c\x3c\x7e\x7e\xe7\xe7\xc3\xc3" - "\x00\x00\x3c\x3c\x7e\x7e\x66\x66\x66\x66\x7e\x7e\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x66\x66\x66\x66\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x08\x1c\x1c\x3e\x3e\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - "\xff\xff\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xff\xff\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x00\x00\x03\x03\x3e\x3e\x76\x76\x36\x36\x36\x36\x00\x00" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x10 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x08\x1c\x3e\x7f\x7f\x1c\x3e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x00\x00\xff\xff\x00\x00\x00\x00" - "\x00\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00" - "\x30\x30\x30\x30\x30\x30\x30\x30" - "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c" - "\x00\x00\x00\xe0\xf0\x38\x18\x18" - "\x18\x18\x1c\x0f\x07\x00\x00\x00" - "\x18\x18\x38\xf0\xe0\x00\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0" - // 0x50 - "\xff\xff\x03\x03\x03\x03\x03\x03" - "\x00\x3c\x7e\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\x00\xff\xff\x00" - "\x36\x7f\x7f\x7f\x3e\x1c\x08\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x00\x07\x0f\x1c\x18\x18" - "\xc3\xe7\x7e\x3c\x3c\x7e\xe7\xc3" - "\x00\x3c\x7e\x66\x66\x7e\x3c\x00" - "\x18\x18\x66\x66\x18\x18\x3c\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06" - "\x08\x1c\x3e\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x03\x3e\x76\x36\x36\x00" - "\xff\x7f\x3f\x1f\x0f\x07\x03\x01" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x03\x03\x03\x03\x03\x03\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x00\x00\x03\x3e\x76\x36\x36\x00" - , "Commodore 128 (UPPER)", CIOLIB_PETSCIIU} - ,{ - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\xff\xff\x66\x66\xff\xff\x66\x66\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x62\x62\x66\x66\x0c\x0c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x38\x38\x67\x67\x66\x66\x3f\x3f\x00\x00" - "\x06\x06\x0c\x0c\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - // 0x30 - "\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x0e\x0e\x1e\x1e\x66\x66\x7f\x7f\x06\x06\x06\x06\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x66\x66\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x0e\x0e\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x70\x70\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x62\x62\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3e\x3e\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x7c\x7c\x66\x66\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x10 - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\xfc\xfc\x30\x30\x30\x30\x36\x36\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x7f\x36\x36\x22\x22\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\x0c\x0c\x12\x12\x30\x30\x7c\x7c\x30\x30\x62\x62\xfc\xfc\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x10\x10\x30\x30\x7f\x7f\x7f\x7f\x30\x30\x10\x10\x00\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x1e\x1e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x6c\x6c\x38\x38\x00\x00" - "\x66\x66\x6c\x6c\x78\x78\x70\x70\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x63\x63\x00\x00" - "\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x50 - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x0e\x0e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x3c\x3c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x63\x63\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\x30\x30\x30\x30\xc0\xc0\xc0\xc0\x30\x30\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - "\x33\x33\x99\x99\xcc\xcc\x66\x66\x33\x33\x99\x99\xcc\xcc\x66\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc\xcc\xcc\x33\x33\x33\x33" - "\xcc\xcc\x99\x99\x33\x33\x66\x66\xcc\xcc\x99\x99\x33\x33\x66\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - // 0x70 - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x01\x01\x03\x03\x06\x06\x6c\x6c\x78\x78\x70\x70\x60\x60\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\x33\x33\xcc\xcc\xcc\xcc\x33\x33\x33\x33\xcc\xcc\xcc\xcc" - , NULL - , - // 0x00 - 0x1F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0x20 - 0x3F - Mapped from 0x20 - 0x3F in the ROM font - // 0x20 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x00\x18\x00" - "\x66\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\xff\x66\xff\x66\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x62\x66\x0c\x18\x30\x66\x46\x00" - "\x3c\x66\x3c\x38\x67\x66\x3f\x00" - "\x06\x0c\x18\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x03\x06\x0c\x18\x30\x60\x00" - // 0x30 - "\x3c\x66\x6e\x76\x66\x66\x3c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x3c\x66\x06\x0c\x30\x60\x7e\x00" - "\x3c\x66\x06\x1c\x06\x66\x3c\x00" - "\x06\x0e\x1e\x66\x7f\x06\x06\x00" - "\x7e\x60\x7c\x06\x06\x66\x3c\x00" - "\x3c\x66\x60\x7c\x66\x66\x3c\x00" - "\x7e\x66\x0c\x18\x18\x18\x18\x00" - "\x3c\x66\x66\x3c\x66\x66\x3c\x00" - "\x3c\x66\x66\x3e\x06\x66\x3c\x00" - "\x00\x00\x18\x00\x00\x18\x00\x00" - "\x00\x00\x18\x00\x00\x18\x18\x30" - "\x0e\x18\x30\x60\x30\x18\x0e\x00" - "\x00\x00\x7e\x00\x7e\x00\x00\x00" - "\x70\x18\x0c\x06\x0c\x18\x70\x00" - "\x3c\x66\x06\x0c\x18\x00\x18\x00" - // 0x40 - 0x5F - Mapped from 0x00 - 0x1F in the ROM font - // 0x00 - "\x3c\x66\x6e\x6e\x60\x62\x3c\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x60\x60\x7c\x66\x66\x66\x7c\x00" - "\x00\x00\x3c\x66\x60\x66\x3c\x00" - "\x06\x06\x3e\x66\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3e\x00" - "\x1c\x36\x30\x78\x30\x30\x30\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x7c" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x06\x00\x06\x06\x06\x06\x66\x3c" - "\x60\x60\x66\x6c\x78\x7c\x66\x00" - "\x38\x18\x18\x18\x18\x18\x3c\x00" - "\x00\x00\x63\x77\x7f\x6b\x63\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - // 0x10 - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x7c\x66\x60\x60\x60\x00" - "\x00\x00\x3c\x60\x3c\x06\x7c\x00" - "\x30\x30\xfc\x30\x30\x36\x1c\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\x63\x6b\x7f\x36\x22\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x7c" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\x0c\x12\x30\x7c\x30\x62\xfc\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x18" - "\x00\x10\x30\x7f\x7f\x30\x10\x00" - // 0x60 - 0x7F - Mapped from 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0x80 - 0x9F - Not printable - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - // 0xA0 - 0xBF - Mapped to 0x60 - 0x7F in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f" - // 0xC0 - 0xDF - *ALSO* Mapped to 0x40 - 0x5F in the ROM font - // 0x40 - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x3c\x66\x7e\x66\x66\x66\x00" - "\x7c\x66\x66\x7c\x66\x66\x7c\x00" - "\x3c\x66\x60\x60\x60\x66\x3c\x00" - "\x78\x6c\x66\x66\x66\x6c\x78\x00" - "\x7e\x60\x60\x78\x60\x60\x7e\x00" - "\x7e\x60\x60\x78\x60\x60\x60\x00" - "\x3c\x66\x60\x6e\x66\x66\x3c\x00" - "\x66\x66\x66\x7e\x66\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x1e\x0c\x0c\x0c\x0c\x6c\x38\x00" - "\x66\x6c\x78\x70\x78\x6c\x66\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\x63\x77\x7f\x6b\x63\x63\x63\x00" - "\x66\x76\x7e\x7e\x6e\x66\x66\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - // 0x50 - "\x7c\x66\x66\x7c\x60\x60\x60\x00" - "\x3c\x66\x66\x66\x66\x3c\x0e\x00" - "\x7c\x66\x66\x7c\x78\x6c\x66\x00" - "\x3c\x66\x60\x3c\x06\x66\x3c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x66\x3c\x18\x00" - "\x63\x63\x63\x6b\x7f\x77\x63\x00" - "\x66\x66\x3c\x18\x3c\x66\x66\x00" - "\x66\x66\x66\x3c\x18\x18\x18\x00" - "\x7e\x06\x0c\x18\x30\x60\x7e\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\xc0\xc0\x30\x30\xc0\xc0\x30\x30" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - "\x33\x99\xcc\x66\x33\x99\xcc\x66" - // 0xE0 - 0xFE - *ALSO* Mapped to 0x60 - 0x7E in the ROM font - // 0x60 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x00\x00\x00\x00\xcc\xcc\x33\x33" - "\xcc\x99\x33\x66\xcc\x99\x33\x66" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff" - // 0x70 - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0" - "\x07\x07\x07\x07\x07\x07\x07\x07" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\xff\xff" - "\x01\x03\x06\x6c\x78\x70\x60\x00" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - // And finally, 0xFF which is mapped to 0x5E in the original font (!) - "\x33\x33\xcc\xcc\x33\x33\xcc\xcc" - , "Commodore 128 (Lower)", CIOLIB_PETSCIIL} - ,{ - // 0x40 - "\x00\x00\x36\x36\x7f\x7f\x7f\x7f\x3e\x3e\x1c\x1c\x08\x08\x00\x00" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xf8\xf8\xf8\xf8\x18\x18\x18\x18\x18\x18" - "\x03\x03\x07\x07\x0e\x0e\x1c\x1c\x38\x38\x70\x70\xe0\xe0\xc0\xc0" - "\xc0\xc0\xe0\xe0\x70\x70\x38\x38\x1c\x1c\x0e\x0e\x07\x07\x03\x03" - "\x01\x01\x03\x03\x07\x07\x0f\x0f\x1f\x1f\x3f\x3f\x7f\x7f\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\x80\x80\xc0\xc0\xe0\xe0\xf0\xf0\xf8\xf8\xfc\xfc\xfe\xfe\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - // 0x50 - "\x00\x00\x1c\x1c\x1c\x1c\x77\x77\x77\x77\x08\x08\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x1f\x1f\x1f\x1f\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x00\x00\x00\x00\x3c\x3c\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x18\x18\x18\x18\x18\x18" - "\x18\x18\x18\x18\x18\x18\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x18\x18\x18\x18\x18\x18\x1f\x1f\x1f\x1f\x00\x00\x00\x00\x00\x00" - "\x78\x78\x60\x60\x78\x78\x60\x60\x7e\x7e\x18\x18\x1e\x1e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x7e\x7e\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x18\x18\x30\x30\x7e\x7e\x30\x30\x18\x18\x00\x00\x00\x00" - "\x00\x00\x18\x18\x0c\x0c\x7e\x7e\x0c\x0c\x18\x18\x00\x00\x00\x00" - // 0x00 - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\xff\xff\x66\x66\x66\x66\xff\xff\x66\x66\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x00\x00\x66\x66\x6c\x6c\x18\x18\x30\x30\x66\x66\x46\x46\x00\x00" - "\x1c\x1c\x36\x36\x1c\x1c\x38\x38\x6f\x6f\x66\x66\x3b\x3b\x00\x00" - "\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x0e\x0e\x1c\x1c\x18\x18\x18\x18\x1c\x1c\x0e\x0e\x00\x00" - "\x00\x00\x70\x70\x38\x38\x18\x18\x18\x18\x38\x38\x70\x70\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\x40\x40\x00\x00" - // 0x10 - "\x00\x00\x3c\x3c\x66\x66\x6e\x6e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x0c\x0c\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x0c\x0c\x1c\x1c\x3c\x3c\x6c\x6c\x7e\x7e\x0c\x0c\x00\x00" - "\x00\x00\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x3c\x3c\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x7e\x7e\x06\x06\x0c\x0c\x18\x18\x30\x30\x30\x30\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x3e\x3e\x06\x06\x0c\x0c\x38\x38\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x30\x30" - "\x06\x06\x0c\x0c\x18\x18\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x60\x60\x30\x30\x18\x18\x0c\x0c\x18\x18\x30\x30\x60\x60\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - // 0x20 - "\x00\x00\x3c\x3c\x66\x66\x6e\x6e\x6e\x6e\x60\x60\x3e\x3e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x66\x66\x66\x66\x7e\x7e\x66\x66\x00\x00" - "\x00\x00\x7c\x7c\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x60\x60\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x78\x78\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x00\x00\x7e\x7e\x60\x60\x7c\x7c\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x60\x60\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x3e\x3e\x60\x60\x60\x60\x6e\x6e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x6c\x6c\x78\x78\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x00\x00\x63\x63\x77\x77\x7f\x7f\x6b\x6b\x63\x63\x63\x63\x00\x00" - "\x00\x00\x66\x66\x76\x76\x7e\x7e\x7e\x7e\x6e\x6e\x66\x66\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x30 - "\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x6c\x6c\x36\x36\x00\x00" - "\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x06\x06\x3c\x3c\x00\x00" - "\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x63\x63\x63\x63\x6b\x6b\x7f\x7f\x77\x77\x63\x63\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x66\x66\x66\x66\x00\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x60\x60\x7e\x7e\x00\x00" - "\x00\x00\x1e\x1e\x18\x18\x18\x18\x18\x18\x18\x18\x1e\x1e\x00\x00" - "\x00\x00\x40\x40\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x00\x00" - "\x00\x00\x78\x78\x18\x18\x18\x18\x18\x18\x18\x18\x78\x78\x00\x00" - "\x00\x00\x08\x08\x1c\x1c\x36\x36\x63\x63\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00" - // 0x60 - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x7e\x7e\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x00\x00\x0e\x0e\x18\x18\x3e\x3e\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x7c\x7c" - "\x00\x00\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x06\x06\x00\x00\x06\x06\x06\x06\x06\x06\x06\x06\x3c\x3c" - "\x00\x00\x60\x60\x60\x60\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x7f\x7f\x7f\x7f\x6b\x6b\x63\x63\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - // 0x70 - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x7e\x7e\x18\x18\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\x63\x63\x6b\x6b\x7f\x7f\x3e\x3e\x36\x36\x00\x00" - "\x00\x00\x00\x00\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x0c\x0c\x78\x78" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x00\x00\x18\x18\x3c\x3c\x7e\x7e\x7e\x7e\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x00\x7e\x7e\x78\x78\x7c\x7c\x6e\x6e\x66\x66\x06\x06\x00\x00" - "\x08\x08\x18\x18\x38\x38\x78\x78\x38\x38\x18\x18\x08\x08\x00\x00" - "\x10\x10\x18\x18\x1c\x1c\x1e\x1e\x1c\x1c\x18\x18\x10\x10\x00\x00" - /* Inverted */ - // 0xC0 - "\xff\xff\xc9\xc9\x80\x80\x80\x80\xc1\xc1\xe3\xe3\xf7\xf7\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe0\xe0\xe0\xe0\xe7\xe7\xe7\xe7\xe7\xe7" - "\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc" - "\xe7\xe7\xe7\xe7\xe7\xe7\x07\x07\x07\x07\xff\xff\xff\xff\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\xff\xff\xff\xff\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xe7" - "\xfc\xfc\xf8\xf8\xf1\xf1\xe3\xe3\xc7\xc7\x8f\x8f\x1f\x1f\x3f\x3f" - "\x3f\x3f\x1f\x1f\x8f\x8f\xc7\xc7\xe3\xe3\xf1\xf1\xf8\xf8\xfc\xfc" - "\xfe\xfe\xfc\xfc\xf8\xf8\xf0\xf0\xe0\xe0\xc0\xc0\x80\x80\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x7f\x7f\x3f\x3f\x1f\x1f\x0f\x0f\x07\x07\x03\x03\x01\x01\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00" - "\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - // 0xD0 - "\xff\xff\xe3\xe3\xe3\xe3\x88\x88\x88\x88\xf7\xf7\xe3\xe3\xff\xff" - "\xff\xff\xff\xff\xff\xff\xe0\xe0\xe0\xe0\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\x00\x00\x00\x00\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\xff\xff\xc3\xc3\x81\x81\x81\x81\x81\x81\xc3\xc3\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xe7\xe7\xe7\xe7\xe7\xe7" - "\xe7\xe7\xe7\xe7\xe7\xe7\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe0\xe0\xe0\xe0\xff\xff\xff\xff\xff\xff" - "\x87\x87\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xe7\xe7\xe1\xe1\xff\xff" - "\xff\xff\xe7\xe7\xc3\xc3\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\xe7\xe7\xcf\xcf\x81\x81\xcf\xcf\xe7\xe7\xff\xff\xff\xff" - "\xff\xff\xe7\xe7\xf3\xf3\x81\x81\xf3\xf3\xe7\xe7\xff\xff\xff\xff" - // 0x80 - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff\xe7\xe7\xff\xff" - "\xff\xff\x99\x99\x99\x99\x99\x99\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\x99\x99\x00\x00\x99\x99\x99\x99\x00\x00\x99\x99\xff\xff" - "\xe7\xe7\xc1\xc1\x9f\x9f\xc3\xc3\xf9\xf9\x83\x83\xe7\xe7\xff\xff" - "\xff\xff\x99\x99\x93\x93\xe7\xe7\xcf\xcf\x99\x99\xb9\xb9\xff\xff" - "\xe3\xe3\xc9\xc9\xe3\xe3\xc7\xc7\x90\x90\x99\x99\xc4\xc4\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xf1\xf1\xe3\xe3\xe7\xe7\xe7\xe7\xe3\xe3\xf1\xf1\xff\xff" - "\xff\xff\x8f\x8f\xc7\xc7\xe7\xe7\xe7\xe7\xc7\xc7\x8f\x8f\xff\xff" - "\xff\xff\x99\x99\xc3\xc3\x00\x00\xc3\xc3\x99\x99\xff\xff\xff\xff" - "\xff\xff\xe7\xe7\xe7\xe7\x81\x81\xe7\xe7\xe7\xe7\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xcf\xcf" - "\xff\xff\xff\xff\xff\xff\x81\x81\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\xbf\xbf\xff\xff" - // 0x90 - "\xff\xff\xc3\xc3\x99\x99\x91\x91\x89\x89\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xe7\xe7\xc7\xc7\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xf3\xf3\xe7\xe7\xcf\xcf\x81\x81\xff\xff" - "\xff\xff\x81\x81\xf3\xf3\xe7\xe7\xf3\xf3\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xf3\xf3\xe3\xe3\xc3\xc3\x93\x93\x81\x81\xf3\xf3\xff\xff" - "\xff\xff\x81\x81\x9f\x9f\x83\x83\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xc3\xc3\x9f\x9f\x83\x83\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x81\x81\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\xcf\xcf\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xc3\xc3\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xc1\xc1\xf9\xf9\xf3\xf3\xc7\xc7\xff\xff" - "\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xff\xff\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xe7\xe7\xe7\xe7\xff\xff\xe7\xe7\xe7\xe7\xcf\xcf" - "\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xff\xff" - "\xff\xff\xff\xff\x81\x81\xff\xff\xff\xff\x81\x81\xff\xff\xff\xff" - "\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\xf3\xf3\xe7\xe7\xff\xff\xe7\xe7\xff\xff" - // 0xA0 - "\xff\xff\xc3\xc3\x99\x99\x91\x91\x91\x91\x9f\x9f\xc1\xc1\xff\xff" - "\xff\xff\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x81\x81\x99\x99\xff\xff" - "\xff\xff\x83\x83\x99\x99\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\x9f\x9f\x9f\x9f\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x87\x87\x93\x93\x99\x99\x99\x99\x93\x93\x87\x87\xff\xff" - "\xff\xff\x81\x81\x9f\x9f\x83\x83\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\xff\xff\x81\x81\x9f\x9f\x83\x83\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xff\xff\xc1\xc1\x9f\x9f\x9f\x9f\x91\x91\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xff\xff\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x99\x99\x93\x93\x87\x87\x87\x87\x93\x93\x99\x99\xff\xff" - "\xff\xff\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\xff\xff\x9c\x9c\x88\x88\x80\x80\x94\x94\x9c\x9c\x9c\x9c\xff\xff" - "\xff\xff\x99\x99\x89\x89\x81\x81\x81\x81\x91\x91\x99\x99\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - // 0xB0 - "\xff\xff\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f\xff\xff" - "\xff\xff\xc3\xc3\x99\x99\x99\x99\x99\x99\x93\x93\xc9\xc9\xff\xff" - "\xff\xff\x83\x83\x99\x99\x99\x99\x83\x83\x93\x93\x99\x99\xff\xff" - "\xff\xff\xc3\xc3\x9f\x9f\xc3\xc3\xf9\xf9\xf9\xf9\xc3\xc3\xff\xff" - "\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x81\x81\xff\xff" - "\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\x9c\x9c\x9c\x9c\x94\x94\x80\x80\x88\x88\x9c\x9c\xff\xff" - "\xff\xff\x99\x99\x99\x99\xc3\xc3\xc3\xc3\x99\x99\x99\x99\xff\xff" - "\xff\xff\x99\x99\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\x81\x81\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\x81\x81\xff\xff" - "\xff\xff\xe1\xe1\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe1\xe1\xff\xff" - "\xff\xff\xbf\xbf\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xff\xff" - "\xff\xff\x87\x87\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x87\x87\xff\xff" - "\xff\xff\xf7\xf7\xe3\xe3\xc9\xc9\x9c\x9c\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff" - // 0xE0 - "\xff\xff\xe7\xe7\xc3\xc3\x81\x81\x81\x81\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\xf9\xf9\xc1\xc1\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\x9f\x9f\x9f\x9f\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\x9f\x9f\x9f\x9f\x9f\x9f\xc3\xc3\xff\xff" - "\xff\xff\xf9\xf9\xf9\xf9\xc1\xc1\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\x99\x99\x81\x81\x9f\x9f\xc3\xc3\xff\xff" - "\xff\xff\xf1\xf1\xe7\xe7\xc1\xc1\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xc1\xc1\x99\x99\x99\x99\xc1\xc1\xf9\xf9\x83\x83" - "\xff\xff\x9f\x9f\x9f\x9f\x83\x83\x99\x99\x99\x99\x99\x99\xff\xff" - "\xff\xff\xe7\xe7\xff\xff\xc7\xc7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xff\xff\xf9\xf9\xff\xff\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xc3\xc3" - "\xff\xff\x9f\x9f\x9f\x9f\x93\x93\x87\x87\x93\x93\x99\x99\xff\xff" - "\xff\xff\xc7\xc7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xff\xff\xff\xff\x99\x99\x80\x80\x80\x80\x94\x94\x9c\x9c\xff\xff" - "\xff\xff\xff\xff\x83\x83\x99\x99\x99\x99\x99\x99\x99\x99\xff\xff" - "\xff\xff\xff\xff\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - // 0xF0 - "\xff\xff\xff\xff\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f" - "\xff\xff\xff\xff\xc1\xc1\x99\x99\x99\x99\xc1\xc1\xf9\xf9\xf9\xf9" - "\xff\xff\xff\xff\x83\x83\x99\x99\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xff\xff\xff\xff\xc1\xc1\x9f\x9f\xc3\xc3\xf9\xf9\x83\x83\xff\xff" - "\xff\xff\xe7\xe7\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xf1\xf1\xff\xff" - "\xff\xff\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\xff\xff\xff\xff\x99\x99\x99\x99\x99\x99\xc3\xc3\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\x9c\x9c\x94\x94\x80\x80\xc1\xc1\xc9\xc9\xff\xff" - "\xff\xff\xff\xff\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\x99\x99\xff\xff" - "\xff\xff\xff\xff\x99\x99\x99\x99\x99\x99\xc1\xc1\xf3\xf3\x87\x87" - "\xff\xff\xff\xff\x81\x81\xf3\xf3\xe7\xe7\xcf\xcf\x81\x81\xff\xff" - "\xff\xff\xe7\xe7\xc3\xc3\x81\x81\x81\x81\xe7\xe7\xc3\xc3\xff\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\xff\x81\x81\x87\x87\x83\x83\x91\x91\x99\x99\xf9\xf9\xff\xff" - "\xf7\xf7\xe7\xe7\xc7\xc7\x87\x87\xc7\xc7\xe7\xe7\xf7\xf7\xff\xff" - "\xef\xef\xe7\xe7\xe3\xe3\xe1\xe1\xe3\xe3\xe7\xe7\xef\xef\xff\xff" - , NULL - , - // 0x40 - "\x00\x36\x7f\x7f\x3e\x1c\x08\x00" - "\x18\x18\x18\x1f\x1f\x18\x18\x18" - "\x03\x03\x03\x03\x03\x03\x03\x03" - "\x18\x18\x18\xf8\xf8\x00\x00\x00" - "\x18\x18\x18\xf8\xf8\x18\x18\x18" - "\x00\x00\x00\xf8\xf8\x18\x18\x18" - "\x03\x07\x0e\x1c\x38\x70\xe0\xc0" - "\xc0\xe0\x70\x38\x1c\x0e\x07\x03" - "\x01\x03\x07\x0f\x1f\x3f\x7f\xff" - "\x00\x00\x00\x00\x0f\x0f\x0f\x0f" - "\x80\xc0\xe0\xf0\xf8\xfc\xfe\xff" - "\x0f\x0f\x0f\x0f\x00\x00\x00\x00" - "\xf0\xf0\xf0\xf0\x00\x00\x00\x00" - "\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff" - "\x00\x00\x00\x00\xf0\xf0\xf0\xf0" - // 0x50 - "\x00\x1c\x1c\x77\x77\x08\x1c\x00" - "\x00\x00\x00\x1f\x1f\x18\x18\x18" - "\x00\x00\x00\xff\xff\x00\x00\x00" - "\x18\x18\x18\xff\xff\x18\x18\x18" - "\x00\x00\x3c\x7e\x7e\x7e\x3c\x00" - "\x00\x00\x00\x00\xff\xff\xff\xff" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x00\xff\xff\x18\x18\x18" - "\x18\x18\x18\xff\xff\x00\x00\x00" - "\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0" - "\x18\x18\x18\x1f\x1f\x00\x00\x00" - "\x78\x60\x78\x60\x7e\x18\x1e\x00" - "\x00\x18\x3c\x7e\x18\x18\x18\x00" - "\x00\x18\x18\x18\x7e\x3c\x18\x00" - "\x00\x18\x30\x7e\x30\x18\x00\x00" - "\x00\x18\x0c\x7e\x0c\x18\x00\x00" - // 0x00 - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x18\x18\x00\x18\x00" - "\x00\x66\x66\x66\x00\x00\x00\x00" - "\x00\x66\xff\x66\x66\xff\x66\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\x66\x6c\x18\x30\x66\x46\x00" - "\x1c\x36\x1c\x38\x6f\x66\x3b\x00" - "\x00\x18\x18\x18\x00\x00\x00\x00" - "\x00\x0e\x1c\x18\x18\x1c\x0e\x00" - "\x00\x70\x38\x18\x18\x38\x70\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\x7e\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x06\x0c\x18\x30\x60\x40\x00" - // 0x10 - "\x00\x3c\x66\x6e\x76\x66\x3c\x00" - "\x00\x18\x38\x18\x18\x18\x7e\x00" - "\x00\x3c\x66\x0c\x18\x30\x7e\x00" - "\x00\x7e\x0c\x18\x0c\x66\x3c\x00" - "\x00\x0c\x1c\x3c\x6c\x7e\x0c\x00" - "\x00\x7e\x60\x7c\x06\x66\x3c\x00" - "\x00\x3c\x60\x7c\x66\x66\x3c\x00" - "\x00\x7e\x06\x0c\x18\x30\x30\x00" - "\x00\x3c\x66\x3c\x66\x66\x3c\x00" - "\x00\x3c\x66\x3e\x06\x0c\x38\x00" - "\x00\x00\x18\x18\x00\x18\x18\x00" - "\x00\x00\x18\x18\x00\x18\x18\x30" - "\x06\x0c\x18\x30\x18\x0c\x06\x00" - "\x00\x00\x7e\x00\x00\x7e\x00\x00" - "\x60\x30\x18\x0c\x18\x30\x60\x00" - "\x00\x3c\x66\x0c\x18\x00\x18\x00" - // 0x20 - "\x00\x3c\x66\x6e\x6e\x60\x3e\x00" - "\x00\x18\x3c\x66\x66\x7e\x66\x00" - "\x00\x7c\x66\x7c\x66\x66\x7c\x00" - "\x00\x3c\x66\x60\x60\x66\x3c\x00" - "\x00\x78\x6c\x66\x66\x6c\x78\x00" - "\x00\x7e\x60\x7c\x60\x60\x7e\x00" - "\x00\x7e\x60\x7c\x60\x60\x60\x00" - "\x00\x3e\x60\x60\x6e\x66\x3e\x00" - "\x00\x66\x66\x7e\x66\x66\x66\x00" - "\x00\x7e\x18\x18\x18\x18\x7e\x00" - "\x00\x06\x06\x06\x06\x66\x3c\x00" - "\x00\x66\x6c\x78\x78\x6c\x66\x00" - "\x00\x60\x60\x60\x60\x60\x7e\x00" - "\x00\x63\x77\x7f\x6b\x63\x63\x00" - "\x00\x66\x76\x7e\x7e\x6e\x66\x00" - "\x00\x3c\x66\x66\x66\x66\x3c\x00" - // 0x30 - "\x00\x7c\x66\x66\x7c\x60\x60\x00" - "\x00\x3c\x66\x66\x66\x6c\x36\x00" - "\x00\x7c\x66\x66\x7c\x6c\x66\x00" - "\x00\x3c\x60\x3c\x06\x06\x3c\x00" - "\x00\x7e\x18\x18\x18\x18\x18\x00" - "\x00\x66\x66\x66\x66\x66\x7e\x00" - "\x00\x66\x66\x66\x66\x3c\x18\x00" - "\x00\x63\x63\x6b\x7f\x77\x63\x00" - "\x00\x66\x66\x3c\x3c\x66\x66\x00" - "\x00\x66\x66\x3c\x18\x18\x18\x00" - "\x00\x7e\x0c\x18\x30\x60\x7e\x00" - "\x00\x1e\x18\x18\x18\x18\x1e\x00" - "\x00\x40\x60\x30\x18\x0c\x06\x00" - "\x00\x78\x18\x18\x18\x18\x78\x00" - "\x00\x08\x1c\x36\x63\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\x00" - // 0x60 - "\x00\x18\x3c\x7e\x7e\x3c\x18\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x00\x60\x60\x7c\x66\x66\x7c\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x00" - "\x00\x06\x06\x3e\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x00\x0e\x18\x3e\x18\x18\x18\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x7c" - "\x00\x60\x60\x7c\x66\x66\x66\x00" - "\x00\x18\x00\x38\x18\x18\x3c\x00" - "\x00\x06\x00\x06\x06\x06\x06\x3c" - "\x00\x60\x60\x6c\x78\x6c\x66\x00" - "\x00\x38\x18\x18\x18\x18\x3c\x00" - "\x00\x00\x66\x7f\x7f\x6b\x63\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - // 0x70 - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x7c\x66\x60\x60\x60\x00" - "\x00\x00\x3e\x60\x3c\x06\x7c\x00" - "\x00\x18\x7e\x18\x18\x18\x0e\x00" - "\x00\x00\x66\x66\x66\x66\x3e\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\x63\x6b\x7f\x3e\x36\x00" - "\x00\x00\x66\x3c\x18\x3c\x66\x00" - "\x00\x00\x66\x66\x66\x3e\x0c\x78" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x00\x18\x3c\x7e\x7e\x18\x3c\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x00\x7e\x78\x7c\x6e\x66\x06\x00" - "\x08\x18\x38\x78\x38\x18\x08\x00" - "\x10\x18\x1c\x1e\x1c\x18\x10\x00" - /* Inverted */ - // 0xC0 - "\xff\xc9\x80\x80\xc1\xe3\xf7\xff" - "\xe7\xe7\xe7\xe0\xe0\xe7\xe7\xe7" - "\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc" - "\xe7\xe7\xe7\x07\x07\xff\xff\xff" - "\xe7\xe7\xe7\x07\x07\xe7\xe7\xe7" - "\xff\xff\xff\x07\x07\xe7\xe7\xe7" - "\xfc\xf8\xf1\xe3\xc7\x8f\x1f\x3f" - "\x3f\x1f\x8f\xc7\xe3\xf1\xf8\xfc" - "\xfe\xfc\xf8\xf0\xe0\xc0\x80\x00" - "\xff\xff\xff\xff\xf0\xf0\xf0\xf0" - "\x7f\x3f\x1f\x0f\x07\x03\x01\x00" - "\xf0\xf0\xf0\xf0\xff\xff\xff\xff" - "\x0f\x0f\x0f\x0f\xff\xff\xff\xff" - "\x00\x00\xff\xff\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\x00\x00" - "\xff\xff\xff\xff\x0f\x0f\x0f\x0f" - // 0xD0 - "\xff\xe3\xe3\x88\x88\xf7\xe3\xff" - "\xff\xff\xff\xe0\xe0\xe7\xe7\xe7" - "\xff\xff\xff\x00\x00\xff\xff\xff" - "\xe7\xe7\xe7\x00\x00\xe7\xe7\xe7" - "\xff\xff\xc3\x81\x81\x81\xc3\xff" - "\xff\xff\xff\xff\x00\x00\x00\x00" - "\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\xff\x00\x00\xe7\xe7\xe7" - "\xe7\xe7\xe7\x00\x00\xff\xff\xff" - "\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f" - "\xe7\xe7\xe7\xe0\xe0\xff\xff\xff" - "\x87\x9f\x87\x9f\x81\xe7\xe1\xff" - "\xff\xe7\xc3\x81\xe7\xe7\xe7\xff" - "\xff\xe7\xe7\xe7\x81\xc3\xe7\xff" - "\xff\xe7\xcf\x81\xcf\xe7\xff\xff" - "\xff\xe7\xf3\x81\xf3\xe7\xff\xff" - // 0x80 - "\xff\xff\xff\xff\xff\xff\xff\xff" - "\xff\xe7\xe7\xe7\xe7\xff\xe7\xff" - "\xff\x99\x99\x99\xff\xff\xff\xff" - "\xff\x99\x00\x99\x99\x00\x99\xff" - "\xe7\xc1\x9f\xc3\xf9\x83\xe7\xff" - "\xff\x99\x93\xe7\xcf\x99\xb9\xff" - "\xe3\xc9\xe3\xc7\x90\x99\xc4\xff" - "\xff\xe7\xe7\xe7\xff\xff\xff\xff" - "\xff\xf1\xe3\xe7\xe7\xe3\xf1\xff" - "\xff\x8f\xc7\xe7\xe7\xc7\x8f\xff" - "\xff\x99\xc3\x00\xc3\x99\xff\xff" - "\xff\xe7\xe7\x81\xe7\xe7\xff\xff" - "\xff\xff\xff\xff\xff\xe7\xe7\xcf" - "\xff\xff\xff\x81\xff\xff\xff\xff" - "\xff\xff\xff\xff\xff\xe7\xe7\xff" - "\xff\xf9\xf3\xe7\xcf\x9f\xbf\xff" - // 0x90 - "\xff\xc3\x99\x91\x89\x99\xc3\xff" - "\xff\xe7\xc7\xe7\xe7\xe7\x81\xff" - "\xff\xc3\x99\xf3\xe7\xcf\x81\xff" - "\xff\x81\xf3\xe7\xf3\x99\xc3\xff" - "\xff\xf3\xe3\xc3\x93\x81\xf3\xff" - "\xff\x81\x9f\x83\xf9\x99\xc3\xff" - "\xff\xc3\x9f\x83\x99\x99\xc3\xff" - "\xff\x81\xf9\xf3\xe7\xcf\xcf\xff" - "\xff\xc3\x99\xc3\x99\x99\xc3\xff" - "\xff\xc3\x99\xc1\xf9\xf3\xc7\xff" - "\xff\xff\xe7\xe7\xff\xe7\xe7\xff" - "\xff\xff\xe7\xe7\xff\xe7\xe7\xcf" - "\xf9\xf3\xe7\xcf\xe7\xf3\xf9\xff" - "\xff\xff\x81\xff\xff\x81\xff\xff" - "\x9f\xcf\xe7\xf3\xe7\xcf\x9f\xff" - "\xff\xc3\x99\xf3\xe7\xff\xe7\xff" - // 0xA0 - "\xff\xc3\x99\x91\x91\x9f\xc1\xff" - "\xff\xe7\xc3\x99\x99\x81\x99\xff" - "\xff\x83\x99\x83\x99\x99\x83\xff" - "\xff\xc3\x99\x9f\x9f\x99\xc3\xff" - "\xff\x87\x93\x99\x99\x93\x87\xff" - "\xff\x81\x9f\x83\x9f\x9f\x81\xff" - "\xff\x81\x9f\x83\x9f\x9f\x9f\xff" - "\xff\xc1\x9f\x9f\x91\x99\xc1\xff" - "\xff\x99\x99\x81\x99\x99\x99\xff" - "\xff\x81\xe7\xe7\xe7\xe7\x81\xff" - "\xff\xf9\xf9\xf9\xf9\x99\xc3\xff" - "\xff\x99\x93\x87\x87\x93\x99\xff" - "\xff\x9f\x9f\x9f\x9f\x9f\x81\xff" - "\xff\x9c\x88\x80\x94\x9c\x9c\xff" - "\xff\x99\x89\x81\x81\x91\x99\xff" - "\xff\xc3\x99\x99\x99\x99\xc3\xff" - // 0xB0 - "\xff\x83\x99\x99\x83\x9f\x9f\xff" - "\xff\xc3\x99\x99\x99\x93\xc9\xff" - "\xff\x83\x99\x99\x83\x93\x99\xff" - "\xff\xc3\x9f\xc3\xf9\xf9\xc3\xff" - "\xff\x81\xe7\xe7\xe7\xe7\xe7\xff" - "\xff\x99\x99\x99\x99\x99\x81\xff" - "\xff\x99\x99\x99\x99\xc3\xe7\xff" - "\xff\x9c\x9c\x94\x80\x88\x9c\xff" - "\xff\x99\x99\xc3\xc3\x99\x99\xff" - "\xff\x99\x99\xc3\xe7\xe7\xe7\xff" - "\xff\x81\xf3\xe7\xcf\x9f\x81\xff" - "\xff\xe1\xe7\xe7\xe7\xe7\xe1\xff" - "\xff\xbf\x9f\xcf\xe7\xf3\xf9\xff" - "\xff\x87\xe7\xe7\xe7\xe7\x87\xff" - "\xff\xf7\xe3\xc9\x9c\xff\xff\xff" - "\xff\xff\xff\xff\xff\xff\x00\xff" - // 0xE0 - "\xff\xe7\xc3\x81\x81\xc3\xe7\xff" - "\xff\xff\xc3\xf9\xc1\x99\xc1\xff" - "\xff\x9f\x9f\x83\x99\x99\x83\xff" - "\xff\xff\xc3\x9f\x9f\x9f\xc3\xff" - "\xff\xf9\xf9\xc1\x99\x99\xc1\xff" - "\xff\xff\xc3\x99\x81\x9f\xc3\xff" - "\xff\xf1\xe7\xc1\xe7\xe7\xe7\xff" - "\xff\xff\xc1\x99\x99\xc1\xf9\x83" - "\xff\x9f\x9f\x83\x99\x99\x99\xff" - "\xff\xe7\xff\xc7\xe7\xe7\xc3\xff" - "\xff\xf9\xff\xf9\xf9\xf9\xf9\xc3" - "\xff\x9f\x9f\x93\x87\x93\x99\xff" - "\xff\xc7\xe7\xe7\xe7\xe7\xc3\xff" - "\xff\xff\x99\x80\x80\x94\x9c\xff" - "\xff\xff\x83\x99\x99\x99\x99\xff" - "\xff\xff\xc3\x99\x99\x99\xc3\xff" - // 0xF0 - "\xff\xff\x83\x99\x99\x83\x9f\x9f" - "\xff\xff\xc1\x99\x99\xc1\xf9\xf9" - "\xff\xff\x83\x99\x9f\x9f\x9f\xff" - "\xff\xff\xc1\x9f\xc3\xf9\x83\xff" - "\xff\xe7\x81\xe7\xe7\xe7\xf1\xff" - "\xff\xff\x99\x99\x99\x99\xc1\xff" - "\xff\xff\x99\x99\x99\xc3\xe7\xff" - "\xff\xff\x9c\x94\x80\xc1\xc9\xff" - "\xff\xff\x99\xc3\xe7\xc3\x99\xff" - "\xff\xff\x99\x99\x99\xc1\xf3\x87" - "\xff\xff\x81\xf3\xe7\xcf\x81\xff" - "\xff\xe7\xc3\x81\x81\xe7\xc3\xff" - "\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7" - "\xff\x81\x87\x83\x91\x99\xf9\xff" - "\xf7\xe7\xc7\x87\xc7\xe7\xf7\xff" - "\xef\xe7\xe3\xe1\xe3\xe7\xef\xff" - , "Atari", CIOLIB_ATASCII} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xff\xff\x83\x83\x39\x39\x29\x29\x23\x23\x3f\x3f\x81\x81\xff\xff" - "\xff\xff\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x03\x03\x99\x99\x93\x93\x99\x99\x99\x99\x03\x03\xff\xff" - "\xff\xff\x83\x83\x39\x39\x3f\x3f\x3f\x3f\x39\x39\x83\x83\xf7\xf7" - "\xff\xff\x0f\x0f\x87\x87\x93\x93\x99\x99\x99\x99\x03\x03\xff\xff" - "\xff\xff\x01\x01\x9f\x9f\x83\x83\x9f\x9f\x99\x99\x03\x03\xf7\xf7" - "\xfb\xfb\x01\x01\x9c\x9c\x87\x87\x9f\x9f\x9f\x9f\x1f\x1f\xff\xff" - "\xf7\xf7\x83\x83\x39\x39\x3f\x3f\x31\x31\x39\x39\x81\x81\xfd\xfd" - "\xff\xff\x39\x39\x39\x39\x21\x21\x39\x39\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xfd\xfd\xf9\xf9\xf9\xf9\xf9\xf9\x19\x19\x39\x39\x03\x03\x7f\x7f" - "\xff\xff\x39\x39\x33\x33\x27\x27\x33\x33\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x1f\x1f\x9f\x9f\x9f\x9f\x9f\x9f\x99\x99\x03\x03\xf7\xf7" - "\xff\xff\x39\x39\x11\x11\x01\x01\x29\x29\x39\x39\x39\x39\x7f\x7f" - "\xff\xff\x39\x39\x29\x29\x21\x21\x31\x31\x39\x39\x39\x39\xff\xff" - "\xff\xff\x83\x83\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\x03\x03\x99\x99\x99\x99\x93\x93\x9f\x9f\x1f\x1f\xff\xff" - "\xff\xff\x83\x83\x39\x39\x39\x39\x29\x29\x35\x35\x8b\x8b\xfd\xfd" - "\xff\xff\x03\x03\x99\x99\x93\x93\x99\x99\x99\x99\x19\x19\xfb\xfb" - "\xff\xff\x83\x83\x3f\x3f\x83\x83\xf9\xf9\x39\x39\x03\x03\x7f\x7f" - "\xf7\xf7\x03\x03\xc9\xc9\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xdf\xdf" - "\x7f\x7f\x31\x31\x33\x33\x33\x33\x33\x33\x33\x33\x81\x81\xff\xff" - "\x7f\x7f\x39\x39\x39\x39\x93\x93\x93\x93\xc7\xc7\xef\xef\xff\xff" - "\x7f\x7f\x39\x39\x39\x39\x29\x29\x01\x01\x11\x11\x39\x39\xff\xff" - "\x3f\x3f\x39\x39\x39\x39\xa3\xa3\x39\x39\x39\x39\x39\x39\xfd\xfd" - "\xfd\xfd\x39\x39\x39\x39\xa3\xa3\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\xff\xff\x01\x01\xf3\xf3\xe7\xe7\xcd\xcd\x99\x99\x81\x81\xfd\xfd" - "\xff\xff\x81\x81\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x81\x81\xff\xff" - "\x3f\x3f\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xfc\xfc\xfe\xfe" - "\xff\xff\x81\x81\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\x81\x81\xff\xff" - "\xe7\xe7\xc3\xc3\x99\x99\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x1c\x1c\x1c\x1c\x18\x18\x18\x18\x00\x00\x18\x18\x10\x10" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x7e\x7e\xc0\xc0\x7c\x7c\x06\x06\xfc\xfc\x30\x30\x00\x00" - "\x63\x63\xa6\xa6\xcc\xcc\x18\x18\x33\x33\x65\x65\xc6\xc6\x80\x80" - "\x3c\x3c\x66\x66\x64\x64\x7b\x7b\xce\xce\xc6\xc6\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x00\x00\x7c\x7c\xce\xce\xd6\xd6\xd6\xd6\xe6\xe6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\x8c\x8c\x38\x38\x66\x66\xfe\xfe\x00\x00" - "\x20\x20\x7c\x7c\xc6\xc6\x1e\x1e\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x06\x06\x06\x06\x02\x02" - "\x00\x00\xfe\xfe\xc0\xc0\xfc\xfc\x06\x06\xc6\xc6\xfc\xfc\x00\x00" - "\x00\x00\x7c\x7c\xc0\xc0\xfc\xfc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x80\x80\xfe\xfe\xcc\xcc\x98\x98\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x18\x18\x30\x30\x60\x60\xc0\xc0\x60\x60\x30\x30\x18\x18\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x06\x06\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x3c\x3c\x66\x66\x0c\x0c\x18\x18\x00\x00\x18\x18\x10\x10" - "\x00\x00\x7c\x7c\xc6\xc6\xd6\xd6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\xfc\xfc\x66\x66\x6c\x6c\x66\x66\x66\x66\xfc\xfc\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x08\x08" - "\x00\x00\xf0\xf0\x78\x78\x6c\x6c\x66\x66\x66\x66\xfc\xfc\x00\x00" - "\x00\x00\xfe\xfe\x60\x60\x7c\x7c\x60\x60\x66\x66\xfc\xfc\x08\x08" - "\x04\x04\xfe\xfe\x63\x63\x78\x78\x60\x60\x60\x60\xe0\xe0\x00\x00" - "\x08\x08\x7c\x7c\xc6\xc6\xc0\xc0\xce\xce\xc6\xc6\x7e\x7f\x02\x02" - "\x00\x00\xc6\xc6\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x02\x02\x06\x06\x06\x06\x06\x06\xe6\xe6\xc6\xc6\xfc\xfc\x80\x80" - "\x00\x00\xc6\xc6\xcc\xcc\xd8\xd8\xcc\xcc\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\xe0\xe0\x60\x60\x60\x60\x60\x60\x66\x66\xfc\xfc\x08\x08" - "\x00\x00\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x80\x80" - "\x00\x00\xc6\xc6\xd6\xd6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\xfc\xfc\x66\x66\x66\x66\x6c\x6c\x60\x60\xe0\xe0\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xd6\xd6\xca\xca\x74\x74\x02\x02" - "\x00\x00\xfc\xfc\x66\x66\x6c\x6c\x66\x66\x66\x66\xe6\xe6\x04\x04" - "\x00\x00\x7e\x7e\xc0\xc0\x7c\x7c\x06\x06\xc6\xc6\xfc\xfc\x80\x80" - "\x08\x08\xfc\xfc\x36\x36\x30\x30\x30\x30\x30\x30\x30\x30\x20\x20" - "\x80\x80\xce\xce\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x10\x10\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\x80\x80\xc6\xc6\xc6\xc6\x5c\x5c\xc6\xc6\xc6\xc6\xc6\xc6\x02\x02" - "\x02\x02\xc6\xc6\xc6\xc6\x5c\x5c\x18\x18\x18\x18\x18\x18\x08\x08" - "\x00\x00\xfe\xfe\x0c\x0c\x18\x18\x32\x32\x66\x66\xfe\xfe\x02\x02" - "\x00\x00\x7e\x7e\x30\x30\x30\x30\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x00\x00\x7e\x7e\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x7e\x7e\x00\x00" - "\x18\x18\x3c\x3c\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\xe0\xe0\x60\x60\x6c\x6c\x66\x66\x66\x66\x66\x66\xfc\xfc\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\xc2\xc2\xc0\xc0\xc2\xc2\x7e\x7e\x00\x00" - "\x0e\x0e\x0c\x0c\x6c\x6c\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x1e\x1e\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x20\x20" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x76\x76\x06\x06\xfc\xfc" - "\xe0\xe0\x60\x60\x6c\x6c\x66\x66\x66\x66\x66\x66\xe6\xe6\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x10\x10" - "\x02\x02\x06\x06\x00\x00\x06\x06\x06\x06\xc6\xc6\xc6\xc6\x7c\x7c" - "\xe0\xe0\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\xe6\xe6\x02\x02" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x10\x10" - "\x00\x00\x00\x00\xfc\xfc\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x80\x80" - "\x00\x00\x00\x00\xfc\xfc\x66\x66\x66\x66\x66\x66\xe6\xe6\x04\x04" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\xfc\xfc\x66\x66\x66\x66\x6c\x6c\x60\x60\xe0\xe0" - "\x00\x00\x00\x00\x7e\x7e\xcc\xcc\xcc\xcc\x6c\x6c\x0c\x0c\x0e\x0e" - "\x00\x00\x08\x08\xfc\xfc\x66\x66\x60\x60\x60\x60\x60\x60\x40\x40" - "\x00\x00\x00\x00\x7e\x7e\xc0\xc0\x7c\x7c\x06\x06\xfc\xfc\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x20\x20" - "\x00\x00\x80\x80\xce\xce\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x00\x00\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x00\x00" - "\x00\x00\x02\x02\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\x5c\x5c\xc6\xc6\xc6\xc6\x02\x02" - "\x00\x00\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x5e\x5e\x06\x06\x7c\x7c" - "\x00\x00\x00\x00\xfe\xfe\x8c\x8c\x18\x18\x32\x32\xfe\xfe\x00\x00" - "\x1c\x1c\x30\x30\x30\x30\x60\x60\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x38\x38\x0c\x0c\x0c\x0c\x06\x06\x0c\x0c\x0c\x0c\x38\x38\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\xcc\x33\x33\xcc\xcc\x33\x33\xcc\xcc\x33\x33\xcc\xcc\x33\x33" - "\x9f\x9f\xe7\xe7\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\xf3\xf3\xcf\xcf\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x83\x83\x39\x39\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x89\x89\x23\x23\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x39\x39\xff\xff\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\x83\x83\x39\x39\x83\x83\x39\x39\x21\x21\x39\x39\x39\x39\x7b\x7b" - "\xff\xff\x80\x80\x33\x33\x20\x20\x33\x33\x33\x33\x30\x30\x77\x77" - "\xff\xff\x83\x83\x39\x39\x3f\x3f\x3f\x3f\x39\x39\x83\x83\xcf\xcf" - "\x9f\x9f\xcf\xcf\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\xe7\xe7\xcf\xcf\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\xcf\xcf\x33\x33\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\x33\x33\xff\xff\x03\x03\x9f\x9f\x83\x83\x9f\x9f\x01\x01\xff\xff" - "\x3f\x3f\xcf\xcf\x03\x03\xcf\xcf\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\xf3\xf3\xcf\xcf\x03\x03\xcf\xcf\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\xcf\xcf\x33\x33\xff\xff\x03\x03\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\x33\x33\xff\xff\x03\x03\xcf\xcf\xcf\xcf\xcf\xcf\x03\x03\xff\xff" - "\xff\xff\x1f\x1f\x8f\x8f\x87\x87\x13\x13\x99\x99\x03\x03\xff\xff" - "\x89\x89\x23\x23\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xe7\xe7\x83\x83\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xcf\xcf\x83\x83\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\x33\x33\xff\xff\x87\x87\x33\x33\x33\x33\x87\x87\xff\xff" - "\x89\x89\x23\x23\xff\xff\x83\x83\x39\x39\x39\x39\x83\x83\xff\xff" - "\x39\x39\xff\xff\x83\x83\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\xff\xff\x3c\x3c\x99\x99\xe7\xe7\x99\x99\x3c\x3c\xff\xff" - "\xfe\xfe\x85\x85\x3b\x3b\x35\x35\x29\x29\x59\x59\xa3\xa3\x7f\x7f" - "\xcf\xcf\xe7\xe7\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xe7\xe7\xcf\xcf\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xcf\xcf\x33\x33\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xff\xff\x33\x33\x7f\x7f\x31\x31\x33\x33\x33\x33\x81\x81\xff\xff" - "\xf3\xf3\xe7\xe7\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\xff\xff" - "\x0f\x0f\x9f\x9f\x83\x83\x99\x99\x83\x83\x9f\x9f\x9f\x9f\x0f\x0f" - "\x83\x83\x39\x39\x39\x39\x23\x23\x39\x39\x39\x39\x23\x23\x3f\x3f" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00" - "\x10\x10\x18\x18\x00\x00\x18\x18\x18\x18\x1c\x1c\x1c\x1c\x00\x00" - "\x00\x00\x18\x18\x7e\x7e\xc0\xc0\xc0\xc0\xc0\xc0\x7e\x7e\x18\x18" - "\x08\x08\x3c\x3c\x66\x66\xf8\xf8\x60\x60\x66\x66\xfc\xfc\x08\x08" - "\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\xc6\xc6\x00\x00\x00\x00" - "\xc6\xc6\xc6\xc6\x6c\x6c\x38\x38\x10\x10\xfe\xfe\x10\x10\x10\x10" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x7c\x7c\xc0\xc0\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x03\x03\x3e\x3e" - "\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x7c\x82\x82\x9a\x9a\xa2\xa2\xa2\xa2\x9a\x9a\x82\x82\x7c\x7c" - "\x00\x00\x78\x78\xcc\xcc\xcc\xcc\xf6\xf6\x00\x00\xfe\xfe\x00\x00" - "\x00\x00\x12\x12\x6c\x6c\xd8\xd8\x6c\x6c\x12\x12\x00\x00\x00\x00" - "\xfe\xfe\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7c\x7c\x82\x82\xb2\xb2\xaa\xaa\xb2\xb2\xaa\xaa\x82\x82\x7c\x7c" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x78\x78\xcc\xcc\x78\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x30\x30\x30\xfc\xfc\x30\x30\x30\x30\x00\x00\xfc\xfc\x00\x00" - "\x70\x70\xd8\xd8\x30\x30\x60\x60\xf8\xf8\x00\x00\x00\x00\x00\x00" - "\xf0\xf0\x18\x18\x70\x70\x18\x18\xf0\xf0\x00\x00\x00\x00\x00\x00" - "\x30\x30\x60\x60\xc0\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\xff\xff\xc0\xc0" - "\x7e\x7e\xec\xec\xec\xec\x6c\x6c\x2c\x2c\x2c\x2c\x2e\x2e\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x60\x60\xe0\xe0\x60\x60\x60\x60\xf0\xf0\x00\x00\x00\x00\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\x78\x78\x00\x00\xfc\xfc\x00\x00\x00\x00" - "\x00\x00\x48\x48\x36\x36\x1b\x1b\x36\x36\x48\x48\x00\x00\x00\x00" - "\x63\x63\xe6\xe6\x6c\x6c\x7b\x7b\x37\x37\x6f\x6f\xc3\xc3\x00\x00" - "\x63\x63\xe6\xe6\x6c\x6c\x7e\x7e\x33\x33\x66\x66\xcf\xcf\x00\x00" - "\xc3\xc3\xe6\xe6\x6c\x6c\xdb\xdb\x37\x37\x6f\x6f\xc3\xc3\x00\x00" - "\x08\x08\x18\x18\x00\x00\x18\x18\x30\x30\x66\x66\x3c\x3c\x00\x00" - "\x60\x60\x18\x18\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x0c\x0c\x30\x30\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x7c\x7c\xc6\xc6\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x76\x76\xdc\xdc\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\xc6\xc6\x00\x00\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x7c\x7c\xc6\xc6\x7c\x7c\xc6\xc6\xde\xde\xc6\xc6\xc6\xc6\x84\x84" - "\x00\x00\x7f\x7f\xcc\xcc\xdf\xdf\xcc\xcc\xcc\xcc\xcf\xcf\x88\x88" - "\x00\x00\x7c\x7c\xc6\xc6\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x60\x60\x30\x30\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\x18\x18\x30\x30\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\x30\x30\xcc\xcc\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\xcc\xcc\x00\x00\xfc\xfc\x60\x60\x7c\x7c\x60\x60\xfe\xfe\x00\x00" - "\xc0\xc0\x30\x30\xfc\xfc\x30\x30\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\x0c\x0c\x30\x30\xfc\xfc\x30\x30\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\x30\x30\xcc\xcc\x00\x00\xfc\xfc\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\xcc\xcc\x00\x00\xfc\xfc\x30\x30\x30\x30\x30\x30\xfc\xfc\x00\x00" - "\x00\x00\xe0\xe0\x70\x70\x78\x78\xec\xec\x66\x66\xfc\xfc\x00\x00" - "\x76\x76\xdc\xdc\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x30\x30\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x00\x00\x78\x78\xcc\xcc\xcc\xcc\x78\x78\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\xc3\xc3\x66\x66\x18\x18\x66\x66\xc3\xc3\x00\x00" - "\x01\x01\x7a\x7a\xc4\xc4\xca\xca\xd6\xd6\xa6\xa6\x5c\x5c\x80\x80" - "\x30\x30\x18\x18\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x18\x18\x30\x30\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x30\x30\xcc\xcc\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x00\x00\xcc\xcc\x80\x80\xce\xce\xcc\xcc\xcc\xcc\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x00\x00" - "\xf0\xf0\x60\x60\x7c\x7c\x66\x66\x7c\x7c\x60\x60\x60\x60\xf0\xf0" - "\x7c\x7c\xc6\xc6\xc6\xc6\xdc\xdc\xc6\xc6\xc6\xc6\xdc\xdc\xc0\xc0" - "\x30\x30\x18\x18\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x30\x30\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x76\x76\xdc\xdc\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\xc6\xc6\x00\x00\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x7c\x7c\xc6\xc6\x7c\x7c\x06\x06\x76\x76\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7e\x7e\xc8\xc8\x7f\x7f\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\xc6\xc6\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x18\x18\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x18\x18\x30\x30\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\xc6\xc6\x00\x00\x7c\x7c\xc6\xc6\xdc\xdc\xc0\xc0\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x7e\x7e\x18\x18\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\xfc\xfc\xc6\xc6\xc6\xc6\xc6\xc6\x02\x02" - "\x30\x30\x18\x18\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x30\x30\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x76\x76\xdc\xdc\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x6c\x6c\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x03\x03\x3e\x3e\x6e\x6e\x7e\x7e\x76\x76\x7c\x7c\xc0\xc0" - "\x76\x76\xdc\xdc\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\xc6\xc6\x80\x80\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x38\x38\xf0\xf0" - "\xf0\xf0\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\xf0\xf0" - "\x00\x00\xc6\xc6\x80\x80\xc6\xc6\xc6\xc6\x6c\x6c\x38\x38\xf0\xf0" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x1c\x1c\x1c\x18\x18\x18\x00\x18\x18\x10\x00\x00\x00\x00" - "\x36\x36\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x6c\x6c\xfe\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00\x00" - "\x00\x28\x7e\xa8\xfc\x7e\x2a\xfc\x28\x00\x00\x00\x00\x00" - "\x00\x01\x33\x56\x6c\x18\x36\x6a\xcc\x80\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\x68\xd2\xcc\xcc\x7a\x00\x00\x00\x00\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x03\x0c\x18\x30\x30\x30\x30\x18\x0c\x03\x00\x00\x00\x00" - "\xc0\x30\x18\x0c\x0c\x0c\x0c\x18\x30\xc0\x00\x00\x00\x00" - "\x00\xc6\x6c\x38\xfe\x38\x6c\xc6\x00\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x7e\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x00\x00\x00" - "\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x01\x03\x06\x0c\x08\x18\x30\x20\x60\xc0\x80\x00\x00\x00" - "\x00\x7c\xce\xd6\xd6\xd6\xd6\xe6\x7c\x00\x00\x00\x00\x00" - "\x00\x18\x38\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x00\x3c\x66\x46\x1c\x30\x62\x66\x7e\x00\x00\x00\x00\x00" - "\x20\x7c\xc6\x06\x1e\x06\x06\xc6\x7c\x00\x00\x00\x00\x00" - "\x40\x66\x66\x66\x3e\x06\x06\x06\x06\x02\x00\x00\x00\x00" - "\x00\xfe\xc0\xc0\xfc\x06\x86\xc6\xfc\x00\x00\x00\x00\x00" - "\x00\x7c\xc0\xc0\xfc\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x80\xfe\xc6\x8c\x8c\x18\x18\x30\x30\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\x7c\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\x7e\x06\x06\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x18\x18\x30\x00\x00\x00\x00" - "\x06\x0c\x18\x30\x60\xc0\x60\x30\x18\x0c\x06\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00" - "\x60\x30\x18\x0c\x06\x03\x06\x0c\x18\x30\x60\x00\x00\x00" - "\x3c\x66\x46\x0c\x18\x18\x00\x18\x18\x10\x00\x00\x00\x00" - "\x00\x7c\xc6\xd6\xd6\xd6\xdc\xc0\x7c\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xde\xc6\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x6c\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x08\x00\x00\x00\x00" - "\x00\xf8\x6c\x6c\x66\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x00\xfe\x60\x60\x7c\x60\x60\x66\xfc\x08\x00\x00\x00\x00" - "\x04\xfc\x66\x62\x78\x60\x60\x60\xe0\x00\x00\x00\x00\x00" - "\x02\x7e\xc6\xc2\xc0\xce\xc6\xc6\x7e\x02\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xde\xc6\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\x7e\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x02\x06\x06\x06\x06\xe6\xc6\xc6\xfc\x80\x00\x00\x00\x00" - "\x00\xc6\xc6\xcc\xd8\xcc\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\xe0\x60\x60\x60\x62\x62\x66\xfc\x04\x00\x00\x00\x00" - "\x00\xc6\xc6\xee\xfe\xd6\xd6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\xc6\xd6\xd6\xde\xce\xce\xc6\xc6\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x66\x6c\x60\x60\xe0\x00\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xc6\xc6\xd6\xce\x7c\x02\x00\x00\x00\x00" - "\x00\xfc\x66\x66\x6c\x66\x66\x66\xe6\x04\x00\x00\x00\x00" - "\x00\x7e\xc0\xc0\x7c\x06\x86\xc6\xfc\x80\x00\x00\x00\x00" - "\x04\xfc\x36\x32\x30\x30\x30\x30\x30\x20\x00\x00\x00\x00" - "\x80\xce\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x80\xc6\xc6\xc6\x6c\x6c\x38\x38\x10\x00\x00\x00\x00\x00" - "\x80\xc6\xc6\xd6\xd6\xfe\xee\xee\xc6\x00\x00\x00\x00\x00" - "\x80\xc6\xc6\xc6\x5c\xc6\xc6\xc6\xc6\x02\x00\x00\x00\x00" - "\x02\xc6\xc6\xc6\x5c\x18\x18\x18\x18\x08\x00\x00\x00\x00" - "\x00\xfe\x86\x0c\x18\x32\x62\xc6\xfe\x02\x00\x00\x00\x00" - "\x00\x7e\x30\x30\x30\x30\x30\x30\x7e\x00\x00\x00\x00\x00" - "\x80\xc0\x60\x30\x10\x18\x0c\x04\x06\x03\x01\x00\x00\x00" - "\x00\x7e\x0c\x0c\x0c\x0c\x0c\x0c\x7e\x00\x00\x00\x00\x00" - "\x18\x3c\x66\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00" - "\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\xe0\x60\x6c\x66\x66\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x00\x00\x00\x00\x00" - "\x0e\x0c\x6c\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x1e\x30\x7c\x30\x30\x30\x30\x30\x30\x20\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\x76\x06\x06\xfc\x00\x00\x00" - "\xe0\x60\x6c\x66\x66\x66\x66\x66\xe6\x04\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x18\x18\x18\x18\x10\x00\x00\x00\x00" - "\x06\x00\x06\x06\x06\x46\x66\x66\x66\x66\x3c\x00\x00\x00" - "\xe0\x60\x60\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x10\x00\x00\x00\x00" - "\x00\x00\xfc\xd6\xd6\xd6\xd6\xd6\xd6\x80\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x66\xe6\x04\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\xfc\x66\x66\x66\x66\x6c\x60\x60\xe0\x00\x00\x00" - "\x00\x00\x7e\xcc\xcc\xcc\xcc\x6c\x0c\x0c\x0e\x00\x00\x00" - "\x00\x08\xfc\x66\x60\x60\x60\x60\x60\x40\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\x7c\x06\xc6\x7c\x00\x00\x00\x00\x00" - "\x30\x30\x7c\x30\x30\x30\x30\x30\x30\x20\x00\x00\x00\x00" - "\x00\x80\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x00\x80\xc6\xc6\xc6\x6c\x6c\x38\x10\x00\x00\x00\x00\x00" - "\x00\x02\xd6\xd6\xd6\xd6\xd6\xd6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\x5c\xc6\xc6\xc6\x02\x00\x00\x00\x00" - "\x00\x80\xc6\xc6\xc6\xc6\xc6\x5e\x06\x06\x7c\x00\x00\x00" - "\x00\x00\xfe\x86\x0c\x38\x60\xc2\xfe\x00\x00\x00\x00\x00" - "\x00\x07\x1c\x30\x30\xe0\x30\x30\x1c\x07\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00" - "\x00\xe0\x38\x0c\x0c\x07\x0c\x0c\x38\xe0\x00\x00\x00\x00" - "\x00\x76\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xb4\xe8\xb2\xe8\xb4\xe8\xb2\xe8\xb4\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x81\x42\x24\x18\x18\x24\x42\x81\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x10\x18\x18\x00\x18\x18\x1c\x1c\x1c\x00\x00\x00\x00\x00" - "\x00\x10\x7c\xd0\xd0\xd0\xd0\x7c\x10\x00\x00\x00\x00\x00" - "\x08\x3c\x66\x60\xf8\x60\x62\x66\xfc\x08\x00\x00\x00\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00\x00\x00\x00\x00\x00\x00" - "\x00\xc6\xc6\x6c\x38\x10\xfe\x10\x10\x00\x00\x00\x00\x00" - "\x00\x18\x18\x18\x00\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x7c\xc0\x7c\xc6\xc6\xc6\x7c\x06\x7c\x00\x00\x00\x00\x00" - "\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x82\x9a\xa2\xa2\x9a\x82\x7c\x00\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\xcc\xf6\x00\xfe\x00\x00\x00\x00\x00\x00" - "\x00\x00\x36\x6c\xd8\x6c\x36\x00\x00\x00\x00\x00\x00\x00" - "\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7c\x82\xb2\xaa\xb2\xaa\x82\x7c\x00\x00\x00\x00\x00" - "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x78\xcc\xcc\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x70\xd8\x30\x60\xf8\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\xf0\x18\x70\x18\xf0\x00\x00\x00\x00\x00\x00\x00\x00" - "\x30\x60\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x80\xcc\xcc\xcc\xcc\xfe\xc0\x00\x00\x00\x00" - "\x00\x7e\xec\xec\xec\x6c\x2c\x2c\x2e\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x30\x00\x00\x00" - "\x60\xe0\x60\x60\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00\x7e\x00\x00\x00\x00\x00" - "\x00\x00\xd8\x6c\x36\x6c\xd8\x00\x00\x00\x00\x00\x00\x00" - "\x00\x42\xc4\x48\x56\x2a\x4f\x82\x02\x00\x00\x00\x00\x00" - "\x00\x42\xc4\x48\x56\x2a\x46\x88\x0e\x00\x00\x00\x00\x00" - "\xc0\x22\xe4\x28\xd6\x2a\x4f\x82\x02\x00\x00\x00\x00\x00" - "\x08\x18\x00\x18\x18\x30\x62\x66\x3c\x00\x00\x00\x00\x00" - "\x60\x18\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x0c\x30\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x7c\xc6\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x76\xdc\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\xc6\x00\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x7c\xc6\x7c\xc6\xc6\xde\xc6\xc6\xc6\x80\x00\x00\x00\x00" - "\x00\x7f\xcc\xcc\xde\xcc\xcc\xcc\xcf\x80\x00\x00\x00\x00" - "\x00\x7c\xc6\xc0\xc0\xc0\xc0\xc6\x7c\x30\x00\x00\x00\x00" - "\x60\x30\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x18\x30\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x20\x50\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\xcc\x00\xfc\x60\x60\x78\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x30\x0c\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x0c\x30\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x10\x28\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x66\x00\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x00\xf8\x6c\x6c\xf6\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x76\xdc\xc6\xe6\xf6\xde\xce\xc6\xc6\x00\x00\x00\x00\x00" - "\x30\x18\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x18\x30\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x10\x28\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x6c\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x42\x66\x3c\x18\x3c\x66\x42\x00\x00\x00\x00\x00\x00" - "\x00\x7a\xc4\xca\xd6\xd6\xa6\x46\xbc\x00\x00\x00\x00\x00" - "\xb0\xda\xc4\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x98\xb6\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x90\xaa\xc4\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\xa8\xce\xcc\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x0c\x18\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x00\xf0\x60\x7c\x66\x66\x7c\x60\x60\xf0\x00\x00\x00\x00" - "\x00\x7c\xc6\xc6\xdc\xc6\xc6\xc6\xdc\xc0\x00\x00\x00\x00" - "\x30\x18\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x18\x30\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x10\x28\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x76\xdc\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x6c\x00\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x7c\xc6\x7c\x06\x06\x76\xc6\xc6\x7e\x00\x00\x00\x00\x00" - "\x00\x10\x7c\x16\x16\x7c\xd0\xd0\x7c\x10\x00\x00\x00\x00" - "\x00\x00\x7c\xc6\xc0\xc0\xc0\xc6\x7c\x30\x00\x00\x00\x00" - "\x30\x18\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x18\x30\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x10\x28\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x6c\x00\x7c\xc6\xc6\xdc\xc0\xc0\x7e\x00\x00\x00\x00\x00" - "\x30\x18\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x0c\x18\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x08\x14\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x14\x00\x18\x18\x18\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x18\x7e\x18\x7c\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x76\xdc\xfc\x66\x66\x66\x66\x66\xe6\x02\x00\x00\x00\x00" - "\x30\x18\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x18\x30\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x10\x28\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x76\xdc\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x28\x00\x7c\xc6\xc6\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x10\x00\x7c\x00\x10\x00\x00\x00\x00\x00\x00\x00" - "\x00\x02\x7c\xce\xd6\xd6\xd6\xe6\x7c\x80\x00\x00\x00\x00" - "\x76\x9c\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x18\xb0\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x10\xa8\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x28\x80\xce\xcc\xcc\xcc\xcc\xcc\x7e\x00\x00\x00\x00\x00" - "\x18\xb0\xc6\xc6\xc6\xc6\xc6\x5e\x06\x06\xfc\x00\x00\x00" - "\x00\x00\xf0\x60\x7c\x66\x66\x7c\x60\xf0\x00\x00\x00\x00" - "\x28\x80\xc6\xc6\xc6\xc6\xc6\x5e\x06\x06\xfc\x00\x00\x00" - , NULL, "P0T NOoDLE (Amiga)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x00\x00\x66\x66\xac\xac\xd8\xd8\x36\x36\x6a\x6a\xcc\xcc\x00\x00" - "\x38\x38\x6c\x6c\x68\x68\x76\x76\xdc\xdc\xce\xce\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x3c\x3c\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x06\x06\x3c\x3c\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7c\x7c\x06\x06\x1c\x1c\x06\x06\x06\x06\x06\x06\x7c\x7c\x00\x00" - "\x0c\x0c\xcc\xcc\xcc\xcc\xcc\xcc\xfe\xfe\x0c\x0c\x0c\x0c\x00\x00" - "\x7c\x7c\x60\x60\x7c\x7c\x06\x06\x06\x06\x06\x06\x7c\x7c\x00\x00" - "\x3c\x3c\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x06\x06\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x06\x06\x18\x18\x60\x60\x18\x18\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00" - "\x00\x00\x60\x60\x18\x18\x06\x06\x18\x18\x60\x60\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x18\x18\x00\x00\x18\x18\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x78\x78\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x1e\x1e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x60\x60\x6e\x6e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0e\x0e\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x3c\x3c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x00\x00" - "\x78\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xdc\x7e\x7e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x06\x06\x06\x06\x7c\x7c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\xc3\xc3\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfc\xfc\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x78\x78" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x00\x00\xec\xec\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x3e\x3e\x60\x60\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x0e\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\x70\x18\x18\x18\x18\x0e\x0e\x18\x18\x18\x18\x70\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0f\x0f\x3c\x3c\xf0\xf0\xc3\xc3\x0f\x0f\x3c\x3c\xf0\xf0\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x66\x66\x66\x66\x66\x66\x66\x66\x7e\x7e\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x0c\x0c\x3e\x3e\x6c\x6c\x3e\x3e\x0c\x0c\x00\x00\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\x42\x42\x3c\x3c\x66\x66\x3c\x3c\x42\x42\x00\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\x9d\x9d\xa1\xa1\xa1\xa1\x9d\x9d\x42\x42\x3c\x3c" - "\x1c\x1c\x24\x24\x44\x44\x3c\x3c\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x33\x33\x66\x66\xcc\xcc\x66\x66\x33\x33\x00\x00\x00\x00" - "\x3e\x3e\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x42\x42\x3c\x3c" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x7e\x7e\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x30\x30\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x0c\x0c\x78\x78\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x7f\x7f\x60\x60" - "\x3e\x3e\x7a\x7a\x7a\x7a\x3a\x3a\x0a\x0a\x0a\x0a\x0a\x0a\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x30\x30\x00\x00\x00\x00\x00\x00" - "\x38\x38\x44\x44\x44\x44\x38\x38\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\x66\x66\x33\x33\x66\x66\xcc\xcc\x00\x00\x00\x00" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x32\x32\x66\x66\xcf\xcf\x02\x02" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x3e\x3e\x62\x62\xc4\xc4\x0e\x0e" - "\xc0\xc0\x23\x23\x66\x66\x2c\x2c\xd9\xd9\x33\x33\x67\x67\x01\x01" - "\x18\x18\x00\x00\x18\x18\x30\x30\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x1f\x1f\x3c\x3c\x3c\x3c\x6f\x6f\x7c\x7c\xcc\xcc\xcf\xcf\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x30\x30\x1e\x1e\x0c\x0c\x18\x18" - "\x30\x30\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x66\x66\x00\x00\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\xf6\xf6\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x71\x71\xce\xce\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\xc3\xc3\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x3f\x3f\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\xfc\xfc\x00\x00" - "\x30\x30\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x24\x24\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x08\x08\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\xc0\xc0\xc0\xc0\xfc\xfc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x60\x60" - "\x30\x30\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\x77\x77\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x18\x18" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x60\x60\xfc\xfc\x18\x18\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x30\x30\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x00\x00\xff\xff\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x02\x02\x7c\x7c\xce\xce\xd6\xd6\xe6\xe6\x7c\x7c\x80\x80" - "\x30\x30\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - , NULL - , "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x00\x18\x00" - "\x6c\x6c\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x18\x3e\x60\x3c\x06\x7c\x18\x00" - "\x00\x66\xac\xd8\x36\x6a\xcc\x00" - "\x38\x6c\x68\x76\xdc\xce\x7b\x00" - "\x18\x18\x30\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x18\x0c\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x66\x3c\xff\x3c\x66\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x30" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x03\x06\x0c\x18\x30\x60\xc0\x80" - "\x3c\x66\x6e\x7e\x76\x66\x3c\x00" - "\x38\x18\x18\x18\x18\x18\x18\x00" - "\x3c\x06\x3c\x60\x60\x60\x7e\x00" - "\x7c\x06\x1c\x06\x06\x06\x7c\x00" - "\x0c\xcc\xcc\xcc\xfe\x0c\x0c\x00" - "\x7c\x60\x7c\x06\x06\x06\x7c\x00" - "\x3c\x60\x7c\x66\x66\x66\x3c\x00" - "\x7e\x06\x06\x0c\x18\x18\x18\x00" - "\x3c\x66\x3c\x66\x66\x66\x3c\x00" - "\x3c\x66\x66\x66\x3e\x06\x3c\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x18\x30" - "\x00\x06\x18\x60\x18\x06\x00\x00" - "\x00\x00\xff\x00\xff\x00\x00\x00" - "\x00\x60\x18\x06\x18\x60\x00\x00" - "\x3c\x66\x06\x1c\x18\x00\x18\x00" - "\x7c\xc6\xde\xd6\xde\xc0\x78\x00" - "\x3c\x66\x66\x66\x7e\x66\x66\x00" - "\x7c\x66\x7c\x66\x66\x66\x7c\x00" - "\x1e\x30\x60\x60\x60\x30\x1e\x00" - "\x7c\x66\x66\x66\x66\x66\x7c\x00" - "\x7e\x60\x60\x60\x78\x60\x7e\x00" - "\x7e\x60\x60\x60\x78\x60\x60\x00" - "\x3c\x60\x6e\x66\x66\x66\x3e\x00" - "\x66\x66\x66\x66\x7e\x66\x66\x00" - "\x3c\x18\x18\x18\x18\x18\x3c\x00" - "\x0e\x06\x06\x06\x06\x06\x3c\x00" - "\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\x60\x60\x60\x60\x60\x60\x7e\x00" - "\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x3c\x66\x66\x66\x66\x66\x3c\x00" - "\x7c\x66\x66\x66\x7c\x60\x60\x00" - "\x78\xcc\xcc\xcc\xcc\xdc\x7e\x00" - "\x7c\x66\x66\x66\x7c\x66\x66\x00" - "\x3c\x60\x3c\x06\x06\x06\x7c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\x66\x66\x66\x66\x66\x66\x3c\x00" - "\x66\x66\x66\x66\x3c\x3c\x18\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc3\x66\x3c\x18\x3c\x66\xc3\x00" - "\xc3\x66\x3c\x18\x18\x18\x18\x00" - "\xfe\x0c\x18\x30\x60\xc0\xfc\x00" - "\x3c\x30\x30\x30\x30\x30\x3c\x00" - "\xc0\x60\x30\x18\x0c\x06\x03\x01" - "\x3c\x0c\x0c\x0c\x0c\x0c\x3c\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xff" - "\x18\x18\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x06\x3e\x66\x3e\x00" - "\x60\x60\x7c\x66\x66\x66\x7c\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x00" - "\x06\x06\x3e\x66\x66\x66\x3e\x00" - "\x00\x00\x3c\x66\x7e\x60\x3c\x00" - "\x1c\x30\x30\x30\x7c\x30\x30\x00" - "\x00\x00\x3e\x66\x66\x3e\x06\x3c" - "\x60\x60\x7c\x66\x66\x66\x66\x00" - "\x18\x00\x18\x18\x18\x18\x0c\x00" - "\x0c\x00\x0c\x0c\x0c\x0c\x0c\x78" - "\x60\x60\x66\x6c\x78\x6c\x66\x00" - "\x18\x18\x18\x18\x18\x18\x0c\x00" - "\x00\x00\xec\xfe\xd6\xc6\xc6\x00" - "\x00\x00\x7c\x66\x66\x66\x66\x00" - "\x00\x00\x3c\x66\x66\x66\x3c\x00" - "\x00\x00\x7c\x66\x66\x7c\x60\x60" - "\x00\x00\x3e\x66\x66\x3e\x06\x06" - "\x00\x00\x3e\x60\x60\x60\x60\x00" - "\x00\x00\x3c\x60\x3c\x06\x7c\x00" - "\x30\x30\x7c\x30\x30\x30\x1c\x00" - "\x00\x00\x66\x66\x66\x66\x3c\x00" - "\x00\x00\x66\x66\x66\x3c\x18\x00" - "\x00\x00\xc6\xc6\xd6\xfe\x6c\x00" - "\x00\x00\xc6\x6c\x38\x6c\xc6\x00" - "\x00\x00\x66\x66\x66\x3e\x06\x3c" - "\x00\x00\x7e\x0c\x18\x30\x7e\x00" - "\x0e\x18\x18\x70\x18\x18\x0e\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\x18\x18\x0e\x18\x18\x70\x00" - "\x72\x9c\x00\x00\x00\x00\x00\x00" - "\x0f\x3c\xf0\xc3\x0f\x3c\xf0\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x7e\x66\x66\x66\x66\x7e\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x00\x0c\x3e\x6c\x3e\x0c\x00\x00" - "\x1c\x36\x30\x78\x30\x30\x7e\x00" - "\x42\x3c\x66\x3c\x42\x00\x00\x00" - "\xc3\x66\x3c\x18\x3c\x18\x18\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x3c\x60\x3c\x66\x3c\x06\x3c\x00" - "\x66\x66\x00\x00\x00\x00\x00\x00" - "\x3c\x42\x9d\xa1\xa1\x9d\x42\x3c" - "\x1c\x24\x44\x3c\x00\x7e\x00\x00" - "\x00\x33\x66\xcc\x66\x33\x00\x00" - "\x3e\x06\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\xff\x00\x00\x00\x00" - "\x3c\x42\xb9\xa5\xb9\xa5\x42\x3c" - "\xff\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x18\x7e\x18\x18\x00\x7e\x00" - "\x78\x0c\x18\x30\x7c\x00\x00\x00" - "\x78\x0c\x18\x0c\x78\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x7f\x60" - "\x3e\x7a\x7a\x3a\x0a\x0a\x0a\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x30" - "\x30\x70\x30\x30\x30\x00\x00\x00" - "\x38\x44\x44\x38\x00\x7c\x00\x00" - "\x00\xcc\x66\x33\x66\xcc\x00\x00" - "\x40\xc6\x4c\x58\x32\x66\xcf\x02" - "\x40\xc6\x4c\x58\x3e\x62\xc4\x0e" - "\xc0\x23\x66\x2c\xd9\x33\x67\x01" - "\x18\x00\x18\x30\x60\x66\x3c\x00" - "\x30\x18\x3c\x66\x7e\x66\x66\x00" - "\x0c\x18\x3c\x66\x7e\x66\x66\x00" - "\x18\x66\x3c\x66\x7e\x66\x66\x00" - "\x71\x8e\x3c\x66\x7e\x66\x66\x00" - "\x66\x00\x3c\x66\x7e\x66\x66\x00" - "\x18\x24\x3c\x66\x7e\x66\x66\x00" - "\x1f\x3c\x3c\x6f\x7c\xcc\xcf\x00" - "\x1e\x30\x60\x60\x30\x1e\x0c\x18" - "\x30\x18\x7e\x60\x78\x60\x7e\x00" - "\x0c\x18\x7e\x60\x78\x60\x7e\x00" - "\x18\x66\x7e\x60\x78\x60\x7e\x00" - "\x66\x00\x7e\x60\x78\x60\x7e\x00" - "\x30\x18\x3c\x18\x18\x18\x3c\x00" - "\x0c\x18\x3c\x18\x18\x18\x3c\x00" - "\x18\x66\x3c\x18\x18\x18\x3c\x00" - "\x66\x00\x3c\x18\x18\x18\x3c\x00" - "\x78\x6c\x66\xf6\x66\x6c\x78\x00" - "\x71\xce\xe6\xf6\xde\xce\xc6\x00" - "\x30\x18\x3c\x66\x66\x66\x3c\x00" - "\x0c\x18\x3c\x66\x66\x66\x3c\x00" - "\x18\x66\x3c\x66\x66\x66\x3c\x00" - "\x71\x8e\x3c\x66\x66\x66\x3c\x00" - "\xc3\x3c\x66\x66\x66\x66\x3c\x00" - "\x00\xc6\x6c\x38\x6c\xc6\x00\x00" - "\x3f\x66\x6e\x7e\x76\x66\xfc\x00" - "\x30\x18\x66\x66\x66\x66\x3c\x00" - "\x0c\x18\x66\x66\x66\x66\x3c\x00" - "\x18\x24\x66\x66\x66\x66\x3c\x00" - "\x66\x00\x66\x66\x66\x66\x3c\x00" - "\x06\x08\xc3\x66\x3c\x18\x18\x00" - "\xc0\xc0\xfc\xc6\xfc\xc0\xc0\x00" - "\x3c\x66\x66\x6c\x66\x66\x6c\x60" - "\x30\x18\x3c\x06\x3e\x66\x3e\x00" - "\x0c\x18\x3c\x06\x3e\x66\x3e\x00" - "\x18\x66\x3c\x06\x3e\x66\x3e\x00" - "\x71\x8e\x3c\x06\x3e\x66\x3e\x00" - "\x66\x00\x3c\x06\x3e\x66\x3e\x00" - "\x18\x24\x3c\x06\x3e\x66\x3e\x00" - "\x00\x00\x7e\x1b\x7f\xd8\x77\x00" - "\x00\x00\x3c\x60\x60\x60\x3c\x18" - "\x30\x18\x3c\x66\x7e\x60\x3c\x00" - "\x0c\x18\x3c\x66\x7e\x60\x3c\x00" - "\x18\x66\x3c\x66\x7e\x60\x3c\x00" - "\x66\x00\x3c\x66\x7e\x60\x3c\x00" - "\x30\x18\x00\x18\x18\x18\x0c\x00" - "\x0c\x18\x00\x18\x18\x18\x0c\x00" - "\x18\x66\x00\x18\x18\x18\x0c\x00" - "\x00\x66\x00\x18\x18\x18\x0c\x00" - "\x60\xfc\x18\x3c\x66\x66\x3c\x00" - "\x71\x8e\x00\x7c\x66\x66\x66\x00" - "\x30\x18\x00\x3c\x66\x66\x3c\x00" - "\x0c\x18\x00\x3c\x66\x66\x3c\x00" - "\x18\x66\x00\x3c\x66\x66\x3c\x00" - "\x71\x8e\x00\x3c\x66\x66\x3c\x00" - "\x00\x66\x00\x3c\x66\x66\x3c\x00" - "\x00\x18\x00\xff\x00\x18\x00\x00" - "\x00\x02\x7c\xce\xd6\xe6\x7c\x80" - "\x30\x18\x00\x66\x66\x66\x3e\x00" - "\x0c\x18\x00\x66\x66\x66\x3e\x00" - "\x18\x66\x00\x66\x66\x66\x3e\x00" - "\x00\x66\x00\x66\x66\x66\x3e\x00" - "\x0c\x18\x00\x66\x66\x3c\x18\x30" - "\xc0\xc0\xf8\xcc\xcc\xf8\xc0\xc0" - "\x00\x66\x00\x66\x66\x3c\x18\x30" - , "mO'sOul (Amiga)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x10\x10\x7c\x7c\xd0\xd0\x7c\x7c\x16\x16\x16\x16\x7c\x7c\x10\x10" - "\x60\x60\x96\x96\x6c\x6c\x18\x18\x30\x30\x6c\x6c\xd2\xd2\x0c\x0c" - "\x70\x70\xd8\xd8\x70\x70\xf6\xf6\xdc\xdc\xd8\xd8\x7c\x7c\x06\x06" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x03\x07\x0e\x0c\x18\x18\x18\x18\x18\x18\x0c\x0e\x07\x03\x00\x00" - "\xc0\xe0\x70\x30\x18\x18\x18\x18\x18\x18\x30\x70\xe0\xc0\x00\x00" - "\x00\x00\x6c\x6c\x38\x38\xfe\xfe\x38\x38\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x7c\x7c\x06\x06\x3c\x3c\x60\x60\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3c\x06\x06\x1c\x1c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x30\x30\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x00\x00" - "\xf8\xf8\xc0\xc0\xfc\xfc\x06\x06\x46\x46\xcc\xcc\x78\x78\x00\x00" - "\x70\x70\xc0\xc0\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\xfe\xfe\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x78\x78\xcc\xcc\x7c\x7c\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x30\x30" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x0c\x0c\x06\x06\x03\x03\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x7c\x7c\xc6\xc6\x06\x06\x3c\x3c\x30\x30\x00\x00\x30\x30\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xf8\xf8\xcc\xcc\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\xf8\xf8\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x38\x38\x60\x60\xc0\xc0\xce\xce\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\xc6\xc6\xc6\xc6\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0e\x0e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\x7c\x7c\x0c\x0c" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xd8\xd8\xcc\xcc\x06\x06" - "\x78\x78\xc0\xc0\x7c\x7c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3f\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3f\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x3c\xfc\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xfc\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x06\x06\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x38\x38\x6c\x6c\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x00\x00\x1c\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x4c\x4c\x38\x38" - "\xc0\xc0\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\xc4\xc4\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\x00\x00\xfc\xfc\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x00\x00\x78\x78\xc0\xc0\x7c\x7c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x32\x32\x1c\x1c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\x00\x00\xc6\xc6\xd6\xd6\xfe\xfe\x7c\x7c\x6c\x6c\x44\x44\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\x00\x00\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xfe\xfe\x00\x00" - "\x0e\x0f\x19\x18\x18\x18\x70\x70\x18\x18\x18\x19\x0f\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\xf0\x98\x18\x18\x18\x0e\x0e\x18\x18\x18\x98\xf0\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x38\x38\x70\x70\xe0\xe0\xc1\xc1\x83\x83\x07\x07\x0e\x0e\x1c\x1c" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x87\x87\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xc0\xc0\x93\x93\x30\x30\x03\x03\x33\x33\x33\x33\x30\x30\xff\xff" - "\x87\x87\x33\x33\x3f\x3f\x3f\x3f\x3f\x3f\x33\x33\x87\x87\xcf\xcf" - "\xcf\xcf\xf7\xf7\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\xdf\xdf\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\x99\x99\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\x93\x93\xff\xff\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xcf\xcf\xf7\xf7\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\xdf\xdf\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x93\x93\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x07\x07\x33\x33\x39\x39\x19\x19\x39\x39\x39\x39\x03\x03\xff\xff" - "\x8d\x8d\x63\x63\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\x83\x83\x29\x29\x00\x00\x24\x24\x38\x38\x81\x81\xff\xff" - "\x87\x87\x33\x33\x21\x21\x09\x09\x19\x19\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\xf7\xf7\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\x99\x99\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x83\x83\xf3\xf3\xf3\xf3\xff\xff" - "\x3f\x3f\x07\x07\x33\x33\x39\x39\x03\x03\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\x87\x87\x33\x33\x23\x23\x39\x39\x39\x39\x23\x23\x3f\x3f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x30\x30\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x38\x38\x6c\x6c\x60\x60\xf8\xf8\x60\x60\x60\x60\xfe\xfe\x00\x00" - "\x00\x00\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x3e\x3e\x0c\x0c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18" - "\x78\x78\xc0\xc0\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x06\x06\x3c\x3c" - "\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\x99\x99\xa1\xa1\xa1\xa1\x99\x99\x42\x42\x3c\x3c" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x36\x36\x6c\x6c\xd8\xd8\x6c\x6c\x36\x36\x00\x00\x00\x00" - "\xfe\x7f\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x42\x42\x3c\x3c" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x7c\x7c\x10\x10\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x60\x60\x78\x78\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x18\x18\x70\x70\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x7e\x7e\xf4\xf4\x74\x74\x14\x14\x14\x14\x14\x14\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x78\x78\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\xd8\xd8\x6c\x6c\x36\x36\x6c\x6c\xd8\xd8\x00\x00\x00\x00" - "\x63\x63\xe6\xe6\x6c\x6c\x7b\x7b\x37\x35\x6d\x6f\xc3\xc3\x80\x80" - "\x63\x63\xe6\xe6\x6c\x6c\x7e\x7f\x33\x36\x66\x6f\xcf\xc0\x80\x80" - "\xc0\xc0\x66\xc6\x6c\x6c\xdb\xdb\x37\x35\x6d\x6f\xc3\xc3\x00\x00" - "\x30\x30\x00\x00\x30\x30\x3c\x3c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x3f\x3f\x6c\x6c\xcf\xcf\xfc\xfc\xcc\xcc\xcc\xcc\xcf\xcf\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x20\x20\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x66\x66\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x6c\x6c\x00\x00\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x30\x30\x08\x08\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xe6\xe6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x72\x72\x9c\x9c\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x7c\x7c\xd6\xd6\xff\xff\xdb\xdb\xc7\xc7\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x78\x78\xcc\xcc\xdc\xdc\xc6\xc6\xc6\xc6\xdc\xdc\xc0\xc0" - "\x30\x30\x08\x08\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\xd8\xd8\x7f\x7f\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x16\x16\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7f\xfe\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - , NULL, NULL , "MicroKnight Plus (Amiga)", CIOLIB_ISO_8859_1} - ,{"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x83\x83\x39\x39\x21\x21\x29\x29\x21\x21\x3f\x3f\x87\x87\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xff\xff" - "\x87\x87\x93\x93\x99\x99\x99\x99\x99\x99\x93\x93\x87\x87\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x9f\x9f\x91\x91\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\x99\x99\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\x9c\x9c\x99\x99\x93\x93\x87\x87\x93\x93\x99\x99\x9c\x9c\xff\xff" - "\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x9c\x9c\x88\x88\x80\x80\x94\x94\x9c\x9c\x9c\x9c\x9c\x9c\xff\xff" - "\x9c\x9c\x8c\x8c\x84\x84\x90\x90\x98\x98\x9c\x9c\x9c\x9c\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x91\x91\xc0\xc0\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x93\x93\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\x99\x99\x8f\x8f\xc3\xc3\xf1\xf1\x99\x99\xc3\xc3\xff\xff" - "\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x81\xc3\xc3\xe7\xe7\xff\xff" - "\x9c\x9c\x9c\x9c\x9c\x9c\x94\x94\x80\x80\x88\x88\x9c\x9c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\x99\x99\x3c\x3c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x80\x80\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\x80\x80\xff\xff" - "\xc3\xc0\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xc0\xc3\xff\xff" - "\x3f\x3f\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xfc\xfc\xfe\xfe" - "\xc3\x03\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\x03\xc3\xff\xff" - "\xf7\xf7\xe3\xe3\xc9\xc9\x9c\x9c\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x03\x03\x66\x66\xac\xac\xd8\xd8\x36\x36\x6a\x6a\xcc\xcc\x00\x00" - "\x38\x38\x6c\x6c\x68\x68\x76\x76\xdc\xdc\xce\xce\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x03\x07\x0e\x0c\x18\x18\x18\x18\x18\x18\x0c\x0e\x07\x03\x00\x00" - "\xc0\xe0\x70\x30\x18\x18\x18\x18\x18\x18\x30\x70\xe0\xc0\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x3c\x3c\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x38\x38\x78\x78\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x0c\x0c\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x06\x06\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x0c\x0c\x38\x38\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x0c\x0c\x06\x06\x03\x03\x00\x00" - "\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x78\x78\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x1e\x1e\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x78\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xdc\x7e\x7e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x6c\x6c\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x70\x70\x3c\x3c\x0e\x0e\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\xc3\xc3\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3f\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3f\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x3c\xfc\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xfc\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x78\x78" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x00\x00\xec\xec\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x0e\x0f\x19\x18\x18\x18\x70\x70\x18\x18\x18\x19\x0f\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x70\xf0\x98\x18\x18\x18\x0e\x0e\x18\x18\x18\x98\xf0\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0f\x0f\x3c\x3c\xf0\xf0\xc3\xc3\x0f\x0f\x3c\x3c\xf0\xf0\x00\x00" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\xdb\xdb\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe0\xe0\xc3\xc3\xc3\xc3\x90\x90\x83\x83\x33\x33\x30\x30\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xf3\xf3\xe7\xe7" - "\xcf\xcf\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xf3\xf3\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\x99\x99\xff\xff\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x87\x87\x93\x93\x99\x99\x09\x09\x99\x99\x93\x93\x87\x87\xff\xff" - "\x8e\x8e\x31\x31\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x3c\x3c\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x39\x39\x93\x93\xc7\xc7\x93\x93\x39\x39\xff\xff\xff\xff" - "\xc0\xc0\x99\x99\x91\x91\x81\x81\x89\x89\x99\x99\x03\x03\xff\xff" - "\xcf\xcf\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\xdb\xdb\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf9\xf9\xf7\xf7\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xff\xff" - "\x3f\x3f\x3f\x3f\x03\x03\x39\x39\x03\x03\x3f\x3f\x3f\x3f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x93\x93\x99\x99\x99\x99\x93\x93\x9f\x9f" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x0c\x0c\x3e\x3e\x6c\x6c\x3e\x3e\x0c\x0c\x00\x00\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\x42\x42\x3c\x3c\x66\x66\x3c\x3c\x42\x42\x00\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\x9d\x9d\xb1\xb1\x9d\x9d\x81\x81\x7e\x7e\x00\x00" - "\x1c\x1c\x24\x24\x44\x44\x3c\x3c\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x33\x33\x66\x66\xcc\xcc\x66\x66\x33\x33\x00\x00\x00\x00" - "\xfe\x7f\x03\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x81\x81\x7e\x7e" - "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x7e\x7e\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x30\x30\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x0c\x0c\x78\x78\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x7f\x7f\x60\x60" - "\x3e\x3e\x7a\x7a\x7a\x7a\x3a\x3a\x0a\x0a\x0a\x0a\x0a\x0a\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x30\x30\x00\x00\x00\x00\x00\x00" - "\x38\x38\x44\x44\x44\x44\x38\x38\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\x66\x66\x33\x33\x66\x66\xcc\xcc\x00\x00\x00\x00" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x30\x32\x62\x66\xc6\xcf\x02\x02" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x3e\x3e\x62\x62\xc4\xc4\x0e\x0e" - "\xc0\xc0\x23\x23\x66\x66\x2c\x2c\xd8\x1a\x32\x36\x66\x6f\xc2\xc2" - "\x18\x18\x00\x00\x18\x18\x30\x30\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x1f\x1f\x3c\x3c\x3c\x3c\x6f\x6f\x7c\x7c\xcc\xcc\xcf\xcf\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x30\x30\x1e\x1e\x0c\x0c\x18\x18" - "\x30\x30\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x66\x66\x00\x00\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\xf6\xf6\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x71\x71\xce\xce\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\xc3\xc3\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x3f\x3f\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\xfc\xfc\x00\x00" - "\x30\x30\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x24\x24\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x08\x08\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\xc0\xc0\xc0\xc0\xfc\xfc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x60\x60" - "\x30\x30\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\x77\x77\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x18\x18" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x60\x60\xfc\xfc\x18\x18\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x30\x30\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x02\x02\x7c\x7c\xce\xce\xd6\xd6\xe6\xe6\x7c\x7c\x80\x80" - "\x30\x30\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - , NULL, NULL, "Topaz Plus (Amiga)", CIOLIB_ISO_8859_1} - ,{ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x24\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x10\x10\x7c\x7c\xd0\xd0\x7c\x7c\x16\x16\x16\x16\x7c\x7c\x10\x10" - "\x60\x60\x96\x96\x7c\x7c\x18\x18\x30\x30\x6c\x6c\xd2\xd2\x0c\x0c" - "\x70\x70\xd8\xd8\x70\x70\xf6\xf6\xdc\xdc\xd8\xd8\x7c\x7c\x06\x06" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x18\x18\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x6c\x6c\x38\x38\xfe\xfe\x38\x38\x6c\x6c\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7f\x7f\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x80\x80" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x7c\x7c\x06\x06\x3c\x3c\x60\x60\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3c\x06\x06\x1c\x1c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x18\x18\x30\x30\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x00\x00" - "\xf8\xf8\xc0\xc0\xfc\xfc\x06\x06\x46\x46\xcc\xcc\x78\x78\x00\x00" - "\x70\x70\xc0\xc0\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\xfe\xfe\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x78\x78\xcc\xcc\x7c\x7c\xc6\xc6\xc6\xc6\xcc\xcc\x78\x78\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x18\x18\x30\x30\x60\x60\x30\x30\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x30\x30\x18\x18\x0c\x0c\x18\x18\x30\x30\x00\x00\x00\x00" - "\x7c\x7c\xc6\xc6\x06\x06\x3c\x3c\x30\x30\x00\x00\x30\x30\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xf8\xf8\xcc\xcc\xfc\xfc\xc6\xc6\xc6\xc6\xcc\xcc\xf8\xf8\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x38\x38\x60\x60\xc0\xc0\xce\xce\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\xc6\xc6\xc6\xc6\xc6\xc6\xfe\xfe\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0e\x0e\x06\x06\x06\x06\x06\x06\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xfe\xfe\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\x7c\x7c\x0c\x0c" - "\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xfc\xfc\xd8\xd8\xcc\xcc\x06\x06" - "\x78\x78\xc0\xc0\x7c\x7c\x06\x06\x46\x46\xc6\xc6\x7c\x7c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x0c\x0c\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x38\x38\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x38\x38\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x01\x01" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x38\x38\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x06\x06\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x38\x38\x6c\x6c\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x60\x60" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x00\x00\x1c\x1c\x0c\x0c\x0c\x0c\x0c\x0c\x4c\x4c\x38\x38" - "\xc0\xc0\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x38\x38\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x00\x00\xc4\xc4\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06" - "\x00\x00\xfc\xfc\xc6\xc6\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x00\x00" - "\x00\x00\x78\x78\xc0\xc0\x7c\x7c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x32\x32\x1c\x1c\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\x6c\x6c\x6c\x6c\x38\x38\x38\x38\x00\x00" - "\x00\x00\xc6\xc6\xd6\xd6\xfe\xfe\x7c\x7c\x6c\x6c\x44\x44\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\x00\x00\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xfe\xfe\x00\x00" - "\x0c\x0c\x18\x18\x18\x18\x30\x30\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18" - "\x30\x30\x18\x18\x18\x18\x0c\x0c\x18\x18\x18\x18\x30\x30\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x38\x38\x70\x70\xe0\xe0\xc1\xc1\x83\x83\x07\x07\x0e\x0e\x1c\x1c" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\x87\x87\x33\x33\x87\x87\x33\x33\x01\x01\x39\x39\x39\x39\xff\xff" - "\xc0\xc0\x93\x93\x30\x30\x03\x03\x33\x33\x33\x33\x30\x30\xff\xff" - "\x87\x87\x33\x33\x3f\x3f\x3f\x3f\x3f\x3f\x33\x33\x87\x87\xcf\xcf" - "\xcf\xcf\xf7\xf7\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\xdf\xdf\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xe7\xe7\x99\x99\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\x93\x93\xff\xff\x01\x01\x3f\x3f\x03\x03\x3f\x3f\x01\x01\xff\xff" - "\xcf\xcf\xf7\xf7\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\xdf\xdf\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x93\x93\xff\xff\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\x81\x81\xff\xff" - "\x07\x07\x33\x33\x39\x39\x19\x19\x39\x39\x39\x39\x03\x03\xff\xff" - "\x8d\x8d\x63\x63\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xf7\xf7\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\x33\x33\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x8d\x8d\x63\x63\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x87\x87\x33\x33\x39\x39\x39\x39\x83\x83\xff\xff" - "\xff\xff\x83\x83\x29\x29\x00\x00\x24\x24\x38\x38\x81\x81\xff\xff" - "\x87\x87\x33\x33\x21\x21\x09\x09\x19\x19\x39\x39\x83\x83\xff\xff" - "\xcf\xcf\xf7\xf7\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\x99\x99\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\x93\x93\xff\xff\x39\x39\x39\x39\x39\x39\x39\x39\x83\x83\xff\xff" - "\xe7\xe7\xdf\xdf\x39\x39\x39\x39\x83\x83\xf3\xf3\xf3\xf3\xff\xff" - "\x3f\x3f\x07\x07\x33\x33\x39\x39\x03\x03\x3f\x3f\x3f\x3f\x3f\x3f" - "\xff\xff\x87\x87\x33\x33\x23\x23\x39\x39\x39\x39\x23\x23\x3f\x3f" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x30\x30\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x38\x38\x6c\x6c\x60\x60\xf8\xf8\x60\x60\x60\x60\xfe\xfe\x00\x00" - "\x00\x00\xc6\xc6\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\xc6\xc6\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x3e\x3e\x0c\x0c\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x78\x78\xc0\xc0\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x06\x06\x3c\x3c" - "\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\x99\x99\xa1\xa1\xa1\xa1\x99\x99\x42\x42\x3c\x3c" - "\x00\x00\x7e\x7e\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\x36\x36\x6c\x6c\xd8\xd8\x6c\x6c\x36\x36\x00\x00\x00\x00" - "\x7c\x7c\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x42\x42\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x42\x42\x3c\x3c" - "\x7c\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x38\x38\x6c\x6c\x6c\x6c\x38\x38\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x10\x10\x7c\x7c\x10\x10\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x60\x60\x78\x78\x00\x00\x00\x00\x00\x00" - "\x70\x70\x18\x18\x30\x30\x18\x18\x70\x70\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xfc\xfc\xc0\xc0" - "\x00\x00\x7e\x7e\xf4\xf4\x74\x74\x14\x14\x14\x14\x14\x14\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x78\x78\x00\x00\x00\x00\x00\x00" - "\x00\x00\x7c\x7c\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00\x7c\x7c\x00\x00" - "\x00\x00\xd8\xd8\x6c\x6c\x36\x36\x6c\x6c\xd8\xd8\x00\x00\x00\x00" - "\x60\x60\xe6\xe6\x6c\x6c\x7a\x7a\x36\x36\x6f\x6f\xcf\xcf\x03\x03" - "\x60\x60\xe6\xe6\x6c\x6c\x78\x78\x3e\x3e\x63\x63\xce\xce\x1f\x1f" - "\xe0\xe0\x36\x36\x6c\x6c\x3a\x3a\xf6\xf6\x6f\x6f\xcf\xcf\x03\x03" - "\x30\x30\x00\x00\x30\x30\x3c\x3c\x06\x06\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x78\x78\xcc\xcc\x78\x78\xcc\xcc\xfe\xfe\xc6\xc6\xc6\xc6\x00\x00" - "\x3f\x3f\x6c\x6c\xcf\xcf\xfc\xfc\xcc\xcc\xcc\xcc\xcf\xcf\x00\x00" - "\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x20\x20\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x18\x18\x66\x66\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x6c\x6c\x00\x00\xfe\xfe\xc0\xc0\xfc\xfc\xc0\xc0\xfe\xfe\x00\x00" - "\x30\x30\x08\x08\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x7e\x7e\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\xf8\xf8\xcc\xcc\xc6\xc6\xe6\xe6\xc6\xc6\xc6\xc6\xfc\xfc\x00\x00" - "\x72\x72\x9c\x9c\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x7c\x7c\xd6\xd6\xff\xff\xdb\xdb\xc7\xc7\x7e\x7e\x00\x00" - "\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\x7c\x7c\x0c\x0c\x0c\x0c\x00\x00" - "\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\xc0\xc0" - "\x00\x00\x78\x78\xcc\xcc\xdc\xdc\xc6\xc6\xc6\xc6\xdc\xdc\xc0\xc0" - "\x30\x30\x08\x08\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x7e\x7e\xc6\xc6\x7e\x7e\x00\x00" - "\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\xd8\xd8\x7f\x7f\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xc0\xc0\xc0\xc0\xc6\xc6\x7c\x7c\x30\x30" - "\x30\x30\x08\x08\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\xcc\xcc\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xfc\xfc\xc0\xc0\xc6\xc6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\x38\x38\x18\x18\x18\x18\x18\x18\x7e\x7e\x00\x00" - "\x0c\x0c\x16\x16\x3e\x3e\x66\x66\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x72\x72\x9c\x9c\xf8\xf8\xcc\xcc\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\x30\x30\x08\x08\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x20\x20\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x18\x18\x66\x66\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x72\x72\x9c\x9c\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x6c\x6c\x00\x00\x78\x78\xcc\xcc\xc6\xc6\xc6\xc6\x7c\x7c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x78\x78\xcc\xcc\xde\xde\xf6\xf6\xe6\xe6\x7c\x7c\x00\x00" - "\x30\x30\x08\x08\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x00\x00" - "\x18\x18\x20\x20\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - "\xc0\xc0\xc0\xc0\xf8\xf8\xcc\xcc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0" - "\x6c\x6c\x00\x00\xc6\xc6\xc6\xc6\xc6\xc6\x7e\x7e\x06\x06\x7c\x7c" - , NULL, "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x00\x18\x00" - "\x6c\x6c\x24\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\xfe\x6c\x6c\x00" - "\x10\x7c\xd0\x7c\x16\x16\x7c\x10" - "\x60\x96\x7c\x18\x30\x6c\xd2\x0c" - "\x70\xd8\x70\xf6\xdc\xd8\x7c\x06" - "\x18\x18\x08\x10\x00\x00\x00\x00" - "\x18\x30\x60\x60\x60\x30\x18\x00" - "\x30\x18\x0c\x0c\x0c\x18\x30\x00" - "\x00\x6c\x38\xfe\x38\x6c\x00\x00" - "\x00\x18\x18\x7e\x18\x18\x00\x00" - "\x00\x00\x00\x00\x18\x18\x08\x10" - "\x00\x00\x00\x7c\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x18\x18\x00" - "\x00\x06\x0c\x18\x30\x60\xc0\x00" - "\x00\x78\xcc\xde\xf6\xe6\x7c\x00" - "\x18\x18\x38\x18\x18\x18\x7e\x00" - "\x7c\x06\x3c\x60\xc0\xc0\xfe\x00" - "\x3c\x06\x1c\x06\x46\xc6\x7c\x00" - "\x18\x18\x30\x6c\xcc\xfe\x0c\x00" - "\xf8\xc0\xfc\x06\x46\xcc\x78\x00" - "\x70\xc0\xfc\xc6\xc6\xcc\x78\x00" - "\xfe\x06\x0c\x18\x18\x18\x18\x00" - "\x78\xcc\x7c\xc6\xc6\xcc\x78\x00" - "\x78\xcc\xc6\xc6\x7e\x06\x1c\x00" - "\x00\x18\x18\x00\x00\x18\x18\x00" - "\x00\x18\x18\x00\x00\x18\x08\x10" - "\x00\x18\x30\x60\x30\x18\x00\x00" - "\x00\x00\x7c\x00\x7c\x00\x00\x00" - "\x00\x30\x18\x0c\x18\x30\x00\x00" - "\x7c\xc6\x06\x3c\x30\x00\x30\x00" - "\x38\x6c\xde\xf6\xde\xc0\x66\x3c" - "\x78\xcc\xc6\xfe\xc6\xc6\xc6\x00" - "\xf8\xcc\xfc\xc6\xc6\xcc\xf8\x00" - "\x78\xcc\xc0\xc0\xc0\xc6\x7c\x00" - "\xf8\xcc\xc6\xc6\xc6\xc6\xfc\x00" - "\xfe\xc0\xfc\xc0\xc0\xc0\xfe\x00" - "\xfe\xc0\xfc\xc0\xc0\xc0\xc0\x00" - "\x38\x60\xc0\xce\xc6\xc6\x7e\x06" - "\xc6\xc6\xc6\xfe\xc6\xc6\xc6\x00" - "\x7e\x18\x18\x18\x18\x18\x7e\x00" - "\x0e\x06\x06\x06\xc6\xc6\x7c\x00" - "\xc6\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\xc0\xc0\xc0\xc0\xc0\xc0\xfe\x00" - "\xc6\xee\xfe\xd6\xc6\xc6\xc6\x00" - "\xc6\xe6\xf6\xde\xce\xc6\xc6\x00" - "\x78\xcc\xc6\xc6\xc6\xc6\x7c\x00" - "\xf8\xcc\xc6\xc6\xfc\xc0\xc0\x00" - "\x78\xcc\xc6\xc6\xc6\xd6\x7c\x0c" - "\xf8\xcc\xc6\xc6\xfc\xd8\xcc\x06" - "\x78\xc0\x7c\x06\x46\xc6\x7c\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\x7c\x00" - "\xc6\xc6\xc6\x6c\x6c\x38\x38\x00" - "\xc6\xc6\xc6\xd6\xfe\xee\xc6\x00" - "\xc6\x6c\x38\x38\x6c\xc6\xc6\x00" - "\xc6\xc6\xc6\x7c\x0c\x0c\x0c\x00" - "\xfe\x0c\x18\x30\x60\xc0\xfe\x00" - "\x38\x30\x30\x30\x30\x30\x38\x00" - "\x00\xc0\x60\x30\x18\x0c\x06\x00" - "\x38\x18\x18\x18\x18\x18\x38\x00" - "\x10\x38\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\xfe" - "\x18\x18\x10\x08\x00\x00\x00\x00" - "\x00\x3c\x06\x7e\xc6\xc6\x7e\x00" - "\xc0\xf8\xcc\xc6\xc6\xc6\xfc\x00" - "\x00\x78\xcc\xc0\xc0\xc6\x7c\x00" - "\x06\x3e\x66\xc6\xc6\xc6\x7e\x00" - "\x00\x78\xcc\xfc\xc0\xc6\x7c\x00" - "\x38\x6c\x60\x78\x60\x60\x60\x60" - "\x00\x7e\xc6\xc6\xc6\x7e\x06\x7c" - "\xc0\xf8\xcc\xc6\xc6\xc6\xc6\x00" - "\x18\x00\x38\x18\x18\x18\x7e\x00" - "\x0c\x00\x1c\x0c\x0c\x0c\x4c\x38" - "\xc0\xcc\xd8\xf0\xd8\xcc\xc6\x00" - "\x38\x18\x18\x18\x18\x18\x7e\x00" - "\x00\xc4\xee\xfe\xd6\xc6\xc6\x00" - "\x00\xf8\xcc\xc6\xc6\xc6\xc6\x00" - "\x00\x78\xcc\xc6\xc6\xc6\x7c\x00" - "\x00\xf8\xcc\xc6\xc6\xc6\xfc\xc0" - "\x00\x3e\x66\xc6\xc6\xc6\x7e\x06" - "\x00\xfc\xc6\xc0\xc0\xc0\xc0\x00" - "\x00\x78\xc0\x7c\x06\xc6\x7c\x00" - "\x30\x7c\x30\x30\x30\x32\x1c\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\x7e\x00" - "\x00\xc6\xc6\x6c\x6c\x38\x38\x00" - "\x00\xc6\xd6\xfe\x7c\x6c\x44\x00" - "\x00\xc6\x6c\x38\x38\x6c\xc6\x00" - "\x00\xc6\xc6\xc6\xc6\x7e\x06\x7c" - "\x00\xfe\x0c\x18\x30\x60\xfe\x00" - "\x0c\x18\x18\x30\x18\x18\x0c\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18" - "\x30\x18\x18\x0c\x18\x18\x30\x00" - "\x72\x9c\x00\x00\x00\x00\x00\x00" - "\x38\x70\xe0\xc1\x83\x07\x0e\x1c" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\xfe\xc6\xc6\xc6\xc6\xc6\xfe\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x18\x18\x00" - "\x30\x78\xcc\xc0\xc0\xc6\x7c\x30" - "\x38\x6c\x60\xf8\x60\x60\xfe\x00" - "\x00\xc6\x7c\xc6\xc6\x7c\xc6\x00" - "\xc6\xc6\xc6\x7c\x0c\x3e\x0c\x00" - "\x18\x18\x18\x00\x18\x18\x18\x00" - "\x78\xc0\x7c\xc6\xc6\x7c\x06\x3c" - "\x6c\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x42\x99\xa1\xa1\x99\x42\x3c" - "\x00\x7e\xc6\xc6\x7e\x00\x7c\x00" - "\x00\x36\x6c\xd8\x6c\x36\x00\x00" - "\x7c\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x00\x00\x00\x00" - "\x3c\x42\xb9\xa5\xb9\xa5\x42\x3c" - "\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x38\x00\x00\x00\x00" - "\x00\x10\x7c\x10\x00\x7c\x00\x00" - "\x70\x18\x30\x60\x78\x00\x00\x00" - "\x70\x18\x30\x18\x70\x00\x00\x00" - "\x18\x30\x60\x00\x00\x00\x00\x00" - "\x00\xc6\xc6\xc6\xc6\xc6\xfc\xc0" - "\x00\x7e\xf4\x74\x14\x14\x14\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x30" - "\x30\x70\x30\x30\x78\x00\x00\x00" - "\x00\x7c\xc6\xc6\x7c\x00\x7c\x00" - "\x00\xd8\x6c\x36\x6c\xd8\x00\x00" - "\x60\xe6\x6c\x7a\x36\x6f\xcf\x03" - "\x60\xe6\x6c\x78\x3e\x63\xce\x1f" - "\xe0\x36\x6c\x3a\xf6\x6f\xcf\x03" - "\x30\x00\x30\x3c\x06\xc6\x7c\x00" - "\x30\x08\x78\xcc\xfe\xc6\xc6\x00" - "\x18\x20\x78\xcc\xfe\xc6\xc6\x00" - "\x30\xcc\x78\xcc\xfe\xc6\xc6\x00" - "\x72\x9c\x78\xcc\xfe\xc6\xc6\x00" - "\x6c\x00\x78\xcc\xfe\xc6\xc6\x00" - "\x78\xcc\x78\xcc\xfe\xc6\xc6\x00" - "\x3f\x6c\xcf\xfc\xcc\xcc\xcf\x00" - "\x78\xcc\xc0\xc0\xc0\xc6\x7c\x30" - "\x30\x08\xfe\xc0\xfc\xc0\xfe\x00" - "\x18\x20\xfe\xc0\xfc\xc0\xfe\x00" - "\x18\x66\xfe\xc0\xfc\xc0\xfe\x00" - "\x6c\x00\xfe\xc0\xfc\xc0\xfe\x00" - "\x30\x08\x7e\x18\x18\x18\x7e\x00" - "\x18\x20\x7e\x18\x18\x18\x7e\x00" - "\x18\x66\x7e\x18\x18\x18\x7e\x00" - "\x6c\x00\x7e\x18\x18\x18\x7e\x00" - "\xf8\xcc\xc6\xe6\xc6\xc6\xfc\x00" - "\x72\x9c\xe6\xf6\xde\xce\xc6\x00" - "\x30\x08\x78\xcc\xc6\xc6\x7c\x00" - "\x18\x20\x78\xcc\xc6\xc6\x7c\x00" - "\x30\xcc\x78\xcc\xc6\xc6\x7c\x00" - "\x72\x9c\x78\xcc\xc6\xc6\x7c\x00" - "\x6c\x00\x78\xcc\xc6\xc6\x7c\x00" - "\x00\x7c\xd6\xff\xdb\xc7\x7e\x00" - "\x78\xcc\xde\xf6\xe6\xc6\x7c\x00" - "\x30\x08\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x20\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x66\xc6\xc6\xc6\xc6\x7c\x00" - "\x6c\x00\xc6\xc6\xc6\xc6\x7c\x00" - "\x18\x20\xc6\xc6\x7c\x0c\x0c\x00" - "\xc0\xf8\xcc\xc6\xfc\xc0\xc0\xc0" - "\x00\x78\xcc\xdc\xc6\xc6\xdc\xc0" - "\x30\x08\x3c\x06\x7e\xc6\x7e\x00" - "\x18\x20\x3c\x06\x7e\xc6\x7e\x00" - "\x18\x66\x3c\x06\x7e\xc6\x7e\x00" - "\x72\x9c\x3c\x06\x7e\xc6\x7e\x00" - "\x6c\x00\x3c\x06\x7e\xc6\x7e\x00" - "\x3c\x66\x3c\x06\x7e\xc6\x7e\x00" - "\x00\x7e\x1b\x7f\xd8\xd8\x7f\x00" - "\x00\x78\xcc\xc0\xc0\xc6\x7c\x30" - "\x30\x08\x78\xfc\xc0\xc6\x7c\x00" - "\x18\x20\x78\xfc\xc0\xc6\x7c\x00" - "\x30\xcc\x78\xfc\xc0\xc6\x7c\x00" - "\x6c\x00\x78\xfc\xc0\xc6\x7c\x00" - "\x30\x08\x38\x18\x18\x18\x7e\x00" - "\x18\x20\x38\x18\x18\x18\x7e\x00" - "\x18\x66\x38\x18\x18\x18\x7e\x00" - "\x6c\x00\x38\x18\x18\x18\x7e\x00" - "\x0c\x16\x3e\x66\xc6\xc6\x7e\x00" - "\x72\x9c\xf8\xcc\xc6\xc6\xc6\x00" - "\x30\x08\x78\xcc\xc6\xc6\x7c\x00" - "\x18\x20\x78\xcc\xc6\xc6\x7c\x00" - "\x18\x66\x78\xcc\xc6\xc6\x7c\x00" - "\x72\x9c\x78\xcc\xc6\xc6\x7c\x00" - "\x6c\x00\x78\xcc\xc6\xc6\x7c\x00" - "\x00\x18\x00\x7e\x00\x18\x00\x00" - "\x00\x78\xcc\xde\xf6\xe6\x7c\x00" - "\x30\x08\xc6\xc6\xc6\xc6\x7e\x00" - "\x18\x20\xc6\xc6\xc6\xc6\x7e\x00" - "\x18\x66\xc6\xc6\xc6\xc6\x7e\x00" - "\x6c\x00\xc6\xc6\xc6\xc6\x7e\x00" - "\x18\x20\xc6\xc6\xc6\x7e\x06\x7c" - "\xc0\xc0\xf8\xcc\xc6\xfc\xc0\xc0" - "\x6c\x00\xc6\xc6\xc6\x7e\x06\x7c" - , "MicroKnight (Amiga)", CIOLIB_ISO_8859_1} - ,{ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x83\x83\x39\x39\x21\x21\x29\x29\x21\x21\x3f\x3f\x87\x87\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x99\x99\x99\x99\x83\x83\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xff\xff" - "\x87\x87\x93\x93\x99\x99\x99\x99\x99\x99\x93\x93\x87\x87\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x81\x81\x9f\x9f\x9f\x9f\x87\x87\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x9f\x9f\x91\x91\x99\x99\x99\x99\xc1\xc1\xff\xff" - "\x99\x99\x99\x99\x99\x99\x81\x81\x99\x99\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x99\x99\xc3\xc3\xff\xff" - "\x9c\x9c\x99\x99\x93\x93\x87\x87\x93\x93\x99\x99\x9c\x9c\xff\xff" - "\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x81\x81\xff\xff" - "\x9c\x9c\x88\x88\x80\x80\x94\x94\x9c\x9c\x9c\x9c\x9c\x9c\xff\xff" - "\x9c\x9c\x8c\x8c\x84\x84\x90\x90\x98\x98\x9c\x9c\x9c\x9c\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x9f\x9f\x9f\x9f\x9f\x9f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\x91\x91\xc0\xc0\xff\xff" - "\x83\x83\x99\x99\x99\x99\x83\x83\x93\x93\x99\x99\x99\x99\xff\xff" - "\xc3\xc3\x99\x99\x8f\x8f\xc3\xc3\xf1\xf1\x99\x99\xc3\xc3\xff\xff" - "\x81\x81\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\x99\x99\x99\x99\x99\x99\x99\x81\xc3\xc3\xe7\xe7\xff\xff" - "\x9c\x9c\x9c\x9c\x9c\x9c\x94\x94\x80\x80\x88\x88\x9c\x9c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xc3\xc3\x99\x99\x3c\x3c\xff\xff" - "\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xff\xff" - "\x80\x80\xf9\xf9\xf3\xf3\xe7\xe7\xcf\xcf\x9f\x9f\x80\x80\xff\xff" - "\xc3\xc3\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xc3\xc3\xff\xff" - "\x3f\x3f\x9f\x9f\xcf\xcf\xe7\xe7\xf3\xf3\xf9\xf9\xfc\xfc\xff\xff" - "\xc3\xc3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xf3\xc3\xc3\xff\xff" - "\xf7\xf7\xe3\xe3\xc9\xc9\x9c\x9c\xff\xff\xff\xff\xff\xff\xff\xff" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x00\x00" - "\x6c\x6c\x6c\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\x6c\x6c\xfe\xfe\x6c\x6c\xfe\xfe\x6c\x6c\x6c\x6c\x00\x00" - "\x18\x18\x3e\x3e\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x18\x18\x00\x00" - "\x00\x00\x66\x66\xac\xac\xd8\xd8\x36\x36\x6a\x6a\xcc\xcc\x00\x00" - "\x38\x38\x6c\x6c\x68\x68\x76\x76\xdc\xdc\xce\xce\x7b\x7b\x00\x00" - "\x18\x18\x18\x18\x30\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x0c\x18\x18\x30\x30\x30\x30\x30\x30\x18\x18\x0c\x0c\x00\x00" - "\x30\x30\x18\x18\x0c\x0c\x0c\x0c\x0c\x0c\x18\x18\x30\x30\x00\x00" - "\x00\x00\x66\x66\x3c\x3c\xff\xff\x3c\x3c\x66\x66\x00\x00\x00\x00" - "\x00\x00\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x03\x03\x06\x06\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x38\x38\x78\x78\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x1c\x1c\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x3c\x3c\x6c\x6c\xcc\xcc\xfe\xfe\x0c\x0c\x0c\x0c\x00\x00" - "\x7e\x7e\x60\x60\x7c\x7c\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x60\x60\x7c\x7c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x06\x06\x06\x06\x0c\x0c\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x3e\x3e\x06\x06\x0c\x0c\x38\x38\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00" - "\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x18\x18\x18\x18\x30\x30" - "\x00\x00\x06\x06\x18\x18\x60\x60\x18\x18\x06\x06\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00" - "\x00\x00\x60\x60\x18\x18\x06\x06\x18\x18\x60\x60\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x06\x06\x0c\x0c\x18\x18\x00\x00\x18\x18\x00\x00" - "\x7c\x7c\xc6\xc6\xde\xde\xd6\xd6\xde\xde\xc0\xc0\x78\x78\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x60\x60\x30\x30\x1e\x1e\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\x66\x66\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\x7e\x7e\x60\x60\x60\x60\x78\x78\x60\x60\x60\x60\x60\x60\x00\x00" - "\x3c\x3c\x66\x66\x60\x60\x6e\x6e\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x66\x66\x66\x66\x7e\x7e\x66\x66\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x66\x66\x3c\x3c\x00\x00" - "\xc6\xc6\xcc\xcc\xd8\xd8\xf0\xf0\xd8\xd8\xcc\xcc\xc6\xc6\x00\x00" - "\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x60\x7e\x7e\x00\x00" - "\xc6\xc6\xee\xee\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\xc6\xc6\x00\x00" - "\xc6\xc6\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\xc6\xc6\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60\x60\x60\x00\x00" - "\x78\x78\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdc\xdc\x7e\x7e\x00\x00" - "\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x6c\x6c\x66\x66\x66\x66\x00\x00" - "\x3c\x3c\x66\x66\x70\x70\x3c\x3c\x0e\x0e\x66\x66\x3c\x3c\x00\x00" - "\x7e\x7e\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x3c\x3c\x18\x18\x00\x00" - "\xc6\xc6\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\xee\xee\xc6\xc6\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x66\x66\xc3\xc3\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\xfe\xfe\x0c\x0c\x18\x18\x30\x30\x60\x60\xc0\xc0\xfe\xfe\x00\x00" - "\x3c\x3c\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x3c\x3c\x00\x00" - "\xc0\xc0\x60\x60\x30\x30\x18\x18\x0c\x0c\x06\x06\x03\x03\x00\x00" - "\x3c\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x3c\x00\x00" - "\x10\x10\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xfe" - "\x18\x18\x18\x18\x0c\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x7c\x7c\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x00\x00" - "\x06\x06\x06\x06\x3e\x3e\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x1c\x1c\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x30\x30\x00\x00" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x3c\x3c" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x00\x00\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x78\x78" - "\x60\x60\x60\x60\x66\x66\x6c\x6c\x78\x78\x6c\x6c\x66\x66\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x00\x00\xec\xec\xfe\xfe\xd6\xd6\xc6\xc6\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x66\x66\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x00\x00\x3e\x3e\x66\x66\x66\x66\x3e\x3e\x06\x06\x06\x06" - "\x00\x00\x00\x00\x7c\x7c\x66\x66\x60\x60\x60\x60\x60\x60\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x3c\x3c\x06\x06\x7c\x7c\x00\x00" - "\x30\x30\x30\x30\x7c\x7c\x30\x30\x30\x30\x30\x30\x1c\x1c\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\xc6\xc6\xd6\xd6\xfe\xfe\x6c\x6c\x00\x00" - "\x00\x00\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x00\x00\x00\x00\x7e\x7e\x0c\x0c\x18\x18\x30\x30\x7e\x7e\x00\x00" - "\x0e\x0e\x18\x18\x18\x18\x70\x70\x18\x18\x18\x18\x0e\x0e\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x70\x70\x18\x18\x18\x18\x0e\x0e\x18\x18\x18\x18\x70\x70\x00\x00" - "\x72\x72\x9c\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0f\x0f\x3c\x3c\xf0\xf0\xc3\xc3\x0f\x0f\x3c\x3c\xf0\xf0\x00\x00" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe7\xe7\xdb\xdb\xc3\xc3\x99\x99\x81\x81\x99\x99\x99\x99\xff\xff" - "\xe0\xe0\xc3\xc3\xc3\xc3\x90\x90\x83\x83\x33\x33\x30\x30\xff\xff" - "\xe1\xe1\xcf\xcf\x9f\x9f\x9f\x9f\xcf\xcf\xe1\xe1\xf3\xf3\xe7\xe7" - "\xcf\xcf\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xf3\xf3\xe7\xe7\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xe7\xe7\x99\x99\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\x99\x99\xff\xff\x81\x81\x9f\x9f\x87\x87\x9f\x9f\x81\x81\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\xc3\xc3\xe7\xe7\xe7\xe7\xe7\xe7\xc3\xc3\xff\xff" - "\x87\x87\x93\x93\x99\x99\x09\x09\x99\x99\x93\x93\x87\x87\xff\xff" - "\x8e\x8e\x31\x31\x19\x19\x09\x09\x21\x21\x31\x31\x39\x39\xff\xff" - "\xcf\xcf\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\x99\x99\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x8e\x8e\x71\x71\xc3\xc3\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x3c\x3c\xc3\xc3\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xff\xff\x39\x39\x93\x93\xc7\xc7\x93\x93\x39\x39\xff\xff\xff\xff" - "\xc0\xc0\x99\x99\x91\x91\x81\x81\x89\x89\x99\x99\x03\x03\xff\xff" - "\xcf\xcf\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf3\xf3\xe7\xe7\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xe7\xe7\xdb\xdb\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\x99\x99\xff\xff\x99\x99\x99\x99\x99\x99\x99\x99\xc3\xc3\xff\xff" - "\xf9\xf9\xf7\xf7\x3c\x3c\x99\x99\xc3\xc3\xe7\xe7\xe7\xe7\xff\xff" - "\x3f\x3f\x3f\x3f\x03\x03\x39\x39\x03\x03\x3f\x3f\x3f\x3f\xff\xff" - "\xc3\xc3\x99\x99\x99\x99\x93\x93\x99\x99\x99\x99\x93\x93\x9f\x9f" - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x80" - "\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00" - "\x00\x00\x0c\x0c\x3e\x3e\x6c\x6c\x3e\x3e\x0c\x0c\x00\x00\x00\x00" - "\x1c\x1c\x36\x36\x30\x30\x78\x78\x30\x30\x30\x30\x7e\x7e\x00\x00" - "\x42\x42\x3c\x3c\x66\x66\x3c\x3c\x42\x42\x00\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\x18\x18\x18\x18\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x00\x00" - "\x3c\x3c\x60\x60\x3c\x3c\x66\x66\x3c\x3c\x06\x06\x3c\x3c\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\x9d\x9d\xb1\xb1\x9d\x9d\x81\x81\x7e\x7e\x00\x00" - "\x1c\x1c\x24\x24\x44\x44\x3c\x3c\x00\x00\x7e\x7e\x00\x00\x00\x00" - "\x00\x00\x33\x33\x66\x66\xcc\xcc\x66\x66\x33\x33\x00\x00\x00\x00" - "\x3e\x3e\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x7e\x81\x81\xb9\xb9\xa5\xa5\xb9\xb9\xa5\xa5\x81\x81\x7e\x7e" - "\x7e\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x3c\x66\x66\x3c\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x7e\x7e\x18\x18\x18\x18\x00\x00\x7e\x7e\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x30\x30\x7c\x7c\x00\x00\x00\x00\x00\x00" - "\x78\x78\x0c\x0c\x18\x18\x0c\x0c\x78\x78\x00\x00\x00\x00\x00\x00" - "\x18\x18\x30\x30\x60\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x7f\x7f\x60\x60" - "\x3e\x3e\x7a\x7a\x7a\x7a\x3a\x3a\x0a\x0a\x0a\x0a\x0a\x0a\x00\x00" - "\x00\x00\x00\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x30\x30" - "\x30\x30\x70\x70\x30\x30\x30\x30\x30\x30\x00\x00\x00\x00\x00\x00" - "\x38\x38\x44\x44\x44\x44\x38\x38\x00\x00\x7c\x7c\x00\x00\x00\x00" - "\x00\x00\xcc\xcc\x66\x66\x33\x33\x66\x66\xcc\xcc\x00\x00\x00\x00" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x32\x32\x66\x66\xcf\xcf\x02\x02" - "\x40\x40\xc6\xc6\x4c\x4c\x58\x58\x3e\x3e\x62\x62\xc4\xc4\x0e\x0e" - "\xc0\xc0\x23\x23\x66\x66\x2c\x2c\xd9\xd9\x33\x33\x67\x67\x01\x01" - "\x18\x18\x00\x00\x18\x18\x30\x30\x60\x60\x66\x66\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x66\x66\x7e\x7e\x66\x66\x66\x66\x00\x00" - "\x1f\x1f\x3c\x3c\x3c\x3c\x6f\x6f\x7c\x7c\xcc\xcc\xcf\xcf\x00\x00" - "\x1e\x1e\x30\x30\x60\x60\x60\x60\x30\x30\x1e\x1e\x0c\x0c\x18\x18" - "\x30\x30\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x0c\x0c\x18\x18\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x18\x18\x66\x66\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x66\x66\x00\x00\x7e\x7e\x60\x60\x78\x78\x60\x60\x7e\x7e\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x18\x18\x18\x18\x18\x18\x3c\x3c\x00\x00" - "\x78\x78\x6c\x6c\x66\x66\xf6\xf6\x66\x66\x6c\x6c\x78\x78\x00\x00" - "\x71\x71\xce\xce\xe6\xe6\xf6\xf6\xde\xde\xce\xce\xc6\xc6\x00\x00" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\xc3\xc3\x3c\x3c\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\xc6\xc6\x6c\x6c\x38\x38\x6c\x6c\xc6\xc6\x00\x00\x00\x00" - "\x3f\x3f\x66\x66\x6e\x6e\x7e\x7e\x76\x76\x66\x66\xfc\xfc\x00\x00" - "\x30\x30\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x24\x24\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x06\x06\x08\x08\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x18\x18\x00\x00" - "\xc0\xc0\xc0\xc0\xfc\xfc\xc6\xc6\xfc\xfc\xc0\xc0\xc0\xc0\x00\x00" - "\x3c\x3c\x66\x66\x66\x66\x6c\x6c\x66\x66\x66\x66\x6c\x6c\x60\x60" - "\x30\x30\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x71\x71\x8e\x8e\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x24\x24\x3c\x3c\x06\x06\x3e\x3e\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x00\x00\x7e\x7e\x1b\x1b\x7f\x7f\xd8\xd8\x77\x77\x00\x00" - "\x00\x00\x00\x00\x3c\x3c\x60\x60\x60\x60\x60\x60\x3c\x3c\x18\x18" - "\x30\x30\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x66\x66\x00\x00\x3c\x3c\x66\x66\x7e\x7e\x60\x60\x3c\x3c\x00\x00" - "\x30\x30\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x18\x18\x18\x18\x18\x18\x0c\x0c\x00\x00" - "\x60\x60\xfc\xfc\x18\x18\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x7c\x7c\x66\x66\x66\x66\x66\x66\x00\x00" - "\x30\x30\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x18\x18\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x71\x71\x8e\x8e\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x66\x66\x00\x00\x3c\x3c\x66\x66\x66\x66\x3c\x3c\x00\x00" - "\x00\x00\x18\x18\x00\x00\x7e\x7e\x00\x00\x18\x18\x00\x00\x00\x00" - "\x00\x00\x02\x02\x7c\x7c\xce\xce\xd6\xd6\xe6\xe6\x7c\x7c\x80\x80" - "\x30\x30\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x18\x18\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x66\x66\x3e\x3e\x00\x00" - "\x0c\x0c\x18\x18\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - "\x60\x60\x60\x60\x7c\x7c\x66\x66\x66\x66\x7c\x7c\x60\x60\x60\x60" - "\x00\x00\x66\x66\x00\x00\x66\x66\x66\x66\x3c\x3c\x18\x18\x30\x30" - , "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x3c\x18\x18\x18\x00\x18\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x6c\x6c\xfe\x6c\x6c\x6c\xfe\x6c\x6c\x00\x00\x00\x00\x00" - "\x18\x3e\x60\x60\x3c\x06\x06\x7c\x18\x00\x00\x00\x00\x00" - "\x00\xc0\xc6\xcc\x18\x30\x66\xc6\x06\x00\x00\x00\x00\x00" - "\x38\x6c\x6c\x68\x76\xdc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x18\x18\x18\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x30\x30\x30\x30\x18\x0c\x00\x00\x00\x00\x00" - "\x30\x18\x0c\x0c\x0c\x0c\x0c\x18\x30\x00\x00\x00\x00\x00" - "\x00\x66\x66\x3c\xff\x3c\x66\x66\x00\x00\x00\x00\x00\x00" - "\x00\x18\x18\x18\x7e\x18\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x18\x18\x18\x30\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x03\x06\x04\x0c\x18\x30\x20\x60\xc0\x00\x00\x00\x00" - "\x3c\x66\x66\x76\x7e\x6e\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x38\x38\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x06\x0c\x18\x30\x66\x7e\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x06\x1c\x06\x06\x66\x3c\x00\x00\x00\x00\x00" - "\x0c\x1c\x3c\x6c\xcc\xfe\x0c\x0c\x1e\x00\x00\x00\x00\x00" - "\x7e\x60\x60\x7c\x06\x06\x06\x66\x3c\x00\x00\x00\x00\x00" - "\x1c\x30\x60\x60\x7c\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x7e\x66\x06\x06\x0c\x18\x18\x18\x18\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x66\x3c\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x66\x3e\x06\x06\x0c\x38\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x18\x18\x00\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x18\x18\x18\x30\x00\x00\x00\x00" - "\x00\x0c\x18\x30\x60\x30\x18\x0c\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x30\x18\x0c\x06\x0c\x18\x30\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x06\x06\x0c\x18\x00\x18\x18\x00\x00\x00\x00\x00" - "\x7c\xc6\xc6\xde\xde\xde\xc0\xc0\x78\x00\x00\x00\x00\x00" - "\x18\x3c\x3c\x66\x66\x7e\xc3\xc3\xc3\x00\x00\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x66\x66\x66\xfc\x00\x00\x00\x00\x00" - "\x3c\x66\xc0\xc0\xc0\xc0\xc0\x66\x3c\x00\x00\x00\x00\x00" - "\xf8\x6c\x66\x66\x66\x66\x66\x6c\xf8\x00\x00\x00\x00\x00" - "\xfe\x66\x60\x60\x78\x60\x60\x66\xfe\x00\x00\x00\x00\x00" - "\xfe\x66\x60\x60\x78\x60\x60\x60\xf0\x00\x00\x00\x00\x00" - "\x3c\x66\xc0\xc0\xce\xc6\xc6\x66\x3e\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\x7e\x66\x66\x66\x66\x00\x00\x00\x00\x00" - "\x7e\x18\x18\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x0e\x06\x06\x06\x06\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\xe6\x66\x66\x6c\x78\x6c\x66\x66\xe6\x00\x00\x00\x00\x00" - "\xf0\x60\x60\x60\x60\x60\x62\x66\xfe\x00\x00\x00\x00\x00" - "\x82\x82\xc6\xc6\xee\xfe\xd6\xd6\xc6\x00\x00\x00\x00\x00" - "\x86\xc6\xe6\xf6\xfe\xde\xce\xc6\xc2\x00\x00\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x38\x00\x00\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x60\x60\x60\xf0\x00\x00\x00\x00\x00" - "\x38\x6c\xc6\xc6\xc6\xc6\xc6\x6c\x3c\x06\x03\x00\x00\x00" - "\xfc\x66\x66\x66\x7c\x78\x6c\x66\xf3\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x30\x18\x0c\x06\x66\x3c\x00\x00\x00\x00\x00" - "\x7e\x5a\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x66\x66\x66\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\xc3\xc3\xc3\x66\x66\x3c\x3c\x18\x18\x00\x00\x00\x00\x00" - "\xc6\xc6\xd6\xd6\xfe\xee\xee\xc6\xc6\x00\x00\x00\x00\x00" - "\xc3\xc3\x66\x3c\x18\x3c\x66\xc3\xc3\x00\x00\x00\x00\x00" - "\xc3\xc3\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\xfe\xc6\x86\x0c\x18\x30\x62\xc6\xfe\x00\x00\x00\x00\x00" - "\x3c\x30\x30\x30\x30\x30\x30\x30\x3c\x00\x00\x00\x00\x00" - "\x00\xc0\x60\x20\x30\x18\x0c\x04\x06\x03\x00\x00\x00\x00" - "\x3c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x3c\x00\x00\x00\x00\x00" - "\x10\x38\x6c\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00" - "\x18\x18\x18\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\xe0\x60\x60\x6c\x76\x66\x66\x66\x7c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x00\x00\x00\x00\x00" - "\x0e\x06\x06\x36\x6e\x66\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x1c\x36\x30\x30\x78\x30\x30\x30\x78\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3b\x66\x66\x66\x3c\xc6\xc6\x7c\x00\x00\x00" - "\xe0\x60\x60\x6c\x76\x66\x66\x66\xe6\x00\x00\x00\x00\x00" - "\x18\x18\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x06\x06\x00\x06\x06\x06\x06\x06\x06\x66\x3c\x00\x00\x00" - "\xe0\x60\x66\x66\x6c\x78\x6c\x66\xe6\x00\x00\x00\x00\x00" - "\x38\x18\x18\x18\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x00\xcc\xee\xfe\xd6\xd6\xc6\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x00\xdc\x66\x66\x66\x7c\x60\x60\xf0\x00\x00\x00" - "\x00\x00\x00\x3d\x66\x66\x66\x3e\x06\x06\x07\x00\x00\x00" - "\x00\x00\x00\xec\x76\x66\x60\x60\xf0\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3e\x70\x38\x1c\x0e\x7c\x00\x00\x00\x00\x00" - "\x08\x18\x18\x3e\x18\x18\x18\x1a\x0c\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x00\x00\x00\xc6\xd6\xd6\xd6\x6c\x6c\x00\x00\x00\x00\x00" - "\x00\x00\x00\xc6\x6c\x38\x38\x6c\xc6\x00\x00\x00\x00\x00" - "\x00\x00\x00\x66\x66\x66\x66\x3c\x18\x30\xe0\x00\x00\x00" - "\x00\x00\x00\x7e\x4c\x18\x30\x62\x7e\x00\x00\x00\x00\x00" - "\x0e\x18\x18\x18\x70\x18\x18\x18\x0e\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x00\x00\x00\x00" - "\x70\x18\x18\x18\x0e\x18\x18\x18\x70\x00\x00\x00\x00\x00" - "\x62\xba\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\xcc\x33\xcc\x33\xcc\x33\xcc\x33\xcc\x33\xcc\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x66\x66\x66\x66\x66\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x00\x18\x18\x18\x3c\x3c\x3c\x18\x00\x00\x00\x00\x00" - "\x0c\x0c\x3e\x6c\x6c\x6c\x3e\x0c\x0c\x00\x00\x00\x00\x00" - "\x1c\x36\x30\x30\x78\x30\x30\x30\x7e\x00\x00\x00\x00\x00" - "\x66\x66\x3c\x66\x66\x66\x3c\x66\x66\x00\x00\x00\x00\x00" - "\x66\x66\x66\x3c\x18\x7e\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x18\x18\x18\x18\x00\x18\x18\x18\x18\x00\x00\x00\x00\x00" - "\x3c\x60\x60\x3c\x66\x66\x66\x3c\x06\x06\x3c\x00\x00\x00" - "\x66\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\x81\x9d\xb1\xb1\xb1\x9d\x81\x7e\x00\x00\x00\x00" - "\x3c\xcc\xcc\x76\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x33\x66\xcc\x66\x33\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x06\x06\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x7e\x81\xb1\xb9\xb9\xb1\xa9\xa5\x81\x7e\x00\x00\x00\x00" - "\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x18\x18\x18\x7e\x18\x18\x18\x00\x7e\x00\x00\x00\x00\x00" - "\x78\x0c\x0c\x18\x30\x60\x7c\x00\x00\x00\x00\x00\x00\x00" - "\x78\x0c\x0c\x38\x0c\x0c\x78\x00\x00\x00\x00\x00\x00\x00" - "\x0c\x18\x30\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x66\x66\x66\x66\x6e\x7a\x60\x60\x00\x00\x00\x00" - "\x7e\xf4\xf4\xf4\x74\x14\x14\x14\x14\x14\x00\x00\x00\x00" - "\x00\x00\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x18\x00\x00\x00" - "\x18\x38\x38\x18\x18\x18\x18\x00\x00\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x66\x3c\x00\x7e\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\xcc\x66\x33\x66\xcc\x00\x00\x00\x00\x00\x00\x00" - "\x40\xc6\x4c\x58\x72\x66\xce\x02\x02\x00\x00\x00\x00\x00" - "\x20\x63\x26\x2c\x3b\x31\x62\xc4\x0f\x00\x00\x00\x00\x00" - "\xc0\x63\xc6\x6c\xd9\x33\x67\xc1\x01\x00\x00\x00\x00\x00" - "\x18\x18\x00\x18\x30\x60\x60\x66\x3c\x00\x00\x00\x00\x00" - "\x60\x30\x08\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x0c\x18\x20\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x30\x48\x84\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x72\x9c\x00\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\xc6\xc6\x10\x38\x6c\xc6\xfe\xc6\xc6\x00\x00\x00\x00\x00" - "\x38\x6c\x38\x6c\x6c\xfe\xc6\xc6\xc6\x00\x00\x00\x00\x00" - "\x1f\x3c\x3c\x6c\x6f\xfc\xcc\xcc\xcf\x00\x00\x00\x00\x00" - "\x3c\x66\xc0\xc0\xc0\xc0\xc0\x66\x3c\x18\x30\x00\x00\x00" - "\x60\x18\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x18\x60\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x18\x24\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x66\x00\xfe\x60\x60\x7c\x60\x60\xfe\x00\x00\x00\x00\x00" - "\x30\x0c\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x0c\x30\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x18\x24\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\x66\x00\x7e\x18\x18\x18\x18\x18\x7e\x00\x00\x00\x00\x00" - "\xf8\x6c\x66\x66\xf6\x66\x66\x6c\xf8\x00\x00\x00\x00\x00" - "\x71\x8e\xc6\xe6\xf6\xde\xce\xc6\xc2\x00\x00\x00\x00\x00" - "\x30\x0c\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x0c\x30\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x24\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x71\x8e\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x66\x00\x3c\x66\xc3\xc3\xc3\x66\x3c\x00\x00\x00\x00\x00" - "\x00\x00\x63\x36\x1c\x1c\x36\x63\x00\x00\x00\x00\x00\x00" - "\x3c\x66\xc7\xcf\xdb\xf3\xe3\x66\x3c\x00\x00\x00\x00\x00" - "\x60\x30\x08\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x18\x24\x00\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x66\x66\x00\x66\x66\x66\x66\x66\x3e\x00\x00\x00\x00\x00" - "\x06\x18\xc3\x66\x3c\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\xf0\x60\x7e\x63\x63\x63\x7e\x60\x60\x60\xf0\x00\x00\x00" - "\x7c\x66\x66\x66\x6c\x66\x66\x66\x6c\x60\x60\x00\x00\x00" - "\x60\x30\x08\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x18\x24\x42\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x71\x8e\x00\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x66\x66\x00\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x3c\x66\x66\x3c\x06\x1e\x66\x66\x3b\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7e\x1b\x7f\xd8\xd8\x77\x00\x00\x00\x00\x00" - "\x00\x00\x00\x3c\x66\x60\x60\x66\x3c\x08\x30\x00\x00\x00" - "\x60\x30\x08\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x18\x24\x42\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x66\x66\x00\x3c\x66\x66\x7e\x60\x3c\x00\x00\x00\x00\x00" - "\x60\x30\x08\x38\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x0c\x18\x20\x70\x30\x30\x30\x30\x78\x00\x00\x00\x00\x00" - "\x18\x24\x42\x1c\x0c\x0c\x0c\x0c\x1e\x00\x00\x00\x00\x00" - "\x66\x66\x00\x38\x18\x18\x18\x18\x3c\x00\x00\x00\x00\x00" - "\x6c\x30\xd8\x0c\x7e\xc6\xc6\xc6\x7c\x00\x00\x00\x00\x00" - "\x71\x8e\x00\x7c\x66\x66\x66\x66\x66\x00\x00\x00\x00\x00" - "\x60\x30\x08\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x18\x24\x42\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x71\x8e\x00\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x66\x66\x00\x3c\x66\x66\x66\x66\x3c\x00\x00\x00\x00\x00" - "\x00\x18\x18\x00\x7e\x00\x18\x18\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x7c\xce\xde\xf6\xe6\x7c\x00\x00\x00\x00\x00" - "\x60\x30\x08\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x0c\x18\x20\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x30\x48\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\xcc\xcc\x00\xcc\xcc\xcc\xcc\xcc\x76\x00\x00\x00\x00\x00" - "\x06\x0c\x10\x66\x66\x66\x66\x3c\x18\x18\x70\x00\x00\x00" - "\xf0\x60\x60\x7c\x66\x66\x66\x7c\x60\x60\xf0\x00\x00\x00" - "\x66\x66\x00\x66\x66\x66\x66\x3c\x18\x18\x70\x00\x00\x00" - , NULL, "Topaz (Amiga)", CIOLIB_ISO_8859_1} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} - ,{NULL, NULL, NULL, NULL, CIOLIB_CP437} -}; -#endif diff --git a/ciolib/ansi_cio.c b/ciolib/ansi_cio.c deleted file mode 100644 index 83d4b5c70eb463259571bf3bebbf0158ebe2e9af..0000000000000000000000000000000000000000 --- a/ciolib/ansi_cio.c +++ /dev/null @@ -1,1036 +0,0 @@ -/* $Id: ansi_cio.c,v 1.86 2020/04/13 18:36:21 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <fcntl.h> -#include <stdarg.h> -#include <stdlib.h> /* malloc */ - -#include <genwrap.h> -#include <threadwrap.h> -#include <semwrap.h> - -#ifdef __unix__ - #include <termios.h> - struct termios tio_default; /* Initial term settings */ -#endif - -#ifdef _WIN32 - #ifndef ENABLE_VIRTUAL_TERMINAL_INPUT - #define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 - #endif - #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING - #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 - #endif -#endif - - -#include "ciolib.h" -#include "ansi_cio.h" - -int CIOLIB_ANSI_TIMEOUT=500; -int (*ciolib_ansi_readbyte_cb)(void)=ansi_readbyte_cb; -int (*ciolib_ansi_writebyte_cb)(const unsigned char ch)=ansi_writebyte_cb; -int (*ciolib_ansi_initio_cb)(void)=ansi_initio_cb; -int (*ciolib_ansi_writestr_cb)(const unsigned char *str, size_t len)=ansi_writestr_cb; - -static sem_t got_key; -static sem_t got_input; -static sem_t used_input; -static sem_t goahead; -static sem_t need_key; -static BOOL sent_ga=FALSE; -static int ansix=1; -static int ansiy=1; - -static int ansi_got_row=0; -static int doorway_enabled=0; - -const int ansi_colours[8]={0,4,2,6,1,5,3,7}; -static WORD ansi_inch; -static int ansi_raw_inch; -static WORD *ansivmem; -static int force_move=1; - -/* Control sequence table definitions. */ -typedef struct -{ - char *pszSequence; - int chExtendedKey; -} tODKeySequence; - -#define ANSI_KEY_UP 72<<8 -#define ANSI_KEY_DOWN 80<<8 -#define ANSI_KEY_RIGHT 0x4d<<8 -#define ANSI_KEY_LEFT 0x4b<<8 -#define ANSI_KEY_HOME 0x47<<8 -#define ANSI_KEY_END 0x4f<<8 -#define ANSI_KEY_F1 0x3b<<8 -#define ANSI_KEY_F2 0x3c<<8 -#define ANSI_KEY_F3 0x3d<<8 -#define ANSI_KEY_F4 0x3e<<8 -#define ANSI_KEY_F5 0x3f<<8 -#define ANSI_KEY_F6 0x40<<8 -#define ANSI_KEY_F7 0x41<<8 -#define ANSI_KEY_F8 0x42<<8 -#define ANSI_KEY_F9 0x43<<8 -#define ANSI_KEY_F10 0x44<<8 -#define ANSI_KEY_PGUP 0x49<<8 -#define ANSI_KEY_PGDN 0x51<<8 -#define ANSI_KEY_INSERT 0x52<<8 -#define ANSI_KEY_DELETE 0x53<<8 -#define ANSI_KEY_F11 0x85<<8 -#define ANSI_KEY_F12 0x86<<8 - -static tODKeySequence ODaKeySequences[] = -{ - /* VT-52 control sequences. */ - {"\033A", ANSI_KEY_UP}, - {"\033B", ANSI_KEY_DOWN}, - {"\033C", ANSI_KEY_RIGHT}, - {"\033D", ANSI_KEY_LEFT}, - {"\033H", ANSI_KEY_HOME}, - {"\033K", ANSI_KEY_END}, - {"\033P", ANSI_KEY_F1}, - {"\033Q", ANSI_KEY_F2}, - {"\033?w", ANSI_KEY_F3}, - {"\033?x", ANSI_KEY_F4}, - {"\033?t", ANSI_KEY_F5}, - {"\033?u", ANSI_KEY_F6}, - {"\033?q", ANSI_KEY_F7}, - {"\033?r", ANSI_KEY_F8}, - {"\033?p", ANSI_KEY_F9}, - - /* Control sequences common to VT-100/VT-102/VT-220/VT-320/ANSI. */ - {"\033[A", ANSI_KEY_UP}, - {"\033[B", ANSI_KEY_DOWN}, - {"\033[C", ANSI_KEY_RIGHT}, - {"\033[D", ANSI_KEY_LEFT}, - {"\033[M", ANSI_KEY_PGUP}, - {"\033[H\x1b[2J", ANSI_KEY_PGDN}, - {"\033[H", ANSI_KEY_HOME}, - {"\033[K", ANSI_KEY_END}, - {"\033OP", ANSI_KEY_F1}, - {"\033OQ", ANSI_KEY_F2}, - {"\033OR", ANSI_KEY_F3}, - {"\033OS", ANSI_KEY_F4}, - - /* VT-220/VT-320 specific control sequences. */ - {"\033[1~", ANSI_KEY_HOME}, /* Windows XP terminal.exe. Is actually FIND */ - {"\033[2~", ANSI_KEY_INSERT}, - {"\033[3~", ANSI_KEY_DELETE}, - {"\033[4~", ANSI_KEY_END}, /* Windows XP terminal.exe. Is actually SELECT */ - {"\033[5~", ANSI_KEY_PGUP}, - {"\033[6~", ANSI_KEY_PGDN}, - {"\033[17~", ANSI_KEY_F6}, - {"\033[18~", ANSI_KEY_F7}, - {"\033[19~", ANSI_KEY_F8}, - {"\033[20~", ANSI_KEY_F9}, - {"\033[21~", ANSI_KEY_F10}, - {"\033[23~", ANSI_KEY_F11}, - {"\033[24~", ANSI_KEY_F12}, - - /* XTerm specific control sequences */ - {"\033[15~", ANSI_KEY_F5}, - - /* Old, deprecated XTerm specific control sequences */ - {"\033[11~", ANSI_KEY_F1}, - {"\033[12~", ANSI_KEY_F2}, - {"\033[13~", ANSI_KEY_F3}, - {"\033[14~", ANSI_KEY_F4}, - - /* ANSI-specific control sequences. */ - {"\033[L", ANSI_KEY_HOME}, - {"\033Ow", ANSI_KEY_F3}, - {"\033Ox", ANSI_KEY_F4}, - {"\033Ot", ANSI_KEY_F5}, - {"\033Ou", ANSI_KEY_F6}, - {"\033Oq", ANSI_KEY_F7}, - {"\033Or", ANSI_KEY_F8}, - {"\033Op", ANSI_KEY_F9}, - - /* ECMA 048-specific control sequences. */ - {"\033[V", ANSI_KEY_PGUP}, - {"\033[U", ANSI_KEY_PGDN}, - {"\033[@", ANSI_KEY_INSERT}, - - - /* PROCOMM-specific control sequences (non-keypad alternatives). */ - {"\033OA", ANSI_KEY_UP}, - {"\033OB", ANSI_KEY_DOWN}, - {"\033OC", ANSI_KEY_RIGHT}, - {"\033OD", ANSI_KEY_LEFT}, - {"\033OH", ANSI_KEY_HOME}, - {"\033OK", ANSI_KEY_END}, - - /* Terminator */ - {"",0} -}; - -#ifdef NEEDS_CFMAKERAW -static void -cfmakeraw(struct termios *t) -{ - t->c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); - t->c_oflag &= ~OPOST; - t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - t->c_cflag &= ~(CSIZE|PARENB); - t->c_cflag |= CS8; -} -#endif - -/* Do NOT call this to output to the last column of the last row. */ -/* ONLY call this for chars which will move the cursor */ -static void ansi_sendch(char ch) -{ - if(!ch) - ch=' '; - ansix++; - if(ansix>cio_textinfo.screenwidth) { - /* Column 80 sux0rz */ - force_move=1; - ansix=1; - ansiy++; - if(ansiy>cio_textinfo.screenheight) { - ansix=cio_textinfo.screenwidth; - ansiy=cio_textinfo.screenheight; - } - } - if(doorway_enabled && ch < ' ') - ciolib_ansi_writebyte_cb(0); - ciolib_ansi_writebyte_cb((unsigned char)ch); - /* We sent a control char... better make the next movement explicit */ - if(ch<' ' && ch > 0) { - if(doorway_enabled) { - /* In doorway mode, some chars may want to force movement... */ - } - else - force_move=1; - } -} - -static void ansi_sendstr(const char *str,int len) -{ - if(len==-1) - len=strlen(str); - if(len) - ciolib_ansi_writestr_cb((unsigned char *)str, (size_t)len); -} - -static void ansi_gotoxy_abs(int x, int y) -{ - char str[16]; - - str[0]=0; - if(x < 1 - || x > cio_textinfo.screenwidth - || y < 1 - || y > cio_textinfo.screenheight) - return; - - /* ToDo optimizations: use tabs for horizontal movement to tabstops */ - - /* Movement forced... always send position code */ - if(force_move) { - sprintf(str,"\033[%d;%dH",y,x); - ansi_sendstr(str,-1); - force_move=0; - ansiy=y; - ansix=x; - return; - } - - /* Moving to col 1 (and not already there)... use \r */ - if(x==1 && ansix>1) { - ansi_sendstr("\r",1); - ansix=1; - } - - /* Do we even NEED to move? */ - if(x==ansix && y==ansiy) - return; - - /* If we're already on the correct column */ - if(x==ansix) { - /* Do we need to move up? */ - if(y<ansiy) { - if(y==ansiy-1) - /* Only up one */ - strcpy(str,"\033[A"); - else - sprintf(str,"\033[%dA",ansiy-y); - ansi_sendstr(str,-1); - ansiy=y; - return; - } - - /* We must have to move down then. */ - /* Only one, use a newline */ - if(y-ansiy < 4) - ansi_sendstr("\n\n\n",y-ansiy); - else { - sprintf(str,"\033[%dB",y-ansiy); - ansi_sendstr(str,-1); - } - ansiy=y; - return; - } - - /* Ok, we need to change the column then... is the row right though? */ - if(y==ansiy) { - /* Do we need to move left then? */ - if(x<ansix) { - if(x==ansix-1) - strcpy(str,"\033[D"); - else - sprintf(str,"\033[%dD",ansix-x); - ansi_sendstr(str,-1); - ansix=x; - return; - } - - /* Must need to move right then */ -#if 1 - /* Check if we can use spaces */ - if(x-ansix < 5) { - int i,j; - j=1; - /* If all the intervening cells are spaces with the current background, we're good */ - for(i=0; i<x-ansix; i++) { - if((ansivmem[(y-1)*cio_textinfo.screenwidth+ansix-1+i] & 0xff) != ' '/* && (ansivmem[(ansiy-1)*cio_textinfo.screenwidth+ansix-1+i]) & 0xff != 0*/) { - j=0; - break; - } - if((ansivmem[(y-1)*cio_textinfo.screenwidth+ansix-1+i] & 0x7000) != ((cio_textinfo.attribute<<8) & 0x7000)) { - j=0; - break; - } - } - if(j) { - ansi_sendstr(" ",x-ansix); - ansix=x; - return; - } - } -#endif - if(x==ansix+1) - strcpy(str,"\033[C"); - else - sprintf(str,"\033[%dC",x-ansix); - ansi_sendstr(str,-1); - ansix=x; - return; - } - - /* Changing the row and the column... better use a fill movement then. */ - sprintf(str,"\033[%d;%dH",y,x); - ansi_sendstr(str,-1); - ansiy=y; - ansix=x; - return; -} - -void ansi_gotoxy(int x, int y) -{ - ansi_gotoxy_abs(x+cio_textinfo.winleft-1,y+cio_textinfo.wintop-1); - cio_textinfo.curx=x; - cio_textinfo.cury=y; -} - -int ansi_puttext(int sx, int sy, int ex, int ey, void* buf) -{ - int x,y; - int cx,cy,i,j; - unsigned char *out; - WORD sch; - struct text_info ti; - int attrib; - unsigned char *fill = (unsigned char*)buf; - - gettextinfo(&ti); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ti.screenwidth - || sy > ti.screenheight - || sx > ex - || sy > ey - || ex > ti.screenwidth - || ey > ti.screenheight - || fill==NULL) - return(0); - - /* Check if this actually does anything */ - /* TODO: This assumes a little-endian system! Ack! */ - if(sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight - && memcmp(buf,ansivmem,ti.screenwidth*ti.screenheight*2)==0) - return(1); - - out=fill; - attrib=ti.attribute; - - i=0; /* Did a nasty. */ - - /* Check if this is a nasty screen clear... */ - j=0; /* We can clearscreen */ - if(!i && sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight && (*out==' ' || *out==0)) { - j=1; /* We can clearscreen */ - for(cy=sy-1;cy<ey;cy++) { - for(cx=sx-1;cx<ex;cx++) { - if(out[(cy*ti.screenwidth+cx)*2]!=*out - || out[(cy*ti.screenwidth+cx)*2+1]!=*(out+1)) { - j=0; - cx=ex; - cy=ey; - } - } - } - } - if(j) { - textattr(*(out+1)); - /* Many terminals make ESC[2J home the cursor */ - ansi_sendstr("\033[2J\033[1;1H",-1); - ansix=1; - ansiy=1; - memcpy(ansivmem,out,ti.screenwidth*ti.screenheight*2); - i=1; - } -#if 0 - /* Check if this is a scroll */ - if((!i) && sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight-1 - && memcmp(buf,ansivmem,ti.screenwidth*(ti.screenheight-1)*2)==0) { - /* We need to get to the bottom line... */ - if(ansiy < ti.screenheight) { - if(ansiy > ti.screenheight-4) { - ansi_sendstr("\n\n\n\n\n",ti.screenheight-ansiy-2); - } - else { - sprintf(str,"\033[%dB",ti.screenheight-ansiy-2); - ansi_sendstr(str,-1); - } - } - ansi_sendstr("\n",1); - memcpy(ansivmem,buf,ti.screenwidth*(ti.screenheight-1)*2); - for(x=0;x<ti.screenwidth;x++) - ansivmem[(ti.screenheight-1)*ti.screenwidth+x]=(ti.attribute<<8)|' '; - i=1; - } -#endif -#if 1 - /* Check if this *includes* a scroll */ - if((!i) && sx==1 && sy==1 && ex==ti.screenwidth && ey==ti.screenheight - && memcmp(buf,ansivmem+ti.screenwidth,ti.screenwidth*(ti.screenheight-1)*2)==0) { - /* We need to get to the bottom line... */ - if(ansiy < ti.screenheight) { - if(ansiy > ti.screenheight-4) { - ansi_sendstr("\n\n\n\n\n",ti.screenheight-ansiy-2); - } - else { - char str[6]; - sprintf(str,"\033[%dB",ti.screenheight-ansiy-2); - ansi_sendstr(str,-1); - } - } - ansi_sendstr("\n",1); - memcpy(ansivmem,buf,ti.screenwidth*(ti.screenheight-1)*2); - for(x=0;x<ti.screenwidth;x++) - ansivmem[(ti.screenheight-1)*ti.screenwidth+x]=(ti.attribute<<8)|' '; - out += ti.screenwidth*(ti.screenheight-1)*2; - sy=ti.screenheight; - } -#endif - if(!i) { - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - /* - * Check if we can use clear2eol now... this means the rest of the - * chars on the line are the same attr, and are all spaces or NULLs - * Also, if there's less than four chars left, it's not worth it. - */ - - i=0; /* number of differing chars from screen */ - j=0; /* Can use clrtoeol? */ - for(cx=x; cx<ti.screenwidth; cx++) { - /* First, make sure that the rest are spaces or NULLs */ - if(out[(cx-x)*2] != ' ' && out[(cx-x)*2] != 0) - break; - /* Next, make sure that the attribute is the same */ - if(out[(cx-x)*2+1] != out[1]) - break; - /* Finally, if this isn't what's on screen, increment i */ - if((ansivmem[y*cio_textinfo.screenwidth+cx] & 0xff) != 0 && (ansivmem[y*cio_textinfo.screenwidth+cx] & 0xff) != ' ') - i++; - else if(ansivmem[y*cio_textinfo.screenwidth+cx] >> 8 != out[(cx-x)*2+1]) - i++; - } - if(cx==ti.screenwidth) - j=1; - - if(j && i>3) { - ansi_gotoxy_abs(x+1,y+1); - textattr(*(out+1)); - ansi_sendstr("\033[K",-1); - for(cx=x; cx<ex; cx++) { - ansivmem[y*cio_textinfo.screenwidth+cx]=*(out++); - ansivmem[y*cio_textinfo.screenwidth+cx]|=(*(out++))<<8; - } - break; - } - sch=*(out++); - if(sch==27 && doorway_enabled==0) - sch=' '; - if(sch==0) - sch=' '; - sch |= (*(out++))<<8; - if(ansivmem[y*cio_textinfo.screenwidth+x]==sch) - continue; - ansivmem[y*cio_textinfo.screenwidth+x]=sch; - ansi_gotoxy_abs(x+1,y+1); - if(y>=cio_textinfo.screenheight-1 && x>=cio_textinfo.screenwidth-1) - continue; - if(attrib!=sch>>8) { - textattr(sch>>8); - attrib=sch>>8; - } - ansi_sendch((char)(sch&0xff)); - } - } - } - - if(!puttext_can_move) - gotoxy(ti.curx,ti.cury); - if(attrib!=ti.attribute) - textattr(ti.attribute); - return(1); -} - -int ansi_gettext(int sx, int sy, int ex, int ey, void* buf) -{ - int x,y; - unsigned char *out; - WORD sch; - struct text_info ti; - unsigned char *fill = (unsigned char*)buf; - - gettextinfo(&ti); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ti.screenwidth - || sy > ti.screenheight - || sx > ex - || sy > ey - || ex > ti.screenwidth - || ey > ti.screenheight - || fill==NULL) - return(0); - - out=fill; - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - sch=ansivmem[y*cio_textinfo.screenwidth+x]; - *(out++)=sch & 0xff; - *(out++)=sch >> 8; - } - } - return(1); -} - -void ansi_textattr(int attr) -{ - char str[16]; - int fg,ofg; - int bg,obg; - int bl,obl; - int br,obr; - int oa; - - str[0]=0; - if(cio_textinfo.attribute==attr) - return; - - bl=attr&0x80; - bg=(attr>>4)&0x7; - fg=attr&0x07; - br=attr&0x08; - - oa=cio_textinfo.attribute; - obl=oa&0x80; - obg=(oa>>4)&0x7; - ofg=oa&0x07; - obr=oa&0x08; - - cio_textinfo.attribute=attr; - - strcpy(str,"\033["); - if(obl!=bl) { - if(!bl) -#if 0 - strcat(str,"25;"); -#else - { - strcat(str,"0;"); - ofg=7; - obg=0; - obr=0; - } -#endif - else - strcat(str,"5;"); - } - if(br!=obr) { - if(br) - strcat(str,"1;"); - else -#if 0 - strcat(str,"22;"); -#else - { - strcat(str,"0;"); - if(bl) - strcat(str,"5;"); - ofg=7; - obg=0; - } -#endif - } - if(fg!=ofg) - sprintf(str+strlen(str),"3%d;",ansi_colours[fg]); - if(bg!=obg) - sprintf(str+strlen(str),"4%d;",ansi_colours[bg]); - str[strlen(str)-1]='m'; - ansi_sendstr(str,-1); - cio_textinfo.attribute=attr; -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -static void ansi_keyparse(void *par) -{ - int gotesc=0; - int gotnull=0; - char seq[64]; - int ch; - int i; - char *p; - int timeout=0; - int timedout=0; - int unknown=0; - - SetThreadName("ANSI Keyparse"); - seq[0]=0; - for(;;) { - if(ansi_got_row) - sem_wait(&goahead); - if(timedout || unknown) { - for(p=seq;*p;p++) { - ansi_inch=*p; - sem_post(&got_input); - sem_wait(&used_input); - sem_wait(&goahead); - } - gotesc=0; - timeout=0; - seq[0]=0; - } - if(!timedout) - sem_post(&need_key); - timedout=0; - unknown=0; - if(timeout) { - if(sem_trywait_block(&got_key,timeout)) { - timedout=1; - sem_post(&goahead); - continue; - } - } - else - sem_wait(&got_key); - - ch=ansi_raw_inch; - if(ch==-2) { - ansi_inch=0x0100; - sem_post(&got_input); - /* Two-byte code, need to post twice times and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - } - if(gotnull==2) { - // 0xe0 enhanced keyboard key... translate to 0x00 key for now. - - ansi_inch=ch<<8; // (ch<<8)|0xe0; - sem_post(&got_input); - /* Two-byte code, need to post twice times and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - gotnull=0; - continue; - } - if(gotnull==1) { - if(ch==0xe0) { - gotnull=2; - // Need another key... keep looping. - sem_post(&goahead); - continue; - } - ansi_inch=ch<<8; - sem_post(&got_input); - /* Two-byte code, need to post twice and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - gotnull=0; - continue; - } - - switch(gotesc) { - case 1: /* Escape Sequence */ - timeout=CIOLIB_ANSI_TIMEOUT; - seq[strlen(seq)+1]=0; - seq[strlen(seq)]=ch; - if(strlen(seq)>=sizeof(seq)-2) { - gotesc=0; - break; - } - if((ch<'0' || ch>'9') /* End of ESC sequence */ - && ch!=';' - && ch!='?' - && (strlen(seq)==2?ch != '[':1) - && (strlen(seq)==2?ch != 'O':1)) { - unknown=1; - gotesc=0; - timeout=0; - for(i=0;ODaKeySequences[i].pszSequence[0];i++) { - if(!strcmp(seq,ODaKeySequences[i].pszSequence)) { - ansi_inch=ODaKeySequences[i].chExtendedKey; - sem_post(&got_input); - /* Two-byte code, need to post twice and wait for one to - be received */ - sem_wait(&used_input); - sem_wait(&goahead); - sem_post(&got_input); - sem_wait(&used_input); - unknown=0; - seq[0]=0; - break; - } - } - /* ANSI position report? */ - if(ch=='R') { - if(strspn(seq,"\033[0123456789;R")==strlen(seq)) { - p=seq+2; - i=strtol(p,&p,10); - if(i>cio_textinfo.screenheight) { - cio_textinfo.screenheight=i; - if(*p==';') { - i=strtol(p+1, NULL, 10); - if(i>cio_textinfo.screenwidth) - cio_textinfo.screenwidth=i; - } - ansi_got_row=cio_textinfo.screenheight;; - } - } - unknown=0; - } - if(unknown) { - sem_post(&goahead); - continue; - } - } - else { - /* Need more keys... keep looping */ - sem_post(&goahead); - } - break; - default: - if(ch==27) { - seq[0]=27; - seq[1]=0; - gotesc=1; - timeout=CIOLIB_ANSI_TIMEOUT; - /* Need more keys... keep going... */ - sem_post(&goahead); - break; - } - if(ch==10) { - /* The \n that goes with the prev \r (hopefully) */ - /* Eat it and keep chuggin' */ - sem_post(&goahead); - break; - } - if(doorway_enabled && ch==0) { - /* Got a NULL. ASSume this is a doorway mode char */ - gotnull=1; - sem_post(&goahead); - break; - } - ansi_inch=ch; - sem_post(&got_input); - sem_wait(&used_input); - break; - } - } -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -static void ansi_keythread(void *params) -{ - int sval=1; - - SetThreadName("ANSI Key"); - _beginthread(ansi_keyparse,1024,NULL); - - for(;;) { - sem_wait(&need_key); - /* If you already have a key, don't get another */ - sem_getvalue(&got_key,&sval); - if(!sval) { - ansi_raw_inch=ciolib_ansi_readbyte_cb(); - if(ansi_raw_inch >= 0 || ansi_raw_inch==-2) - sem_post(&got_key); - else - SLEEP(1); - } - else - SLEEP(1); - } -} - -int ansi_kbhit(void) -{ - int sval=1; - - if(!sent_ga) { - sem_post(&goahead); - sent_ga=TRUE; - } - sem_getvalue(&got_input,&sval); - return(sval); -} - -void ansi_setcursortype(int type) -{ - switch(type) { - case _NOCURSOR: - case _SOLIDCURSOR: - default: - break; - } -} - -int ansi_getch(void) -{ - int ch; - - if(!sent_ga) { - sem_post(&goahead); - sent_ga=TRUE; - } - sem_wait(&got_input); - ch=ansi_inch&0xff; - ansi_inch=ansi_inch>>8; - sem_post(&used_input); - sent_ga=FALSE; - return(ch); -} - -void ansi_beep(void) -{ - ansi_sendstr("\7",1); -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -void ansi_textmode(int mode) -{ - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - cio_textinfo.attribute=7; - cio_textinfo.normattr=7; - cio_textinfo.currmode=COLOR_MODE; - cio_textinfo.curx=1; - cio_textinfo.cury=1; - ansix=1; - ansiy=1; -} - -#ifdef __unix__ -void ansi_fixterm(void) -{ - tcsetattr(STDIN_FILENO,TCSANOW,&tio_default); -} -#endif - -#ifndef ENABLE_EXTENDED_FLAGS -#define ENABLE_INSERT_MODE 0x0020 -#define ENABLE_QUICK_EDIT_MODE 0x0040 -#define ENABLE_EXTENDED_FLAGS 0x0080 -#define ENABLE_AUTO_POSITION 0x0100 -#endif - -/* - * Returns -1 if no character read or -2 on abort - */ -int ansi_readbyte_cb(void) -{ - unsigned char ch; - - if(fread(&ch,1,1,stdin)!=1) - return(-1); - return(ch); -} - -int ansi_writebyte_cb(const unsigned char ch) -{ - return(fwrite(&ch,1,1,stdout)); -} - -int ansi_writestr_cb(const unsigned char *str, size_t len) -{ - return(fwrite(str,len,1,stdout)); -} - -int ansi_initio_cb(void) -{ -#ifdef _WIN32 - DWORD conmode = 0; - if(isatty(fileno(stdin))) { - if(!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_INPUT)) - return(0); - - GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &conmode); - if(!SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), conmode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) - return(0); - } - setmode(fileno(stdout),_O_BINARY); - setmode(fileno(stdin),_O_BINARY); - setvbuf(stdout, NULL, _IONBF, 0); -#else - struct termios tio_raw; - - if (isatty(STDIN_FILENO)) { - tcgetattr(STDIN_FILENO,&tio_default); - tio_raw = tio_default; - cfmakeraw(&tio_raw); - tcsetattr(STDIN_FILENO,TCSANOW,&tio_raw); - setvbuf(stdout, NULL, _IONBF, 0); - atexit(ansi_fixterm); - } -#endif - return(0); -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif -int ansi_initciolib(long inmode) -{ - int i; - char *init="\033[s\033[99B\033[99B\033[99B_\033[99C\033[99C\033[99C_\033[6n\033[u\033[0m_\033[2J\033[H"; - time_t start; - - cio_api.options = 0; - - ansi_textmode(1); - cio_textinfo.screenheight=24; - cio_textinfo.screenwidth=80; - ciolib_ansi_initio_cb(); - - sem_init(&got_key,0,0); - sem_init(&got_input,0,0); - sem_init(&used_input,0,0); - sem_init(&goahead,0,0); - sem_init(&need_key,0,0); - - ansi_sendstr(init,-1); - _beginthread(ansi_keythread,1024,NULL); - start=time(NULL); - while(time(NULL)-start < 5 && !ansi_got_row) - SLEEP(1); - if(!ansi_got_row) { - cio_textinfo.screenheight=24; - cio_textinfo.screenwidth=80; - ansi_got_row=24; - } - ansivmem=(WORD *)malloc(cio_textinfo.screenheight*cio_textinfo.screenwidth*sizeof(WORD)); - for(i=0;i<cio_textinfo.screenheight*cio_textinfo.screenwidth;i++) - ansivmem[i]=0x0720; - /* drain all the semaphores */ - sem_reset(&got_key); - sem_reset(&got_input); - sem_reset(&used_input); - sem_reset(&goahead); - sem_reset(&need_key); - return(1); -} - -void ansi_suspend(void) -{ -#if defined _MSC_VER - // Prevents the wait for a key press when exit() is called and the stdin stream is flushed - _unlock_file(stdin); -#endif -} - -CIOLIBEXPORT void ansi_ciolib_setdoorway(int enable) -{ - if(cio_api.mode!=CIOLIB_MODE_ANSI) - return; - switch(enable) { - case 0: - ansi_sendstr("\033[=255l",7); - doorway_enabled=0; - break; - default: - ansi_sendstr("\033[=255h",7); - doorway_enabled=1; - break; - } -} diff --git a/ciolib/ansi_cio.h b/ciolib/ansi_cio.h deleted file mode 100644 index 1a652533a0cbdf97ab569251fc607b1e7585f636..0000000000000000000000000000000000000000 --- a/ciolib/ansi_cio.h +++ /dev/null @@ -1,77 +0,0 @@ -/* $Id: ansi_cio.h,v 1.11 2018/07/24 01:10:58 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" - -#ifdef __cplusplus -extern "C" { -#endif -extern int CIOLIB_ANSI_TIMEOUT; -extern int (*ciolib_ansi_readbyte_cb)(void); -extern int (*ciolib_ansi_writebyte_cb)(const unsigned char ch); -extern int (*ciolib_ansi_initio_cb)(void); -extern int (*ciolib_ansi_writestr_cb)(const unsigned char *str, size_t len); - -int ansi_readbyte_cb(void); -int ansi_writebyte_cb(const unsigned char ch); -int ansi_initio_cb(void); -int ansi_writestr_cb(const unsigned char *str, size_t len); - -int ansi_puttext(int sx, int sy, int ex, int ey, void *fill); -int ansi_gettext(int sx, int sy, int ex, int ey, void *fill); -void ansi_textattr(int); -int ansi_kbhit(void); -void ansi_delay(long msec); -int ansi_wherey(void); -int ansi_wherex(void); -int ansi_putch(int ch); -void ansi_gotoxy(int x, int y); -int ansi_initciolib(long inmode); -void ansi_gettextinfo(struct text_info *info); -void ansi_setcursortype(int type); -int ansi_getch(void); -int ansi_getche(void); -void ansi_beep(void); -void ansi_textmode(int mode); -void ansi_suspend(void); -#ifdef __cplusplus -} -#endif - diff --git a/ciolib/bitmap_con.c b/ciolib/bitmap_con.c deleted file mode 100644 index 06fabef73291b7ecced287fa04b72784f042c4ab..0000000000000000000000000000000000000000 --- a/ciolib/bitmap_con.c +++ /dev/null @@ -1,1785 +0,0 @@ -/* $Id: bitmap_con.c,v 1.148 2020/06/27 00:04:44 deuce Exp $ */ - -#include <stdarg.h> -#include <stdio.h> /* NULL */ -#include <stdlib.h> -#include <string.h> - -#include "threadwrap.h" -#include "semwrap.h" -#include "gen_defs.h" -#include "genwrap.h" -#include "dirwrap.h" -#include "xpbeep.h" -#include "scale.h" - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "vidmodes.h" -#include "bitmap_con.h" - -static uint32_t palette[65536]; - -#if 0 - -static int dbg_pthread_mutex_lock(pthread_mutex_t *lptr, unsigned line) -{ - int ret = pthread_mutex_lock(lptr); - - if (ret) - fprintf(stderr, "pthread_mutex_lock() returned %d at %u\n", ret, line); - return ret; -} - -static int dbg_pthread_mutex_unlock(pthread_mutex_t *lptr, unsigned line) -{ - int ret = pthread_mutex_unlock(lptr); - - if (ret) - fprintf(stderr, "pthread_mutex_lock() returned %d at %u\n", ret, line); - return ret; -} - -static int dbg_pthread_mutex_trylock(pthread_mutex_t *lptr, unsigned line) -{ - int ret = pthread_mutex_trylock(lptr); - - if (ret) - fprintf(stderr, "pthread_mutex_lock() returned %d at %u\n", ret, line); - return ret; -} - -#define pthread_mutex_lock(a) dbg_pthread_mutex_lock(a, __LINE__) -#define pthread_mutex_unlock(a) dbg_pthread_mutex_unlock(a, __LINE__) -#define pthread_mutex_trylock(a) dbg_pthread_trymutex_lock(a, __LINE__) - -#endif - -/* Structs */ - -struct bitmap_screen { - uint32_t *screen; - int screenwidth; - int screenheight; - pthread_mutex_t screenlock; - int update_pixels; - struct rectlist *rect; -}; - -struct bitmap_callbacks { - void (*drawrect) (struct rectlist *data); - void (*flush) (void); - pthread_mutex_t lock; - unsigned rects; -}; - -/* Static globals */ - -static int default_font=-99; -static int current_font[4]={-99, -99, -99, -99}; -static int bitmap_initialized=0; -static struct bitmap_screen screena; -static struct bitmap_screen screenb; -struct video_stats vstat; -static struct bitmap_callbacks callbacks; -static unsigned char *font[4]; -static int force_redraws=0; -static int force_cursor=0; -struct rectlist *free_rects; -pthread_mutex_t free_rect_lock; - -/* The read lock must be held here. */ -#define PIXEL_OFFSET(screen, x, y) ( (y)*(screen).screenwidth+(x) ) - -/* Exported globals */ - -pthread_mutex_t vstatlock; -pthread_mutex_t blinker_lock; - -/* Forward declarations */ - -static int bitmap_loadfont_locked(const char *filename); -static void set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t pos, uint16_t cell, uint32_t fg, uint32_t bg); -static int bitmap_attr2palette_locked(uint8_t attr, uint32_t *fgp, uint32_t *bgp); -static void cb_drawrect(struct rectlist *data); -static void request_redraw_locked(void); -static void request_redraw(void); -static void memset_u32(void *buf, uint32_t u, size_t len); -static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos); -static void cb_flush(void); -static int check_redraw(void); -static void blinker_thread(void *data); -static __inline void both_screens(struct bitmap_screen** current, struct bitmap_screen** noncurrent); -static int update_from_vmem(int force); -static int bitmap_vmem_puttext_locked(int sx, int sy, int ex, int ey, struct vmem_cell *fill); -static uint32_t color_value(uint32_t col); -void bitmap_drv_free_rect(struct rectlist *rect); - -/**************************************************************/ -/* These functions get called from the driver and ciolib only */ -/**************************************************************/ - -static int bitmap_loadfont_locked(const char *filename) -{ - static char current_filename[MAX_PATH]; - unsigned int fontsize; - int fdw; - int fw; - int fh; - int i; - FILE *fontfile=NULL; - - if(!bitmap_initialized) - return(0); - if(current_font[0]==-99 || current_font[0]>(sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)-2)) { - for(i=0; conio_fontdata[i].desc != NULL; i++) { - if(!strcmp(conio_fontdata[i].desc, "Codepage 437 English")) { - current_font[0]=i; - break; - } - } - if(conio_fontdata[i].desc==NULL) - current_font[0]=0; - } - if(current_font[0]==-1) - filename=current_filename; - else if(conio_fontdata[current_font[0]].desc==NULL) - return(0); - - for (i=1; i<sizeof(current_font)/sizeof(current_font[0]); i++) { - if(current_font[i] == -1) - ; - else if (current_font[i] < 0) - current_font[i]=current_font[0]; - else if(conio_fontdata[current_font[i]].desc==NULL) - current_font[i]=current_font[0]; - } - - fh=vstat.charheight; - fdw = vstat.charwidth - (vstat.flags & VIDMODES_FLAG_EXPAND) ? 1 : 0; - fw = fdw / 8 + (fdw % 8 ? 1 : 0); - - fontsize=fw*fh*256*sizeof(unsigned char); - - for (i=0; i<sizeof(font)/sizeof(font[0]); i++) { - if(font[i]) - FREE_AND_NULL(font[i]); - if((font[i]=(unsigned char *)malloc(fontsize))==NULL) - goto error_return; - } - - if(filename != NULL) { - if(flength(filename)!=fontsize) - goto error_return; - if((fontfile=fopen(filename,"rb"))==NULL) - goto error_return; - if(fread(font[0], 1, fontsize, fontfile)!=fontsize) - goto error_return; - fclose(fontfile); - fontfile=NULL; - current_font[0]=-1; - if(filename != current_filename) - SAFECOPY(current_filename,filename); - for (i=1; i<sizeof(font)/sizeof(font[0]); i++) { - if (current_font[i]==-1) - memcpy(font[i], font[0], fontsize); - } - } - for (i=0; i<sizeof(font)/sizeof(font[0]); i++) { - if (current_font[i] < 0) - continue; - switch(fdw) { - case 8: - switch(vstat.charheight) { - case 8: - if(conio_fontdata[current_font[i]].eight_by_eight==NULL) { - if (i==0) - goto error_return; - else - FREE_AND_NULL(font[i]); - } - else - memcpy(font[i], conio_fontdata[current_font[i]].eight_by_eight, fontsize); - break; - case 14: - if(conio_fontdata[current_font[i]].eight_by_fourteen==NULL) { - if (i==0) - goto error_return; - else - FREE_AND_NULL(font[i]); - } - else - memcpy(font[i], conio_fontdata[current_font[i]].eight_by_fourteen, fontsize); - break; - case 16: - if(conio_fontdata[current_font[i]].eight_by_sixteen==NULL) { - if (i==0) - goto error_return; - else - FREE_AND_NULL(font[i]); - } - else - memcpy(font[i], conio_fontdata[current_font[i]].eight_by_sixteen, fontsize); - break; - default: - goto error_return; - } - break; - default: - goto error_return; - } - } - - return(1); - -error_return: - for (i=0; i<sizeof(font)/sizeof(font[0]); i++) - FREE_AND_NULL(font[i]); - if(fontfile) - fclose(fontfile); - return(0); -} - -/***************************************************/ -/* These functions get called from the driver only */ -/***************************************************/ - -/***********************************************/ -/* These functions get called from ciolib only */ -/***********************************************/ - -static int bitmap_vmem_puttext_locked(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - struct vstat_vmem *vmem_ptr; - - if(!bitmap_initialized) - return(0); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) - return(0); - - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - memcpy(&vmem_ptr->vmem[y*cio_textinfo.screenwidth+x], fill++, sizeof(*fill)); - bitmap_draw_one_char(x+1, y+1); - } - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - return(1); -} - -static void -set_vmem_cell(struct vstat_vmem *vmem_ptr, size_t pos, uint16_t cell, uint32_t fg, uint32_t bg) -{ - int altfont; - int font; - - bitmap_attr2palette_locked(cell>>8, fg == 0xffffff ? &fg : NULL, bg == 0xffffff ? &bg : NULL); - - altfont = (cell>>11 & 0x01) | ((cell>>14) & 0x02); - if (!vstat.bright_altcharset) - altfont &= ~0x01; - if (!vstat.blink_altcharset) - altfont &= ~0x02; - font=current_font[altfont]; - if (font == -99) - font = default_font; - if (font < 0 || font > 255) - font = 0; - - vmem_ptr->vmem[pos].legacy_attr = cell >> 8; - vmem_ptr->vmem[pos].ch = cell & 0xff; - vmem_ptr->vmem[pos].fg = fg; - vmem_ptr->vmem[pos].bg = bg; - vmem_ptr->vmem[pos].font = font; -} - -static int bitmap_attr2palette_locked(uint8_t attr, uint32_t *fgp, uint32_t *bgp) -{ - uint32_t fg = attr & 0x0f; - uint32_t bg = (attr >> 4) & 0x0f; - - if(!vstat.bright_background) - bg &= 0x07; - if(vstat.no_bright) - fg &= 0x07; - - if (fgp) - *fgp = vstat.palette[fg]; - if (bgp) - *bgp = vstat.palette[bg]; - - return 1; -} - -/**********************************************************************/ -/* These functions get called from ciolib and the blinker thread only */ -/**********************************************************************/ - -static int -cursor_visible_locked(void) -{ - if (!vstat.curs_visible) - return 0; - if (vstat.curs_start > vstat.curs_end) - return 0; - if (vstat.curs_blinks) { - if (vstat.curs_blink) - return 1; - return 0; - } - return 1; -} - -static void cb_drawrect(struct rectlist *data) -{ - int x, y; - uint32_t *pixel; - uint32_t cv; - - if (data == NULL) - return; - /* - * Draw the cursor if it's visible - * 1) It's located at vstat.curs_col/vstat.curs_row. - * 2) The size is defined by vstat.curs_start and vstat.curs_end... - * the are both rows from the top of the cell. - * If vstat.curs_start > vstat.curs_end, the cursor is not shown. - * 3) If vstat.curs_visible is false, the cursor is not shown. - * 4) If vstat.curs_blinks is false, the cursor does not blink. - * 5) When blinking, the cursor is shown when vstat.blink is true. - */ - pthread_mutex_lock(&vstatlock); - if (cursor_visible_locked()) { - cv = color_value(ciolib_fg); - for (y = vstat.curs_start; y <= vstat.curs_end; y++) { - pixel = &data->data[((vstat.curs_row - 1) * vstat.charheight + y) * data->rect.width + (vstat.curs_col - 1) * vstat.charwidth]; - for (x = 0; x < vstat.charwidth; x++) { - *(pixel++) = cv; - } - } - } - pthread_mutex_unlock(&vstatlock); - pthread_mutex_lock(&callbacks.lock); - callbacks.drawrect(data); - callbacks.rects++; - pthread_mutex_unlock(&callbacks.lock); -} - -static void request_redraw_locked(void) -{ - force_redraws = 1; -} - -static void request_redraw(void) -{ - pthread_mutex_lock(&vstatlock); - request_redraw_locked(); - pthread_mutex_unlock(&vstatlock); -} - -/* - * Called with the screen lock held - */ -static struct rectlist *alloc_full_rect(struct bitmap_screen *screen) -{ - struct rectlist * ret; - - pthread_mutex_lock(&free_rect_lock); - while (free_rects) { - if (free_rects->rect.width == screen->screenwidth && free_rects->rect.height == screen->screenheight) { - ret = free_rects; - free_rects = free_rects->next; - ret->next = NULL; - ret->rect.x = ret->rect.y = 0; - pthread_mutex_unlock(&free_rect_lock); - return ret; - } - else { - free(free_rects->data); - ret = free_rects->next; - free(free_rects); - free_rects = ret; - } - } - pthread_mutex_unlock(&free_rect_lock); - - ret = malloc(sizeof(struct rectlist)); - ret->next = NULL; - ret->rect.x = 0; - ret->rect.y = 0; - ret->rect.width = screen->screenwidth; - ret->rect.height = screen->screenheight; - ret->data = malloc(ret->rect.width * ret->rect.height * sizeof(ret->data[0])); - if (ret->data == NULL) - FREE_AND_NULL(ret); - return ret; -} - -static uint32_t color_value(uint32_t col) -{ - if (col & 0x80000000) - return col & 0xffffff; - if ((col & 0xffffff) < sizeof(palette) / sizeof(palette[0])) - return palette[col & 0xffffff] & 0xffffff; - fprintf(stderr, "Invalid colour value: %08x\n", col); - return 0; -} - -static struct rectlist *get_full_rectangle_locked(struct bitmap_screen *screen) -{ - struct rectlist *rect; - - // TODO: Some sort of caching here would make things faster...? - if(callbacks.drawrect) { - rect = alloc_full_rect(screen); - if (!rect) - return rect; - memcpy(rect->data, screen->rect->data, sizeof(*rect->data) * screen->screenwidth * screen->screenheight); - return rect; - } - return NULL; -} - -static void memset_u32(void *buf, uint32_t u, size_t len) -{ - size_t i; - char *cbuf = buf; - - for (i = 0; i < len; i++) { - memcpy(cbuf, &u, sizeof(uint32_t)); - cbuf += sizeof(uint32_t); - } -} - -/* - * vstatlock needs to be held. - */ -static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) -{ - uint32_t fg; - uint32_t bg; - int fdw; - int xoffset=(xpos-1)*vstat.charwidth; - int yoffset=(ypos-1)*vstat.charheight; - int x; - int fdx; - uint8_t fb = 0; - int y; - int fontoffset; - int pixeloffset; - unsigned char *this_font; - WORD sch; - struct vstat_vmem *vmem_ptr; - BOOL draw_fg = TRUE; - - if(!bitmap_initialized) { - return(-1); - } - - vmem_ptr = vstat.vmem; - - if(!vmem_ptr) { - return(-1); - } - - sch=vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].legacy_attr << 8 | vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].ch; - fg = vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].fg; - bg = vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].bg; - - if (vstat.forced_font) { - this_font = vstat.forced_font; - } - else { - if (current_font[0] == -1) - this_font = font[0]; - else { - switch (vstat.charheight) { - case 8: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_eight; - break; - case 14: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_fourteen; - break; - case 16: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_sixteen; - break; - default: - return(-1); - } - } - } - if (this_font == NULL) - this_font = font[0]; - fdw = vstat.charwidth - (vstat.flags & VIDMODES_FLAG_EXPAND) ? 1 : 0; - fontoffset=(sch & 0xff) * (vstat.charheight * ((fdw + 7) / 8)); - - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - - if ((xoffset + vstat.charwidth > screena.screenwidth) || (yoffset + vstat.charheight > screena.screenheight) || - (xoffset + vstat.charwidth > screenb.screenwidth) || (yoffset + vstat.charheight > screenb.screenheight)) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - return(-1); - } - - if((!screena.screen) || (!screenb.screen)) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - return(-1); - } - - draw_fg = ((!(sch & 0x8000)) || vstat.no_blink); - pixeloffset = PIXEL_OFFSET(screena, xoffset, yoffset); - for(y=0; y<vstat.charheight; y++) { - for(x=0; x<vstat.charwidth; x++) { - fdx = x; - fb = this_font[fontoffset]; - if ((x & 0x07) == 7) - fontoffset++; - if (vstat.flags & VIDMODES_FLAG_EXPAND) { - if (x == vstat.charwidth - 1) { - fontoffset--; - fdx--; - if (!(vstat.flags & VIDMODES_FLAG_LINE_GRAPHICS_EXPAND)) { - fb = 0; - } - else if ((sch & 0xff) >= 0xC0 && (sch & 0xff) <= 0xDF) { - fb = this_font[fontoffset]; - } - else - fb = 0; - - } - } - - if(fb & (0x80 >> (fdx & 7)) && draw_fg) { - if (screena.screen[pixeloffset] != fg) { - screena.update_pixels = 1; - screena.screen[pixeloffset] = fg; - screena.rect->data[pixeloffset] = color_value(fg); - } - } - else { - if (screena.screen[pixeloffset] != bg) { - screena.update_pixels = 1; - screena.screen[pixeloffset] = bg; - screena.rect->data[pixeloffset] = color_value(bg); - } - } - - if(fb & (0x80 >> (fdx & 7))) { - if (screenb.screen[pixeloffset] != fg) { - screenb.update_pixels = 1; - screenb.screen[pixeloffset] = fg; - screenb.rect->data[pixeloffset] = color_value(fg); - } - } - else { - if (screenb.screen[pixeloffset] != bg) { - screenb.update_pixels = 1; - screenb.screen[pixeloffset]=bg; - screenb.rect->data[pixeloffset] = color_value(bg); - } - } - pixeloffset++; - } - if (x & 0x07) - fontoffset++; - pixeloffset += screena.screenwidth - vstat.charwidth; - } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - - return(0); -} - -/***********************************************************/ -/* These functions get called from the blinker thread only */ -/***********************************************************/ - -static void cb_flush(void) -{ - pthread_mutex_lock(&callbacks.lock); - if (callbacks.rects) { - callbacks.flush(); - callbacks.rects = 0; - } - pthread_mutex_unlock(&callbacks.lock); -} - -static int check_redraw(void) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = force_redraws; - force_redraws = 0; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -/* Blinker Thread */ -static void blinker_thread(void *data) -{ - void *rect; - int count=0; - int curs_changed; - int blink_changed; - struct bitmap_screen *screen; - struct bitmap_screen *ncscreen; - - SetThreadName("Blinker"); - while(1) { - curs_changed = 0; - blink_changed = 0; - do { - SLEEP(10); - both_screens(&screen, &ncscreen); - } while (screen->screen == NULL); - count++; - if (count==25) { - pthread_mutex_lock(&vstatlock); - curs_changed = cursor_visible_locked(); - if(vstat.curs_blink) - vstat.curs_blink=FALSE; - else - vstat.curs_blink=TRUE; - curs_changed = (curs_changed != cursor_visible_locked()); - pthread_mutex_unlock(&vstatlock); - } - if(count==50) { - pthread_mutex_lock(&vstatlock); - if(vstat.blink) - vstat.blink=FALSE; - else - vstat.blink=TRUE; - blink_changed = 1; - curs_changed = cursor_visible_locked(); - if(vstat.curs_blink) - vstat.curs_blink=FALSE; - else - vstat.curs_blink=TRUE; - curs_changed = (curs_changed != cursor_visible_locked()); - count=0; - pthread_mutex_unlock(&vstatlock); - } - /* Lock out ciolib while we handle shit */ - pthread_mutex_lock(&blinker_lock); - if (check_redraw()) { - if (update_from_vmem(TRUE)) - request_redraw(); - } - else { - if (count==0) - if (update_from_vmem(FALSE)) - request_redraw(); - } - pthread_mutex_lock(&screen->screenlock); - // TODO: Maybe we can optimize the blink_changed forced update? - if (screen->update_pixels || curs_changed || blink_changed) { - // If the other screen is update_pixels == 2, clear it. - pthread_mutex_lock(&ncscreen->screenlock); - if (ncscreen->update_pixels == 2) - ncscreen->update_pixels = 0; - pthread_mutex_unlock(&ncscreen->screenlock); - rect = get_full_rectangle_locked(screen); - screen->update_pixels = 0; - pthread_mutex_unlock(&screen->screenlock); - cb_drawrect(rect); - } - else { - if (force_cursor) { - rect = get_full_rectangle_locked(screen); - } - pthread_mutex_unlock(&screen->screenlock); - if (force_cursor) { - cb_drawrect(rect); - force_cursor = 0; - } - } - cb_flush(); - pthread_mutex_unlock(&blinker_lock); - } -} - -static __inline struct bitmap_screen *noncurrent_screen_locked(void) -{ - if (vstat.blink) - return &screenb; - return &screena; -} - -static __inline struct bitmap_screen *current_screen_locked(void) -{ - if (vstat.blink) - return &screena; - return(&screenb); -} - -static __inline void both_screens(struct bitmap_screen** current, struct bitmap_screen** noncurrent) -{ - pthread_mutex_lock(&vstatlock); - *current = current_screen_locked(); - *noncurrent = noncurrent_screen_locked(); - pthread_mutex_unlock(&vstatlock); -} - -/* - * Updates any changed cells... blinking, modified flags, and the cursor - * Is also used (with force = TRUE) to completely redraw the screen from - * vmem (such as in the case of a font load). - */ -static int update_from_vmem(int force) -{ - static struct video_stats vs; - struct vstat_vmem *vmem_ptr; - int x,y,width,height; - unsigned int pos; - - int bright_attr_changed=0; - int blink_attr_changed=0; - - if(!bitmap_initialized) - return(-1); - - width=cio_textinfo.screenwidth; - height=cio_textinfo.screenheight; - - pthread_mutex_lock(&vstatlock); - - if (vstat.vmem == NULL) { - pthread_mutex_unlock(&vstatlock); - return -1; - } - - if(vstat.vmem->vmem == NULL) { - pthread_mutex_unlock(&vstatlock); - return -1; - } - - /* If we change window size, redraw everything */ - if(vs.cols!=vstat.cols || vs.rows != vstat.rows) { - /* Force a full redraw */ - width=vstat.cols; - height=vstat.rows; - force=1; - } - - /* Did the meaning of the blink bit change? */ - if (vstat.bright_background != vs.bright_background || - vstat.no_blink != vs.no_blink || - vstat.blink_altcharset != vs.blink_altcharset) - blink_attr_changed = 1; - - /* Did the meaning of the bright bit change? */ - if (vstat.no_bright != vs.no_bright || - vstat.bright_altcharset != vs.bright_altcharset) - bright_attr_changed = 1; - - /* Get vmem pointer */ - vmem_ptr = get_vmem(&vstat); - - /* - * Now we go through each character seeing if it's changed (or force is set) - * We combine updates into rectangles by lines... - * - * First, in the same line, we build this_rect. - * At the end of the line, if this_rect is the same width as the screen, - * we add it to last_rect. - */ - - for(y=0;y<height;y++) { - pos=y*vstat.cols; - for(x=0;x<width;x++) { - /* Last this char been updated? */ - if(force /* Forced */ - || ((vstat.vmem->vmem[pos].legacy_attr & 0x80) && blink_attr_changed) - || ((vstat.vmem->vmem[pos].legacy_attr & 0x08) && bright_attr_changed)) /* Bright char */ - { - bitmap_draw_one_char(x+1,y+1); - } - pos++; - } - } - release_vmem(vmem_ptr); - - pthread_mutex_unlock(&vstatlock); - - vs = vstat; - - return(0); -} - -/*************************************/ - -/**********************/ -/* Called from ciolib */ -/**********************/ -int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill) -{ - int x, y; - int ret = 1; - uint16_t *buf = fill; - struct vstat_vmem *vmem_ptr; - - pthread_mutex_lock(&blinker_lock); - - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, *(buf++), 0x00ffffff, 0x00ffffff); - bitmap_draw_one_char(x+1, y+1); - } - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return ret; -} - -int bitmap_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int ret; - - if(!bitmap_initialized) - return(0); - - pthread_mutex_lock(&blinker_lock); - ret = bitmap_vmem_puttext_locked(sx, sy, ex, ey, fill); - pthread_mutex_unlock(&blinker_lock); - - return ret; -} - -int bitmap_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - struct vstat_vmem *vmem_ptr; - - if(!bitmap_initialized) - return(0); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) { - return(0); - } - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) - memcpy(fill++, &vmem_ptr->vmem[y*cio_textinfo.screenwidth+x], sizeof(*fill)); - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(1); -} - -void bitmap_gotoxy(int x, int y) -{ - if(!bitmap_initialized) - return; - /* Move cursor location */ - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if (vstat.curs_col != x + cio_textinfo.winleft - 1 || vstat.curs_row != y + cio_textinfo.wintop - 1) { - cio_textinfo.curx=x; - cio_textinfo.cury=y; - vstat.curs_col = x + cio_textinfo.winleft - 1; - vstat.curs_row = y + cio_textinfo.wintop - 1; - if (cursor_visible_locked()) - force_cursor = 1; - } - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_setcursortype(int type) -{ - if(!bitmap_initialized) - return; - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - switch(type) { - case _NOCURSOR: - vstat.curs_start=0xff; - vstat.curs_end=0; - break; - case _SOLIDCURSOR: - vstat.curs_start=0; - vstat.curs_end=vstat.charheight-1; - force_cursor = 1; - break; - default: - vstat.curs_start = vstat.default_curs_start; - vstat.curs_end = vstat.default_curs_end; - force_cursor = 1; - break; - } - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_setfont(int font, int force, int font_num) -{ - int changemode=0; - int newmode=-1; - struct text_info ti; - struct vmem_cell *old; - int ow,oh; - int row,col; - struct vmem_cell *new; - int attr; - struct vmem_cell *pold; - struct vmem_cell *pnew; - - if(!bitmap_initialized) - return(0); - if(font < 0 || font>(sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)-2)) - return(0); - - if(conio_fontdata[font].eight_by_sixteen!=NULL) - newmode=C80; - else if(conio_fontdata[font].eight_by_fourteen!=NULL) - newmode=C80X28; - else if(conio_fontdata[font].eight_by_eight!=NULL) - newmode=C80X50; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - switch(vstat.charheight) { - case 8: - if(conio_fontdata[font].eight_by_eight==NULL) { - if(!force) - goto error_return; - else - changemode=1; - } - break; - case 14: - if(conio_fontdata[font].eight_by_fourteen==NULL) { - if(!force) - goto error_return; - else - changemode=1; - } - break; - case 16: - if(conio_fontdata[font].eight_by_sixteen==NULL) { - if(!force) - goto error_return; - else - changemode=1; - } - break; - } - if(changemode && (newmode==-1 || font_num > 1)) - goto error_return; - switch(font_num) { - case 0: - default_font=font; - /* Fall-through */ - case 1: - current_font[0]=font; - break; - case 2: - case 3: - case 4: - current_font[font_num-1]=font; - break; - } - - if(changemode) { - gettextinfo(&ti); - - attr=ti.attribute; - ow=ti.screenwidth; - oh=ti.screenheight; - - old=malloc(ow*oh*sizeof(*old)); - if(old) { - bitmap_vmem_gettext(1,1,ow,oh,old); - textmode(newmode); - new=malloc(ti.screenwidth*ti.screenheight*sizeof(*new)); - if(!new) { - free(old); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return 0; - } - pold=old; - pnew=new; - for(row=0; row<ti.screenheight; row++) { - for(col=0; col<ti.screenwidth; col++) { - if(row < oh) { - if(col < ow) { - memcpy(new, old, sizeof(*old)); - new->font = font; - new++; - old++; - } - else { - new->ch=' '; - new->legacy_attr=attr; - new->font = font; - new->fg = ciolib_fg; - new->bg = ciolib_bg; - new++; - } - } - else { - new->ch=' '; - new->legacy_attr=attr; - new->font = font; - new->fg = ciolib_fg; - new->bg = ciolib_bg; - new++; - } - } - if(row < oh) { - for(;col<ow;col++) - old++; - } - } - bitmap_vmem_puttext(1,1,ti.screenwidth,ti.screenheight,pnew); - free(pnew); - free(pold); - } - else { - FREE_AND_NULL(old); - } - } - bitmap_loadfont_locked(NULL); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(1); - -error_return: - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(0); -} - -int bitmap_getfont(int font_num) -{ - int ret; - - pthread_mutex_lock(&blinker_lock); - if (font_num == 0) - ret = default_font; - else if (font_num > 4) - ret = -1; - else - ret = current_font[font_num - 1]; - pthread_mutex_unlock(&blinker_lock); - - return ret; -} - -int bitmap_loadfont(const char *filename) -{ - int ret; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - ret = bitmap_loadfont_locked(filename); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return ret; -} - -int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy) -{ - int direction=1; - int cy; - int destoffset; - int sourcepos; - int width=ex-x+1; - int height=ey-y+1; - struct vstat_vmem *vmem_ptr; - int32_t sdestoffset; - size_t ssourcepos; - int32_t screeny; - - if( x<1 - || y<1 - || ex<1 - || ey<1 - || tox<1 - || toy<1 - || x>cio_textinfo.screenwidth - || ex>cio_textinfo.screenwidth - || tox>cio_textinfo.screenwidth - || y>cio_textinfo.screenheight - || ey>cio_textinfo.screenheight - || toy>cio_textinfo.screenheight) { - return(0); - } - - if(toy > y) - direction=-1; - - pthread_mutex_lock(&blinker_lock); - if (direction == -1) { - sourcepos=(y+height-2)*cio_textinfo.screenwidth+(x-1); - destoffset=(((toy+height-2)*cio_textinfo.screenwidth+(tox-1))-sourcepos); - } - else { - sourcepos=(y-1)*cio_textinfo.screenwidth+(x-1); - destoffset=(((toy-1)*cio_textinfo.screenwidth+(tox-1))-sourcepos); - } - - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(cy=0; cy<height; cy++) { - memmove(&(vmem_ptr->vmem[sourcepos+destoffset]), &(vmem_ptr->vmem[sourcepos]), sizeof(vmem_ptr->vmem[0])*width); - sourcepos += direction * cio_textinfo.screenwidth; - } - - if (direction == -1) { - ssourcepos=((y + height - 1) * vstat.charheight - 1) * vstat.scrnwidth + (x - 1) * vstat.charwidth; - sdestoffset=((((toy + height - 1) * vstat.charheight - 1) * vstat.scrnwidth + (tox - 1) * vstat.charwidth) - ssourcepos); - } - else { - ssourcepos=(y - 1) * vstat.scrnwidth * vstat.charheight + (x - 1) * vstat.charwidth; - sdestoffset=(((toy - 1) * vstat.scrnwidth * vstat.charheight + (tox - 1) * vstat.charwidth) - ssourcepos); - } - - pthread_mutex_lock(&screena.screenlock); - for(screeny=0; screeny < height*vstat.charheight; screeny++) { - memmove(&(screena.screen[ssourcepos+sdestoffset]), &(screena.screen[ssourcepos]), sizeof(screena.screen[0])*width*vstat.charwidth); - memmove(&(screena.rect->data[ssourcepos+sdestoffset]), &(screena.rect->data[ssourcepos]), sizeof(screena.screen[0])*width*vstat.charwidth); - ssourcepos += direction * vstat.scrnwidth; - } - screena.update_pixels = 1; - pthread_mutex_unlock(&screena.screenlock); - - if (direction == -1) { - ssourcepos=((y+height-1) *vstat.charheight-1)*vstat.scrnwidth + (x-1) *vstat.charwidth; - sdestoffset=((((toy+height-1)*vstat.charheight-1)*vstat.scrnwidth + (tox-1)*vstat.charwidth)-ssourcepos); - } - else { - ssourcepos=(y-1) *vstat.scrnwidth*vstat.charheight + (x-1) *vstat.charwidth; - sdestoffset=(((toy-1)*vstat.scrnwidth*vstat.charheight + (tox-1)*vstat.charwidth)-ssourcepos); - } - - pthread_mutex_lock(&screenb.screenlock); - for(screeny=0; screeny < height*vstat.charheight; screeny++) { - memmove(&(screenb.screen[ssourcepos+sdestoffset]), &(screenb.screen[ssourcepos]), sizeof(screenb.screen[0])*width*vstat.charwidth); - memmove(&(screenb.rect->data[ssourcepos+sdestoffset]), &(screenb.rect->data[ssourcepos]), sizeof(screenb.screen[0])*width*vstat.charwidth); - ssourcepos += direction * vstat.scrnwidth; - } - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - return(1); -} - -void bitmap_clreol(void) -{ - int pos,x; - WORD fill=(cio_textinfo.attribute<<8)|' '; - struct vstat_vmem *vmem_ptr; - int row; - - pthread_mutex_lock(&blinker_lock); - row = cio_textinfo.cury + cio_textinfo.wintop - 1; - pos=(row - 1)*cio_textinfo.screenwidth; - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(x=cio_textinfo.curx+cio_textinfo.winleft-2; x<cio_textinfo.winright; x++) { - set_vmem_cell(vmem_ptr, pos+x, fill, ciolib_fg, ciolib_bg); - bitmap_draw_one_char(x+1, row); - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_clrscr(void) -{ - int x,y; - WORD fill=(cio_textinfo.attribute<<8)|' '; - struct vstat_vmem *vmem_ptr; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - vmem_ptr = get_vmem(&vstat); - for(y = cio_textinfo.wintop-1; y < cio_textinfo.winbottom && y < vstat.rows; y++) { - for(x=cio_textinfo.winleft-1; x<cio_textinfo.winright && x < vstat.cols; x++) { - set_vmem_cell(vmem_ptr, y*cio_textinfo.screenwidth+x, fill, ciolib_fg, ciolib_bg); - bitmap_draw_one_char(x+1, y+1); - } - } - release_vmem(vmem_ptr); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_getcustomcursor(int *s, int *e, int *r, int *b, int *v) -{ - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(s) - *s=vstat.curs_start; - if(e) - *e=vstat.curs_end; - if(r) - *r=vstat.charheight; - if(b) - *b=vstat.curs_blinks; - if(v) - *v=vstat.curs_visible; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -void bitmap_setcustomcursor(int s, int e, int r, int b, int v) -{ - double ratio; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(r==0) - ratio=0; - else - ratio=vstat.charheight/r; - if(s>=0) - vstat.curs_start=s*ratio; - if(e>=0) - vstat.curs_end=e*ratio; - if(b>=0) - vstat.curs_blinks=b; - if(v>=0) - vstat.curs_visible=v; - force_cursor = 1; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_getvideoflags(void) -{ - int flags=0; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(vstat.bright_background) - flags |= CIOLIB_VIDEO_BGBRIGHT; - if(vstat.no_bright) - flags |= CIOLIB_VIDEO_NOBRIGHT; - if(vstat.bright_altcharset) - flags |= CIOLIB_VIDEO_ALTCHARS; - if(vstat.no_blink) - flags |= CIOLIB_VIDEO_NOBLINK; - if(vstat.blink_altcharset) - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - return(flags); -} - -void bitmap_setvideoflags(int flags) -{ - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if(flags & CIOLIB_VIDEO_BGBRIGHT) - vstat.bright_background=1; - else - vstat.bright_background=0; - - if(flags & CIOLIB_VIDEO_NOBRIGHT) - vstat.no_bright=1; - else - vstat.no_bright=0; - - if(flags & CIOLIB_VIDEO_ALTCHARS) - vstat.bright_altcharset=1; - else - vstat.bright_altcharset=0; - - if(flags & CIOLIB_VIDEO_NOBLINK) - vstat.no_blink=1; - else - vstat.no_blink=0; - - if(flags & CIOLIB_VIDEO_BLINKALTCHARS) - vstat.blink_altcharset=1; - else - vstat.blink_altcharset=0; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) -{ - int ret; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - ret = bitmap_attr2palette_locked(attr, fgp, bgp); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - return ret; -} - -int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) -{ - pthread_mutex_lock(&blinker_lock); - - pthread_mutex_lock(&screena.screenlock); - if (x < screena.screenwidth && y < screena.screenheight) { - if (screena.screen[PIXEL_OFFSET(screena, x, y)] != colour) { - screena.screen[PIXEL_OFFSET(screena, x, y)]=colour; - screena.update_pixels = 1; - screena.rect->data[PIXEL_OFFSET(screena, x, y)]=color_value(colour); - } - } - pthread_mutex_unlock(&screena.screenlock); - - pthread_mutex_lock(&screenb.screenlock); - if (x < screenb.screenwidth && y < screenb.screenheight) { - if (screenb.screen[PIXEL_OFFSET(screenb, x, y)] != colour) { - screenb.screen[PIXEL_OFFSET(screenb, x, y)]=colour; - screenb.update_pixels = 1; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)]=color_value(colour); - } - } - pthread_mutex_unlock(&screenb.screenlock); - - pthread_mutex_unlock(&blinker_lock); - - return 1; -} - -int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask) -{ - uint32_t x, y; - uint32_t width,height; - char *m = mask; - int mask_bit; - size_t mask_byte; - size_t pos; - - if (pixels == NULL) - return 0; - - if (sx > ex || sy > ey) - return 0; - - width = ex - sx + 1; - height = ey - sy + 1; - - if (width + x_off > pixels->width) - return 0; - - if (height + y_off > pixels->height) - return 0; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - if (ex > screena.screenwidth || ey > screena.screenheight) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); - return 0; - } - - for (y = sy; y <= ey; y++) { - pos = pixels->width*(y-sy+y_off)+x_off; - if (mask == NULL) { - for (x = sx; x <= ex; x++) { - screena.screen[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; - screena.rect->data[PIXEL_OFFSET(screena, x, y)] = color_value(pixels->pixels[pos]); - if (pixels->pixelsb) { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixelsb[pos]); - } - else { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixels[pos]); - } - pos++; - } - } - else { - for (x = sx; x <= ex; x++) { - mask_byte = pos / 8; - mask_bit = pos % 8; - mask_bit = 0x80 >> mask_bit; - if (m[mask_byte] & mask_bit) { - screena.screen[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; - screena.rect->data[PIXEL_OFFSET(screena, x, y)] = color_value(pixels->pixels[pos]); - if (pixels->pixelsb) { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixelsb[pos]); - } - else { - screenb.screen[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = color_value(pixels->pixels[pos]); - } - } - pos++; - } - } - } - screena.update_pixels = 1; - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); - - return 1; -} - -// TODO: Do we ever need to force anymore? -struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force) -{ - struct ciolib_pixels *pixels; - uint32_t width,height; - size_t y; - - if (sx > ex || sy > ey) - return NULL; - - width = ex - sx + 1; - height = ey - sy + 1; - - pixels = malloc(sizeof(*pixels)); - if (pixels == NULL) - return NULL; - - pixels->width = width; - pixels->height = height; - - pixels->pixels = malloc(sizeof(pixels->pixels[0])*(width)*(height)); - if (pixels->pixels == NULL) { - free(pixels); - return NULL; - } - - pixels->pixelsb = malloc(sizeof(pixels->pixelsb[0])*(width)*(height)); - if (pixels->pixelsb == NULL) { - free(pixels->pixels); - free(pixels); - return NULL; - } - - pthread_mutex_lock(&blinker_lock); - update_from_vmem(force); - pthread_mutex_lock(&vstatlock); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - if (ex >= screena.screenwidth || ey >= screena.screenheight || - ex >= screenb.screenwidth || ey >= screenb.screenheight) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - free(pixels->pixelsb); - free(pixels->pixels); - free(pixels); - return NULL; - } - - for (y = sy; y <= ey; y++) { - memcpy(&pixels->pixels[width*(y-sy)], &screena.screen[PIXEL_OFFSET(screena, sx, y)], width * sizeof(pixels->pixels[0])); - memcpy(&pixels->pixelsb[width*(y-sy)], &screenb.screen[PIXEL_OFFSET(screenb, sx, y)], width * sizeof(pixels->pixelsb[0])); - } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - return pixels; -} - -int bitmap_get_modepalette(uint32_t p[16]) -{ - pthread_mutex_lock(&vstatlock); - memcpy(p, vstat.palette, sizeof(vstat.palette)); - pthread_mutex_unlock(&vstatlock); - return 1; -} - -int bitmap_set_modepalette(uint32_t p[16]) -{ - pthread_mutex_lock(&vstatlock); - memcpy(vstat.palette, p, sizeof(vstat.palette)); - pthread_mutex_unlock(&vstatlock); - return 1; -} - -uint32_t bitmap_map_rgb(uint16_t r, uint16_t g, uint16_t b) -{ - return (0xff << 24) | ((r & 0xff00) << 8) | ((g & 0xff00)) | (b >> 8); -} - -void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size) -{ - pthread_mutex_lock(&blinker_lock); - - if (id < CONIO_FIRST_FREE_FONT) { - free(name); - free(data); - pthread_mutex_unlock(&blinker_lock); - return; - } - - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - switch (size) { - case 4096: - FREE_AND_NULL(conio_fontdata[id].eight_by_sixteen); - conio_fontdata[id].eight_by_sixteen=data; - FREE_AND_NULL(conio_fontdata[id].desc); - conio_fontdata[id].desc=name; - break; - case 3584: - FREE_AND_NULL(conio_fontdata[id].eight_by_fourteen); - conio_fontdata[id].eight_by_fourteen=data; - FREE_AND_NULL(conio_fontdata[id].desc); - conio_fontdata[id].desc=name; - break; - case 2048: - FREE_AND_NULL(conio_fontdata[id].eight_by_eight); - conio_fontdata[id].eight_by_eight=data; - FREE_AND_NULL(conio_fontdata[id].desc); - conio_fontdata[id].desc=name; - break; - default: - free(name); - free(data); - } - screena.update_pixels = 1; - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); -} - -int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b) -{ - if (index > 65535) - return 0; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - palette[index] = (0xff << 24) | ((r>>8) << 16) | ((g>>8) << 8) | (b>>8); - screena.update_pixels = 1; - screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&blinker_lock); - return 1; -} - -// Called with vstatlock -static int init_screen(struct bitmap_screen *screen, int *width, int *height) -{ - uint32_t *newscreen; - - pthread_mutex_lock(&screen->screenlock); - screen->screenwidth = vstat.scrnwidth; - if (width) - *width = screen->screenwidth; - screen->screenheight = vstat.scrnheight; - if (height) - *height = screen->screenheight; - newscreen = realloc(screen->screen, screen->screenwidth * screen->screenheight * sizeof(screen->screen[0])); - - if (!newscreen) { - pthread_mutex_unlock(&screen->screenlock); - return(-1); - } - screen->screen = newscreen; - memset_u32(screen->screen, vstat.palette[0], screen->screenwidth * screen->screenheight); - screen->update_pixels = 1; - bitmap_drv_free_rect(screen->rect); - screen->rect = alloc_full_rect(screen); - if (screen->rect == NULL) { - pthread_mutex_unlock(&screen->screenlock); - return(-1); - } - memset_u32(screen->rect->data, color_value(vstat.palette[0]), screen->rect->rect.width * screen->rect->rect.height); - pthread_mutex_unlock(&screen->screenlock); - return(0); -} - -/***********************/ -/* Called from drivers */ -/***********************/ - -/* - * This function is intended to be called from the driver. - * as a result, it cannot block waiting for driver status - * - * Must be called with vstatlock held. - * Care MUST be taken to avoid deadlocks... - * This is where the vmode bits used by the driver are modified... - * the driver must be aware of this. - * This is where the driver should grab vstatlock, then it should copy - * out after this and only grab that lock again briefly to update - * vstat.scaling. - */ -int bitmap_drv_init_mode(int mode, int *width, int *height) -{ - int i; - - if(!bitmap_initialized) - return(-1); - - if(load_vmode(&vstat, mode)) { - // TODO: WTF? - //pthread_mutex_unlock(&blinker_lock); - return(-1); - } - - /* Initialize video memory with black background, white foreground */ - for (i = 0; i < vstat.cols*vstat.rows; ++i) { - vstat.vmem->vmem[i].ch = 0; - vstat.vmem->vmem[i].legacy_attr = vstat.currattr; - vstat.vmem->vmem[i].font = default_font; - bitmap_attr2palette_locked(vstat.currattr, &vstat.vmem->vmem[i].fg, &vstat.vmem->vmem[i].bg); - } - - if (init_screen(&screena, width, height)) - return -1; - if (init_screen(&screenb, width, height)) - return -1; - for (i=0; i<sizeof(current_font)/sizeof(current_font[0]); i++) - current_font[i]=default_font; - bitmap_loadfont_locked(NULL); - - cio_textinfo.attribute=vstat.currattr; - cio_textinfo.normattr=vstat.currattr; - cio_textinfo.currmode=mode; - - if (vstat.rows > 0xff) - cio_textinfo.screenheight = 0xff; - else - cio_textinfo.screenheight = vstat.rows; - - if (vstat.cols > 0xff) - cio_textinfo.screenwidth = 0xff; - else - cio_textinfo.screenwidth = vstat.cols; - - cio_textinfo.curx=1; - cio_textinfo.cury=1; - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - - return(0); -} - -/* - * MUST be called only once and before any other bitmap functions - */ -int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) - ,void (*flush_cb) (void)) -{ - int i; - - if(bitmap_initialized) - return(-1); - cio_api.options |= CONIO_OPT_LOADABLE_FONTS | CONIO_OPT_BLINK_ALT_FONT - | CONIO_OPT_BOLD_ALT_FONT | CONIO_OPT_BRIGHT_BACKGROUND - | CONIO_OPT_SET_PIXEL | CONIO_OPT_CUSTOM_CURSOR - | CONIO_OPT_FONT_SELECT | CONIO_OPT_EXTENDED_PALETTE | CONIO_OPT_PALETTE_SETTING - | CONIO_OPT_BLOCKY_SCALING; - pthread_mutex_init(&blinker_lock, NULL); - pthread_mutex_init(&callbacks.lock, NULL); - pthread_mutex_init(&vstatlock, NULL); - pthread_mutex_init(&screena.screenlock, NULL); - pthread_mutex_init(&screenb.screenlock, NULL); - pthread_mutex_init(&free_rect_lock, NULL); - pthread_mutex_lock(&vstatlock); - init_r2y(); - vstat.vmem=NULL; - vstat.flags = VIDMODES_FLAG_PALETTE_VMEM; - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - for (i = 0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) { - palette[i] = (0xff << 24) | (dac_default[i].red << 16) | (dac_default[i].green << 8) | dac_default[i].blue; - } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_unlock(&vstatlock); - - callbacks.drawrect=drawrect_cb; - callbacks.flush=flush_cb; - callbacks.rects = 0; - bitmap_initialized=1; - _beginthread(blinker_thread,0,NULL); - - return(0); -} - -void bitmap_drv_request_pixels(void) -{ - pthread_mutex_lock(&screena.screenlock); - if (screena.update_pixels == 0) - screena.update_pixels = 2; - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); - if (screenb.update_pixels == 0) - screenb.update_pixels = 2; - pthread_mutex_unlock(&screenb.screenlock); -} - -void bitmap_drv_request_some_pixels(int x, int y, int width, int height) -{ - /* TODO: Some sort of queue here? */ - bitmap_drv_request_pixels(); -} - -void bitmap_drv_free_rect(struct rectlist *rect) -{ - if (rect == NULL) - return; - pthread_mutex_lock(&free_rect_lock); - rect->next = free_rects; - free_rects = rect; - pthread_mutex_unlock(&free_rect_lock); -} diff --git a/ciolib/bitmap_con.h b/ciolib/bitmap_con.h deleted file mode 100644 index e6879832f581ff285a4302d17505e6fc7dc84442..0000000000000000000000000000000000000000 --- a/ciolib/bitmap_con.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef BITMAP_CON_H -#define BITMAP_CON_H - -#include "vidmodes.h" -#include "threadwrap.h" - -struct rectangle { - int x; - int y; - int width; - int height; -}; - -struct rectlist { - struct rectangle rect; - uint32_t *data; - struct rectlist *next; -}; - -extern struct video_stats vstat; -extern pthread_mutex_t vstatlock; -extern pthread_mutex_t blinker_lock; - -#ifndef BITMAP_CIOLIB_DRIVER -/* Called from ciolib */ -int bitmap_puttext(int sx, int sy, int ex, int ey, void *fill); -int bitmap_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill); -int bitmap_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill); -void bitmap_gotoxy(int x, int y); -void bitmap_setcursortype(int type); -int bitmap_setfont(int font, int force, int font_no); -int bitmap_getfont(int fnum); -int bitmap_loadfont(const char *filename); -int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy); -void bitmap_clreol(void); -void bitmap_clrscr(void); -void bitmap_getcustomcursor(int *s, int *e, int *r, int *b, int *v); -void bitmap_setcustomcursor(int s, int e, int r, int b, int v); -int bitmap_getvideoflags(void); -void bitmap_setvideoflags(int flags); -int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp); -int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour); -int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *, void *mask); -struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); -int bitmap_get_modepalette(uint32_t p[16]); -int bitmap_set_modepalette(uint32_t p[16]); -uint32_t bitmap_map_rgb(uint16_t r, uint16_t g, uint16_t b); -void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size); -int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b); -#endif - -#ifdef BITMAP_CIOLIB_DRIVER -/* Called from drivers */ -int bitmap_drv_init_mode(int mode, int *width, int *height); -int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) - ,void (*flush) (void)); -void bitmap_drv_request_pixels(void); -void bitmap_drv_request_some_pixels(int x, int y, int width, int height); -void bitmap_drv_free_rect(struct rectlist *rect); -#endif - -#endif diff --git a/ciolib/ciolib.c b/ciolib/ciolib.c deleted file mode 100644 index 7742eb2ef2b7a49b1139cec7eed442b1cf7feea7..0000000000000000000000000000000000000000 --- a/ciolib/ciolib.c +++ /dev/null @@ -1,1942 +0,0 @@ -/* $Id: ciolib.c,v 1.204 2020/07/18 18:15:28 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* Icon file! */ -#ifdef __BORLANDC__ -#pragma resource "ciolib.res" /* DO NOT REMOVE THE EXTRA \r! */ -#endif - -#include <stdarg.h> -#include <stdlib.h> /* alloca */ -#include <stdio.h> -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ -#endif - -#include <threadwrap.h> -#include <genwrap.h> -#include <xpbeep.h> - -#define CIOLIB_NO_MACROS -#include "ciolib.h" - -#if defined(WITH_SDL) - #include "sdl_con.h" - #include "sdlfuncs.h" -#endif -#ifdef _WIN32 - #include "win32cio.h" -#else - #ifndef NO_X - #include "x_cio.h" - #endif - #include "curs_cio.h" - #undef getch -#endif - -#include "bitmap_con.h" -#include "ansi_cio.h" -#include "syncicon64.h" - -CIOLIBEXPORT cioapi_t cio_api; - -static const int tabs[]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145}; -static int ungotch; -struct text_info cio_textinfo; -uint32_t ciolib_fg; -uint32_t ciolib_bg; -static int lastmode=C80; -CIOLIBEXPORT int _wscroll=1; -CIOLIBEXPORT int directvideo=0; -CIOLIBEXPORT int hold_update=0; -CIOLIBEXPORT int puttext_can_move=0; -CIOLIBEXPORT int ciolib_reaper=TRUE; -CIOLIBEXPORT char *ciolib_appname=NULL; -CIOLIBEXPORT int ciolib_initial_window_height = -1; -CIOLIBEXPORT int ciolib_initial_window_width = -1; -static int initialized=0; - -CIOLIBEXPORT int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy); -CIOLIBEXPORT char * ciolib_cgets(char *str); -CIOLIBEXPORT int ciolib_cscanf (char *format , ...); -CIOLIBEXPORT int ciolib_kbhit(void); -CIOLIBEXPORT int ciolib_getch(void); -CIOLIBEXPORT int ciolib_getche(void); -CIOLIBEXPORT int ciolib_ungetch(int ch); -CIOLIBEXPORT void ciolib_gettextinfo(struct text_info *info); -CIOLIBEXPORT int ciolib_wherex(void); -CIOLIBEXPORT int ciolib_wherey(void); -CIOLIBEXPORT void ciolib_wscroll(void); -CIOLIBEXPORT void ciolib_gotoxy(int x, int y); -CIOLIBEXPORT void ciolib_clreol(void); -CIOLIBEXPORT void ciolib_clrscr(void); -CIOLIBEXPORT int ciolib_cputs(const char *str); -CIOLIBEXPORT int ciolib_cprintf(const char *fmat, ...); -CIOLIBEXPORT void ciolib_textbackground(int colour); -CIOLIBEXPORT void ciolib_textcolor(int colour); -CIOLIBEXPORT void ciolib_highvideo(void); -CIOLIBEXPORT void ciolib_lowvideo(void); -CIOLIBEXPORT void ciolib_normvideo(void); -CIOLIBEXPORT int ciolib_puttext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_puttext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT int ciolib_gettext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_gettext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT void ciolib_textattr(int a); -CIOLIBEXPORT void ciolib_delay(long a); -CIOLIBEXPORT int ciolib_putch(int a); -CIOLIBEXPORT void ciolib_setcursortype(int a); -CIOLIBEXPORT void ciolib_textmode(int mode); -CIOLIBEXPORT void ciolib_window(int sx, int sy, int ex, int ey); -CIOLIBEXPORT void ciolib_delline(void); -CIOLIBEXPORT void ciolib_insline(void); -CIOLIBEXPORT char * ciolib_getpass(const char *prompt); -CIOLIBEXPORT void ciolib_copytext(const char *text, size_t buflen); -CIOLIBEXPORT char * ciolib_getcliptext(void); -CIOLIBEXPORT int ciolib_get_window_info(int *width, int *height, int *xpos, int *ypos); -CIOLIBEXPORT void ciolib_setscaling(int new_value); -CIOLIBEXPORT int ciolib_getscaling(void); -CIOLIBEXPORT int ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); -CIOLIBEXPORT int ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg); -CIOLIBEXPORT int ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour); -CIOLIBEXPORT struct ciolib_pixels * ciolib_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); -CIOLIBEXPORT int ciolib_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask); -CIOLIBEXPORT void ciolib_freepixels(struct ciolib_pixels *pixels); -CIOLIBEXPORT struct ciolib_screen * ciolib_savescreen(void); -CIOLIBEXPORT void ciolib_freescreen(struct ciolib_screen *); -CIOLIBEXPORT int ciolib_restorescreen(struct ciolib_screen *scrn); -CIOLIBEXPORT void ciolib_setcolour(uint32_t fg, uint32_t bg); -CIOLIBEXPORT int ciolib_get_modepalette(uint32_t p[16]); -CIOLIBEXPORT int ciolib_set_modepalette(uint32_t p[16]); -CIOLIBEXPORT void ciolib_set_vmem(struct vmem_cell *cell, uint8_t ch, uint8_t attr, uint8_t font); -CIOLIBEXPORT void ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr); -CIOLIBEXPORT void ciolib_setwinsize(int width, int height); -CIOLIBEXPORT void ciolib_setwinposition(int x, int y); -CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void); - -#if defined(WITH_SDL) -int sdl_video_initialized = 0; -#endif - -#define CIOLIB_INIT() { if(initialized != 1) initciolib(CIOLIB_MODE_AUTO); } - -#if defined(WITH_SDL) -static int try_sdl_init(int mode) -{ - if(!sdl_initciolib(mode)) { - cio_api.mouse=1; - cio_api.puttext=bitmap_puttext; - cio_api.vmem_puttext=bitmap_vmem_puttext; - cio_api.vmem_gettext=bitmap_vmem_gettext; - cio_api.gotoxy=bitmap_gotoxy; - cio_api.setcursortype=bitmap_setcursortype; - cio_api.setfont=bitmap_setfont; - cio_api.getfont=bitmap_getfont; - cio_api.loadfont=bitmap_loadfont; - cio_api.movetext=bitmap_movetext; - cio_api.clreol=bitmap_clreol; - cio_api.clrscr=bitmap_clrscr; - cio_api.getcustomcursor=bitmap_getcustomcursor; - cio_api.setcustomcursor=bitmap_setcustomcursor; - cio_api.getvideoflags=bitmap_getvideoflags; - cio_api.setvideoflags=bitmap_setvideoflags; - - cio_api.kbhit=sdl_kbhit; - cio_api.getch=sdl_getch; - cio_api.textmode=sdl_textmode; - cio_api.showmouse=sdl_showmouse; - cio_api.hidemouse=sdl_hidemouse; - cio_api.setname=sdl_setname; - cio_api.seticon=sdl_seticon; - cio_api.settitle=sdl_settitle; - cio_api.copytext=sdl_copytext; - cio_api.getcliptext=sdl_getcliptext; - cio_api.get_window_info=sdl_get_window_info; - cio_api.setwinsize=sdl_setwinsize; - cio_api.setwinposition=sdl_setwinposition; - cio_api.setpalette=bitmap_setpalette; - cio_api.attr2palette=bitmap_attr2palette; - cio_api.setpixel=bitmap_setpixel; - cio_api.getpixels=bitmap_getpixels; - cio_api.setpixels=bitmap_setpixels; - cio_api.get_modepalette=bitmap_get_modepalette; - cio_api.set_modepalette=bitmap_set_modepalette; - cio_api.map_rgb = bitmap_map_rgb; - cio_api.replace_font = bitmap_replace_font; - cio_api.beep = sdl_beep; - cio_api.mousepointer=sdl_mousepointer; - return(1); - } - return(0); -} -#endif - -#ifndef NO_X -static int try_x_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - if(!x_init()) { - cio_api.mode=CIOLIB_MODE_X; - cio_api.mouse=1; - cio_api.puttext=bitmap_puttext; - cio_api.vmem_puttext=bitmap_vmem_puttext; - cio_api.vmem_gettext=bitmap_vmem_gettext; - cio_api.gotoxy=bitmap_gotoxy; - cio_api.setcursortype=bitmap_setcursortype; - cio_api.setfont=bitmap_setfont; - cio_api.getfont=bitmap_getfont; - cio_api.loadfont=bitmap_loadfont; - cio_api.beep=x_beep; - cio_api.movetext=bitmap_movetext; - cio_api.clreol=bitmap_clreol; - cio_api.clrscr=bitmap_clrscr; - cio_api.getcustomcursor=bitmap_getcustomcursor; - cio_api.setcustomcursor=bitmap_setcustomcursor; - cio_api.getvideoflags=bitmap_getvideoflags; - cio_api.setvideoflags=bitmap_setvideoflags; - - cio_api.kbhit=x_kbhit; - cio_api.getch=x_getch; - cio_api.textmode=x_textmode; - cio_api.setname=x_setname; - cio_api.settitle=x_settitle; - cio_api.copytext=x_copytext; - cio_api.getcliptext=x_getcliptext; - cio_api.get_window_info=x_get_window_info; - cio_api.setscaling=x_setscaling; - cio_api.getscaling=x_getscaling; - cio_api.seticon=x_seticon; - cio_api.setpalette=bitmap_setpalette; - cio_api.attr2palette=bitmap_attr2palette; - cio_api.setpixel=bitmap_setpixel; - cio_api.getpixels=bitmap_getpixels; - cio_api.setpixels=bitmap_setpixels; - cio_api.get_modepalette=bitmap_get_modepalette; - cio_api.set_modepalette=bitmap_set_modepalette; - cio_api.map_rgb = bitmap_map_rgb; - cio_api.replace_font = bitmap_replace_font; - cio_api.mousepointer=x_mousepointer; - return(1); - } - return(0); -} -#endif - -#ifndef _WIN32 -static int try_curses_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - if(curs_initciolib(mode)) { - if(mode==CIOLIB_MODE_AUTO) - mode=CIOLIB_MODE_CURSES; - cio_api.mode=mode; - cio_api.puttext=curs_puttext; - cio_api.vmem_puttext=curs_vmem_puttext; - cio_api.vmem_gettext=curs_vmem_gettext; - cio_api.textattr=curs_textattr; - cio_api.kbhit=curs_kbhit; - cio_api.gotoxy=curs_gotoxy; - cio_api.setcursortype=curs_setcursortype; - cio_api.getch=curs_getch; - cio_api.textmode=curs_textmode; - cio_api.showmouse=curs_showmouse; - cio_api.hidemouse=curs_hidemouse; - cio_api.suspend=curs_suspend; - cio_api.resume=curs_resume; - cio_api.beep=curs_beep; - cio_api.setvideoflags=curs_setvideoflags; - cio_api.getvideoflags=curs_getvideoflags; -#if defined(NCURSES_VERSION_MAJOR) || defined (__NetBSD__) - cio_api.escdelay=&ESCDELAY; -#endif - cio_api.setfont = curs_setfont; - cio_api.getfont = curs_getfont; - cio_api.setpalette = curs_setpalette; - cio_api.get_modepalette = curs_get_modepalette; - cio_api.set_modepalette = curs_set_modepalette; - cio_api.attr2palette = curs_attr2palette; - return(1); - } - return(0); -} -#endif - -static int try_ansi_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - if(ansi_initciolib(mode)) { - cio_api.mode=CIOLIB_MODE_ANSI; - cio_api.mouse=0; - cio_api.puttext=ansi_puttext; - cio_api.gettext=ansi_gettext; - cio_api.textattr=ansi_textattr; - cio_api.kbhit=ansi_kbhit; - cio_api.gotoxy=ansi_gotoxy; - cio_api.setcursortype=ansi_setcursortype; - cio_api.getch=ansi_getch; - cio_api.textmode=ansi_textmode; - cio_api.escdelay=&CIOLIB_ANSI_TIMEOUT; - cio_api.beep=ansi_beep; - cio_api.suspend=ansi_suspend; - return(1); - } - return(0); -} - -#ifdef _WIN32 -#if defined(__BORLANDC__) - #pragma argsused -#endif -static int try_conio_init(int mode) -{ -#if defined(WITH_SDL) - if (sdl_video_initialized) { - sdl.QuitSubSystem(SDL_INIT_VIDEO); - } -#endif - - /* This should test for something or other */ - if(win32_initciolib(mode)) { - if(mode==CIOLIB_MODE_AUTO) - cio_api.mode=CIOLIB_MODE_CONIO; - else - cio_api.mode=mode; /* CIOLIB_MODE_CONIO or CIOLIB_MODE_CONIO_FULLSCREEN */ - cio_api.mouse=1; - cio_api.puttext=win32_puttext; - cio_api.gettext=win32_gettext; - cio_api.kbhit=win32_kbhit; - cio_api.gotoxy=win32_gotoxy; - cio_api.setcursortype=win32_setcursortype; - cio_api.getch=win32_getch; - cio_api.textmode=win32_textmode; - cio_api.showmouse=win32_showmouse; - cio_api.hidemouse=win32_hidemouse; - cio_api.setname=win32_settitle; - cio_api.settitle=win32_settitle; - cio_api.copytext=win32_copytext; - cio_api.getcliptext=win32_getcliptext; - cio_api.suspend=win32_suspend; - cio_api.resume=win32_resume; - cio_api.getcustomcursor=win32_getcustomcursor; - cio_api.setcustomcursor=win32_setcustomcursor; - cio_api.getvideoflags=win32_getvideoflags; - cio_api.setpalette=win32_setpalette; - return(1); - } - return(0); -} -#endif - -/* Optional */ -CIOLIBEXPORT void suspendciolib(void) -{ - ciolib_clrscr(); - if(cio_api.suspend != NULL) - cio_api.suspend(); - initialized=-1; -} - -CIOLIBEXPORT int initciolib(int mode) -{ - switch(initialized) { - case 1: - return(0); - case -1: - initialized=1; - if(cio_api.resume != NULL) - cio_api.resume(); - ciolib_clrscr(); - return(0); - } - - memset(&cio_api,0,sizeof(cio_api)); - - switch(mode) { - case CIOLIB_MODE_AUTO: -#ifndef NO_X - if(!try_x_init(mode)) -#endif -#if defined(WITH_SDL) - if(!try_sdl_init(CIOLIB_MODE_SDL)) -#endif -#ifdef _WIN32 - if(!try_conio_init(mode)) -#else - if(!try_curses_init(mode)) -#endif - try_ansi_init(mode); - break; -#ifdef _WIN32 - case CIOLIB_MODE_CONIO: - case CIOLIB_MODE_CONIO_FULLSCREEN: - try_conio_init(mode); - break; -#else - case CIOLIB_MODE_CURSES: - case CIOLIB_MODE_CURSES_IBM: - case CIOLIB_MODE_CURSES_ASCII: - try_curses_init(mode); - break; - - case CIOLIB_MODE_X: -#ifndef NO_X - try_x_init(mode); -#endif - break; -#endif - case CIOLIB_MODE_ANSI: - try_ansi_init(mode); - break; - -#if defined(WITH_SDL) - case CIOLIB_MODE_SDL: - case CIOLIB_MODE_SDL_FULLSCREEN: - try_sdl_init(mode); - break; -#endif - } - if(cio_api.mode==CIOLIB_MODE_AUTO) { - fprintf(stderr,"CIOLIB initialization failed!\n"); - return(-1); - } - - initialized=1; - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - - /* Default C64 is Lt Blue on Dark Blue (As per Every picture ever) */ - switch(cio_textinfo.currmode) { - case C64_40X25: - cio_textinfo.normattr=0x6e; - break; - case C128_40X25: - cio_textinfo.normattr=0xbd; - break; - default: - cio_textinfo.normattr=LIGHTGRAY; - break; - } - ciolib_seticon(syncicon64, SYNCICON64_WIDTH); - ciolib_textattr(cio_textinfo.normattr); - - _beginthread(ciolib_mouse_thread,0,NULL); - return(0); -} - -/* **MUST** be implemented */ -/* - * Returns non-zero if a key is hit - */ -CIOLIBEXPORT int ciolib_kbhit(void) -{ - CIOLIB_INIT(); - if(ungotch) - return(1); - return(cio_api.kbhit()); -} - -/* **MUST** be implemented */ -CIOLIBEXPORT int ciolib_getch(void) -{ - int ch; - - CIOLIB_INIT(); - - if(ungotch) { - ch=ungotch; - ungotch=0; - return(ch); - } - return(cio_api.getch()); -} - -/* Optional */ -CIOLIBEXPORT int ciolib_getche(void) -{ - int ch; - - CIOLIB_INIT(); - - if(ungotch) { - ch=ungotch; - ungotch=0; - ciolib_putch(ch); - return(ch); - } - if(cio_api.getche) - return(cio_api.getche()); - else { - while(1) { - ch=ciolib_getch(); - if(ch != 0 && ch != 0xe0) { - ciolib_putch(ch); - return(ch); - } - /* Eat extended chars - except ESC which is an abort */ - if(ciolib_getch()==1) - return(EOF); - } - } -} - -/* Optional */ -/* - * On success, returns ch, on error, returns EOF - */ -CIOLIBEXPORT int ciolib_ungetch(int ch) -{ - CIOLIB_INIT(); - - if(ungotch) - return(EOF); - if(cio_api.ungetch) - return(cio_api.ungetch(ch)); - ungotch=ch; - return(ch); -} - -/* Optional */ -/* - * Returns non-zero on success - */ -CIOLIBEXPORT int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy) -{ - int width; - int height; - void *buf; - - CIOLIB_INIT(); - - if(cio_api.movetext != NULL) - return(cio_api.movetext(sx, sy, ex, ey, dx, dy)); - - width=ex-sx; - height=ey-sy; - if (cio_api.vmem_gettext) { - buf=malloc((width+1)*(height+1)*sizeof(struct vmem_cell)); - if (buf == NULL) - return 0; - if(!ciolib_vmem_gettext(sx,sy,ex,ey,buf)) - goto fail; - if(!ciolib_vmem_puttext(dx,dy,dx+width,dy+height,buf)) - goto fail; - } - else { - buf=malloc((width+1)*(height+1)*2); - if (buf == NULL) - return 0; - if(!ciolib_gettext(sx,sy,ex,ey,buf)) - goto fail; - if(!ciolib_puttext(dx,dy,dx+width,dy+height,buf)) - goto fail; - } - - return(1); - -fail: - free(buf); - return 0; -} - -/* Optional */ -/* - * Returns &str[2] - * Cannot fail - */ -CIOLIBEXPORT char * ciolib_cgets(char *str) -{ - int maxlen; - int len=0; - int ch; - - CIOLIB_INIT(); - - if(cio_api.cgets) - return(cio_api.cgets(str)); - - maxlen=*(unsigned char *)str; - while((ch=ciolib_getch())!='\n' && ch !='\r') { - switch(ch) { - case 0: /* Skip extended keys */ - case 0xe0: /* Skip extended keys */ - if(ciolib_getche()==1) - goto early_return; - break; - case '\b': - if(len==0) { - ciolib_putch(7); - break; - } - ciolib_putch('\b'); - len--; - break; - default: - ciolib_putch(ch); - str[(len++)+2]=ch; - if(len==maxlen) { - str[len+2]=0; - *((unsigned char *)(str+1))=(unsigned char)len; - ciolib_putch('\r'); - ciolib_putch('\n'); - return(&str[2]); - } - break; - } - } -early_return: - str[len+2]=0; - *((unsigned char *)(str+1))=(unsigned char)len; - ciolib_putch('\r'); - ciolib_putch('\n'); - return(&str[2]); -} - -#if defined(_MSC_VER) && (_MSC_VER < 1800) /* Use lame vsscanf() implementation */ -/* This is a way to do _vsscanf without using fancy stack tricks or using the - * "_input" method provided by Microsoft, which is no longer exported as of .NET. - * The function has a limit of 25 arguments (or less if you run out of stack space), - * but how many arguments do you need? - */ -/* From "krabsheva" - http://www.codeguru.com/Cpp/Cpp/string/comments.php/c5631/?thread=1051 */ -int vsscanf( const char *buffer, const char *format, va_list arg_ptr ) -{ - int i, ret; - void *arg_arr[25]; - - /* Do exception handling in case we go too far // */ - __try - { - for ( i = 0; i < 25; i++ ) - arg_arr[i] = va_arg( arg_ptr, void * ); - } - __except( EXCEPTION_EXECUTE_HANDLER ) - { - } - - /* This is lame, but the extra arguments won't be used by sscanf */ - ret = sscanf( buffer, format, arg_arr[0], arg_arr[1], arg_arr[2], arg_arr[3], - arg_arr[4], arg_arr[5], arg_arr[6], arg_arr[7], arg_arr[8], arg_arr[9], - arg_arr[10], arg_arr[11], arg_arr[12], arg_arr[13], arg_arr[14], - arg_arr[15], arg_arr[16], arg_arr[17], arg_arr[18], arg_arr[19], - arg_arr[20], arg_arr[21], arg_arr[22], arg_arr[23], arg_arr[24] ); - - return ret; -} -#endif - -/* Can't be overridden */ -/* Returns the number of fields converted */ -CIOLIBEXPORT int ciolib_cscanf (char *format , ...) -{ - char str[255]; - va_list argptr; - int ret; - - CIOLIB_INIT(); - - str[0]=-1; - va_start(argptr,format); - ret=vsscanf(ciolib_cgets(str),format,argptr); - va_end(argptr); - return(ret); -} - -/* Optional */ -/* So dumb */ -CIOLIBEXPORT char * ciolib_getpass(const char *prompt) -{ - static char pass[9]; - int len=0; - int ch; - - CIOLIB_INIT(); - - if(cio_api.getpass) - return(cio_api.getpass(prompt)); - - ciolib_cputs(prompt); - while((ch=ciolib_getch())!='\n') { - switch(ch) { - case 0: /* Skip extended keys */ - case 0xe0: /* Skip extended keys */ - if(ciolib_getch()==1) - goto early_return; - break; - case '\r': /* Skip \r (ToDo: Should this be treeated as a \n? */ - break; - case '\b': - if(len==0) { - ciolib_putch(7); - break; - } - len--; - break; - default: - if(len==8) - ciolib_putch(7); - else - pass[len++]=ch; - break; - } - } -early_return: - pass[len]=0; - return(pass); -} - -/* TODO: Hackery here... must fix */ -/* Optional */ -CIOLIBEXPORT void ciolib_gettextinfo(struct text_info *info) -{ - CIOLIB_INIT() - - if(cio_api.gettextinfo) - cio_api.gettextinfo(&cio_textinfo); - - if(info!=&cio_textinfo) - *info=cio_textinfo; -} - -/* Optional */ -/* Not part of Borland conio? */ -CIOLIBEXPORT void ciolib_wscroll(void) -{ - int os; - - CIOLIB_INIT(); - - if(cio_api.wscroll!=NULL) { - cio_api.wscroll(); - return; - } - if(!_wscroll) - return; - ciolib_movetext(cio_textinfo.winleft - ,cio_textinfo.wintop+1 - ,cio_textinfo.winright - ,cio_textinfo.winbottom - ,cio_textinfo.winleft - ,cio_textinfo.wintop); - ciolib_gotoxy(1,cio_textinfo.winbottom-cio_textinfo.wintop+1); - os=_wscroll; - _wscroll=0; - /* ciolib_cprintf("%*s",ti.winright-ti.winleft+1,""); */ - ciolib_clreol(); - _wscroll=os; - ciolib_gotoxy(cio_textinfo.curx,cio_textinfo.cury); -} - -/* Optional */ -/* Cannot fail */ -CIOLIBEXPORT int ciolib_wherex(void) -{ - int x; - - CIOLIB_INIT(); - - if(cio_api.wherex) { - /* TODO: This is old hackery... beware */ - x=cio_api.wherex(); - x=x-cio_textinfo.winleft+1; - } - else - x=cio_textinfo.curx; - return(x); -} - -/* Optional */ -/* Cannot fail */ -CIOLIBEXPORT int ciolib_wherey(void) -{ - int y; - - CIOLIB_INIT(); - - if(cio_api.wherey) { - /* TODO: This is old hackery... beware */ - y=cio_api.wherey(); - y=y-cio_textinfo.wintop+1; - } - else - y=cio_textinfo.cury; - return(y); -} - -/* **MUST** be implemented */ -CIOLIBEXPORT void ciolib_gotoxy(int x, int y) -{ - CIOLIB_INIT(); - - if( x < 1 - || x > cio_textinfo.winright-cio_textinfo.winleft+1 - || y < 1 - || y > cio_textinfo.winbottom-cio_textinfo.wintop+1) - return; - cio_api.gotoxy(x,y); -} - -/* **MUST** be implemented */ -CIOLIBEXPORT void ciolib_textmode(int mode) -{ - CIOLIB_INIT(); - - if(mode==LASTMODE) { - cio_api.textmode(lastmode); - lastmode=cio_textinfo.currmode; - } - else { - if(mode==64) - mode=C80X50; - if(mode==_ORIGMODE) - mode=C80; - lastmode=cio_textinfo.currmode; - cio_api.textmode(mode); - } - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - - switch(cio_textinfo.currmode) { - case C64_40X25: - cio_textinfo.normattr=0x6e; - break; - case C128_40X25: - cio_textinfo.normattr=0xbd; - break; - default: - cio_textinfo.normattr=LIGHTGRAY; - break; - } - ciolib_textattr(cio_textinfo.normattr); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_window(int sx, int sy, int ex, int ey) -{ - CIOLIB_INIT(); - - if(cio_api.window) - cio_api.window(sx,sy,ex,ey); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight) { - return; - } - cio_textinfo.winleft=sx; - cio_textinfo.wintop=sy; - cio_textinfo.winright=ex; - cio_textinfo.winbottom=ey; - ciolib_gotoxy(1,1); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_clreol(void) -{ - struct vmem_cell *buf; - int i; - int width,height; - - CIOLIB_INIT(); - - if(cio_api.clreol) { - cio_api.clreol(); - return; - } - - width=cio_textinfo.winright-cio_textinfo.winleft+1-cio_textinfo.curx+1; - height=1; - buf=malloc(width*height*sizeof(*buf)); - if (!buf) - return; - for(i=0;i<width*height;i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cio_textinfo.attribute; - buf[i].fg = ciolib_fg; - buf[i].bg = ciolib_bg; - buf[i].font = ciolib_attrfont(cio_textinfo.attribute); - } - ciolib_vmem_puttext( - cio_textinfo.curx+cio_textinfo.winleft-1, - cio_textinfo.cury+cio_textinfo.wintop-1, - cio_textinfo.winright, - cio_textinfo.cury+cio_textinfo.wintop-1, - buf); - free(buf); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_clrscr(void) -{ - struct vmem_cell *buf; - int i; - int width,height; - int old_ptcm=puttext_can_move; - - CIOLIB_INIT(); - if(cio_api.clrscr) { - cio_api.clrscr(); - return; - } - - width=cio_textinfo.winright-cio_textinfo.winleft+1; - height=cio_textinfo.winbottom-cio_textinfo.wintop+1; - buf=malloc(width*height*sizeof(*buf)); - if(!buf) - return; - for(i=0;i<width*height;i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cio_textinfo.attribute; - buf[i].fg = ciolib_fg; - buf[i].bg = ciolib_bg; - buf[i].font = ciolib_attrfont(cio_textinfo.attribute); - } - puttext_can_move=1; - ciolib_vmem_puttext(cio_textinfo.winleft,cio_textinfo.wintop,cio_textinfo.winright,cio_textinfo.winbottom,buf); - ciolib_gotoxy(1,1); - puttext_can_move=old_ptcm; - - free(buf); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_delline(void) -{ - CIOLIB_INIT(); - - if(cio_api.delline) { - cio_api.delline(); - return; - } - ciolib_movetext(cio_textinfo.winleft - ,cio_textinfo.cury+1 - ,cio_textinfo.winright - ,cio_textinfo.winbottom - ,cio_textinfo.winleft - ,cio_textinfo.cury); - ciolib_gotoxy(1,cio_textinfo.winbottom-cio_textinfo.wintop+1); - ciolib_clreol(); - ciolib_gotoxy(cio_textinfo.curx,cio_textinfo.cury); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_insline(void) -{ - CIOLIB_INIT(); - - if(cio_api.insline) { - cio_api.insline(); - return; - } - ciolib_movetext(cio_textinfo.winleft,cio_textinfo.cury,cio_textinfo.winright,cio_textinfo.winbottom,cio_textinfo.winleft,cio_textinfo.cury+1); - ciolib_gotoxy(1,cio_textinfo.cury); - ciolib_clreol(); - ciolib_gotoxy(cio_textinfo.curx,cio_textinfo.cury); -} - -/* Not overridable due to varargs */ -/* Returns the number of characters or EOF on error */ -CIOLIBEXPORT int ciolib_cprintf(const char *fmat, ...) -{ - va_list argptr; - int ret; -#if defined(_MSC_VER) || defined(__MSVCRT__) /* Can't figure out a way to allocate a "big enough" buffer for Win32. */ - char str[16384]; -#else - char *str; -#ifndef HAVE_VASPRINTF - va_list argptr2; -#endif -#endif - - CIOLIB_INIT(); - - va_start(argptr,fmat); - -#ifdef HAVE_VASPRINTF - ret=vasprintf(&str, fmat, argptr); - if(ret>=0) - ciolib_cputs(str); - else - ret=EOF; - free(str); - va_end(argptr); -#else - -#if defined(_MSC_VER) || defined(__MSVCRT__) - ret=_vsnprintf(str,sizeof(str)-1,fmat,argptr); -#else - -#ifdef __BORLANDC__ - argptr2=argptr; -#else - va_copy(argptr2, argptr); -#endif - ret=vsnprintf(NULL,0,fmat,argptr); - if(ret<0) - return(EOF); - str=(char *)alloca(ret+1); - if(str==NULL) - return(EOF); - ret=vsprintf(str,fmat,argptr2); -#endif - va_end(argptr); -#if !(defined(_MSC_VER) || defined(__MSVCRT__)) - va_end(argptr2); -#endif - if(ret>=0) - ciolib_cputs(str); - else - ret=EOF; - -#endif - - return(ret); -} - -/* Optional */ -/* The Borland version does not translate \n into \r\n... this does. - * Returns last character printed (!) - */ -CIOLIBEXPORT int ciolib_cputs(const char *str) -{ - int pos; - int ret=0; - int olddmc; - - CIOLIB_INIT(); - - if(cio_api.cputs) - return(cio_api.cputs(str)); - - olddmc=hold_update; - hold_update=1; - for(pos=0;str[pos];pos++) - { - ret=str[pos]; - if(str[pos]=='\n') - ciolib_putch('\r'); - ciolib_putch(str[pos]); - } - hold_update=olddmc; - ciolib_gotoxy(ciolib_wherex(),ciolib_wherey()); - return(ret); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_textbackground(int colour) -{ - unsigned char attr; - unsigned char col; - - CIOLIB_INIT(); - - if(cio_api.textbackground) { - cio_api.textbackground(colour); - return; - } - - attr=cio_textinfo.attribute; - attr&=143; - col=(colour & 0x07); - attr|=(col<<4); - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_textcolor(int colour) -{ - unsigned char attr; - unsigned char col; - - CIOLIB_INIT(); - - if(cio_api.textcolor) { - cio_api.textcolor(colour); - return; - } - - attr=cio_textinfo.attribute; - attr&=240; - col=colour&0x0f; - attr|=col; - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_highvideo(void) -{ - int attr; - - CIOLIB_INIT(); - - if(cio_api.highvideo) { - cio_api.highvideo(); - return; - } - - attr=cio_textinfo.attribute; - attr |= 8; - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_lowvideo(void) -{ - int attr; - - CIOLIB_INIT(); - - if(cio_api.lowvideo) { - cio_api.lowvideo(); - return; - } - - attr=cio_textinfo.attribute; - attr &= 0xf7; - ciolib_textattr(attr); -} - -/* Optional... and overriding is silly */ -CIOLIBEXPORT void ciolib_normvideo(void) -{ - CIOLIB_INIT(); - - if(cio_api.normvideo) { - cio_api.normvideo(); - return; - } - ciolib_textattr(cio_textinfo.normattr); -} - -/* **MUST** be implemented */ -/* - * Non-zero on success - */ -CIOLIBEXPORT int ciolib_puttext(int a,int b,int c,int d,void *e) -{ - char *buf=e; - int ret; - CIOLIB_INIT(); - - ret = cio_api.puttext(a,b,c,d,(void *)buf); - if (buf != e) - free(buf); - return ret; -} - -/* **MUST** be implemented */ -/* 1 on success, 0 on failure */ -CIOLIBEXPORT int ciolib_gettext(int a,int b,int c,int d,void *e) -{ - char *ch; - int i; - int ret; - struct vmem_cell *buf; - CIOLIB_INIT(); - - if (cio_api.gettext == NULL) { - buf = malloc((c-a+1)*(d-b+1)*sizeof(*buf)); - if (buf == NULL) - return 0; - ch = e; - ret = cio_api.vmem_gettext(a,b,c,d,buf); - for (i=0; i<(c-a+1)*(d-b+1); i++) { - *(ch++)=buf[i].ch; - *(ch++)=buf[i].legacy_attr; - } - free(buf); - } - else - ret = cio_api.gettext(a,b,c,d,e); - return ret; -} - -/* Optional */ -/* 1 on success, 0 on failure */ -CIOLIBEXPORT int ciolib_vmem_gettext(int a,int b,int c,int d,struct vmem_cell *e) -{ - int ret; - uint16_t *buf; - int i; - CIOLIB_INIT(); - - if (cio_api.vmem_gettext == NULL) { - buf = malloc((c-a+1)*(d-b+1)*sizeof(*buf)); - if (buf == NULL) - return 0; - ret = ciolib_gettext(a, b, c, d, buf); - if (ret) { - for (i=0; i<(c-a+1)*(d-b+1); i++) { - memset(&e[i], 0, sizeof(e[0])); - e[i].ch = buf[i] & 0xff; - e[i].legacy_attr = buf[i] >> 8; - } - } - free(buf); - return ret; - } - return cio_api.vmem_gettext(a,b,c,d,e); -} - -/* Optional */ -/* Non-zero on success */ -CIOLIBEXPORT int ciolib_vmem_puttext(int a,int b,int c,int d,struct vmem_cell *e) -{ - int i; - int ret; - uint16_t *buf; - CIOLIB_INIT(); - - if (cio_api.vmem_puttext == NULL) { - buf = malloc((c-a+1)*(d-b+1)*sizeof(*buf)); - if (buf == NULL) - return 0; - for (i=0; i<(c-a+1)*(d-b+1); i++) - buf[i] = (e[i].legacy_attr << 8) | (e[i].ch); - ret = ciolib_puttext(a, b, c, d, buf); - free(buf); - return ret; - } - return cio_api.vmem_puttext(a,b,c,d,e); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_textattr(int a) -{ - CIOLIB_INIT(); - - if(cio_api.textattr) { - cio_api.textattr(a); - return; - } - - cio_textinfo.attribute=a; - ciolib_attr2palette(a, &ciolib_fg, &ciolib_bg); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_delay(long a) -{ - CIOLIB_INIT(); - - if(cio_api.delay) { - cio_api.delay(a); - return; - } - SLEEP(a); -} - -/* Optional */ -/* Returns ch on success, EOF on error */ -CIOLIBEXPORT int ciolib_putch(int ch) -{ - unsigned char a1=ch; - struct vmem_cell buf[1]; - int i; - int old_puttext_can_move=puttext_can_move; - - CIOLIB_INIT(); - - if(cio_api.putch) - return(cio_api.putch(a1)); - - puttext_can_move=1; - - buf[0].ch=a1; - buf[0].legacy_attr=cio_textinfo.attribute; - buf[0].fg = ciolib_fg; - buf[0].bg = ciolib_bg; - buf[0].font = ciolib_attrfont(cio_textinfo.attribute); - - switch(a1) { - case '\r': - ciolib_gotoxy(1,cio_textinfo.cury); - break; - case '\n': - if(cio_textinfo.cury==cio_textinfo.winbottom-cio_textinfo.wintop+1) - ciolib_wscroll(); - else - ciolib_gotoxy(cio_textinfo.curx, cio_textinfo.cury+1); - break; - case '\b': - if(cio_textinfo.curx>1) { - ciolib_gotoxy(cio_textinfo.curx-1,cio_textinfo.cury); - buf[0].ch=' '; - ciolib_vmem_puttext(cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,buf); - } - break; - case 7: /* Bell */ - ciolib_beep(); - break; - case '\t': - for(i=0;i<(sizeof(tabs)/sizeof(int));i++) { - if(tabs[i]>cio_textinfo.curx) { - buf[0].ch=' '; - while(cio_textinfo.curx<tabs[i]) { - ciolib_vmem_puttext(cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,cio_textinfo.curx+cio_textinfo.winleft-1 - ,cio_textinfo.cury+cio_textinfo.wintop-1 - ,buf); - ciolib_gotoxy(cio_textinfo.curx+1,cio_textinfo.cury); - if(cio_textinfo.curx==cio_textinfo.screenwidth) - break; - } - break; - } - } - if(cio_textinfo.curx==cio_textinfo.screenwidth) { - ciolib_gotoxy(1,cio_textinfo.cury); - if(cio_textinfo.cury==cio_textinfo.winbottom-cio_textinfo.wintop+1) - ciolib_wscroll(); - else - ciolib_gotoxy(cio_textinfo.curx, cio_textinfo.cury+1); - } - break; - default: - if(cio_textinfo.cury==cio_textinfo.winbottom-cio_textinfo.wintop+1 - && cio_textinfo.curx==cio_textinfo.winright-cio_textinfo.winleft+1) { - ciolib_vmem_puttext(ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,buf); - ciolib_wscroll(); - ciolib_gotoxy(1, cio_textinfo.winbottom-cio_textinfo.wintop+1); - } - else { - if(cio_textinfo.curx==cio_textinfo.winright-cio_textinfo.winleft+1) { - ciolib_vmem_puttext(ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,buf); - ciolib_gotoxy(1,cio_textinfo.cury+1); - } - else { - ciolib_vmem_puttext(ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,ciolib_wherex()+cio_textinfo.winleft-1 - ,ciolib_wherey()+cio_textinfo.wintop-1 - ,buf); - ciolib_gotoxy(cio_textinfo.curx+1, cio_textinfo.cury); - } - } - break; - } - - puttext_can_move=old_puttext_can_move; - - return(a1); - -} - -/* **MUST** be implemented */ -CIOLIBEXPORT void ciolib_setcursortype(int a) -{ - CIOLIB_INIT(); - - cio_api.setcursortype(a); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_showmouse(void) { - CIOLIB_INIT(); - - if(cio_api.showmouse!=NULL) - return(cio_api.showmouse()); - return(0); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_hidemouse(void) { - CIOLIB_INIT(); - - if(cio_api.hidemouse!=NULL) - return(cio_api.hidemouse()); - return(0); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setname(const char *name) { - CIOLIB_INIT(); - - if(cio_api.setname!=NULL) - cio_api.setname(name); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_seticon(const void *icon, unsigned long size) { - CIOLIB_INIT(); - - if(cio_api.seticon!=NULL) - cio_api.seticon(icon,size); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_settitle(const char *title) { - CIOLIB_INIT(); - - if(cio_api.settitle!=NULL) - cio_api.settitle(title); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_copytext(const char *text, size_t buflen) -{ - CIOLIB_INIT(); - - if(cio_api.copytext!=NULL) - cio_api.copytext(text,buflen); -} - -/* Optional */ -/* Returns NULL on error */ -CIOLIBEXPORT char * ciolib_getcliptext(void) -{ - CIOLIB_INIT(); - - if(cio_api.getcliptext!=NULL) - return(cio_api.getcliptext()); - else - return(NULL); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_setfont(int font, int force, int font_num) -{ - CIOLIB_INIT(); - - if(cio_api.setfont!=NULL) - return(cio_api.setfont(font,force,font_num)); - else - return(0); -} - -/* Optional */ -/* Return -1 if not implemented */ -CIOLIBEXPORT int ciolib_getfont(int font_num) -{ - CIOLIB_INIT(); - - if(cio_api.getfont!=NULL) - return(cio_api.getfont(font_num)); - else - return(-1); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_loadfont(const char *filename) -{ - CIOLIB_INIT(); - - if(cio_api.loadfont!=NULL) - return(cio_api.loadfont(filename)); - else - return(0); -} - -/* Optional */ -/* Return Non-zero on success */ -CIOLIBEXPORT int ciolib_get_window_info(int *width, int *height, int *xpos, int *ypos) -{ - CIOLIB_INIT(); - - if(cio_api.get_window_info!=NULL) - return(cio_api.get_window_info(width,height,xpos,ypos)); - else { - if(width) - *width=-1; - if(height) - *height=-1; - if(xpos) - *xpos=-1; - if(ypos) - *ypos=-1; - } - return(0); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_beep(void) -{ - CIOLIB_INIT(); - - if(cio_api.beep) - cio_api.beep(); - else - BEEP(440,100); - return; -} - -/* Optional */ -CIOLIBEXPORT void ciolib_getcustomcursor(int *start, int *end, int *range, int *blink, int *visible) -{ - CIOLIB_INIT(); - - if(cio_api.getcustomcursor) - cio_api.getcustomcursor(start,end,range,blink,visible); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setcustomcursor(int start, int end, int range, int blink, int visible) -{ - CIOLIB_INIT(); - - if(cio_api.setcustomcursor) - cio_api.setcustomcursor(start,end,range,blink,visible); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setvideoflags(int flags) -{ - CIOLIB_INIT(); - - if(cio_api.setvideoflags) - cio_api.setvideoflags(flags); -} - -/* Optional */ -CIOLIBEXPORT int ciolib_getvideoflags(void) -{ - CIOLIB_INIT(); - - if(cio_api.getvideoflags) - return(cio_api.getvideoflags()); - return(0); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setscaling(int new_value) -{ - CIOLIB_INIT(); - - if(cio_api.setscaling) - cio_api.setscaling(new_value); -} - -/* Optional */ -/* Returns zero on error */ -CIOLIBEXPORT int ciolib_getscaling(void) -{ - CIOLIB_INIT(); - - if(cio_api.getscaling) - return(cio_api.getscaling()); - return(1); -} - -/* Optional */ -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) -{ - CIOLIB_INIT(); - - if(cio_api.setpalette) - return(cio_api.setpalette(entry, r, g, b)); - return(0); -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg) -{ - CIOLIB_INIT(); - - if (cio_api.attr2palette) - return cio_api.attr2palette(attr, fg, bg); - /* - * TODO: If we want to be able to cross screens, we need some - * mapping for non-plaette aware things. - */ - return 0; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour) -{ - CIOLIB_INIT(); - - if (cio_api.setpixel) - return cio_api.setpixel(x, y, colour); - return 0; -} - -/* Returns NULL on failure */ -CIOLIBEXPORT struct ciolib_pixels * ciolib_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force) -{ - CIOLIB_INIT(); - - if (cio_api.getpixels) - return cio_api.getpixels(sx, sy, ex, ey, force); - return NULL; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask) -{ - CIOLIB_INIT(); - - if (cio_api.setpixels) - return cio_api.setpixels(sx, sy, ex, ey, x_off, y_off, pixels, mask); - return 0; -} - -CIOLIBEXPORT void ciolib_freepixels(struct ciolib_pixels *pixels) -{ - if (pixels == NULL) - return; - - FREE_AND_NULL(pixels->pixels); - FREE_AND_NULL(pixels->pixelsb); - FREE_AND_NULL(pixels); -} - -/* Returns NULL on failure */ -CIOLIBEXPORT struct ciolib_screen * ciolib_savescreen(void) -{ - struct ciolib_screen *ret; - int vmode; - int i; - - CIOLIB_INIT(); - - ret = malloc(sizeof(*ret)); - if (ret == NULL) - return NULL; - - ciolib_gettextinfo(&ret->text_info); - vmode = find_vmode(ret->text_info.currmode); - ret->vmem = malloc(ret->text_info.screenwidth * ret->text_info.screenheight * sizeof(struct vmem_cell)); - if (ret->vmem == NULL) { - free(ret); - return NULL; - } - - if (vmode != -1) { - ret->pixels = ciolib_getpixels(0, 0, vparams[vmode].charwidth * vparams[vmode].cols - 1, vparams[vmode].charheight * vparams[vmode].rows - 1, TRUE); - } - ciolib_vmem_gettext(1, 1, ret->text_info.screenwidth, ret->text_info.screenheight, ret->vmem); - ret->fg_colour = ciolib_fg; - ret->bg_colour = ciolib_bg; - for (i=0; i<5; i++) - ret->fonts[i] = ciolib_getfont(i); - ret->flags = ciolib_getvideoflags(); - ciolib_get_modepalette(ret->palette); - - return ret; -} - -CIOLIBEXPORT void ciolib_freescreen(struct ciolib_screen *scrn) -{ - if (scrn == NULL) - return; - - ciolib_freepixels(scrn->pixels); - FREE_AND_NULL(scrn->vmem); - free(scrn); -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_restorescreen(struct ciolib_screen *scrn) -{ - struct text_info ti; - int vmode; - int i; - - CIOLIB_INIT(); - - ciolib_gettextinfo(&ti); - - if (ti.currmode != scrn->text_info.currmode) - ciolib_textmode(scrn->text_info.currmode); - ciolib_set_modepalette(scrn->palette); - ciolib_vmem_puttext(1, 1, scrn->text_info.screenwidth, scrn->text_info.screenheight, scrn->vmem); - ciolib_textcolor(scrn->text_info.attribute); - ciolib_window(scrn->text_info.winleft, scrn->text_info.wintop, scrn->text_info.winright, scrn->text_info.winbottom); - vmode = find_vmode(scrn->text_info.currmode); - if (vmode != -1 && scrn->pixels != NULL) - ciolib_setpixels(0, 0, vparams[vmode].charwidth * vparams[vmode].cols - 1, vparams[vmode].charheight * vparams[vmode].rows - 1, 0, 0, scrn->pixels, NULL); - for (i=0; i<5; i++) - ciolib_setfont(scrn->fonts[i], FALSE, i); - ciolib_setvideoflags(scrn->flags); - ciolib_setcolour(scrn->fg_colour, scrn->bg_colour); - ciolib_gotoxy(scrn->text_info.curx, scrn->text_info.cury); - return 1; -} - -CIOLIBEXPORT void ciolib_setcolour(uint32_t fg, uint32_t bg) -{ - ciolib_fg = fg; - ciolib_bg = bg; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_get_modepalette(uint32_t p[16]) -{ - CIOLIB_INIT(); - - if (cio_api.get_modepalette) - return cio_api.get_modepalette(p); - return 0; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT int ciolib_set_modepalette(uint32_t p[16]) -{ - CIOLIB_INIT(); - - if (cio_api.set_modepalette) - return cio_api.set_modepalette(p); - return 0; -} - -/* Returns non-zero on success */ -CIOLIBEXPORT uint32_t ciolib_map_rgb(uint16_t r, uint16_t g, uint16_t b) -{ - CIOLIB_INIT(); - - if (cio_api.map_rgb) - return cio_api.map_rgb(r,g,b); - return 0; -} - -CIOLIBEXPORT void ciolib_replace_font(uint8_t id, char *name, void *data, size_t size) -{ - CIOLIB_INIT(); - - if (cio_api.replace_font) { - cio_api.replace_font(id, name, data, size); - return; - } - free(name); - free(data); -} - -CIOLIBEXPORT int ciolib_attrfont(uint8_t attr) -{ - int flags; - int font = 0; - CIOLIB_INIT(); - - flags = ciolib_getvideoflags(); - if ((flags & CIOLIB_VIDEO_ALTCHARS) && (attr & 0x08)) - font |= 1; - if ((flags & CIOLIB_VIDEO_BLINKALTCHARS) && (attr & 0x80)) - font |= 2; - return ciolib_getfont(font+1); -} - -/* Returns non-zero if fontnum is supported in this mode */ -CIOLIBEXPORT int ciolib_checkfont(int fontnum) -{ - int vmode; - struct text_info ti; - - CIOLIB_INIT(); - - if (fontnum < 0 || fontnum > 255) - return 0; - - // Font 0 is always supported. - if (fontnum == 0) - return 1; - - ciolib_gettextinfo(&ti); - vmode = find_vmode(ti.currmode); - - if (cio_api.checkfont != NULL) - return cio_api.checkfont(fontnum); - if (vmode == -1) - return 0; - - if (cio_api.options & CONIO_OPT_FONT_SELECT) { - switch (vparams[vmode].charheight) { - case 8: - if (conio_fontdata[fontnum].eight_by_eight) - return 1; - return 0; - case 14: - if (conio_fontdata[fontnum].eight_by_fourteen) - return 1; - return 0; - case 16: - if (conio_fontdata[fontnum].eight_by_sixteen) - return 1; - return 0; - default: - return 0; - } - } - return 0; - -} - -CIOLIBEXPORT void -ciolib_set_vmem(struct vmem_cell *cell, uint8_t ch, uint8_t attr, uint8_t font) -{ - CIOLIB_INIT(); - - if (cell == NULL) - return; - cell->ch = ch; - cell->font = font; - ciolib_set_vmem_attr(cell, attr); -} - -CIOLIBEXPORT void -ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr) -{ - CIOLIB_INIT(); - - if (cell == NULL) - return; - cell->legacy_attr = attr; - ciolib_attr2palette(attr, &cell->fg, &cell->bg); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setwinsize(int w, int h) -{ - CIOLIB_INIT(); - - if(cio_api.setwinsize) - cio_api.setwinsize(w, h); -} - -/* Optional */ -CIOLIBEXPORT void ciolib_setwinposition(int x, int y) -{ - CIOLIB_INIT(); - - if(cio_api.setwinposition) - cio_api.setwinposition(x, y); -} - -CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void) -{ - int font = ciolib_getfont(1); - - if (font < 0) - return CIOLIB_CP437; - if (font >= sizeof(conio_fontdata) / sizeof(conio_fontdata[0])) - return CIOLIB_CP437; - return conio_fontdata[font].cp; -} - -#if defined(__DARWIN__) -#ifdef main -#undef main -#endif - -sem_t startsdl_sem; -sem_t main_sem; -int initsdl_ret = -1; - -struct main_args { - int argc; - char **argv; - int ret; - int no_sdl; -}; - -int CIOLIB_main(int, char **); -void main_stub(void *argptr) -{ - struct main_args *args = (struct main_args *)argptr; - args->ret = CIOLIB_main(args->argc, args->argv); - args->no_sdl = 1; - sem_post(&startsdl_sem); - sem_post(&main_sem); - exit_sdl_con(); -} - -int main(int argc, char **argv) -{ - struct main_args ma = {argc, argv, -1, 0}; - sem_init(&startsdl_sem, 0, 0); - sem_init(&main_sem, 0, 0); - initsdl_ret = init_sdl_video(); - _beginthread(main_stub, 0, &ma); - if (!ma.no_sdl) { - if (initsdl_ret != -1) { - sem_wait(&startsdl_sem); - sdl_video_event_thread(NULL); - } - } - sem_wait(&main_sem); - return ma.ret; -} -#endif - -/* Returns non-zero on success */ -CIOLIBEXPORT uint32_t ciolib_mousepointer(enum ciolib_mouse_ptr type) -{ - CIOLIB_INIT(); - - if (cio_api.mousepointer) - return cio_api.mousepointer(type); - return 0; -} diff --git a/ciolib/ciolib.h b/ciolib/ciolib.h deleted file mode 100644 index ba56dfdc91700ed59eef3fc0276d44f58fc6a225..0000000000000000000000000000000000000000 --- a/ciolib/ciolib.h +++ /dev/null @@ -1,707 +0,0 @@ -/* $Id: ciolib.h,v 1.125 2020/06/27 00:04:44 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CIOLIB_H_ -#define _CIOLIB_H_ - -#include <string.h> /* size_t */ -#if defined(__DARWIN__) -#include <semwrap.h> -#endif -#include "gen_defs.h" -#include "utf8_codepages.h" - -#ifdef CIOLIBEXPORT - #undef CIOLIBEXPORT -#endif - -#ifdef _WIN32 - #if defined(CIOLIB_IMPORTS) || defined(CIOLIB_EXPORTS) - #if defined(CIOLIB_IMPORTS) - #define CIOLIBEXPORT __declspec( dllimport ) - #define CIOLIBEXPORTVAR __declspec( dllimport ) - #else - #define CIOLIBEXPORT __declspec( dllexport ) - #define CIOLIBEXPORTVAR __declspec( dllexport ) - #endif - #else /* self-contained executable */ - #define CIOLIBEXPORT - #define CIOLIBEXPORTVAR extern - #endif -#elif defined __unix__ - #define CIOLIBEXPORT - #define CIOLIBEXPORTVAR extern -#else - #define CIOLIBEXPORT - #define CIOLIBEXPORTVAR extern -#endif - -enum { - CIOLIB_MODE_AUTO - ,CIOLIB_MODE_CURSES - ,CIOLIB_MODE_CURSES_IBM - ,CIOLIB_MODE_CURSES_ASCII - ,CIOLIB_MODE_ANSI - ,CIOLIB_MODE_X - ,CIOLIB_MODE_CONIO - ,CIOLIB_MODE_CONIO_FULLSCREEN - ,CIOLIB_MODE_SDL - ,CIOLIB_MODE_SDL_FULLSCREEN -}; - -enum ciolib_mouse_ptr { - CIOLIB_MOUSEPTR_ARROW - ,CIOLIB_MOUSEPTR_BAR -}; - -#if defined(_WIN32) /* presumably, Win32 */ - - #include <io.h> /* isatty */ - -#endif - -#ifndef __COLORS -#define __COLORS - -enum { - BLACK - ,BLUE - ,GREEN - ,CYAN - ,RED - ,MAGENTA - ,BROWN - ,LIGHTGRAY - ,DARKGRAY - ,LIGHTBLUE - ,LIGHTGREEN - ,LIGHTCYAN - ,LIGHTRED - ,LIGHTMAGENTA - ,YELLOW - ,WHITE -}; - -#endif /* __COLORS */ - -#ifndef BLINK -#define BLINK 128 -#endif - -#define CIOLIB_VIDEO_ALTCHARS (1<<0) // Attribute bit 3 selects alternate char set -#define CIOLIB_VIDEO_NOBRIGHT (1<<1) // Attribute bit 3 does not increase intensity -#define CIOLIB_VIDEO_BGBRIGHT (1<<2) // Attribute bit 7 selects high intensity background, not blink -#define CIOLIB_VIDEO_BLINKALTCHARS (1<<3) // Attribute bit 7 selects alternate char set -#define CIOLIB_VIDEO_NOBLINK (1<<4) // Attribute bit 7 has no effect -#define CIOLIB_VIDEO_EXPAND (1<<5) // Use an extra blank column between characters from the font -#define CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND (1<<6) // Per VGA, when using CIOLIB_VIDEO_EXPAND, repeat the last column for chars 0xC0 - 0xDF inclusive - -enum text_modes -{ - /* DOS-compatible modes */ - - LASTMODE = -1, - BW40 = 0, - C40, - BW80, - C80, - MONO = 7, - - /* New Color modes */ - - C40X14 = 8, - C40X21, - C40X28, - C40X43, - C40X50, - C40X60, - - C80X14, - C80X21, - C80X28, - C80X30, - C80X43, - C80X50, - C80X60, - - /* New Black & White modes */ - - BW40X14, - BW40X21, - BW40X28, - BW40X43, - BW40X50, - BW40X60, - - BW80X14, - BW80X21, - BW80X28, - BW80X43, - BW80X50, - BW80X60, - - /* New Monochrome modes */ - - MONO14, /* Invalid VGA mode */ - MONO21, - MONO28, - MONO43, - MONO50, - MONO60, // 38 - - /* New modes we've added 'cause they're cool */ - - ST132X37_16_9, - ST132X52_5_4, - - /* New modes we've added 'cause they're stupid */ - VGA80X25, - - /* New modes we've added because DigitalMan bitched for DAYS! */ - LCD80X25, - - /* Cruft... */ - - C4350 = C80X50, /* this is actually "64" in the "real" conio */ - - _ORIGMODE = 65, /* original mode at program startup */ - - EGA80X25, /* 80x25 in 640x350 screen */ - C64_40X25 = 147, /* Commodore 64 40x25 colour mode */ - C128_40X25, /* Commodore 128 40x25 colour mode */ - C128_80X25, /* Commodore 128 40x25 colour mode */ - ATARI_40X24, /* Atari 800 40x24 colour text mode */ - ATARI_80X25, /* Atari 800 XEP80 80x25 mono text mode */ - - /* VESA Modes */ - VESA_132X21 = 235, - VESA_132X25 = 231, - VESA_132X28 = 228, - VESA_132X30 = 226, - VESA_132X34 = 222, - VESA_132X43 = 213, - VESA_132X50 = 206, - VESA_132X60 = 196, - - /* Custom Mode */ - CIOLIB_MODE_CUSTOM = 255, // Last mode... if it's over 255, text_info can't hold it. -}; - -#define COLOR_MODE C80 - -enum -{ - _NOCURSOR, - _SOLIDCURSOR, - _NORMALCURSOR -}; - -struct text_info { - unsigned char winleft; /* left window coordinate */ - unsigned char wintop; /* top window coordinate */ - unsigned char winright; /* right window coordinate */ - unsigned char winbottom; /* bottom window coordinate */ - unsigned char attribute; /* text attribute */ - unsigned char normattr; /* normal attribute */ - unsigned char currmode; /* current video mode: - BW40, BW80, C40, C80, or C4350 */ - unsigned char screenheight; /* text screen's height */ - unsigned char screenwidth; /* text screen's width */ - unsigned char curx; /* x-coordinate in current window */ - unsigned char cury; /* y-coordinate in current window */ -}; - -CIOLIBEXPORTVAR struct text_info cio_textinfo; -CIOLIBEXPORTVAR uint32_t ciolib_fg; -CIOLIBEXPORTVAR uint32_t ciolib_bg; - -struct mouse_event { - int event; - int bstate; - int kbsm; - int startx; - int starty; - int endx; - int endy; - int startx_res; - int starty_res; - int endx_res; - int endy_res; -}; - -struct conio_font_data_struct { - char *eight_by_sixteen; - char *eight_by_fourteen; - char *eight_by_eight; - char *desc; - enum ciolib_codepage cp; -}; - -CIOLIBEXPORTVAR struct conio_font_data_struct conio_fontdata[257]; - -struct ciolib_pixels { - uint32_t *pixels; - uint32_t *pixelsb; - uint32_t width; - uint32_t height; -}; - -struct vmem_cell { - uint8_t legacy_attr; - uint8_t ch; - uint8_t font; - uint32_t fg; // RGB 00RRGGBB High bit indicates palette colour - uint32_t bg; // RGB 00RRGGBB High bit indicates palette colour -}; - -struct ciolib_screen { - uint32_t fg_colour; - uint32_t bg_colour; - int flags; - int fonts[5]; - struct ciolib_pixels *pixels; - struct vmem_cell *vmem; - struct text_info text_info; - uint32_t palette[16]; -}; - -#define CONIO_FIRST_FREE_FONT 43 - -typedef struct { - int mode; - int mouse; - uint64_t options; -#define CONIO_OPT_LOADABLE_FONTS 1 -#define CONIO_OPT_BLINK_ALT_FONT 2 -#define CONIO_OPT_BOLD_ALT_FONT 4 -#define CONIO_OPT_BRIGHT_BACKGROUND 8 -#define CONIO_OPT_PALETTE_SETTING 16 -#define CONIO_OPT_SET_PIXEL 32 -#define CONIO_OPT_CUSTOM_CURSOR 64 -#define CONIO_OPT_FONT_SELECT 128 -#define CONIO_OPT_SET_TITLE 256 -#define CONIO_OPT_SET_NAME 512 -#define CONIO_OPT_SET_ICON 1024 -#define CONIO_OPT_EXTENDED_PALETTE 2048 -#define CONIO_OPT_BLOCKY_SCALING 4096 - void (*clreol) (void); - int (*puttext) (int,int,int,int,void *); - int (*vmem_puttext) (int,int,int,int,struct vmem_cell *); - int (*gettext) (int,int,int,int,void *); - int (*vmem_gettext) (int,int,int,int,struct vmem_cell *); - void (*textattr) (int); - int (*kbhit) (void); - void (*delay) (long); - int (*wherex) (void); - int (*wherey) (void); - int (*putch) (int); - void (*gotoxy) (int,int); - void (*clrscr) (void); - void (*gettextinfo) (struct text_info *); - void (*setcursortype)(int); - int (*getch) (void); - int (*getche) (void); - void (*beep) (void); - void (*highvideo) (void); - void (*lowvideo) (void); - void (*normvideo) (void); - void (*textmode) (int); - int (*ungetch) (int); - int (*movetext) (int,int,int,int,int,int); - char *(*cgets) (char *); - int (*cscanf) (char *,...); - char *(*getpass) (const char *); - void (*wscroll) (void); - void (*window) (int,int,int,int); - void (*delline) (void); - void (*insline) (void); - int (*cprintf) (const char *,...); - int (*cputs) (const char *); - void (*textbackground) (int); - void (*textcolor) (int); - int (*getmouse) (struct mouse_event *mevent); - int (*ungetmouse) (struct mouse_event *mevent); - int (*hidemouse) (void); - int (*showmouse) (void); - int (*mousepointer) (enum ciolib_mouse_ptr); - void (*settitle) (const char *); - void (*setname) (const char *); - void (*seticon) (const void *, unsigned long); - void (*copytext) (const char *, size_t); - char *(*getcliptext) (void); - void (*suspend) (void); - void (*resume) (void); - int (*setfont) (int font, int force, int font_num); - int (*getfont) (int font_num); - int (*loadfont) (const char *filename); - int (*get_window_info) (int* width, int* height, int* xpos, int* ypos); - void (*getcustomcursor) (int *startline, int *endline, int *range, int *blink, int *visible); - void (*setcustomcursor) (int startline, int endline, int range, int blink, int visible); - void (*setvideoflags) (int flags); - int (*getvideoflags) (void); - void (*setscaling) (int new_value); - int (*getscaling) (void); - int *escdelay; - int (*setpalette) (uint32_t entry, uint16_t r, uint16_t g, uint16_t b); - int (*attr2palette) (uint8_t attr, uint32_t *fg, uint32_t *bg); - int (*setpixel) (uint32_t x, uint32_t y, uint32_t colour); - struct ciolib_pixels *(*getpixels)(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); - int (*setpixels)(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask); - int (*get_modepalette)(uint32_t[16]); - int (*set_modepalette)(uint32_t[16]); - uint32_t (*map_rgb)(uint16_t r, uint16_t g, uint16_t b); - void (*replace_font)(uint8_t id, char *name, void *data, size_t size); - int (*checkfont)(int font_num); - void (*setwinsize) (int width, int height); - void (*setwinposition) (int x, int y); -} cioapi_t; - -CIOLIBEXPORTVAR cioapi_t cio_api; -CIOLIBEXPORTVAR int _wscroll; -CIOLIBEXPORTVAR int directvideo; -CIOLIBEXPORTVAR int hold_update; -CIOLIBEXPORTVAR int puttext_can_move; -CIOLIBEXPORTVAR int ciolib_reaper; -CIOLIBEXPORTVAR char *ciolib_appname; -CIOLIBEXPORTVAR int ciolib_initial_window_height; -CIOLIBEXPORTVAR int ciolib_initial_window_width; - -#define _conio_kbhit() kbhit() - -#ifdef __cplusplus -extern "C" { -#endif -CIOLIBEXPORT int initciolib(int mode); -CIOLIBEXPORT void suspendciolib(void); - -CIOLIBEXPORT int ciolib_movetext(int sx, int sy, int ex, int ey, int dx, int dy); -CIOLIBEXPORT char * ciolib_cgets(char *str); -CIOLIBEXPORT int ciolib_cscanf (char *format , ...); -CIOLIBEXPORT int ciolib_kbhit(void); -CIOLIBEXPORT int ciolib_getch(void); -CIOLIBEXPORT int ciolib_getche(void); -CIOLIBEXPORT int ciolib_ungetch(int ch); -CIOLIBEXPORT void ciolib_gettextinfo(struct text_info *info); -CIOLIBEXPORT int ciolib_wherex(void); -CIOLIBEXPORT int ciolib_wherey(void); -CIOLIBEXPORT void ciolib_wscroll(void); -CIOLIBEXPORT void ciolib_gotoxy(int x, int y); -CIOLIBEXPORT void ciolib_clreol(void); -CIOLIBEXPORT void ciolib_clrscr(void); -CIOLIBEXPORT int ciolib_cputs(const char *str); -CIOLIBEXPORT int ciolib_cprintf(const char *fmat, ...); -CIOLIBEXPORT void ciolib_textbackground(int colour); -CIOLIBEXPORT void ciolib_textcolor(int colour); -CIOLIBEXPORT void ciolib_highvideo(void); -CIOLIBEXPORT void ciolib_lowvideo(void); -CIOLIBEXPORT void ciolib_normvideo(void); -CIOLIBEXPORT int ciolib_puttext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_puttext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT int ciolib_gettext(int a,int b,int c,int d,void *e); -CIOLIBEXPORT int ciolib_vmem_gettext(int a,int b,int c,int d,struct vmem_cell *e); -CIOLIBEXPORT void ciolib_textattr(int a); -CIOLIBEXPORT void ciolib_delay(long a); -CIOLIBEXPORT int ciolib_putch(int a); -CIOLIBEXPORT void ciolib_setcursortype(int a); -CIOLIBEXPORT void ciolib_textmode(int mode); -CIOLIBEXPORT void ciolib_window(int sx, int sy, int ex, int ey); -CIOLIBEXPORT void ciolib_delline(void); -CIOLIBEXPORT void ciolib_insline(void); -CIOLIBEXPORT char * ciolib_getpass(const char *prompt); -CIOLIBEXPORT void ciolib_settitle(const char *title); -CIOLIBEXPORT void ciolib_setname(const char *title); -CIOLIBEXPORT void ciolib_seticon(const void *icon,unsigned long size); -CIOLIBEXPORT int ciolib_showmouse(void); -CIOLIBEXPORT int ciolib_hidemouse(void); -CIOLIBEXPORT int ciolib_mousepointeer(enum ciolib_mouse_ptr); -CIOLIBEXPORT void ciolib_copytext(const char *text, size_t buflen); -CIOLIBEXPORT char * ciolib_getcliptext(void); -CIOLIBEXPORT int ciolib_setfont(int font, int force, int font_num); -CIOLIBEXPORT int ciolib_getfont(int font_num); -CIOLIBEXPORT int ciolib_loadfont(const char *filename); -CIOLIBEXPORT int ciolib_get_window_info(int *width, int *height, int *xpos, int *ypos); -CIOLIBEXPORT void ciolib_beep(void); -CIOLIBEXPORT void ciolib_getcustomcursor(int *startline, int *endline, int *range, int *blink, int *visible); -CIOLIBEXPORT void ciolib_setcustomcursor(int startline, int endline, int range, int blink, int visible); -CIOLIBEXPORT void ciolib_setvideoflags(int flags); -CIOLIBEXPORT int ciolib_getvideoflags(void); -CIOLIBEXPORT void ciolib_setscaling(int flags); -CIOLIBEXPORT int ciolib_getscaling(void); -CIOLIBEXPORT int ciolib_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); -CIOLIBEXPORT int ciolib_attr2palette(uint8_t attr, uint32_t *fg, uint32_t *bg); -CIOLIBEXPORT int ciolib_setpixel(uint32_t x, uint32_t y, uint32_t colour); -CIOLIBEXPORT struct ciolib_pixels * ciolib_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, int force); -CIOLIBEXPORT int ciolib_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_t x_off, uint32_t y_off, struct ciolib_pixels *pixels, void *mask); -CIOLIBEXPORT void ciolib_freepixels(struct ciolib_pixels *pixels); -CIOLIBEXPORT struct ciolib_screen * ciolib_savescreen(void); -CIOLIBEXPORT void ciolib_freescreen(struct ciolib_screen *); -CIOLIBEXPORT int ciolib_restorescreen(struct ciolib_screen *scrn); -CIOLIBEXPORT void ciolib_setcolour(uint32_t fg, uint32_t bg); -CIOLIBEXPORT int ciolib_get_modepalette(uint32_t[16]); -CIOLIBEXPORT int ciolib_set_modepalette(uint32_t[16]); -CIOLIBEXPORT uint32_t ciolib_map_rgb(uint16_t r, uint16_t g, uint16_t b); -CIOLIBEXPORT void ciolib_replace_font(uint8_t id, char *name, void *data, size_t size); -CIOLIBEXPORT int ciolib_attrfont(uint8_t attr); -CIOLIBEXPORT int ciolib_checkfont(int font_num); -CIOLIBEXPORT void ciolib_set_vmem(struct vmem_cell *cell, uint8_t ch, uint8_t attr, uint8_t font); -CIOLIBEXPORT void ciolib_set_vmem_attr(struct vmem_cell *cell, uint8_t attr); -CIOLIBEXPORT void ciolib_setwinsize(int width, int height); -CIOLIBEXPORT void ciolib_setwinposition(int x, int y); -CIOLIBEXPORT enum ciolib_codepage ciolib_getcodepage(void); - -/* DoorWay specific stuff that's only applicable to ANSI mode. */ -CIOLIBEXPORT void ansi_ciolib_setdoorway(int enable); -#ifdef __cplusplus -} -#endif - -#ifndef CIOLIB_NO_MACROS - #define cscanf ciolib_cscanf - #define cprintf ciolib_cprintf - - #define movetext(a,b,c,d,e,f) ciolib_movetext(a,b,c,d,e,f) - #define cgets(a) ciolib_cgets(a) - #define kbhit() ciolib_kbhit() - #define getch() ciolib_getch() - #define getche() ciolib_getche() - #define ungetch(a) ciolib_ungetch(a) - #define gettextinfo(a) ciolib_gettextinfo(a) - #define wherex() ciolib_wherex() - #define wherey() ciolib_wherey() - #define wscroll() ciolib_wscroll() - #define gotoxy(a,b) ciolib_gotoxy(a,b) - #define clreol() ciolib_clreol() - #define clrscr() ciolib_clrscr() - #define cputs(a) ciolib_cputs(a) - #define textbackground(a) ciolib_textbackground(a) - #define textcolor(a) ciolib_textcolor(a) - #define highvideo() ciolib_highvideo() - #define lowvideo() ciolib_lowvideo() - #define normvideo() ciolib_normvideo() - #define puttext(a,b,c,d,e) ciolib_puttext(a,b,c,d,e) - #define vmem_puttext(a,b,c,d,e) ciolib_vmem_puttext(a,b,c,d,e) - #define gettext(a,b,c,d,e) ciolib_gettext(a,b,c,d,e) - #define vmem_gettext(a,b,c,d,e) ciolib_vmem_gettext(a,b,c,d,e) - #define textattr(a) ciolib_textattr(a) - #define delay(a) ciolib_delay(a) - #define putch(a) ciolib_putch(a) - #define _setcursortype(a) ciolib_setcursortype(a) - #define textmode(a) ciolib_textmode(a) - #define window(a,b,c,d) ciolib_window(a,b,c,d) - #define delline() ciolib_delline() - #define insline() ciolib_insline() - #define getpass(a) ciolib_getpass(a) - #define getmouse(a) ciolib_getmouse(a) - #define ungetmouse(a) ciolib_ungetmouse(a) - #define hidemouse() ciolib_hidemouse() - #define showmouse() ciolib_showmouse() - #define mousepointer(a) ciolib_mousepointer(a) - #define setname(a) ciolib_setname(a) - #define seticon(a,b) ciolib_seticon(a,b) - #define settitle(a) ciolib_settitle(a) - #define copytext(a,b) ciolib_copytext(a,b) - #define getcliptext() ciolib_getcliptext() - #define setfont(a,b,c) ciolib_setfont(a,b,c) - #define getfont(a) ciolib_getfont(a) - #define loadfont(a) ciolib_loadfont(a) - #define get_window_info(a,b,c,d) ciolib_get_window_info(a,b,c,d) - #define beep() ciolib_beep() - #define getcustomcursor(a,b,c,d,e) ciolib_getcustomcursor(a,b,c,d,e) - #define setcustomcursor(a,b,c,d,e) ciolib_setcustomcursor(a,b,c,d,e) - #define setvideoflags(a) ciolib_setvideoflags(a) - #define getvideoflags() ciolib_getvideoflags() - #define setscaling(a) ciolib_setscaling(a) - #define getscaling() ciolib_getscaling() - #define setpalette(e,r,g,b) ciolib_setpalette(e,r,g,b) - #define attr2palette(a,b,c) ciolib_attr2palette(a,b,c) - #define setpixel(a,b,c) ciolib_setpixel(a,b,c) - #define getpixels(a,b,c,d, e) ciolib_getpixels(a,b,c,d, e) - #define setpixels(a,b,c,d,e,f,g,h) ciolib_setpixels(a,b,c,d,e,f,g,h) - #define freepixels(a) ciolib_freepixels(a) - #define savescreen() ciolib_savescreen() - #define freescreen(a) ciolib_freescreen(a) - #define restorescreen(a) ciolib_restorescreen(a) - #define setcolour(a,b) ciolib_setcolour(a,b) - #define get_modepalette(a) ciolib_get_modepalette(a) - #define set_modepalette(a) ciolib_set_modepalette(a) - #define map_rgb(a,b,c) ciolib_map_rgb(a,b,c) - #define replace_font(a,b,c,d) ciolib_replace_font(a,b,c,d) - #define attrfont(a) ciolib_attrfont(a) - #define checkfont(a) ciolib_checkfont(a) - #define set_vmem(a, b, c, d) ciolib_set_vmem(a, b, c, d) - #define set_vmem_attr(a, b) ciolib_set_vmem_attr(a, b) - #define setwinsize(a,b) ciolib_setwinsize(a,b) - #define setwinposition(a,b) ciolib_setwinposition(a,b) - #define getcodepage() ciolib_getcodepage() -#endif - -#ifdef WITH_SDL - #include <gen_defs.h> - #include <SDL.h> - -#if defined(_WIN32) || defined(__DARWIN__) - #ifdef main - #undef main - #endif - #define main CIOLIB_main -#endif - -#if defined(__DARWIN__) - extern sem_t main_sem; - extern sem_t startsdl_sem; - extern int initsdl_ret; -#endif -#endif - -#define CIOLIB_BUTTON_1 1 -#define CIOLIB_BUTTON_2 2 -#define CIOLIB_BUTTON_3 4 -#define CIOLIB_BUTTON_4 8 -#define CIOLIB_BUTTON_5 16 - -#define CIOLIB_BUTTON(x) (1<<(x-1)) - -enum { - CIOLIB_MOUSE_MOVE /* 0 */ - ,CIOLIB_BUTTON_1_PRESS - ,CIOLIB_BUTTON_1_RELEASE - ,CIOLIB_BUTTON_1_CLICK - ,CIOLIB_BUTTON_1_DBL_CLICK - ,CIOLIB_BUTTON_1_TRPL_CLICK - ,CIOLIB_BUTTON_1_QUAD_CLICK - ,CIOLIB_BUTTON_1_DRAG_START - ,CIOLIB_BUTTON_1_DRAG_MOVE - ,CIOLIB_BUTTON_1_DRAG_END - ,CIOLIB_BUTTON_2_PRESS /* 10 */ - ,CIOLIB_BUTTON_2_RELEASE - ,CIOLIB_BUTTON_2_CLICK - ,CIOLIB_BUTTON_2_DBL_CLICK - ,CIOLIB_BUTTON_2_TRPL_CLICK - ,CIOLIB_BUTTON_2_QUAD_CLICK - ,CIOLIB_BUTTON_2_DRAG_START - ,CIOLIB_BUTTON_2_DRAG_MOVE - ,CIOLIB_BUTTON_2_DRAG_END - ,CIOLIB_BUTTON_3_PRESS - ,CIOLIB_BUTTON_3_RELEASE /* 20 */ - ,CIOLIB_BUTTON_3_CLICK - ,CIOLIB_BUTTON_3_DBL_CLICK - ,CIOLIB_BUTTON_3_TRPL_CLICK - ,CIOLIB_BUTTON_3_QUAD_CLICK - ,CIOLIB_BUTTON_3_DRAG_START - ,CIOLIB_BUTTON_3_DRAG_MOVE - ,CIOLIB_BUTTON_3_DRAG_END - ,CIOLIB_BUTTON_4_PRESS - ,CIOLIB_BUTTON_4_RELEASE - ,CIOLIB_BUTTON_4_CLICK /* 30 */ - ,CIOLIB_BUTTON_4_DBL_CLICK - ,CIOLIB_BUTTON_4_TRPL_CLICK - ,CIOLIB_BUTTON_4_QUAD_CLICK - ,CIOLIB_BUTTON_4_DRAG_START - ,CIOLIB_BUTTON_4_DRAG_MOVE - ,CIOLIB_BUTTON_4_DRAG_END - ,CIOLIB_BUTTON_5_PRESS - ,CIOLIB_BUTTON_5_RELEASE - ,CIOLIB_BUTTON_5_CLICK - ,CIOLIB_BUTTON_5_DBL_CLICK /* 40 */ - ,CIOLIB_BUTTON_5_TRPL_CLICK - ,CIOLIB_BUTTON_5_QUAD_CLICK - ,CIOLIB_BUTTON_5_DRAG_START - ,CIOLIB_BUTTON_5_DRAG_MOVE - ,CIOLIB_BUTTON_5_DRAG_END /* 45 */ -}; - -#define CIOLIB_BUTTON_PRESS(x) ((x-1)*9+1) -#define CIOLIB_BUTTON_RELEASE(x) ((x-1)*9+2) -#define CIOLIB_BUTTON_CLICK(x) ((x-1)*9+3) -#define CIOLIB_BUTTON_DBL_CLICK(x) ((x-1)*9+4) -#define CIOLIB_BUTTON_TRPL_CLICK(x) ((x-1)*9+5) -#define CIOLIB_BUTTON_QUAD_CLICK(x) ((x-1)*9+6) -#define CIOLIB_BUTTON_DRAG_START(x) ((x-1)*9+7) -#define CIOLIB_BUTTON_DRAG_MOVE(x) ((x-1)*9+8) -#define CIOLIB_BUTTON_DRAG_END(x) ((x-1)*9+9) - -#define CIOLIB_BUTTON_NUMBER(x) ((x+8)/9) - -#define CIOLIB_BUTTON_BASE(x) (x!=CIOLIB_MOUSE_MOVE?x-9*(CIOLIB_BUTTON_NUMBER(x)-1):CIOLIB_MOUSE_MOVE) - -extern int ciolib_mouse_initialized; - -#ifdef __cplusplus -extern "C" { -#endif -CIOLIBEXPORT void ciomouse_gotevent(int event, int x, int y, int x_res, int y_res); -CIOLIBEXPORT int mouse_trywait(void); -CIOLIBEXPORT int mouse_wait(void); -CIOLIBEXPORT int mouse_pending(void); -CIOLIBEXPORT int ciolib_getmouse(struct mouse_event *mevent); -CIOLIBEXPORT int ciolib_ungetmouse(struct mouse_event *mevent); -CIOLIBEXPORT void ciolib_mouse_thread(void *data); -CIOLIBEXPORT uint64_t ciomouse_setevents(uint64_t events); -CIOLIBEXPORT uint64_t ciomouse_addevents(uint64_t events); -CIOLIBEXPORT uint64_t ciomouse_delevents(uint64_t events); -CIOLIBEXPORT uint64_t ciomouse_addevent(uint64_t event); -CIOLIBEXPORT uint64_t ciomouse_delevent(uint64_t event); -CIOLIBEXPORT uint32_t ciolib_mousepointer(enum ciolib_mouse_ptr type); -CIOLIBEXPORT void mousestate(int *x, int *y, uint8_t *buttons); -CIOLIBEXPORT void mousestate_res(int *x_res, int *y_res, uint8_t *buttons); -#ifdef __cplusplus -} -#endif - -#define CIO_KEY_HOME (0x47 << 8) -#define CIO_KEY_UP (0x48 << 8) -#define CIO_KEY_END (0x4f << 8) -#define CIO_KEY_DOWN (0x50 << 8) -#define CIO_KEY_F(x) ((x<11)?((0x3a+x) << 8):((0x7a+x) << 8)) -#define CIO_KEY_IC (0x52 << 8) -#define CIO_KEY_DC (0x53 << 8) -#define CIO_KEY_SHIFT_IC (0x05 << 8) /* Shift-Insert */ -#define CIO_KEY_SHIFT_DC (0x07 << 8) /* Shift-Delete */ -#define CIO_KEY_CTRL_IC (0x04 << 8) /* Ctrl-Insert */ -#define CIO_KEY_CTRL_DC (0x06 << 8) /* Ctrl-Delete */ -#define CIO_KEY_ALT_IC (0xA2 << 8) /* Alt-Insert */ -#define CIO_KEY_ALT_DC (0xA3 << 8) /* Alt-Delete */ -#define CIO_KEY_LEFT (0x4b << 8) -#define CIO_KEY_RIGHT (0x4d << 8) -#define CIO_KEY_PPAGE (0x49 << 8) -#define CIO_KEY_NPAGE (0x51 << 8) -#define CIO_KEY_SHIFT_F(x)((x<11)?((0x53 + x) << 8):((0x7c + x) << 8)) -#define CIO_KEY_CTRL_F(x) ((x<11)?((0x5d + x) << 8):((0x7e + x) << 8)) -#define CIO_KEY_ALT_F(x) ((x<11)?((0x67 + x) << 8):((0x80 + x) << 8)) -#define CIO_KEY_BACKTAB (0x0f << 8) - -#define CIO_KEY_MOUSE 0x7dE0 // This is the right mouse on Schneider/Amstrad PC1512 PC keyboards "F-14" -#define CIO_KEY_QUIT 0x7eE0 // "F-15" -#define CIO_KEY_ABORTED 0x01E0 // ESC key by scancode - -#endif /* Do not add anything after this line */ diff --git a/ciolib/ciolib.rc b/ciolib/ciolib.rc deleted file mode 100644 index 015d875df543bddcd979457d63b60d926948f980..0000000000000000000000000000000000000000 --- a/ciolib/ciolib.rc +++ /dev/null @@ -1,5 +0,0 @@ -/* ========================================================================= */ -/* Icons. */ -/* ========================================================================= */ - -1 ICON "syncicon64.ico" diff --git a/ciolib/conv2vid.pl b/ciolib/conv2vid.pl deleted file mode 100755 index abe75550edcc6d1c6b4d80e969e5cc9c5f4b82cc..0000000000000000000000000000000000000000 --- a/ciolib/conv2vid.pl +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/perl - -use MIME::Decoder; - -my @fontfiles=glob("/usr/share/syscons/fonts/*.fnt"); -$decoder = new MIME::Decoder 'x-uuencode' or die "unsupported"; - -my $fonts=0; - -open COUT, "> allfonts.c"; -print COUT "#include <stdio.h> /* NULL */\n\n"; -print COUT "#include \"allfonts.h\"\n\n"; -my $started; -my %fontdata; -foreach my $fontfile (@fontfiles) { - my $width,$height; - my $decoded=`uudecode -o /dev/stdout $fontfile`; - my $bytes=length($decoded); - my $fname=$fontfile; - $fname =~ s/\.fnt$//; - $fname =~ s/^.*\///; - $fname =~ s/-/_/g; - if($fname =~ /([0-9]+)x([0-9]+)/) { - $width=$1; - $height=$2; - } - - my $lines=0; - $started=0; - $fontdata{$fname}="\""; - while(length($decoded)) { - my $ch=substr($decoded,0,1); - $decoded=substr($decoded,1); - $fontdata{$fname}.='\x'.unpack("H2",$ch); - $lines++; - if($height && !($lines % $height)) { - if(length($decoded)) { - $fontdata{$fname}.="\"\n\t\t\""; - } - } - } - $fontdata{$fname}.="\"\n\t"; - $fonts++; -} - -open IN, "< /usr/share/syscons/fonts/INDEX.fonts"; -my %fonts; -my %fontsizes; -while (<IN>) { - next if(/^\s*#/); - chomp; - my ($filename, $lang, $desc) = split(/:/); - next unless ($lang eq 'en'); - next if ($filename !~ /\.fnt$/); - $filename =~ s/\..*?$//; - $filename =~ s/-/_/g; - $filename =~ s/_(8x[0-9]*)$//; - if($1 eq '8x16') { - $fontsizes{$filename} |=1; - } - elsif($1 eq '8x14') { - $fontsizes{$filename} |=2; - } - elsif($1 eq '8x8') { - $fontsizes{$filename} |=4; - } - else { - print STDERR "Unknown font size: $1\n"; - } - $desc =~ s/"/\\"/g; - $desc =~ s/\s+8x[0-9]*//g; - $desc =~ s/,\s*$//g; - $fonts{$filename}=$desc; -} -close IN; -my $arraysize=(scalar keys %fonts)+1; -print COUT "struct conio_font_data_struct conio_fontdata[".$arraysize."] = {\n"; -$started=0; -foreach my $font (keys %fonts) { - if($started) { - print COUT "\t,{"; - } - else { - print COUT "\t {"; - $started=1; - } - if($fontsizes{$font} & 1) { - print COUT $fontdata{"$font\_8x16"}; - print COUT ", "; - } - else { - print COUT "NULL, "; - } - if($fontsizes{$font} & 2) { - print COUT $fontdata{"$font\_8x14"}; - print COUT ", "; - } - else { - print COUT "NULL, "; - } - if($fontsizes{$font} & 4) { - print COUT $fontdata{"$font\_8x8"}; - print COUT ", "; - } - else { - print COUT "NULL, "; - } - print COUT "\"$fonts{$font}\"}\n"; -} -print COUT "\t,{NULL, NULL, NULL, NULL}\n"; -print COUT "};\n"; - -close COUT; - -open HOUT,"> allfonts.h"; -print HOUT <<ENDOFHEADER; -#ifndef _ALLFONTS_H_ -#define _ALLFONTS_H_ - -struct conio_font_data_struct { - char *eight_by_sixteen; - char *eight_by_fourteen; - char *eight_by_eight; - char *desc; -}; - -extern struct conio_font_data_struct conio_fontdata[$arraysize]; - -#endif -ENDOFHEADER diff --git a/ciolib/cterm.c b/ciolib/cterm.c deleted file mode 100644 index 66b778215a49f73ba2c98c1bbbad5ae5658c5db1..0000000000000000000000000000000000000000 --- a/ciolib/cterm.c +++ /dev/null @@ -1,5609 +0,0 @@ -/* $Id: cterm.c,v 1.313 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* - * Coordinate systems in use here... text is 1-based. - * "pixel" the ciolib screen in pixels. sixel commands happen here. - * "screen" the ciolib screen... gettext/puttext/movetext and mouse - * are in this space. - * "absterm" position inside the full terminal area. These coordinates - * are used when origin mode is off. - * "term" The scrolling region. These coordinates are used when origin - * mode is on. - * "curr" Either absterm or term depending on the state of origin mode - * This is what's sent to and received from the remote, and - * matches the CTerm window. - */ - -#include <ctype.h> -#include <stdlib.h> -#include <string.h> -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ - #include <xpprintf.h> /* asprintf() on Win32 */ -#endif - -#include <genwrap.h> -#include <xpbeep.h> -#include <link_list.h> -#ifdef __unix__ - #include <xpsem.h> -#endif -#include <threadwrap.h> -#if !(defined __BORLANDC__ || defined _MSC_VER) - #include <stdbool.h> -#else - #define bool int - enum { false, true }; -#endif - - -#include "ciolib.h" - -#include "cterm.h" -#include "vidmodes.h" -#include "base64.h" -#include <crc16.h> - -#define BUFSIZE 2048 - -const int cterm_tabs[]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145}; - -const char *octave="C#D#EF#G#A#B"; - -/* Characters allowed in music strings... if one that is NOT in here is - * found, CTerm leaves music capture mode and tosses the buffer away */ -const char *musicchars="aAbBcCdDeEfFgGlLmMnNoOpPsStT0123456789.-+#<> "; -const uint note_frequency[]={ /* Hz*1000 */ -/* Octave 0 (Note 1) */ - 65406 - ,69296 - ,73416 - ,77782 - ,82407 - ,87307 - ,92499 - ,97999 - ,103820 - ,110000 - ,116540 - ,123470 -/* Octave 1 */ - ,130810 - ,138590 - ,146830 - ,155560 - ,164810 - ,174610 - ,185000 - ,196000 - ,207650 - ,220000 - ,233080 - ,246940 -/* Octave 2 */ - ,261620 - ,277180 - ,293660 - ,311130 - ,329630 - ,349230 - ,369990 - ,392000 - ,415300 - ,440000 - ,466160 - ,493880 -/* Octave 3 */ - ,523250 - ,554370 - ,587330 - ,622250 - ,659260 - ,698460 - ,739990 - ,783990 - ,830610 - ,880000 - ,932330 - ,987770 -/* Octave 4 */ - ,1046500 - ,1108700 - ,1174700 - ,1244500 - ,1318500 - ,1396900 - ,1480000 - ,1568000 - ,1661200 - ,1760000 - ,1864600 - ,1975500 -/* Octave 5 */ - ,2093000 - ,2217500 - ,2349300 - ,2489000 - ,2637000 - ,2793800 - ,2959900 - ,3136000 - ,3322400 - ,3520000 - ,3729300 - ,3951100 -/* Octave 6 */ - ,4186000 - ,4435000 - ,4698600 - ,4978000 - ,5274000 - ,5587000 - ,5920000 - ,6272000 - ,6644000 - ,7040000 - ,7458600 - ,7902200 -}; - -struct note_params { - int notenum; - int notelen; - int dotted; - int tempo; - int noteshape; - int foreground; -}; - -#ifdef CTERM_WITHOUT_CONIO - #define GOTOXY(x,y) cterm->ciolib_gotoxy(cterm, x, y) - #define WHEREX() cterm->ciolib_wherex(cterm) - #define WHEREY() cterm->ciolib_wherey(cterm) - #define GETTEXT(a,b,c,d,e) cterm->ciolib_gettext(cterm, a,b,c,d,e) - #define GETTEXTINFO(a) cterm->ciolib_gettextinfo(cterm,a) - #define TEXTATTR(a) cterm->ciolib_textattr(cterm,a) - #define SETCURSORTYPE(a) cterm->ciolib_setcursortype(cterm,a) - #define MOVETEXT(a,b,c,d,e,f) cterm->ciolib_movetext(cterm,a,b,c,d,e,f) - #define CLREOL() cterm->ciolib_clreol(cterm) - #define CLRSCR() cterm->ciolib_clrscr(cterm) - #define SETVIDEOFLAGS(a) cterm->ciolib_setvideoflags(cterm,a) - #define GETVIDEOFLAGS() cterm->ciolib_getvideoflags(cterm) - #define PUTCH(a) cterm->ciolib_putch(cterm,a) - #define PUTTEXT(a,b,c,d,e) cterm->ciolib_puttext(cterm,a,b,c,d,e) - #define WINDOW(a,b,c,d) cterm->ciolib_window(cterm,a,b,c,d) - #define CPUTS(a) cterm->ciolib_cputs(cterm,a) - #define SETFONT(a,b,c) cterm->ciolib_setfont(cterm,a,b,c) -#else - #define GOTOXY(x,y) cterm->ciolib_gotoxy(x, y) - #define WHEREX() cterm->ciolib_wherex() - #define WHEREY() cterm->ciolib_wherey() - #define GETTEXT(a,b,c,d,e) cterm->ciolib_gettext(a,b,c,d,e) - #define GETTEXTINFO(a) cterm->ciolib_gettextinfo(a) - #define TEXTATTR(a) cterm->ciolib_textattr(a) - #define SETCURSORTYPE(a) cterm->ciolib_setcursortype(a) - #define MOVETEXT(a,b,c,d,e,f) cterm->ciolib_movetext(a,b,c,d,e,f) - #define CLREOL() cterm->ciolib_clreol() - #define CLRSCR() cterm->ciolib_clrscr() - #define SETVIDEOFLAGS(a) cterm->ciolib_setvideoflags(a) - #define GETVIDEOFLAGS() cterm->ciolib_getvideoflags() - #define PUTCH(a) cterm->ciolib_putch(a) - #define PUTTEXT(a,b,c,d,e) cterm->ciolib_puttext(a,b,c,d,e) - #define WINDOW(a,b,c,d) cterm->ciolib_window(a,b,c,d) - #define CPUTS(a) cterm->ciolib_cputs(a) - #define SETFONT(a,b,c) cterm->ciolib_setfont(a,b,c) -#endif - -static void ctputs(struct cterminal *cterm, char *buf); -static void cterm_reset(struct cterminal *cterm); - -#ifdef CTERM_WITHOUT_CONIO -/***************************************************************/ -/* These funcions are used when conio is not */ -/* They are mostly copied from either ciolib.c or bitmap_con.c */ -/***************************************************************/ -#define BD ((struct buffer_data *)cterm->extra) -#define CTERM_INIT() while(BD==NULL) ciolib_init(cterm) - -struct buffer_data { - unsigned char x; - unsigned char y; - unsigned char winleft; /* left window coordinate */ - unsigned char wintop; /* top window coordinate */ - unsigned char winright; /* right window coordinate */ - unsigned char winbottom; /* bottom window coordinate */ - unsigned char attr; /* text attribute */ - unsigned char currmode; /* current video mode */ - unsigned char cursor; - unsigned char *vmem; - int vflags; -}; - -static void ciolib_init(struct cterminal *cterm) -{ - BD=malloc(sizeof(struct buffer_data)); - if(!BD) - return - BD->x=1; - BD->y=1; - BD->winleft=1; - BD->wintop=1; - BD->winright=cterm->width; - BD->winbottom=cterm->height; - BD->attr=7; - BD->currmode=C80; // TODO: Adjust based on size... - BD->cursor=_NORMALCURSOR; - BD->vmem=malloc(2*cterm->height*cterm->width); - if(BD->vmem==NULL) { - free(BD) - return; - } - BD->vflags=0; -} - -static void ciolib_gotoxy(struct cterminal *cterm,int x,int y) -{ - CTERM_INIT(); - - if(x < 1 - || x > BD->winright-BD->winleft+1 - || y < 1 - || y > BD->winbottom-BD->wintop+1) - return; - - BD->x=x; - BD->y=y; -} - -static int ciolib_wherex(struct cterminal *cterm) -{ - CTERM_INIT(); - return BD->x -} - -static int ciolib_wherey(struct cterminal *cterm) -{ - CTERM_INIT(); - return BD->y -} - -static int ciolib_gettext(struct cterminal *cterm,int sx, int sy, int ex, int ey, void *fill) -{ - int x,y; - unsigned char *out; - WORD sch; - - CTERM_INIT(); - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ex - || sy > ey - || ex > cterm->width - || ey > cterm->height - || fill==NULL) - return(0); - - out=fill; - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - sch=BD->vmem[y*cio_textinfo.screenwidth+x]; - *(out++)=sch & 0xff; - *(out++)=sch >> 8; - } - } - return(1); -} - -static void ciolib_gettextinfo(struct cterminal *cterm,struct text_info *ti) -{ - CTERM_INIT(); - ti->winleft=>BD->winleft; - ti->wintop=BD->wintop; - ti->winright=BD->winright; - ti->winbottom=BD->winbottom; - ti->attribute=BD->attr; - ti->normattr=7; - ti->currmode=BD->currmode; - if (cterm->height > 0xff) - ti->screenheight = 0xff; - else - ti->screenheight = cterm->height; - if (cterm->width > 0xff) - ti->screenwidth = 0xff; - else - ti->screenwidth = cterm->width; - ti->curx=BD->x; - ti->cury=BD->y; -} - -static void ciolib_textattr(struct cterminal *cterm,int attr) -{ - CTERM_INIT(); - BD->attr=attr; -} - -static void ciolib_setcursortype(struct cterminal *cterm,int cursor) -{ - CTERM_INIT(); - BD->cursor=cursor; -} - -static int ciolib_movetext(struct cterminal *cterm, int x, int y, int ex, int ey, int tox, int toy) -{ - int direction=1; - int cy; - int sy; - int destoffset; - int sourcepos; - int width=ex-x+1; - int height=ey-y+1; - - CTERM_INIT(); - if( x<1 - || y<1 - || ex<1 - || ey<1 - || tox<1 - || toy<1 - || x>cterm->width - || ex>cterm->width - || tox>cterm->width - || y>cterm->height - || ey>cterm->height - || toy>cterm->height) - return(0); - - if(toy > y) - direction=-1; - - sourcepos=(y-1)*cterm->width+(x-1); - destoffset=(((toy-1)*cterm->width+(tox-1))-sourcepos); - - for(cy=(direction==-1?(height-1):0); cy<height && cy>=0; cy+=direction) { - sourcepos=((y-1)+cy)*cio_textinfo.screenwidth+(x-1); - memmove(&(BD->vmem[sourcepos+destoffset]), &(BD->vmem[sourcepos]), sizeof(BD->vmem[0])*width); - } - return(1); -} - -static void conio_clreol(struct cterminal *cterm) -{ - int pos,x; - WORD fill=(BD->attr<<8)|space; - - CTERM_INIT(); - pos=(BD->y+BD->wintop-2)*cterm->width; - for(x=BD->x+BD->winleft-2; x<BD->right; x++) - BD->vmem[pos+x]=fill; -} - -static void ciolib_clrscr(struct cterminal *cterm) -{ - int x,y; - WORD fill=(BD->attr<<8)|space; - - CTERM_INIT(); - for(y=cio_textinfo.wintop-1; y<cio_textinfo.winbottom; y++) { - for(x=BD->winleft-1; x<BD->winright; x++) - BD->vmem[y*cterm->width+x]=fill; - } -} - -static void ciolib_setvideoflags(struct cterminal *cterm, int flags) -{ - CTERM_INIT(); - BD->vflags=flags; -} - -static int ciolib_getvideoflags(struct cterminal *cterm) -{ - CTERM_INIT(); - return BD->vflags; -} - -static void ciolib_wscroll(struct cterminal *cterm) -{ - int os; - - CTERM_INIT(); - MOVETEXT(BD->winleft - ,BD->wintop+1 - ,BD->winright - ,BD->winbottom - ,BD->winleft - ,BD->wintop); - GOTOXY(cterm, 1,BD->winbottom-BD->wintop+1); - os=_wscroll; - _wscroll=0; - CLREOL(cterm); - _wscroll=os; - GOTOXY(cterm, BD->x,BD->y); -} - -static int ciolib_putch(struct cterminal *cterm,int a) -{ - unsigned char a1=a; - unsigned char buf[2]; - int i; - - CTERM_INIT(); - buf[0]=a1; - buf[1]=BD->attr; - - switch(a1) { - case '\r': - GOTOXY(1,cio_textinfo.cury); - break; - case '\n': - if(BD->y==BD->winbottom-BD->wintop+1) - ciolib_wscroll(cterm); - else - GOTOXY(BD->x, BD->y+1); - break; - case '\b': - if(BD->x>1) { - GOTOXY(BD->x-1,BD->y); - buf[0]=' '; - PUTTEXT(BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,buf); - } - break; - case 7: /* Bell */ - break; - case '\t': - for(i = 0; i < cterm->tab_count;i++) { - if(cterm->tabs[i] > BD->x) { - buf[0]=' '; - while(BD->x < cterm->tabs[i]) { - PUTTEXT(BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,BD->x+BD->winleft-1 - ,BD->y+BD->wintop-1 - ,buf); - GOTOXY(BD->x+1,BD->y); - if(BD->x==cterm->width) - break; - } - break; - } - } - if(BD->x==cterm->width) { - GOTOXY(1,BD->y); - if(BD->y==BD->winbottom-BD->wintop+1) - ciolib_wscroll(cterm); - else - GOTOXY(BD->x, BD->y+1); - } - break; - default: - if(BD->y==BD->winbottom-BD->wintop+1 - && BD->x==BD->winright-BD->winleft+1) { - PUTTEXT(WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,buf); - ciolib_wscroll(cterm); - GOTOXY(1, BD->winbottom-BD->wintop+1); - } - else { - if(BD->x==BD->winright-BD->winleft+1) { - PUTTEXT(WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,buf); - GOTOXY(1,BD->y+1); - } - else { - PUTTEXT(WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,WHEREX()+BD->winleft-1 - ,WHEREY()+BD->wintop-1 - ,buf); - GOTOXY(BD->x+1, BD->y); - } - } - break; - } - - return(a1); -} - -static int ciolib_puttext(struct cterminal *cterm,int sx, int sy, int ex, int ey, void *fill) -{ - int x,y; - unsigned char *out; - WORD sch; - - CTERM_INIT(); - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cterm->width - || sy > cterm->height - || sx > ex - || sy > ey - || ex > cterm->width - || ey > cterm->height - || fill==NULL) - return(0); - - out=fill; - for(y=sy-1;y<ey;y++) { - for(x=sx-1;x<ex;x++) { - sch=*(out++); - sch |= (*(out++))<<8; - BD->vmem[y*cterm->width+x]=sch; - } - } - return(1); -} - -static void ciolib_window(struct cterminal *cterm,int sx, int sy, int ex, int ey) -{ - CTERM_INIT(); - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cterm->width - || sy > cterm->height - || sx > ex - || sy > ey - || ex > cterm->width - || ey > cterm->height) - return; - BD->winleft=sx; - BD->wintop=sy; - BD->winright=ex; - BD->winbottom=ey; - GOTOXY(1,1); -} - -static int ciolib_cputs(struct cterminal *cterm, const char *str) -{ - int pos; - int ret=0; - int olddmc; - - CTERM_INIT(); - for(pos=0;str[pos];pos++) - { - ret=str[pos]; - if(str[pos]=='\n') - PUTCH('\r'); - PUTCH(str[pos]); - } - GOTOXY(WHEREX(),WHEREY()); - return(ret); -} - -static int ciolib_setfont(struct cterminal *,int font, int force, int font_num) -{ - CTERM_INIT(); - return -1; -} -#endif - -enum cterm_coordinates { - CTERM_COORD_SCREEN, - CTERM_COORD_ABSTERM, - CTERM_COORD_TERM, - CTERM_COORD_CURR, -}; - -#define SCR_MINX 1 -#define ABS_MINX 1 -#define TERM_MINX 1 -#define CURR_MINX 1 - -#if 0 -static int -scr_maxx(struct cterminal *cterm) -{ - struct text_info ti; - - GETTEXTINFO(&ti); - return ti.screenwidth; -} -#endif -//#define SCR_MAXX coord_maxx(cterm, CTERM_COORD_SCREEN) -#define ABS_MAXX cterm->width -#define TERM_MAXX (cterm->right_margin - cterm->left_margin + 1) -#define CURR_MAXX ((cterm->extattr & CTERM_EXTATTR_ORIGINMODE) ? TERM_MAXX : ABS_MAXX) - -#define SCR_MINY 1 -#define ABS_MINY 1 -#define TERM_MINY 1 -#define CURR_MINY 1 - - -#if 0 -static int -scr_maxy(struct cterminal *cterm, enum cterm_coordinates coord) -{ - struct text_info ti; - - GETTEXTINFO(&ti); - return ti.screenheight; -} -#endif -//#define SCR_MAXY scr_maxy(cterm) -#define ABS_MAXY cterm->height -#define TERM_MAXY (cterm->bottom_margin - cterm->top_margin + 1) -#define CURR_MAXY ((cterm->extattr & CTERM_EXTATTR_ORIGINMODE) ? TERM_MAXY : ABS_MAXY) - -static void -coord_conv_xy(struct cterminal *cterm, enum cterm_coordinates from_coord, - enum cterm_coordinates to_coord, int *x, int *y) -{ - if (from_coord == to_coord) - return; - - if (x) { - if (from_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - from_coord = CTERM_COORD_TERM; - else - from_coord = CTERM_COORD_ABSTERM; - } - switch(from_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *x += cterm->left_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *x += cterm->x - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - if (to_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - to_coord = CTERM_COORD_TERM; - else - to_coord = CTERM_COORD_ABSTERM; - } - switch(to_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *x -= cterm->left_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *x -= cterm->x - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - } - if (y) { - if (from_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - from_coord = CTERM_COORD_TERM; - else - from_coord = CTERM_COORD_ABSTERM; - } - switch(from_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *y += cterm->top_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *y += cterm->y - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - if (to_coord == CTERM_COORD_CURR) { - if (cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - to_coord = CTERM_COORD_TERM; - else - to_coord = CTERM_COORD_ABSTERM; - } - switch(to_coord) { - case CTERM_COORD_SCREEN: - break; - case CTERM_COORD_TERM: - *y -= cterm->top_margin - 1; - // Fall-through - case CTERM_COORD_ABSTERM: - *y -= cterm->y - 1; - break; - case CTERM_COORD_CURR: - // Silence warnings - break; - } - } -} - -static void -coord_get_xy(struct cterminal *cterm, enum cterm_coordinates coord, int *x, int *y) -{ - if (x) - *x = WHEREX(); - if (y) - *y = WHEREY(); - - coord_conv_xy(cterm, CTERM_COORD_CURR, coord, x, y); -} -#define SCR_XY(x,y) coord_get_xy(cterm, CTERM_COORD_SCREEN, x, y) -#define ABS_XY(x,y) coord_get_xy(cterm, CTERM_COORD_ABSTERM, x, y) -#define TERM_XY(x,y) coord_get_xy(cterm, CTERM_COORD_TERM, x, y) -#define CURR_XY(x,y) coord_get_xy(cterm, CTERM_COORD_CURR, x, y) -void -setwindow(struct cterminal *cterm) -{ - int col, row, max_col, max_row; - - col = CURR_MINX; - row = CURR_MINY; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &col, &row); - max_col = CURR_MAXX; - max_row = CURR_MAXY; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &max_col, &max_row); - WINDOW(col, row, max_col, max_row); -} - -void -cterm_gotoxy(struct cterminal *cterm, int x, int y) -{ - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &x, &y); - GOTOXY(x, y); - ABS_XY(&cterm->xpos, &cterm->ypos); -} - -static void -insert_tabstop(struct cterminal *cterm, int pos) -{ - int i; - int *new_stops; - - for (i = 0; i < cterm->tab_count && cterm->tabs[i] < pos; i++); - if (cterm->tabs[i] == pos) - return; - - new_stops = realloc(cterm->tabs, (cterm->tab_count + 1) * sizeof(cterm->tabs[0])); - if (new_stops == NULL) - return; - cterm->tabs = new_stops; - if (i < cterm->tab_count) - memmove(&cterm->tabs[i + 1], &cterm->tabs[i], (cterm->tab_count - i) * sizeof(cterm->tabs[0])); - cterm->tabs[i] = pos; - cterm->tab_count++; -} - -static void -delete_tabstop(struct cterminal *cterm, int pos) -{ - int i; - - for (i = 0; i < cterm->tab_count && cterm->tabs[i] <= pos; i++) { - if (cterm->tabs[i] == pos) { - memmove(&cterm->tabs[i], &cterm->tabs[i+1], (cterm->tab_count - i - 1) * sizeof(cterm->tabs[0])); - cterm->tab_count--; - return; - } - } - return; -} - -static void tone_or_beep(double freq, int duration, int device_open) -{ - if(device_open) - xptone(freq,duration,WAVE_SHAPE_SINE_SAW_HARM); - else - xpbeep(freq,duration); -} - -static void playnote_thread(void *args) -{ - /* Tempo is quarter notes per minute */ - int duration; - int pauselen; - struct note_params *note; - int device_open=FALSE; - struct cterminal *cterm=(struct cterminal *)args; - - - SetThreadName("PlayNote"); - cterm->playnote_thread_running=TRUE; - while(1) { - if(device_open) { - if(!listSemTryWaitBlock(&cterm->notes,5000)) { - xptone_close(); - listSemWait(&cterm->notes); - } - } - else - listSemWait(&cterm->notes); - note=listShiftNode(&cterm->notes); - if(note==NULL) - break; - device_open=xptone_open(); - if(note->dotted) - duration=360000/note->tempo; - else - duration=240000/note->tempo; - duration/=note->notelen; - switch(note->noteshape) { - case CTERM_MUSIC_STACATTO: - pauselen=duration/4; - break; - case CTERM_MUSIC_LEGATO: - pauselen=0; - break; - case CTERM_MUSIC_NORMAL: - default: - pauselen=duration/8; - break; - } - duration-=pauselen; - if(note->notenum < 72 && note->notenum >= 0) - tone_or_beep(((double)note_frequency[note->notenum])/1000,duration,device_open); - else - tone_or_beep(0,duration,device_open); - if(pauselen) - tone_or_beep(0,pauselen,device_open); - if(note->foreground) - sem_post(&cterm->note_completed_sem); - free(note); - } - if (device_open) - xptone_close(); - sem_post(&cterm->playnote_thread_terminated); - cterm->playnote_thread_running=FALSE; -} - -static void play_music(struct cterminal *cterm) -{ - int i; - char *p; - char *out; - int offset; - char note; - int notelen; - char numbuf[10]; - int dotted; - int notenum; - struct note_params *np; - int fore_count; - - if(cterm->quiet) { - cterm->music=0; - cterm->musicbuf[0]=0; - return; - } - p=cterm->musicbuf; - fore_count=0; - if(cterm->music==1) { - switch(toupper(*p)) { - case 'F': - cterm->musicfore=TRUE; - p++; - break; - case 'B': - cterm->musicfore=FALSE; - p++; - break; - case 'N': - if(!isdigit(*(p+1))) { - cterm->noteshape=CTERM_MUSIC_NORMAL; - p++; - } - break; - case 'L': - cterm->noteshape=CTERM_MUSIC_LEGATO; - p++; - break; - case 'S': - cterm->noteshape=CTERM_MUSIC_STACATTO; - p++; - break; - } - } - for(;*p;p++) { - notenum=0; - offset=0; - switch(toupper(*p)) { - case 'M': - p++; - switch(toupper(*p)) { - case 'F': - cterm->musicfore=TRUE; - break; - case 'B': - cterm->musicfore=FALSE; - break; - case 'N': - cterm->noteshape=CTERM_MUSIC_NORMAL; - break; - case 'L': - cterm->noteshape=CTERM_MUSIC_LEGATO; - break; - case 'S': - cterm->noteshape=CTERM_MUSIC_STACATTO; - break; - default: - p--; - } - break; - case 'T': /* Tempo */ - out=numbuf; - while(isdigit(*(p+1))) - *(out++)=*(++p); - *out=0; - cterm->tempo=strtoul(numbuf,NULL,10); - if(cterm->tempo>255) - cterm->tempo=255; - if(cterm->tempo<32) - cterm->tempo=32; - break; - case 'O': /* Octave */ - out=numbuf; - while(isdigit(*(p+1))) - *(out++)=*(++p); - *out=0; - cterm->octave=strtoul(numbuf,NULL,10); - if(cterm->octave>6) - cterm->octave=6; - break; - case 'L': - out=numbuf; - while(isdigit(*(p+1))) - *(out++)=*(++p); - *out=0; - cterm->notelen=strtoul(numbuf,NULL,10); - if(cterm->notelen<1) - cterm->notelen=1; - if(cterm->notelen>64) - cterm->notelen=64; - break; - case 'N': /* Note by number */ - if(isdigit(*(p+1))) { - out=numbuf; - while(isdigit(*(p+1))) { - *(out++)=*(p+1); - p++; - } - *out=0; - notenum=strtoul(numbuf,NULL,10); - } - if(notenum==0) { - notenum=-1; - offset=1; - } - /* Fall-through */ - case 'A': /* Notes in current octave by letter */ - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'P': - note=toupper(*p); - notelen=cterm->notelen; - dotted=0; - i=1; - while(i) { - i=0; - if(*(p+1)=='+' || *(p+1)=='#') { /* SHARP */ - offset+=1; - p++; - i=1; - } - if(*(p+1)=='-') { /* FLAT */ - offset-=1; - p++; - i=1; - } - if(*(p+1)=='.') { /* Dotted note (1.5*notelen) */ - dotted=1; - p++; - i=1; - } - if(isdigit(*(p+1))) { - out=numbuf; - while(isdigit(*(p+1))) { - *(out++)=*(p+1); - p++; - } - *out=0; - notelen=strtoul(numbuf,NULL,10); - i=1; - } - } - if(note=='P') { - notenum=-1; - offset=0; - } - if(notenum==0) { - out=strchr(octave,note); - if(out==NULL) { - notenum=-1; - offset=1; - } - else { - notenum=cterm->octave*12+1; - notenum+=(out-octave); - } - } - notenum+=offset; - np=(struct note_params *)malloc(sizeof(struct note_params)); - if(np!=NULL) { - np->notenum=notenum; - np->notelen=notelen; - np->dotted=dotted; - np->tempo=cterm->tempo; - np->noteshape=cterm->noteshape; - np->foreground=cterm->musicfore; - listPushNode(&cterm->notes, np); - if(cterm->musicfore) - fore_count++; - } - break; - case '<': /* Down one octave */ - cterm->octave--; - if(cterm->octave<0) - cterm->octave=0; - break; - case '>': /* Up one octave */ - cterm->octave++; - if(cterm->octave>6) - cterm->octave=6; - break; - } - } - cterm->music=0; - cterm->musicbuf[0]=0; - while(fore_count) { - sem_wait(&cterm->note_completed_sem); - fore_count--; - } - xptone_complete(); -} - -void -cterm_clreol(struct cterminal *cterm) -{ - int x, y; - int rm; - struct vmem_cell *buf; - int i; - int width; - - CURR_XY(&x, &y); - rm = CURR_MAXX; - - width = rm - x + 1; - if (width < 1) - return; - buf = malloc(width * sizeof(*buf)); - if (!buf) - return; - for (i = 0; i < width; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); - } - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &x, &y); - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &rm, NULL); - vmem_puttext(x, y, rm, y, buf); - free(buf); -} - -void -cterm_clrblk(struct cterminal *cterm, int sx, int sy, int ex, int ey) -{ - int i; - struct vmem_cell *buf; - int chars = (ex - sx + 1) * (ey - sy + 1); - - buf = malloc(chars * sizeof(*buf)); - if (!buf) - return; - for (i = 0; i < chars ; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); - } - vmem_puttext(sx, sy, ex, ey, buf); - free(buf); -} - -static void -scrolldown(struct cterminal *cterm) -{ - int minx = TERM_MINX; - int miny = TERM_MINY; - int maxx = TERM_MAXX; - int maxy = TERM_MAXY; - int x,y; - - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &minx, &miny); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &maxx, &maxy); - MOVETEXT(minx, miny, maxx, maxy - 1, minx, miny + 1); - CURR_XY(&x, &y); - cterm_clrblk(cterm, minx, miny, minx + TERM_MAXX - 1, miny); - GOTOXY(x, y); -} - -void -cterm_scrollup(struct cterminal *cterm) -{ - int minx = TERM_MINX; - int miny = TERM_MINY; - int maxx = TERM_MAXX; - int maxy = TERM_MAXY; - int x,y; - int getw; - - cterm->backpos++; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &minx, &miny); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &maxx, &maxy); - if(cterm->scrollback!=NULL) { - if(cterm->backpos>cterm->backlines) { - memmove(cterm->scrollback, cterm->scrollback + cterm->backwidth, cterm->backwidth * sizeof(*cterm->scrollback) * (cterm->backlines - 1)); - cterm->backpos--; - } - getw = cterm->backwidth; - if (getw > cterm->width) - getw = cterm->width; - if (getw < cterm->backwidth) { - memset(cterm->scrollback + (cterm->backpos - 1) * cterm->backwidth, 0, sizeof(*cterm->scrollback) * cterm->backwidth); - } - vmem_gettext(cterm->x, miny, cterm->x + getw - 1, miny, cterm->scrollback + (cterm->backpos - 1) * cterm->backwidth); - } - MOVETEXT(minx, miny + 1, maxx, maxy, minx, miny); - CURR_XY(&x, &y); - cterm_clrblk(cterm, minx, maxy, minx + TERM_MAXX - 1, maxy); - GOTOXY(x, y); -} - -static void -cond_scrollup(struct cterminal *cterm) -{ - int x, y; - - TERM_XY(&x, &y); - if (x >= TERM_MINX && x <= TERM_MAXX && - y >= TERM_MINY && y <= TERM_MAXY) - cterm_scrollup(cterm); -} - -static void -dellines(struct cterminal * cterm, int lines) -{ - int i; - int minx = TERM_MINX; - int miny = TERM_MINY; - int maxx = TERM_MAXX; - int maxy = TERM_MAXY; - int sx,sy; - int x,y; - - if(lines<1) - return; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &minx, &miny); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &maxx, &maxy); - TERM_XY(&x, &y); - // Can't delete lines outside of window - if (x < TERM_MINX || x > TERM_MAXX || y < TERM_MINY || y > TERM_MAXY) - return; - SCR_XY(&sx, &sy); - MOVETEXT(minx, sy + lines, maxx, maxy, minx, sy); - for(i = TERM_MAXY - lines; i <= TERM_MAXY; i++) { - cterm_gotoxy(cterm, TERM_MINX, i); - cterm_clreol(cterm); - } - cterm_gotoxy(cterm, x, y); -} - -static void -clear2bol(struct cterminal * cterm) -{ - struct vmem_cell *buf; - int i; - int x, y; - int minx = CURR_MINX; - - CURR_XY(&x, &y); - buf = malloc(x * sizeof(*buf)); - for(i = 0; i < x; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); - } - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &x, &y); - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &minx, NULL); - vmem_puttext(minx, y, x, y, buf); - free(buf); -} - -void -cterm_clearscreen(struct cterminal *cterm, char attr) -{ - int getw; - - if(!cterm->started) - cterm_start(cterm); - - if(cterm->scrollback!=NULL) { - cterm->backpos+=cterm->height; - if(cterm->backpos>cterm->backlines) { - memmove(cterm->scrollback, cterm->scrollback + cterm->backwidth * (cterm->backpos - cterm->backlines), cterm->backwidth * sizeof(*cterm->scrollback) * (cterm->backlines - (cterm->backpos - cterm->backlines))); - cterm->backpos=cterm->backlines; - } - getw = cterm->backwidth; - if (getw > cterm->width) - getw = cterm->width; - if (getw < cterm->backwidth) { - memset(cterm->scrollback + (cterm->backpos - cterm->height) * cterm->backwidth, 0, sizeof(*cterm->scrollback) * cterm->backwidth * cterm->height); - } - vmem_gettext(cterm->x, cterm->y, cterm->x + getw - 1, cterm->y + cterm->height - 1, - cterm->scrollback + (cterm->backpos - cterm->height) * cterm->backwidth); - } - CLRSCR(); - GOTOXY(CURR_MINX, CURR_MINY); -} - -/* - * Parses an ESC sequence and returns it broken down - */ - -struct esc_seq { - char c1_byte; // Character after the ESC. If '[', ctrl_func and param_str will be non-NULL. - // For nF sequences (ESC I...I F), this will be NUL and ctrl_func will be - // non-NULL - char final_byte; // Final Byte (or NUL if c1 function); - char *ctrl_func; // Intermediate Bytes and Final Byte as NULL-terminated string. - char *param_str; // The parameter bytes - int param_count; // The number of parameters, or -1 if parameters were not parsed. - str_list_t param; // The parameters as strings - uint64_t *param_int; // The parameter bytes parsed as integers UINT64_MAX for default value. -}; - -struct sub_params { - int param_count; // The number of parameters, or -1 if parameters were not parsed. - uint64_t *param_int; // The parameter bytes parsed as integers UINT64_MAX for default value. -}; - -static bool parse_sub_parameters(struct sub_params *sub, struct esc_seq *seq, unsigned param) -{ - int i; - char *p; - - sub->param_count = 1; - sub->param_int = NULL; - - if (param >= seq->param_count) - return false; - for (p=seq->param[param]; *p; p++) - if (*p == ':') - sub->param_count++; - if (sub->param_count == 0) - return true; - sub->param_int = malloc(sub->param_count * sizeof(sub->param_int[0])); - if (sub->param_int == NULL) - return false; - p = seq->param[param]; - for (i=0; i<sub->param_count; i++) { - p++; - sub->param_int[i] = strtoull(p, &p, 10); - if (*p != ':' && *p != 0) { - free(seq->param_int); - return false; - } - } - return true; -} - -static void free_sub_parameters(struct sub_params *sub) -{ - FREE_AND_NULL(sub->param_int); -} - -static bool parse_parameters(struct esc_seq *seq) -{ - char *p; - char *dup; - char *start = NULL; - bool last_was_sc = false; - int i; - - if (seq == NULL) - return false; - if (seq->param_str == NULL) - return false; - - dup = strdup(seq->param_str); - if (dup == NULL) - return false; - p = dup; - - // First, skip past any private extension indicator... - if (*p >= 0x3c && *p <= 0x3f) - p++; - - seq->param_count = 0; - - seq->param = strListInit(); - - for (; *p; p++) { - /* Ensure it's a legal value */ - if (*p < 0x30 || *p > 0x3b) { - seq->param_count = -1; - strListFree(&seq->param); - seq->param = NULL; - free(dup); - return false; - } - /* Mark the start of the parameter */ - if (start == NULL) - start = p; - - if (*p == ';') { - /* End of parameter, add to string list */ - last_was_sc = true; - *p = 0; - while(*start == '0' && start[1]) - start++; - strListAppend(&seq->param, start, seq->param_count); - seq->param_count++; - start = NULL; - } - else - last_was_sc = false; - } - /* If the string ended with a semi-colon, there's a final zero-length parameter */ - if (last_was_sc) { - strListAppend(&seq->param, "", seq->param_count); - seq->param_count++; - } - else if (start) { - /* End of parameter, add to string list */ - *p = 0; - while(*start == '0' && start[1]) - start++; - strListAppend(&seq->param, start, seq->param_count); - seq->param_count++; - } - - seq->param_int = malloc(seq->param_count * sizeof(seq->param_int[0])); - if (seq->param_int == NULL) { - seq->param_count = -1; - strListFree(&seq->param); - seq->param = NULL; - free(dup); - return false; - } - - /* Now, parse all the integer values... */ - for (i=0; i<seq->param_count; i++) { - if (seq->param[i][0] == 0 || seq->param[i][0] == ':') { - seq->param_int[i] = UINT64_MAX; - continue; - } - seq->param_int[i] = strtoull(seq->param[i], NULL, 10); - if (seq->param_int[i] == ULLONG_MAX) { - seq->param_count = -1; - strListFree(&seq->param); - seq->param = NULL; - FREE_AND_NULL(seq->param_int); - free(dup); - return false; - } - } - - free(dup); - return true; -} - -static void seq_default(struct esc_seq *seq, int index, uint64_t val) -{ - char tmpnum[24]; - - // Params not parsed - if (seq->param_count == -1) - return; - - /* Do we need to add on to get defaults? */ - if (index >= seq->param_count) { - uint64_t *np; - - np = realloc(seq->param_int, (index + 1) * sizeof(seq->param_int[0])); - if (np == NULL) - return; - seq->param_int = np; - for (; seq->param_count <= index; seq->param_count++) { - if (seq->param_count == index) { - seq->param_int[index] = val; - sprintf(tmpnum, "%" PRIu64, val); - strListAppend(&seq->param, tmpnum, seq->param_count); - } - else { - seq->param_int[seq->param_count] = UINT64_MAX; - strListAppend(&seq->param, "", seq->param_count); - } - } - return; - } - if (seq->param_int[index] == UINT64_MAX) { - seq->param_int[index] = val; - sprintf(tmpnum, "%" PRIu64, val); - strListReplace(seq->param, index, tmpnum); - } -} - -static void free_sequence(struct esc_seq * seq) -{ - if (seq == NULL) - return; - if (seq->param) - strListFree(&seq->param); - FREE_AND_NULL(seq->param_int); - seq->param_count = -1; - FREE_AND_NULL(seq->param_str); - FREE_AND_NULL(seq->ctrl_func); - free(seq); -} - -/* - * Returns true if the sequence is legal so far - */ - -static enum { - SEQ_BROKEN, - SEQ_INCOMPLETE, - SEQ_COMPLETE -} legal_sequence(const char *seq, size_t max_len) -{ - size_t intermediate_len; - - if (seq == NULL) - return SEQ_BROKEN; - - if (seq[0] == 0) - goto incomplete; - - /* Check that it's part of C1 set, part of the Independent control functions, or an nF sequence type (ECMA 35)*/ - intermediate_len = strspn(&seq[0], " !\"#$%&'()*+,-./"); - if (seq[intermediate_len] == 0) - goto incomplete; - if (seq[intermediate_len] < 0x30 || seq[intermediate_len] > 0x7e) - return SEQ_BROKEN; - - /* Check if it's CSI */ - if (seq[0] == '[') { - size_t parameter_len; - - if (seq[1] >= '<' && seq[1] <= '?') - parameter_len = strspn(&seq[1], "0123456789:;<=>?"); - else - parameter_len = strspn(&seq[1], "0123456789:;"); - - if (seq[1+parameter_len] == 0) - goto incomplete; - - intermediate_len = strspn(&seq[1+parameter_len], " !\"#$%&'()*+,-./"); - if (seq[1+parameter_len+intermediate_len] == 0) - goto incomplete; - - if (seq[1+parameter_len+intermediate_len] < 0x40 || seq[1+parameter_len+intermediate_len] > 0x7e) - return SEQ_BROKEN; - } - return SEQ_COMPLETE; - -incomplete: - if (strlen(seq) >= max_len) - return SEQ_BROKEN; - return SEQ_INCOMPLETE; -} - -static struct esc_seq *parse_sequence(const char *seq) -{ - struct esc_seq *ret; - size_t intermediate_len; - - ret = calloc(1, sizeof(struct esc_seq)); - if (ret == NULL) - return ret; - ret->param_count = -1; - - /* Check that it's part of C1 set, part of the Independent control functions, or an nF sequence type (ECMA 35)*/ - intermediate_len = strspn(&seq[0], " !\"#$%&'()*+,-./"); - if (seq[intermediate_len] == 0) - goto fail; - - /* Validate C1 final byte */ - if (seq[intermediate_len] < 0x30 || seq[intermediate_len] > 0x7e) - goto fail; - - if (intermediate_len == 0) - ret->c1_byte = seq[intermediate_len]; - - /* Check if it's CSI */ - if (seq[0] == '[') { - size_t parameter_len; - - parameter_len = strspn(&seq[1], "0123456789:;<=>?"); - ret->param_str = malloc(parameter_len + 1); - if (!ret->param_str) - goto fail; - memcpy(ret->param_str, &seq[1], parameter_len); - ret->param_str[parameter_len] = 0; - - intermediate_len = strspn(&seq[1+parameter_len], " !\"#$%&'()*+,-./"); - if (seq[1+parameter_len+intermediate_len] < 0x40 || seq[1+parameter_len+intermediate_len] > 0x7e) - goto fail; - ret->ctrl_func = malloc(intermediate_len + 2); - if (!ret->ctrl_func) - goto fail; - memcpy(ret->ctrl_func, &seq[1+parameter_len], intermediate_len); - - ret->final_byte = ret->ctrl_func[intermediate_len] = seq[1+parameter_len+intermediate_len]; - /* Validate final byte */ - if (ret->final_byte < 0x40 || ret->final_byte > 0x7e) - goto fail; - - ret->ctrl_func[intermediate_len+1] = 0; - - /* - * Is this a private extension? - * If so, return now, the caller can parse the parameter sequence itself - * if the standard format is used. - */ - if (ret->param_str[0] >= 0x3c && ret->param_str[0] <= 0x3f) - return ret; - - if (!parse_parameters(ret)) - goto fail; - } - else { - ret->ctrl_func = malloc(intermediate_len + 2); - if (!ret->ctrl_func) - goto fail; - memcpy(ret->ctrl_func, seq, intermediate_len + 1); - ret->ctrl_func[intermediate_len + 1] = 0; - } - return ret; - -fail: - FREE_AND_NULL(ret->ctrl_func); - FREE_AND_NULL(ret->param_str); - free(ret); - return NULL; -} - -static void parse_sixel_string(struct cterminal *cterm, bool finish) -{ - char *p = cterm->strbuf; - char *end; - int i, j, k; - int vmode; - int pos; - struct text_info ti; - int palette_offset = 0; - - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - - if (cterm->strbuflen == 0) { - if (finish) - goto all_done; - return; - } - - end = p+cterm->strbuflen-1; - - if ((*end < '?' || *end > '~') && !finish) - return; - - /* - * TODO: Sixel interaction with scrolling margins... - * This one is interesting because there is no real terminal - * which supported left/right margins *and* sixel graphics. - */ - while (p <= end) { - if (*p >= '?' && *p <= '~') { - unsigned data = *p - '?'; - - cterm->sx_pixels_sent = 1; - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode == -1) - return; - if (cterm->sx_pixels == NULL) { - cterm->sx_pixels = malloc(sizeof(struct ciolib_pixels)); - cterm->sx_pixels->pixels = malloc(sizeof(cterm->sx_pixels->pixels[0]) * cterm->sx_iv * ti.screenwidth * vparams[vmode].charwidth * 6); - cterm->sx_pixels->pixelsb = NULL; - cterm->sx_pixels->width = ti.screenwidth * vparams[vmode].charwidth; - cterm->sx_pixels->height = cterm->sx_iv * 6; - cterm->sx_mask = malloc((cterm->sx_iv * 6 * ti.screenwidth * vparams[vmode].charwidth * 6 + 7)/8); - memset(cterm->sx_mask, 0, (cterm->sx_iv * 6 * ti.screenwidth * vparams[vmode].charwidth * 6 + 7)/8); - } - if (cterm->sx_x == cterm->sx_left && cterm->sx_height && cterm->sx_width && cterm->sx_first_pass) { - /* Fill in the background of the line */ - for (i = 0; i < (cterm->sx_height > 6 ? 6 : cterm->sx_height); i++) { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - cterm->sx_pixels->pixels[pos] = cterm->sx_bg; - cterm->sx_mask[pos/8] |= (0x80 >> (pos % 8)); - } - } - } - } - if (cterm->sx_x < ti.screenwidth * vparams[vmode].charwidth) { - for (i=0; i<6; i++) { - if (data & (1<<i)) { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - cterm->sx_pixels->pixels[pos] = cterm->sx_fg; - cterm->sx_mask[pos/8] |= (0x80 >> (pos % 8)); - } - } - } - else { - if (cterm->sx_first_pass && !cterm->sx_trans) { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - cterm->sx_pixels->pixels[pos] = cterm->sx_bg; - cterm->sx_mask[pos/8] |= (0x80 >> (pos % 8)); - } - } - } - else { - for (j = 0; j < cterm->sx_iv; j++) { - for (k = 0; k < cterm->sx_ih; k++) { - pos = i * cterm->sx_iv * cterm->sx_pixels->width + j * cterm->sx_pixels->width + cterm->sx_x + k; - if (cterm->sx_first_pass) - cterm->sx_mask[pos/8] &= ~(0x80 >> (pos % 8)); - } - } - } - } - } - if (cterm->sx_x > cterm->sx_row_max_x) - cterm->sx_row_max_x = cterm->sx_x; - } - - cterm->sx_x+=cterm->sx_ih; - if (cterm->sx_repeat) - cterm->sx_repeat--; - if (!cterm->sx_repeat) - p++; - } - else { - switch(*p) { - case '"': // Raster Attributes - if (!cterm->sx_pixels_sent) { - p++; - cterm->sx_iv = strtoul(p, &p, 10); - cterm->sx_height = cterm->sx_width = 0; - if (*p == ';') { - p++; - cterm->sx_ih = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - cterm->sx_width = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - cterm->sx_height = strtoul(p, &p, 10); - } - } - else - p++; - break; - case '!': // Repeat - p++; - if (!*p) - continue; - cterm->sx_repeat = strtoul(p, &p, 10); - break; - case '#': // Colour Introducer - p++; - if (!*p) - continue; - cterm->sx_fg = strtoul(p, &p, 10) + TOTAL_DAC_SIZE + palette_offset; - /* Do we want to redefine it while we're here? */ - if (*p == ';') { - unsigned long t,r,g,b; - - p++; - r=g=b=0; - t = strtoul(p, &p, 10); - if (*p == ';') { - p++; - r = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - g = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - b = strtoul(p, &p, 10); - } - if (t == 2) // Only support RGB - setpalette(cterm->sx_fg, UINT16_MAX*r/100, UINT16_MAX*g/100, UINT16_MAX*b/100); - } - break; - case '$': // Graphics Carriage Return - cterm->sx_x = cterm->sx_left; - cterm->sx_first_pass = 0; - p++; - break; - case '-': // Graphics New Line - { - int max_row = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &max_row, NULL); - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - - if (vmode == -1) - return; - setpixels(cterm->sx_left, cterm->sx_y, cterm->sx_row_max_x, cterm->sx_y + 6 * cterm->sx_iv - 1, cterm->sx_left, 0, cterm->sx_pixels, cterm->sx_mask); - cterm->sx_row_max_x = 0; - - if ((!(cterm->extattr & CTERM_EXTATTR_SXSCROLL)) && (((cterm->sx_y + 6 * cterm->sx_iv) + 6*cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight)) { - p++; - break; - } - - cterm->sx_x = cterm->sx_left; - cterm->sx_y += 6*cterm->sx_iv; - if (cterm->sx_height) - cterm->sx_height -= cterm->sx_height > 6 ? 6 : cterm->sx_height; - while ((cterm->sx_y + 6 * cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight) { - cond_scrollup(cterm); - cterm->sx_y -= vparams[vmode].charheight; - } - cterm->sx_first_pass = 1; - p++; - } - break; - default: - p++; - } - } - } - cterm->strbuflen = 0; - if (finish) - goto all_done; - return; - -all_done: - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - - if (cterm->sx_row_max_x) { - setpixels(cterm->sx_left, cterm->sx_y, cterm->sx_row_max_x, cterm->sx_y + 6 * cterm->sx_iv - 1, cterm->sx_left, 0, cterm->sx_pixels, cterm->sx_mask); - } - - *cterm->hold_update=cterm->sx_hold_update; - - /* Finish off the background */ - cterm->sx_x = cterm->sx_left; - cterm->sx_y += 6 * cterm->sx_iv; - if (cterm->sx_height) - cterm->sx_height -= cterm->sx_height > 6 ? 6 : cterm->sx_height; - - if (cterm->sx_height && cterm->sx_width) { - struct ciolib_pixels px; - - px.pixels = malloc(sizeof(px.pixels[0])*cterm->sx_width*cterm->sx_height*cterm->sx_iv*cterm->sx_ih); - px.height = cterm->sx_height; - px.width = cterm->sx_width; - for (i = 0; i<cterm->sx_height*cterm->sx_iv; i++) { - for (j = 0; j < cterm->sx_width*cterm->sx_ih; j++) - px.pixels[i*cterm->sx_width*cterm->sx_ih + j] = cterm->sx_bg; - } - setpixels(cterm->sx_x, cterm->sx_y, cterm->sx_x + cterm->sx_width - 1, cterm->sx_y + cterm->sx_height - 1, 0, 0, &px, NULL); - free(px.pixels); - } - - if (cterm->extattr & CTERM_EXTATTR_SXSCROLL) { - if (vmode != -1) { - cterm->sx_x = cterm->sx_x / vparams[vmode].charwidth + 1; - cterm->sx_x -= (cterm->x - 1); - - cterm->sx_y = (cterm->sx_y - 1) / vparams[vmode].charheight + 1; - cterm->sx_y -= (cterm->y - 1); - - cterm_gotoxy(cterm, cterm->sx_x, cterm->sx_y); - } - } - else { - cterm_gotoxy(cterm, cterm->sx_start_x, cterm->sx_start_y); - } - cterm->cursor = cterm->sx_orig_cursor; - SETCURSORTYPE(cterm->cursor); - cterm->sixel = SIXEL_INACTIVE; - if (cterm->sx_pixels) - FREE_AND_NULL(cterm->sx_pixels->pixels); - FREE_AND_NULL(cterm->sx_pixels); - FREE_AND_NULL(cterm->sx_mask); -} - -static int -is_hex(char ch) -{ - if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) - return 1; - return 0; -} - -static int -get_hexstrlen(char *str, char *end) -{ - int ret = 0; - - for (;str <= end; str++) { - if (is_hex(*str)) { - if (str == end) - return -1; - if (!is_hex(*(str+1))) - return -1; - ret++; - str++; - } - else - return ret; - } - return ret; -} - -static int -nibble_val(char ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - if (ch >= 'a' && ch <= 'f') - return (ch - 'a') + 10; - if (ch >= 'A' && ch <= 'F') - return (ch - 'A') + 10; - return -1; -} - -static void -get_hexstr(char *str, char *end, char *out) -{ - for (;str <= end; str++) { - if (is_hex(*str)) { - if (str == end) - return; - if (!is_hex(*(str+1))) - return; - *(out++) = nibble_val(*str) << 4 | nibble_val(*(str + 1)); - str++; - } - else - return; - } -} - -static void parse_macro_string(struct cterminal *cterm, bool finish) -{ - char *p = cterm->strbuf; - char *end; - int i; - - if (cterm->strbuflen == 0) { - if (finish) - goto all_done; - return; - } - - end = p+cterm->strbuflen-1; - - if (*end >= '\x08' && *end <= '\x0d') { - cterm->strbuflen--; - if (finish) - goto all_done; - return; - } - if (cterm->macro_encoding == MACRO_ENCODING_ASCII) { - if ((*end >= ' ' && *end <= '\x7e') || (*end >= '\xa0' && *end <= '\xff')) { - if (finish) - goto all_done; - return; - } - } - if (cterm->macro_encoding == MACRO_ENCODING_HEX && - (is_hex(*end) || (*end == '!') || (*end == ';'))) { - if (finish) - goto all_done; - return; - } - - cterm->macro = MACRO_INACTIVE; - return; - -all_done: - if (cterm->macro_del == MACRO_DELETE_ALL) { - for (i = 0; i < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); i++) { - FREE_AND_NULL(cterm->macros[i]); - cterm->macro_lens[i] = 0; - } - } - else { - FREE_AND_NULL(cterm->macros[cterm->macro_num]); - cterm->macro_lens[cterm->macro_num] = 0; - } - if (cterm->strbuflen == 0) - return; - if (cterm->macro_encoding == MACRO_ENCODING_ASCII) { - cterm->macros[cterm->macro_num] = malloc(cterm->strbuflen + 1); - if (cterm->macros[cterm->macro_num]) { - cterm->macro_lens[cterm->macro_num] = cterm->strbuflen; - memcpy(cterm->macros[cterm->macro_num], cterm->strbuf, cterm->strbuflen); - cterm->macros[cterm->macro_num][cterm->strbuflen] = 0; - } - } - else { - // Hex string... - int plen; - unsigned long ul; - size_t mlen = 0; - char *out; - - // First, calculate the required length... - for (p = cterm->strbuf; p <= end;) { - if (*p == '!') { - if (p == end) - return; - p++; - if (p == end) - return; - if (*p == ';') - ul = 1; - else { - if (memchr(p, ';', cterm->strbuflen - (p - cterm->strbuf)) == NULL) - return; - ul = strtoul(p, &p, 10); - if (*p != ';') - return; - if (ul == ULONG_MAX) - return; - p++; - } - plen = get_hexstrlen(p, end); - p += plen * 2; - if (plen == -1) - return; - mlen += ul * plen; - if (p <= end) { - if (*p == ';') - p++; - else - return; - } - } - else { - plen = get_hexstrlen(p, end); - if (plen == -1) - return; - p += plen * 2; - mlen += plen; - } - } - cterm->macros[cterm->macro_num] = malloc(mlen + 1); - if (cterm->macros[cterm->macro_num] == NULL) - return; - cterm->macro_lens[cterm->macro_num] = mlen; - out = cterm->macros[cterm->macro_num]; - for (p = cterm->strbuf; p <= end;) { - if (*p == '!') { - p++; - if (*p == ';') - ul = 1; - else { - ul = strtoul(p, &p, 10); - p++; - } - plen = get_hexstrlen(p, end); - for (i = 0; i < ul; i++) { - get_hexstr(p, end, out); - out += plen; - } - p += plen * 2; - if (p <= end && *p == ';') - p++; - } - else { - plen = get_hexstrlen(p, end); - get_hexstr(p, end, out); - out += plen; - p += plen * 2; - } - } - } -} - -static void save_extended_colour_seq(struct cterminal *cterm, int fg, struct esc_seq *seq, int seqoff, int count) -{ - char **str = fg ? &cterm->fg_tc_str : &cterm->bg_tc_str; - - if (*str) - FREE_AND_NULL(*str); - - switch (count) { - case 1: - asprintf(str, "%s", seq->param[seqoff]); - break; - case 2: - asprintf(str, "%s;%s", seq->param[seqoff], seq->param[seqoff+1]); - break; - case 3: - asprintf(str, "%s;%s;%s", seq->param[seqoff], seq->param[seqoff+1], seq->param[seqoff+2]); - break; - case 5: - asprintf(str, "%s;%s;%s;%s;%s", seq->param[seqoff], seq->param[seqoff+1], seq->param[seqoff+2], seq->param[seqoff+3], seq->param[seqoff+4]); - break; - } -} - -static void parse_extended_colour(struct esc_seq *seq, int *i, struct cterminal *cterm, int fg) -{ - struct sub_params sub = {0}; - uint32_t nc; - uint32_t *co; - int palette_offset = 0; - - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - - if (seq == NULL || cterm == NULL || i == NULL) - return; - if (fg) - FREE_AND_NULL(cterm->fg_tc_str); - else - FREE_AND_NULL(cterm->bg_tc_str); - co = fg ? (&cterm->fg_color) : (&cterm->bg_color); - if (*i>=seq->param_count) - return; - - if (seq->param[*i][2] == ':') { - // CSI 38 : 5 : X m variant - // CSI 38 : 2 : Z? : R : G : B m variant - - if (parse_sub_parameters(&sub, seq, *i)) { - if (sub.param_count == 3 && sub.param_int[1] == 5) { - *co = sub.param_int[2]; - save_extended_colour_seq(cterm, fg, seq, *i, 1); - } - else if (sub.param_int[1] == 2) { - if (sub.param_count == 5) { - nc = map_rgb(sub.param_int[2]<<8, sub.param_int[3]<<8, sub.param_int[4]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 1); - } - else if (sub.param_count > 5) { - nc = map_rgb(sub.param_int[3]<<8, sub.param_int[4]<<8, sub.param_int[5]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 1); - } - } - } - } - else if ((*i)+1 < seq->param_count && seq->param_int[(*i)+1] == 5 && seq->param[(*i)+1][1] == ':') { - // CSI 38 ; 5 : X m variant - if (parse_sub_parameters(&sub, seq, (*i)+1)) { - if (sub.param_count == 2) - *co = sub.param_int[1]; - save_extended_colour_seq(cterm, fg, seq, *i, 2); - (*i)++; - } - } - else if ((*i)+2 < seq->param_count && seq->param_int[(*i)+1] == 5) { - // CSI 38 ; 5 ; X m variant - *co = seq->param_int[(*i)+2] + palette_offset; - save_extended_colour_seq(cterm, fg, seq, *i, 3); - *i+=2; - } - else if ((*i)+1 < seq->param_count && seq->param_int[(*i)+1] == 2 && seq->param[(*i)+1][1] == ':') { - // CSI 38 ; 2 : Z? : R : G : B m variant - if (parse_sub_parameters(&sub, seq, (*i)+1)) { - nc = UINT32_MAX; - if (sub.param_count > 4) - nc = map_rgb(sub.param_int[2]<<8, sub.param_int[3]<<8, sub.param_int[4]<<8); - else if (sub.param_count == 4) - nc = map_rgb(sub.param_int[1]<<8, sub.param_int[2]<<8, sub.param_int[3]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 2); - *i += 1; - } - } - else if ((*i)+4 < seq->param_count && seq->param_int[(*i)+1] == 2) { - // CSI 38 ; 2 ; R ; G ; B m variant - nc = map_rgb(seq->param_int[(*i)+2]<<8, seq->param_int[(*i)+3]<<8, seq->param_int[(*i)+4]<<8); - if (nc != UINT32_MAX) - *co = nc; - save_extended_colour_seq(cterm, fg, seq, *i, 5); - *i += 4; - } - free_sub_parameters(&sub); -} - -static void -do_tab(struct cterminal *cterm) -{ - int i; - int cx, cy, ox; - int lm, rm, bm; - - rm = TERM_MAXX; - bm = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &rm, &bm); - lm = TERM_MINX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &lm, NULL); - - CURR_XY(&cx, &cy); - ox = cx; - for (i = 0; i < cterm->tab_count; i++) { - if (cterm->tabs[i] > cx) { - cx = cterm->tabs[i]; - break; - } - } - if ((ox > rm && cx > CURR_MAXX) || (ox <= rm && cx > rm) || i == cterm->tab_count) { - cx = lm; - if (cy == bm) { - cond_scrollup(cterm); - cy = bm; - } - else if(cy < CURR_MAXY) - cy++; - } - GOTOXY(cx, cy); -} - -static void -do_backtab(struct cterminal *cterm) -{ - int i; - int cx, cy, ox; - int lm; - - lm = TERM_MINX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &lm, NULL); - - CURR_XY(&cx, &cy); - ox = cx; - for (i = cterm->tab_count - 1; i >= 0; i--) { - if (cterm->tabs[i] < cx) { - cx = cterm->tabs[i]; - break; - } - } - if (ox >= lm && cx < lm) - cx = lm; - GOTOXY(cx, cy); -} - -static void -adjust_currpos(struct cterminal *cterm, int xadj, int yadj, int scroll) -{ - int x, y; - int tx, ty; - - /* - * If we're inside the scrolling margins, we simply move inside - * them, and scrolling works. - */ - TERM_XY(&tx, &ty); - if (tx >= TERM_MINX && tx <= TERM_MAXX && - ty >= TERM_MINY && ty <= TERM_MAXY) { - if (xadj == INT_MIN) - tx = TERM_MINX; - else - tx += xadj; - if (yadj == INT_MIN) - ty = TERM_MINX; - else - ty += yadj; - if (scroll) { - while(ty > TERM_MAXY) { - cterm_scrollup(cterm); - ty--; - } - while(ty < TERM_MINY) { - scrolldown(cterm); - ty++; - } - } - else { - if (ty > TERM_MAXY) - ty = TERM_MAXY; - if (ty < TERM_MINY) - ty = TERM_MINY; - } - if (tx > TERM_MAXX) - tx = TERM_MAXX; - if (tx < TERM_MINX) - tx = TERM_MINX; - cterm_gotoxy(cterm, tx, ty); - return; - } - /* - * Outside of the scrolling margins, we can cross a margin - * into the scrolling region, but can't cross going out. - */ - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &tx, &ty); - x = tx; - y = ty; - if (xadj == INT_MIN) - tx = TERM_MINX; - else - tx += xadj; - if (yadj == INT_MIN) - ty = TERM_MINX; - else - ty += yadj; - if (x <= cterm->right_margin && tx > cterm->right_margin) - tx = cterm->right_margin; - if (y <= cterm->bottom_margin && ty > cterm->bottom_margin) - ty = cterm->bottom_margin; - if (tx < cterm->left_margin && x >= cterm->left_margin) - tx = cterm->left_margin; - if (ty < cterm->top_margin && y >= cterm->top_margin) - ty = cterm->top_margin; - GOTOXY(tx, ty); -} - -static int -skypix_color(struct cterminal *cterm, int color) -{ - if (!cterm->skypix) - return color; - switch(color) { - case BLACK: - return 0; - case RED: - return 3; - case GREEN: - return 4; - case BROWN: - return 6; - case BLUE: - return 1; - case MAGENTA: - return 7; - case CYAN: - return 5; - case LIGHTGRAY: - return 2; - case DARKGRAY: - return 8; - case LIGHTRED: - return 11; - case LIGHTGREEN: - return 12; - case YELLOW: - return 14; - case LIGHTBLUE: - return 9; - case LIGHTMAGENTA: - return 15; - case LIGHTCYAN: - return 13; - case WHITE: - return 10; - } - return color; -} - -static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *speed, char last) -{ - char *p; - char *p2; - char tmp[1024]; - int i,j,k,l; - int flags; - int row,col; - int row2,col2; - int max_row; - int max_col; - struct text_info ti; - struct esc_seq *seq; - uint32_t oldfg, oldbg; - bool updfg, updbg; - struct vmem_cell *vc; - int palette_offset = 0; - - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - seq = parse_sequence(cterm->escbuf); - if (seq != NULL) { - switch(seq->c1_byte) { - case '[': - /* ANSI stuff */ - p=cterm->escbuf+strlen(cterm->escbuf)-1; - if(seq->param_str[0]>=60 && seq->param_str[0] <= 63) { /* Private extensions */ - switch(seq->final_byte) { - case 'M': - if(seq->param_str[0] == '=' && parse_parameters(seq)) { /* ANSI Music setup */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: /* Disable ANSI Music */ - cterm->music_enable=CTERM_MUSIC_SYNCTERM; - break; - case 1: /* BANSI (ESC[N) music only) */ - cterm->music_enable=CTERM_MUSIC_BANSI; - break; - case 2: /* ESC[M ANSI music */ - cterm->music_enable=CTERM_MUSIC_ENABLED; - break; - } - } - break; - case 'S': // XTerm graphics query - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - if (seq->param_int[0] == 2 && seq->param_int[1] == 1) { - struct text_info ti; - int vmode; - - tmp[0] = 0; - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode != -1) - sprintf(tmp, "\x1b[?2;0;%u;%uS", vparams[vmode].charwidth*cterm->width, vparams[vmode].charheight*cterm->height); - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - } - break; - case 'c': - /* SyncTERM Device Attributes */ - if (seq->param_str[0] == '<' && parse_parameters(seq)) { - seq_default(seq, 0, 0); - tmp[0] = 0; - for (i=0; i<seq->param_count; i++) { - switch (seq->param_int[i]) { - case 0: /* Advanced features */ - strcpy(tmp, "\x1b[<0"); - if (cio_api.options & CONIO_OPT_LOADABLE_FONTS) - strcat(tmp, ";1"); - if (cio_api.options & CONIO_OPT_BRIGHT_BACKGROUND) - strcat(tmp, ";2"); - if (cio_api.options & CONIO_OPT_PALETTE_SETTING) - strcat(tmp, ";3"); - if (cio_api.options & CONIO_OPT_SET_PIXEL) - strcat(tmp, ";4"); - if (cio_api.options & CONIO_OPT_FONT_SELECT) - strcat(tmp, ";5"); - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - strcat(tmp, ";6"); - if (cio_api.mouse) - strcat(tmp, ";7"); - strcat(tmp, "c"); - } - } - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 'h': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - attr2palette(cterm->attr, &oldfg, &oldbg); - updfg = (oldfg == cterm->fg_color); - updbg = (oldbg == cterm->bg_color); - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - setwindow(cterm); - break; - case 7: - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - break; - case 25: - cterm->cursor=_NORMALCURSOR; - SETCURSORTYPE(cterm->cursor); - break; - case 31: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_ALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 32: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_NOBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 33: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_BGBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 34: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 35: - flags = GETVIDEOFLAGS(); - flags |= CIOLIB_VIDEO_NOBLINK; - SETVIDEOFLAGS(flags); - break; - case 69: - cterm->extattr |= CTERM_EXTATTR_DECLRMM; - break; - case 80: - cterm->extattr |= CTERM_EXTATTR_SXSCROLL; - break; - case 9: - case 1000: - case 1001: - case 1002: - case 1003: - case 1004: - case 1005: - case 1006: - case 1007: - case 1015: - if (cterm->mouse_state_change) - cterm->mouse_state_change(seq->param_int[i], 1, cterm->mouse_state_change_cbdata); - break; - } - } - if (updfg || updbg) { - attr2palette(cterm->attr, updfg ? &cterm->fg_color : NULL, updbg ? &cterm->bg_color : NULL); - if (updfg) - FREE_AND_NULL(cterm->fg_tc_str); - if (updbg) - FREE_AND_NULL(cterm->bg_tc_str); - } - } - else if(!strcmp(seq->param_str,"=255")) - cterm->doorway_mode=1; - break; - case 'l': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - attr2palette(cterm->attr, &oldfg, &oldbg); - updfg = (oldfg == cterm->fg_color); - updbg = (oldbg == cterm->bg_color); - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - cterm->extattr &= ~CTERM_EXTATTR_ORIGINMODE; - setwindow(cterm); - break; - case 7: - cterm->extattr &= ~(CTERM_EXTATTR_AUTOWRAP); - break; - case 25: - cterm->cursor=_NOCURSOR; - SETCURSORTYPE(cterm->cursor); - break; - case 31: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_ALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 32: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_NOBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 33: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - SETVIDEOFLAGS(flags); - break; - case 34: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_BLINKALTCHARS; - SETVIDEOFLAGS(flags); - break; - case 35: - flags = GETVIDEOFLAGS(); - flags &= ~CIOLIB_VIDEO_NOBLINK; - SETVIDEOFLAGS(flags); - break; - case 69: - cterm->extattr &= ~(CTERM_EXTATTR_DECLRMM); - break; - case 80: - cterm->extattr &= ~CTERM_EXTATTR_SXSCROLL; - break; - case 9: - case 1000: - case 1001: - case 1002: - case 1003: - case 1004: - case 1005: - case 1006: - case 1007: - case 1015: - if (cterm->mouse_state_change) - cterm->mouse_state_change(seq->param_int[i], 0, cterm->mouse_state_change_cbdata); - break; - } - } - if (updfg || updbg) { - attr2palette(cterm->attr, updfg ? &cterm->fg_color : NULL, updbg ? &cterm->bg_color : NULL); - if (updfg) - FREE_AND_NULL(cterm->fg_tc_str); - if (updbg) - FREE_AND_NULL(cterm->bg_tc_str); - } - } - else if(!strcmp(seq->param_str,"=255")) - cterm->doorway_mode=0; - break; - case 'n': /* Query (extended) state information */ - if (seq->param_str[0] == '=' && parse_parameters(seq)) { - int vidflags; - - if(retbuf == NULL) - break; - tmp[0] = 0; - if (seq->param_count > 1) - break; - seq_default(seq, 0, 1); - switch(seq->param_int[0]) { - case 1: - sprintf(tmp, "\x1b[=1;%u;%u;%u;%u;%u;%un" - ,CONIO_FIRST_FREE_FONT - ,(uint8_t)cterm->setfont_result - ,(uint8_t)cterm->altfont[0] - ,(uint8_t)cterm->altfont[1] - ,(uint8_t)cterm->altfont[2] - ,(uint8_t)cterm->altfont[3] - ); - break; - case 2: - vidflags = GETVIDEOFLAGS(); - strcpy(tmp, "\x1b[=2"); - if(cterm->extattr & CTERM_EXTATTR_ORIGINMODE) - strcat(tmp, ";6"); - if (cterm->extattr & CTERM_EXTATTR_AUTOWRAP) - strcat(tmp, ";7"); - if (cterm->mouse_state_query(9, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";9"); - if(cterm->cursor == _NORMALCURSOR) - strcat(tmp, ";25"); - if(vidflags & CIOLIB_VIDEO_ALTCHARS) - strcat(tmp, ";31"); - if(vidflags & CIOLIB_VIDEO_NOBRIGHT) - strcat(tmp, ";32"); - if(vidflags & CIOLIB_VIDEO_BGBRIGHT) - strcat(tmp, ";33"); - if(vidflags & CIOLIB_VIDEO_BLINKALTCHARS) - strcat(tmp, ";34"); - if(vidflags & CIOLIB_VIDEO_NOBLINK) - strcat(tmp, ";35"); - if (cterm->extattr & CTERM_EXTATTR_DECLRMM) - strcat(tmp, ";69"); - if (cterm->extattr & CTERM_EXTATTR_SXSCROLL) - strcat(tmp, ";80"); - if (cterm->mouse_state_query(1000, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1000"); - if (cterm->mouse_state_query(1001, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1001"); - if (cterm->mouse_state_query(1002, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1002"); - if (cterm->mouse_state_query(1003, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1003"); - if (cterm->mouse_state_query(1004, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1004"); - if (cterm->mouse_state_query(1005, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1005"); - if (cterm->mouse_state_query(1006, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1006"); - if (cterm->mouse_state_query(1007, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1007"); - if (cterm->mouse_state_query(1015, cterm->mouse_state_query_cbdata)) - strcat(tmp, ";1015"); - if (strlen(tmp) == 4) { // Nothing set - strcat(tmp, ";"); - } - strcat(tmp, "n"); - break; - case 3: /* Query font char dimensions */ - { - struct text_info ti; - int vmode; - - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode != -1) - sprintf(tmp, "\x1b[=3;%u;%un", vparams[vmode].charheight, vparams[vmode].charwidth); - break; - } - } - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - else if (seq->param_str[0] == '?' && parse_parameters(seq)) { - if(retbuf == NULL) - break; - seq_default(seq, 0, 1); - tmp[0] = 0; - switch(seq->param_int[0]) { - case 62: /* Query macro space available */ - { - if (seq->param_count > 1) - break; - // Just fake it as int16_max - strcpy(tmp, "\x1b[32767*{"); - break; - } - case 63: /* Quero macro space "checksum" */ - { - uint16_t crc = 0; - if (seq->param_count > 2) - break; - seq_default(seq, 1, 1); - for (k = 0; k < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); k++) { - if (cterm->macros[k]) { - for (i = 0; i <= cterm->macro_lens[k]; i++) - crc = ucrc16(cterm->macros[k][i], crc); - } - else - crc = ucrc16(0, crc); - } - *tmp = 0; - snprintf(tmp, sizeof(tmp), "\x1bP%u!~%04X\x1b\\", (unsigned)seq->param_int[1], crc); - break; - } - } - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 's': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - GETTEXTINFO(&ti); - flags = GETVIDEOFLAGS(); - if(seq->param_count == 0) { - /* All the save stuff... */ - cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS| - CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN|CTERM_SAVEMODE_SIXEL_SCROLL| - CTERM_SAVEMODE_MOUSE_X10|CTERM_SAVEMODE_MOUSE_NORMAL|CTERM_SAVEMODE_MOUSE_HIGHLIGHT| - CTERM_SAVEMODE_MOUSE_BUTTONTRACK|CTERM_SAVEMODE_MOUSE_ANY|CTERM_SAVEMODE_MOUSE_FOCUS| - CTERM_SAVEMODE_MOUSE_UTF8|CTERM_SAVEMODE_MOUSE_SGR|CTERM_SAVEMODE_MOUSE_ALTSCROLL|CTERM_SAVEMODE_MOUSE_URXVT|CTERM_SAVEMODE_DECLRMM); - cterm->saved_mode &= ~(cterm->saved_mode_mask); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_AUTOWRAP)?CTERM_SAVEMODE_AUTOWRAP:0; - cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBRIGHT)?CTERM_SAVEMODE_NOBRIGHT:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0; - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0; - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_ORIGINMODE)?CTERM_SAVEMODE_ORIGIN:0; - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_SXSCROLL)?CTERM_SAVEMODE_SIXEL_SCROLL:0; - cterm->saved_mode |= (cterm->mouse_state_query(9, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_X10 : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1000, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_NORMAL : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1001, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_HIGHLIGHT : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1002, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_BUTTONTRACK : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1003, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ANY : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1004, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_FOCUS : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1005, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_UTF8 : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1006, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_SGR : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1007, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ALTSCROLL : 0); - cterm->saved_mode |= (cterm->mouse_state_query(1015, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_URXVT : 0); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_DECLRMM) ? CTERM_SAVEMODE_DECLRMM : 0; - setwindow(cterm); - break; - } - else { - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - cterm->saved_mode_mask |= CTERM_SAVEMODE_ORIGIN; - cterm->saved_mode &= ~(CTERM_SAVEMODE_ORIGIN); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_ORIGINMODE)?CTERM_SAVEMODE_ORIGIN:0; - setwindow(cterm); - break; - case 7: - cterm->saved_mode_mask |= CTERM_SAVEMODE_AUTOWRAP; - cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_AUTOWRAP)?CTERM_SAVEMODE_AUTOWRAP:0; - break; - case 9: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_X10; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_X10); - cterm->saved_mode |= (cterm->mouse_state_query(9, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_X10 : 0); - break; - case 25: - cterm->saved_mode_mask |= CTERM_SAVEMODE_CURSOR; - cterm->saved_mode &= ~(CTERM_SAVEMODE_CURSOR); - cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0; - break; - case 31: - cterm->saved_mode_mask |= CTERM_SAVEMODE_ALTCHARS; - cterm->saved_mode &= ~(CTERM_SAVEMODE_ALTCHARS); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0; - break; - case 32: - cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBRIGHT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBRIGHT); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBRIGHT)?CTERM_SAVEMODE_NOBRIGHT:0; - break; - case 33: - cterm->saved_mode_mask |= CTERM_SAVEMODE_BGBRIGHT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_BGBRIGHT); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0; - break; - case 34: - cterm->saved_mode_mask |= CTERM_SAVEMODE_BLINKALTCHARS; - cterm->saved_mode &= ~(CTERM_SAVEMODE_BLINKALTCHARS); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0; - break; - case 35: - cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBLINK; - cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBLINK); - cterm->saved_mode |= (flags & CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0; - break; - case 69: - cterm->saved_mode_mask |= CTERM_SAVEMODE_DECLRMM; - cterm->saved_mode &= ~(CTERM_SAVEMODE_DECLRMM); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_DECLRMM) ? CTERM_SAVEMODE_DECLRMM : 0; - break; - case 80: - cterm->saved_mode_mask |= CTERM_SAVEMODE_SIXEL_SCROLL; - cterm->saved_mode &= ~(CTERM_SAVEMODE_SIXEL_SCROLL); - cterm->saved_mode |= (cterm->extattr & CTERM_EXTATTR_SXSCROLL)?CTERM_SAVEMODE_SIXEL_SCROLL:0; - break; - case 1000: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_NORMAL; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_NORMAL); - cterm->saved_mode |= (cterm->mouse_state_query(1000, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_NORMAL : 0); - break; - case 1001: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_HIGHLIGHT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_HIGHLIGHT); - cterm->saved_mode |= (cterm->mouse_state_query(1001, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_HIGHLIGHT : 0); - break; - case 1002: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_BUTTONTRACK; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_BUTTONTRACK); - cterm->saved_mode |= (cterm->mouse_state_query(1002, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_BUTTONTRACK : 0); - break; - case 1003: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_ANY; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_ANY); - cterm->saved_mode |= (cterm->mouse_state_query(1003, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ANY : 0); - break; - case 1004: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_FOCUS; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_FOCUS); - cterm->saved_mode |= (cterm->mouse_state_query(1004, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_FOCUS : 0); - break; - case 1005: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_UTF8; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_UTF8); - cterm->saved_mode |= (cterm->mouse_state_query(1005, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_UTF8 : 0); - break; - case 1006: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_SGR; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_SGR); - cterm->saved_mode |= (cterm->mouse_state_query(1006, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_SGR : 0); - break; - case 1007: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_ALTSCROLL; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_ALTSCROLL); - cterm->saved_mode |= (cterm->mouse_state_query(1007, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_ALTSCROLL : 0); - break; - case 1015: - cterm->saved_mode_mask |= CTERM_SAVEMODE_MOUSE_URXVT; - cterm->saved_mode &= ~(CTERM_SAVEMODE_MOUSE_URXVT); - cterm->saved_mode |= (cterm->mouse_state_query(1015, cterm->mouse_state_query_cbdata) ? CTERM_SAVEMODE_MOUSE_URXVT : 0); - break; - } - } - } - } - break; - case 'u': - if (seq->param_str[0] == '?' && parse_parameters(seq)) { - GETTEXTINFO(&ti); - flags = GETVIDEOFLAGS(); - attr2palette(cterm->attr, &oldfg, &oldbg); - updfg = (oldfg == cterm->fg_color); - updbg = (oldbg == cterm->bg_color); - if(seq->param_count == 0) { - /* All the save stuff... */ - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN) { - if (cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) - cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - else - cterm->extattr &= ~CTERM_EXTATTR_ORIGINMODE; - setwindow(cterm); - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP) { - if (cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - else - cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_SIXEL_SCROLL) { - if (cterm->saved_mode & CTERM_SAVEMODE_SIXEL_SCROLL) - cterm->extattr |= CTERM_EXTATTR_SXSCROLL; - else - cterm->extattr &= ~CTERM_EXTATTR_SXSCROLL; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) { - cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR; - SETCURSORTYPE(cterm->cursor); - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_ALTCHARS) - flags |= CIOLIB_VIDEO_ALTCHARS; - else - flags &= ~CIOLIB_VIDEO_ALTCHARS; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BLINKALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_BLINKALTCHARS) - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - else - flags &= ~CIOLIB_VIDEO_BLINKALTCHARS; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBRIGHT) - flags |= CIOLIB_VIDEO_NOBRIGHT; - else - flags &= ~CIOLIB_VIDEO_NOBRIGHT; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBLINK) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBLINK) - flags |= CIOLIB_VIDEO_NOBLINK; - else - flags &= ~CIOLIB_VIDEO_NOBLINK; - } - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BGBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_BGBRIGHT) - flags |= CIOLIB_VIDEO_BGBRIGHT; - else - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - } - SETVIDEOFLAGS(flags); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_X10) - cterm->mouse_state_change(9, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_X10, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_NORMAL) - cterm->mouse_state_change(1000, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_NORMAL, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_HIGHLIGHT) - cterm->mouse_state_change(1001, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_HIGHLIGHT, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_BUTTONTRACK) - cterm->mouse_state_change(1002, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_BUTTONTRACK, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ANY) - cterm->mouse_state_change(1003, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ANY, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_FOCUS) - cterm->mouse_state_change(1004, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_FOCUS, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_UTF8) - cterm->mouse_state_change(1005, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_UTF8, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_SGR) - cterm->mouse_state_change(1006, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_SGR, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ALTSCROLL) - cterm->mouse_state_change(1007, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ALTSCROLL, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_URXVT) - cterm->mouse_state_change(1015, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_URXVT, cterm->mouse_state_change_cbdata); - if(cterm->saved_mode_mask & CTERM_SAVEMODE_DECLRMM) { - if (cterm->saved_mode & CTERM_SAVEMODE_DECLRMM) - cterm->extattr |= CTERM_EXTATTR_DECLRMM; - else - cterm->extattr &= ~CTERM_EXTATTR_DECLRMM; - } - break; - } - else { - for (i=0; i<seq->param_count; i++) { - switch(seq->param_int[i]) { - case 6: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN) { - if (cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) - cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; - else - cterm->extattr &= ~CTERM_EXTATTR_ORIGINMODE; - } - setwindow(cterm); - break; - case 7: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP) { - if (cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) - cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; - else - cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; - } - break; - case 9: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_X10) - cterm->mouse_state_change(9, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_X10, cterm->mouse_state_change_cbdata); - break; - case 25: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) { - cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR; - SETCURSORTYPE(cterm->cursor); - } - break; - case 31: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_ALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_ALTCHARS) - flags |= CIOLIB_VIDEO_ALTCHARS; - else - flags &= ~CIOLIB_VIDEO_ALTCHARS; - SETVIDEOFLAGS(flags); - } - break; - case 32: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBRIGHT) - flags |= CIOLIB_VIDEO_NOBRIGHT; - else - flags &= ~CIOLIB_VIDEO_NOBRIGHT; - SETVIDEOFLAGS(flags); - } - break; - case 33: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BGBRIGHT) { - if(cterm->saved_mode & CTERM_SAVEMODE_BGBRIGHT) - flags |= CIOLIB_VIDEO_BGBRIGHT; - else - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - SETVIDEOFLAGS(flags); - } - break; - case 34: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_BLINKALTCHARS) { - if(cterm->saved_mode & CTERM_SAVEMODE_BLINKALTCHARS) - flags |= CIOLIB_VIDEO_BLINKALTCHARS; - else - flags &= ~CIOLIB_VIDEO_BLINKALTCHARS; - SETVIDEOFLAGS(flags); - } - break; - case 35: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBLINK) { - if(cterm->saved_mode & CTERM_SAVEMODE_NOBLINK) - flags |= CIOLIB_VIDEO_NOBLINK; - else - flags &= ~CIOLIB_VIDEO_NOBLINK; - SETVIDEOFLAGS(flags); - } - break; - case 69: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_DECLRMM) { - if (cterm->saved_mode & CTERM_SAVEMODE_DECLRMM) - cterm->extattr |= CTERM_EXTATTR_DECLRMM; - else - cterm->extattr &= ~CTERM_EXTATTR_DECLRMM; - } - break; - case 80: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_SIXEL_SCROLL) { - if (cterm->saved_mode & CTERM_SAVEMODE_SIXEL_SCROLL) - cterm->extattr |= CTERM_EXTATTR_SXSCROLL; - else - cterm->extattr &= ~CTERM_EXTATTR_SXSCROLL; - } - break; - case 1000: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_NORMAL) - cterm->mouse_state_change(1000, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_NORMAL, cterm->mouse_state_change_cbdata); - break; - case 1001: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_HIGHLIGHT) - cterm->mouse_state_change(1001, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_HIGHLIGHT, cterm->mouse_state_change_cbdata); - break; - case 1002: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_BUTTONTRACK) - cterm->mouse_state_change(1002, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_BUTTONTRACK, cterm->mouse_state_change_cbdata); - break; - case 1003: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ANY) - cterm->mouse_state_change(1003, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ANY, cterm->mouse_state_change_cbdata); - break; - case 1004: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_FOCUS) - cterm->mouse_state_change(1004, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_FOCUS, cterm->mouse_state_change_cbdata); - break; - case 1005: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_UTF8) - cterm->mouse_state_change(1005, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_UTF8, cterm->mouse_state_change_cbdata); - break; - case 1006: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_SGR) - cterm->mouse_state_change(1006, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_SGR, cterm->mouse_state_change_cbdata); - break; - case 1007: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_ALTSCROLL) - cterm->mouse_state_change(1007, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_ALTSCROLL, cterm->mouse_state_change_cbdata); - break; - case 1015: - if(cterm->saved_mode_mask & CTERM_SAVEMODE_MOUSE_URXVT) - cterm->mouse_state_change(1015, cterm->saved_mode & CTERM_SAVEMODE_MOUSE_URXVT, cterm->mouse_state_change_cbdata); - break; - } - } - } - if (updfg || updbg) { - attr2palette(cterm->attr, updfg ? &cterm->fg_color : NULL, updbg ? &cterm->bg_color : NULL); - if (updfg) - FREE_AND_NULL(cterm->fg_tc_str); - if (updbg) - FREE_AND_NULL(cterm->bg_tc_str); - } - } - break; - case '{': - if(seq->param_str[0] == '=' && parse_parameters(seq)) { /* Font loading */ - seq_default(seq, 0, 255); - seq_default(seq, 1, 0); - if(seq->param_int[0]>255) - break; - cterm->font_read=0; - cterm->font_slot=seq->param_int[0]; - switch(seq->param_int[1]) { - case 0: - cterm->font_size=4096; - break; - case 1: - cterm->font_size=3584; - break; - case 2: - cterm->font_size=2048; - break; - default: - cterm->font_size=0; - break; - } - } - break; - } - break; - } - else if (seq->ctrl_func[1]) { // Control Function with Intermediate Character - // Shift left - if (strcmp(seq->ctrl_func, " @") == 0) { - row = TERM_MINY; - col = TERM_MINX; - max_row = TERM_MAXY; - max_col = TERM_MAXX; - - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col, &row); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, &max_row); - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if(i > TERM_MAXX) - i = TERM_MAXX; - MOVETEXT(col + i, row, max_col, max_row, col, row); - j = i * TERM_MAXY; - vc = malloc(j * sizeof(*vc)); - if (vc != NULL) { - for(k=0; k < j; k++) { - vc[k].ch=' '; - vc[k].legacy_attr=cterm->attr; - vc[k].fg=cterm->fg_color; - vc[k].bg=cterm->bg_color; - vc[k].font = ciolib_attrfont(cterm->attr); - } - vmem_puttext(max_col - i + 1, row, max_col, max_row, vc); - free(vc); - } - } - // Shift right - else if (strcmp(seq->ctrl_func, " A") == 0) { - row = TERM_MINY; - col = TERM_MINX; - max_row = TERM_MAXY; - max_col = TERM_MAXX; - - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col, &row); - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, &max_row); - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if(i > cterm->width) - i = cterm->width; - MOVETEXT(col, row, max_col - i, max_row, col + i, row); - j = i * TERM_MAXY; - vc = malloc(j * sizeof(*vc)); - if (vc != NULL) { - for(k=0; k < j; k++) { - vc[k].ch=' '; - vc[k].legacy_attr=cterm->attr; - vc[k].fg=cterm->fg_color; - vc[k].bg=cterm->bg_color; - vc[k].font = ciolib_attrfont(cterm->attr); - } - vmem_puttext(col, row, col + i - 1, max_row, vc); - free(vc); - } - } - // Font Select - else if (strcmp(seq->ctrl_func, " D") == 0) { - seq_default(seq, 0, 0); - seq_default(seq, 1, 0); - switch(seq->param_int[0]) { - case 0: /* Four fonts are currently supported */ - case 1: - case 2: - case 3: - /* For compatibility with ciolib.c v1.136-v1.164 */ - /* Feature introduced in CTerm v1.160, return value modified later */ - if (SETFONT(seq->param_int[1],FALSE,seq->param_int[0]+1) == 0) - cterm->setfont_result = 1; - else - cterm->setfont_result = 0; - if(cterm->setfont_result == 0) - cterm->altfont[seq->param_int[0]] = seq->param_int[1]; - break; - } - } - else if (strcmp(seq->ctrl_func, " d") == 0) { - if (seq->param_count > 0) { - delete_tabstop(cterm, seq->param_int[0]); - } - } - /* - * END OF STANDARD CONTROL FUNCTIONS - * AFTER THIS IS ALL PRIVATE EXTENSIONS - */ - // Tab report - else if (strcmp(seq->ctrl_func, "$w") == 0) { - seq_default(seq, 0, 0); - if (seq->param_int[0] == 2) { - strcpy(tmp, "\x1bP2$u"); - p2 = strchr(tmp, 0); - for (i = 0; i < cterm->tab_count && cterm->tabs[i] <= cterm->width; i++) { - if (i != 0) - *(p2++) = '/'; - p2 += sprintf(p2, "%d", cterm->tabs[i]); - } - strcat(p2, "\x1b\\"); - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - } - // Communication speed - else if (strcmp(seq->ctrl_func, "*r") == 0) { - /* - * Ps1 Comm Line Ps2 Communication Speed - * none, 0, 1 Host Transmit none, 0 Use default speed. - * 2 Host Receive 1 300 - * 3 Printer 2 600 - * 4 Modem Hi 3 1200 - * 5 Modem Lo 4 2400 - * 5 4800 - * 6 9600 - * 7 19200 - * 8 38400 - * 9 57600 - * 10 76800 - * 11 115200 - */ - int newspeed=-1; - - seq_default(seq, 0, 0); - seq_default(seq, 1, 0); - - if (seq->param_int[0] < 2) { - switch(seq->param_int[1]) { - case 0: - newspeed=0; - break; - case 1: - newspeed=300; - break; - case 2: - newspeed=600; - break; - case 3: - newspeed=1200; - break; - case 4: - newspeed=2400; - break; - case 5: - newspeed=4800; - break; - case 6: - newspeed=9600; - break; - case 7: - newspeed=19200; - break; - case 8: - newspeed=38400; - break; - case 9: - newspeed=57600; - break; - case 10: - newspeed=76800; - break; - case 11: - newspeed=115200; - break; - } - } - if(newspeed >= 0) - *speed = newspeed; - } - else if (strcmp(seq->ctrl_func, "*y") == 0) { - if (seq->param_count >= 6) { - if (seq->param_int[0] != UINT64_MAX && - seq->param_int[0] <= UINT16_MAX && - seq->param_int[1] == 1 && - seq->param_int[2] != UINT64_MAX && - seq->param_int[3] != UINT64_MAX && - seq->param_int[4] != UINT64_MAX && - seq->param_int[5] != UINT64_MAX) { - struct ciolib_pixels *pix; - uint16_t crc; - int good = 0; - int vmode; - gettextinfo(&ti); - vmode = find_vmode(ti.currmode); - if (vmode != -1 && - (seq->param_int[3] > 0 && seq->param_int[3] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[2] > 0 && seq->param_int[2] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[5] > 0 && seq->param_int[5] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[4] > 0 && seq->param_int[4] < vparams[vmode].charwidth*cterm->width) && - (seq->param_int[2] <= seq->param_int[4]) && - (seq->param_int[3] <= seq->param_int[5]) && - (pix = getpixels( - (seq->param_int[3] - 1 + cterm->x - 1)*vparams[vmode].charwidth, - (seq->param_int[2] - 1 + cterm->y - 1)*vparams[vmode].charheight, - (seq->param_int[5] + cterm->x - 1)*vparams[vmode].charwidth - 1, - (seq->param_int[4] + cterm->y - 1)*vparams[vmode].charheight - 1, true)) != NULL) { - crc = crc16((void *)pix->pixels, sizeof(pix->pixels[0])*pix->width*pix->height); - good = 1; - freepixels(pix); - } - else { - size_t sz = sizeof(struct vmem_cell) * (seq->param_int[2] - seq->param_int[4] + 1) * (seq->param_int[3] - seq->param_int[5] + 1); - struct vmem_cell *vm = malloc(sz); - if (vm != NULL) { - vmem_gettext(seq->param_int[3], seq->param_int[2], seq->param_int[5], seq->param_int[4], vm); - crc = crc16((void *)vm, sz); - good = 1; - } - } - if (good) { - *tmp = 0; - snprintf(tmp, sizeof(tmp), "\x1bP%u!~%04X\x1b\\", (unsigned)seq->param_int[0], crc); - if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - } - } - } - else if (strcmp(seq->ctrl_func, "*z") == 0) { - if (seq->param_count > 0 && seq->param_int[0] <= 63) { - if (cterm->macros[seq->param_int[0]]) { - if ((cterm->in_macro & (1<<seq->param_int[0])) == 0) { - cterm->escbuf[0]=0; - cterm->sequence=0; - cterm->in_macro |= (1<<seq->param_int[0]); - cterm_write(cterm, cterm->macros[seq->param_int[0]], cterm->macro_lens[seq->param_int[0]], retbuf + strlen(retbuf), retsize - strlen(retbuf), speed); - cterm->in_macro &= ~(1<<seq->param_int[0]); - } - } - } - } - } - else { - switch(seq->final_byte) { - case '@': /* Insert Char */ - TERM_XY(&i, &j); - if (i < TERM_MINX || i > TERM_MAXX || j < TERM_MINY || j > TERM_MAXY) - break; - col = i; - row = j; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col, &row); - max_col = TERM_MAXX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, NULL); - seq_default(seq, 0, 1); - if(seq->param_int[0] < 1) - seq->param_int[0] = 1; - if(seq->param_int[0] > cterm->width - j) - seq->param_int[0] = cterm->width - j; - MOVETEXT(col, row, max_col - seq->param_int[0], row, col + seq->param_int[0], row); - for(l=0; l < seq->param_int[0]; l++) - PUTCH(' '); - cterm_gotoxy(cterm, i, j); - break; - case 'A': /* Cursor Up */ - case 'k': /* Line Position Backward */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, 0, 0 - seq->param_int[0], 0); - break; - case 'B': /* Cursor Down */ - case 'e': /* Line Position Forward */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, 0, seq->param_int[0], 0); - break; - case 'a': /* Character Position Forward */ - case 'C': /* Cursor Right */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, seq->param_int[0], 0, 0); - break; - case 'j': /* Character Position Backward */ - case 'D': /* Cursor Left */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, 0 - seq->param_int[0], 0, 0); - break; - case 'E': /* Cursor next line */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, INT_MIN, seq->param_int[0], 0); - break; - case 'F': /* Cursor preceding line */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - adjust_currpos(cterm, INT_MIN, 0 - seq->param_int[0], 0); - break; - case '`': - case 'G': /* Cursor Position Absolute */ - seq_default(seq, 0, 1); - CURR_XY(NULL, &row); - col = seq->param_int[0]; - if(col >= CURR_MINX && col <= CURR_MAXX) { - GOTOXY(col, row); - } - break; - case 'f': /* Character And Line Position */ - case 'H': /* Cursor Position */ - seq_default(seq, 0, 1); - seq_default(seq, 1, 1); - row=seq->param_int[0]; - col=seq->param_int[1]; - if (row < CURR_MINY) - row = CURR_MINY; - if(col < CURR_MINX) - col = CURR_MINX; - if(row > CURR_MAXY) - row = CURR_MAXY; - if(col > CURR_MAXX) - col = CURR_MAXX; - GOTOXY(col, row); - break; - case 'I': /* Cursor Forward Tabulation */ - case 'Y': /* Cursor Line Tabulation */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - for (i = 0; i < seq->param_int[0]; i++) - do_tab(cterm); - break; - case 'J': /* Erase In Page */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: - CLREOL(); - CURR_XY(&col, &row); - for (i = row + 1; i <= TERM_MAXY; i++) { - cterm_gotoxy(cterm, TERM_MINY, i); - CLREOL(); - } - GOTOXY(col, row); - break; - case 1: - clear2bol(cterm); - CURR_XY(&col, &row); - for (i = row - 1; i >= TERM_MINY; i--) { - cterm_gotoxy(cterm, TERM_MINX, i); - CLREOL(); - } - GOTOXY(col, row); - break; - case 2: - cterm_clearscreen(cterm, (char)cterm->attr); - GOTOXY(CURR_MINX, CURR_MINY); - break; - } - break; - case 'K': /* Erase In Line */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: - CLREOL(); - break; - case 1: - clear2bol(cterm); - break; - case 2: - CURR_XY(&col, &row); - cterm_gotoxy(cterm, CURR_MINX, row); - CLREOL(); - GOTOXY(col, row); - break; - } - break; - case 'L': /* Insert line */ - TERM_XY(&col, &row); - if(row < TERM_MINY || row > TERM_MAXY || col < TERM_MINX || col > TERM_MAXX) - break; - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if(i > TERM_MAXY - row) - i = TERM_MAXY - row; - col2 = TERM_MINX; - row2 = row; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col2, &row2); - max_col = TERM_MAXX; - max_row = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, &max_row); - if(i) - MOVETEXT(col2, row2, max_col, max_row - i, col2, row2 + i); - for (j = 0; j < i; j++) { - cterm_gotoxy(cterm, TERM_MINX, row+j); - cterm_clreol(cterm); - } - cterm_gotoxy(cterm, col, row); - break; - case 'M': /* Delete Line (also ANSI music) */ - if(cterm->music_enable==CTERM_MUSIC_ENABLED) { - cterm->music=1; - } - else { - TERM_XY(&col, &row); - if(col >= TERM_MINX && col <= TERM_MAXX && row >= TERM_MINY && row <= TERM_MAXY) { - seq_default(seq, 0, 1); - i = seq->param_int[0]; - dellines(cterm, i); - } - } - break; - case 'N': /* Erase In Field (also ANSI Music) */ - /* BananANSI style... does NOT start with MF or MB */ - /* This still conflicts (ANSI erase field) */ - if(cterm->music_enable >= CTERM_MUSIC_BANSI) - cterm->music=2; - break; - case 'O': /* TODO? Erase In Area */ - break; - case 'P': /* Delete char */ - seq_default(seq, 0, 1); - TERM_XY(&col, &row); - if (col < TERM_MINX || col > TERM_MAXX || row < TERM_MINY || row > TERM_MAXY) - break; - i = seq->param_int[0]; - if(i > TERM_MAXX - col + 1) - i = TERM_MAXX - col + 1; - max_col = TERM_MAXX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &max_col, NULL); - col2 = col; - row2 = row; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_SCREEN, &col2, &row2); - MOVETEXT(col2 + i, row2, max_col, row2, col2, row2); - cterm_gotoxy(cterm, TERM_MAXX - i, row); - cterm_clreol(cterm); - cterm_gotoxy(cterm, col, row); - break; - case 'Q': /* TODO? Select Editing Extent */ - break; - case 'R': /* TODO? Active Position Report */ - break; - case 'S': /* Scroll Up */ - seq_default(seq, 0, 1); - for(j=0; j<seq->param_int[0]; j++) - cterm_scrollup(cterm); - break; - case 'T': /* Scroll Down */ - seq_default(seq, 0, 1); - for(j=0; j<seq->param_int[0]; j++) - scrolldown(cterm); - break; - case 'U': /* TODO? Next Page */ - break; - case 'V': /* TODO? Preceding Page */ - break; - case 'W': /* TODO? Cursor Tabulation Control */ - break; - case 'X': /* Erase Character */ - seq_default(seq, 0, 1); - i=seq->param_int[0]; - CURR_XY(&col, &row); - if(i > CURR_MAXX - col) - i=CURR_MAXX - col; - vc=malloc(i * sizeof(*vc)); - for(k=0; k < i; k++) { - vc[k].ch=' '; - vc[k].legacy_attr=cterm->attr; - vc[k].fg=cterm->fg_color; - vc[k].bg=cterm->bg_color; - vc[k].font = ciolib_attrfont(cterm->attr); - } - col2 = col; - row2 = row; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &col2, &row2); - max_col = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &max_col, NULL); - vmem_puttext(col2, row2, col2 + i - 1, row2, vc); - free(vc); - break; - // for case 'Y': see case 'I': - case 'Z': /* Cursor Backward Tabulation */ - seq_default(seq, 0, 1); - if (seq->param_int[0] < 1) - break; - for (i = 0; i < seq->param_int[0]; i++) - do_backtab(cterm); - break; - case '[': /* TODO? Start Reversed String */ - break; - case '\\': /* TODO? Parallel Texts */ - break; - case ']': /* TODO? Start Directed String */ - break; - case '^': /* TODO? Select Implicit Movement Direction */ - break; - case '_': /* NOT DEFIFINED IN STANDARD */ - break; - // for case '`': see case 'G': - // for case 'a': see case 'C': - case 'b': /* Repeat */ - if (last != 0) { - seq_default(seq, 0, 1); - i = seq->param_int[0]; - if (i > 0) { - p2 = malloc(i+1); - if (p2) { - memset(p2, last, i); - p2[i] = 0; - ctputs(cterm, p2); - free(p2); - } - } - } - break; - case 'c': /* Device Attributes */ - seq_default(seq, 0, 0); - if(!seq->param_int[0]) { - if(retbuf!=NULL) { - if(strlen(retbuf) + strlen(cterm->DA) < retsize) - strcat(retbuf,cterm->DA); - } - } - break; - case 'd': /* Line Position Absolute */ - seq_default(seq, 0, 1); - CURR_XY(&col, NULL); - row = seq->param_int[0]; - if (row < CURR_MINY) - row = CURR_MINY; - if (row > CURR_MAXY) - row = CURR_MAXY; - GOTOXY(col, row); - break; - // for case 'e': see case 'B': - // for case 'f': see case 'H': - case 'g': /* Tabulation Clear */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 0: - delete_tabstop(cterm, WHEREX()); - break; - case 3: - cterm->tab_count = 0; - break; - } - break; - case 'h': /* TODO? Set Mode */ - break; - case 'i': /* ToDo? Media Copy (Printing) */ - break; - // for case 'j': see case 'D': - // for case 'k': see case 'A': - case 'l': /* TODO? Reset Mode */ - break; - case 'm': /* Select Graphic Rendition */ - seq_default(seq, 0, 0); - GETTEXTINFO(&ti); - flags = GETVIDEOFLAGS(); - for (i=0; i < seq->param_count; i++) { - switch(seq->param_int[i]) { - case 0: - cterm->attr=ti.normattr; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 1: - if (!cterm->skypix) - cterm->attr|=8; - if (!(flags & CIOLIB_VIDEO_NOBRIGHT)) { - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - } - break; - case 2: - if (!cterm->skypix) - cterm->attr&=247; - if (!(flags & CIOLIB_VIDEO_NOBRIGHT)) { - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - } - break; - case 4: /* Underscore */ - break; - case 5: - case 6: - if (!cterm->skypix) - cterm->attr|=128; - if (flags & CIOLIB_VIDEO_BGBRIGHT) { - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - } - break; - case 7: - j=cterm->attr&112; - cterm->attr = (cterm->attr << 4) & 0x70; - cterm->attr |= j>>4; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 8: - j=cterm->attr&112; - cterm->attr&=112; - cterm->attr |= j>>4; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 22: - cterm->attr &= 0xf7; - if (!(flags & CIOLIB_VIDEO_NOBRIGHT)) { - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - } - break; - case 25: - cterm->attr &= 0x7f; - if (flags & CIOLIB_VIDEO_BGBRIGHT) { - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - } - break; - case 27: - i=cterm->attr&7; - j=cterm->attr&112; - cterm->attr &= 136; - cterm->attr |= j>>4; - cterm->attr |= i<<4; - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 30: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 0); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 31: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 4); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 32: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 2); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 33: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 6); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 34: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 1); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 35: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 5); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 36: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 3); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 38: - parse_extended_colour(seq, &i, cterm, 1); - break; - case 37: - case 39: - cterm->attr&=248; - cterm->attr |= skypix_color(cterm, 7); - attr2palette(cterm->attr, &cterm->fg_color, NULL); - FREE_AND_NULL(cterm->fg_tc_str); - break; - case 49: - case 40: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 0) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 41: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 4) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 42: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 2) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 43: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 6) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 44: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 1) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 45: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 5) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 46: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 3) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 47: - cterm->attr&=143; - cterm->attr |= skypix_color(cterm, 7) << 4; - attr2palette(cterm->attr, NULL, &cterm->bg_color); - FREE_AND_NULL(cterm->bg_tc_str); - break; - case 48: - parse_extended_colour(seq, &i, cterm, 0); - break; - } - } - TEXTATTR(cterm->attr); - setcolour(cterm->fg_color, cterm->bg_color); - break; - case 'n': /* Device Status Report */ - seq_default(seq, 0, 0); - switch(seq->param_int[0]) { - case 5: - if(retbuf!=NULL) { - strcpy(tmp,"\x1b[0n"); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf,tmp); - } - break; - case 6: - if(retbuf!=NULL) { - CURR_XY(&col, &row); - sprintf(tmp,"\x1b[%d;%dR",row,col); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf,tmp); - } - break; - case 255: - if (retbuf != NULL) { - sprintf(tmp, "\x1b[%d;%dR", CURR_MAXY, CURR_MAXX); - if (strlen(retbuf) + strlen(tmp) < retsize) { - strcat(retbuf, tmp); - } - } - break; - } - break; - case 'o': /* ToDo? Define Area Qualification */ - break; - /* - * END OF STANDARD CONTROL FUNCTIONS - * AFTER THIS IS ALL PRIVATE EXTENSIONS - */ - case 'p': /* ToDo? ANSI keyboard reassignment, pointer mode */ - break; - case 'q': /* ToDo? VT100 keyboard lights, cursor style, protection */ - break; - case 'r': /* Scrolling reigon */ - seq_default(seq, 0, 1); - seq_default(seq, 1, cterm->height); - row = seq->param_int[0]; - max_row = seq->param_int[1]; - if(row >= ABS_MINY && max_row > row && max_row <= ABS_MAXY) { - cterm->top_margin = row; - cterm->bottom_margin = max_row; - setwindow(cterm); - GOTOXY(CURR_MINX, CURR_MINY); - } - break; - case 's': - if (cterm->extattr & CTERM_EXTATTR_DECLRMM) { - seq_default(seq, 0, ABS_MINX); - seq_default(seq, 1, ABS_MAXX); - col = seq->param_int[0]; - if (col == 0) - col = cterm->left_margin; - max_col = seq->param_int[1]; - if (max_col == 0) - max_col = cterm->right_margin; - if(col >= ABS_MINX && max_col > col && max_col <= ABS_MAXX) { - cterm->left_margin = col; - cterm->right_margin = max_col; - setwindow(cterm); - GOTOXY(CURR_MINX, CURR_MINY); - } - } - else { - CURR_XY(&cterm->save_xpos, &cterm->save_ypos); - } - break; - case 't': - if (seq->param_count >= 4) { - uint32_t *c = NULL; - uint32_t nc; - - if (seq->param_int[0] == 0) - c = &cterm->bg_color; - else if (seq->param_int[0] == 1) - c = &cterm->fg_color; - if (c == NULL) - break; - nc = map_rgb(seq->param_int[1]<<8, seq->param_int[2]<<8, seq->param_int[3]<<8); - if (nc != UINT32_MAX) - *c = nc; - setcolour(cterm->fg_color, cterm->bg_color); - } - break; - case 'u': - if(cterm->save_ypos>0 && cterm->save_ypos<=cterm->height - && cterm->save_xpos>0 && cterm->save_xpos<=cterm->width) { - // TODO: What to do about the window when position is restored... - // Absolute position stored? Relative? - if(cterm->save_ypos < CURR_MINY || cterm->save_ypos > CURR_MAXY || cterm->save_xpos < CURR_MINX || cterm->save_xpos > CURR_MAXX) - break; - GOTOXY(cterm->save_xpos, cterm->save_ypos); - } - break; - case 'y': /* ToDo? VT100 Tests */ - break; - case 'z': /* ToDo? Reset */ - break; - case '|': /* SyncTERM ANSI Music */ - cterm->music=1; - break; - } - } - break; - case 'E': // Next Line - adjust_currpos(cterm, INT_MIN, 1, 1); - break; - case 'H': - insert_tabstop(cterm, WHEREX()); - break; - case 'M': // Previous line - adjust_currpos(cterm, 0, -1, 1); - break; - case 'P': // Device Control String - DCS - cterm->string = CTERM_STRING_DCS; - cterm->sixel = SIXEL_POSSIBLE; - cterm->macro = MACRO_POSSIBLE; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case 'X': // Start Of String - SOS - cterm->string = CTERM_STRING_SOS; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case 'c': - CLRSCR(); - cterm_reset(cterm); - cterm_gotoxy(cterm, CURR_MINX, CURR_MINY); - break; - case '\\': - if (cterm->strbuf) { - if (cterm->strbufsize == cterm->strbuflen-1) { - p = realloc(cterm->strbuf, cterm->strbufsize+1); - if (p == NULL) { - // SO CLOSE! - cterm->string = 0; - } - else { - cterm->strbuf = p; - cterm->strbufsize++; - } - } - cterm->strbuf[cterm->strbuflen] = 0; - switch (cterm->string) { - case CTERM_STRING_APC: - if (cterm->apc_handler) - cterm->apc_handler(cterm->strbuf, cterm->strbuflen, cterm->apc_handler_data); - break; - case CTERM_STRING_DCS: - if (cterm->sixel == SIXEL_STARTED) - parse_sixel_string(cterm, true); - else if (cterm->macro == MACRO_STARTED) - parse_macro_string(cterm, true); - else { - if (strncmp(cterm->strbuf, "CTerm:Font:", 11) == 0) { - cterm->font_slot = strtoul(cterm->strbuf+11, &p, 10); - if(cterm->font_slot < CONIO_FIRST_FREE_FONT) - break; - if (cterm->font_slot > 255) - break; - if (p && *p == ':') { - p++; - i = b64_decode(cterm->fontbuf, sizeof(cterm->fontbuf), p, 0); - p2 = malloc(i); - if (p2) { - memcpy(p2, cterm->fontbuf, i); - replace_font(cterm->font_slot, strdup("Remote Defined Font"), p2, i); - } - } - } - else if (strncmp(cterm->strbuf, "$q", 2) == 0) { - // DECRQSS - VT-420 - switch (cterm->strbuf[2]) { - case 'm': - if (cterm->strbuf[3] == 0) { - strcpy(tmp, "\x1bP1$r0"); - if (cterm->attr & 8) - strcat(tmp, ";1"); - if (cterm->attr & 128) - strcat(tmp, ";5"); - if (cterm->fg_tc_str == NULL) { - switch (cterm->attr & 7) { - case 0: - strcat(tmp, ";30"); - break; - case 1: - strcat(tmp, ";34"); - break; - case 2: - strcat(tmp, ";32"); - break; - case 3: - strcat(tmp, ";36"); - break; - case 4: - strcat(tmp, ";31"); - break; - case 5: - strcat(tmp, ";35"); - break; - case 6: - strcat(tmp, ";33"); - break; - } - } - if (cterm->bg_tc_str == NULL) { - switch ((cterm->attr >> 4) & 7) { - case 1: - strcat(tmp, ";44"); - break; - case 2: - strcat(tmp, ";42"); - break; - case 3: - strcat(tmp, ";46"); - break; - case 4: - strcat(tmp, ";41"); - break; - case 5: - strcat(tmp, ";45"); - break; - case 6: - strcat(tmp, ";43"); - break; - case 7: - strcat(tmp, ";47"); - break; - } - } - if (cterm->fg_tc_str) { - strcat(tmp, ";"); - strcat(tmp, cterm->fg_tc_str); - } - if (cterm->bg_tc_str) { - strcat(tmp, ";"); - strcat(tmp, cterm->bg_tc_str); - } - strcat(tmp, "m\x1b\\"); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 'r': - if (cterm->strbuf[3] == 0) { - sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->top_margin, cterm->bottom_margin); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 's': - if (cterm->strbuf[3] == 0) { - sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->left_margin, cterm->right_margin); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case 't': - if (cterm->strbuf[3] == 0) { - sprintf(tmp, "\x1bP1$r%dt\x1b\\", cterm->height); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case '$': - if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) { - sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->width); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - case '*': - if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) { - sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->height); - if(strlen(retbuf)+strlen(tmp) < retsize) - strcat(retbuf, tmp); - } - break; - default: - if(retbuf!=NULL) { - strcpy(tmp,"\x1b[0n"); - // TODO: If the string is too long, this is likely terrible. - if (strlen(retbuf)+5 < retsize) - strcat(retbuf, "\x1bP0$r"); - if (strlen(retbuf)+strlen(&cterm->strbuf[2]) < retsize) - strcat(retbuf, &cterm->strbuf[2]); - if (strlen(retbuf)+2 < retsize) - strcat(retbuf, "\x1b_"); - } - } - } - } - cterm->sixel = SIXEL_INACTIVE; - break; - case CTERM_STRING_OSC: - /* Is this an xterm Change Color(s)? */ - if (cterm->strbuf[0] == '4' && cterm->strbuf[1] == ';') { - unsigned long index = ULONG_MAX; - char *seqlast; - - p2 = &cterm->strbuf[2]; - while ((p = strtok_r(p2, ";", &seqlast)) != NULL) { - p2=NULL; - if (index == ULONG_MAX) { - index = strtoull(p, NULL, 10); - if (index == ULONG_MAX || index > 13200) - break; - } - else { - - if (strncmp(p, "rgb:", 4)) - break; - char *p3; - char *p4; - char *collast; - uint16_t rgb[3]; - int ccount = 0; - bool broken=false; - - p4 = &p[4]; - while (ccount < 3 && (p3 = strtok_r(p4, "/", &collast))!=NULL) { - p4 = NULL; - unsigned long v; - v = strtoul(p3, NULL, 16); - if (v > UINT16_MAX) - break; - switch(strlen(p3)) { - case 1: // 4-bit colour - rgb[ccount] = v | (v<<4) | (v<<8) | (v<<12); - break; - case 2: // 8-bit colour - rgb[ccount] = v | (v<<8); - break; - case 3: // 12-bit colour - rgb[ccount] = (v & 0x0f) | (v<<4); - break; - case 4: - rgb[ccount] = v; - break; - default: - broken = true; - break; - } - ccount++; - } - if (ccount == 3 && !broken) - setpalette(index + palette_offset, rgb[0], rgb[1], rgb[2]); - index = ULONG_MAX; - } - } - } - else if (strncmp("104", cterm->strbuf, 3)==0) { - if (strlen(cterm->strbuf) == 3) { - // Reset all colours - for (i=0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) - setpalette(i + palette_offset, dac_default[i].red << 8 | dac_default[i].red, dac_default[i].green << 8 | dac_default[i].green, dac_default[i].blue << 8 | dac_default[i].blue); - } - else if(cterm->strbuf[3] == ';') { - char *seqlast; - unsigned long pi; - - p2 = &cterm->strbuf[4]; - while ((p = strtok_r(p2, ";", &seqlast)) != NULL) { - p2=NULL; - pi = strtoull(p, NULL, 10); - if (pi < sizeof(dac_default)/sizeof(struct dac_colors)) - setpalette(pi + palette_offset, dac_default[pi].red << 8 | dac_default[pi].red, dac_default[pi].green << 8 | dac_default[pi].green, dac_default[pi].blue << 8 | dac_default[pi].blue); - } - } - } - break; - } - } - FREE_AND_NULL(cterm->strbuf); - cterm->strbufsize = cterm->strbuflen = 0; - cterm->string = 0; - break; - case ']': // Operating System Command - OSC - cterm->string = CTERM_STRING_OSC; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case '^': // Privacy Message - PM - cterm->string = CTERM_STRING_PM; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - case '_': // Application Program Command - APC - cterm->string = CTERM_STRING_APC; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuf = malloc(1024); - cterm->strbufsize = 1024; - cterm->strbuflen = 0; - break; - } - } - free_sequence(seq); - cterm->escbuf[0]=0; - cterm->sequence=0; -} - -static void -c64_set_reverse(struct cterminal *cterm, int on) -{ - if (on != cterm->c64reversemode) - cterm->c64reversemode = on; -} - -static uint8_t -c64_get_attr(struct cterminal *cterm) -{ - if (cterm->c64reversemode) - return (cterm->attr >> 4 | cterm->attr << 4); - return cterm->attr; -} - -static void -cterm_reset(struct cterminal *cterm) -{ - int i; - struct text_info ti; - - cterm->altfont[0] = cterm->altfont[1] = cterm->altfont[2] = cterm->altfont[3] = getfont(1); - cterm->top_margin=1; - cterm->bottom_margin=cterm->height; - cterm->left_margin=1; - cterm->right_margin=cterm->width; - cterm->save_xpos=0; - cterm->save_ypos=0; - cterm->escbuf[0]=0; - cterm->sequence=0; - cterm->string = 0; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = 0; - cterm->strbufsize = 0; - cterm->musicbuf[0] = 0; - cterm->music_enable=CTERM_MUSIC_BANSI; - cterm->music=0; - cterm->tempo=120; - cterm->octave=4; - cterm->notelen=4; - cterm->noteshape=CTERM_MUSIC_NORMAL; - cterm->musicfore=TRUE; - cterm->backpos=0; - cterm->xpos = TERM_MINX; - cterm->ypos = TERM_MINY; - cterm->cursor=_NORMALCURSOR; - cterm->extattr = CTERM_EXTATTR_AUTOWRAP | CTERM_EXTATTR_SXSCROLL; - FREE_AND_NULL(cterm->tabs); - cterm->tabs = malloc(sizeof(cterm_tabs)); - if (cterm->tabs) { - memcpy(cterm->tabs, cterm_tabs, sizeof(cterm_tabs)); - cterm->tab_count = sizeof(cterm_tabs) / sizeof(cterm_tabs[0]); - } - else - cterm->tab_count = 0; - cterm->setfont_result = CTERM_NO_SETFONT_REQUESTED; - cterm->saved_mode = 0; - cterm->saved_mode_mask = 0; - cterm->c64reversemode = 0; - gettextinfo(&ti); - switch (ti.currmode) { - case C64_40X25: - case C128_40X25: - case C128_80X25: - cterm->attr = 15; - break; - default: - cterm->attr = ti.normattr; - break; - } - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - cterm->doorway_mode = 0; - cterm->doorway_char = 0; - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - cterm->sixel = SIXEL_INACTIVE; - cterm->sx_iv = 0; - cterm->sx_ih = 0; - cterm->sx_trans = 0; - cterm->sx_repeat = 0; - cterm->sx_left = 0; - cterm->sx_x = 0; - cterm->sx_y = 0; - cterm->sx_bg = 0; - cterm->sx_fg = 0; - cterm->sx_pixels_sent = 0; - cterm->sx_first_pass = 0; - cterm->sx_hold_update = 0; - cterm->sx_start_x = 0; - cterm->sx_start_y = 0; - cterm->sx_row_max_x = 0; - FREE_AND_NULL(cterm->sx_pixels); - cterm->sx_width = 0; - cterm->sx_height = 0; - FREE_AND_NULL(cterm->sx_mask); - for (i = 0; i < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); i++) { - FREE_AND_NULL(cterm->macros[i]); - cterm->macro_lens[i] = 0; - } - setwindow(cterm); - - /* Set up tabs for ATASCII */ - if(cterm->emulation == CTERM_EMULATION_ATASCII) { - for(i=0; i<cterm->tab_count; i++) - cterm->escbuf[cterm->tabs[i]]=1; - } - - /* Set up a shadow palette */ - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) { - for (i=0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) - setpalette(i + 16, dac_default[i].red << 8 | dac_default[i].red, dac_default[i].green << 8 | dac_default[i].green, dac_default[i].blue << 8 | dac_default[i].blue); - } - - /* Reset mouse state */ - if (cterm->mouse_state_change) { - cterm->mouse_state_change(9, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1000, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1001, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1002, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1003, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1004, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1005, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1006, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1007, 0, cterm->mouse_state_change_cbdata); - cterm->mouse_state_change(1015, 0, cterm->mouse_state_change_cbdata); - } -} - -struct cterminal* cterm_init(int height, int width, int xpos, int ypos, int backlines, int backcols, struct vmem_cell *scrollback, int emulation) -{ - char *revision="$Revision: 1.314 $"; - char *in; - char *out; - struct cterminal *cterm; - - if((cterm=calloc(1, sizeof(struct cterminal)))==NULL) - return cterm; - -#ifndef CTERM_WITHOUT_CONIO - cterm->ciolib_gotoxy=ciolib_gotoxy; - cterm->ciolib_wherex=ciolib_wherex; - cterm->ciolib_wherey=ciolib_wherey; - cterm->ciolib_vmem_gettext=ciolib_vmem_gettext; - cterm->ciolib_gettext=ciolib_gettext; - cterm->ciolib_gettextinfo=ciolib_gettextinfo; - cterm->ciolib_textattr=ciolib_textattr; - cterm->ciolib_setcursortype=ciolib_setcursortype; - cterm->ciolib_movetext=ciolib_movetext; - cterm->ciolib_clreol=ciolib_clreol; - cterm->ciolib_clrscr=ciolib_clrscr; - cterm->ciolib_setvideoflags=ciolib_setvideoflags; - cterm->ciolib_getvideoflags=ciolib_getvideoflags; - cterm->ciolib_setscaling=ciolib_setscaling; - cterm->ciolib_getscaling=ciolib_getscaling; - cterm->ciolib_putch=ciolib_putch; - cterm->ciolib_puttext=ciolib_puttext; - cterm->ciolib_window=ciolib_window; - cterm->ciolib_cputs=ciolib_cputs; - cterm->ciolib_setfont=ciolib_setfont; - cterm->_wscroll=&_wscroll; - cterm->puttext_can_move=&puttext_can_move; - cterm->hold_update=&hold_update; -#endif - - cterm->x=xpos; - cterm->y=ypos; - cterm->height=height; - cterm->width=width; - cterm->backlines=backlines; - cterm->backwidth = backcols; - cterm->scrollback=scrollback; - cterm->log=CTERM_LOG_NONE; - cterm->logfile=NULL; - cterm->emulation=emulation; - cterm_reset(cterm); - if(cterm->scrollback!=NULL) - memset(cterm->scrollback, 0, cterm->backwidth * cterm->backlines * sizeof(*cterm->scrollback)); - strcpy(cterm->DA,"\x1b[=67;84;101;114;109;"); - out=strchr(cterm->DA, 0); - if(out != NULL) { - for(in=revision; *in; in++) { - if(isdigit(*in)) - *(out++)=*in; - if(*in=='.') - *(out++)=';'; - } - *out=0; - } - strcat(cterm->DA,"c"); - /* Fire up note playing thread */ - if(!cterm->playnote_thread_running) { - listInit(&cterm->notes, LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - sem_init(&cterm->note_completed_sem,0,0); - sem_init(&cterm->playnote_thread_terminated,0,0); - _beginthread(playnote_thread, 0, cterm); - } - - return cterm; -} - -void cterm_start(struct cterminal *cterm) -{ - struct text_info ti; - - if (!cterm->started) { - GETTEXTINFO(&ti); - switch (ti.currmode) { - case C64_40X25: - case C128_40X25: - case C128_80X25: - cterm->attr = 15; - break; - default: - cterm->attr = ti.normattr; - break; - } - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - cterm->fg_color += 16; - cterm->bg_color += 16; - TEXTATTR(cterm->attr); - ciolib_setcolour(cterm->fg_color, cterm->bg_color); - SETCURSORTYPE(cterm->cursor); - cterm->started=1; - setwindow(cterm); - cterm_clearscreen(cterm, cterm->attr); - cterm_gotoxy(cterm, 1, 1); - } -} - -static void -advance_char(struct cterminal *cterm, int *x, int *y, int move) -{ - int lm = cterm->left_margin; - int rm = cterm->right_margin; - int bm = cterm->bottom_margin; - - if((*x == rm || *x == CURR_MAXX) && (!(cterm->extattr & CTERM_EXTATTR_AUTOWRAP))) { - GOTOXY(*x, *y); - return; - } - else { - if(*y == bm && (*x == rm || *x == CURR_MAXX)) { - cond_scrollup(cterm); - move = 1; - *x = lm; - } - else { - if(*x == rm || *x == CURR_MAXX) { - *x=lm; - if (*y < CURR_MAXY) - (*y)++; - if (move) - GOTOXY(*x, *y); - } - else { - (*x)++; - } - } - } - if (move) - GOTOXY(*x, *y); -} - -static void -ctputs(struct cterminal *cterm, char *buf) -{ - char *outp; - char *p; - int oldscroll; - int cx, cy; - int lm, rm, bm; - - if (cterm->font_render) { - cterm->font_render(buf); - return; - } - - outp = buf; - oldscroll = *cterm->_wscroll; - *cterm->_wscroll = 0; - CURR_XY(&cx, &cy); - if (cterm->log == CTERM_LOG_ASCII && cterm->logfile != NULL) - fputs(buf, cterm->logfile); - lm = TERM_MINX; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &lm, NULL); - rm = TERM_MAXX; - bm = TERM_MAXY; - coord_conv_xy(cterm, CTERM_COORD_TERM, CTERM_COORD_CURR, &rm, &bm); - for (p = buf; *p; p++) { - switch(*p) { - case '\r': - *p = 0; - CPUTS(outp); - outp = p + 1; - adjust_currpos(cterm, INT_MIN, 0, 0); - CURR_XY(&cx, &cy); - break; - case '\n': - *p = 0; - CPUTS(outp); - outp = p + 1; - adjust_currpos(cterm, 0, 1, 1); - CURR_XY(&cx, &cy); - break; - case '\b': - *p=0; - CPUTS(outp); - outp = p + 1; - adjust_currpos(cterm, -1, 0, 0); - CURR_XY(&cx, &cy); - break; - case 7: /* Bell */ - break; - case '\t': - *p=0; - CPUTS(outp); - outp=p+1; - do_tab(cterm); - CURR_XY(&cx, &cy); - break; - default: - if (cx == cterm->right_margin || cx == CURR_MAXX) { - char ch; - ch = *(p + 1); - *(p + 1) = 0; - CPUTS(outp); - *(p+1) = ch; - outp = p + 1; - } - advance_char(cterm, &cx, &cy, 0); - break; - } - } - CPUTS(outp); - *cterm->_wscroll=oldscroll; -} - -static void parse_sixel_intro(struct cterminal *cterm) -{ - size_t i; - - if (cterm->sixel != SIXEL_POSSIBLE) - return; - - i = strspn(cterm->strbuf, "0123456789;"); - - if (i >= cterm->strbuflen) - return; - - if (cterm->strbuf[i] == 'q') { - int ratio, hgrid; - int vmode; - struct text_info ti; - char *p; - - cterm->sixel = SIXEL_STARTED; - cterm->sx_repeat = 0; - cterm->sx_pixels_sent = 0; - cterm->sx_first_pass = 1; - cterm->sx_height = 0; - cterm->sx_width = 0; - cterm->sx_hold_update = *cterm->hold_update; - *cterm->hold_update = 0; - - GETTEXTINFO(&ti); - vmode = find_vmode(ti.currmode); - if (vmode == -1) { - cterm->sixel = SIXEL_INACTIVE; - return; - } - attr2palette(ti.attribute, &cterm->sx_fg, &cterm->sx_bg); - if (cterm->extattr & CTERM_EXTATTR_SXSCROLL) { - TERM_XY(&cterm->sx_start_x, &cterm->sx_start_y); - cterm->sx_left = cterm->sx_x = (cterm->sx_start_x - 1) * vparams[vmode].charwidth; - cterm->sx_y = (cterm->sx_start_y - 1) * vparams[vmode].charheight; - } - else { - cterm->sx_x = cterm->sx_left = cterm->sx_y = 0; - TERM_XY(&cterm->sx_start_x, &cterm->sx_start_y); - } - cterm->sx_orig_cursor = cterm->cursor; - cterm->cursor = _NOCURSOR; - SETCURSORTYPE(cterm->cursor); - cterm_gotoxy(cterm, TERM_MINX, TERM_MINY); - *cterm->hold_update = 1; - cterm->sx_trans = hgrid = 0; - ratio = strtoul(cterm->strbuf, &p, 10); - if (*p == ';') { - p++; - cterm->sx_trans = strtoul(p, &p, 10); - } - if (*p == ';') { - p++; - hgrid = strtoul(p, &p, 10); - } - switch (ratio) { - default: - case 0: - case 1: - cterm->sx_iv = 2; - cterm->sx_ih = 1; - break; - case 2: - cterm->sx_iv = 5; - cterm->sx_ih = 1; - break; - case 3: - case 4: - cterm->sx_iv = 3; - cterm->sx_ih = 1; - break; - case 5: - case 6: - cterm->sx_iv = 2; - cterm->sx_ih = 1; - break; - case 7: - case 8: - case 9: - cterm->sx_iv = 1; - cterm->sx_ih = 1; - break; - } - cterm->strbuflen = 0; - } - else if (cterm->strbuf[i] != 'q') - cterm->sixel = SIXEL_INACTIVE; -} - -static void parse_macro_intro(struct cterminal *cterm) -{ - size_t i; - - if (cterm->macro != MACRO_POSSIBLE) - return; - - i = strspn(cterm->strbuf, "0123456789;"); - - if (i >= cterm->strbuflen) - return; - - if (cterm->strbuf[i] != '!') { - cterm->macro = MACRO_INACTIVE; - return; - } - i++; - if (i >= cterm->strbuflen) - return; - - if (cterm->strbuf[i] == 'z') { - char *p; - unsigned long res; - - // Parse parameters... - cterm->macro_num = -1; - cterm->macro_del = MACRO_DELETE_OLD; - cterm->macro_encoding = MACRO_ENCODING_ASCII; - res = strtoul(cterm->strbuf, &p, 10); - if (res != ULONG_MAX) - cterm->macro_num = res; - if (*p == ';') { - p++; - res = strtoul(p, &p, 10); - if (res != ULONG_MAX) - cterm->macro_del = res; - else - cterm->macro_del = -1; - } - if (*p == ';') { - p++; - res = strtoul(p, &p, 10); - if (res != ULONG_MAX) - cterm->macro_encoding = res; - else - cterm->macro_encoding = -1; - } - if (cterm->macro_num < 0 || cterm->macro_num > 63) - cterm->macro = MACRO_INACTIVE; - else if (cterm->macro_del < 0 || cterm->macro_del > 1) - cterm->macro = MACRO_INACTIVE; - else if (cterm->macro_encoding < 0 || cterm->macro_encoding > 1) - cterm->macro = MACRO_INACTIVE; - else { - cterm->macro = MACRO_STARTED; - cterm->strbuflen = 0; - } - } - else if (cterm->strbuf[i] != 'z') - cterm->macro = MACRO_INACTIVE; -} - -#define ustrlen(s) strlen((const char *)s) -#define uctputs(c, p) ctputs(c, (char *)p) -#define ustrcat(b, s) strcat((char *)b, (const char *)s) - -CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int buflen, char *retbuf, size_t retsize, int *speed) -{ - const unsigned char *buf = (unsigned char *)vbuf; - unsigned char ch[2]; - unsigned char prn[BUFSIZE]; - int i, j, k, x, y; - int sx, sy, ex, ey; - struct text_info ti; - int olddmc; - int oldptnm; - uint32_t palette[16]; - int mpalette; - struct vmem_cell tmpvc[1]; - int orig_fonts[4]; - char lastch = 0; - int palette_offset = 0; - - if(!cterm->started) - cterm_start(cterm); - - /* Now rejigger the current modes palette... */ - if (cio_api.options & CONIO_OPT_EXTENDED_PALETTE) - palette_offset = 16; - mpalette = get_modepalette(palette); - if (mpalette) { - for (i=0; i < 16; i++) - palette[i] += palette_offset; - set_modepalette(palette); - } - - /* Deedle up the fonts */ - orig_fonts[0] = getfont(1); - orig_fonts[1] = getfont(2); - orig_fonts[2] = getfont(3); - orig_fonts[3] = getfont(4); - setfont(cterm->altfont[0], FALSE, 1); - setfont(cterm->altfont[1], FALSE, 2); - setfont(cterm->altfont[2], FALSE, 3); - setfont(cterm->altfont[3], FALSE, 4); - - oldptnm=*cterm->puttext_can_move; - *cterm->puttext_can_move=1; - olddmc=*cterm->hold_update; - *cterm->hold_update=1; - if(retbuf!=NULL) - retbuf[0]=0; - GETTEXTINFO(&ti); - setwindow(cterm); - x = cterm->xpos; - y = cterm->ypos; - coord_conv_xy(cterm, CTERM_COORD_ABSTERM, CTERM_COORD_CURR, &x, &y); - GOTOXY(x, y); - TEXTATTR(cterm->attr); - setcolour(cterm->fg_color, cterm->bg_color); - SETCURSORTYPE(cterm->cursor); - ch[1]=0; - if(buflen==-1) - buflen=ustrlen(buf); - switch(buflen) { - case 0: - break; - default: - if(cterm->log==CTERM_LOG_RAW && cterm->logfile != NULL) - fwrite(buf, buflen, 1, cterm->logfile); - prn[0]=0; - for(j=0;j<buflen;j++) { - if(ustrlen(prn) >= sizeof(prn)-sizeof(cterm->escbuf)) { - uctputs(cterm, prn); - prn[0]=0; - } - ch[0]=buf[j]; - if (cterm->string && !cterm->sequence) { - switch (cterm->string) { - case CTERM_STRING_DCS: - /* 0x08-0x0d, 0x20-0x7e */ - case CTERM_STRING_APC: - /* 0x08-0x0d, 0x20-0x7e */ - case CTERM_STRING_OSC: - /* 0x08-0x0d, 0x20-0x7e */ - case CTERM_STRING_PM: - /* 0x08-0x0d, 0x20-0x7e */ - if (ch[0] < 8 || (ch[0] > 0x0d && ch[0] < 0x20) || ch[0] > 0x7e) { - if (ch[0] == 27) { - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - break; - } - else { - cterm->string = 0; - /* Just toss out the string and this char */ - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - cterm->sixel = SIXEL_INACTIVE; - } - } - else { - if (cterm->strbuf) { - cterm->strbuf[cterm->strbuflen++] = ch[0]; - if (cterm->strbuflen == cterm->strbufsize) { - char *p; - - cterm->strbufsize *= 2; - if (cterm->strbufsize > 1024 * 1024 * 512) { - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - } - else { - p = realloc(cterm->strbuf, cterm->strbufsize); - if (p == NULL) { - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - } - else - cterm->strbuf = p; - } - } - cterm->strbuf[cterm->strbuflen] = 0; - switch(cterm->sixel) { - case SIXEL_STARTED: - parse_sixel_string(cterm, false); - break; - case SIXEL_POSSIBLE: - parse_sixel_intro(cterm); - break; - } - switch(cterm->macro) { - case MACRO_STARTED: - parse_macro_string(cterm, false); - break; - case MACRO_POSSIBLE: - parse_macro_intro(cterm); - break; - } - } - } - break; - case CTERM_STRING_SOS: - /* Anything but SOS or ST (ESC X or ESC \) */ - if ((ch[0] == 'X' || ch[0] == '\\') && - cterm->strbuf && cterm->strbuflen && - cterm->strbuf[cterm->strbuflen-1] == '\x1b') { - cterm->strbuflen--; - cterm->string = 0; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - if (retbuf) { - cterm_write(cterm, "\x1b", 1, retbuf+strlen(retbuf), retsize-strlen(retbuf), speed); - cterm_write(cterm, &ch[0], 1, retbuf+strlen(retbuf), retsize-strlen(retbuf), speed); - } - } - else { - if (cterm->strbuf == NULL) { - cterm->string = 0; - cterm->strbuflen = cterm->strbufsize = 0; - } - else { - cterm->strbuf[cterm->strbuflen++] = ch[0]; - if (cterm->strbuflen == cterm->strbufsize) { - char *p; - - cterm->strbufsize *= 2; - if (cterm->strbufsize > 1024 * 1024 * 512) { - FREE_AND_NULL(cterm->strbuf); - cterm->string = 0; - cterm->strbuflen = cterm->strbufsize = 0; - } - else { - p = realloc(cterm->strbuf, cterm->strbufsize); - if (p == NULL) { - cterm->string = 0; - FREE_AND_NULL(cterm->strbuf); - cterm->strbuflen = cterm->strbufsize = 0; - } - else - cterm->strbuf = p; - } - } - cterm->strbuf[cterm->strbuflen] = 0; - } - } - break; - } - } - else if(cterm->font_size) { - cterm->fontbuf[cterm->font_read++]=ch[0]; - if(cterm->font_read == cterm->font_size) { -#ifndef CTERM_WITHOUT_CONIO - char *buf2; - - if((buf2=(char *)malloc(cterm->font_size))!=NULL) { - memcpy(buf2,cterm->fontbuf,cterm->font_size); - if(cterm->font_slot >= CONIO_FIRST_FREE_FONT && cterm->font_slot < 256) { - replace_font(cterm->font_slot, strdup("Remote Defined Font"), buf2, cterm->font_size); - } - else - FREE_AND_NULL(buf2); - } -#endif - cterm->font_size=0; - } - } - else if(cterm->sequence) { - ustrcat(cterm->escbuf,ch); - switch(legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) { - case SEQ_BROKEN: - /* Broken sequence detected */ - ustrcat(prn,"\033"); - ustrcat(prn,cterm->escbuf); - cterm->escbuf[0]=0; - cterm->sequence=0; - if(ch[0]=='\033') { /* Broken sequence followed by a legal one! */ - if(prn[0]) /* Don't display the ESC */ - prn[ustrlen(prn)-1]=0; - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - } - break; - case SEQ_INCOMPLETE: - break; - case SEQ_COMPLETE: - do_ansi(cterm, retbuf, retsize, speed, lastch); - lastch = 0; - break; - } - } - else if (cterm->music) { - if(ch[0]==14) { - *cterm->hold_update=0; - *cterm->puttext_can_move=0; - CURR_XY(&x, &y); - GOTOXY(x, y); - SETCURSORTYPE(cterm->cursor); - *cterm->hold_update=1; - *cterm->puttext_can_move=1; - play_music(cterm); - } - else { - if(strchr(musicchars,ch[0])!=NULL) - ustrcat(cterm->musicbuf,ch); - else { - /* Kill non-music strings */ - cterm->music=0; - cterm->musicbuf[0]=0; - } - } - } - else { - if(cterm->emulation == CTERM_EMULATION_ATASCII) { - if(cterm->attr==7) { - switch(buf[j]) { - case 27: /* ESC */ - cterm->attr=1; - break; - case 28: /* Up (TODO: Wraps??) */ - CURR_XY(&x, &y); - y--; - if(y < CURR_MINY) - y = CURR_MINY; - GOTOXY(x, y); - break; - case 29: /* Down (TODO: Wraps??) */ - CURR_XY(&x, &y); - y++; - if(y > CURR_MAXY) - y = CURR_MAXY; - GOTOXY(x, y); - break; - case 30: /* Left (TODO: Wraps around to same line?) */ - CURR_XY(&x, &y); - x--; - if(x < CURR_MINX) - y = CURR_MINX; - GOTOXY(x, y); - break; - case 31: /* Right (TODO: Wraps around to same line?) */ - CURR_XY(&x, &y); - x++; - if(x > CURR_MAXX) - y = CURR_MAXX; - GOTOXY(x, y); - break; - case 125: /* Clear Screen */ - cterm_clearscreen(cterm, cterm->attr); - break; - case 126: /* Backspace (TODO: Wraps around to previous line?) */ - /* DOES NOT delete char, merely erases */ - CURR_XY(&x, &y); - x--; - if (x < CURR_MINX) { - y--; - if (y < CURR_MINY) - break; - y = CURR_MAXY; - } - GOTOXY(x, y); - PUTCH(32); - GOTOXY(x, y); - break; - /* We abuse the ESC buffer for tab stops */ - case 127: /* Tab (Wraps around to next line) */ - CURR_XY(&x, &y); - for (k = x + 1; k <= CURR_MAXX; k++) { - if(cterm->escbuf[k]) { - x = k; - break; - } - } - if (k > CURR_MAXX) { - x = CURR_MINX; - y++; - if(y > CURR_MAXY) { - cond_scrollup(cterm); - y = CURR_MAXY; - } - } - GOTOXY(x, y); - break; - case 155: /* Return */ - adjust_currpos(cterm, INT_MIN, +1, 1); - break; - case 156: /* Delete Line */ - dellines(cterm, 1); - adjust_currpos(cterm, INT_MIN, 0, 0); - break; - case 157: /* Insert Line */ - CURR_XY(&x, &y); - if (y < CURR_MAXY) { - sx = CURR_MINX; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - ey = CURR_MAXY; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, &ey); - MOVETEXT(sx, sy, ex, ey - 1, sx, sy + 1); - } - GOTOXY(CURR_MINX, y); - cterm_clreol(cterm); - break; - case 158: /* Clear Tab */ - cterm->escbuf[WHEREX()]=0; - break; - case 159: /* Set Tab */ - cterm->escbuf[WHEREX()]=1; - break; - case 253: /* Beep */ - if(!cterm->quiet) { - #ifdef __unix__ - PUTCH(7); - #else - MessageBeep(MB_OK); - #endif - } - break; - case 254: /* Delete Char */ - CURR_XY(&x, &y); - if(x < CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx + 1, sy, ex, sy, sx, sy); - } - GOTOXY(CURR_MAXX, k); - cterm_clreol(cterm); - GOTOXY(x, y); - break; - case 255: /* Insert Char */ - CURR_XY(&x, &y); - if(x < CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx, sy, ex - 1, sy, sx + 1, sy); - } - PUTCH(32); - GOTOXY(x, y); - break; - default: - ch[0] = buf[j]; - ch[1] = cterm->attr; - SCR_XY(&sx, &sy); - PUTTEXT(sx, sy, sx, sy, ch); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - break; - } - } - else { - switch(buf[j]) { - case 155: /* Return */ - adjust_currpos(cterm, INT_MIN, +1, 1); - break; - default: - /* Translate to screen codes */ - k=buf[j]; - if(k < 32) { - k +=64; - } - else if(k < 96) { - k -= 32; - } - else if(k < 128) { - /* No translation */ - } - else if(k < 160) { - k +=64; - } - else if(k < 224) { - k -= 32; - } - else if(k < 256) { - /* No translation */ - } - ch[0] = k; - ch[1] = cterm->attr; - SCR_XY(&sx, &sy); - PUTTEXT(sx, sy, sx, sy, ch); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - break; - } - cterm->attr=7; - } - } - else if(cterm->emulation == CTERM_EMULATION_PETASCII) { - switch(buf[j]) { - case 5: /* White */ - case 28: /* Red */ - case 30: /* Green */ - case 31: /* Blue */ - case 129: /* Orange */ - case 144: /* Black */ - case 149: /* Brown */ - case 150: /* Light Red */ - case 151: /* Dark Gray */ - case 152: /* Grey */ - case 153: /* Light Green */ - case 154: /* Light Blue */ - case 155: /* Light Gray */ - case 156: /* Purple */ - case 158: /* Yellow */ - case 159: /* Cyan */ - cterm->attr &= 0xf0; - if (ti.currmode == C64_40X25 || ti.currmode == C128_40X25) { - switch(buf[j]) { - case 5: /* White/Bright White */ - cterm->attr |= 1; - break; - case 28: /* Red*/ - cterm->attr |= 2; - break; - case 30: /* Green */ - cterm->attr |= 5; - break; - case 31: /* Blue */ - cterm->attr |= 6; - break; - case 129: /* Orange/Magenta */ - cterm->attr |= 8; - break; - case 144: /* Black */ - cterm->attr |= 0; - break; - case 149: /* Brown */ - cterm->attr |= 9; - break; - case 150: /* Light Red/Bright Red */ - cterm->attr |= 10; - break; - case 151: /* Dark Gray/Cyan */ - cterm->attr |= 11; - break; - case 152: /* Grey/Bright Black */ - cterm->attr |= 12; - break; - case 153: /* Light Green/Bright Green */ - cterm->attr |= 13; - break; - case 154: /* Light Blue/Bright Blue */ - cterm->attr |= 14; - break; - case 155: /* Light Gray/White */ - cterm->attr |= 15; - break; - case 156: /* Purple/Bright Magenta */ - cterm->attr |= 4; - break; - case 158: /* Yellow/Bright Yellow */ - cterm->attr |= 7; - break; - case 159: /* Cyan/Bright Cyan */ - cterm->attr |= 3; - break; - } - } - else { - // C128 80-column - switch(buf[j]) { - case 5: /* White/Bright White */ - cterm->attr |= 15; - break; - case 28: /* Red*/ - cterm->attr |= 4; - break; - case 30: /* Green */ - cterm->attr |= 2; - break; - case 31: /* Blue */ - cterm->attr |= 1; - break; - case 129: /* Orange/Magenta */ - cterm->attr |= 5; - break; - case 144: /* Black */ - cterm->attr |= 0; - break; - case 149: /* Brown */ - cterm->attr |= 6; - break; - case 150: /* Light Red/Bright Red */ - cterm->attr |= 12; - break; - case 151: /* Dark Gray/Cyan */ - cterm->attr |= 3; - break; - case 152: /* Grey/Bright Black */ - cterm->attr |= 8; - break; - case 153: /* Light Green/Bright Green */ - cterm->attr |= 10; - break; - case 154: /* Light Blue/Bright Blue */ - cterm->attr |= 9; - break; - case 155: /* Light Gray/White */ - cterm->attr |= 7; - break; - case 156: /* Purple/Bright Magenta */ - cterm->attr |= 13; - break; - case 158: /* Yellow/Bright Yellow */ - cterm->attr |= 14; - break; - case 159: /* Cyan/Bright Cyan */ - cterm->attr |= 11; - break; - } - } - TEXTATTR(cterm->attr); - attr2palette(cterm->attr, &cterm->fg_color, &cterm->bg_color); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - break; - - /* Movement */ - case 13: /* "\r\n" and disabled reverse. */ - c64_set_reverse(cterm, 0); - /* Fall-through */ - case 141: - adjust_currpos(cterm, INT_MIN, 0, 0); - /* Fall-through */ - case 17: - adjust_currpos(cterm, 0, 1, 1); - break; - case 147: - cterm_clearscreen(cterm, cterm->attr); - /* Fall through */ - case 19: - adjust_currpos(cterm, INT_MIN, INT_MIN, 0); - break; - case 20: /* Delete (Wrapping backspace) */ - CURR_XY(&x, &y); - if(x == CURR_MINX) { - if (y == CURR_MINY) - break; - x = CURR_MINX; - GOTOXY(x, k-1); - } - else - GOTOXY(--x, k); - if(x < CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx + 1, sy, ex, sy, sx, sy); - } - GOTOXY(CURR_MAXX, y); - cterm_clreol(cterm); - GOTOXY(x, y); - break; - case 157: /* Cursor Left (wraps) */ - CURR_XY(&x, &y); - if (x == CURR_MINX) { - if(y > CURR_MINY) - GOTOXY(CURR_MAXX, y - 1); - } - else - GOTOXY(x - 1, y); - break; - case 29: /* Cursor Right (wraps) */ - CURR_XY(&x, &y); - if (x == CURR_MAXX) { - if (y == CURR_MAXY) { - cond_scrollup(cterm); - GOTOXY(CURR_MINX, y); - } - else - GOTOXY(CURR_MINX, y + 1); - } - else - GOTOXY(x + 1, y); - break; - case 145: /* Cursor Up (No scroll */ - adjust_currpos(cterm, 0, -1, 0); - break; - case 148: /* Insert TODO verify last column */ - /* CGTerm does nothing there... we */ - /* Erase under cursor. */ - CURR_XY(&x, &y); - if (x <= CURR_MAXX) { - sx = x; - sy = y; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &sx, &sy); - ex = CURR_MAXX; - coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &ex, NULL); - MOVETEXT(sx, sy, ex - 1, sy, sx + 1, sy); - } - PUTCH(' '); - GOTOXY(x, y); - break; - - /* Font change... whee! */ - case 14: /* Lower case font */ - if(ti.currmode == C64_40X25) { - SETFONT(33,FALSE,1); - cterm->altfont[0] = 33; - } - else { /* Assume C128 */ - SETFONT(35,FALSE,1); - cterm->altfont[0] = 35; - } - break; - case 142: /* Upper case font */ - if(ti.currmode == C64_40X25) { - SETFONT(32,FALSE,1); - cterm->altfont[0] = 32; - } - else { /* Assume C128 */ - SETFONT(34,FALSE,1); - cterm->altfont[0] = 34; - } - break; - case 18: /* Reverse mode on */ - c64_set_reverse(cterm, 1); - break; - case 146: /* Reverse mode off */ - c64_set_reverse(cterm, 0); - break; - - /* Extras */ - case 7: /* Beep */ - if(!cterm->quiet) { - #ifdef __unix__ - PUTCH(7); - #else - MessageBeep(MB_OK); - #endif - } - break; - // 0x0f - Flashing on (C128 80-column only) - // 0x8f - Flashing off (C128 80-column only) - // 0x02 - Flashing on (C128 80-column only) - // 0x82 - Flashing off (C128 80-column only) - default: - k=buf[j]; - if(k<32 || (k > 127 && k < 160)) { - break; - } - ch[0] = k; - ch[1] = c64_get_attr(cterm); - SCR_XY(&sx, &sy); - PUTTEXT(sx, sy, sx, sy, ch); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - break; - } - } - else { /* ANSI-BBS */ - if(cterm->doorway_char) { - uctputs(cterm, prn); - tmpvc[0].ch = ch[0]; - tmpvc[0].legacy_attr=cterm->attr; - tmpvc[0].fg = cterm->fg_color; - tmpvc[0].bg = cterm->bg_color; - tmpvc[0].font = ciolib_attrfont(cterm->attr); - SCR_XY(&sx, &sy); - vmem_puttext(sx, sy, sx, sy, tmpvc); - ch[1]=0; - CURR_XY(&x, &y); - advance_char(cterm, &x, &y, 1); - cterm->doorway_char=0; - } - else { - switch(buf[j]) { - case 0: - lastch = 0; - if(cterm->doorway_mode) - cterm->doorway_char=1; - break; - case 7: /* Beep */ - lastch = 0; - uctputs(cterm, prn); - prn[0]=0; - if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) - fputs("\x07", cterm->logfile); - if(!cterm->quiet) { - #ifdef __unix__ - PUTCH(7); - #else - MessageBeep(MB_OK); - #endif - } - break; - case 12: /* ^L - Clear screen */ - lastch = 0; - uctputs(cterm, prn); - prn[0]=0; - if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) - fputs("\x0c", cterm->logfile); - cterm_clearscreen(cterm, (char)cterm->attr); - GOTOXY(CURR_MINX, CURR_MINY); - break; - case 27: /* ESC */ - uctputs(cterm, prn); - prn[0]=0; - cterm->sequence=1; - break; - default: - lastch = ch[0]; - ustrcat(prn,ch); - } - } - } - } - } - uctputs(cterm, prn); - prn[0]=0; - break; - } - ABS_XY(&cterm->xpos, &cterm->ypos); - - *cterm->hold_update=olddmc; - *cterm->puttext_can_move=oldptnm; - CURR_XY(&x, &y); - GOTOXY(x, y); - SETCURSORTYPE(cterm->cursor); - - /* Now rejigger the current modes palette... */ - if (mpalette) { - for (i=0; i < 16; i++) - palette[i] -= palette_offset; - set_modepalette(palette); - } - - /* De-doodle the fonts */ - setfont(orig_fonts[0], FALSE, 1); - setfont(orig_fonts[1], FALSE, 2); - setfont(orig_fonts[2], FALSE, 3); - setfont(orig_fonts[3], FALSE, 4); - - return(retbuf); -} - -int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype) -{ - if(!cterm->started) - cterm_start(cterm); - - cterm->logfile=fopen(logfile, "ab"); - if(cterm->logfile==NULL) - return(0); - cterm->log=logtype; - return(1); -} - -void cterm_closelog(struct cterminal *cterm) -{ - if(!cterm->started) - cterm_start(cterm); - - if(cterm->logfile != NULL) - fclose(cterm->logfile); - cterm->logfile=NULL; - cterm->log=CTERM_LOG_NONE; -} - -FILE *dbg; -void cterm_end(struct cterminal *cterm, int free_fonts) -{ - int i; - - if(cterm) { - cterm_closelog(cterm); -#ifdef CTERM_WITHOUT_CONIO - FREE_AND_NULL(BD->vmem); - FREE_AND_NULL(BD); -#else - if (free_fonts) { - for(i=CONIO_FIRST_FREE_FONT; i < 256; i++) { - FREE_AND_NULL(conio_fontdata[i].eight_by_sixteen); - FREE_AND_NULL(conio_fontdata[i].eight_by_fourteen); - FREE_AND_NULL(conio_fontdata[i].eight_by_eight); - FREE_AND_NULL(conio_fontdata[i].desc); - } - } -#endif - if(cterm->playnote_thread_running) { - if(sem_trywait(&cterm->playnote_thread_terminated)==-1) { - listSemPost(&cterm->notes); - sem_wait(&cterm->playnote_thread_terminated); - } - sem_destroy(&cterm->playnote_thread_terminated); - sem_destroy(&cterm->note_completed_sem); - listFree(&cterm->notes); - } - - FREE_AND_NULL(cterm->strbuf); - FREE_AND_NULL(cterm->tabs); - FREE_AND_NULL(cterm->fg_tc_str); - FREE_AND_NULL(cterm->bg_tc_str); - FREE_AND_NULL(cterm->sx_pixels); - FREE_AND_NULL(cterm->sx_mask); - for (i = 0; i < (sizeof(cterm->macros) / sizeof(cterm->macros[0])); i++) { - FREE_AND_NULL(cterm->macros[i]); - } - - free(cterm); - } -} diff --git a/ciolib/cterm.h b/ciolib/cterm.h deleted file mode 100644 index 3b1b7a14358ac0e408db5ad3c2a1705b2f176d9e..0000000000000000000000000000000000000000 --- a/ciolib/cterm.h +++ /dev/null @@ -1,292 +0,0 @@ -/* $Id: cterm.h,v 1.64 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CTERM_H_ -#define _CTERM_H_ - -#include <stdio.h> /* FILE* */ -#include <link_list.h> -#include <semwrap.h> -#include "ciolib.h" - -typedef enum { - CTERM_MUSIC_NORMAL - ,CTERM_MUSIC_LEGATO - ,CTERM_MUSIC_STACATTO -} cterm_noteshape_t; - -typedef enum { - CTERM_LOG_NONE - ,CTERM_LOG_ASCII - ,CTERM_LOG_RAW -} cterm_log_t; - -typedef enum { - CTERM_EMULATION_ANSI_BBS - ,CTERM_EMULATION_PETASCII - ,CTERM_EMULATION_ATASCII -} cterm_emulation_t; - -typedef enum { - CTERM_MUSIC_SYNCTERM, - CTERM_MUSIC_BANSI, - CTERM_MUSIC_ENABLED -} cterm_music_t; - -#define CTERM_LOG_MASK 0x7f -#define CTERM_LOG_PAUSED 0x80 - -#define CTERM_NO_SETFONT_REQUESTED 99 - -struct cterminal { - /* conio stuff */ - int x; // X position of the left side on the screen - int y; // Y position of the top pn the screen - int setfont_result; - int altfont[4]; // The font slots successfully assigned to the 4 alt-font styles/attributes - - /* emulation mode */ - cterm_emulation_t emulation; - int height; // Height of the terminal buffer - int width; // Width of the terminal buffer - int top_margin; - int bottom_margin; - int left_margin; - int right_margin; - int quiet; // No sounds are made - struct vmem_cell *scrollback; - int backlines; // Number of lines in scrollback - int backwidth; // Number of columns in scrollback - char DA[1024]; // Device Attributes -#define CTERM_SAVEMODE_AUTOWRAP 0x001 -#define CTERM_SAVEMODE_CURSOR 0x002 -#define CTERM_SAVEMODE_ALTCHARS 0x004 -#define CTERM_SAVEMODE_NOBRIGHT 0x008 -#define CTERM_SAVEMODE_BGBRIGHT 0x010 -#define CTERM_SAVEMODE_SIXEL_SCROLL 0x020 -#define CTERM_SAVEMODE_ORIGIN 0x040 -#define CTERM_SAVEMODE_BLINKALTCHARS 0x080 -#define CTERM_SAVEMODE_NOBLINK 0x100 -#define CTERM_SAVEMODE_MOUSE_X10 0x200 -#define CTERM_SAVEMODE_MOUSE_NORMAL 0x400 -#define CTERM_SAVEMODE_MOUSE_HIGHLIGHT 0x500 -#define CTERM_SAVEMODE_MOUSE_BUTTONTRACK 0x1000 -#define CTERM_SAVEMODE_MOUSE_ANY 0x2000 -#define CTERM_SAVEMODE_MOUSE_FOCUS 0x4000 -#define CTERM_SAVEMODE_MOUSE_UTF8 0x8000 -#define CTERM_SAVEMODE_MOUSE_SGR 0x10000 -#define CTERM_SAVEMODE_MOUSE_ALTSCROLL 0x20000 -#define CTERM_SAVEMODE_MOUSE_URXVT 0x40000 -#define CTERM_SAVEMODE_DECLRMM 0x80000 - int32_t saved_mode; - int32_t saved_mode_mask; - - /* emulation state */ - int started; // Indicates that conio functions are being called - int c64reversemode; // Commodore 64 reverse mode state - unsigned char attr; // Current attribute - uint32_t fg_color; - uint32_t bg_color; - unsigned int extattr; // Extended attributes -#define CTERM_EXTATTR_AUTOWRAP 0x0001 -#define CTERM_EXTATTR_ORIGINMODE 0x0002 -#define CTERM_EXTATTR_SXSCROLL 0x0004 -#define CTERM_EXTATTR_DECLRMM 0x0008 - int save_xpos; // Saved position (for later restore) - int save_ypos; - int sequence; // An escape sequence is being parsed - int string; -#define CTERM_STRING_APC 1 -#define CTERM_STRING_DCS 2 -#define CTERM_STRING_OSC 3 -#define CTERM_STRING_PM 4 -#define CTERM_STRING_SOS 5 - char *strbuf; - size_t strbuflen; - size_t strbufsize; - char escbuf[1024]; - cterm_music_t music_enable; // The remotely/locally controled music state - char musicbuf[1024]; - int music; // ANSI music is being parsed - int tempo; - int octave; - int notelen; - cterm_noteshape_t noteshape; - int musicfore; - int playnote_thread_running; - link_list_t notes; - sem_t playnote_thread_terminated; - sem_t note_completed_sem; - int backpos; - int xpos; - int ypos; - cterm_log_t log; - FILE* logfile; - char fontbuf[4097]; // Remote font - int font_read; // Current position in fontbuf - int font_slot; - int font_size; // Bytes - int doorway_mode; - int doorway_char; // Indicates next char is a "doorway" mode char - int cursor; // Current cursor mode (Normal or None) - char *fg_tc_str; - char *bg_tc_str; - int *tabs; - int tab_count; - - /* Sixel state */ - int sixel; // Sixel status -#define SIXEL_INACTIVE 0 -#define SIXEL_POSSIBLE 1 -#define SIXEL_STARTED 2 - int sx_iv; // Vertical size - int sx_ih; // Horizontal size - int sx_trans; // "Transparent" background - unsigned long sx_repeat; // Repeat count - unsigned sx_left; // Left margin (0-based pixel offset) - unsigned sx_x, sx_y; // Current position - uint32_t sx_fg, sx_bg; // Current colour set - int sx_pixels_sent; /* If any pixels have been sent... - Raster Attributes are ignore if this is true. */ - int sx_first_pass; // First pass through a line - int sx_hold_update; // hold_update value to restore on completion - int sx_start_x; // Starting X position - int sx_start_y; // Starting Y position - int sx_row_max_x; // Max right size of this sixel line - struct ciolib_pixels *sx_pixels; - unsigned long sx_width; // Width from raster attributes - unsigned long sx_height; // REMAINING heigh from raster attributes - uint8_t *sx_mask; - int sx_orig_cursor; // Original value of cterm->cursor - - /* APC Handler */ - void (*apc_handler)(char *strbuf, size_t strlen, void *cbdata); - void *apc_handler_data; - - /* Mouse state change callback */ - void (*mouse_state_change)(int parameter, int enable, void *cbdata); - void *mouse_state_change_cbdata; - int (*mouse_state_query)(int parameter, void *cbdata); - void *mouse_state_query_cbdata; - - /* Macros */ - char *macros[64]; - size_t macro_lens[64]; - uint64_t in_macro; - int macro; -#define MACRO_INACTIVE 0 -#define MACRO_POSSIBLE 1 -#define MACRO_STARTED 2 - int macro_num; - int macro_del; -#define MACRO_DELETE_OLD 0 -#define MACRO_DELETE_ALL 1 - int macro_encoding; -#define MACRO_ENCODING_ASCII 0 -#define MACRO_ENCODING_HEX 1 - - /* Alternate font renderer */ - void (*font_render)(char *str); - int skypix; - - /* conio function pointers */ -#ifdef CTERM_WITHOUT_CONIO - void (*ciolib_gotoxy) (struct cterminal *,int,int); - int (*ciolib_wherex) (struct cterminal *); - int (*ciolib_wherey) (struct cterminal *); - int (*ciolib_gettext) (struct cterminal *,int,int,int,int,void *); - void (*ciolib_gettextinfo) (struct cterminal *,struct text_info *); - void (*ciolib_textattr) (struct cterminal *,int); - void (*ciolib_setcursortype) (struct cterminal *,int); - int (*ciolib_movetext) (struct cterminal *,int,int,int,int,int,int); - void (*ciolib_clreol) (struct cterminal *); - void (*ciolib_clrscr) (struct cterminal *); - void (*ciolib_setvideoflags) (struct cterminal *,int flags); - int (*ciolib_getvideoflags) (struct cterminal *); - void (*ciolib_setscaling) (struct cterminal *,int new_value); - int (*ciolib_getscaling) (struct cterminal *); - int (*ciolib_putch) (struct cterminal *,int); - int (*ciolib_puttext) (struct cterminal *,int,int,int,int,void *); - void (*ciolib_window) (struct cterminal *,int,int,int,int); - int (*ciolib_cputs) (struct cterminal *,const char *); - int (*ciolib_setfont) (struct cterminal *,int font, int force, int font_num); -#else - void (*ciolib_gotoxy) (int,int); - int (*ciolib_wherex) (void); - int (*ciolib_wherey) (void); - int (*ciolib_gettext) (int,int,int,int,void *); - int (*ciolib_vmem_gettext) (int,int,int,int,struct vmem_cell *); - void (*ciolib_gettextinfo) (struct text_info *); - void (*ciolib_textattr) (int); - void (*ciolib_setcursortype) (int); - int (*ciolib_movetext) (int,int,int,int,int,int); - void (*ciolib_clreol) (void); - void (*ciolib_clrscr) (void); - void (*ciolib_setvideoflags) (int flags); - int (*ciolib_getvideoflags) (void); - void (*ciolib_setscaling) (int new_value); - int (*ciolib_getscaling) (void); - int (*ciolib_putch) (int); - int (*ciolib_puttext) (int,int,int,int,void *); - int (*ciolib_vmem_puttext) (int,int,int,int,struct vmem_cell *); - void (*ciolib_window) (int,int,int,int); - int (*ciolib_cputs) (const char *); - int (*ciolib_setfont) (int font, int force, int font_num); -#endif - int *_wscroll; - int *puttext_can_move; - int *hold_update; - void *extra; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -CIOLIBEXPORT struct cterminal* cterm_init(int height, int width, int xpos, int ypos, int backlines, int backcols, struct vmem_cell *scrollback, int emulation); -CIOLIBEXPORT char* cterm_write(struct cterminal *cterm, const void *buf, int buflen, char *retbuf, size_t retsize, int *speed); -CIOLIBEXPORT int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype); -CIOLIBEXPORT void cterm_closelog(struct cterminal *cterm); -CIOLIBEXPORT void cterm_end(struct cterminal *cterm, int free_fonts); -CIOLIBEXPORT void cterm_clearscreen(struct cterminal *cterm, char attr); -CIOLIBEXPORT void cterm_start(struct cterminal *cterm); -void cterm_gotoxy(struct cterminal *cterm, int x, int y); -void setwindow(struct cterminal *cterm); -void cterm_clreol(struct cterminal *cterm); -void cterm_scrollup(struct cterminal *cterm); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/cterm.txt b/ciolib/cterm.txt deleted file mode 100644 index f04562391661c2ebad58b554536a2f2ea62fb1db..0000000000000000000000000000000000000000 --- a/ciolib/cterm.txt +++ /dev/null @@ -1,1283 +0,0 @@ -$Id: cterm.txt,v 1.79 2020/04/28 19:39:13 deuce Exp $ - -CTerm terminal characteristics: ------------------------------- - -End of line behaviour (wrapping): -The cursor is moved to the first character of the next line -as soon as a character is written to the last column of the -current line, not on the next character. A tab will wrap -to the next line only if the current cursor position is the -last character on the line. - -I'm often asked why I don't use VT semantics for wrapping. -The primary reason is that the person asking almost certainly -doesn't know what the VT semantics are, they just want -SyncTERM to behave the same as some other terminal they like. - -Not only have the VT semantics never been properly -implemented in any terminal, they even varied between -different actual hardware VT terminals. Luckily, everything -is on the internet now, so you can see the details and results -here: https://github.com/mattiase/wraptest - -Control characters: - -0x00 - NUL: - In doorway mode, indicates that the next character is - a literal character. The IBM CP437 character will - be displayed. This allows ESC and other control - characters to be placed on the screen. - -0x07 - BEL: - Beep - -0x08 - BS: - Non-destructive backspace. Moves cursor position to - the previous column unless the current column is the - first, in which case no operation is performed. - -0x09 - HT: - Moves to the next horizontal tab stop. Does not overwrite - any characters in between. If there are no tab stops left - in the line, moves to the first position of the next line. - If the starting position is on the last line, will perform - a scroll, filling the new line at bottom with the current - attribute. - -0x0A - LF: - Move cursor position to same column of the next row. - If current row is the last row, scrolls the screen up - and fills the new row with the current attribute. - -0x0D - CR: - Move cursor position to column 1 of the current line - -Control Codes: --------------- - -Control codes are in the following format: -ESC {'0' (ZERO) to '~'} - Legal combinations which are not handled are silently dropped. - -ESC E Next Line (NEL) - Moves to the line home position of the next line. - (Same as CR LF) - -ESC H Set Tab (HTS) - Sets a tab stop at the current column - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -ESC M Reverse Line Feed (RI) - Move up one line - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -ESC P Device Control String (DCS) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - Supported DCS string values: - "CTerm:Font:p1:<b64>" - Indicates the string is a loadable font. (CTerm 1.213) - - p1 is a font slot number, which must be higher than the last - default defined font (See CSI sp D for list of predefined - fonts). <b64> is the base64 encoded font data. Font size is - deduced from the size of the data. This replaces the now - deprecated CSI = Ps1 ; Ps2 { - - - [ p1 [ ; p2 ] ] q - Defaults: p1 = 0 p2 = 0 - Indicates the string is a sixel sequence. - - p1 selects the vertical height of a single pixel. This - may be overridden by the raster attributes command, and - is deprecated. Supported values - - Value Vertical Size - ----- ------------- - 0,1,5,6 2 pixels - 2 5 pixels - 3,4 3 pixels - 7,8,9 1 pixel - - p2 indicates if unset sixels should be set to the current - background colour. If p2 is 1, positions specified as 0 - remain at their current colour. - - Any additional parameters are ignored. - - The rest of the string is made up of sixel data characters and - sixel control functions. Sixel data characters are in the - rage of '?' (0x3f) to '~' (0x7e). Each sixel data character - represents six vertical pixels. The data is extracted by - subtracting 0x3f from the ASCII value of the character. - The least significant bit is the topmost pixel. - - Sixel Control Functions - ! Pn X - Graphics Repeat Introducer - The character X is repeated Pn times. - " p1 ; p2 [ ; p3 [ ; p4 ] ] - Raster Attributes - p1 indicates the vertical size in pixels of each - sixel. p2 indicates the horizontal size in pixels. - p3 and p4 define the height and width (in sixels) - respectively of a block to fill with the background - colour. This block may not extend past the current - bottom of the screen. If any pixel data characters - proceed this command, it is ignored. - # p1 - Colour Select - Selects the current foreground colour from the - sixel palette. - # p1 ; p2 ; p3 ; p4 ; p5 - Palette map - Defines sixel palette entry p1 and sets it as the - current foreground colour. p2 specifies the colour - space to define the colour in, the only supported - value is 2. p3, p4, and p5 specify the red, green, - and blue content as a percentage (0-100). - $ - Graphics Carriage Return - Returns the active position to the left border of - the same sixel row. Generally, one pass per colour - is used. In passes after the first one, sixels - with a value of zero are not overwritten with the - background colour. - - - Graphics New Line - Moves the active position to the left border of the - next sixel row. - - - $ q pt - Request Status String (DECRQSS) - - pt is the intermediate and/or final characters of a control - function to query the status of. The terminal will send a - response in the format - - DCS p1 $ r pt ST - - p1 is 1 if the terminal supports querying the control - function and 0 if it does not. - - pt is the characters in the control function except the CSI - characters. - - Currently supported values of p1: - - m Request SGR parameters - r Request top and bottom margins - s Request left and right margins - t Request height in lines - $| Request width in columns - *| Request height in lines - - - p1 [ ; p2 [ ; p3 ] ! z - Define Macro (DECDMAC) - Defaults: p2 = 0 p3 = 0 - - Sets a macro to be replayed using CSI Pn * z - - p1 is the macro number to set, and make be between 0 and - 63 inclusive. - - If p2 is zero, the macro numbered p1 will be deleted. If - p2 is one, all macros are deleted. - - If p3 is zero, the macro is defined using ASCII characters - (0x20 - 0x7e and 0xa0 - 0xff only) if p3 is one, the macro - is defined using hex pairs. - - When the macro is defined using hex pairs, a repeat - sequence may be included in the format of ! Pn ; D..D ; - Pn specifies the number of repeats (default of one instance) - D..D is the sequence of pairs to send Pn times. The - terminating ; may be left out if the sequence to be - repeated ends at the end of the string. - -ESC X Start Of String (SOS) - As the above strings, but may contain any characters except - a Start Of String sequence or a String Terminator sequence. - The string is currently ignored. - -ESC \ String Terminator (ST) - -ESC ] Operating System Command (OSC) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - Supported OSC values: - 4;(pX;pY)... - Specifies one or more palette redefinitions. - pX is the palette index, and pY is the colour definition - Color format: - rgb:R/G/B - Where R, G, and B are a sequence of one to four - hex digits representing the value of the - red, green, and blue channels respectively. - - SOURCE: xterm - - 104 [ ; Ps ... ] - Resets palette entry to default. If the entire string - is "104", resets all colours. Otherwise, only each index - separated by a semicolon is reset. - - SOURCE: xterm - -ESC ^ Privacy Message (PM) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - The string is currently ignored. - -ESC _ Application Program String (APS) - Begins a string consisting of the characters 0x08 - 0x0d and - 0x20-0x7e, terminated by a String Terminator (ST) - The string is currently ignored. - -ESC c Reset to Initial State (RIS) - Resets all the terminal settings, clears the screen, and homes - the cursor. - -Control Sequences: ------------------- - -Control sequences start with the Control Sequence Introducer which is -ESC [ CSI will be used to express this from now on. - -Control sequences are in the following format: -CSI {'0' (ZERO) to '?'}{SPACE to '/'}{'@' to '~'} - There may be multiple characters from the {'0' (ZERO) to '?'} - and {SPACE to '/'} before the terminating {'@' to '~'} character. - - Legal combinations not handled are silently dropped. - Illegal combinations are displayed. - -Sequence Parameters: - Parameters are expressed by the {'0' (ZERO) to '?'} character set. - Sequences which use parameters use decimal parameters separated by - a ';'. The use of a ':' from the set is reserved. - If the parameter string begins with '<', '=', '>', or '?' then - this is a non-standard extension to the ANSI spec. - - Pn Indicates a single numeric parameter - Pn1 ; Pn2 Two numeric parameters - Pn... Any number of numeric parameters - Ps Single selective parameter - Ps1 ; Ps1 Two selective parameters - Ps... Any numer of selective parameters - - If a default is defined, the parameter is optional - -CSI Pn @ (ICH) - Insert Character(s) - Defaults: Pn = 1 - Moves text from the current position to the right edge Pn characters - to the right, with rightmost characters going off-screen and the - resulting hole being filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn SP @ (SL) - Scroll Left - Defaults: Pn = 1 - Shifts the contents of the screen left Pn columns(s) with - leftmost columns going off-screen and the resulting hole being - filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn A (CUU) - Cursor Up - Defaults: Pn = 1 - Moves the cursor position up Pn lines from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn SP A (SR) - Scroll Right - Defaults: Pn = 1 - Shifts the contents of the screen right Pn columns(s) with - rightmost columns going off-screen and the resulting hole being - filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn B (CUD) - Cursor Down - Defaults: Pn = 1 - Moves the cursor position down Pn lines from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn C (CUF) - Cursor Right - Defaults: Pn = 1 - Moves the cursor position right Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn D (CUB) - Cursor Left - Defaults: Pn = 1 - Moves the cursor position left Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps1 ; Ps2 sp D (FNT) - Font Selection - Defaults: Ps1 = 0 Ps2 = 0 - "sp" indicates a single space character. - Sets font Ps1 to be the one indicated by Ps2. Currently four fonts are - supported. Ps2 must be between 0 and 255. Not all output types support - font selection. Only X11 and SDL currently do. - Supported Ps1 values: - 0 - Default font - 1 - Font selected by the high intensity bit when CSI ? 31 h - is enabled - 2 - Font selected by the blink intensity bit when CSI ? 34 h - is enabled - 3 - Font selected by both the high intensity and blink bits - when both CSI ? 31 h and CSI ? 34 h are enabled - Currently included fonts are: - 0 - Codepage 437 English - 1 - Codepage 1251 Cyrillic, (swiss) - 2 - Russian koi8-r - 3 - ISO-8859-2 Central European - 4 - ISO-8859-4 Baltic wide (VGA 9bit mapped) - 5 - Codepage 866 (c) Russian - 6 - ISO-8859-9 Turkish - 7 - haik8 codepage (use only with armscii8 screenmap) - 8 - ISO-8859-8 Hebrew - 9 - Ukrainian font koi8-u - 10 - ISO-8859-15 West European, (thin) - 11 - ISO-8859-4 Baltic (VGA 9bit mapped) - 12 - Russian koi8-r (b) - 13 - ISO-8859-4 Baltic wide - 14 - ISO-8859-5 Cyrillic - 15 - ARMSCII-8 Character set - 16 - ISO-8859-15 West European - 17 - Codepage 850 Multilingual Latin I, (thin) - 18 - Codepage 850 Multilingual Latin I - 19 - Codepage 885 Norwegian, (thin) - 20 - Codepage 1251 Cyrillic - 21 - ISO-8859-7 Greek - 22 - Russian koi8-r (c) - 23 - ISO-8859-4 Baltic - 24 - ISO-8859-1 West European - 25 - Codepage 866 Russian - 26 - Codepage 437 English, (thin) - 27 - Codepage 866 (b) Russian - 28 - Codepage 885 Norwegian - 29 - Ukrainian font cp866u - 30 - ISO-8859-1 West European, (thin) - 31 - Codepage 1131 Belarusian, (swiss) - 32 - Commodore 64 (UPPER) - 33 - Commodore 64 (Lower) - 34 - Commodore 128 (UPPER) - 35 - Commodore 128 (Lower) - 36 - Atari - 37 - P0T NOoDLE (Amiga) - 38 - mO'sOul (Amiga) - 39 - MicroKnight Plus (Amiga) - 40 - Topaz Plus (Amiga) - 41 - MicroKnight (Amiga) - 42 - Topaz (Amiga) - - Not all fonts are supported in all modes. If a font is not supported - in the current mode, no action is taken, but there should be a - non-zero 'Font Selection result' value in the Font State Report. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn E (CNL) - Cursor Next Line - Defaults: Pn = 1 - Moves the cursor to the first column of the line Pn down from the - current position. Attempting to move past the screen boundaries - stops the cursor at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn F (CPL) - Cursor Preceding Line - Defaults: Pn = 1 - Moves the cursor to the first column of the row Pn up from the - current position. Attempting to move past the screen boundaries - stops the cursor at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn G (CHA) - Cursor Character Absolute - Defaults: Pn = 1 - Movies the cursor to column Pn of the current row. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn1 ; Pn2 H (CUP) - Cursor Position - Defaults: Pn1 = 1 Pn2 = 1 - Moves the cursor to the Pn2th column of the Pn1th line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn I (CHT) - Cursor Forward Tabulation - Defaults: Pn = 1 - Move the cursor to the Pn-th next tab stop. - Basically the same as sending TAB Pn times. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps J (ED) - Erase in Page - Defaults: Ps = 0 - Erases from the current screen according to the value of Ps - 0 - Erase from the current position to the end of the screen. - 1 - Erase from the current position to the start of the screen. - 2 - Erase entire screen. As a violation of ECMA-048, also moves - the cursor to position 1/1 as a number of BBS programs assume - this behaviour. - Erased characters are set to the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - SOURCE BANSI.TXT - -CSI Ps K (EL) - Erase in Line - Defaults: Ps = 0 - Erases from the current line according to the value pf Ps - 0 - Erase from the current position to the end of the line. - 1 - Erase from the current position to the start of the line. - 2 - Erase entire line. - Erased characters are set to the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn L (IL) - Insert Line(s) - Defaults: Pn = 1 - Inserts Pn lines at the current line position. The current line and - those after it are scrolled down and the new empty lines are filled - with the current attribute. If the cursor is not currently inside - the scrolling margins, has no effect. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn M (DL) - Delete Line(s) / "ANSI" Music - Defaults: Pn = 1 - Deletes the current line and the Pn - 1 lines after it scrolling the - first non-deleted line up to the current line and filling the newly - empty lines at the end of the screen with the current attribute. - If the cursor is not currently inside the scrolling margins, has no - effect. - If "ANSI" Music is fully enabled (CSI = 2 M), performs "ANSI" music - instead. - See "ANSI" MUSIC section for more details. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - SOURCE: BANSI.TXT - -CSI = Ps M (CTSAM) - CTerm Set ANSI Music - NON-STANDARD EXTENSION. - Defaults: Ps = 0 - Sets the current state of ANSI music parsing. - 0 - Only CSI | will introduce an ANSI music string. - 1 - Both CSI | and CSI N will introduce an ANSI music string. - 2 - CSI |, CSI N, and CSI M will all introduce an ANSI music string. - In this mode, Delete Line will not be available. - - SOURCE: CTerm only. - -CSI N (BCAM) - BananaCom ANSI Music - "ANSI" Music / Not implemented. - If "ANSI" Music is set to BananaCom (CSI = 1 M) or fully enabled - (CSI = 2 M) performs "ANSI" music. See "ANSI" MUSIC section for more - details. - - SOURCE: BANSI.TXT - -CSI Pn P (DCH) - Delete Character - Defaults: Pn = 1 - Deletes the character at the current position by shifting all - characters from the current column + p1 left to the current column. - Opened blanks at the end of the line are filled with the current - attribute. If the cursor is not currently inside the scrolling - margins, has no effect. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn S (SU) - Scroll Up - Defaults: Pn = 1 - Scrolls all text on the screen up Pn lines. New lines emptied at the - bottom are filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI ? Ps1 ; Ps2 S (XTSRGA) - XTerm Set or Request Graphics Attribute - If Ps1 is 2, and Ps2 is 1, replies with the graphics screen information - in the following format: CSI ? 2 ; 0 ; Px ; Py S - Where Px is the width of the screen in pixels and Py is the height. - - SOURCE: XTerm - -CSI Pn T (SD) - Scroll Down - Defaults: Pn = 1 - Scrolls all text on the screen down Pn lines. New lines emptied at the - top are filled with the current attribute. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI U - NON-STANDARD (Disabled in current code) - Clear screen with default attribute. - This code is *supposed* to go to the "next page" according to the - ANSI/ECMA specs with CSI V going to "previous page" - - SOURCE: BANSI.TXT - -CSI Pn X (ECH) - Erase Character - Defaults: Pn = 1 - Erase p1 characters starting at the current character. Will not erase - past the end of line. - Erased characters are set to the current attribute. - This can erase across scroll margins. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn Y (CVT) - Cursor Line Tabulation - Defaults: Pn = 1 - Move the cursor to the Pn-th next tab stop. - Basically the same as sending TAB Pn times. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn Z (CBT) - Cursor Backward Tabulation - Defaults: Pn = 1 - Move the cursor to the p1th preceding tab stop. Will not go past the - start of the line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn ` (HPA) - Character Position Absolute - Defaults: Pn = 1 - Move the cursor to the specified position on the current row. - Will not go past the end of the line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn a (HPR) - Cursor Position Forward - Defaults: Pn = 1 - Moves the cursor position forward Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn b (REP) - Repeat - Defaults: Pn = 1 - Repeats the previous graphic character Pn times. Will not repeat - escape sequences. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps c (DA) - Device Attributes - Defaults: Ps = 0 - If Ps is 0, CTerm will reply with the sequence: - CSI = 67;84;101;114;109;pN c - 64;84;101;114;109 is the ASCII values of the "CTerm" string. pN is the - CVS revision ID of CTerm with dots converted to semi-colons - (e.g. "1;156"). Use the CVS revision to detect if a specific feature - is available. If you are adding features to a forked version of cterm, - please do so by adding an extra parameter to the end, not by - incrementing any existing one! - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI < Ps c (CTDA) - CTerm Device Attributes - - Defaults: Ps = 0 - If Pn is 0, CTerm will reply with the sequence: - CSI < 0 ; Ps... c - - Possible values for Ps: - 1 - Loadable fonts are availabe via Device Control Strings - 2 - Palette entries may be modified via an Operating System Command - string - 3 - Pixel operations are supported (currently, sixel graphics) - 4 - The current font may be selected via CSI Ps1 ; Ps2 sp D - 5 - More than the standard 16 colours may by configured via - Operating System Command strings - 6 - Extended palette is available - 7 - Mouse is available - -CSI Ps d (VPA) - Line Position Absolute - Defaults: Ps = 1 - Moves to row specified by Ps. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn SP d (TSR) - Tab Stop Remove - Defaults: None - Removes a tab stop at postion Pn. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn e (VPR) - Line Position Forward - Defaults: Ps = 1 - Moves forward Ps rows. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn1 ; Pn2 (HVP) - Character and Line Position - Defaults: Pn1 = 1 Pn2 = 1 - Moves the cursor to the Pn2th column of the Pn1th line. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Ps g (TBC) - Tabulation Clear - Defaults: Pn = 0 - Deletes tab stops according to the values of P1: - 0 - Deletes tab stop at current position. - 3 - Deletes all tab stops. - 5 - Deletes all tab stops. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI = 255 h (BCSET) - NON-STANDARD EXTENSION - Enable DoorWay Mode - - SOURCE: BANSI.TXT - -CSI ? Ps... h (DECSET) - NON-STANDARD EXTENSION - Set Mode - Sets one or more mode. The following modes are supported: - - 6 - Enable origin mode. - In this mode, position parameters are relative to the top left of - the scrolling region, not the screen. Defaults to reset. - SOURCE: Digital VT102 User Guide - 7 - Enable auto wrap - This is the normal mode in which a write to the last column of a - row will move the cursor to the start of the next line triggering - a scroll if required to create a new line. Defaults to set. - SOURCE: Digital VT102 User Guide - 9 - X10 compatible mouse reporting - Mouse button presses will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - <x> and <y> are '!' + position (0-based) - SOURCE: xterm - 25 - Display the cursor. Defaults to set. - SOURCE: "Installing and Using the VT320 Video Terminal" - 31 - Enable bright alt character set - With this mode set, the bright (1) graphic rendition selects - characters from an alternate character set. Defaults to reset. - 32 - Bright Intensity Disable - This makes the bright intensity bit not control the intensity. - Mostly for use with CSI ? 31 h to permit fonts in the same - colours. Defaults to reset. - 33 - Blink to Bright Intensity Background - With this mode set, the blink (5,6) graphic renditions cause the - background colour to be high intensity rather than causing blink. - Defaults to reset. - 34 - Enable blink alt character set - With this mode set, the blink (5, 6) graphic renditions selects - characters from an alternate character set. Defaults to reset - 35 - Blink Disabled - This makes the blink (5, 6) graphic renditions not cause the - character to blink. Mostly for use with CSI ? 34 h to permit - fonts to be used without blinking. Defaults to reset. - 69 - DEC Left Right Margin Mode enabled - Enables CSI s to set the left/right margins, and disables CSI s - from saving the current cursor position. - 80 - Sixel Scrolling Enabled - When this is set, the sixel active position begins in the - upper-left corner of the currently active text position. - When the sixel active position reaches the bottom of the - page, the page is scrolled up. At the end of the sixel - string, a sixel newline is appended, and the current cursor - position is the one in which the bottom sixel is in. - Defaults to set. - SOURCE: VT330/VT340 Programmer Reference Manual - 1000 - Normal tracking mode mouse reporting - Mouse button presses will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - Mouse button releases will use a button number of 4 - <x> and <y> are '!' + position (0-based) - SOURCE: xterm - 1001 - Highlight tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1002 - Button-event tracking mode mouse reporting - Mouse button presses and movement when a button is pressed - will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - 32 is added to the button number for movement events. - Mouse button releases will use a button number of 4 - <x> and <y> are '!' + position (0-based) - SOURCE: xterm - 1003 - Any-event tracking mode mouse reporting - Mouse button presses and movement - will send a CSI M <button> <x> <y> - Where <button> is ' ' + button number (0-based) - 32 is added to the button number for movement events. - Mouse button releases will use a button number of 4 - <x> and <y> are '!' + position (0-based) - If no button is pressed, it acts as though button 0 is. - SOURCE: xterm - 1004 - Focus-event tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1005 - UTF-8 encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - 1006 - SGR encoded extended coordinates - Instead of the CSI M method, the format of mouse reporting - is change to CSI < Pb ; Px ; Py M for presses and - CSI < Pb ; Px ; Py m for releases. - Instead of CSI M - Px and Py are one-based. - Pb remains the same (32 added for movement) - Button 3 is not used for release (separate code) - SOURCE: xterm - 1007 - Alternate scroll mode - (Not supported by SyncTERM) - SOURCE: xterm - 1015 - URXVT encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - -CSI Pn j (HPB) - Character Position Backward - Defaults: Pn = 1 - Moves the cursor position left Pn columns from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI Pn k (VPB) - Line Position Backward - Defaults: Pn = 1 - Moves the cursor position up Pn lines from the current position. - Attempting to move past the screen boundaries stops the cursor - at the screen boundary. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - -CSI = 255 l (BCRST) - NON-STANDARD EXTENSION - Disable DoorWay Mode - - SOURCE: BANSI.TXT - -CSI ? Ps... l (DECRST) - NON-STANDARD EXTENSION - Reset Mode - Resets one or more mode. The following modes are supported: - - 6 - Origin Mode - With this mode reset, position parameters are relative to the - top left of the screen, not the scrolling region. Defaults - to reset. - SOURCE: Digital VT102 User Guide - 7 - Disable auto wrap - Resetting this mode causes a write to the last column of a to - leave the cursor where it was before the write occurred, - overwriting anything which was previously written to the same - position. - SOURCE: Digital VT102 User Guide - 9 - Disable X10 compatible mouse reporting - 25 - Hide the cursor. Defaults to set. - SOURCE: "Installing and Using the VT320 Video Terminal" - 31 - Disable bright alt character set - With this mode reset, the bright (1) graphic rendition does not - select an alternative font. Defaults to reset. - 32 - Bright Intensity Enable - When reset, bright intensity graphics rendition behaves normally. - Defaults to reset. - 33 - Disable Blink to Bright Intensity Background - With this mode set, the blink (5,6) graphic renditions do not - affect the background colour. Defaults to reset. - 34 - Disable blink alt character set - With this mode reset, the blink (5, 6) graphic renditions do not - select characters from an alternate character set. Defaults to - reset. - 35 - Blink Enable - With this mode reset, the blink (5,6) graphic renditions behave - normally (cause the characters to blink). Defaults to reset. - 69 - DEC Left Right Margin Mode disabled - Disables CSI s from setting the left/right margins, and changes - it back to saving the current cursor position. The current - left/right margins are maintained. - 80 - Sixel Scrolling Disabled - When this is reset, the sixel active position begins in the - upper-left corner of the page. Any commands that attempt to - advance the sixel position past the bottom of the page are - ignored. At the end of the sixel string, the current cursor - position is unchanged from where it was when the sixel string - started. Defaults to set. - SOURCE: VT330/VT340 Programmer Reference Manual - 1000 - Disable Normal tracking mode mouse reporting - SOURCE: xterm - 1001 - Disable Highlight tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1002 - Disable Button-event tracking mode mouse reporting - SOURCE: xterm - 1003 - Disable Any-event tracking mode mouse reporting - SOURCE: xterm - 1004 - Disable Focus-event tracking mode mouse reporting - (Not supported by SyncTERM) - SOURCE: xterm - 1005 - Disable UTF-8 encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - 1006 - Disable SGR encoded extended coordinates - SOURCE: xterm - 1007 - Disable Alternate scroll mode - (Not supported by SyncTERM) - SOURCE: xterm - 1015 - Disable URXVT encoded extended coordinates - (Not supported by SyncTERM) - SOURCE: xterm - -CSI Ps... m (SGR) - Select Graphic Rendition - Defaults: Ps1 = 0 - Sets or clears one or more text attributes. Unlimited parameters are - supported and are applied in received order. The following are - supported: - Blink Bold FG BG TF TB (Modified) - 0 - Default attribute, white on black X X X X X X - 1 - Bright Intensity X X - 2 - Dim intensity X X - 5 - Blink (By definition, slow blink) X X - 6 - Blink (By definition, fast blink) X X - NOTE: Both blinks are the same speed. - 7 - Negative Image - Reverses FG and BG X X X X - 8 - Concealed characters, sets the X X X - foreground colour to the background - colour. - 22 - Normal intensity X X - 25 - Steady (Not blinking) X X - 27 - Positive Image - Reverses FG and BG X X X X - NOTE: This should be a separate - attribute than 7 but this - implementation makes them equal - 30 - Black foreground X X - 31 - Red foreground X X - 32 - Green foreground X X - 33 - Yellow foreground X X - 34 - Blue foreground X X - 35 - Magenta foreground X X - 36 - Cyan foreground X X - 37 - White foreground X X - 38 - Extended Foreground (see notes) X - 39 - Default foreground (same as white) X X - 40 - Black background X X - 41 - Red background X X - 42 - Green background X X - 43 - Yellow background X X - 44 - Blue background X X - 45 - Magenta background X X - 46 - Cyan background X X - 47 - White background X X - 48 - Extended Background (see notes) X - 49 - Default background (same as black) X X - - All others are ignored. - - Blink indicates the blink bit. - Bold indicates the bold bit. - FG indicates the foreground colour. - BG indicates the background colour. - TF indicates that the Tru Colour foreground is changed. - TB indicates that the Tru Colour background is changed. - - NOTE: For 38 and 48, two additional formats are supported, a palette - selection and a direct colour selection. - - For palette selection, an additional two parameters are required - after that value. They are considered part of the 38/48, not separate - values. The first additional parameter must be a 5. The second - additional parameter specified the palette index to use. To set the - foreground to orange, and the background to a fairly dark grey, you - would send: - CSI 38 ; 5 ; 214 ; 48 ; 5 ; 238 m - - The default palette is the XTerm 256-colour palette. See here: - https://jonasjacek.github.io/colors/ - - For direct colour selection, an additional four parameters are required - after that value. They are considered part of the 38/48, not separate - values. The first additional parameter must be a 2. The second, - third, and fourth specify the R/G/B values respectively. CTerm handles - this with an internal temporary palette, so scrollback may not have the - correct colours. The internal palette is large enough for all cells in - a 132x60 screen to have unique foreground and background colours - though, so the current screen should always be as expected. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - SOURCE: XTerm - -CSI Ps n (DSR) - Device Status Report - Defaults: Ps = 0 - A request for a status report. CTerm handles the following three - requests: - 5 - Request a DSR - CTerm will always reply with CSI 0 n indicating - "ready, no malfunction detected" - 6 - Request active cursor position - CTerm will reply with CSI y ; x R where y is the current line - and x is - the current row. - 255 - NON-STANDARD EXTENSION (BCDSR) - Replies as though a CSI 6 n was received with the cursor in - the bottom right corner. i.e.: Returns the terminal size as - a position report. - - SOURCE: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf - (parameters 5 and 6 only) - SOURCE: BANSI.TXT (parameter 255) - -CSI = Ps n (CTSMRR) - NON-STANDARD EXTENSION - State/Mode Request/Report - Defaults: Ps = 1 - - When Ps is 1, CTerm will respond with a Font State Report of the form - CSI = 1 ;pF ;pR ;pS0 ;pS1 ;pS2 ;pS3 n - pF is the first available loadable-font slot number - pR is the result of the previous "Font Selection" request: - 0 = successful font selection - 1 = failed font selection - 99 = no font selection request has been received - pS0 - pS3 contain the font slots numbers of previously successful - "Font Selection" requests into the 4 available alternate-font - style/attribute values: - pS0 - normal attribute font slot - PS1 - high intensity foreground attribute font slot - PS2 - blink attribute font slot - PS3 - high intensity blink attribute font slot - - When Ps is 2, CTerm will respond with a Mode Report of the form - CSI = 2[;pN [;pN] [...]] n - Where pN represent zero or more mode values set previously - (e.g. via CSI ? pN h). Mode values cleared (disabled via CSI ? pN l) - will not be included in the set of values returned in the Mode - Report. If no modes are currently set, an empty parameter will be - included as the first and only pN. - - When Ps is 3, CTerm will respond with a Mode Report of the form - CSI = 3 ; pH ; pW n - Where pH is the height of a character cell in pixels, and pW is - the width of a character cell in pixels. - - SOURCE: CTerm only. - -CSI ? Ps [ ; Pn ] n (DECDSR) - - When Ps is 62 (DECMSR) and there is no Pn, CTerm will respond - with a Mode Report of the form - CSI 32767 * { - This indicates that 524,272 bytes are available for macro storage. - This is not actually true, SyncTERM will use all available memory - for macro storage, but some software checks this value, and some - parsers don't allow more than INT16_MAX parameter values. - - When Ps is 63 (DECCKSR) Pn defaults to 1, and CTerm will respond - with a checksum of the defined macros in the form - DCS Pn ! xxxx ST - Where xxxx is the hex checksum. - - SOURCE: VT420 - -CSI Pn1 ; Pn2 r (DECSTBM) - NON-STANDARD EXTENSION. - Set Top and Bottom Margins - Defaults: Pn1 = 1 - Pn2 = last line on screen - Selects top and bottom margins, defining the scrolling region. Pn1 is - the line number of the first line in the scrolling region. Pn2 is the - line number of the bottom line. - - SOURCE: xterm - -CSI Ps1 ; Ps2 * r (DECSCS) - NON-STANDARD EXTENSION. - Set the output emulation speed (Select Communication Speed). - If Ps1 or Ps2 are omitted, causes output speed emulation to stop - Ps1 may be empty. - Sequence is ignored if Ps1 is not empty, 0, or 1. - The value of Ps2 sets the output speed emulation as follows: - - Value Speed - ----- ----- - empty, 0 Unlimited - 1 300 - 2 600 - 3 1200 - 4 2400 - 5 4800 - 6 9600 - 7 19200 - 8 38400 - 9 57600 - 10 76800 - 11 115200 - - SOURCE: VT4xx Specification from http://www.vt100.net/ - -CSI ? Ps... s (CTSMS) - NON-STANDARD EXTENSION - Save Mode Setting - Saves the current mode states as specified by CSI ? l and CSI ? h. If - Ps1 is omitted, saves all such states. If one or more values of Ps is - included, saves only the specified states (arguments to CSI ? l/h). - - SOURCE: SyncTERM only - -CSI Pn1 ; Pn2 s (DECSLRM) - (Only when DEC Left Right Margin Mode - 69 - is enabled) - NON-STANDARD EXTENSION. - Set Left and Right Margins - Defaults: Pn1 = 1 - Pn2 = last column on screen - If either Pn1 or Pn2 is zero, the current setting is retained. - Selects left and right margins, defining the scrolling region. Pn1 is - the column number of the first column in the scrolling region. Pn2 is - the column number of the right column. - - SOURCE: xterm - -CSI s (SCOSC) - (Only when DEC Left Right Margin Mode - 69 - is disabled) - NON-STANDARD EXTENSION - Save Current Position - Saves the current cursor position for later restoring with CSI u - although this is non-standard, it's so widely used in the BBS world - that any terminal program MUST implement it. - - SOURCE: ANSI.SYS - -CSI Ps ; Pn1 ; Pn2 ; Pn3 t (CT24BC) - NON-STANDARD EXTENSION - Select a 24-bit colour - If Ps is 0, sets the background colour. - If Ps is 1, sets the foreground colour. - Pn1, Pn2, Pn3 contains the RGB value to set. - CTerm handles this with an internal temporary palette, so scrollback - may not have the correct colours. The internal palette is large - enough for all cells in a 132x60 screen to have unique foreground - and background colours though, so the current screen should always - be as expected. - -CSI ? Ps... u (CTRMS) - NON-STANDARD EXTENSION - Restore Mode Setting - Saves the current mode states as specified by CSI ? l and CSI ? h. If - Ps is omitted, saves all such states. If one or more values of Ps is - included, restores all the specified states (arguments to CSI ? l/h) - - SOURCE: SyncTERM only - -CSI u (SCORC) - NON-STANDARD EXTENSION - Restore Cursor Position - Move the cursor to the last position saved by CSI s. If no position - has been saved, the cursor is not moved. - - SOURCE: ANSI.SYS - -CSI 2 $ w (DECTABSR) - Request Tab Stop Report - Requests a list of tab stops. - The list is in the form: - - DCS 2 $ u Pt ST - - The string Pt is a list of tab stops separated by /s. - - SOURCE: VT320 - -CSI Pn1 ; Ps ; Pn2 ; Pn3 ; Pn4 ; Pn5 * y (DECRQCRA) - Request Checksum of Rectangular Area - Returns a checksum for the specified rectangular area. - Pn1 is an ID that is returned in the response. - Ps MUST be 1 - Pn2 specifies the top row of the rectangle - Pn3 specifies the left column of the rectangle - Pn4 specifies the bottom row of the rectangle - Pn5 specifies the right column of the rectangle - The return value is in the format of DCS Pn1 ! ~ xxxx ST - Where xxxx is the hex value of the checksum. - - Source: VT420 - -CSI Pn * z (DECINVM) - Invoke Macro - Invokes a macro. - Pn specifies the macro number. If Pn is not 0..63, no action is - taken. - -CSI = Ps1 ; Ps2 { (CTOSF) - NON-STANDARD EXTENSION (Deprecated) - Defaults: Ps1 = 255 Ps2 = 0 - Indicates that a font block is following. - Ps1 indicates the font slot to place the loaded font into. This must - be higher than the last default defined font (See CSI sp D for list - of predefined fonts) Ps2 indicates font size according to the - following table: - 0 - 8x16 font, 4096 bytes. - 1 - 8x14 font, 3584 bytes. - 2 - 8x8 font, 2048 bytes. - - The DCS font string should be used instead as of CTerm 1.213 - - SOURCE: CTerm only. - -"ANSI" Music -============ -This is the place where the BBS world completely fell on it's face in ANSI -usage. A programmer with either TeleMate or QModem (the first two programs to -support "ANSI" music as far as I can tell) decided they needed a method of -playing music on a BBS connection. They decided to add an "unused" ANSI code -and go their merry way. Since their product didn't implement CSI M (Delete -line) they assumed it was unused and blissfully broke the spec. They defined -"ANSI" music as: -CSI M <music string> 0x0e - -They used a subset of IBM BASICs PLAY statement functionality for ANSI music -strings which often start with "MF" or "MB", so the M after the CSI was often -considered as part of the music string. You would see things such as: -CSI MFABCD 0x0e and the F would not be played as a note. This just added -further confusion to the mess. - -Later on, BananaCom realized the conflict between delete line and music, so -they added *another* broken code CSI N (Properly, erase in field... not -implemented in many BBS clients) which was to provide an "unbroken" method of -playing music strings. They also used CSI Y to disambiguate delete line, CSI Y -is supposed to be a vertical tab (also not implemented in very many clients). -BananaCom also introduced many more non-standard and standard-breaking control -sequences which are not supported by CTerm. - -CTerm has further introduced a standard compliant ANSI music introducer CSI | - -By default, CTerm allows both CSI N and CSI | to introduce a music string. -Allowed introducers are set by CSI = p1 M as defined above. - -The details of ANSI music then are as follows: -The following characters are allowed in music strings: -"aAbBcCdDeEfFgGlLmMnNoOpPsStT0123456789.-+#<> " -If any character not in this list is present, the music string is ignored as -is the introducing code. - -If the introducing code is CSI M the first char is examined, and if it is -a one of "BbFfLlSs" or if it is "N" or "n" and is not followed by a decimal -digit, then the music string is treated as though an M is located in front -of the first character. - -The music string is then parsed with the following sequences supported: -Mx sets misc. music parameters where x is one of the following: - F - Plays music in the foreground, waiting for music to complete - playing before more characters are processed. - B - Play music in the background, allowing normal processing to - continue. - N - "Normal" not legato, not staccato - L - Play notes legato - S - Play notes staccato -T### Sets the tempo of the music where ### is one or more decimal digits. - If the decimal number is greater than 255, it is forced to 255. - If it is less than 32, it is forced to 32. The number signifies - quarter notes per minute. - The default tempo is 120. -O### Sets the octave of the music where ### is one or more decimal digits. - If the decimal number is greater than 6, it is forced to 6. - The default octave is 4. -N### Plays a single note by number. Valid values are 0 - 71. Invalid - values are played as silence. Note zero is C in octave 0. - See following section for valid note modifiers. -A, B, C, D, E, F, G, or P Plays the named note or pause from the current - octave. An "Octave" is the rising sequence of the following notes: - C, C#, D, D#, E, F, F#, G, G#, A, A#, B - This is contrary to normal music terminology. - The special note "P" is a pause. - Notes may be followed by one or more modifier characters which - are applied in order. If one overrides a previous one, the last - is used. The valid modifiers are: - + - Sharp. The next highest semitone is played. - Each sharp character will move up one semitone, so "C++" - is equivalent to "D". - # - Sharp. The next highest semitone is played. - Each sharp character will move up one semitone, so "C##" - is equivalent to "D". - - - Flat. The next lowest semitone is played. - Each flat character will move down one semitone, so "D--" - is equivalent to "C". - . - Duration is 1.5 times what it would otherwise be. Dots are not - cumulative, so "C.." is equivalent to "C." - ### - Notelength as a reciprocal of the fraction of a whole note to - play the note for. For example, 4 would indicate a 1/4 note. - The default note length is 4. -L### Set the notelength parameter for all following notes which do not have - one specified (ie: override the quarter-note default) Legal note - lengths are 1-64 indicating the reciprocal of the fraction (ie: 4 - indicates a 1/4 note). -< Move the next lowest octave. - Octave cannot go above six or below zero. -> Move to the next highest octave. - Octave cannot go above six or below zero. - -The lowest playable character is C in octave zero. The frequencies for the -six C notes for the seven octaves in rising order are: -65.406, 130.810, 261.620, 523.250, 1046.500, 2093.000, 4186.000 - -Purists will note that the lower three octaves are not exactly one half of -the next higher octave in frequency. This is due to lost resolution of -low frequencies. The notes *sound* correct to me. If anyone can give me -an excellent reason to change them (and more correct integer values for all -notes) I am willing to do that assuming the notes still sound "right". - -!!!PLEASE NOTE!!! If you are playing some ANSI Music then ask the user if they -heard it, ALWAYS follow it with an 0x0f 0x0e is the shift lock character which -*will* cause people with anything but an ANSI-BBS terminal (ie: *nix users -using the bundled telnet app) to have their screen messed up. 0x0f "undoes" -the 0x0e. diff --git a/ciolib/curs_cio.c b/ciolib/curs_cio.c deleted file mode 100644 index 01883602e9114a6dcbe6eeefd03fc17a5df4fdbe..0000000000000000000000000000000000000000 --- a/ciolib/curs_cio.c +++ /dev/null @@ -1,1354 +0,0 @@ -/* $Id: curs_cio.c,v 1.60 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <langinfo.h> -#include <locale.h> -#include <sys/time.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "gen_defs.h" /* xpdev, for BOOL/TRUE/FALSE */ - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "curs_cio.h" -#include "vidmodes.h" -#include "utf8_codepages.h" - -static unsigned char curs_nextgetch=0; - -static int lastattr=0; -static long mode; -static int vflags=0; -static int suspended = 0; -static int mpress = 0; -void curs_resume(void); - -static int default_font=0; -static int current_font[4]={0, 0, 0, 0}; - -static short curses_color(short color) -{ - switch(color) - { - case 0 : - return(COLOR_BLACK); - case 1 : - return(COLOR_BLUE); - case 2 : - return(COLOR_GREEN); - case 3 : - return(COLOR_CYAN); - case 4 : - return(COLOR_RED); - case 5 : - return(COLOR_MAGENTA); - case 6 : - return(COLOR_YELLOW); - case 7 : - return(COLOR_WHITE); - case 8 : - return(COLOR_BLACK+8); - case 9 : - return(COLOR_BLUE+8); - case 10 : - return(COLOR_GREEN+8); - case 11 : - return(COLOR_CYAN+8); - case 12 : - return(COLOR_RED+8); - case 13 : - return(COLOR_MAGENTA+8); - case 14 : - return(COLOR_YELLOW+8); - case 15 : - return(COLOR_WHITE+8); - } - return(0); -} - -static int _putch(unsigned char ch, BOOL refresh_now, int cp) -{ - int ret; - cchar_t cha; - wchar_t wch[2] = {0}; - attr_t attr = 0; - short cpair = 0; - - attr_get(&attr, &cpair, NULL); - attr &= ~A_COLOR; - switch (mode) { - case CIOLIB_MODE_CURSES_ASCII: - switch(ch) - { - case 30: - wch[0]=ACS_UARROW & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 31: - wch[0]=ACS_DARROW & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 176: - wch[0]=ACS_CKBOARD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 177: - wch[0]=ACS_BOARD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 178: - wch[0]=ACS_BOARD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 179: - wch[0]=ACS_SBSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 180: - wch[0]=ACS_SBSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 181: - wch[0]=ACS_SBSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 182: - wch[0]=ACS_DBDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 183: - wch[0]=ACS_BBDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 184: - wch[0]=ACS_BBSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 185: - wch[0]=ACS_DBDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 186: - wch[0]=ACS_DBDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 187: - wch[0]=ACS_BBDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 188: - wch[0]=ACS_DBBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 189: - wch[0]=ACS_DBBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 190: - wch[0]=ACS_SBBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 191: - wch[0]=ACS_BBSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 192: - wch[0]=ACS_SSBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 193: - wch[0]=ACS_SSBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 194: - wch[0]=ACS_BSSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 195: - wch[0]=ACS_SSSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 196: - wch[0]=ACS_BSBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 197: - wch[0]=ACS_SSSS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 198: - wch[0]=ACS_SDSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 199: - wch[0]=ACS_DSDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 200: - wch[0]=ACS_DDBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 201: - wch[0]=ACS_BDDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 202: - wch[0]=ACS_DDBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 203: - wch[0]=ACS_BDDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 204: - wch[0]=ACS_DDDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 205: - wch[0]=ACS_BDBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 206: - wch[0]=ACS_DDDD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 207: - wch[0]=ACS_SDBD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 208: - wch[0]=ACS_DSBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 209: - wch[0]=ACS_BDSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 210: - wch[0]=ACS_BSDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 211: - wch[0]=ACS_DSBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 212: - wch[0]=ACS_SDBB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 213: - wch[0]=ACS_BDSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 214: - wch[0]=ACS_BSDB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 215: - wch[0]=ACS_DSDS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 216: - wch[0]=ACS_SDSD & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 217: - wch[0]=ACS_SBBS & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 218: - wch[0]=ACS_BSSB & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 219: - wch[0]=ACS_BLOCK & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - case 254: - wch[0]=ACS_BULLET & A_CHARTEXT; - attr |= WA_ALTCHARSET; - break; - default: - wch[0]=ch; - } - break; - case CIOLIB_MODE_CURSES_IBM: - wch[0]=ch; - break; - case CIOLIB_MODE_CURSES: - wch[0] = cpoint_from_cpchar_ext(cp, ch); - break; - } - - if(!wch[0]) { - wch[0]=' '; - attr |= WA_BOLD; - } - else { - attr &= ~WA_BOLD; - } - curs_resume(); - if (wch[0] < ' ') { - attr |= WA_REVERSE; - wch[0] = wch[0] + 'A' - 1; - } - - setcchar(&cha, wch, attr, cpair, NULL); - ret = add_wch(&cha); - - if(!hold_update) { - if(refresh_now) - refresh(); - } - - return(ret); -} - -int curs_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - int fillpos=0; - unsigned char attr; - unsigned char fill_char; - unsigned char orig_attr; - int oldx, oldy; - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) - return(0); - - curs_resume(); - getyx(stdscr,oldy,oldx); - orig_attr=lastattr; - for(y=sy-1;y<ey;y++) - { - for(x=sx-1;x<ex;x++) - { - fill_char=fill[fillpos].ch; - attr=fill[fillpos].legacy_attr; - textattr(attr); - move(y, x); - _putch(fill_char,FALSE,conio_fontdata[fill[fillpos].font].cp); - fillpos++; - } - } - textattr(orig_attr); - move(oldy, oldx); - if(!hold_update) - refresh(); - return(1); -} - -int curs_puttext(int sx, int sy, int ex, int ey, void *fillbuf) -{ - int x,y; - int fillpos=0; - unsigned char attr; - unsigned char fill_char; - unsigned char orig_attr; - int oldx, oldy; - unsigned char *fill; - - fill = fillbuf; - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > cio_textinfo.screenwidth - || sy > cio_textinfo.screenheight - || sx > ex - || sy > ey - || ex > cio_textinfo.screenwidth - || ey > cio_textinfo.screenheight - || fill==NULL) - return(0); - - curs_resume(); - getyx(stdscr,oldy,oldx); - orig_attr=lastattr; - for(y=sy-1;y<ey;y++) - { - for(x=sx-1;x<ex;x++) - { - fill_char=fill[fillpos++]; - attr=fill[fillpos++]; - textattr(attr); - move(y, x); - _putch(fill_char,FALSE,getcodepage()); - } - } - textattr(orig_attr); - move(oldy, oldx); - if(!hold_update) - refresh(); - return(1); -} - -int curs_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fill) -{ - int x,y; - int fillpos=0; - unsigned char attrib; - unsigned char colour; - int oldx, oldy; - unsigned char thischar; - int ext_char; - struct text_info ti; - attr_t attr; - cchar_t cchar; - int fnt = current_font[0]; - int cp; - fd_set cp_checked; - - curs_resume(); - gettextinfo(&ti); - - if( sx < 1 - || sy < 1 - || ex < 1 - || ey < 1 - || sx > ti.screenwidth - || sy > ti.screenheight - || sx > ex - || sy > ey - || ex > ti.screenwidth - || ey > ti.screenheight - || fill==NULL) - return(0); - - getyx(stdscr,oldy,oldx); - for(y=sy-1;y<=ey-1;y++) - { - for(x=sx-1;x<=ex-1;x++) - { - mvin_wch(y, x, &cchar); - attr = cchar.attr; - thischar = ext_char = cchar.chars[0]; - if(attr&WA_REVERSE) { - thischar=(thischar)-'A'+1; - } - else { - switch (mode) { - case CIOLIB_MODE_CURSES_ASCII: - /* likely ones */ - if (attr & WA_ALTCHARSET) { - if (ext_char == (ACS_CKBOARD & A_CHARTEXT)) - { - thischar=176; - } - else if (ext_char == (ACS_BOARD & A_CHARTEXT)) - { - thischar=177; - } - else if (ext_char == (ACS_BSSB & A_CHARTEXT)) - { - thischar=218; - } - else if (ext_char == (ACS_SSBB & A_CHARTEXT)) - { - thischar=192; - } - else if (ext_char == (ACS_BBSS & A_CHARTEXT)) - { - thischar=191; - } - else if (ext_char == (ACS_SBBS & A_CHARTEXT)) - { - thischar=217; - } - else if (ext_char == (ACS_SBSS & A_CHARTEXT)) - { - thischar=180; - } - else if (ext_char == (ACS_SSSB & A_CHARTEXT)) - { - thischar=195; - } - else if (ext_char == (ACS_SSBS & A_CHARTEXT)) - { - thischar=193; - } - else if (ext_char == (ACS_BSSS & A_CHARTEXT)) - { - thischar=194; - } - else if (ext_char == (ACS_BSBS & A_CHARTEXT)) - { - thischar=196; - } - else if (ext_char == (ACS_SBSB & A_CHARTEXT)) - { - thischar=179; - } - else if (ext_char == (ACS_SSSS & A_CHARTEXT)) - { - thischar=197; - } - else if (ext_char == (ACS_BLOCK & A_CHARTEXT)) - { - thischar=219; - } - else if (ext_char == (ACS_UARROW & A_CHARTEXT)) - { - thischar=30; - } - else if (ext_char == (ACS_DARROW & A_CHARTEXT)) - { - thischar=31; - } - - /* unlikely (Not in ncurses) */ - else if (ext_char == (ACS_SBSD & A_CHARTEXT)) - { - thischar=181; - } - else if (ext_char == (ACS_DBDS & A_CHARTEXT)) - { - thischar=182; - } - else if (ext_char == (ACS_BBDS & A_CHARTEXT)) - { - thischar=183; - } - else if (ext_char == (ACS_BBSD & A_CHARTEXT)) - { - thischar=184; - } - else if (ext_char == (ACS_DBDD & A_CHARTEXT)) - { - thischar=185; - } - else if (ext_char == (ACS_DBDB & A_CHARTEXT)) - { - thischar=186; - } - else if (ext_char == (ACS_BBDD & A_CHARTEXT)) - { - thischar=187; - } - else if (ext_char == (ACS_DBBD & A_CHARTEXT)) - { - thischar=188; - } - else if (ext_char == (ACS_DBBS & A_CHARTEXT)) - { - thischar=189; - } - else if (ext_char == (ACS_SBBD & A_CHARTEXT)) - { - thischar=190; - } - else if (ext_char == (ACS_SDSB & A_CHARTEXT)) - { - thischar=198; - } - else if (ext_char == (ACS_DSDB & A_CHARTEXT)) - { - thischar=199; - } - else if (ext_char == (ACS_DDBB & A_CHARTEXT)) - { - thischar=200; - } - else if (ext_char == (ACS_BDDB & A_CHARTEXT)) - { - thischar=201; - } - else if (ext_char == (ACS_DDBD & A_CHARTEXT)) - { - thischar=202; - } - else if (ext_char == (ACS_BDDD & A_CHARTEXT)) - { - thischar=203; - } - else if (ext_char == (ACS_DDDB & A_CHARTEXT)) - { - thischar=204; - } - else if (ext_char == (ACS_BDBD & A_CHARTEXT)) - { - thischar=205; - } - else if (ext_char == (ACS_DDDD & A_CHARTEXT)) - { - thischar=206; - } - else if (ext_char == (ACS_SDBD & A_CHARTEXT)) - { - thischar=207; - } - else if (ext_char == (ACS_DSBS & A_CHARTEXT)) - { - thischar=208; - } - else if (ext_char == (ACS_BDSD & A_CHARTEXT)) - { - thischar=209; - } - else if (ext_char == (ACS_BSDS & A_CHARTEXT)) - { - thischar=210; - } - else if (ext_char == (ACS_DSBB & A_CHARTEXT)) - { - thischar=211; - } - else if (ext_char == (ACS_SDBB & A_CHARTEXT)) - { - thischar=212; - } - else if (ext_char == (ACS_BDSB & A_CHARTEXT)) - { - thischar=213; - } - else if (ext_char == (ACS_BSDB & A_CHARTEXT)) - { - thischar=214; - } - else if (ext_char == (ACS_DSDS & A_CHARTEXT)) - { - thischar=215; - } - else if (ext_char == (ACS_SDSD & A_CHARTEXT)) - { - thischar=216; - } - } - fnt = 0; - break; - case CIOLIB_MODE_CURSES_IBM: - if (ext_char == (ACS_UARROW & A_CHARTEXT)) - { - thischar=30; - } - else if (ext_char == (ACS_DARROW & A_CHARTEXT)) - { - thischar=31; - } - fnt = 0; - break; - case CIOLIB_MODE_CURSES: - thischar = cpchar_from_unicode_cpoint(getcodepage(), ext_char, 0); - if (thischar == 0 && ext_char != 0) { - FD_ZERO(&cp_checked); - for (fnt = 0; fnt < 256; fnt++) { - cp = conio_fontdata[fnt].cp; - if (!FD_ISSET(cp, &cp_checked)) { - FD_SET(cp, &cp_checked); - thischar = cpchar_from_unicode_cpoint(cp, ext_char, 0); - if (thischar) - break; - } - } - if (fnt == 256) { - fnt = current_font[0]; - thischar = '?'; - } - } - break; - } - } - fill[fillpos].ch=(unsigned char)(thischar); - attrib=0; - if (attr & WA_BOLD) { - if (thischar == ' ') - thischar = 0; - else - attrib |= 8; - } - if (attr & WA_BLINK) - { - attrib |= 128; - } - colour=PAIR_NUMBER(attr&A_COLOR)-1; - if (COLORS >= 16) - colour=colour&0x7f; - else - colour=((colour&56)<<1)|(colour&7); - fill[fillpos].legacy_attr = colour|attrib; - attr2palette(attrib, &fill[fillpos].fg, &fill[fillpos].bg); - fill[fillpos].font = fnt; - fillpos++; - } - } - move(oldy, oldx); - return(1); -} - -void curs_textattr(int attr) -{ - chtype attrs=WA_NORMAL; - int colour; - int fg,bg; - - if (lastattr==attr) - return; - - lastattr=attr; - - fg = attr & 0x0f; - bg = attr & 0xf0; - - if (vflags & CIOLIB_VIDEO_NOBRIGHT) - fg &= 0x07; - - if (!(vflags & CIOLIB_VIDEO_BGBRIGHT)) - bg &= 0x70; - - if (attr & 128) - { - if (!(vflags & CIOLIB_VIDEO_NOBLINK)) - attrs |= WA_BLINK; - } - - if (COLORS >= 16) { - colour = COLOR_PAIR( ((fg|bg)+1) ); - } - else { - if (fg & 8) { - attrs |= WA_BOLD; - } - colour = COLOR_PAIR( ((fg&7)|((bg&0x70)>>1))+1 ); - } - curs_resume(); -#ifdef NCURSES_VERSION_MAJOR - attrset(attrs); - color_set(colour, NULL); -#else - attrset(attrs|colour); -#endif - /* bkgdset(colour); */ - bkgdset(colour); - - cio_textinfo.attribute=attr; -} - -int curs_kbhit(void) -{ - struct timeval timeout; - fd_set rfds; - - if(curs_nextgetch) - return(1); - if(mpress || mouse_trywait()) { - mpress = 1; - return(1); - } - timeout.tv_sec=0; - timeout.tv_usec=0; - FD_ZERO(&rfds); - FD_SET(fileno(stdin),&rfds); - - return(select(fileno(stdin)+1,&rfds,NULL,NULL,&timeout)); -} - -void curs_gotoxy(int x, int y) -{ - int absx,absy; - absx=x+cio_textinfo.winleft-1; - absy=y+cio_textinfo.wintop-1; - - curs_resume(); - move(absy-1,absx-1); - if(!hold_update) - refresh(); - - cio_textinfo.curx=x; - cio_textinfo.cury=y; -} - -void curs_suspend(void) -{ - if (!suspended) { - noraw(); - endwin(); - } - suspended = 1; -} - -void curs_resume(void) -{ - if (suspended) { - raw(); - timeout(10); - refresh(); - getch(); - } - suspended = 0; -} - -int curs_initciolib(long inmode) -{ - short fg, bg, pair=0; - char *p; - - setlocale(LC_ALL, ""); - if (inmode == CIOLIB_MODE_AUTO) - inmode = CIOLIB_MODE_CURSES; - if (inmode == CIOLIB_MODE_CURSES) { - p = nl_langinfo(CODESET); - if (p == NULL) - inmode = CIOLIB_MODE_CURSES_ASCII; - else if (!strcasestr(p, "UTF")) - if (!strcasestr(p, "UCS2")) - if (!strcasestr(p, "Unicode")) - if (!strcasestr(p, "GB18030")) - inmode = CIOLIB_MODE_CURSES_ASCII; - } - -#ifdef XCURSES - char *argv[2]={"ciolib",NULL}; - - Xinitscr(1,argv); -#else - char *term; - SCREEN *tst; - - cio_api.options = 0; - - term=getenv("TERM"); - if(term==NULL) - return(0); - tst=newterm(term,stdout,stdin); - if(tst==NULL) - return(0); - endwin(); - initscr(); -#endif - start_color(); - cbreak(); - noecho(); - nonl(); - keypad(stdscr, TRUE); - scrollok(stdscr,FALSE); - halfdelay(1); - raw(); - timeout(10); - atexit(curs_suspend); - suspended = 0; - - /* Set up color pairs */ - if (COLORS >= 16) { - for(bg=0;bg<16;bg++) { - for(fg=0;fg<16;fg++) { - init_pair(++pair,curses_color(fg),curses_color(bg)); - } - } - } - else { - for(bg=0;bg<8;bg++) { - for(fg=0;fg<8;fg++) { - init_pair(++pair,curses_color(fg),curses_color(bg)); - } - } - } - mode = inmode; -#ifdef NCURSES_VERSION_MAJOR - { - mmask_t msk = BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION; -#ifdef BUTTON5_PRESSED - msk |= BUTTON4_PRESSED|BUTTON5_PRESSED; -#endif - if (mousemask(msk, NULL) == msk) { - mouseinterval(0); - cio_api.mouse=1; - } - else { - mousemask(0,NULL); - } - } -#endif - - if (COLORS >= 16) - cio_api.options = CONIO_OPT_BRIGHT_BACKGROUND; - if (can_change_color()) - cio_api.options |= CONIO_OPT_PALETTE_SETTING; - curs_textmode(0); - return(1); -} - -void curs_setcursortype(int type) { - curs_resume(); - switch(type) { - case _NOCURSOR: - curs_set(0); - break; - - case _SOLIDCURSOR: - curs_set(2); - break; - - default: /* Normal cursor */ - curs_set(1); - break; - - } - if(!hold_update) - refresh(); -} - -int curs_getch(void) -{ - wint_t ch; -#ifdef NCURSES_VERSION_MAJOR - MEVENT mevnt; -#endif - - if(curs_nextgetch) { - ch=curs_nextgetch; - curs_nextgetch=0; - } - else { - curs_resume(); - while(get_wch(&ch)==ERR) { - if(mpress || mouse_trywait()) { - mpress = 0; - curs_nextgetch=CIO_KEY_MOUSE>>8; - return(CIO_KEY_MOUSE & 0xff); - } - } - switch(ch) { - case KEY_DOWN: /* Down-arrow */ - curs_nextgetch=0x50; - ch=0; - break; - - case KEY_UP: /* Up-arrow */ - curs_nextgetch=0x48; - ch=0; - break; - - case KEY_LEFT: /* Left-arrow */ - curs_nextgetch=0x4b; - ch=0; - break; - - case KEY_RIGHT: /* Right-arrow */ - curs_nextgetch=0x4d; - ch=0; - break; - - case KEY_HOME: /* Home key (upward+left arrow) */ - curs_nextgetch=0x47; - ch=0; - break; - - case KEY_BACKSPACE: /* Backspace (unreliable) */ - ch=8; - break; - - case KEY_F(1): /* Function Key */ - curs_nextgetch=0x3b; - ch=0; - break; - - case KEY_F(2): /* Function Key */ - curs_nextgetch=0x3c; - ch=0; - break; - - case KEY_F(3): /* Function Key */ - curs_nextgetch=0x3d; - ch=0; - break; - - case KEY_F(4): /* Function Key */ - curs_nextgetch=0x3e; - ch=0; - break; - - case KEY_F(5): /* Function Key */ - curs_nextgetch=0x3f; - ch=0; - break; - - case KEY_F(6): /* Function Key */ - curs_nextgetch=0x40; - ch=0; - break; - - case KEY_F(7): /* Function Key */ - curs_nextgetch=0x41; - ch=0; - break; - - case KEY_F(8): /* Function Key */ - curs_nextgetch=0x42; - ch=0; - break; - - case KEY_F(9): /* Function Key */ - curs_nextgetch=0x43; - ch=0; - break; - - case KEY_F(10): /* Function Key */ - curs_nextgetch=0x44; - ch=0; - break; - - case KEY_F(11): /* Function Key */ - curs_nextgetch=0x57; - ch=0; - break; - - case KEY_F(12): /* Function Key */ - curs_nextgetch=0x58; - ch=0; - break; - - case KEY_DC: /* Delete character */ - curs_nextgetch=0x53; - ch=0; - break; - - case KEY_IC: /* Insert char or enter insert mode */ - curs_nextgetch=0x52; - ch=0; - break; - - case KEY_EIC: /* Exit insert char mode */ - curs_nextgetch=0x52; - ch=0; - break; - - case KEY_NPAGE: /* Next page */ - curs_nextgetch=0x51; - ch=0; - break; - - case KEY_PPAGE: /* Previous page */ - curs_nextgetch=0x49; - ch=0; - break; - - case KEY_ENTER: /* Enter or send (unreliable) */ - curs_nextgetch=0x0d; - ch=0; - break; - - case KEY_A1: /* Upper left of keypad */ - curs_nextgetch=0x47; - ch=0; - break; - - case KEY_A3: /* Upper right of keypad */ - curs_nextgetch=0x49; - ch=0; - break; - - case KEY_B2: /* Center of keypad */ - curs_nextgetch=0x4c; - ch=0; - break; - - case KEY_C1: /* Lower left of keypad */ - curs_nextgetch=0x4f; - ch=0; - break; - - case KEY_C3: /* Lower right of keypad */ - curs_nextgetch=0x51; - ch=0; - break; - - case KEY_BEG: /* Beg (beginning) */ - curs_nextgetch=0x47; - ch=0; - break; - - case KEY_CANCEL: /* Cancel */ - curs_nextgetch=0x03; - ch=0; - break; - - case KEY_END: /* End */ - curs_nextgetch=0x4f; - ch=0; - break; - - case KEY_SELECT: /* Select - Is "End" in X */ - curs_nextgetch=0x4f; - ch=0; - break; - -#ifdef NCURSES_VERSION_MAJOR - case KEY_MOUSE: /* Mouse stuff */ - if(getmouse(&mevnt)==OK) { - int evnt=0; - switch(mevnt.bstate) { - case BUTTON1_PRESSED: - evnt=CIOLIB_BUTTON_1_PRESS; - break; - case BUTTON1_RELEASED: - evnt=CIOLIB_BUTTON_1_RELEASE; - break; - case BUTTON2_PRESSED: - evnt=CIOLIB_BUTTON_2_PRESS; - break; - case BUTTON2_RELEASED: - evnt=CIOLIB_BUTTON_2_RELEASE; - break; - case BUTTON3_PRESSED: - evnt=CIOLIB_BUTTON_3_PRESS; - break; - case BUTTON3_RELEASED: - evnt=CIOLIB_BUTTON_3_RELEASE; - break; -#ifdef BUTTON5_PRESSED - case BUTTON4_PRESSED: - evnt=CIOLIB_BUTTON_4_PRESS; - break; - case BUTTON5_PRESSED: - evnt=CIOLIB_BUTTON_5_PRESS; - break; -#endif - case REPORT_MOUSE_POSITION: - evnt=CIOLIB_MOUSE_MOVE; - break; - } - ciomouse_gotevent(evnt, mevnt.x+1, mevnt.y+1, -1, -1); - } - break; -#endif - - default: - // Don't translate CTRL-x "keys"... - if (ch >= 32) - ch = cpchar_from_unicode_cpoint(getcodepage(), ch, 0); - break; - } - } - return(ch); -} - -static int -scale_integer_up(int from) -{ - int ret = from * 1000 / 256; - - if (ret < 0) - ret = 0; - if (ret > 1000) - ret = 1000; - return ret; -} - -uint32_t palette[16]; -int curs_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) -{ - uint32_t fg = attr & 0x0f; - uint32_t bg = (attr >> 4) & 0x0f; - - if (!(vflags & CIOLIB_VIDEO_BGBRIGHT)) - bg &= 0x07; - if (vflags & CIOLIB_VIDEO_NOBRIGHT) - fg &= 0x07; - - if (fgp) - *fgp = palette[fg]; - if (bgp) - *bgp = palette[bg]; - - return 1; -} - -int curs_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) -{ - if (!can_change_color()) - return 0; - init_color(curses_color(entry), scale_integer_up(r>>8), scale_integer_up(g>>8), scale_integer_up(b>>8)); - return 1; -} - -int curs_set_modepalette(uint32_t p[16]) -{ - int i; - - if (!can_change_color()) - return 0; - memcpy(palette, p, sizeof(palette)); - for (i = 0; i < 16; i++) { - struct dac_colors *c; - c = &dac_default[p[i]]; - curs_setpalette(i, c->red<<8 | c->red, c->green<<8 | c->green, c->blue<<8 | c->blue); - } - return 1; -} - -int curs_get_modepalette(uint32_t p[16]) -{ - if (!can_change_color()) - return 0; - memcpy(p, palette, sizeof(palette)); - return 1; -} - -void curs_textmode(int mode) -{ - int vm; - int maxx, maxy; - - curs_resume(); - getmaxyx(stdscr, maxy, maxx); - if (maxy > 255) - maxy = 255; - if (maxx > 255) - maxx = 255; - cio_textinfo.screenheight = maxy; - cio_textinfo.screenwidth = maxx; - if(has_colors()) - cio_textinfo.currmode=COLOR_MODE; - else - cio_textinfo.currmode=MONO; - - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; - cio_textinfo.attribute=7; - cio_textinfo.normattr=7; - cio_textinfo.curx=1; - cio_textinfo.cury=1; - - if(can_change_color() && (vm = find_vmode(cio_textinfo.currmode)) != -1) { - curs_set_modepalette(palettes[vparams[vm].palette]); - cio_textinfo.normattr=cio_textinfo.attribute=vparams[vm].default_attr; - vflags = vparams[vm].flags; - } - - return; -} - -int curs_hidemouse(void) -{ -/* - #ifdef NCURSES_VERSION_MAJOR - mousemask(0,NULL); - return(0); - #else - return(-1); - #endif -*/ - return(-1); -} - -int curs_showmouse(void) -{ -/* - #ifdef NCURSES_VERSION_MAJOR - if(mousemask(BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION,NULL)==BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION) - return(0); - #endif - return(-1); -*/ - return(-1); -} - -void curs_beep(void) -{ - curs_resume(); - beep(); -} - -int curs_getvideoflags(void) -{ - return vflags; -} - -void curs_setvideoflags(int flags) -{ - flags &= (CIOLIB_VIDEO_NOBRIGHT|CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK); - if (COLORS < 16) - flags &= ~CIOLIB_VIDEO_BGBRIGHT; - vflags = flags; -} - -int curs_setfont(int font, int force, int font_num) -{ - if (mode != CIOLIB_MODE_CURSES) - return 0; - - if(font < 0 || font>(sizeof(conio_fontdata)/sizeof(struct conio_font_data_struct)-2)) - return(0); - - switch(font_num) { - case 0: - default_font=font; - /* Fall-through */ - case 1: - current_font[0]=font; - break; - case 2: - case 3: - case 4: - current_font[font_num-1]=font; - break; - } - - return(1); -} - -int curs_getfont(int font_num) -{ - int ret; - - if (font_num == 0) - ret = default_font; - else if (font_num > 4) - ret = -1; - else - ret = current_font[font_num - 1]; - - return ret; -} diff --git a/ciolib/curs_cio.h b/ciolib/curs_cio.h deleted file mode 100644 index 5292e8bdef9f6749e372842583b3555a41a4c71a..0000000000000000000000000000000000000000 --- a/ciolib/curs_cio.h +++ /dev/null @@ -1,80 +0,0 @@ -/* $Id: curs_cio.h,v 1.19 2020/05/02 08:46:44 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __unix__ -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#undef beep -#undef getch -#undef ungetch -#undef getmouse -#undef ungetmouse -#include "curs_fix.h" - -#ifdef __cplusplus -extern "C" { -#endif -int curs_puttext(int sx, int sy, int ex, int ey, void *fillbuf); -int curs_vmem_puttext(int sx, int sy, int ex, int ey, struct vmem_cell *fillbuf); -int curs_vmem_gettext(int sx, int sy, int ex, int ey, struct vmem_cell *fillbuf); -void curs_textattr(int attr); -int curs_kbhit(void); -void curs_gotoxy(int x, int y); -void curs_suspend(void); -void curs_resume(void); -int curs_initciolib(long inmode); -void curs_setcursortype(int type); -int curs_getch(void); -void curs_textmode(int mode); -int curs_hidemouse(void); -int curs_showmouse(void); -void curs_beep(void); -int curs_getvideoflags(void); -void curs_setvideoflags(int flags); -int curs_setfont(int font, int force, int font_num); -int curs_getfont(int font_num); -int curs_set_modepalette(uint32_t p[16]); -int curs_get_modepalette(uint32_t p[16]); -int curs_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); -int curs_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/curs_fix.h b/ciolib/curs_fix.h deleted file mode 100644 index a98cbe592ab0cdced60e01c27dc196d86a75b05c..0000000000000000000000000000000000000000 --- a/ciolib/curs_fix.h +++ /dev/null @@ -1,292 +0,0 @@ -/* $Id: curs_fix.h,v 1.6 2020/04/25 03:12:53 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __DARWIN__ - #define _XOPEN_SOURCE_EXTENDED 1 - #include <ncurses.h> -#else - #ifdef __OpenBSD__ - /* OpenBSD appears to ship with an old (5.7 from November 02, 2008) version - * of ncurses. This apparently predates both _XOPEN_SOURCE >= 500 and - * NCURSES_WIDECHAR support for enabling wide characters. - * so, define _XOPEN_SOURCE_EXTENDED to get these. */ - #define _XOPEN_SOURCE_EXTENDED 1 - #endif - #define NCURSES_WIDECHAR 1 - #ifdef XCURSES - #include <xcurses.h> - #else - #ifdef N_CURSES_LIB - #include <ncurses.h> - #else - #ifdef DEBIAN_HATES_YOU - #include <ncursesw/ncurses.h> - #else - #include <curses.h> - #endif - #endif - #endif -#endif - -#ifndef ACS_SBSD -#define ACS_SBSD ACS_SBSS -#endif - -#ifndef ACS_DBDS -#define ACS_DBDS ACS_SBSS -#endif - -#ifndef ACS_BBDS -#define ACS_BBDS ACS_BBSS -#endif - -#ifndef ACS_BBSD -#define ACS_BBSD ACS_BBSS -#endif - -#ifndef ACS_DBDD -#define ACS_DBDD ACS_SBSS -#endif - -#ifndef ACS_DBDB -#define ACS_DBDB ACS_SBSB -#endif - -#ifndef ACS_BBDD -#define ACS_BBDD ACS_BBSS -#endif - -#ifndef ACS_DBBD -#define ACS_DBBD ACS_SBBS -#endif - -#ifndef ACS_DBBS -#define ACS_DBBS ACS_SBBS -#endif - -#ifndef ACS_SBBD -#define ACS_SBBD ACS_SBBS -#endif - -#ifndef ACS_SDSB -#define ACS_SDSB ACS_SSSB -#endif - -#ifndef ACS_DSDB -#define ACS_DSDB ACS_SSSB -#endif - -#ifndef ACS_DDBB -#define ACS_DDBB ACS_SSBB -#endif - -#ifndef ACS_BDDB -#define ACS_BDDB ACS_BSSB -#endif - -#ifndef ACS_DDBD -#define ACS_DDBD ACS_SSBS -#endif - -#ifndef ACS_BDDD -#define ACS_BDDD ACS_BSSS -#endif - -#ifndef ACS_DDDB -#define ACS_DDDB ACS_SSSB -#endif - -#ifndef ACS_BDBD -#define ACS_BDBD ACS_BSBS -#endif - -#ifndef ACS_DDDD -#define ACS_DDDD ACS_SSSS -#endif - -#ifndef ACS_SDBD -#define ACS_SDBD ACS_SSBS -#endif - -#ifndef ACS_DSBS -#define ACS_DSBS ACS_SSBS -#endif - -#ifndef ACS_BDSD -#define ACS_BDSD ACS_BSSS -#endif - -#ifndef ACS_BSDS -#define ACS_BSDS ACS_BSSS -#endif - -#ifndef ACS_DSBB -#define ACS_DSBB ACS_SSBB -#endif - -#ifndef ACS_SDBB -#define ACS_SDBB ACS_SSBB -#endif - -#ifndef ACS_BDSB -#define ACS_BDSB ACS_BSSB -#endif - -#ifndef ACS_BSDB -#define ACS_BSDB ACS_BSSB -#endif - -#ifndef ACS_DSDS -#define ACS_DSDS ACS_SSSS -#endif - -#ifndef ACS_SDSD -#define ACS_SDSD ACS_SSSS -#endif - -// Now wide... -#ifndef WACS_SBSD -#define WACS_SBSD WACS_SBSS -#endif - -#ifndef WACS_DBDS -#define WACS_DBDS WACS_SBSS -#endif - -#ifndef WACS_BBDS -#define WACS_BBDS WACS_BBSS -#endif - -#ifndef WACS_BBSD -#define WACS_BBSD WACS_BBSS -#endif - -#ifndef WACS_DBDD -#define WACS_DBDD WACS_SBSS -#endif - -#ifndef WACS_DBDB -#define WACS_DBDB WACS_SBSB -#endif - -#ifndef WACS_BBDD -#define WACS_BBDD WACS_BBSS -#endif - -#ifndef WACS_DBBD -#define WACS_DBBD WACS_SBBS -#endif - -#ifndef WACS_DBBS -#define WACS_DBBS WACS_SBBS -#endif - -#ifndef WACS_SBBD -#define WACS_SBBD WACS_SBBS -#endif - -#ifndef WACS_SDSB -#define WACS_SDSB WACS_SSSB -#endif - -#ifndef WACS_DSDB -#define WACS_DSDB WACS_SSSB -#endif - -#ifndef WACS_DDBB -#define WACS_DDBB WACS_SSBB -#endif - -#ifndef WACS_BDDB -#define WACS_BDDB WACS_BSSB -#endif - -#ifndef WACS_DDBD -#define WACS_DDBD WACS_SSBS -#endif - -#ifndef WACS_BDDD -#define WACS_BDDD WACS_BSSS -#endif - -#ifndef WACS_DDDB -#define WACS_DDDB WACS_SSSB -#endif - -#ifndef WACS_BDBD -#define WACS_BDBD WACS_BSBS -#endif - -#ifndef WACS_DDDD -#define WACS_DDDD WACS_SSSS -#endif - -#ifndef WACS_SDBD -#define WACS_SDBD WACS_SSBS -#endif - -#ifndef WACS_DSBS -#define WACS_DSBS WACS_SSBS -#endif - -#ifndef WACS_BDSD -#define WACS_BDSD WACS_BSSS -#endif - -#ifndef WACS_BSDS -#define WACS_BSDS WACS_BSSS -#endif - -#ifndef WACS_DSBB -#define WACS_DSBB WACS_SSBB -#endif - -#ifndef WACS_SDBB -#define WACS_SDBB WACS_SSBB -#endif - -#ifndef WACS_BDSB -#define WACS_BDSB WACS_BSSB -#endif - -#ifndef WACS_BSDB -#define WACS_BSDB WACS_BSSB -#endif - -#ifndef WACS_DSDS -#define WACS_DSDS WACS_SSSS -#endif - -#ifndef WACS_SDSD -#define WACS_SDSD WACS_SSSS -#endif diff --git a/ciolib/hqx.c b/ciolib/hqx.c deleted file mode 100644 index 2d7fd4db5144466d21d0ca7f703a78fe775f74c8..0000000000000000000000000000000000000000 --- a/ciolib/hqx.c +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (c) 2014 Clément Bœsch - * - * This file is part of FFmpeg. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/** - * @file - * hqx magnification filters (hq2x, hq3x, hq4x) - * - * Originally designed by Maxim Stephin. - * - * @see http://en.wikipedia.org/wiki/Hqx - * @see http://web.archive.org/web/20131114143602/http://www.hiend3d.com/hq3x.html - * @see http://blog.pkh.me/p/19-butchering-hqx-scaling-filters.html - */ - -#include <inttypes.h> - -#if 0 -/* (c1*w1 + c2*w2) >> s */ -inline __attribute__((always_inline)) uint32_t interp_2px(uint32_t c1, int w1, uint32_t c2, int w2, int s) -{ - return (((((c1 & 0xff00ff00) >> 8) * w1 + ((c2 & 0xff00ff00) >> 8) * w2) << (8 - s)) & 0xff00ff00) | - (((((c1 & 0x00ff00ff) ) * w1 + ((c2 & 0x00ff00ff) ) * w2) >> s ) & 0x00ff00ff); -} - -/* (c1*w1 + c2*w2 + c3*w3) >> s */ -inline __attribute__((always_inline)) uint32_t interp_3px(uint32_t c1, int w1, uint32_t c2, int w2, uint32_t c3, int w3, int s) -{ - return (((((c1 & 0xff00ff00) >> 8) * w1 + ((c2 & 0xff00ff00) >> 8) * w2 + ((c3 & 0xff00ff00) >> 8) * w3) << (8 - s)) & 0xff00ff00) | - (((((c1 & 0x00ff00ff) ) * w1 + ((c2 & 0x00ff00ff) ) * w2 + ((c3 & 0x00ff00ff) ) * w3) >> s ) & 0x00ff00ff); -} -#else -/* (c1*w1 + c2*w2) >> s */ -inline __attribute__((always_inline)) uint32_t interp_2px(uint32_t c1, int w1, uint32_t c2, int w2, int s) -{ - return w2 > w1 ? c2 : c1; -} - -/* (c1*w1 + c2*w2 + c3*w3) >> s */ -inline __attribute__((always_inline)) uint32_t interp_3px(uint32_t c1, int w1, uint32_t c2, int w2, uint32_t c3, int w3, int s) -{ - if (w3 > w2 && w3 > w1) - return c3; - if (w2 > w1) - return c2; - return c1; -} -#endif - -/* m is the mask of diff with the center pixel that matters in the pattern, and - * r is the expected result (bit set to 1 if there is difference with the - * center, 0 otherwise) */ -#define P(m, r) ((k_shuffled & (m)) == (r)) - -/* adjust 012345678 to 01235678: the mask doesn't contain the (null) diff - * between the center/current pixel and itself */ -#define DROP4(z) ((z) > 4 ? (z)-1 : (z)) - -/* shuffle the input mask: move bit n (4-adjusted) to position stored in p<n> */ -#define SHF(x, rot, n) (((x) >> ((rot) ? 7-DROP4(n) : DROP4(n)) & 1) << DROP4(p##n)) - -/* used to check if there is YUV difference between 2 pixels */ -#define WDIFF(c1, c2) (c1 != c2) - -/* bootstrap template for every interpolation code. It defines the shuffled - * masks and surrounding pixels. The rot flag is used to indicate if it's a - * rotation; its basic effect is to shuffle k using p8..p0 instead of p0..p8 */ -#define INTERP_BOOTSTRAP(rot) \ - const int k_shuffled = SHF(k,rot,0) | SHF(k,rot,1) | SHF(k,rot,2) \ - | SHF(k,rot,3) | 0 | SHF(k,rot,5) \ - | SHF(k,rot,6) | SHF(k,rot,7) | SHF(k,rot,8); \ - \ - const uint32_t w0 = w[p0], w1 = w[p1], \ - w3 = w[p3], w4 = w[p4], w5 = w[p5], \ - w7 = w[p7] - -/* Assuming p0..p8 is mapped to pixels 0..8, this function interpolates the - * top-left pixel in the total of the 2x2 pixels to interpolates. The function - * is also used for the 3 other pixels */ -inline __attribute__((always_inline)) uint32_t hq2x_interp_1x1(int k, - const uint32_t *w, - int p0, int p1, int p2, - int p3, int p4, int p5, - int p6, int p7, int p8) -{ - INTERP_BOOTSTRAP(0); - - if ((P(0xbf,0x37) || P(0xdb,0x13)) && WDIFF(w1, w5)) - return interp_2px(w4, 3, w3, 1, 2); - if ((P(0xdb,0x49) || P(0xef,0x6d)) && WDIFF(w7, w3)) - return interp_2px(w4, 3, w1, 1, 2); - if ((P(0x0b,0x0b) || P(0xfe,0x4a) || P(0xfe,0x1a)) && WDIFF(w3, w1)) - return w4; - if ((P(0x6f,0x2a) || P(0x5b,0x0a) || P(0xbf,0x3a) || P(0xdf,0x5a) || - P(0x9f,0x8a) || P(0xcf,0x8a) || P(0xef,0x4e) || P(0x3f,0x0e) || - P(0xfb,0x5a) || P(0xbb,0x8a) || P(0x7f,0x5a) || P(0xaf,0x8a) || - P(0xeb,0x8a)) && WDIFF(w3, w1)) - return interp_2px(w4, 3, w0, 1, 2); - if (P(0x0b,0x08)) - return interp_3px(w4, 2, w0, 1, w1, 1, 2); - if (P(0x0b,0x02)) - return interp_3px(w4, 2, w0, 1, w3, 1, 2); - if (P(0x2f,0x2f)) - return interp_3px(w4, 14, w3, 1, w1, 1, 4); - if (P(0xbf,0x37) || P(0xdb,0x13)) - return interp_3px(w4, 5, w1, 2, w3, 1, 3); - if (P(0xdb,0x49) || P(0xef,0x6d)) - return interp_3px(w4, 5, w3, 2, w1, 1, 3); - if (P(0x1b,0x03) || P(0x4f,0x43) || P(0x8b,0x83) || P(0x6b,0x43)) - return interp_2px(w4, 3, w3, 1, 2); - if (P(0x4b,0x09) || P(0x8b,0x89) || P(0x1f,0x19) || P(0x3b,0x19)) - return interp_2px(w4, 3, w1, 1, 2); - if (P(0x7e,0x2a) || P(0xef,0xab) || P(0xbf,0x8f) || P(0x7e,0x0e)) - return interp_3px(w4, 2, w3, 3, w1, 3, 3); - if (P(0xfb,0x6a) || P(0x6f,0x6e) || P(0x3f,0x3e) || P(0xfb,0xfa) || - P(0xdf,0xde) || P(0xdf,0x1e)) - return interp_2px(w4, 3, w0, 1, 2); - if (P(0x0a,0x00) || P(0x4f,0x4b) || P(0x9f,0x1b) || P(0x2f,0x0b) || - P(0xbe,0x0a) || P(0xee,0x0a) || P(0x7e,0x0a) || P(0xeb,0x4b) || - P(0x3b,0x1b)) - return interp_3px(w4, 2, w3, 1, w1, 1, 2); - return interp_3px(w4, 6, w3, 1, w1, 1, 3); -} - -/* Assuming p0..p8 is mapped to pixels 0..8, this function interpolates the - * top-left and top-center pixel in the total of the 3x3 pixels to - * interpolates. The function is also used for the 3 other couples of pixels - * defining the outline. The center pixel is not defined through this function, - * since it's just the same as the original value. */ -inline __attribute__((always_inline)) void hq3x_interp_2x1(uint32_t *dst, int dst_linesize, - int k, - const uint32_t *w, - int pos00, int pos01, - int p0, int p1, int p2, - int p3, int p4, int p5, - int p6, int p7, int p8, - int rotate) -{ - INTERP_BOOTSTRAP(rotate); - - uint32_t *dst00 = &dst[dst_linesize*(pos00>>1) + (pos00&1)]; - uint32_t *dst01 = &dst[dst_linesize*(pos01>>1) + (pos01&1)]; - - if ((P(0xdb,0x49) || P(0xef,0x6d)) && WDIFF(w7, w3)) - *dst00 = interp_2px(w4, 3, w1, 1, 2); - else if ((P(0xbf,0x37) || P(0xdb,0x13)) && WDIFF(w1, w5)) - *dst00 = interp_2px(w4, 3, w3, 1, 2); - else if ((P(0x0b,0x0b) || P(0xfe,0x4a) || P(0xfe,0x1a)) && WDIFF(w3, w1)) - *dst00 = w4; - else if ((P(0x6f,0x2a) || P(0x5b,0x0a) || P(0xbf,0x3a) || P(0xdf,0x5a) || - P(0x9f,0x8a) || P(0xcf,0x8a) || P(0xef,0x4e) || P(0x3f,0x0e) || - P(0xfb,0x5a) || P(0xbb,0x8a) || P(0x7f,0x5a) || P(0xaf,0x8a) || - P(0xeb,0x8a)) && WDIFF(w3, w1)) - *dst00 = interp_2px(w4, 3, w0, 1, 2); - else if (P(0x4b,0x09) || P(0x8b,0x89) || P(0x1f,0x19) || P(0x3b,0x19)) - *dst00 = interp_2px(w4, 3, w1, 1, 2); - else if (P(0x1b,0x03) || P(0x4f,0x43) || P(0x8b,0x83) || P(0x6b,0x43)) - *dst00 = interp_2px(w4, 3, w3, 1, 2); - else if (P(0x7e,0x2a) || P(0xef,0xab) || P(0xbf,0x8f) || P(0x7e,0x0e)) - *dst00 = interp_2px(w3, 1, w1, 1, 1); - else if (P(0x4f,0x4b) || P(0x9f,0x1b) || P(0x2f,0x0b) || P(0xbe,0x0a) || - P(0xee,0x0a) || P(0x7e,0x0a) || P(0xeb,0x4b) || P(0x3b,0x1b)) - *dst00 = interp_3px(w4, 2, w3, 7, w1, 7, 4); - else if (P(0x0b,0x08) || P(0xf9,0x68) || P(0xf3,0x62) || P(0x6d,0x6c) || - P(0x67,0x66) || P(0x3d,0x3c) || P(0x37,0x36) || P(0xf9,0xf8) || - P(0xdd,0xdc) || P(0xf3,0xf2) || P(0xd7,0xd6) || P(0xdd,0x1c) || - P(0xd7,0x16) || P(0x0b,0x02)) - *dst00 = interp_2px(w4, 3, w0, 1, 2); - else - *dst00 = interp_3px(w4, 2, w3, 1, w1, 1, 2); - - if ((P(0xfe,0xde) || P(0x9e,0x16) || P(0xda,0x12) || P(0x17,0x16) || - P(0x5b,0x12) || P(0xbb,0x12)) && WDIFF(w1, w5)) - *dst01 = w4; - else if ((P(0x0f,0x0b) || P(0x5e,0x0a) || P(0xfb,0x7b) || P(0x3b,0x0b) || - P(0xbe,0x0a) || P(0x7a,0x0a)) && WDIFF(w3, w1)) - *dst01 = w4; - else if (P(0xbf,0x8f) || P(0x7e,0x0e) || P(0xbf,0x37) || P(0xdb,0x13)) - *dst01 = interp_2px(w1, 3, w4, 1, 2); - else if (P(0x02,0x00) || P(0x7c,0x28) || P(0xed,0xa9) || P(0xf5,0xb4) || - P(0xd9,0x90)) - *dst01 = interp_2px(w4, 3, w1, 1, 2); - else if (P(0x4f,0x4b) || P(0xfb,0x7b) || P(0xfe,0x7e) || P(0x9f,0x1b) || - P(0x2f,0x0b) || P(0xbe,0x0a) || P(0x7e,0x0a) || P(0xfb,0x4b) || - P(0xfb,0xdb) || P(0xfe,0xde) || P(0xfe,0x56) || P(0x57,0x56) || - P(0x97,0x16) || P(0x3f,0x1e) || P(0xdb,0x12) || P(0xbb,0x12)) - *dst01 = interp_2px(w4, 7, w1, 1, 3); - else - *dst01 = w4; -} - -/* Assuming p0..p8 is mapped to pixels 0..8, this function interpolates the - * top-left block of 2x2 pixels in the total of the 4x4 pixels (or 4 blocks) to - * interpolates. The function is also used for the 3 other blocks of 2x2 - * pixels. */ -inline __attribute__((always_inline)) void hq4x_interp_2x2(uint32_t *dst, int dst_linesize, - int k, - const uint32_t *w, - int pos00, int pos01, - int pos10, int pos11, - int p0, int p1, int p2, - int p3, int p4, int p5, - int p6, int p7, int p8) -{ - INTERP_BOOTSTRAP(0); - - uint32_t *dst00 = &dst[dst_linesize*(pos00>>1) + (pos00&1)]; - uint32_t *dst01 = &dst[dst_linesize*(pos01>>1) + (pos01&1)]; - uint32_t *dst10 = &dst[dst_linesize*(pos10>>1) + (pos10&1)]; - uint32_t *dst11 = &dst[dst_linesize*(pos11>>1) + (pos11&1)]; - - const int cond00 = (P(0xbf,0x37) || P(0xdb,0x13)) && WDIFF(w1, w5); - const int cond01 = (P(0xdb,0x49) || P(0xef,0x6d)) && WDIFF(w7, w3); - const int cond02 = (P(0x6f,0x2a) || P(0x5b,0x0a) || P(0xbf,0x3a) || - P(0xdf,0x5a) || P(0x9f,0x8a) || P(0xcf,0x8a) || - P(0xef,0x4e) || P(0x3f,0x0e) || P(0xfb,0x5a) || - P(0xbb,0x8a) || P(0x7f,0x5a) || P(0xaf,0x8a) || - P(0xeb,0x8a)) && WDIFF(w3, w1); - const int cond03 = P(0xdb,0x49) || P(0xef,0x6d); - const int cond04 = P(0xbf,0x37) || P(0xdb,0x13); - const int cond05 = P(0x1b,0x03) || P(0x4f,0x43) || P(0x8b,0x83) || - P(0x6b,0x43); - const int cond06 = P(0x4b,0x09) || P(0x8b,0x89) || P(0x1f,0x19) || - P(0x3b,0x19); - const int cond07 = P(0x0b,0x08) || P(0xf9,0x68) || P(0xf3,0x62) || - P(0x6d,0x6c) || P(0x67,0x66) || P(0x3d,0x3c) || - P(0x37,0x36) || P(0xf9,0xf8) || P(0xdd,0xdc) || - P(0xf3,0xf2) || P(0xd7,0xd6) || P(0xdd,0x1c) || - P(0xd7,0x16) || P(0x0b,0x02); - const int cond08 = (P(0x0f,0x0b) || P(0x2b,0x0b) || P(0xfe,0x4a) || - P(0xfe,0x1a)) && WDIFF(w3, w1); - const int cond09 = P(0x2f,0x2f); - const int cond10 = P(0x0a,0x00); - const int cond11 = P(0x0b,0x09); - const int cond12 = P(0x7e,0x2a) || P(0xef,0xab); - const int cond13 = P(0xbf,0x8f) || P(0x7e,0x0e); - const int cond14 = P(0x4f,0x4b) || P(0x9f,0x1b) || P(0x2f,0x0b) || - P(0xbe,0x0a) || P(0xee,0x0a) || P(0x7e,0x0a) || - P(0xeb,0x4b) || P(0x3b,0x1b); - const int cond15 = P(0x0b,0x03); - - if (cond00) - *dst00 = interp_2px(w4, 5, w3, 3, 3); - else if (cond01) - *dst00 = interp_2px(w4, 5, w1, 3, 3); - else if ((P(0x0b,0x0b) || P(0xfe,0x4a) || P(0xfe,0x1a)) && WDIFF(w3, w1)) - *dst00 = w4; - else if (cond02) - *dst00 = interp_2px(w4, 5, w0, 3, 3); - else if (cond03) - *dst00 = interp_2px(w4, 3, w3, 1, 2); - else if (cond04) - *dst00 = interp_2px(w4, 3, w1, 1, 2); - else if (cond05) - *dst00 = interp_2px(w4, 5, w3, 3, 3); - else if (cond06) - *dst00 = interp_2px(w4, 5, w1, 3, 3); - else if (P(0x0f,0x0b) || P(0x5e,0x0a) || P(0x2b,0x0b) || P(0xbe,0x0a) || - P(0x7a,0x0a) || P(0xee,0x0a)) - *dst00 = interp_2px(w1, 1, w3, 1, 1); - else if (cond07) - *dst00 = interp_2px(w4, 5, w0, 3, 3); - else - *dst00 = interp_3px(w4, 2, w1, 1, w3, 1, 2); - - if (cond00) - *dst01 = interp_2px(w4, 7, w3, 1, 3); - else if (cond08) - *dst01 = w4; - else if (cond02) - *dst01 = interp_2px(w4, 3, w0, 1, 2); - else if (cond09) - *dst01 = w4; - else if (cond10) - *dst01 = interp_3px(w4, 5, w1, 2, w3, 1, 3); - else if (P(0x0b,0x08)) - *dst01 = interp_3px(w4, 5, w1, 2, w0, 1, 3); - else if (cond11) - *dst01 = interp_2px(w4, 5, w1, 3, 3); - else if (cond04) - *dst01 = interp_2px(w1, 3, w4, 1, 2); - else if (cond12) - *dst01 = interp_3px(w1, 2, w4, 1, w3, 1, 2); - else if (cond13) - *dst01 = interp_2px(w1, 5, w3, 3, 3); - else if (cond05) - *dst01 = interp_2px(w4, 7, w3, 1, 3); - else if (P(0xf3,0x62) || P(0x67,0x66) || P(0x37,0x36) || P(0xf3,0xf2) || - P(0xd7,0xd6) || P(0xd7,0x16) || P(0x0b,0x02)) - *dst01 = interp_2px(w4, 3, w0, 1, 2); - else if (cond14) - *dst01 = interp_2px(w1, 1, w4, 1, 1); - else - *dst01 = interp_2px(w4, 3, w1, 1, 2); - - if (cond01) - *dst10 = interp_2px(w4, 7, w1, 1, 3); - else if (cond08) - *dst10 = w4; - else if (cond02) - *dst10 = interp_2px(w4, 3, w0, 1, 2); - else if (cond09) - *dst10 = w4; - else if (cond10) - *dst10 = interp_3px(w4, 5, w3, 2, w1, 1, 3); - else if (P(0x0b,0x02)) - *dst10 = interp_3px(w4, 5, w3, 2, w0, 1, 3); - else if (cond15) - *dst10 = interp_2px(w4, 5, w3, 3, 3); - else if (cond03) - *dst10 = interp_2px(w3, 3, w4, 1, 2); - else if (cond13) - *dst10 = interp_3px(w3, 2, w4, 1, w1, 1, 2); - else if (cond12) - *dst10 = interp_2px(w3, 5, w1, 3, 3); - else if (cond06) - *dst10 = interp_2px(w4, 7, w1, 1, 3); - else if (P(0x0b,0x08) || P(0xf9,0x68) || P(0x6d,0x6c) || P(0x3d,0x3c) || - P(0xf9,0xf8) || P(0xdd,0xdc) || P(0xdd,0x1c)) - *dst10 = interp_2px(w4, 3, w0, 1, 2); - else if (cond14) - *dst10 = interp_2px(w3, 1, w4, 1, 1); - else - *dst10 = interp_2px(w4, 3, w3, 1, 2); - - if ((P(0x7f,0x2b) || P(0xef,0xab) || P(0xbf,0x8f) || P(0x7f,0x0f)) && - WDIFF(w3, w1)) - *dst11 = w4; - else if (cond02) - *dst11 = interp_2px(w4, 7, w0, 1, 3); - else if (cond15) - *dst11 = interp_2px(w4, 7, w3, 1, 3); - else if (cond11) - *dst11 = interp_2px(w4, 7, w1, 1, 3); - else if (P(0x0a,0x00) || P(0x7e,0x2a) || P(0xef,0xab) || P(0xbf,0x8f) || - P(0x7e,0x0e)) - *dst11 = interp_3px(w4, 6, w3, 1, w1, 1, 3); - else if (cond07) - *dst11 = interp_2px(w4, 7, w0, 1, 3); - else - *dst11 = w4; -} - -void hqx_filter(uint32_t* src, uint32_t* dst, int width, int height, int n) -{ - int x, y; - const int dst32_linesize = width * n; - const int src32_linesize = width; - uint32_t *src32, *dst32; - - src32 = src; - dst32 = dst; - for (y = 0; y < height; y++) { - const int prevline = y > 0 ? -src32_linesize : 0; - const int nextline = y < height - 1 ? src32_linesize : 0; - - for (x = 0; x < width; x++) { - const int prevcol = x > 0 ? -1 : 0; - const int nextcol = x < width -1 ? 1 : 0; - const uint32_t w[3*3] = { - src32[prevcol + prevline], src32[prevline], src32[prevline + nextcol], - src32[prevcol ], src32[ 0], src32[ nextcol], - src32[prevcol + nextline], src32[nextline], src32[nextline + nextcol] - }; - const uint32_t yuv1 = w[4]; - const int pattern = (w[4] != w[0] ? 1 : 0) - | (w[4] != w[1] ? 1 : 0) << 1 - | (w[4] != w[2] ? 1 : 0) << 2 - | (w[4] != w[3] ? 1 : 0) << 3 - | (w[4] != w[5] ? 1 : 0) << 4 - | (w[4] != w[6] ? 1 : 0) << 5 - | (w[4] != w[7] ? 1 : 0) << 6 - | (w[4] != w[8] ? 1 : 0) << 7; - - if (n == 2) { - dst32[dst32_linesize*0 + 0] = hq2x_interp_1x1(pattern, w, 0,1,2,3,4,5,6,7,8); // 00 - dst32[dst32_linesize*0 + 1] = hq2x_interp_1x1(pattern, w, 2,1,0,5,4,3,8,7,6); // 01 (vert mirrored) - dst32[dst32_linesize*1 + 0] = hq2x_interp_1x1(pattern, w, 6,7,8,3,4,5,0,1,2); // 10 (horiz mirrored) - dst32[dst32_linesize*1 + 1] = hq2x_interp_1x1(pattern, w, 8,7,6,5,4,3,2,1,0); // 11 (center mirrored) - } else if (n == 3) { - hq3x_interp_2x1(dst32, dst32_linesize, pattern, w, 0,1, 0,1,2,3,4,5,6,7,8, 0); // 00 01 - hq3x_interp_2x1(dst32 + 1, dst32_linesize, pattern, w, 1,3, 2,5,8,1,4,7,0,3,6, 1); // 02 12 (rotated to the right) - hq3x_interp_2x1(dst32 + 1*dst32_linesize, dst32_linesize, pattern, w, 2,0, 6,3,0,7,4,1,8,5,2, 1); // 20 10 (rotated to the left) - hq3x_interp_2x1(dst32 + 1*dst32_linesize + 1, dst32_linesize, pattern, w, 3,2, 8,7,6,5,4,3,2,1,0, 0); // 22 21 (center mirrored) - dst32[dst32_linesize + 1] = w[4]; // 11 - } else if (n == 4) { - hq4x_interp_2x2(dst32, dst32_linesize, pattern, w, 0,1,2,3, 0,1,2,3,4,5,6,7,8); // 00 01 10 11 - hq4x_interp_2x2(dst32 + 2, dst32_linesize, pattern, w, 1,0,3,2, 2,1,0,5,4,3,8,7,6); // 02 03 12 13 (vert mirrored) - hq4x_interp_2x2(dst32 + 2*dst32_linesize, dst32_linesize, pattern, w, 2,3,0,1, 6,7,8,3,4,5,0,1,2); // 20 21 30 31 (horiz mirrored) - hq4x_interp_2x2(dst32 + 2*dst32_linesize + 2, dst32_linesize, pattern, w, 3,2,1,0, 8,7,6,5,4,3,2,1,0); // 22 23 32 33 (center mirrored) - } else { - return; - } - - src32 += 1; - dst32 += n; - } - dst32 += dst32_linesize * (n - 1); - } -} diff --git a/ciolib/hqx.h b/ciolib/hqx.h deleted file mode 100644 index c9f347e05ca6090d1f32a6fd091fe005ef71fec2..0000000000000000000000000000000000000000 --- a/ciolib/hqx.h +++ /dev/null @@ -1,11 +0,0 @@ -#include <inttypes.h> - -#ifdef __cplusplus -extern "C" { -#endif - -void hqx_filter(uint32_t* src, uint32_t* dst, int height, int width, int n); - -#ifdef __cplusplus -} -#endif diff --git a/ciolib/keys.h b/ciolib/keys.h deleted file mode 100644 index 7a8bdc1f323b428fc365c5db2afecee59c5876a2..0000000000000000000000000000000000000000 --- a/ciolib/keys.h +++ /dev/null @@ -1,2 +0,0 @@ -/* This header file is dead. */ -#error This file is obsolete! diff --git a/ciolib/makefont.pl b/ciolib/makefont.pl deleted file mode 100755 index 65d57520081bce65f017e9befab60088feb5dfad..0000000000000000000000000000000000000000 --- a/ciolib/makefont.pl +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/local/bin/perl - -my @sources = ( - 'font/plane00/unifont-base.hex', - 'font/plane00/spaces.hex', - 'font/plane00/wqy.hex', - 'font/plane00/hangul-syllables.hex', - 'font/plane00/copyleft.hex', - 'font/plane00csur/plane00csur.hex', - 'font/plane00csur/plane00csur-spaces.hex', - 'font/plane00/alt/codepage-437.hex', - 'font/plane01/plane01.hex', - 'font/plane01/space.hex', - 'font/plane0E/plane0E.hex', - 'font/plane0Fcsur/plane0Fcsur.hex' -); - -my %font; -foreach my $source (@sources) { - open IN,'<',$source; - while (<IN>) { - chomp; - my ($code, $data) = split(':'); - $code = hex($code); - $data =~ s/([0-9A-F]{2})/\\x$1/g; - if (defined $font{$code} && $font{$code} ne $data) { - if ($source ne './font/plane00/alt/codepage-437.hex') { - die "Item $code already exists ($source)!"; - } - } - $font{$code} = $data; - } - close IN; -} - -print "#include <stdint.h>\n"; -print "#include <stdbool.h>\n\n"; -print "struct unifont_entry {\n"; -print " const uint32_t cp;\n"; -print " const bool wide;\n"; -print " const char * const data;\n"; -print "};\n\n"; -print "const struct unifont_entry unifont[",(scalar keys %font),"] = {\n"; -foreach my $cp (sort {$a <=> $b} keys %font) { - my $wide = length($font{$cp}) > 64 ? 1 : 0; - printf(" {0x%05x, %d, \"%s\"},\n", $cp, $wide, $font{$cp}); -} -print "};\n"; diff --git a/ciolib/mouse.c b/ciolib/mouse.c deleted file mode 100644 index 423016dff3175ea448ff4f8f247a6a2ec1e0eeec..0000000000000000000000000000000000000000 --- a/ciolib/mouse.c +++ /dev/null @@ -1,612 +0,0 @@ -/* $Id: mouse.c,v 1.48 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> -#include <string.h> - -#include <genwrap.h> -#include <semwrap.h> -#include <threadwrap.h> -#include <link_list.h> - -#include "ciolib.h" - -#define MSEC_CLOCK() (msclock()*MSCLOCKS_PER_SEC/1000) - -enum { - MOUSE_NOSTATE - ,MOUSE_SINGLEPRESSED - ,MOUSE_CLICKED - ,MOUSE_DOUBLEPRESSED - ,MOUSE_DOUBLECLICKED - ,MOUSE_TRIPLEPRESSED - ,MOUSE_TRIPLECLICKED - ,MOUSE_QUADPRESSED - ,MOUSE_QUADCLICKED - ,MOUSE_DRAGSTARTED -}; - -struct in_mouse_event { - int event; - int x; - int y; - int x_res; - int y_res; - clock_t ts; - void *nextevent; -}; - -struct out_mouse_event { - int event; - int bstate; - int kbsm; /* Known button state mask */ - int startx; - int starty; - int endx; - int endy; - int startx_res; - int starty_res; - int endx_res; - int endy_res; - void *nextevent; -}; - -struct mouse_state { - int buttonstate; /* Current state of all buttons - bitmap */ - int knownbuttonstatemask; /* Mask of buttons that have done something since - * We started watching... the rest are actually in - * an unknown state */ - int button_state[5]; /* Expanded state of each button */ - int button_x[5]; /* Start X/Y position of the current state */ - int button_y[5]; - int button_x_res[5]; /* Start X/Y position of the current state */ - int button_y_res[5]; - clock_t timeout[5]; /* Button event timeouts (timespecs ie: time of expiry) */ - int curx; /* Current X position */ - int cury; /* Current Y position */ - int curx_res; /* Current X position */ - int cury_res; /* Current Y position */ - int events; /* Currently enabled events */ - int click_timeout; /* Timeout between press and release events for a click (ms) */ - int multi_timeout; /* Timeout after a click for detection of multi clicks (ms) */ - int click_drift; /* Allowed "drift" during a click event */ - link_list_t input; - link_list_t output; -}; - -struct mouse_state state; -uint64_t mouse_events=0; -int ciolib_mouse_initialized=0; -static int ungot=0; -pthread_mutex_t unget_mutex; - -void init_mouse(void) -{ - memset(&state,0,sizeof(state)); - state.click_timeout=0; - state.multi_timeout=300; - listInit(&state.input,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - listInit(&state.output,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - pthread_mutex_init(&unget_mutex, NULL); - ciolib_mouse_initialized=1; -} - -void mousestate(int *x, int *y, uint8_t *buttons) -{ - if (!ciolib_mouse_initialized) { - if (x) - *x = -1; - if (y) - *y = -1; - return; - } - if (x) - *x = state.curx; - if (y) - *y = state.cury; - if (buttons) - *buttons = (state.buttonstate & 0xff); - return; -} - -void mousestate_res(int *x, int *y, uint8_t *buttons) -{ - if (!ciolib_mouse_initialized) { - if (x) - *x = -1; - if (y) - *y = -1; - return; - } - if (x) - *x = state.curx_res; - if (y) - *y = state.cury_res; - if (buttons) - *buttons = (state.buttonstate & 0xff); - return; -} - -uint64_t ciomouse_setevents(uint64_t events) -{ - mouse_events=events; - return mouse_events; -} - -uint64_t ciomouse_addevents(uint64_t events) -{ - mouse_events |= events; - return mouse_events; -} - -uint64_t ciomouse_delevents(uint64_t events) -{ - mouse_events &= ~events; - return mouse_events; -} - -uint64_t ciomouse_addevent(uint64_t event) -{ - mouse_events |= (UINT64_C(1)<<event); - return mouse_events; -} - -uint64_t ciomouse_delevent(uint64_t event) -{ - mouse_events &= ~(UINT64_C(1)<<event); - return mouse_events; -} - -void ciomouse_gotevent(int event, int x, int y, int x_res, int y_res) -{ - struct in_mouse_event *ime; - - while(!ciolib_mouse_initialized) - SLEEP(1); - ime=(struct in_mouse_event *)malloc(sizeof(struct in_mouse_event)); - if(ime) { - ime->ts=MSEC_CLOCK(); - ime->event=event; - ime->x=x; - ime->y=y; - ime->x_res=x_res; - ime->y_res=y_res; - ime->nextevent=NULL; - - listPushNode(&state.input,ime); - } -} - -void add_outevent(int event, int x, int y, int xres, int yres) -{ - struct out_mouse_event *ome; - int but; - - if(!(mouse_events & UINT64_C(1)<<event)) - return; - ome=(struct out_mouse_event *)malloc(sizeof(struct out_mouse_event)); - - if(ome) { - but=CIOLIB_BUTTON_NUMBER(event); - ome->event=event; - ome->bstate=state.buttonstate; - ome->kbsm=state.knownbuttonstatemask; - ome->startx=but?state.button_x[but-1]:state.curx; - ome->starty=but?state.button_y[but-1]:state.cury; - ome->endx=x; - ome->endy=y; - ome->startx_res=but ? state.button_x_res[but-1] : state.curx_res; - ome->starty_res=but ? state.button_y_res[but-1] : state.cury_res; - ome->endx_res=xres; - ome->endy_res=yres; - - ome->nextevent=(struct out_mouse_event *)NULL; - - listPushNode(&state.output,ome); - } -} - -int more_multies(int button, int clicks) -{ - switch(clicks) { - case 0: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_CLICK(button))) - return(1); - /* Fall-through */ - case 1: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_DBL_CLICK(button))) - return(1); - /* Fall-through */ - case 2: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_TRPL_CLICK(button))) - return(1); - /* Fall-through */ - case 3: - if(mouse_events & (UINT64_C(1)<<CIOLIB_BUTTON_QUAD_CLICK(button))) - return(1); - /* Fall-through */ - } - return(0); -} - -void ciolib_mouse_thread(void *data) -{ - int timedout; - int timeout_button=0; - int but; - int delay; - clock_t ttime=0; - - SetThreadName("Mouse"); - init_mouse(); - while(1) { - timedout=0; - if(timeout_button) { - delay=state.timeout[timeout_button-1]-MSEC_CLOCK(); - if(delay<=0) { - timedout=1; - } - else { - timedout=!listSemTryWaitBlock(&state.input,delay); - } - } - else { - listSemWait(&state.input); - } - if(timedout) { - state.timeout[timeout_button-1]=0; - switch(state.button_state[timeout_button-1]) { - case MOUSE_SINGLEPRESSED: - /* Press event */ - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_CLICKED: - /* Click Event */ - add_outevent(CIOLIB_BUTTON_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_DOUBLEPRESSED: - /* Click event, then press event */ - add_outevent(CIOLIB_BUTTON_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_DOUBLECLICKED: - /* Double-click event */ - add_outevent(CIOLIB_BUTTON_DBL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_TRIPLEPRESSED: - /* Double-click event, then press event */ - add_outevent(CIOLIB_BUTTON_DBL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_TRIPLECLICKED: - /* Triple-click event */ - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_QUADPRESSED: - /* Triple-click evetn then press event */ - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - add_outevent(CIOLIB_BUTTON_PRESS(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - break; - case MOUSE_QUADCLICKED: - add_outevent(CIOLIB_BUTTON_QUAD_CLICK(timeout_button),state.button_x[timeout_button-1],state.button_y[timeout_button-1],state.button_x_res[timeout_button-1],state.button_y_res[timeout_button-1]); - /* Quad click event (This doesn't need a timeout does it? */ - break; - } - state.button_state[timeout_button-1]=MOUSE_NOSTATE; - } - else { - struct in_mouse_event *in; - - in=listShiftNode(&state.input); - if(in==NULL) { - YIELD(); - continue; - } - but=CIOLIB_BUTTON_NUMBER(in->event); - if (in->x < 0) - in->x = state.curx; - if (in->y < 0) - in->y = state.cury; - if (in->x_res < 0) - in->x_res = state.curx_res; - if (in->y_res < 0) - in->y_res = state.cury_res; - - switch(CIOLIB_BUTTON_BASE(in->event)) { - case CIOLIB_MOUSE_MOVE: - if(in->x==state.curx && in->y==state.cury && - in->x_res==state.curx_res && in->y_res==state.cury_res) - break; - add_outevent(CIOLIB_MOUSE_MOVE,in->x,in->y,in->x_res, in->y_res); - for(but=1;but<=5;but++) { - switch(state.button_state[but-1]) { - case MOUSE_NOSTATE: - if(state.buttonstate & CIOLIB_BUTTON(but)) { - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - } - break; - case MOUSE_SINGLEPRESSED: - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_CLICKED: - add_outevent(CIOLIB_BUTTON_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - break; - case MOUSE_DOUBLEPRESSED: - add_outevent(CIOLIB_BUTTON_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_DOUBLECLICKED: - add_outevent(CIOLIB_BUTTON_DBL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - break; - case MOUSE_TRIPLEPRESSED: - add_outevent(CIOLIB_BUTTON_DBL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_TRIPLECLICKED: - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - break; - case MOUSE_QUADPRESSED: - add_outevent(CIOLIB_BUTTON_TRPL_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_START(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=MOUSE_DRAGSTARTED; - break; - case MOUSE_DRAGSTARTED: - add_outevent(CIOLIB_BUTTON_DRAG_MOVE(but),in->x,in->y, in->x_res, in->y_res); - break; - } - } - break; - case CIOLIB_BUTTON_1_PRESS: - state.buttonstate|=1<<(but-1); - state.knownbuttonstatemask|=1<<(but-1); - switch(state.button_state[but-1]) { - case MOUSE_NOSTATE: - state.button_state[but-1]=MOUSE_SINGLEPRESSED; - state.button_x[but-1]=in->x; - state.button_y[but-1]=in->y; - state.button_x_res[but-1]=in->x_res; - state.button_y_res[but-1]=in->y_res; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - if(!more_multies(but,0)) { - add_outevent(CIOLIB_BUTTON_PRESS(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.button_state[but-1]=MOUSE_NOSTATE; - state.timeout[but-1]=0; - } - // Scroll "buttons"... - if (but > 3) - state.button_state[but-1] = MOUSE_NOSTATE; - break; - case MOUSE_CLICKED: - state.button_state[but-1]=MOUSE_DOUBLEPRESSED; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - break; - case MOUSE_DOUBLECLICKED: - state.button_state[but-1]=MOUSE_TRIPLEPRESSED; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - break; - case MOUSE_TRIPLECLICKED: - state.button_state[but-1]=MOUSE_QUADPRESSED; - state.timeout[but-1]=MSEC_CLOCK()+state.click_timeout; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - if(state.click_timeout==0) - state.timeout[but-1]=0; - break; - } - break; - case CIOLIB_BUTTON_1_RELEASE: - state.buttonstate&= ~(1<<(but-1)); - state.knownbuttonstatemask|=1<<(but-1); - switch(state.button_state[but-1]) { - case MOUSE_NOSTATE: - state.button_x[but-1]=in->x; - state.button_y[but-1]=in->y; - state.button_x_res[but-1]=in->x_res; - state.button_y_res[but-1]=in->y_res; - add_outevent(CIOLIB_BUTTON_RELEASE(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - break; - case MOUSE_SINGLEPRESSED: - state.button_state[but-1]=MOUSE_CLICKED; - state.timeout[but-1]=more_multies(but,1)?MSEC_CLOCK()+state.multi_timeout:MSEC_CLOCK(); - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_DOUBLEPRESSED: - state.button_state[but-1]=MOUSE_DOUBLECLICKED; - state.timeout[but-1]=more_multies(but,2)?MSEC_CLOCK()+state.multi_timeout:MSEC_CLOCK(); - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_TRIPLEPRESSED: - state.button_state[but-1]=MOUSE_TRIPLECLICKED; - state.timeout[but-1]=more_multies(but,3)?MSEC_CLOCK()+state.multi_timeout:MSEC_CLOCK(); - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_QUADPRESSED: - state.button_state[but-1]=MOUSE_NOSTATE; - add_outevent(CIOLIB_BUTTON_QUAD_CLICK(but),state.button_x[but-1],state.button_y[but-1],state.button_x_res[but-1],state.button_y_res[but-1]); - state.timeout[but-1]=0; - if(state.timeout[but-1]==0) - state.timeout[but-1]=1; - break; - case MOUSE_DRAGSTARTED: - add_outevent(CIOLIB_BUTTON_DRAG_END(but),in->x,in->y, in->x_res, in->y_res); - state.button_state[but-1]=0; - } - } - state.curx=in->x; - state.cury=in->y; - state.curx_res=in->x_res; - state.cury_res=in->y_res; - - free(in); - } - - timeout_button=0; - for(but=1;but<=5;but++) { - if(state.button_state[but-1]==MOUSE_DRAGSTARTED && - (mouse_events & ((UINT64_C(1)<<CIOLIB_BUTTON_DRAG_START(but)) | (UINT64_C(1)<<CIOLIB_BUTTON_DRAG_MOVE(but)) | (UINT64_C(1)<<CIOLIB_BUTTON_DRAG_END(but)))) == 0) - state.button_state[but-1] = MOUSE_NOSTATE; - } - - for(but=1;but<=5;but++) { - if(state.button_state[but-1]!=MOUSE_NOSTATE - && state.button_state[but-1]!=MOUSE_DRAGSTARTED - && state.timeout[but-1]!=0 - && (timeout_button==0 || state.timeout[but-1]<ttime)) { - ttime=state.timeout[but-1]; - timeout_button=but; - } - } - } -} - -int mouse_trywait(void) -{ - int result; - - while(!ciolib_mouse_initialized) - SLEEP(1); - while(1) { - result=listSemTryWait(&state.output); - pthread_mutex_lock(&unget_mutex); - if(ungot==0) { - pthread_mutex_unlock(&unget_mutex); - return(result); - } - ungot--; - pthread_mutex_unlock(&unget_mutex); - } -} - -int mouse_wait(void) -{ - int result; - - while(!ciolib_mouse_initialized) - SLEEP(1); - while(1) { - result=listSemWait(&state.output); - pthread_mutex_lock(&unget_mutex); - if(ungot==0) { - pthread_mutex_unlock(&unget_mutex); - return(result); - } - ungot--; - pthread_mutex_unlock(&unget_mutex); - } -} - -int mouse_pending(void) -{ - while(!ciolib_mouse_initialized) - SLEEP(1); - return(listCountNodes(&state.output)); -} - -int ciolib_getmouse(struct mouse_event *mevent) -{ - int retval=0; - - while(!ciolib_mouse_initialized) - SLEEP(1); - if(listCountNodes(&state.output)) { - struct out_mouse_event *out; - out=listShiftNode(&state.output); - if(out==NULL) - return(-1); - if(mevent != NULL) { - mevent->event=out->event; - mevent->bstate=out->bstate; - mevent->kbsm=out->kbsm; - mevent->startx=out->startx; - mevent->starty=out->starty; - mevent->endx=out->endx; - mevent->endy=out->endy; - mevent->startx_res=out->startx_res; - mevent->starty_res=out->starty_res; - mevent->endx_res=out->endx_res; - mevent->endy_res=out->endy_res; - } - free(out); - } - else { - fprintf(stderr,"WARNING: attempt to get a mouse key when none pending!\n"); - if(mevent != NULL) - memset(mevent,0,sizeof(struct mouse_event)); - retval=-1; - } - return(retval); -} - -int ciolib_ungetmouse(struct mouse_event *mevent) -{ - struct mouse_event *me; - - if((me=(struct mouse_event *)malloc(sizeof(struct mouse_event)))==NULL) - return(-1); - memcpy(me,mevent,sizeof(struct mouse_event)); - pthread_mutex_lock(&unget_mutex); - if(listInsertNode(&state.output,me)==NULL) { - pthread_mutex_unlock(&unget_mutex); - return(FALSE); - } - ungot++; - pthread_mutex_unlock(&unget_mutex); - return(TRUE); -} diff --git a/ciolib/mouse.h b/ciolib/mouse.h deleted file mode 100644 index 7a8bdc1f323b428fc365c5db2afecee59c5876a2..0000000000000000000000000000000000000000 --- a/ciolib/mouse.h +++ /dev/null @@ -1,2 +0,0 @@ -/* This header file is dead. */ -#error This file is obsolete! diff --git a/ciolib/pasteboard.h b/ciolib/pasteboard.h deleted file mode 100644 index b0b0eb9c9fdc4ec725c751b86fa0534c422e64f2..0000000000000000000000000000000000000000 --- a/ciolib/pasteboard.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _PASTEBOARD_H_ -#define _PASTEBOARD_H_ - -#include <stddef.h> - -void OSX_copytext(const char *text, size_t len); -char *OSX_getcliptext(void); - -#endif diff --git a/ciolib/pasteboard.m b/ciolib/pasteboard.m deleted file mode 100644 index 31dcb2180d7de871f9786adb3470c4b5bc447e47..0000000000000000000000000000000000000000 --- a/ciolib/pasteboard.m +++ /dev/null @@ -1,34 +0,0 @@ -#import <Foundation/Foundation.h> -#import <Cocoa/Cocoa.h> - -#include <stddef.h> - -void OSX_copytext(const char *text, size_t len) -{ - NSString *cp = [[NSString alloc] initWithBytes:text length:len encoding:CFStringConvertEncodingToNSStringEncoding(CFStringConvertWindowsCodepageToEncoding(437))]; - if (cp != nil) { - NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; - [pasteboard clearContents]; - NSArray *copiedObjects = [NSArray arrayWithObject:cp]; - [pasteboard writeObjects:copiedObjects]; - } - [cp release]; -} - -char *OSX_getcliptext(void) -{ - NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; - NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; - NSDictionary *options = [NSDictionary dictionary]; - BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; - if (ok) { - NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; - NSString *ct = [objectsToPaste objectAtIndex:0]; - if (ct != nil) { - const char *ptr = [ct cStringUsingEncoding:CFStringConvertEncodingToNSStringEncoding(CFStringConvertWindowsCodepageToEncoding(437))]; - if (ptr) - return strdup(ptr); - } - } - return NULL; -} diff --git a/ciolib/petscii.c b/ciolib/petscii.c deleted file mode 100644 index 597d55c588bd3f05053b67b1e04e900f80a07088..0000000000000000000000000000000000000000 --- a/ciolib/petscii.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "ciolib.h" - -struct ascii_trans { - unsigned char native; - unsigned char cp437; -}; - -struct key_trans { - int keypress; - int translated; -}; - -struct ascii_trans display_petscii[] = { - {32,' '} - ,{33,'!'} - ,{34,'"'} - ,{35,'#'} - ,{36,'$'} - ,{37,'%'} - ,{38,'&'} - ,{39,'\''} - ,{40,'('} - ,{41,')'} - ,{42,'*'} - ,{43,'+'} - ,{44,','} - ,{45,'-'} - ,{46,'.'} - ,{47,'/'} - ,{48,'0'} - ,{49,'1'} - ,{50,'2'} - ,{51,'3'} - ,{52,'4'} - ,{53,'5'} - ,{54,'6'} - ,{55,'7'} - ,{56,'8'} - ,{57,'9'} - ,{58,':'} - ,{59,';'} - ,{60,'<'} - ,{61,'='} - ,{62,'>'} - ,{63,'?'} - ,{64,'@'} - ,{65,'a'} - ,{66,'b'} - ,{67,'c'} - ,{68,'d'} - ,{69,'e'} - ,{70,'f'} - ,{71,'g'} - ,{72,'h'} - ,{73,'i'} - ,{74,'j'} - ,{75,'k'} - ,{76,'l'} - ,{77,'m'} - ,{78,'n'} - ,{79,'o'} - ,{80,'p'} - ,{81,'q'} - ,{82,'r'} - ,{83,'s'} - ,{84,'t'} - ,{85,'u'} - ,{86,'v'} - ,{87,'w'} - ,{88,'x'} - ,{89,'y'} - ,{90,'z'} - ,{91,'['} - ,{92,156} - ,{93,']'} - ,{94,24} - ,{95,27} - ,{96,196} - ,{97,'A'} - ,{98,'B'} - ,{99,'C'} - ,{100,'D'} - ,{101,'E'} - ,{102,'F'} - ,{103,'G'} - ,{104,'H'} - ,{105,'I'} - ,{106,'J'} - ,{107,'K'} - ,{108,'L'} - ,{109,'M'} - ,{110,'N'} - ,{111,'O'} - ,{112,'P'} - ,{113,'Q'} - ,{114,'R'} - ,{115,'S'} - ,{116,'T'} - ,{117,'U'} - ,{118,'V'} - ,{119,'W'} - ,{120,'X'} - ,{121,'Y'} - ,{122,'Z'} - ,{123,197} - ,{124,181} ///* Left side fine 50% checker */ - ,{125,179} - ,{126,178} ///* Course 50% checker */ - ,{127,176} ///* Horizontal cross-hatch (light shade) */ - ,{160,255} - ,{161,221} - ,{162,220} - ,{163,'^'} /* Row 1 set */ - ,{164,'_'} ///* Row 8 set */ - ,{165,'{'} /* Col 1 set */ - ,{166,177} ///* Fine 50% checker */ - ,{167,'}'} /* Col 8 set */ - ,{168,210} ///* Bottom fine 50% checker */ - ,{169,31} /* Top left half set */ - ,{170,245} /* Cols 7 & 8 set */ - ,{171,195} - ,{172,201} ///* Bottom right quadrant set */ - ,{173,192} - ,{174,191} - ,{175,205} /* Rows 7 & 8 set */ - ,{176,218} - ,{177,193} - ,{178,194} - ,{179,180} - ,{180,244} /* Cols 1 & 2 set */ - ,{181,185} /* Cols 1, 2, & 3 set */ - ,{182,222} /* Cols 6, 7, & 8 set */ - ,{183,169} /* Rows 1 & 2 set */ - ,{184,223} /* Rows 1, 2, & 3 set */ - ,{185,22} /* Rows 6, 7, & 8 set */ - ,{186,251} - ,{187,187} ///* Bottom left quadrant set */ - ,{188,200} ///* Top right quadrant set */ - ,{189,217} - ,{190,188} ///* Top left quadrant set */ - ,{191,206} /* Top left and bottom right quadrants set */ -}; - -struct key_trans input_petscii[] = { - {'A', 'a'} - ,{'B', 'b'} - ,{'C', 'c'} - ,{'D', 'd'} - ,{'E', 'e'} - ,{'F', 'f'} - ,{'G', 'g'} - ,{'H', 'h'} - ,{'I', 'i'} - ,{'J', 'j'} - ,{'K', 'k'} - ,{'L', 'l'} - ,{'M', 'm'} - ,{'N', 'n'} - ,{'O', 'o'} - ,{'P', 'p'} - ,{'Q', 'q'} - ,{'R', 'r'} - ,{'S', 's'} - ,{'T', 't'} - ,{'U', 'u'} - ,{'V', 'v'} - ,{'W', 'w'} - ,{'X', 'x'} - ,{'Y', 'y'} - ,{'Z', 'z'} - ,{'a', 'A'} - ,{'b', 'B'} - ,{'c', 'C'} - ,{'d', 'D'} - ,{'e', 'E'} - ,{'f', 'F'} - ,{'g', 'G'} - ,{'h', 'H'} - ,{'i', 'I'} - ,{'j', 'J'} - ,{'k', 'K'} - ,{'l', 'L'} - ,{'m', 'M'} - ,{'n', 'N'} - ,{'o', 'O'} - ,{'p', 'P'} - ,{'q', 'Q'} - ,{'r', 'R'} - ,{'s', 'S'} - ,{'t', 'T'} - ,{'u', 'U'} - ,{'v', 'V'} - ,{'w', 'W'} - ,{'x', 'X'} - ,{'y', 'Y'} - ,{'z', 'Z'} - ,{'\n',141} - ,{CIO_KEY_DOWN, 17} - ,{CIO_KEY_HOME, 19} - ,{CIO_KEY_DC, 20} - ,{'\b', 20} - ,{CIO_KEY_RIGHT, 29} - ,{CIO_KEY_F(1), 133} - ,{CIO_KEY_F(3), 134} - ,{CIO_KEY_F(5), 135} - ,{CIO_KEY_F(7), 136} - ,{CIO_KEY_F(2), 137} - ,{CIO_KEY_F(4), 138} - ,{CIO_KEY_F(6), 139} - ,{CIO_KEY_F(8), 140} - ,{CIO_KEY_UP, 145} - ,{CIO_KEY_IC, 148} - ,{CIO_KEY_LEFT, 157} - ,{CIO_KEY_END, 147} - ,{CIO_KEY_PPAGE, 131} - ,{CIO_KEY_NPAGE, 3} -}; - diff --git a/ciolib/scale.c b/ciolib/scale.c deleted file mode 100644 index 6a9154c59437b977e9f0b691e73014d9372b09a8..0000000000000000000000000000000000000000 --- a/ciolib/scale.c +++ /dev/null @@ -1,893 +0,0 @@ -#include <math.h> -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> - -#include "ciolib.h" -#include "scale.h" -#include "xbr.h" - -uint32_t r2y[1<<24]; -uint32_t y2r[1<<24]; -static int r2y_inited; - -static void pointy_scale3(uint32_t* src, uint32_t* dest, int width, int height); -static void pointy_scale5(uint32_t* src, uint32_t* dest, int width, int height); -static void pointy_scale_odd(uint32_t* src, uint32_t* dest, int width, int height, int mult); -static void interpolate_height(uint32_t* src, uint32_t* dst, int width, int height, int newheight); -static void interpolate_width(uint32_t* src, uint32_t* dst, int width, int height, int newwidth); -static void multiply_scale(uint32_t* src, uint32_t* dst, int width, int height, int xmult, int ymult); - -static struct graphics_buffer *free_list; - -#define CLAMP(x) do { \ - if (x < 0) \ - x = 0; \ - else if (x > 255) \ - x = 255; \ -} while(0) - -/* - * Corrects width/height to have the specified aspect ratio - */ -void -aspect_fix(int *x, int *y, int aspect_width, int aspect_height) -{ - int bestx, besty; - - // Nothing we can do here... - if (aspect_width == 0 || aspect_height == 0) - return; - bestx = lround((double)*y * aspect_width / aspect_height); - besty = lround((double)*x * aspect_height / aspect_width); - - if (bestx < *x && bestx > 0) - *x = bestx; - else - *y = besty; -} - -/* - * Given a width/height of a source image, adjust it to match the current aspect - * ratio. Will not reduce either number - */ -void -aspect_correct(int *x, int *y, int aspect_width, int aspect_height) -{ - int width = *x; - int height; - - if (!aspect_height || !aspect_width) - return; - height = lround((double)(width * aspect_height) / aspect_width); - if (height < *y) { - height = *y; - width = lround(((double)height * aspect_width) / aspect_height); - } - - *x = width; - *y = height; -} - -/* - * Essentially the opposite of the above. Given an output width/height, translates to - * the size of the source image. - * - * Note that this is much trickier as the "source" bitmap may have been integer scaled - * differently in both directions... so what this does is reverse the aspect ratio - * calculation, then find the next lowest even multiple of the mode bitmap size. - */ -void -aspect_reverse(int *x, int *y, int scrnwidth, int scrnheight, int aspect_width, int aspect_height) -{ - int width = *x; - int height = *y; - int cheight; - int cwidth; - - if (!aspect_height || !aspect_width) { - width = scrnwidth * (*x / scrnwidth); - if (width < scrnwidth) - width = scrnwidth; - height = scrnheight * (*x / scrnheight); - if (height < scrnheight) - height = scrnheight; - return; - } - // First, find the "controlling" dimension... the one that won't be scaled (ie: the one that gets smaller) - cwidth = lround((double)(height * aspect_width) / aspect_height * scrnwidth / scrnheight); - cheight = lround((double)(width * aspect_height) / aspect_width * scrnheight / scrnwidth); - if (cwidth > width) { - // Width controls, so this is simply finding the largest width multiple that fits in the box - width = scrnwidth * (*x / scrnwidth); - if (width < scrnwidth) - width = scrnwidth; - - // Now we need to find the largest bitmap height that would fit in the output height - // So, we scale the height to bitmap size... - height = lround((double)*y / ((double)scrnwidth / scrnheight) * ((double)aspect_width / aspect_height)); - // And do the same calculation... - height = lround((double)scrnheight * ((double)height / scrnheight)); - } - else if (cheight > height) { - // Height controls - height = scrnheight * (*x / scrnheight); - if (height < scrnheight) - height = scrnheight; - - width = lround((double)*x / ((double)scrnheight / scrnwidth) * ((double)aspect_height / aspect_width)); - width = lround((double)scrnwidth * ((double)width / scrnwidth)); - } - - *x = width; - *y = height; -} - -void -init_r2y(void) -{ - int r, g, b; - int y, u, v; - const double luma = 255.0 / 219; - const double col = 255.0 / 224; - - if (r2y_inited) - return; - for (r = 0; r < 256; r++) { - for (g = 0; g < 256; g++) { - for (b = 0; b < 256; b++) { - y = 16 + ( 65.738 * r + 129.057 * g + 25.064 * b + 128) / 256; - CLAMP(y); - u = 128 + (-37.945 * r - 74.494 * g + 112.439 * b + 128) / 256; - CLAMP(u); - v = 128 + (112.439 * r - 94.154 * g - 18.285 * b + 128) / 256; - CLAMP(v); - - r2y[(r<<16) | (g<<8) | b] = (y<<16)|(u<<8)|v; - } - } - } - for (y = 0; y < 256; y++) { - for (u = 0; u < 256; u++) { - for (v = 0; v < 256; v++) { - const int c = y - 16; - const int d = u - 128; - const int e = v - 128; - r = luma * c + col * 1.402 * e; - CLAMP(r); - g = luma * c - col * 1.772 * (0.114 / 0.587) * d - col * 1.402 * (0.299 / 0.587) * e; - CLAMP(g); - b = luma * c + col * 1.772 * d; - CLAMP(b); - - y2r[(y<<16) | (u<<8) | v] = (r<<16)|(g<<8)|b; - } - } - } - r2y_inited = 1; -} - -struct graphics_buffer * -get_buffer(void) -{ - struct graphics_buffer* ret = NULL; - - if (free_list) { - ret = free_list; - free_list = free_list->next; - ret->next = NULL; - return ret; - } - - ret = calloc(1, sizeof(struct graphics_buffer)); - return ret; -} - -void -release_buffer(struct graphics_buffer *buf) -{ - if (buf == NULL) - return; - buf->next = free_list; - free_list = buf; -} - -struct graphics_buffer * -do_scale(struct rectlist* rect, int xscale, int yscale, int aspect_width, int aspect_height) -{ - struct graphics_buffer* ret1 = get_buffer(); - struct graphics_buffer* ret2 = get_buffer(); - int pointymult = 1; - int pointy5 = 0; - int pointy3 = 0; - int xbr2 = 0; - int xbr4 = 0; - int ymult = 1; - int xmult = 1; - int total_xscaling = 1; - int total_yscaling = 1; - struct graphics_buffer *ctarget; - struct graphics_buffer *csrc; - uint32_t* nt; - int fheight; - int fwidth; - bool swapxy = false; - - if (xscale > yscale) { - swapxy = true; - total_xscaling = xscale; - xscale = yscale; - yscale = total_xscaling; - } - total_xscaling = xscale; - xscale = 1; - total_yscaling = yscale; - yscale = 1; - // If x/y scaling isn't a simple multiple, block scale everything... - if ((total_yscaling % total_xscaling) == 0) { - if (!(cio_api.options & CONIO_OPT_BLOCKY_SCALING)) { - if ((total_xscaling & 1) == 1 && total_xscaling > 5) { - pointymult = total_xscaling; - total_xscaling /= pointymult; - xscale *= pointymult; - total_yscaling /= pointymult; - yscale *= pointymult; - } - while (total_xscaling > 1 && ((total_xscaling % 5) == 0) && ((total_yscaling % 5) == 0)) { - pointy5++; - total_xscaling /= 5; - xscale *= 5; - total_yscaling /= 5; - yscale *= 5; - } - while (total_xscaling > 1 && ((total_xscaling % 3) == 0) && ((total_yscaling % 3) == 0)) { - pointy3++; - total_xscaling /= 3; - xscale *= 3; - total_yscaling /= 3; - yscale *= 3; - } - while (total_xscaling > 1 && ((total_xscaling % 4) == 0) && ((total_yscaling % 4) == 0)) { - xbr4++; - total_xscaling /= 4; - xscale *= 4; - total_yscaling /= 4; - yscale *= 4; - } - while (total_xscaling > 1 && ((total_xscaling % 2) == 0) && ((total_yscaling % 2) == 0)) { - xbr2++; - total_xscaling /= 2; - xscale *= 2; - total_yscaling /= 2; - yscale *= 2; - } - } - } - - xmult = total_xscaling; - xscale *= xmult; - total_xscaling = 1; - - ymult = total_yscaling; - yscale *= ymult; - total_yscaling = 1; - - if (swapxy) { - int tmp; - - tmp = ymult; - ymult = xmult; - xmult = tmp; - - tmp = xscale; - xscale = yscale; - yscale = tmp; - } - - // Calculate the scaled height from rxscaleatio... - fwidth = rect->rect.width * xscale; - fheight = rect->rect.height * yscale; - aspect_correct(&fwidth, &fheight, aspect_width, aspect_height); - - // Now make sure target is big enough... - size_t needsz = fwidth * fheight * sizeof(uint32_t); - if (needsz > ret1->sz) { - nt = realloc(ret1->data, needsz); - if (nt == NULL) { - release_buffer(ret1); - release_buffer(ret2); - return NULL; - } - ret1->data = nt; - ret1->sz = needsz; - } - - if (needsz > ret2->sz) { - nt = realloc(ret2->data, needsz); - if (nt == NULL) { - release_buffer(ret1); - release_buffer(ret2); - return NULL; - } - ret2->data = nt; - ret2->sz = needsz; - } - - // Copy rect into first buffer - // TODO: Unify bitmap rects and scaling buffers so this can just whomp on over. - csrc = ret1; - ctarget = ret2; - memcpy(csrc->data, rect->data, rect->rect.width * rect->rect.height * sizeof(rect->data[0])); - csrc->w = rect->rect.width; - csrc->h = rect->rect.height; - -#if 0 -fprintf(stderr, "Plan:\n" -"start: %dx%d\n" -"pointymulti: %d\n" -"pointy5: %d\n" -"pointy3: %d\n" -"xBR4: %d\n" -"xBR2: %d\n" -"Multiply: %dx%d\n" -"hinterp: %zu -> %zu\n" -"winterp: %zu -> %zu\n", -csrc->w, csrc->h, pointymult, pointy5, pointy3, xbr4, xbr2, xmult, ymult, csrc->h * yscale, fheight, csrc->w * xscale, fwidth); -#endif - // And scale... - if (ymult != 1 || xmult != 1) { - multiply_scale(csrc->data, ctarget->data, csrc->w, csrc->h, xmult, ymult); - ctarget->w = csrc->w * xmult; - ctarget->h = csrc->h * ymult; - ymult = 1; - xmult = 1; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - if (pointymult > 1 && pointymult & 1) { - pointy_scale_odd(csrc->data, ctarget->data, csrc->w, csrc->h, pointymult); - ctarget->w = csrc->w * pointymult; - ctarget->h = csrc->h * pointymult; - pointymult = 1; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (pointy5 > 0) { - pointy_scale5(csrc->data, ctarget->data, csrc->w, csrc->h); - pointy5--; - ctarget->w = csrc->w * 5; - ctarget->h = csrc->h * 5; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (pointy3 > 0) { - pointy_scale3(csrc->data, ctarget->data, csrc->w, csrc->h); - pointy3--; - ctarget->w = csrc->w * 3; - ctarget->h = csrc->h * 3; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (xbr4 > 0) { - xbr_filter(csrc->data, ctarget->data, csrc->w, csrc->h, 4); - xbr4--; - ctarget->w = csrc->w * 4; - ctarget->h = csrc->h * 4; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - while (xbr2 > 0) { - xbr_filter(csrc->data, ctarget->data, csrc->w, csrc->h, 2); - xbr2--; - ctarget->w = csrc->w * 2; - ctarget->h = csrc->h * 2; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - - // And finally, interpolate if needed - if (fheight != csrc->h) { - interpolate_height(csrc->data, ctarget->data, csrc->w, csrc->h, fheight); - ctarget->h = fheight; - ctarget->w = csrc->w; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - - if (fwidth != csrc->w) { - interpolate_width(csrc->data, ctarget->data, csrc->w, csrc->h, fwidth); - ctarget->h = csrc->h; - ctarget->w = fwidth; - csrc = ctarget; - if (ctarget == ret1) - ctarget = ret2; - else - ctarget = ret1; - } - - release_buffer(ctarget); - return csrc; -} - -static void -pointy_scale_odd(uint32_t* src, uint32_t* dest, int width, int height, int mult) -{ - int x, y; - uint32_t* s; - uint32_t* d; - int prevline, prevcol, nextline, nextcol; - int i, j; - int mid = mult / 2; - int multoff = mult - 1; - int dline = width * mult; - int dbott; - int dstripe = dline * mult; - - s = src; - d = dest; - prevline = 0; - nextline = width; - for (y = 0; y < height; y++) { - if (y == height - 1) - nextline = 0; - prevcol = 0; - nextcol = 1; - for (x = 0; x < width; x++) { - if (x == width - 1) - nextcol = 0; - - for (i = 0; i < mid; i++) { - d = &dest[dstripe * y + dline * i + x * mult]; - dbott = dline * (multoff - i * 2); - - for (j = 0; j < mid - i; j++) { - if (s[prevline + prevcol] == s[0]) { - d[j] = s[0]; - } - else if (s[prevline] == s[prevcol]) { - d[j] = s[prevcol]; - } - else { - d[j] = s[0]; - } - - if (s[prevline + nextcol] == s[0]) { - d[multoff - j] = s[0]; - } - else if (s[prevline] == s[nextcol]) { - d[multoff - j] = s[nextcol]; - } - else { - d[multoff - j] = s[0]; - } - - if (s[prevcol + nextline] == s[0]) { - d[dbott + j] = s[0]; - } - else if(s[prevcol] == s[nextline]) { - d[dbott + j] = s[prevcol]; - } - else { - d[dbott + j] = s[0]; - } - - if (s[nextcol + nextline] == s[0]) { - d[dbott + multoff - j] = s[0]; - } - else if (s[nextcol] == s[nextline]) { - d[dbott + multoff - j] = s[nextcol]; - } - else { - d[dbott + multoff - j] = s[0]; - } - } - - // And the rest is always kept the same - for (; j < mid; j++) { - d[j] = s[0]; - d[multoff - j] = s[0]; - d[dbott + j] = s[0]; - d[dbott + multoff - j] = s[0]; - } - - // And the middle dot. - d[j] = s[0]; - d[dbott + j] = s[0]; - } - - d = &dest[dstripe * y + dline * i + x * mult]; - - for (j = 0; j < mid; j++) { - d[j] = s[0]; - d[multoff - j] = s[0]; - } - d[j] = s[0]; - - s++; - - if (x == 0) - prevcol = -1; - } - if (y == 0) - prevline = -width; - } -} - -static void -pointy_scale5(uint32_t* src, uint32_t* dest, int width, int height) -{ - int x, y; - uint32_t* s; - uint32_t* d; - int w5 = width * 5; - int w10 = width * 10; - int w15 = width * 15; - int w20 = width * 20; - int prevline, prevcol, nextline, nextcol; - - s = src; - d = dest; - prevline = 0; - nextline = width; - for (y = 0; y < height; y++) { - if (y == height - 1) - nextline = 0; - prevcol = 0; - nextcol = 1; - for (x = 0; x < width; x++) { - if (x == width - 1) - nextcol = 0; - - if (s[prevline + prevcol] == s[0]) { - d[0] = s[0]; - d[1] = s[0]; - d[w5] = s[0]; - } - else if (s[prevcol] == s[prevline]) { - d[0] = s[prevcol]; - d[1] = s[prevcol]; - d[w5] = s[prevcol]; - } - else { - d[0] = *s; - d[1] = *s; - d[w5] = *s; - } - - // Top-middle stays OG. - d[2] = *s; - d[w5+1] = *s; - d[w5+2] = *s; - d[w5+3] = *s; - - // And so on around the outside (round the outside) - if (s[prevline + nextcol] == s[0]) { - d[3] = s[0]; - d[4] = s[0]; - d[w5 + 4] = s[0]; - } - else if (s[nextcol] == s[prevline]) { - d[3] = s[nextcol]; - d[4] = s[nextcol]; - d[w5 + 4] = s[nextcol]; - } - else { - d[3] = s[0]; - d[4] = s[0]; - d[w5 + 4] = s[0]; - } - - d[w10] = *s; - d[w10+1] = *s; - d[w10+2] = *s; - d[w10+3] = *s; - d[w10+4] = *s; - - if (s[prevcol + nextline] == s[0]) { - d[w15] = s[0]; - d[w20] = s[0]; - d[w20 + 1] = s[0]; - } - else if(s[prevcol] == s[nextline]) { - d[w15] = s[prevcol]; - d[w20] = s[prevcol]; - d[w20 + 1] = s[prevcol]; - } - else { - d[w15] = s[0]; - d[w20] = s[0]; - d[w20 + 1] = s[0]; - } - - d[w15 + 1] = *s; - d[w15 + 2] = *s; - d[w15 + 3] = *s; - d[w20 + 2] = *s; - - if (s[nextcol + nextline] == s[0]) { - d[w15 + 4] = s[0]; - d[w20 + 3] = s[0]; - d[w20 + 4] = s[0]; - } - else if (s[nextcol] == s[nextline]) { - d[w15 + 4] = s[nextcol]; - d[w20 + 3] = s[nextcol]; - d[w20 + 4] = s[nextcol]; - } - else { - d[w15 + 4] = s[0]; - d[w20 + 3] = s[0]; - d[w20 + 4] = s[0]; - } - - d += 5; - s++; - - if (x == 0) - prevcol = -1; - } - d += w20; - if (y == 0) - prevline = -width; - } -} - -static void -pointy_scale3(uint32_t* src, uint32_t* dest, int width, int height) -{ - int x, y; - uint32_t* s; - uint32_t* d; - int w3 = width * 3; - int w6 = width * 6; - int prevline, prevcol, nextline, nextcol; - - s = src; - d = dest; - prevline = 0; - nextline = width; - for (y = 0; y < height; y++) { - if (y == height - 1) - nextline = 0; - prevcol = 0; - nextcol = 1; - for (x = 0; x < width; x++) { - if (x == width - 1) - nextcol = 0; - - // Top-left is filled if both left and top are the same. - if (s[prevline + prevcol] == s[0]) - d[0] = s[0]; - else if (s[prevcol] == s[prevline]) - d[0] = s[prevcol]; - else - d[0] = *s; - - // Top-middle stays OG. - d[1] = *s; - - // And so on around the outside (round the outside) - if (s[prevline + nextcol] == s[0]) - d[2] = s[0]; - else if (s[nextcol] == s[prevline]) - d[2] = s[nextcol]; - else - d[2] = *s; - - d[w3] = *s; - d[w3 + 1] = *s; - d[w3 + 2] = *s; - - if (s[prevcol + nextline] == s[0]) - d[w6] = s[0]; - else if(s[prevcol] == s[nextline]) - d[w6] = s[prevcol]; - else - d[w6] = *s; - - d[w6 + 1] = *s; - - if (s[nextcol + nextline] == s[0]) - d[w6 + 2] = s[0]; - else if (s[nextcol] == s[nextline]) - d[w6 + 2] = s[nextcol]; - else - d[w6 + 2] = s[0]; - - d += 3; - s++; - - if (x == 0) - prevcol = -1; - } - d += w6; - if (y == 0) - prevline = -width; - } -} - -static uint32_t -blend(const uint32_t c1, const uint32_t c2, int weight) -{ - uint8_t yuv1[4]; - uint8_t yuv2[4]; - uint8_t yuv3[4]; - const double iw = 256 - weight; - - *(uint32_t *)yuv1 = r2y[c1]; - *(uint32_t *)yuv2 = r2y[c2]; -#ifdef __BIG_ENDIAN__ - yuv3[0] = 0; - yuv3[1] = (yuv1[1] * iw + yuv2[1] * weight) / 256; - yuv3[2] = (yuv1[2] * iw + yuv2[2] * weight) / 256; - yuv3[3] = (yuv1[3] * iw + yuv2[3] * weight) / 256; -#else - yuv3[3] = 0; - yuv3[2] = (yuv1[2] * iw + yuv2[2] * weight) / 256; - yuv3[1] = (yuv1[1] * iw + yuv2[1] * weight) / 256; - yuv3[0] = (yuv1[0] * iw + yuv2[0] * weight) / 256; -#endif - - return y2r[*(uint32_t*)yuv3]; -} - -/* - * This does non-integer *width* scaling. It does not scale in the other - * direction. This does the interpolation using Y'UV to prevent dimming of - * pixels. - */ -static void -interpolate_width(uint32_t* src, uint32_t* dst, int width, int height, int newwidth) -{ - int x, y; - const double mult = (double)width / newwidth; - - for (y = 0; y < height; y++) { - for (x = 0; x < newwidth; x++) { - // First, calculate which two pixels this is between. - const double xpos = mult * x; - const int xposi = xpos; - if (x == xpos) { - // Exact match! - *dst = src[width * y + x]; - } - else { - const double weight = xpos - xposi; - // Now pick the two pixels - const uint32_t pix1 = src[y * width + xposi]; - uint32_t pix2; - if (xposi < width - 1) - pix2 = src[y * width + xposi + 1]; - else - pix2 = src[y * width + xposi]; - if (pix1 == pix2) - *dst = pix1; - else { - *dst = blend(pix1, pix2, weight); - } - } - dst++; - } - } -} - -/* - * This does non-integer *height* scaling. It does not scale in the other - * direction. This does the interpolation using Y'UV to prevent dimming of - * pixels. - */ -static void -interpolate_height(uint32_t* src, uint32_t* dst, int width, int height, int newheight) -{ - int x, y; - const double mult = (double)height / newheight; - double ypos = 0; - int last_yposi = 0; - int ywn = width; - static uint32_t *nline = NULL; - static uint32_t *tline = NULL; - static size_t nsz = 0; - static size_t tsz = 0; - uint32_t *stmp; - - if (nsz < width * 4) { - stmp = realloc(nline, width * 4); - if (stmp == NULL) - goto fail; - nline = stmp; - nsz = width * 4; - } - if (tsz < width * 4) { - stmp = realloc(tline, width * 4); - if (stmp == NULL) - goto fail; - tline = stmp; - tsz = width * 4; - } - - memcpy(tline, src, width * sizeof(*tline)); - memcpy(nline, src + width, width * sizeof(*tline)); - for (y = 0; y < newheight; y++) { - const int yposi = ypos; - if (yposi != last_yposi) { - ywn += width; - last_yposi = yposi; - stmp = tline; - tline = nline; - nline = stmp; - memcpy(nline, &src[ywn], nsz); - } - if (y == ypos || yposi >= height - 1) { - memcpy(dst, tline, tsz); - dst += width; - } - else { - const uint8_t weight = ypos * 256; - for (x = 0; x < width; x++) { - // Now pick the two pixels - const uint32_t pix1 = tline[x]; - const uint32_t pix2 = nline[x]; - if (pix1 == pix2) - *dst = pix1; - else - *dst = blend(pix1, pix2, weight); - dst++; - } - } - ypos += mult; - } - - return; -fail: - free(nline); - free(tline); - nline = NULL; - tline = NULL; - nsz = 0; - tsz = 0; - memcpy(src, dst, width * height * sizeof(*src)); - fprintf(stderr, "Allocation failure in interpolate_height()!"); -} - -static void -multiply_scale(uint32_t* src, uint32_t* dst, int width, int height, int xmult, int ymult) -{ - int x, y; - int mx, my; - uint32_t* slstart; - - for (y = 0; y < height; y++) { - slstart = src; - for (my = 0; my < ymult; my++) { - src = slstart; - for (x = 0; x < width; x++) { - for (mx = 0; mx < xmult; mx++) { - *dst = *src; - dst++; - } - src++; - } - } - } -} diff --git a/ciolib/scale.h b/ciolib/scale.h deleted file mode 100644 index efead79dae021ca0267326ebf1a75ea737a7c67b..0000000000000000000000000000000000000000 --- a/ciolib/scale.h +++ /dev/null @@ -1,21 +0,0 @@ -#include "bitmap_con.h" - -struct graphics_buffer { - uint32_t* data; - size_t sz; - size_t w; - size_t h; - struct graphics_buffer *next; -}; - -extern uint32_t r2y[1<<24]; -extern uint32_t y2r[1<<24]; - -struct graphics_buffer * get_buffer(void); -void release_buffer(struct graphics_buffer *); -void init_r2y(void); - -struct graphics_buffer * do_scale(struct rectlist* rect, int xscale, int yscale, int aspect_width, int aspect_height); -void aspect_correct(int *x, int *y, int aspect_width, int aspect_height); -void aspect_reverse(int *x, int *y, int scrnwidth, int scrnheight, int aspect_width, int aspect_height); -void aspect_fix(int *x, int *y, int aspect_width, int aspect_height); diff --git a/ciolib/sdl_con.c b/ciolib/sdl_con.c deleted file mode 100644 index 01fe4549562bdec577f1cb2b6d949b6895e5699a..0000000000000000000000000000000000000000 --- a/ciolib/sdl_con.c +++ /dev/null @@ -1,1300 +0,0 @@ -#include <math.h> -#include <stdarg.h> -#include <stdbool.h> -#include <stdio.h> /* NULL */ -#include <stdlib.h> -#include <string.h> - -#include "gen_defs.h" -#include "genwrap.h" -#include "dirwrap.h" -#include "xpbeep.h" -#include "threadwrap.h" -#include <xp_dl.h> - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "utf8_codepages.h" -#include "vidmodes.h" -#define BITMAP_CIOLIB_DRIVER -#include "bitmap_con.h" -#include "scale.h" - -#include "SDL.h" - -#include "sdlfuncs.h" - -int bitmap_width,bitmap_height; - -/* 256 bytes so I can cheat */ -unsigned char sdl_keybuf[256]; /* Keyboard buffer */ -unsigned char sdl_key=0; /* Index into keybuf for next key in buffer */ -unsigned char sdl_keynext=0; /* Index into keybuf for next free position */ - -int sdl_exitcode=0; - -bool internal_scaling = true; // Protected by the win mutex - -SDL_Window *win=NULL; -SDL_Cursor *curs=NULL; -SDL_Renderer *renderer=NULL; -SDL_Texture *texture=NULL; -pthread_mutex_t win_mutex; -SDL_Surface *sdl_icon=NULL; - -sem_t sdl_ufunc_ret; -sem_t sdl_ufunc_rec; -pthread_mutex_t sdl_ufunc_mtx; -int sdl_ufunc_retval; - -sem_t sdl_flush_sem; -int pending_updates=0; - -int fullscreen=0; - -int sdl_init_good=0; -pthread_mutex_t sdl_keylock; -sem_t sdl_key_pending; -static unsigned int sdl_pending_mousekeys=0; - -static struct video_stats cvstat; - -struct sdl_keyvals { - int keysym - ,key - ,shift - ,ctrl - ,alt; -}; - -static pthread_mutex_t sdl_headlock; -static struct rectlist *update_list = NULL; -static struct rectlist *update_list_tail = NULL; - -enum { - SDL_USEREVENT_FLUSH - ,SDL_USEREVENT_SETTITLE - ,SDL_USEREVENT_SETNAME - ,SDL_USEREVENT_SETICON - ,SDL_USEREVENT_SETVIDMODE - ,SDL_USEREVENT_SHOWMOUSE - ,SDL_USEREVENT_HIDEMOUSE - ,SDL_USEREVENT_INIT - ,SDL_USEREVENT_QUIT - ,SDL_USEREVENT_GETWINPOS - ,SDL_USEREVENT_MOUSEPOINTER -}; - -const struct sdl_keyvals sdl_keyval[] = -{ - {SDLK_BACKSPACE, 0x08, 0x08, 0x7f, 0x0e00}, - {SDLK_TAB, 0x09, 0x0f00, 0x9400, 0xa500}, - {SDLK_RETURN, 0x0d, 0x0d, 0x0a, 0xa600}, - {SDLK_ESCAPE, 0x1b, 0x1b, 0x1b, 0x0100}, - {SDLK_SPACE, 0x20, 0x20, 0x0300, 0x20}, - {SDLK_0, '0', ')', 0, 0x8100}, - {SDLK_1, '1', '!', 0, 0x7800}, - {SDLK_2, '2', '@', 0x0300, 0x7900}, - {SDLK_3, '3', '#', 0, 0x7a00}, - {SDLK_4, '4', '$', 0, 0x7b00}, - {SDLK_5, '5', '%', 0, 0x7c00}, - {SDLK_6, '6', '^', 0x1e, 0x7d00}, - {SDLK_7, '7', '&', 0, 0x7e00}, - {SDLK_8, '8', '*', 0, 0x7f00}, - {SDLK_9, '9', '(', 0, 0x8000}, - {SDLK_a, 'a', 'A', 0x01, 0x1e00}, - {SDLK_b, 'b', 'B', 0x02, 0x3000}, - {SDLK_c, 'c', 'C', 0x03, 0x2e00}, - {SDLK_d, 'd', 'D', 0x04, 0x2000}, - {SDLK_e, 'e', 'E', 0x05, 0x1200}, - {SDLK_f, 'f', 'F', 0x06, 0x2100}, - {SDLK_g, 'g', 'G', 0x07, 0x2200}, - {SDLK_h, 'h', 'H', 0x08, 0x2300}, - {SDLK_i, 'i', 'I', 0x09, 0x1700}, - {SDLK_j, 'j', 'J', 0x0a, 0x2400}, - {SDLK_k, 'k', 'K', 0x0b, 0x2500}, - {SDLK_l, 'l', 'L', 0x0c, 0x2600}, - {SDLK_m, 'm', 'M', 0x0d, 0x3200}, - {SDLK_n, 'n', 'N', 0x0e, 0x3100}, - {SDLK_o, 'o', 'O', 0x0f, 0x1800}, - {SDLK_p, 'p', 'P', 0x10, 0x1900}, - {SDLK_q, 'q', 'Q', 0x11, 0x1000}, - {SDLK_r, 'r', 'R', 0x12, 0x1300}, - {SDLK_s, 's', 'S', 0x13, 0x1f00}, - {SDLK_t, 't', 'T', 0x14, 0x1400}, - {SDLK_u, 'u', 'U', 0x15, 0x1600}, - {SDLK_v, 'v', 'V', 0x16, 0x2f00}, - {SDLK_w, 'w', 'W', 0x17, 0x1100}, - {SDLK_x, 'x', 'X', 0x18, 0x2d00}, - {SDLK_y, 'y', 'Y', 0x19, 0x1500}, - {SDLK_z, 'z', 'Z', 0x1a, 0x2c00}, - {SDLK_PAGEUP, 0x4900, 0x4900, 0x8400, 0x9900}, - {SDLK_PAGEDOWN, 0x5100, 0x5100, 0x7600, 0xa100}, - {SDLK_END, 0x4f00, 0x4f00, 0x7500, 0x9f00}, - {SDLK_HOME, 0x4700, 0x4700, 0x7700, 0x9700}, - {SDLK_LEFT, 0x4b00, 0x4b00, 0x7300, 0x9b00}, - {SDLK_UP, 0x4800, 0x4800, 0x8d00, 0x9800}, - {SDLK_RIGHT, 0x4d00, 0x4d00, 0x7400, 0x9d00}, - {SDLK_DOWN, 0x5000, 0x5000, 0x9100, 0xa000}, - {SDLK_INSERT, CIO_KEY_IC, CIO_KEY_SHIFT_IC, CIO_KEY_CTRL_IC, CIO_KEY_ALT_IC}, - {SDLK_DELETE, CIO_KEY_DC, CIO_KEY_SHIFT_DC, CIO_KEY_CTRL_DC, CIO_KEY_ALT_DC}, - {SDLK_KP_0, 0x5200, 0x5200, 0x9200, 0}, - {SDLK_KP_1, 0x4f00, 0x4f00, 0x7500, 0}, - {SDLK_KP_2, 0x5000, 0x5000, 0x9100, 0}, - {SDLK_KP_3, 0x5100, 0x5100, 0x7600, 0}, - {SDLK_KP_4, 0x4b00, 0x4b00, 0x7300, 0}, - {SDLK_KP_5, 0x4c00, 0x4c00, 0x8f00, 0}, - {SDLK_KP_6, 0x4d00, 0x4d00, 0x7400, 0}, - {SDLK_KP_7, 0x4700, 0x4700, 0x7700, 0}, - {SDLK_KP_8, 0x4800, 0x4800, 0x8d00, 0}, - {SDLK_KP_9, 0x4900, 0x4900, 0x8400, 0}, - {SDLK_KP_MULTIPLY, '*', '*', 0x9600, 0x3700}, - {SDLK_KP_PLUS, '+', '+', 0x9000, 0x4e00}, - {SDLK_KP_MINUS, '-', '-', 0x8e00, 0x4a00}, - {SDLK_KP_PERIOD, 0x7f, 0x7f, 0x5300, 0x9300}, - {SDLK_KP_DIVIDE, '/', '/', 0x9500, 0xa400}, - {SDLK_KP_ENTER, 0x0d, 0x0d, 0x0a, 0xa600}, - {SDLK_F1, 0x3b00, 0x5400, 0x5e00, 0x6800}, - {SDLK_F2, 0x3c00, 0x5500, 0x5f00, 0x6900}, - {SDLK_F3, 0x3d00, 0x5600, 0x6000, 0x6a00}, - {SDLK_F4, 0x3e00, 0x5700, 0x6100, 0x6b00}, - {SDLK_F5, 0x3f00, 0x5800, 0x6200, 0x6c00}, - {SDLK_F6, 0x4000, 0x5900, 0x6300, 0x6d00}, - {SDLK_F7, 0x4100, 0x5a00, 0x6400, 0x6e00}, - {SDLK_F8, 0x4200, 0x5b00, 0x6500, 0x6f00}, - {SDLK_F9, 0x4300, 0x5c00, 0x6600, 0x7000}, - {SDLK_F10, 0x4400, 0x5d00, 0x6700, 0x7100}, - {SDLK_F11, 0x8500, 0x8700, 0x8900, 0x8b00}, - {SDLK_F12, 0x8600, 0x8800, 0x8a00, 0x8c00}, - {SDLK_BACKSLASH, '\\', '|', 0x1c, 0x2b00}, - {SDLK_SLASH, '/', '?', 0, 0x3500}, - {SDLK_MINUS, '-', '_', 0x1f, 0x8200}, - {SDLK_EQUALS, '=', '+', 0, 0x8300}, - {SDLK_LEFTBRACKET, '[', '{', 0x1b, 0x1a00}, - {SDLK_RIGHTBRACKET, ']', '}', 0x1d, 0x1b00}, - {SDLK_SEMICOLON, ';', ':', 0, 0x2700}, - {SDLK_QUOTE, '\'', '"', 0, 0x2800}, - {SDLK_COMMA, ',', '<', 0, 0x3300}, - {SDLK_PERIOD, '.', '>', 0, 0x3400}, - {SDLK_BACKQUOTE, '`', '~', 0, 0x2900}, - {0, 0, 0, 0, 0} /** END **/ -}; - -void sdl_video_event_thread(void *data); - -static void sdl_user_func(int func, ...) -{ - va_list argptr; - SDL_Event ev; - int rv; - - ev.type=SDL_USEREVENT; - ev.user.data1=NULL; - ev.user.data2=NULL; - ev.user.code=func; - pthread_mutex_lock(&sdl_ufunc_mtx); - while (1) { - va_start(argptr, func); - switch(func) { - case SDL_USEREVENT_SETICON: - ev.user.data1=va_arg(argptr, void *); - if((ev.user.data2=(unsigned long *)malloc(sizeof(unsigned long)))==NULL) { - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return; - } - *(unsigned long *)ev.user.data2=va_arg(argptr, unsigned long); - break; - case SDL_USEREVENT_SETNAME: - case SDL_USEREVENT_SETTITLE: - if((ev.user.data1=strdup(va_arg(argptr, char *)))==NULL) { - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return; - } - break; - case SDL_USEREVENT_MOUSEPOINTER: - ev.user.data1 = (void *)(intptr_t)va_arg(argptr, int); - break; - case SDL_USEREVENT_SHOWMOUSE: - case SDL_USEREVENT_HIDEMOUSE: - case SDL_USEREVENT_FLUSH: - break; - default: - va_end(argptr); - return; - } - va_end(argptr); - while((rv = sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT))!=1) - YIELD(); - break; - } - pthread_mutex_unlock(&sdl_ufunc_mtx); -} - -/* Called from main thread only */ -static int sdl_user_func_ret(int func, ...) -{ - int rv; - va_list argptr; - SDL_Event ev; - - ev.type=SDL_USEREVENT; - ev.user.data1=NULL; - ev.user.data2=NULL; - ev.user.code=func; - va_start(argptr, func); - pthread_mutex_lock(&sdl_ufunc_mtx); - /* Drain the swamp */ - while(1) { - switch(func) { - case SDL_USEREVENT_GETWINPOS: - ev.user.data1 = va_arg(argptr, void *); - ev.user.data2 = va_arg(argptr, void *); - // Fallthrough - case SDL_USEREVENT_SETVIDMODE: - case SDL_USEREVENT_INIT: - case SDL_USEREVENT_QUIT: - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)!=1) - YIELD(); - break; - default: - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return -1; - } - rv = sem_wait(&sdl_ufunc_ret); - if(rv==0) - break; - } - pthread_mutex_unlock(&sdl_ufunc_mtx); - va_end(argptr); - return(sdl_ufunc_retval); -} - -void exit_sdl_con(void) -{ - // Avoid calling exit(0) from an atexit() function... - ciolib_reaper = 0; - sdl_user_func_ret(SDL_USEREVENT_QUIT); -} - -void sdl_copytext(const char *text, size_t buflen) -{ - sdl.SetClipboardText(text); -} - -char *sdl_getcliptext(void) -{ - uint8_t *u8; - u8 = (uint8_t *)sdl.GetClipboardText(); - char *ret = strdup((char *)u8); - sdl.free(u8); - return ret; -} - -void sdl_drawrect(struct rectlist *data) -{ - if(sdl_init_good) { - data->next = NULL; - pthread_mutex_lock(&sdl_headlock); - if (update_list == NULL) - update_list = update_list_tail = data; - else { - update_list_tail->next = data; - update_list_tail = data; - } - pthread_mutex_unlock(&sdl_headlock); - } - else - bitmap_drv_free_rect(data); -} - -void sdl_flush(void) -{ - sdl_user_func(SDL_USEREVENT_FLUSH); -} - -/* - * Returns true if the specified width/height can use the - * internal scaler - * - * vstat lock must be held - */ -static bool -window_can_scale_internally(int winwidth, int winheight) -{ - int fw, fh; - aspect_fix(&winwidth, &winheight, cvstat.aspect_width, cvstat.aspect_height); - fw = winwidth; - fh = winheight; - aspect_reverse(&winwidth, &winheight, cvstat.scrnwidth, cvstat.scrnheight, cvstat.aspect_width, cvstat.aspect_height); - if (fw == winwidth || fh == winheight) - return true; - return false; -} - -static void -internal_scaling_factors(int winwidth, int winheight, int *x, int *y) -{ - aspect_fix(&winwidth, &winheight, cvstat.aspect_width, cvstat.aspect_height); - aspect_reverse(&winwidth, &winheight, cvstat.scrnwidth, cvstat.scrnheight, cvstat.aspect_width, cvstat.aspect_height); - *x = winwidth / cvstat.scrnwidth; - *y = winheight / cvstat.scrnheight; - if (*x < 1 || *x > 14) - *x = 1; - if (*y < 1 || *y > 14) - *y = 1; -} - -static int sdl_init_mode(int mode) -{ - int oldcols; - - if (mode != CIOLIB_MODE_CUSTOM) { - pthread_mutex_lock(&vstatlock); - if (mode == vstat.mode) { - pthread_mutex_unlock(&vstatlock); - return 0; - } - pthread_mutex_unlock(&vstatlock); - } - - sdl_user_func(SDL_USEREVENT_FLUSH); - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - oldcols = cvstat.cols; - bitmap_drv_init_mode(mode, &bitmap_width, &bitmap_height); - vstat.winwidth = lround((double)cvstat.winwidth / cvstat.scrnwidth * vstat.scrnwidth); - vstat.winheight = lround((double)cvstat.winheight / cvstat.scrnheight * vstat.scrnheight); - aspect_correct(&vstat.winwidth, &cvstat.winheight, cvstat.aspect_width, cvstat.aspect_height); - if (oldcols != vstat.cols) { - if (oldcols == 0) { - if (ciolib_initial_window_width > 0) - vstat.winwidth = ciolib_initial_window_width; - if (ciolib_initial_window_height > 0) - vstat.winheight = ciolib_initial_window_height; - if (vstat.cols == 40) - oldcols = 40; - } - if (oldcols == 40) { - vstat.winwidth /= 2; - vstat.winheight /= 2; - } - if (vstat.cols == 40) { - vstat.winwidth *= 2; - vstat.winheight *= 2; - } - } - if (vstat.winwidth < vstat.scrnwidth) - vstat.winwidth = vstat.scrnwidth; - if (vstat.winheight < vstat.scrnheight) - vstat.winheight = vstat.scrnheight; - - cvstat = vstat; - internal_scaling = window_can_scale_internally(vstat.winwidth, vstat.winheight); - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - - sdl_user_func_ret(SDL_USEREVENT_SETVIDMODE); - - return(0); -} - -/* Called from main thread only (Passes Event) */ -int sdl_init(int mode) -{ - bitmap_drv_init(sdl_drawrect, sdl_flush); - - if(mode==CIOLIB_MODE_SDL_FULLSCREEN) - fullscreen=1; - // Needs to be *after* bitmap_drv_init() -#if defined(__DARWIN__) - sem_post(&startsdl_sem); -#else - _beginthread(sdl_video_event_thread, 0, NULL); -#endif - sdl_user_func_ret(SDL_USEREVENT_INIT); - sdl_init_mode(3); - - if(sdl_init_good) { - cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; -#ifdef _WIN32 - FreeConsole(); -#endif - cio_api.options |= CONIO_OPT_PALETTE_SETTING | CONIO_OPT_SET_TITLE | CONIO_OPT_SET_NAME | CONIO_OPT_SET_ICON; - return(0); - } - - ciolib_reaper = 0; - sdl_user_func_ret(SDL_USEREVENT_QUIT); - return(-1); -} - -void sdl_setwinsize_locked(int w, int h) -{ - if (w > 16384) - w = 16384; - if (h > 16384) - h = 16384; - if (w < cvstat.scrnwidth) - w = cvstat.scrnwidth; - if (h < cvstat.scrnheight) - h = cvstat.scrnheight; - cvstat.winwidth = vstat.winwidth = w; - cvstat.winheight = vstat.winheight = h; - internal_scaling = window_can_scale_internally(cvstat.winwidth, cvstat.winheight); -} - -void sdl_setwinsize(int w, int h) -{ - pthread_mutex_lock(&vstatlock); - sdl_setwinsize_locked(w, h); - pthread_mutex_unlock(&vstatlock); -} - -void sdl_setwinposition(int x, int y) -{ - pthread_mutex_lock(&win_mutex); - sdl.SetWindowPosition(win, x, y); - pthread_mutex_unlock(&win_mutex); -} - -void sdl_getwinsize_locked(int *w, int *h) -{ - if (w) - *w = cvstat.winwidth; - if (h) - *h = cvstat.winheight; -} - -void sdl_getwinsize(int *w, int *h) -{ - pthread_mutex_lock(&vstatlock); - sdl_getwinsize_locked(w, h); - pthread_mutex_unlock(&vstatlock); -} - -/* Called from main thread only */ -int sdl_kbhit(void) -{ - int ret; - - pthread_mutex_lock(&sdl_keylock); - ret=(sdl_key!=sdl_keynext); - pthread_mutex_unlock(&sdl_keylock); - return(ret); -} - -/* Called from main thread only */ -int sdl_getch(void) -{ - int ch; - - sem_wait(&sdl_key_pending); - pthread_mutex_lock(&sdl_keylock); - - /* This always frees up space in keybuf for one more char */ - ch=sdl_keybuf[sdl_key++]; - /* If we have missed mouse keys, tack them on to the end of the buffer now */ - if(sdl_pending_mousekeys) { - if(sdl_pending_mousekeys & 1) /* Odd number... second char */ - sdl_keybuf[sdl_keynext++]=CIO_KEY_MOUSE >> 8; - else /* Even number... first char */ - sdl_keybuf[sdl_keynext++]=CIO_KEY_MOUSE & 0xff; - sem_post(&sdl_key_pending); - sdl_pending_mousekeys--; - } - pthread_mutex_unlock(&sdl_keylock); - return(ch); -} - -/* Called from main thread only */ -void sdl_textmode(int mode) -{ - sdl_init_mode(mode); -} - -/* Called from main thread only (Passes Event) */ -int sdl_setname(const char *name) -{ - sdl_user_func(SDL_USEREVENT_SETNAME,name); - return(0); -} - -/* Called from main thread only (Passes Event) */ -int sdl_seticon(const void *icon, unsigned long size) -{ - sdl_user_func(SDL_USEREVENT_SETICON,icon,size); - return(0); -} - -/* Called from main thread only (Passes Event) */ -int sdl_settitle(const char *title) -{ - sdl_user_func(SDL_USEREVENT_SETTITLE,title); - return(0); -} - -int sdl_showmouse(void) -{ - sdl_user_func(SDL_USEREVENT_SHOWMOUSE); - return(1); -} - -int sdl_hidemouse(void) -{ - sdl_user_func(SDL_USEREVENT_HIDEMOUSE); - return(0); -} - -int sdl_get_window_info(int *width, int *height, int *xpos, int *ypos) -{ - int wx, wy; - - if (xpos || ypos) { - sdl_user_func_ret(SDL_USEREVENT_GETWINPOS, &wx, &wy); - if(xpos) - *xpos=wx; - if(ypos) - *ypos=wy; - } - - if (width || height) { - pthread_mutex_lock(&vstatlock); - if(width) - *width=cvstat.winwidth; - if(height) - *height=cvstat.winheight; - pthread_mutex_unlock(&vstatlock); - } - - return(1); -} - -static void setup_surfaces_locked(void) -{ - int flags=0; - SDL_Event ev; - SDL_Texture *newtexture; - int idealw; - int idealh; - int idealmw; - int idealmh; - - if(fullscreen) - flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; - else - flags |= SDL_WINDOW_RESIZABLE; -#if (SDL_MINOR_VERSION > 0) || (SDL_PATCHLEVEL >= 1) - flags |= SDL_WINDOW_ALLOW_HIGHDPI; -#endif - - - pthread_mutex_lock(&win_mutex); - idealmw = cvstat.scrnwidth; - idealmh = cvstat.scrnheight; - aspect_correct(&idealmw, &idealmh, cvstat.aspect_width, cvstat.aspect_height); - idealw = cvstat.winwidth; - idealh = cvstat.winheight; - aspect_fix(&idealw, &idealh, cvstat.aspect_width, cvstat.aspect_height); - internal_scaling = window_can_scale_internally(idealw, idealh); - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, internal_scaling ? "0" : "2"); - - if (win == NULL) { - // SDL2: This is slow sometimes... not sure why. - if (sdl.CreateWindowAndRenderer(cvstat.winwidth, cvstat.winheight, flags, &win, &renderer) == 0) { - sdl.RenderClear(renderer); - if (internal_scaling) - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh); - else - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, cvstat.scrnwidth, cvstat.scrnheight); - - if (texture) - sdl.DestroyTexture(texture); - texture = newtexture; - } - else { - win = NULL; - renderer = NULL; - } - } - else { - sdl.SetWindowMinimumSize(win, idealmw, idealmh); - sdl.SetWindowSize(win, idealw, idealh); - if (internal_scaling) - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh); - else - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, cvstat.scrnwidth, cvstat.scrnheight); - sdl.RenderClear(renderer); - if (texture) - sdl.DestroyTexture(texture); - texture = newtexture; - } - sdl.SetWindowMinimumSize(win, idealmw, idealmh); - - if(win!=NULL) { - bitmap_drv_request_pixels(); - } - else if(sdl_init_good) { - ev.type=SDL_QUIT; - sdl_exitcode=1; - sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT); - } - pthread_mutex_unlock(&win_mutex); -} - -static void setup_surfaces(void) -{ - pthread_mutex_lock(&vstatlock); - setup_surfaces_locked(); - pthread_mutex_unlock(&vstatlock); -} - -/* Called from event thread only */ -static void sdl_add_key(unsigned int keyval) -{ - if(keyval==0xa600) { - fullscreen=!fullscreen; - cio_api.mode=fullscreen?CIOLIB_MODE_SDL_FULLSCREEN:CIOLIB_MODE_SDL; - sdl.SetWindowFullscreen(win, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); - setup_surfaces(); - return; - } - if(keyval <= 0xffff) { - pthread_mutex_lock(&sdl_keylock); - if(sdl_keynext+1==sdl_key) { - beep(); - pthread_mutex_unlock(&sdl_keylock); - return; - } - if((sdl_keynext+2==sdl_key) && keyval > 0xff) { - if(keyval==CIO_KEY_MOUSE) - sdl_pending_mousekeys+=2; - else - beep(); - pthread_mutex_unlock(&sdl_keylock); - return; - } - sdl_keybuf[sdl_keynext++]=keyval & 0xff; - sem_post(&sdl_key_pending); - if(keyval>0xff) { - sdl_keybuf[sdl_keynext++]=keyval >> 8; - sem_post(&sdl_key_pending); - } - pthread_mutex_unlock(&sdl_keylock); - } -} - -/* Called from event thread only */ -static unsigned int sdl_get_char_code(unsigned int keysym, unsigned int mod) -{ - int expect; - int i; - - /* We don't handle META */ - if (mod & KMOD_GUI) - return(0x0001ffff); - - /* Glah! */ -#ifdef __DARWIN__ - if(keysym==0x7f && !(mod & KMOD_CTRL)) { - keysym=0x08; - keysym=SDLK_BACKSPACE; - } -#endif - - /* Find the SDL keysym */ - for(i=0;sdl_keyval[i].keysym;i++) { - if(sdl_keyval[i].keysym==keysym) { - /* KeySym found in table */ - - /* - * Using the modifiers, look up the expected scan code. - */ - if(mod & KMOD_ALT) - expect = sdl_keyval[i].alt; - else if(mod & KMOD_CTRL) - expect=sdl_keyval[i].ctrl; - else if(mod & KMOD_SHIFT) { - if((mod & KMOD_CAPS) && keysym != '\t') - expect=sdl_keyval[i].key; - else - expect=sdl_keyval[i].shift; - } - else { - if(mod & KMOD_CAPS && (toupper(sdl_keyval[i].key) == sdl_keyval[i].shift)) - expect=sdl_keyval[i].shift; - else - expect=sdl_keyval[i].key; - } - - return(expect); - } - } - /* - * Well, we can't find it in our table, or it's a regular key. - */ - if(keysym > 0 && keysym < 128) { - if (isalpha(keysym)) { - /* - * If CAPS and SHIFT are not in the same state, - * upper-case. - */ - if(!!(mod & KMOD_CAPS) != !!(mod & KMOD_SHIFT)) - return toupper(keysym); - } - return keysym; - } - - /* Give up. It's not working out for us. */ - return(0x0001ffff); -} - -static void -sdl_add_keys(uint8_t *utf8s) -{ - char *chars; - char *p; - - chars = utf8_to_cp(getcodepage(), utf8s, '\x00', strlen((char *)utf8s), NULL); - if (chars) { - for (p = chars; *p; p++) { - sdl_add_key(*((uint8_t *)p)); - } - free(chars); - } -} - -/* Mouse event/keyboard thread */ -static void sdl_mouse_thread(void *data) -{ - SetThreadName("SDL Mouse"); - while(1) { - if(mouse_wait()) - sdl_add_key(CIO_KEY_MOUSE); - } -} - -static int win_to_text_xpos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos/(((float)cvstat.winwidth)/cvstat.cols)+1; - if (ret > cvstat.cols) - ret = cvstat.cols; - if (ret < 1) - ret = 1; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -static int win_to_text_ypos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos/(((float)cvstat.winheight)/cvstat.rows)+1; - if (ret > cvstat.rows) - ret = cvstat.rows; - if (ret < 1) - ret = 1; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -static int win_to_res_xpos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos * (cvstat.scrnwidth) / cvstat.winwidth; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -static int win_to_res_ypos(int winpos) -{ - int ret; - - pthread_mutex_lock(&vstatlock); - ret = winpos * (cvstat.scrnheight) / cvstat.winheight; - pthread_mutex_unlock(&vstatlock); - return ret; -} - -void sdl_video_event_thread(void *data) -{ - SDL_Event ev; - int block_text = 0; - static SDL_Keycode last_sym = SDLK_UNKNOWN; - static Uint16 last_mod = 0; - - while(1) { - if(sdl.WaitEventTimeout(&ev, 1)!=1) - continue; - switch (ev.type) { - case SDL_KEYDOWN: /* Keypress */ - last_mod = ev.key.keysym.mod; - last_sym = ev.key.keysym.sym; - if ((ev.key.keysym.mod & (KMOD_CTRL|KMOD_ALT|KMOD_GUI)) && !(ev.key.keysym.mod & KMOD_MODE)) { - block_text = 1; - if ((ev.key.keysym.mod & KMOD_ALT) && - (ev.key.keysym.sym == SDLK_LEFT || - ev.key.keysym.sym == SDLK_RIGHT)) { - int w, h; - - // Don't allow ALT-DIR to change size when maximized... - if ((sdl.GetWindowFlags(win) & SDL_WINDOW_MAXIMIZED) == 0) { - bool wc; - pthread_mutex_lock(&vstatlock); - w = cvstat.winwidth; - h = cvstat.winheight; - aspect_fix(&w, &h, cvstat.aspect_width, cvstat.aspect_height); - if (cvstat.aspect_width == 0 || cvstat.aspect_height == 0) - wc = true; - else - wc = lround((double)(h * cvstat.aspect_width) / cvstat.aspect_height * cvstat.scrnwidth / cvstat.scrnheight) > w; - switch(ev.key.keysym.sym) { - case SDLK_LEFT: - if (wc) { - if (w % (cvstat.scrnwidth)) { - w = w - w % cvstat.scrnwidth; - } - else { - w -= cvstat.scrnwidth; - if (w < cvstat.scrnwidth) - w = cvstat.scrnwidth; - } - } - else { - if (h % (cvstat.scrnheight)) { - h = h - h % cvstat.scrnheight; - } - else { - h -= cvstat.scrnheight; - if (h < cvstat.scrnheight) - h = cvstat.scrnheight; - } - } - break; - case SDLK_RIGHT: - if (wc) - w = (w - w % cvstat.scrnwidth) + cvstat.scrnwidth; - else - h = (h - h % cvstat.scrnheight) + cvstat.scrnheight; - break; - } - if (wc) - h = INT_MAX; - else - w = INT_MAX; - aspect_fix(&w, &h, cvstat.aspect_width, cvstat.aspect_height); - if (w > 16384 || h > 16384) - beep(); - else { - cvstat.winwidth = w; - cvstat.winheight = h; - internal_scaling = window_can_scale_internally(w, h); - } - setup_surfaces_locked(); - pthread_mutex_unlock(&vstatlock); - } - break; - } - } - if (ev.key.keysym.mod & KMOD_RALT) { // Possible AltGr, let textinput sort it out... - block_text = 0; - break; - } - if ((ev.key.keysym.mod & KMOD_SHIFT) && (ev.key.keysym.sym == '\t')) - block_text = 1; - if (block_text || ev.key.keysym.sym < 0 || ev.key.keysym.sym > 127) { - // NUMLOCK makes - if ((ev.key.keysym.mod & KMOD_NUM) && ((ev.key.keysym.sym >= SDLK_KP_1 && ev.key.keysym.sym <= SDLK_KP_0) - || ev.key.keysym.sym == SDLK_KP_DIVIDE - || ev.key.keysym.sym == SDLK_KP_MULTIPLY - || ev.key.keysym.sym == SDLK_KP_MINUS - || ev.key.keysym.sym == SDLK_KP_PLUS - || ev.key.keysym.sym == SDLK_KP_PERIOD)) - break; - sdl_add_key(sdl_get_char_code(ev.key.keysym.sym, ev.key.keysym.mod)); - } - else if (!isprint(ev.key.keysym.sym)) { - if (ev.key.keysym.sym < 128) - sdl_add_key(ev.key.keysym.sym); - } - break; - case SDL_TEXTINPUT: - if (!block_text) { - unsigned int charcode = sdl_get_char_code(last_sym, last_mod & ~(KMOD_ALT)); - // If the key is exactly what we would expect, use sdl_get_char_code() - if (*(uint8_t *)ev.text.text == charcode) - sdl_add_key(sdl_get_char_code(last_sym, last_mod)); - else - sdl_add_keys((uint8_t *)ev.text.text); - } - break; - case SDL_KEYUP: - last_mod = ev.key.keysym.mod; - if (!(ev.key.keysym.mod & (KMOD_CTRL|KMOD_ALT|KMOD_GUI))) - block_text = 0; - break; - case SDL_MOUSEMOTION: - if(!ciolib_mouse_initialized) - break; - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,win_to_text_xpos(ev.motion.x),win_to_text_ypos(ev.motion.y), win_to_res_xpos(ev.motion.x), win_to_res_ypos(ev.motion.y)); - break; - case SDL_MOUSEBUTTONDOWN: - if(!ciolib_mouse_initialized) - break; - switch(ev.button.button) { - case SDL_BUTTON_LEFT: - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(1),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_MIDDLE: - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(2),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_RIGHT: - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(3),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - } - break; - case SDL_MOUSEWHEEL: - if (!ciolib_mouse_initialized) - break; - if (ev.wheel.y) { -#if (SDL_MINOR_VERSION > 0) || (SDL_PATCHLEVEL > 3) - if (ev.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) - ev.wheel.y = 0 - ev.wheel.y; -#endif - if (ev.wheel.y > 0) - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(4), -1, -1, -1, -1); - if (ev.wheel.y < 0) - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(5), -1, -1, -1, -1); - } - break; - case SDL_MOUSEBUTTONUP: - if(!ciolib_mouse_initialized) - break; - switch(ev.button.button) { - case SDL_BUTTON_LEFT: - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(1),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_MIDDLE: - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(2),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - case SDL_BUTTON_RIGHT: - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(3),win_to_text_xpos(ev.button.x),win_to_text_ypos(ev.button.y), win_to_res_xpos(ev.button.x), win_to_res_ypos(ev.button.y)); - break; - } - break; - case SDL_QUIT: - /* - * SDL2: Do we still need the reaper? - * This is what exit()s programs when the - * X is hit. - */ - if (ciolib_reaper) - sdl_user_func(SDL_USEREVENT_QUIT); - else - sdl_add_key(CIO_KEY_QUIT); - break; - case SDL_WINDOWEVENT: - switch(ev.window.event) { - case SDL_WINDOWEVENT_SIZE_CHANGED: - // SDL2: User resized window - case SDL_WINDOWEVENT_RESIZED: - { - // SDL2: Something resized window - const char *newh; - - pthread_mutex_lock(&vstatlock); - pthread_mutex_lock(&win_mutex); - internal_scaling = window_can_scale_internally(ev.window.data1, ev.window.data2); - if (internal_scaling) { - newh = "0"; - } - else { - newh = "2"; - } - sdl.GetWindowSize(win, &cvstat.winwidth, &cvstat.winheight); - if (strcmp(newh, sdl.GetHint(SDL_HINT_RENDER_SCALE_QUALITY))) { - SDL_Texture *newtexture; - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, newh); - if (internal_scaling) { - int idealw, idealh; - idealw = cvstat.winwidth; - idealh = cvstat.winheight; - aspect_fix(&idealw, &idealh, cvstat.aspect_width, cvstat.aspect_height); - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, idealw, idealh); - } - else - newtexture = sdl.CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, cvstat.scrnwidth, cvstat.scrnheight); - sdl.RenderClear(renderer); - if (texture) - sdl.DestroyTexture(texture); - texture = newtexture; - } - sdl.RenderClear(renderer); - bitmap_drv_request_pixels(); - pthread_mutex_unlock(&win_mutex); - pthread_mutex_unlock(&vstatlock); - break; - } - case SDL_WINDOWEVENT_EXPOSED: - bitmap_drv_request_pixels(); - break; - } - break; - case SDL_USEREVENT: { - struct rectlist *list; - struct rectlist *old_next; - switch(ev.user.code) { - case SDL_USEREVENT_QUIT: - sdl_ufunc_retval=0; - if (ciolib_reaper) - exit(0); - sem_post(&sdl_ufunc_ret); - return; - case SDL_USEREVENT_FLUSH: - pthread_mutex_lock(&win_mutex); - if (win != NULL) { - pthread_mutex_lock(&sdl_headlock); - list = update_list; - update_list = update_list_tail = NULL; - pthread_mutex_unlock(&sdl_headlock); - for (; list; list = old_next) { - SDL_Rect src; - SDL_Rect dst; - - old_next = list->next; - if (list->next == NULL) { - void *pixels; - int pitch; - int row; - int tw, th; - - if (internal_scaling) { - struct graphics_buffer *gb; - int xscale, yscale; - internal_scaling_factors(cvstat.winwidth, cvstat.winheight, &xscale, &yscale); - gb = do_scale(list, xscale, yscale, - cvstat.aspect_width, cvstat.aspect_height); - src.x = 0; - src.y = 0; - src.w = gb->w; - src.h = gb->h; - sdl.QueryTexture(texture, NULL, NULL, &tw, &th); - sdl.LockTexture(texture, &src, &pixels, &pitch); - if (pitch != gb->w * sizeof(gb->data[0])) { - // If this happens, we need to copy a row at a time... - for (row = 0; row < gb->h && row < th; row++) { - if (pitch < gb->w * sizeof(gb->data[0])) - memcpy(pixels, &gb->data[gb->w * row], pitch); - else - memcpy(pixels, &gb->data[gb->w * row], gb->w * sizeof(gb->data[0])); - pixels = (void *)((char*)pixels + pitch); - } - } - else { - int ch = gb->h; - if (ch > th) - ch = th; - memcpy(pixels, gb->data, gb->w * ch * sizeof(gb->data[0])); - } - sdl.UnlockTexture(texture); - dst.x = (cvstat.winwidth - gb->w) / 2; - dst.y = (cvstat.winheight - gb->h) / 2; - dst.w = gb->w; - dst.h = gb->h; - release_buffer(gb); - } - else { - src.x = 0; - src.y = 0; - src.w = list->rect.width; - src.h = list->rect.height; - sdl.QueryTexture(texture, NULL, NULL, &tw, &th); - sdl.LockTexture(texture, &src, &pixels, &pitch); - if (pitch != list->rect.width * sizeof(list->data[0])) { - // If this happens, we need to copy a row at a time... - for (row = 0; row < list->rect.height && row < th; row++) { - if (pitch < list->rect.width * sizeof(list->data[0])) - memcpy(pixels, &list->data[list->rect.width * row], pitch); - else - memcpy(pixels, &list->data[list->rect.width * row], list->rect.width * sizeof(list->data[0])); - pixels = (void *)((char*)pixels + pitch); - } - } - else { - int ch = list->rect.height; - if (ch > th) - ch = th; - memcpy(pixels, list->data, list->rect.width * ch * sizeof(list->data[0])); - } - sdl.UnlockTexture(texture); - dst.w = cvstat.winwidth; - dst.h = cvstat.winheight; - // Get correct aspect ratio for dst... - aspect_fix(&dst.w, &dst.h, cvstat.aspect_width, cvstat.aspect_height); - dst.x = (cvstat.winwidth - dst.w) / 2; - dst.y = (cvstat.winheight - dst.h) / 2; - } - sdl.RenderCopy(renderer, texture, &src, &dst); - } - bitmap_drv_free_rect(list); - } - sdl.RenderPresent(renderer); - } - pthread_mutex_unlock(&win_mutex); - break; - case SDL_USEREVENT_SETNAME: - pthread_mutex_lock(&win_mutex); - sdl.SetWindowTitle(win, (char *)ev.user.data1); - pthread_mutex_unlock(&win_mutex); - free(ev.user.data1); - break; - case SDL_USEREVENT_SETICON: - if(sdl_icon != NULL) - sdl.FreeSurface(sdl_icon); - sdl_icon=sdl.CreateRGBSurfaceFrom(ev.user.data1 - , *(unsigned long *)ev.user.data2 - , *(unsigned long *)ev.user.data2 - , 32 - , *(unsigned long *)ev.user.data2*4 - , *(DWORD *)"\377\0\0\0" - , *(DWORD *)"\0\377\0\0" - , *(DWORD *)"\0\0\377\0" - , *(DWORD *)"\0\0\0\377" - ); - pthread_mutex_lock(&win_mutex); - sdl.SetWindowIcon(win, sdl_icon); - pthread_mutex_unlock(&win_mutex); - free(ev.user.data2); - break; - case SDL_USEREVENT_SETTITLE: - pthread_mutex_lock(&win_mutex); - sdl.SetWindowTitle(win, (char *)ev.user.data1); - pthread_mutex_unlock(&win_mutex); - free(ev.user.data1); - break; - case SDL_USEREVENT_SETVIDMODE: - pthread_mutex_lock(&vstatlock); - setup_surfaces_locked(); - pthread_mutex_unlock(&vstatlock); - sdl_ufunc_retval=0; - sem_post(&sdl_ufunc_ret); - break; - case SDL_USEREVENT_HIDEMOUSE: - sdl.ShowCursor(SDL_DISABLE); - break; - case SDL_USEREVENT_SHOWMOUSE: - sdl.ShowCursor(SDL_ENABLE); - break; - case SDL_USEREVENT_INIT: - if(!sdl_init_good) { - if(sdl.WasInit(SDL_INIT_VIDEO)==SDL_INIT_VIDEO) { - pthread_mutex_lock(&win_mutex); - _beginthread(sdl_mouse_thread, 0, NULL); - sdl_init_good=1; - pthread_mutex_unlock(&win_mutex); - } - } - sdl_ufunc_retval=0; - sem_post(&sdl_ufunc_ret); - break; - case SDL_USEREVENT_GETWINPOS: - sdl.GetWindowPosition(win, ev.user.data1, ev.user.data2); - sem_post(&sdl_ufunc_ret); - break; - case SDL_USEREVENT_MOUSEPOINTER: - { - int cid = INT_MIN; - SDL_Cursor *oc = curs; - switch((intptr_t)ev.user.data1) { - case CIOLIB_MOUSEPTR_ARROW: - break; // Default - case CIOLIB_MOUSEPTR_BAR: - cid = SDL_SYSTEM_CURSOR_IBEAM; - break; - } - if (cid == INT_MIN) { - sdl.SetCursor(sdl.GetDefaultCursor()); - curs = NULL; - } - else { - curs = sdl.CreateSystemCursor(cid); - if (curs == NULL) - sdl.SetCursor(sdl.GetDefaultCursor()); - else - sdl.SetCursor(curs); - } - if (oc) - sdl.FreeCursor(oc); - break; - } - } - break; - } - case SDL_SYSWMEVENT: /* ToDo... This is where Copy/Paste needs doing */ - - /* Ignore this stuff */ - case SDL_JOYAXISMOTION: - case SDL_JOYBALLMOTION: - case SDL_JOYHATMOTION: - case SDL_JOYBUTTONDOWN: - case SDL_JOYBUTTONUP: - default: - break; - } - } - return; -} - -int sdl_initciolib(int mode) -{ -#if defined(__DARWIN__) - if (initsdl_ret) { -#else - if(init_sdl_video()) { -#endif - fprintf(stderr,"SDL Video Initialization Failed\n"); - return(-1); - } - sem_init(&sdl_key_pending, 0, 0); - sem_init(&sdl_ufunc_ret, 0, 0); - sem_init(&sdl_ufunc_rec, 0, 0); - pthread_mutex_init(&sdl_ufunc_mtx, NULL); - pthread_mutex_init(&sdl_headlock, NULL); - pthread_mutex_init(&win_mutex, NULL); - pthread_mutex_init(&sdl_keylock, NULL); - return(sdl_init(mode)); -} - -void -sdl_beep(void) -{ - static unsigned char wave[2206]; - - if (wave[2205] == 0) { - xptone_makewave(440, wave, 2205, WAVE_SHAPE_SINE_SAW_HARM); - wave[2205] = 1; - } - xp_play_sample(wave, 2205, TRUE); -} - -/* Called from main thread only (Passes Event) */ -int sdl_mousepointer(enum ciolib_mouse_ptr type) -{ - sdl_user_func(SDL_USEREVENT_MOUSEPOINTER,type); - return(0); -} diff --git a/ciolib/sdl_con.h b/ciolib/sdl_con.h deleted file mode 100644 index 8484f8a6160dc35b0c29658dd21d3110fbc5ae97..0000000000000000000000000000000000000000 --- a/ciolib/sdl_con.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _SDL_CON_H_ -#define _SDL_CON_H_ - -#ifdef __cplusplus -extern "C" { -#endif -/* Low-Level stuff (Shouldn't be used by ciolib programs */ -int sdl_init(int mode); -int sdl_load_font(char *filename, int width, int height, double scale); -int sdl_init_mode(int mode); -int sdl_setup_colours(void); -int sdl_draw_char(unsigned short vch, int xpos, int ypos); -int sdl_screen_redraw(void); -void exit_sdl_con(void); - -/* High-level stuff */ -int sdl_puttext(int sx, int sy, int ex, int ey, void *fill); -int sdl_gettext(int sx, int sy, int ex, int ey, void *fill); -int sdl_kbhit(void); -void sdl_delay(long msec); -void sdl_gotoxy(int x, int y); -int sdl_initciolib(long inmode); -void sdl_setcursortype(int type); -int sdl_getch(void); -void sdl_textmode(int mode); -void sdl_setname(const char *name); -void sdl_seticon(const void *, unsigned long size); -void sdl_settitle(const char *title); -int sdl_hidemouse(void); -int sdl_showmouse(void); -void sdl_copytext(const char *text, size_t buflen); -char *sdl_getcliptext(void); -int sdl_setfont(int font, int force); -int sdl_getfont(void); -int sdl_loadfont(char *filename); -int sdl_get_window_info(int *width, int *height, int *xpos, int *ypos); -int sdl_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b); -void sdl_setwinsize(int w, int h); -void sdl_setwinposition(int x, int y); -void sdl_beep(void); -int sdl_mousepointer(enum ciolib_mouse_ptr type); - -#if defined(__DARWIN__) -void sdl_init_darwin(void *args); -void sdl_video_event_thread(void *data); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/sdlfuncs.c b/ciolib/sdlfuncs.c deleted file mode 100644 index d5c2f09129fcd3720ee5c5967895c52b7d93f45f..0000000000000000000000000000000000000000 --- a/ciolib/sdlfuncs.c +++ /dev/null @@ -1,316 +0,0 @@ -#include <stdlib.h> /* getenv()/exit()/atexit() */ -#include <stdio.h> /* NULL */ - -#include "gen_defs.h" -#include "threadwrap.h" -#include <SDL.h> -#include "ciolib.h" -#include "sdlfuncs.h" -#include "sdl_con.h" -extern int sdl_video_initialized; - -struct sdlfuncs sdl; - -/* Make xp_dl do static linking */ -#ifdef STATIC_SDL -#define STATIC_LINK -#endif -#include <xp_dl.h> - -static int sdl_funcs_loaded=0; - -static void QuitWrap(void); - -int load_sdl_funcs(struct sdlfuncs *sdlf) -{ - dll_handle sdl_dll; - const char *libnames[]={"SDL2", "SDL", NULL}; - - sdlf->gotfuncs=0; - if((sdl_dll=xp_dlopen(libnames,RTLD_LAZY|RTLD_GLOBAL,SDL_PATCHLEVEL))==NULL) - return(-1); - - if((sdlf->Init=xp_dlsym(sdl_dll, SDL_Init))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->Quit=xp_dlsym(sdl_dll, SDL_Quit))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->PeepEvents=xp_dlsym(sdl_dll, SDL_PeepEvents))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetCurrentVideoDriver=xp_dlsym(sdl_dll, SDL_GetCurrentVideoDriver))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->EventState=xp_dlsym(sdl_dll, SDL_EventState))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateRGBSurfaceFrom=xp_dlsym(sdl_dll, SDL_CreateRGBSurfaceFrom))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->RenderPresent=xp_dlsym(sdl_dll, SDL_RenderPresent))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->WaitEventTimeout=xp_dlsym(sdl_dll, SDL_WaitEventTimeout))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateWindowAndRenderer=xp_dlsym(sdl_dll, SDL_CreateWindowAndRenderer))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->FreeSurface=xp_dlsym(sdl_dll, SDL_FreeSurface))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowTitle=xp_dlsym(sdl_dll, SDL_SetWindowTitle))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowSize=xp_dlsym(sdl_dll, SDL_GetWindowSize))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowIcon=xp_dlsym(sdl_dll, SDL_SetWindowIcon))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->ShowCursor=xp_dlsym(sdl_dll, SDL_ShowCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->WasInit=xp_dlsym(sdl_dll, SDL_WasInit))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowWMInfo=xp_dlsym(sdl_dll, SDL_GetWindowWMInfo))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetError=xp_dlsym(sdl_dll, SDL_GetError))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->InitSubSystem=xp_dlsym(sdl_dll, SDL_InitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->QuitSubSystem=xp_dlsym(sdl_dll, SDL_QuitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateTexture=xp_dlsym(sdl_dll, SDL_CreateTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UpdateTexture=xp_dlsym(sdl_dll, SDL_UpdateTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->RenderClear=xp_dlsym(sdl_dll, SDL_RenderClear))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->RenderCopy=xp_dlsym(sdl_dll, SDL_RenderCopy))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetHint=xp_dlsym(sdl_dll, SDL_SetHint))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetHint=xp_dlsym(sdl_dll, SDL_GetHint))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetModState=xp_dlsym(sdl_dll, SDL_GetModState))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowSize=xp_dlsym(sdl_dll, SDL_SetWindowSize))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->DestroyTexture=xp_dlsym(sdl_dll, SDL_DestroyTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowFullscreen=xp_dlsym(sdl_dll, SDL_SetWindowFullscreen))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->LockTexture=xp_dlsym(sdl_dll, SDL_LockTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UnlockTexture=xp_dlsym(sdl_dll, SDL_UnlockTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->QueryTexture=xp_dlsym(sdl_dll, SDL_QueryTexture))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowPosition=xp_dlsym(sdl_dll, SDL_GetWindowPosition))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowPosition=xp_dlsym(sdl_dll, SDL_SetWindowPosition))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetWindowMinimumSize=xp_dlsym(sdl_dll, SDL_SetWindowMinimumSize))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetClipboardText=xp_dlsym(sdl_dll, SDL_SetClipboardText))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetClipboardText=xp_dlsym(sdl_dll, SDL_GetClipboardText))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CreateSystemCursor=xp_dlsym(sdl_dll, SDL_CreateSystemCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetDefaultCursor=xp_dlsym(sdl_dll, SDL_GetDefaultCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->FreeCursor=xp_dlsym(sdl_dll, SDL_FreeCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SetCursor=xp_dlsym(sdl_dll, SDL_SetCursor))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->free=xp_dlsym(sdl_dll, SDL_free))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetWindowFlags=xp_dlsym(sdl_dll, SDL_GetWindowFlags))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } -#ifndef STATIC_SDL - { - int (HACK_HACK_HACK *ra)(char *name, Uint32 style, void *hInst); - if ((ra = xp_dlsym(sdl_dll, SDL_RegisterApp)) != NULL) { - ra(ciolib_appname, 0, NULL); - } - } -#endif - - sdlf->gotfuncs=1; - sdl_funcs_loaded=1; - return(0); -} - -int init_sdl_video(void) -{ - const char *drivername; - - if(sdl_video_initialized) - return(0); - - load_sdl_funcs(&sdl); - - if (!sdl.gotfuncs) - return -1; - - sdl.SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2" ); - sdl.SetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, "1" ); -#ifdef _WIN32 - // code that tells windows we're High DPI aware so it doesn't scale our windows - // taken from Yamagi Quake II - - typedef enum D3_PROCESS_DPI_AWARENESS { - D3_PROCESS_DPI_UNAWARE = 0, - D3_PROCESS_SYSTEM_DPI_AWARE = 1, - D3_PROCESS_PER_MONITOR_DPI_AWARE = 2 - } YQ2_PROCESS_DPI_AWARENESS; - - /* For Vista, Win7 and Win8 */ - BOOL(WINAPI *SetProcessDPIAware)(void) = NULL; - - /* Win8.1 and later */ - HRESULT(WINAPI *SetProcessDpiAwareness)(enum D3_PROCESS_DPI_AWARENESS dpiAwareness) = NULL; - - const char* user32dll[] = {"User32", NULL}; - dll_handle userDLL = xp_dlopen(user32dll, RTLD_LAZY, 0); - - if (userDLL) - { - SetProcessDPIAware = xp_dlsym(userDLL, SetProcessDPIAware); - } - - - const char* shcoredll[] = {"SHCore", NULL}; - dll_handle shcoreDLL = xp_dlopen(shcoredll, RTLD_LAZY, 0); - - if (shcoreDLL) - { - SetProcessDpiAwareness = xp_dlsym(shcoreDLL, SetProcessDpiAwareness); - } - - if (SetProcessDpiAwareness) { - SetProcessDpiAwareness(D3_PROCESS_PER_MONITOR_DPI_AWARE); - } - else if (SetProcessDPIAware) { - SetProcessDPIAware(); - } - /* Fail to windib (ie: No mouse attached) */ - if(sdl.Init(SDL_INIT_VIDEO) == 0) { - sdl_video_initialized=TRUE; - } -#else - /* - * SDL2: Is the below comment still true for SDL2? - * On Linux, SDL doesn't properly detect availability of the - * framebuffer apparently. This results in remote connections - * displaying on the local framebuffer... a definate no-no. - * This ugly hack attempts to prevent this... of course, remote X11 - * connections must still be allowed. - */ - if(getenv("DISPLAY") != NULL || (getenv("REMOTEHOST") == NULL && getenv("SSH_CLIENT") == NULL)) { - if(sdl.Init(SDL_INIT_VIDEO)==0) { - sdl_video_initialized=TRUE; - } - } -#endif - if(sdl_video_initialized && (drivername = sdl.GetCurrentVideoDriver())!=NULL) { - /* Unacceptable drivers */ - if((!strcmp(drivername, "caca")) || (!strcmp(drivername,"aalib")) || (!strcmp(drivername,"dummy"))) { - sdl.Quit(); - sdl_video_initialized=FALSE; - } - } - - if(sdl_video_initialized) { - atexit(QuitWrap); - return 0; - } - - return(-1); -} - -static void QuitWrap(void) -{ - if (sdl_video_initialized) { -#if !defined(__DARWIN__) - exit_sdl_con(); -#endif - if(sdl.Quit) - sdl.Quit(); - } -} diff --git a/ciolib/sdlfuncs.h b/ciolib/sdlfuncs.h deleted file mode 100644 index 7dd75bdf9bea504c97fc40e614fd1abd9d55745b..0000000000000000000000000000000000000000 --- a/ciolib/sdlfuncs.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _SDLFUNCS_H_ -#define _SDLFUNCS_H_ - -#include "SDL.h" -#include "SDL_syswm.h" - -#ifdef _WIN32 - #define HACK_HACK_HACK __cdecl -#else - #define HACK_HACK_HACK -#endif - -struct sdlfuncs { - int (HACK_HACK_HACK *Init) (Uint32 flags); - void (HACK_HACK_HACK *Quit) (void); - int (HACK_HACK_HACK *PeepEvents) (SDL_Event *events, int numevents, - SDL_eventaction action, Uint32 minType, Uint32 maxType); - const char *(HACK_HACK_HACK *GetCurrentVideoDriver) (void); - Uint8 (HACK_HACK_HACK *EventState) (Uint32 type, int state); - SDL_Surface *(HACK_HACK_HACK *CreateRGBSurfaceFrom)(void *pixels, int width, int height, int depth, int pitch, - Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); - void (HACK_HACK_HACK *RenderPresent) (SDL_Renderer *renderer); - int (HACK_HACK_HACK *WaitEventTimeout) (SDL_Event *event, int timeout); - int (HACK_HACK_HACK *CreateWindowAndRenderer) (int w, int h, Uint32 flags, SDL_Window **win, SDL_Renderer **ren); - void (HACK_HACK_HACK *FreeSurface) (SDL_Surface *surface); - void (HACK_HACK_HACK *SetWindowTitle) (SDL_Window *window, const char *title); - void (HACK_HACK_HACK *GetWindowSize) (SDL_Window *window, int *w, int *h); - void (HACK_HACK_HACK *SetWindowIcon) (SDL_Window *win, SDL_Surface *icon); - int (HACK_HACK_HACK *ShowCursor) (int toggle); - Uint32 (HACK_HACK_HACK *WasInit) (Uint32 flags); - SDL_bool (HACK_HACK_HACK *GetWindowWMInfo) (SDL_Window *window, SDL_SysWMinfo *info); - const char *(HACK_HACK_HACK *GetError) (void); - int (HACK_HACK_HACK *InitSubSystem)(Uint32 flags); - void (HACK_HACK_HACK *QuitSubSystem)(Uint32 flags); - SDL_Texture* (HACK_HACK_HACK *CreateTexture) (SDL_Renderer *renderer, Uint32 format, int access, int w, int h); - int (HACK_HACK_HACK *UpdateTexture) (SDL_Texture *texture, const SDL_Rect * rect, const void *pixels, int pitch); - int (HACK_HACK_HACK *RenderClear) (SDL_Renderer *renderer); - int (HACK_HACK_HACK *RenderCopy) (SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *dstrect); - SDL_bool (HACK_HACK_HACK *SetHint) (const char *name, const char *value); - const char * (HACK_HACK_HACK *GetHint) (const char *name); - SDL_Keymod (HACK_HACK_HACK *GetModState) (void); - void (HACK_HACK_HACK *SetWindowSize) (SDL_Window *window, int w, int h); - void (HACK_HACK_HACK *DestroyTexture) (SDL_Texture *texture); - int (HACK_HACK_HACK *SetWindowFullscreen) (SDL_Window *window, Uint32 flags); - int (HACK_HACK_HACK *LockTexture) (SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch); - void (HACK_HACK_HACK *UnlockTexture) (SDL_Texture *texture); - int (HACK_HACK_HACK *QueryTexture) (SDL_Texture *texture, Uint32 *format, int *access, int *w, int *h); - void (HACK_HACK_HACK *GetWindowPosition) (SDL_Window *window, int *x, int *y); - void (HACK_HACK_HACK *SetWindowPosition) (SDL_Window *window, int x, int y); - void (HACK_HACK_HACK *SetWindowMinimumSize) (SDL_Window *window, int w, int y); - int (HACK_HACK_HACK *SetClipboardText) (const char *); - char *(HACK_HACK_HACK *GetClipboardText) (void); - SDL_Cursor *(HACK_HACK_HACK *CreateSystemCursor) (SDL_SystemCursor id); - SDL_Cursor *(HACK_HACK_HACK *GetDefaultCursor) (void); - void (HACK_HACK_HACK *SetCursor) (SDL_Cursor *curs); - void (HACK_HACK_HACK *FreeCursor) (SDL_Cursor *curs); - void(HACK_HACK_HACK *free) (void *); - Uint32(HACK_HACK_HACK *GetWindowFlags) (SDL_Window * window); - int gotfuncs; -}; - -/* Defined in SDL_win32_main.c for Win32 */ -extern struct sdlfuncs sdl; -extern sem_t *sdl_exit_sem; - -#ifdef __cplusplus -extern "C" { -#endif -int load_sdl_funcs(struct sdlfuncs *sdlf); -int init_sdl_audio(void); -int init_sdl_video(void); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/syncicon64.c b/ciolib/syncicon64.c deleted file mode 100644 index b2d6cb27b4380cbafdf27d683aa80f74ff983beb..0000000000000000000000000000000000000000 --- a/ciolib/syncicon64.c +++ /dev/null @@ -1,695 +0,0 @@ -/* GIMP RGBA C-Source image dump (syncicon64.c) */ - -const char syncicon64[64*64*4] = - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\375\375\375\000\375\375\375\000\374\374\374\000\374\374" - "\374\000\374\374\374\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373" - "\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000" - "\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\374\374\374\000\374" - "\374\374\000\375\375\375\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\374\374\374\000\373" - "\373\373\000\372\372\372\000\371\371\371\000\366\366\366\000\363\363\363\000\361\361" - "\361\000\356\356\356\000\354\354\354\000\352\352\352\000\351\351\351\000\350\350\350" - "\000\347\347\347\000\346\346\346\000\346\346\346\000\346\346\346\000\346\346\346\000" - "\347\347\347\000\350\350\350\000\351\351\351\000\352\352\352\000\354\354\354\000\356" - "\356\356\000\361\361\361\000\363\363\363\000\366\366\366\000\371\371\371\000\372\372" - "\372\000\373\373\373\000\374\374\374\000\375\375\375\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\375\375\375\000\374\374\374\000\373\373\373\000\371\371\371\000\365\365\365\000\361" - "\361\361\000\354\354\354\000\347\347\347\000\341\341\341\000\331\331\331\000\321\321" - "\321\000\311\311\311\000\302\302\302\000\274\274\274\000\267\267\267\000\262\262\262" - "\000\257\257\257\000\254\254\254\000\253\253\253\000\252\252\252\000\252\252\252\000" - "\253\253\253\000\254\254\254\000\257\257\257\000\262\262\262\000\266\266\266\000\274" - "\274\274\000\302\302\302\000\311\311\311\000\321\321\321\000\331\331\331\000\341\341" - "\341\000\347\347\347\000\354\354\354\000\361\361\361\000\365\365\365\000\371\371\371" - "\000\373\373\373\000\374\374\374\000\375\375\375\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\374\374\374\000" - "\372\372\372\000\367\367\367\000\361\361\361\000\352\352\352\000\342\342\342\000\327" - "\327\327\000\312\312\312\000\275\275\275\000\261\261\261\000\246\246\246\000\231\231" - "\231\000\215\215\215\000\201\201\201\000xxx\377ppp\377hhh\377bbb\377]]]\377ZZZ" - "\377WWW\377VVV\377VVV\377WWW\377ZZZ\377]]]\377bbb\377hhh\377ppp\377xxx\377" - "\201\201\201\000\215\215\215\000\231\231\231\000\245\245\245\000\261\261\261\000\275" - "\275\275\000\312\312\312\000\327\327\327\000\342\342\342\000\352\352\352\000\361\361" - "\361\000\366\366\366\000\372\372\372\000\374\374\374\000\375\375\375\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375" - "\375\000\373\373\373\000\367\367\367\000\361\361\361\000\350\350\350\000\334\334\334" - "\000\314\314\314\000\273\273\273\000\251\251\251\000\226\226\226\000\203\203\203\000" - "rrr\377bbb\377UUU\377JJJ\377AAA\377:::\377\063\063\063\377---\377(((\377$$$" - "\377\"\"\"\377\037\037\037\377\036\036\036\377\036\036\036\377\036\036\036\377\036\036" - "\036\377\037\037\037\377\"\"\"\377$$$\377(((\377---\377\063\063\063\377:::\377A" - "AA\377JJJ\377UUU\377bbb\377rrr\377\203\203\203\000\226\226\226\000\251\251\251" - "\000\272\272\272\000\314\314\314\000\334\334\334\000\350\350\350\000\360\360\360\000" - "\367\367\367\000\373\373\373\000\375\375\375\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000\374\374\374" - "\000\371\371\371\000\364\364\364\000\352\352\352\000\335\335\335\000\313\313\313\000" - "\265\265\265\000\236\236\236\000\206\206\206\000ooo\377ZZZ\377III\377<<<\377//" - "/\377%%%\377\036\036\036\377\036\036\036\377\037\037\037\377\040\040\040\377!!!\377\"" - "\"\"\377!!!\377\033\033\033\377\036\036\036\377###\377###\377###\377###\377###" - "\377###\377\036\036\036\377\033\033\033\377!!!\377\"\"\"\377!!!\377\040\040\040\377" - "\037\037\037\377\036\036\036\377\036\036\036\377%%%\377///\377;;;\377III\377ZZZ\377" - "ooo\377\206\206\206\000\236\236\236\000\265\265\265\000\312\312\312\000\335\335\335" - "\000\352\352\352\000\363\363\363\000\371\371\371\000\374\374\374\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\374\374\374\000\371\371\371\000\361\361\361\000\345\345" - "\345\000\324\324\324\000\275\275\275\000\243\243\243\000\205\205\205\000jjj\377RRR" - "\377>>>\377---\377\"\"\"\377\036\036\036\377\040\040\040\377\"\"\"\377\033\033\033" - "\377###\377###\377\026\026\026\377\015\015\015\377\015\015\015\377\015\015\015\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\015" - "\015\015\377\026\026\026\377\026\026\026\377###\377\033\033\033\377\"\"\"\377\040\040" - "\040\377\036\036\036\377\"\"\"\377---\377>>>\377QQQ\377jjj\377\205\205\205\000" - "\242\242\242\000\275\275\275\000\324\324\324\000\345\345\345\000\361\361\361\000\371" - "\371\371\000\374\374\374\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\375\375\375\000\371\371\371\000\362\362\362\000\345\345\345\000\320\320\320" - "\000\265\265\265\000\225\225\225\000uuu\377WWW\377???\377,,,\377\036\036\036\377\037" - "\037\037\377\"\"\"\377\033\033\033\377###\377\026\026\026\377\015\015\015\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\026\026\026\377###\377\036" - "\036\036\377\"\"\"\377\037\037\037\377\036\036\036\377,,,\377???\377WWW\377uuu\377" - "\225\225\225\000\264\264\264\000\320\320\320\000\344\344\344\000\362\362\362\000\371" - "\371\371\000\375\375\375\000\376\376\376\000\373\373\373\000\365\365\365\000\351\351" - "\351\000\323\323\323\000\265\265\265\000\221\221\221\000mmm\377MMM\377\063\063\063\377" - "\"\"\"\377\037\037\037\377\"\"\"\377###\377\026\026\026\377\015\015\015\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\014\377\000\000z\377\000\000t\377\000\000\000\377\000\000\000\377" - "\000\000j\377\000\000\006\377\000\000\000\377\000\000\000\377\015\015\015\377\026\026\026\377###\377" - "\"\"\"\377\037\037\037\377!!!\377\063\063\063\377LLL\377mmm\377\221\221\221\000\265" - "\265\265\000\323\323\323\000\350\350\350\000\365\365\365\000\373\373\373\000\355\355" - "\355\000\334\334\334\000\276\276\276\000\230\230\230\000ppp\377KKK\377///\377\036" - "\036\036\377!!!\377\033\033\033\377\026\026\026\377\015\015\015\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\007\377\000\000\012\377\000\000\000\377\000\000\020\377\000\000\026\377\000\000)\377" - "\000\000\017\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\020\377\000\000\177\377\000\000G\377\000" - "\000\062\377\000\000\000\377\000\000\000\377\000\000-\377\000\000\002\377\000\000\000\377\006\006\006\377\010\010" - "\010\377\014\014\014\377\007\007\007\377\033\034\033\377\026\026\026\377\033\033\033\377!!!" - "\377\036\036\036\377///\377KKK\377ppp\377\227\227\227\000\276\276\276\000\334\334" - "\334\000\355\355\355\000\306\306\306\000\247\247\247\000}}}\377SSS\377\062\062\062\377" - "\036\036\036\377!!!\377\036\036\036\377\026\026\026\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\002\002\002\377\003\003\003\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000;\377\000\000T\377\000\000\003\377\000\000\214\377\000" - "\000\223\377\000\000;\377\000\000!\377\000\000\016\377\000\000\003\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\002\377\000\000\224\377\000\000" - "Q\377\000\000\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\025\025\025\377\033\034\033\377\027\027\027\377\027\027\027\377\021\021\021\377\000\000\000\377" - "\000\000\000\377\015\015\015\377\036\036\036\377!!!\377\036\036\036\377\062\062\062\377SSS" - "\377}}}\377\246\246\246\000\306\306\306\000\201\201\201\000aaa\377>>>\377###\377" - "\040\040\040\377\036\036\036\377\026\026\026\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\001\001\001\377\026\026\026\377\025\025\025\377" - "\021\022\021\377\027\030\027\377\000\000\000\377\000\000\007\377\000\000:\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000,\377\000\000\213\377\000\000\300\377\000\000_\377" - "\000\000=\377\000\000\000\377\000\000\000\377\000\000/\377\000\000H\377\000\000\001\377\000\000\000\377\000\000!" - "\377\000\000\237\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\026\026\026\377\036\036\036\377\040\040" - "\040\377###\377===\377aaa\377\200\200\200\000;;;\377)))\377\036\036\036\377!!!" - "\377\026\026\026\377\000\000\001\377\000\000\002\377\000\000\004\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\001\001\001\377\001\001\001\377&&&\377OPO\377QRQ\377#$#\377\000\000\000\377\000\000\000\377" - "\000\000\001\377\000\000\002\377\000\000\014\377\000\000\036\377\000\000V\377\000\000V\377\000\000V\377\000\000" - "X\377\000\000\071\377\000\000\066\377\000\000\300\377\000\000\274\377\000\000\250\377\000\000:\377" - "\000\000\006\377\000\000\251\377\000\000\327\377\000\000)\377\000\000\021\377\000\000\024\377\000\004\240" - "\377\007\007\034\377???\377-.-\377WWW\377`_`\377`_`\377`_`\377TST\377\"\"\"\377" - "\000\000\000\377\000\000\006\377\000\000A\377\000\000\000\377\000\000%\377\000\000U\377\000\000\024\377\000\000" - "\001\377\000\000\000\377\000\000\000\377\026\026\026\377!!!\377\036\036\036\377)))\377;;;\377" - "\040\040\040\377!!!\377###\377\015\015\015\377\000\000\006\377\000\000q\377\000\000\025\377\000" - "\000\062\377\000\000\000\377\000\000\000\377\017\020\017\377xyx\377\203\203\203\377\230\230" - "\230\377\272\273\272\377lll\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000a\377\000" - "\000\216\377\000\000\216\377\000\000\244\377\000\000\337\377\000\000\334\377\000\000\315\377\000" - "\000\342\377\000\000\270\377\000\000d\377\000\000\301\377\000\000\242\377\000\000\214\377\000\000+" - "\377\000\000\016\377\000\000\333\377\000\000\346\377\000\000^\377\000\000S\377\000\000\236\377\000\012" - "\340\377\005\005\067\377///\377HIH\377\303\303\303\377\312\311\312\377\312\311" - "\312\377\312\311\312\377\265\265\265\377QRQ\377\000\000\000\377\000\000\005\377\000\000\060" - "\377\000\000\000\377\000\000\034\377\000\000?\377\000\000|\377\000\000y\377\000\000\007\377\000\000\000\377" - "\000\000\000\377\015\015\015\377###\377!!!\377\040\040\040\377\026\026\026\377\015\015\015" - "\377\000\000\010\377\000\000W\377\000\000)\377\000\000&\377\003\003\003\377\017\017\017\377ede\377" - "\231\231\231\377\226\227\226\377\271\272\271\377\275\276\275\377\274\275" - "\274\377\200\200\200\377&&&\377\000\000\003\377\000\000D\377\000\000\241\377\000\000\331\377" - "\000\000\344\377\000\000\330\377\000\000\214\377\010\010>\377\017\017D\377\017\017?\377\000\000" - "\063\377\000\000s\377\000\000\305\377\000\000\277\377\001\001?\377\016\016-\377\017\017\017\377" - "\010\010\013\377\000\000X\377\000\000\360\377\000\005>\377\000+\225\377\000\020\333\377\000\003\352" - "\377\000\000\223\377\000\000\020\377\015\015\015\377xwx\377\343\342\343\377\357\360\357" - "\377\357\360\357\377\340\341\340\377~~~\377\000\000\000\377\014\014\014\377\017\017" - "\017\377\017\017\017\377\017\017\017\377\017\017\017\377\004\004(\377\000\000\210\377\000\000Q" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\000\000\000" - "\377\000\000\000\377\000\000j\377\000\000c\377\000\000\002\377\000\000\000\377\062\062\062\377\266\267" - "\266\377\273\274\273\377\275\276\275\377\275\276\275\377\275\276\275\377" - "\275\276\275\377\275\276\275\377sss\377\016\016\016\377\000\001F\377\002\003\335\377" - "\000\002\375\377\000\000\374\377\004\004H\377\035\035'\377\036\036#\377klk\377\264\265\264" - "\377\235\236\235\377\000\000&\377\000\000\317\377\000\000\307\377\026\026V\377--.\377\246" - "\247\246\377\266\267\266\377jjj\377\000\000)\377\000\032\347\377\000\007\302\377\000/" - "\220\377\000\022_\377\025\025\037\377!!)\377!!\"\377!!!\377\061\062\061\377\262\262" - "\262\377\365\365\365\377\365\365\365\377\352\352\352\377\213\213\213\377" - "\006\006\006\377\216\217\216\377\266\267\266\377\266\267\266\377\252\253\252\377" - "\230\231\230\377##<\377\000\000\216\377\000\000Y\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\246\377\000\000\033\377" - "\000\000\000\377\000\000\000\377klk\377\276\277\276\377\275\276\275\377\275\276\275\377" - "\311\311\311\377\312\311\312\377\275\276\275\377\275\276\275\377\207\210" - "\207\377\001\001\004\377\000\005\352\377\013\020\373\377\000\012\375\377\000\000\363\377\030" - "\027?\377\260\257\260\377\265\266\265\377\271\272\271\377\260\261\260\377" - ")))\377\000\000~\377\000\000\317\377%%i\377\237\236\242\377\271\271\271\377\274\275" - "\274\377\275\276\275\377\255\255\255\377\000\001\004\377\000\\\251\377\000\003\201\377" - "\011\014\025\377\062\063\067\377\234\234\234\377\310\307\310\377\310\307\310\377" - "\310\307\310\377\217\216\217\377\225\226\225\377\302\302\302\377\300\301" - "\300\377\277\300\277\377\210\211\210\377###\377\224\224\224\377\275\276\275" - "\377\301\301\301\377xwx\377\010\010\071\377\002\002n\377\000\000\225\377\000\000r\377\000" - "\000[\377\000\000\040\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\011d\377\000\013\027\377\000\000\000\377\024\024\024\377\261\261\261\377\334\334" - "\334\377\333\334\333\377\324\324\324\377\205\203\205\377\211\210\211\377" - "\275\276\275\377\275\276\275\377\236\237\236\377\017\017\021\377\000\003\233\377" - "\007\012\375\377\000\006\301\377\000\000\313\377\031\030?\377\270\267\270\377\275\276" - "\275\377\271\272\271\377\240\241\240\377\022\023D\377\000\004\350\377\000\000]\377" - "RRR\377\300\300\300\377\301\301\301\377\275\276\275\377\275\276\275\377\261" - "\261\261\377\036\036\037\377\000\000Z\377\021\021\023\377iii\377\235\236\235\377\305" - "\305\305\377\310\310\310\377\310\310\310\377\310\310\310\377\303\303\303" - "\377\207\207\207\377\243\243\243\377\331\332\331\377\333\334\333\377\270" - "\270\270\377@@@\377qqq\377\303\304\303\377\277\300\277\377\224\224\224\377" - "\000\000|\377\000\000\177\377\002\002\211\377\002\002\370\377\000\000\354\377\000\000\207\377\000\000" - "\061\377\000\000\007\377\000\000\024\377\000\000\000\377\000\000\000\377\000\000\000\377\000\025\025\377\000" - "\024\027\377\000\000\001\377*+*\377\372\372\372\377\375\375\375\377\376\376\376\377" - "\372\371\372\377\211\211\211\377\031\031\031\377nmn\377\326\323\326\377\300" - "\300\300\377\214\215\214\377\000\000\015\377\000\000C\377\002\002\"\377\000\000\240\377\031" - "\030?\377\270\267\270\377\275\276\275\377\263\264\263\377\214\215\214\377" - "\000\001i\377\000\016\315\377\022\022\026\377\\]\\\377TTT\377\246\246\246\377\276\277" - "\276\377\275\276\275\377\264\265\264\377BCB\377\001\001\001\377\226\226\226\377" - "\314\313\314\377\277\300\277\377\275\276\275\377\275\276\275\377\275\276" - "\275\377\275\276\275\377\275\276\275\377EEE\377~}~\377\373\373\373\377\377" - "\377\377\377\362\362\362\377bbb\377FGF\377\312\311\312\377\275\276\275\377" - "\271\272\271\377\002\002#\377\000\000\267\377\006\006\367\377\006\006\371\377\000\000\355\377" - "\000\000\274\377\000\000l\377\000\000\016\377\000\000,\377\000\000\001\377\000\000\000\377\000\000\005\377\000" - "\005\035\377\000\004p\377\000\000B\377\014\014\017\377yzy\377\300\300\300\377\320\320\320" - "\377\315\315\315\377\274\274\274\377\220\216\220\377\040\040\040\377\062\061\062" - "\377\062\062\062\377;;;\377\025\026\025\377\040\040\040\377<=<\377\006\006c\377\031\030" - "\060\377\270\267\270\377\275\276\275\377\262\263\262\377\200\200\200\377\037" - "\040\066\377\000q\234\377\005\010\010\377\026\027\"\377\013\013\023\377LML\377\263\263" - "\263\377\275\276\275\377\301\302\301\377HGH\377\065\065\065\377\276\277\276" - "\377\301\302\301\377\276\277\276\377\300\300\300\377\276\277\276\377\275" - "\276\275\377\266\267\266\377\266\267\266\377\017\017\017\377\061\061\061\377\367" - "\367\367\377\377\377\377\377\375\375\375\377ooo\377...\377\260\261\260\377" - "\275\276\275\377\264\265\264\377UUU\377\025\026;\377\027\027L\377\027\027L\377" - "\025\026J\377\011\011\062\377\017\017'\377\003\003\006\377\000\000^\377\000\000\026\377\000\000\004\377" - "\000\000D\377\000\000\314\377\000\000\305\377\000\000\303\377\000\001A\377\003\011\035\377MKM\377" - "\300\275\300\377\276\276\276\377\275\276\275\377\275\276\275\377\201\201" - "\201\377\021\021\021\377./.\377\243\243\243\377\267\270\267\377\225\226\225" - "\377Z[Z\377\010\010F\377\034\034,\377\277\277\277\377\307\310\307\377\263\264" - "\263\377\213\213\213\377\264\264\264\377(--\377\031\030\031\377\000\000S\377\000\000" - "\070\377\061\061\061\377\270\270\270\377\307\310\307\377\314\314\314\377MMM\377" - "[\\[\377\310\311\310\377\310\311\310\377\302\303\302\377\274\272\274\377" - "\261\261\261\377\273\274\273\377\265\266\265\377\252\252\252\377\000\000\000\377" - "\027\030\027\377\343\343\343\377\376\376\376\377\377\377\377\377\331\332\331" - "\377\302\303\302\377\307\310\307\377\307\310\307\377\277\300\277\377\304" - "\305\304\377\242\243\242\377\231\232\231\377\231\232\231\377\231\232\231" - "\377>?>\377kkk\377\025\025\030\377\000\000t\377\000\000\027\377\000\000\032\377\000\000\300\377" - "\000\000\355\377\000\000r\377\000\000\257\377\000\005\363\377\000%\263\377\001\001X\377\001\001)\377" - "MMM\377xxx\377\307\305\307\377\316\315\316\377\216\215\216\377\037\040\037\377" - "\236\237\236\377\275\276\275\377\275\276\275\377\240\241\240\377\011\011\012" - "\377\061\061\061\377\346\345\346\377\377\377\377\377\261\261\261\377\310\310" - "\310\377\376\376\376\377\374\373\374\377\305\304\305\377__`\377\033\033\034" - "\377\030\030\030\377\343\343\343\377\377\377\377\377\364\362\364\377cbc\377" - "\332\332\332\377\375\375\375\377\377\377\377\377\271\271\271\377(((\377K" - "KK\377\262\263\262\377\275\276\275\377srs\377\000\000=\377\000\000\016\377\200\200" - "\200\377\372\372\372\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\376\376\376\377\377\377\377\377;;;\377\001" - "\001W\377\001\030h\377\001\063b\377\001\001a\377\001\001Z\377\000\000k\377\000\000W\377\000\000\000\377" - "\000\002>\377\000\030\307\377\000\020\342\377\000\000_\377\000\000\330\377\000\003\364\377\000\022" - "g\377\000\000g\377\000\000/\377\000\000\000\377\016\015\016\377jhj\377\266\265\266\377\310" - "\307\310\377\202\202\202\377\252\252\252\377\276\277\276\377\275\276\275" - "\377\267\267\267\377)()\377AAA\377\322\322\322\377\336\337\336\377\256\257" - "\256\377\245\245\245\377\337\337\337\377\336\337\336\377\336\337\336\377" - "\316\316\316\377\212\211\212\377)))\377\307\310\307\377\341\341\341\377\336" - "\335\336\377\\[\\\377\326\325\326\377\376\375\376\377\376\376\376\377\206" - "\206\206\377\000\000\000\377)))\377\202\203\202\377\275\276\275\377\227\230\227" - "\377##%\377\000\000\000\377www\377\343\343\343\377\336\337\336\377\313\314\313" - "\377\200\200\200\377\212\212\212\377\337\337\337\377\336\337\336\377\336" - "\337\336\377Z[Z\377\000\000s\377\000\033\340\377\000:\310\377\000\004\274\377\000\000\207" - "\377\000\000q\377\000\000\000\377\000\000\000\377\000\006b\377\000\062\315\377\000\036\330\377\000\000" - "M\377\000\000\205\377\000\000\067\377\037\037\037\377\223\223\223\377\223\223\223\377" - "+++\377\000\000x\377\000\000\015\377\224\225\224\377\302\302\302\377\275\276\275\377" - "\267\270\267\377\277\300\277\377\275\276\275\377\301\301\301\377\243\243" - "\243\377hhh\377\275\276\275\377\275\276\275\377\254\255\254\377\202\202\202" - "\377\277\300\277\377\275\276\275\377\275\276\275\377\275\276\275\377\302" - "\303\302\377\241\241\241\377\272\273\272\377\304\304\304\377\310\307\310" - "\377TUT\377\321\320\321\377\375\375\375\377\376\375\376\377\206\206\206\377" - "\000\000\000\377\001\001t\377\022\023$\377*+*\377*+*\377\020\020\020\377\000\000\000\377jjj\377" - "\316\315\316\377\275\276\275\377\227\230\227\377\000\000\000\377\025\025\025\377\277" - "\300\277\377\275\276\275\377\275\276\275\377{{{\377\000\000\007\377\000\000/\377\000" - "\000|\377\000\013\345\377\000\000>\377\000\000\000\377\000\000\000\377\000\000\000\377\000\001!\377\000\010" - "\263\377\000\021\366\377\000\021\337\377\000\000\274\377+++\377\231\227\231\377\265" - "\266\265\377wxw\377'('\377\037\037\067\377@?B\377\304\303\304\377\275\276\275" - "\377\320\316\320\377[Z[\377\310\306\310\377\331\331\331\377\361\360\361\377" - "\363\364\363\377\351\351\351\377\365\365\365\377\365\365\365\377\205\205" - "\205\377\215\214\215\377\301\301\301\377\300\301\300\377\223\222\223\377" - "^^^\377\263\264\263\377\275\276\275\377\275\276\275\377\302\302\302\377\310" - "\307\310\377FGF\377\251\247\251\377\364\363\364\377\372\371\372\377\314\314" - "\314\377MNM\377\006\006)\377\000\000\177\377\000\000b\377\016\016\016\377=>=\377\061\062\061" - "\377***\377\273\274\273\377\275\276\275\377\227\230\227\377\000\000\065\377\003" - "\003\063\377\216\216\216\377\275\276\275\377\275\276\275\377\263\264\263\377" - "\013\025&\377\000D\262\377\000\000\277\377\000\002n\377\000\000\011\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\001\377\000\000\064\377\000<\277\377\000N\273\377\000\000\245\377\062\063\063" - "\377\255\253\255\377\265\266\265\377\271\272\271\377\265\266\265\377\265" - "\266\265\377\276\276\276\377\316\314\316\377\303\303\303\377\325\323\325" - "\377\272\272\272\377WYW\377SRS\377\273\270\273\377\322\321\322\377\363\363" - "\363\377\362\362\362\377\360\360\360\377nnn\377\230\227\230\377\304\304\304" - "\377\303\304\303\377\225\224\225\377\007\007\007\377hhh\377\267\270\267\377\275" - "\276\275\377\301\301\301\377\307\307\307\377SSS\377\066\067\066\377\347\346" - "\347\377\361\360\361\377\324\324\324\377\275\275\275\377HGH\377&&-\377*)" - "/\377ghg\377\204\205\204\377HIH\377\031\031\031\377\260\260\260\377\277\300" - "\277\377\233\234\233\377\000\000M\377\000\010\261\377\206\206\206\377\301\302\301" - "\377\301\302\301\377\276\277\276\377\037*:\377\000\\\234\377\000\006\021\377\000\000" - "\004\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\062\063\062\377\255\253\255\377\275\276\275\377\275" - "\276\275\377\275\276\275\377\275\276\275\377\301\302\301\377\321\320\321" - "\377\332\330\332\377\311\311\311\377\275\276\275\377\265\265\265\377kkk\377" - "\021\021\021\377\062\063\062\377\277\300\277\377\275\276\275\377\261\262\261\377" - "+++\377\276\277\276\377\320\316\320\377\316\315\316\377\275\276\275\377\020" - "\020\020\377\000\000\000\377[\\[\377\264\265\264\377\275\276\275\377\307\307\307" - "\377\230\230\230\377\000\000\000\377yyy\377\313\311\313\377\275\276\275\377\327" - "\325\327\377\325\323\325\377\304\304\304\377\312\311\312\377\275\276\275" - "\377\237\240\237\377\200\201\200\377\000\000L\377\215\215\221\377\310\310\310" - "\377\253\254\253\377\000\002Y\377\000(\275\377\213\212\213\377\322\320\322\377" - "\322\320\322\377\302\302\302\377opo\377\000\212\214\377\000\037\040\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\011\011\377" - "\000\036\036\377\000\006\007\377\034\034\034\377\267\266\267\377\322\321\322\377\322\321" - "\322\377\277\277\277\377\232\233\232\377\263\264\263\377\303\303\303\377" - "\307\306\307\377{{{\377WX[\377[[`\377PPT\377\020\021\022\377]]]\377\311\310" - "\311\377\310\310\310\377\234\234\234\377FFF\377\272\273\272\377\302\302\302" - "\377\332\327\332\377\323\321\323\377ono\377\013\014R\377\010\010\037\377^^^\377" - "\274\274\274\377\302\302\302\377\245\245\245\377\026\027\026\377\022\022\023\377" - "^]`\377\206\207\206\377\306\305\306\377\300\301\300\377\301\301\301\377\266" - "\265\266\377\257\260\257\377\253\254\253\377PPP\377\000\000K\377\211\211\214" - "\377\301\301\301\377uuu\377\000;w\377\000\035e\377\200\200\200\377\306\306\306" - "\377\302\300\302\377\320\317\320\377<PP\377\000\232\233\377\000\016\016\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\023\023" - "\377\000\067\070\377\000\014\014\377\002\002\002\377HHH\377\303\302\303\377\303\302\303" - "\377\262\263\262\377jkj\377$$$\377'**\377'**\377\014\017\025\377\000\002\251\377" - "\000\001\302\377\000\000\243\377\000\000O\377\203\203\203\377\320\317\320\377\322\320" - "\320\377\211\210\210\377\024\024\024\377(((\377'''\377\303\302\303\377\303\302" - "\303\377\257\260\257\377\026\026\062\377\000\001\232\377\006\006\036\377XXX\377\272\273" - "\272\377\263\263\263\377\236\237\236\377\005\006!\377\000\000j\377\022\022\022\377'" - "')\377\235\236\236\377\274\274\274\377\230\226\230\377bbb\377'''\377\010\010" - "\010\377\000\000\000\377\206\207\206\377yzy\377\017\017\020\377\000h\220\377\003\030\035" - "\377z{z\377\275\276\275\377\264\263\264\377\334\333\334\377\020\030\030\377" - "\000$$\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\003\003\377\000\007\007\377\000bc\377\000\027\027\377\005\014\014\377\031-" - "-\377\031\031\031\377\027//\377\016//\377\000=>\377\000\217\221\377\000\240\243\377" - "\000\275\304\377\000w\345\377\000$\311\377\000\000\245\377\031\031k\377\306\304\306\377" - "\311\311\303\377\353\352y\377ff\032\377!!!\377\063\063\063\377\010\010\010\377\031" - "\031\037\377\031\031.\377YZY\377\060\060\060\377\000Is\377\000$\263\377\010\010\061\377" - "\031\031.\377ooo\377\236\237\236\377{|\200\377():\377\020\020\020\377\000\000]\377" - "\024\024\063\377\031\031\066\377\024\024\065\377\013\013\034\377\000\000\000\377\000\000\000\377" - "\066\066\066\377\224\224\224\377WWW\377\000\000,\377\012\030M\377uxx\377\226\226\226" - "\377\236\237\236\377\235\236\235\377<<<\377\002\002\002\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000!!\377\000_`\377\000\000\000\377\000ln\377" - "\000\235\237\377\000\226\227\377\000\000\004\377\000QY\377\000\244\262\377\000g\273\377\000" - "\037\223\377\000\000K\377\063\063\063\377\325\323\325\377\325\325\232\377\363\362" - "Q\377\207\207\034\377[\\[\377kjj\377EE\022\377\000\000\035\377\000\000e\377\000\000\031\377" - "\000\000\062\377\000P~\377\000\247\315\377\000$\363\377\000\010\225\377\000\000:\377\000\000\022" - "\377\031\031\031\377\213\213\213\377KKK\377\000\000\000\377\000\000\015\377\000\000\211\377" - "\000\000\233\377\000\000S\377\035\035\035\377\012\012\012\377\231\231\231\377\010\010\010" - "\377\000\000\000\377\000\000&\377\000\000*\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\001\001\377\000\002\002\377\000\000\000\377\000\002\002\377\000\003\003\377\000\003\003\377\000\000\020" - "\377\000\002\034\377\000\003&\377\000\002\065\377\000\001\003\377\"\"#\377\231\231\231\377\350" - "\346\217\377\374\374\023\377\377\377\001\377\375\375W\377\374\374\374\377\372" - "\372\367\377\221\221-\377\000\000\001\377\000\000\002\377\000\000\061\377\000\000b\377\000\013\272" - "\377\000Y\315\377\000M\316\377\000\037\314\377\000\000\227\377\000\000\214\377\000\000\003\377" - "\003\003\003\377\001\001\001\377\000\000\000\377FFF\377\002\002\004\377\000\000\003\377\000\000\002\377\071\071" - "\071\377\023\023\023\377\003\003\003\377\000\000\000\377\000\000\000\377\000\000\001\377\000\000K\377\000\000" - "\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\007\377\000\000\013\377\000\000\017\377\000\000\025\377\000" - "\000\000\377\034\035\034\377PPP\377cc\031\377ll\000\377\206\206\000\377\377\377%\377" - "\377\377l\377\232\232j\377\023\023\023\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000G\377\000\000V\377\000\005V\377\000\015V\377\000\000\037\377\000\000\206\377\000\000Z\377" - "\000\000\071\377\000\000\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\027\027\000\377\314\314\003\377\372\372" - "\012\377\236\236\000\377\014\014\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000W\377\000\000" - "\220\377\000\000]\377\000\000\024\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377FF\000\377\343\343\035\377\216" - "\216k\377\025\025\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\017\377\000\000\027\377\000\000\001\377\000\000u\377\000\000" - "\027\377\000\000\015\377\000\000\003\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\040\040\040" - "\377!!!\377###\377\015\015\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\315\315\063\377\240\240\007\377" - "\004\004\004\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000/\377\000\000K\377\000\000\000\377\000\000\004\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\015\015\015\377###\377!!!\377\040\040\040\377:::\377(((\377\036" - "\036\036\377!!!\377\026\026\026\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000``\377\314\341\322\377\226\226\030\377\\\\\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\026" - "\026\026\377!!!\377\037\037\037\377(((\377:::\377\200\200\200\000aaa\377===\377" - "###\377!!!\377\036\036\036\377\015\015\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000CC\377m|W\377\315\315\011\377@@\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\036\036\036\377!!!\377###\377==" - "=\377aaa\377\200\200\200\000\306\306\306\000\246\246\246\000}}}\377SSS\377\062\062" - "\062\377\036\036\036\377!!!\377\036\036\036\377\015\015\015\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\257\257\000\377==\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\015\015\015\377###\377\"\"\"\377\036\036\036\377\062\062\062\377RRR\377}" - "}}\377\246\246\246\000\305\305\305\000\355\355\355\000\334\334\334\000\276\276\276" - "\000\227\227\227\000ooo\377KKK\377///\377\036\036\036\377!!!\377\033\033\033\377\026" - "\026\026\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\207\207\000\377\001\001\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\026\026\026\377\033\033\033\377!!!\377\036\036\036\377///\377JJJ\377ooo\377\227\227" - "\227\000\276\276\276\000\333\333\333\000\355\355\355\000\372\372\372\000\365\365\365" - "\000\350\350\350\000\323\323\323\000\264\264\264\000\221\221\221\000mmm\377LLL\377" - "\063\063\063\377\"\"\"\377\037\037\037\377\"\"\"\377###\377\026\026\026\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\\\\\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\026\026\026" - "\377###\377\"\"\"\377\037\037\037\377!!!\377\063\063\063\377LLL\377mmm\377\220" - "\220\220\000\264\264\264\000\322\322\322\000\350\350\350\000\365\365\365\000\372\372" - "\372\000\375\375\375\000\374\374\374\000\371\371\371\000\362\362\362\000\345\345\345" - "\000\320\320\320\000\264\264\264\000\225\225\225\000uuu\377WWW\377>>>\377+++\377" - "\036\036\036\377\037\037\037\377\"\"\"\377\036\036\036\377\026\026\026\377\015\015\015\377" - "\015\015\015\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000" - "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\015\015\015\377\015" - "\015\015\377\026\026\026\377\036\036\036\377\"\"\"\377\037\037\037\377\036\036\036\377" - "+++\377>>>\377WWW\377uuu\377\224\224\224\000\264\264\264\000\317\317\317\000\344" - "\344\344\000\362\362\362\000\371\371\371\000\374\374\374\000\375\375\375\000\376\376" - "\376\000\376\376\376\000\375\375\375\000\374\374\374\000\370\370\370\000\361\361\361" - "\000\345\345\345\000\323\323\323\000\275\275\275\000\242\242\242\000\205\205\205\000" - "jjj\377RRR\377>>>\377---\377!!!\377\036\036\036\377\040\040\040\377\"\"\"\377\033" - "\033\033\377###\377\026\026\026\377\015\015\015\377\015\015\015\377\015\015\015\377\000\000" - "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" - "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" - "\015\015\015\377\015\015\015\377\026\026\026\377###\377\033\033\033\377\"\"\"\377\040" - "\040\040\377\036\036\036\377!!!\377---\377>>>\377QQQ\377jjj\377\205\205\205\000" - "\242\242\242\000\274\274\274\000\323\323\323\000\345\345\345\000\361\361\361\000\370" - "\370\370\000\374\374\374\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\374\374\374" - "\000\371\371\371\000\363\363\363\000\352\352\352\000\335\335\335\000\312\312\312\000" - "\265\265\265\000\236\236\236\000\206\206\206\000ooo\377ZZZ\377III\377;;;\377.." - ".\377%%%\377\036\036\036\377\036\036\036\377\037\037\037\377\040\040\040\377\"\"\"\377" - "\"\"\"\377!!!\377\033\033\033\377\036\036\036\377###\377###\377###\377###\377#" - "##\377###\377\036\036\036\377\033\033\033\377!!!\377\"\"\"\377\"\"\"\377\040\040" - "\040\377\037\037\037\377\036\036\036\377\036\036\036\377%%%\377...\377;;;\377III\377" - "YYY\377nnn\377\205\205\205\000\236\236\236\000\265\265\265\000\312\312\312\000\335" - "\335\335\000\352\352\352\000\363\363\363\000\370\370\370\000\374\374\374\000\375\375" - "\375\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377" - "\000\377\377\377\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\375\375\375\000\374\374\374\000\372\372\372\000\366\366\366\000\360\360\360\000\347" - "\347\347\000\333\333\333\000\313\313\313\000\272\272\272\000\250\250\250\000\226\226" - "\226\000\203\203\203\000rrr\377bbb\377UUU\377JJJ\377AAA\377:::\377\062\062\062\377" - "---\377(((\377$$$\377!!!\377\037\037\037\377\036\036\036\377\035\035\035\377\035\035" - "\035\377\036\036\036\377\037\037\037\377!!!\377$$$\377(((\377---\377\062\062\062\377" - "\071\071\071\377AAA\377JJJ\377UUU\377bbb\377rrr\377\203\203\203\000\226\226\226" - "\000\250\250\250\000\272\272\272\000\313\313\313\000\333\333\333\000\347\347\347\000" - "\360\360\360\000\366\366\366\000\372\372\372\000\374\374\374\000\375\375\375\000\376" - "\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\375\375\375\000" - "\374\374\374\000\372\372\372\000\366\366\366\000\361\361\361\000\352\352\352\000\342" - "\342\342\000\327\327\327\000\312\312\312\000\275\275\275\000\261\261\261\000\245\245" - "\245\000\231\231\231\000\214\214\214\000\201\201\201\000xxx\377ooo\377hhh\377bbb" - "\377]]]\377ZZZ\377WWW\377VVV\377VVV\377WWW\377ZZZ\377]]]\377bbb\377hhh\377" - "ooo\377xxx\377\201\201\201\000\214\214\214\000\231\231\231\000\245\245\245\000\261" - "\261\261\000\275\275\275\000\312\312\312\000\327\327\327\000\342\342\342\000\352\352" - "\352\000\361\361\361\000\366\366\366\000\372\372\372\000\374\374\374\000\375\375\375" - "\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375" - "\000\375\375\375\000\374\374\374\000\372\372\372\000\370\370\370\000\365\365\365\000" - "\360\360\360\000\354\354\354\000\347\347\347\000\341\341\341\000\331\331\331\000\321" - "\321\321\000\311\311\311\000\301\301\301\000\273\273\273\000\266\266\266\000\262\262" - "\262\000\257\257\257\000\254\254\254\000\253\253\253\000\252\252\252\000\252\252\252" - "\000\253\253\253\000\254\254\254\000\257\257\257\000\262\262\262\000\266\266\266\000" - "\273\273\273\000\301\301\301\000\310\310\310\000\321\321\321\000\331\331\331\000\341" - "\341\341\000\347\347\347\000\354\354\354\000\360\360\360\000\365\365\365\000\370\370" - "\370\000\372\372\372\000\374\374\374\000\375\375\375\000\375\375\375\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\375\375\375\000" - "\374\374\374\000\374\374\374\000\373\373\373\000\372\372\372\000\370\370\370\000\366" - "\366\366\000\363\363\363\000\360\360\360\000\356\356\356\000\354\354\354\000\352\352" - "\352\000\350\350\350\000\347\347\347\000\346\346\346\000\346\346\346\000\346\346\346" - "\000\346\346\346\000\346\346\346\000\346\346\346\000\347\347\347\000\350\350\350\000" - "\352\352\352\000\354\354\354\000\356\356\356\000\360\360\360\000\363\363\363\000\366" - "\366\366\000\370\370\370\000\372\372\372\000\373\373\373\000\374\374\374\000\374\374" - "\374\000\375\375\375\000\375\375\375\000\376\376\376\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\375\375\375\000\375" - "\375\375\000\375\375\375\000\374\374\374\000\374\374\374\000\374\374\374\000\373\373" - "\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373" - "\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000" - "\373\373\373\000\373\373\373\000\373\373\373\000\373\373\373\000\374\374\374\000\374" - "\374\374\000\375\375\375\000\375\375\375\000\375\375\375\000\375\375\375\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376" - "\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000" - "\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376" - "\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376\376\000\376\376" - "\376\000\376\376\376\000\376\376\376\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" - "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" - "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" - "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" - "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377"; - diff --git a/ciolib/syncicon64.h b/ciolib/syncicon64.h deleted file mode 100644 index 58a37cef01d0eaff91a0e1bdeb3da0bf53d1f7db..0000000000000000000000000000000000000000 --- a/ciolib/syncicon64.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef SYNCICON64_H_ -#define SYNCICON64_H_ - -#define SYNCICON64_WIDTH 64 -#define SYNCICON64_HEIGHT 64 -extern const char syncicon64[64*64*4]; - -#endif diff --git a/ciolib/syncicon64.ico b/ciolib/syncicon64.ico deleted file mode 100644 index 39069e2a0e15a5740dd956ceb5bf4d81988aee2c..0000000000000000000000000000000000000000 Binary files a/ciolib/syncicon64.ico and /dev/null differ diff --git a/ciolib/utf8_codepages.c b/ciolib/utf8_codepages.c deleted file mode 100644 index b3a9005ce40ce8b1e1deb4202e38ef0b4656e374..0000000000000000000000000000000000000000 --- a/ciolib/utf8_codepages.c +++ /dev/null @@ -1,1929 +0,0 @@ -#include <inttypes.h> -#include <stdlib.h> -#include "utf8_codepages.h" - -struct ciolib_cpmap { - uint32_t unicode; - uint8_t cpchar; -}; - -// Sorted by unicode codepoint... -const static struct ciolib_cpmap cp437_table[162] = { - {0x0000, 0}, {0x00A0, 255}, {0x00A1, 173}, {0x00A2, 155}, - {0x00A3, 156}, {0x00A5, 157}, {0x00A6, 124}, {0x00A7, 21}, {0x00AA, 166}, - {0x00AB, 174}, {0x00AC, 170}, {0x00B0, 248}, {0x00B1, 241}, - {0x00B2, 253}, {0x00B5, 230}, {0x00B6, 20}, {0x00B7, 250}, - {0x00BA, 167}, {0x00BB, 175}, {0x00BC, 172}, {0x00BD, 171}, - {0x00BF, 168}, {0x00C4, 142}, {0x00C5, 143}, {0x00C6, 146}, - {0x00C7, 128}, {0x00C9, 144}, {0x00D1, 165}, {0x00D6, 153}, - {0x00DC, 154}, {0x00DF, 225}, {0x00E0, 133}, {0x00E1, 160}, - {0x00E2, 131}, {0x00E4, 132}, {0x00E5, 134}, {0x00E6, 145}, - {0x00E7, 135}, {0x00E8, 138}, {0x00E9, 130}, {0x00EA, 136}, - {0x00EB, 137}, {0x00EC, 141}, {0x00ED, 161}, {0x00EE, 140}, - {0x00EF, 139}, {0x00F1, 164}, {0x00F2, 149}, {0x00F3, 162}, - {0x00F4, 147}, {0x00F6, 148}, {0x00F7, 246}, {0x00F9, 151}, - {0x00FA, 163}, {0x00FB, 150}, {0x00FC, 129}, {0x00FF, 152}, - {0x0192, 159}, {0x0393, 226}, {0x0398, 233}, {0x03A3, 228}, - {0x03A6, 232}, {0x03A9, 234}, {0x03B1, 224}, {0x03B4, 235}, - {0x03B5, 238}, {0x03C0, 227}, {0x03C3, 229}, {0x03C4, 231}, - {0x03C6, 237}, {0x2022, 7}, {0x203C, 19}, {0x207F, 252}, - {0x20A7, 158}, {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, - {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, {0x21A8, 23}, - {0x2219, 249}, {0x221A, 251}, {0x221E, 236}, {0x221F, 28}, - {0x2229, 239}, {0x2248, 247}, {0x2261, 240}, {0x2264, 243}, - {0x2265, 242}, {0x2310, 169}, {0x2320, 244}, {0x2321, 245}, - {0x2500, 196}, {0x2502, 179}, {0x250C, 218}, {0x2510, 191}, - {0x2514, 192}, {0x2518, 217}, {0x251C, 195}, {0x2524, 180}, - {0x252C, 194}, {0x2534, 193}, {0x253C, 197}, {0x2550, 205}, - {0x2551, 186}, {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, - {0x2555, 184}, {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, - {0x2559, 211}, {0x255A, 200}, {0x255B, 190}, {0x255C, 189}, - {0x255D, 188}, {0x255E, 198}, {0x255F, 199}, {0x2560, 204}, - {0x2561, 181}, {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, - {0x2565, 210}, {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, - {0x2569, 202}, {0x256A, 216}, {0x256B, 215}, {0x256C, 206}, - {0x2580, 223}, {0x2584, 220}, {0x2588, 219}, {0x258C, 221}, - {0x2590, 222}, {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, - {0x25A0, 254}, {0x25AC, 22}, {0x25B2, 30}, {0x25BA, 16}, - {0x25BC, 31}, {0x25C4, 17}, {0x25CB, 9}, {0x25D8, 8}, - {0x25D9, 10}, {0x263A, 1}, {0x263B, 2}, {0x263C, 15}, - {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, - {0x2665, 3}, {0x2666, 4}, {0x266A, 13}, {0x266B, 14}, - {0xfffd, '?'} -}; - -const static uint32_t cp437_ext_table[32] = { - 0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, - 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, - 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, - 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC -}; - -const static uint32_t cp437_unicode_table[128] = { - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, - 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, - 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 -}; - -const static struct ciolib_cpmap cp1251_table[156] = { - {0x00a0, 160}, {0x00a4, 164}, {0x00a6, 166}, {0x00a7, 167}, - {0x00a9, 169}, {0x00ab, 171}, {0x00ac, 172}, {0x00ad, 173}, - {0x00ae, 174}, {0x00b0, 176}, {0x00b1, 177}, {0x00b5, 181}, - {0x00b6, 20}, {0x00b7, 183}, {0x00bb, 187}, {0x0401, 168}, - {0x0402, 128}, {0x0403, 129}, {0x0404, 170}, {0x0405, 189}, - {0x0406, 178}, {0x0407, 175}, {0x0408, 163}, {0x0409, 138}, - {0x040a, 140}, {0x040b, 142}, {0x040c, 141}, {0x040e, 161}, - {0x040f, 143}, {0x0410, 192}, {0x0411, 193}, {0x0412, 194}, - {0x0413, 195}, {0x0414, 196}, {0x0415, 197}, {0x0416, 198}, - {0x0417, 199}, {0x0418, 200}, {0x0419, 201}, {0x041a, 202}, - {0x041b, 203}, {0x041c, 204}, {0x041d, 205}, {0x041e, 206}, - {0x041f, 207}, {0x0420, 208}, {0x0421, 209}, {0x0422, 210}, - {0x0423, 211}, {0x0424, 212}, {0x0425, 213}, {0x0426, 214}, - {0x0427, 215}, {0x0428, 216}, {0x0429, 217}, {0x042a, 218}, - {0x042b, 219}, {0x042c, 220}, {0x042d, 221}, {0x042e, 222}, - {0x042f, 223}, {0x0430, 224}, {0x0431, 225}, {0x0432, 226}, - {0x0433, 227}, {0x0434, 228}, {0x0435, 229}, {0x0436, 230}, - {0x0437, 231}, {0x0438, 232}, {0x0439, 233}, {0x043a, 234}, - {0x043b, 235}, {0x043c, 236}, {0x043d, 237}, {0x043e, 238}, - {0x043f, 239}, {0x0440, 240}, {0x0441, 241}, {0x0442, 242}, - {0x0443, 243}, {0x0444, 244}, {0x0445, 245}, {0x0446, 246}, - {0x0447, 247}, {0x0448, 248}, {0x0449, 249}, {0x044a, 250}, - {0x044b, 251}, {0x044c, 252}, {0x044d, 253}, {0x044e, 254}, - {0x044f, 255}, {0x0451, 184}, {0x0452, 144}, {0x0453, 131}, - {0x0454, 186}, {0x0455, 190}, {0x0456, 179}, {0x0457, 191}, - {0x0458, 188}, {0x0459, 154}, {0x045a, 156}, {0x045b, 158}, - {0x045c, 157}, {0x045e, 162}, {0x045f, 159}, {0x0490, 165}, - {0x0491, 180}, {0x2013, 150}, {0x2014, 151}, {0x2018, 145}, - {0x2019, 146}, {0x201a, 130}, {0x201c, 147}, {0x201d, 148}, - {0x201e, 132}, {0x2020, 134}, {0x2021, 135}, {0x2022, 7}, - {0x2026, 133}, {0x2030, 137}, {0x2039, 139}, {0x203a, 155}, - {0x203c, 19}, {0x20ac, 136}, {0x2116, 185}, {0x2122, 153}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t cp1251_unicode_table[128] = { - 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, - 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, - 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, - 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, - 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, - 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, - 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, - 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f -}; - -const static struct ciolib_cpmap koi8_r_table[160] = { - {0x00a0, 154}, {0x00a7, 21}, {0x00a9, 191}, {0x00b0, 156}, - {0x00b2, 157}, {0x00b6, 20}, {0x00b7, 158}, {0x00f7, 159}, - {0x0401, 179}, {0x0410, 225}, {0x0411, 226}, {0x0412, 247}, - {0x0413, 231}, {0x0414, 228}, {0x0415, 229}, {0x0416, 246}, - {0x0417, 250}, {0x0418, 233}, {0x0419, 234}, {0x041a, 235}, - {0x041b, 236}, {0x041c, 237}, {0x041d, 238}, {0x041e, 239}, - {0x041f, 240}, {0x0420, 242}, {0x0421, 243}, {0x0422, 244}, - {0x0423, 245}, {0x0424, 230}, {0x0425, 232}, {0x0426, 227}, - {0x0427, 254}, {0x0428, 251}, {0x0429, 253}, {0x042a, 255}, - {0x042b, 249}, {0x042c, 248}, {0x042d, 252}, {0x042e, 224}, - {0x042f, 241}, {0x0430, 193}, {0x0431, 194}, {0x0432, 215}, - {0x0433, 199}, {0x0434, 196}, {0x0435, 197}, {0x0436, 214}, - {0x0437, 218}, {0x0438, 201}, {0x0439, 202}, {0x043a, 203}, - {0x043b, 204}, {0x043c, 205}, {0x043d, 206}, {0x043e, 207}, - {0x043f, 208}, {0x0440, 210}, {0x0441, 211}, {0x0442, 212}, - {0x0443, 213}, {0x0444, 198}, {0x0445, 200}, {0x0446, 195}, - {0x0447, 222}, {0x0448, 219}, {0x0449, 221}, {0x044a, 223}, - {0x044b, 217}, {0x044c, 216}, {0x044d, 220}, {0x044e, 192}, - {0x044f, 209}, {0x0451, 163}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 149}, - {0x221a, 150}, {0x221f, 28}, {0x2248, 151}, {0x2264, 152}, - {0x2265, 153}, {0x2320, 147}, {0x2321, 155}, {0x2500, 128}, - {0x2502, 129}, {0x250c, 130}, {0x2510, 131}, {0x2514, 132}, - {0x2518, 133}, {0x251c, 134}, {0x2524, 135}, {0x252c, 136}, - {0x2534, 137}, {0x253c, 138}, {0x2550, 160}, {0x2551, 161}, - {0x2552, 162}, {0x2553, 164}, {0x2554, 165}, {0x2555, 166}, - {0x2556, 167}, {0x2557, 168}, {0x2558, 169}, {0x2559, 170}, - {0x255a, 171}, {0x255b, 172}, {0x255c, 173}, {0x255d, 174}, - {0x255e, 175}, {0x255f, 176}, {0x2560, 177}, {0x2561, 178}, - {0x2562, 180}, {0x2563, 181}, {0x2564, 182}, {0x2565, 183}, - {0x2566, 184}, {0x2567, 185}, {0x2568, 186}, {0x2569, 187}, - {0x256a, 188}, {0x256b, 189}, {0x256c, 190}, {0x2580, 139}, - {0x2584, 140}, {0x2588, 141}, {0x258c, 142}, {0x2590, 143}, - {0x2591, 144}, {0x2592, 145}, {0x2593, 146}, {0x25a0, 148}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t koi8_r_unicode_table[128] = { - 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, - 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, - 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, - 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, - 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, - 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, - 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, - 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a -}; - -const static uint32_t empty_ext_table[32] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd -}; - -const static struct ciolib_cpmap iso8859_2_table[127] = { - {0x00a0, 160}, {0x00a4, 164}, {0x00a7, 167}, {0x00a8, 168}, - {0x00ad, 173}, {0x00b0, 176}, {0x00b4, 180}, {0x00b6, 20}, - {0x00b8, 184}, {0x00c1, 193}, {0x00c2, 194}, {0x00c4, 196}, - {0x00c7, 199}, {0x00c9, 201}, {0x00cb, 203}, {0x00cd, 205}, - {0x00ce, 206}, {0x00d3, 211}, {0x00d4, 212}, {0x00d6, 214}, - {0x00d7, 215}, {0x00da, 218}, {0x00dc, 220}, {0x00dd, 221}, - {0x00df, 223}, {0x00e1, 225}, {0x00e2, 226}, {0x00e4, 228}, - {0x00e7, 231}, {0x00e9, 233}, {0x00eb, 235}, {0x00ed, 237}, - {0x00ee, 238}, {0x00f3, 243}, {0x00f4, 244}, {0x00f6, 246}, - {0x00f7, 247}, {0x00fa, 250}, {0x00fc, 252}, {0x00fd, 253}, - {0x0102, 195}, {0x0103, 227}, {0x0104, 161}, {0x0105, 177}, - {0x0106, 198}, {0x0107, 230}, {0x010c, 200}, {0x010d, 232}, - {0x010e, 207}, {0x010f, 239}, {0x0110, 208}, {0x0111, 240}, - {0x0118, 202}, {0x0119, 234}, {0x011a, 204}, {0x011b, 236}, - {0x0139, 197}, {0x013a, 229}, {0x013d, 165}, {0x013e, 181}, - {0x0141, 163}, {0x0142, 179}, {0x0143, 209}, {0x0144, 241}, - {0x0147, 210}, {0x0148, 242}, {0x0150, 213}, {0x0151, 245}, - {0x0154, 192}, {0x0155, 224}, {0x0158, 216}, {0x0159, 248}, - {0x015a, 166}, {0x015b, 182}, {0x015e, 170}, {0x015f, 186}, - {0x0160, 169}, {0x0161, 185}, {0x0162, 222}, {0x0163, 254}, - {0x0164, 171}, {0x0165, 187}, {0x016e, 217}, {0x016f, 249}, - {0x0170, 219}, {0x0171, 251}, {0x0179, 172}, {0x017a, 188}, - {0x017b, 175}, {0x017c, 191}, {0x017d, 174}, {0x017e, 190}, - {0x02c7, 183}, {0x02d8, 162}, {0x02d9, 255}, {0x02db, 178}, - {0x02dd, 189}, {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, - {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, - {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, - {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, - {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, - {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, - {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, - {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_2_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, - 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, - 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, - 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, - 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, - 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, - 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, - 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, - 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, - 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 -}; - -const static struct ciolib_cpmap iso8859_4_table[127] = { - {0x00a0, 160}, {0x00a4, 164}, {0x00a7, 167}, {0x00a8, 168}, - {0x00ad, 173}, {0x00af, 175}, {0x00b0, 176}, {0x00b4, 180}, - {0x00b6, 20}, {0x00b8, 184}, {0x00c1, 193}, {0x00c2, 194}, - {0x00c3, 195}, {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, - {0x00c9, 201}, {0x00cb, 203}, {0x00cd, 205}, {0x00ce, 206}, - {0x00d4, 212}, {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, - {0x00d8, 216}, {0x00da, 218}, {0x00db, 219}, {0x00dc, 220}, - {0x00df, 223}, {0x00e1, 225}, {0x00e2, 226}, {0x00e3, 227}, - {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, {0x00e9, 233}, - {0x00eb, 235}, {0x00ed, 237}, {0x00ee, 238}, {0x00f4, 244}, - {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, {0x00f8, 248}, - {0x00fa, 250}, {0x00fb, 251}, {0x00fc, 252}, {0x0100, 192}, - {0x0101, 224}, {0x0104, 161}, {0x0105, 177}, {0x010c, 200}, - {0x010d, 232}, {0x0110, 208}, {0x0111, 240}, {0x0112, 170}, - {0x0113, 186}, {0x0116, 204}, {0x0117, 236}, {0x0118, 202}, - {0x0119, 234}, {0x0122, 171}, {0x0123, 187}, {0x0128, 165}, - {0x0129, 181}, {0x012a, 207}, {0x012b, 239}, {0x012e, 199}, - {0x012f, 231}, {0x0136, 211}, {0x0137, 243}, {0x0138, 162}, - {0x013b, 166}, {0x013c, 182}, {0x0145, 209}, {0x0146, 241}, - {0x014a, 189}, {0x014b, 191}, {0x014c, 210}, {0x014d, 242}, - {0x0156, 163}, {0x0157, 179}, {0x0160, 169}, {0x0161, 185}, - {0x0166, 172}, {0x0167, 188}, {0x0168, 221}, {0x0169, 253}, - {0x016a, 222}, {0x016b, 254}, {0x0172, 217}, {0x0173, 249}, - {0x017d, 174}, {0x017e, 190}, {0x02c7, 183}, {0x02d9, 255}, - {0x02db, 178}, {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, - {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, - {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, - {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, - {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, - {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, - {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, - {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_4_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, - 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, - 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, - 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, - 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, - 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, - 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, - 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, - 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, - 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9 -}; - -#if 0 -const static struct ciolib_cpmap cp866_table[160] = { - {0x00a0, 255}, {0x00a4, 253}, {0x00a7, 21}, {0x00b0, 248}, - {0x00b6, 20}, {0x00b7, 250}, {0x0401, 240}, {0x0404, 242}, - {0x0407, 244}, {0x040e, 246}, {0x0410, 128}, {0x0411, 129}, - {0x0412, 130}, {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, - {0x0416, 134}, {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, - {0x041a, 138}, {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, - {0x041e, 142}, {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, - {0x0422, 146}, {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, - {0x0426, 150}, {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, - {0x042a, 154}, {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, - {0x042e, 158}, {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, - {0x0432, 162}, {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, - {0x0436, 166}, {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, - {0x043a, 170}, {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, - {0x043e, 174}, {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, - {0x0442, 226}, {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, - {0x0446, 230}, {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, - {0x044a, 234}, {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, - {0x044e, 238}, {0x044f, 239}, {0x0451, 241}, {0x0454, 243}, - {0x0457, 245}, {0x045e, 247}, {0x2022, 7}, {0x203c, 19}, - {0x2116, 252}, {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, - {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, - {0x2219, 249}, {0x221a, 251}, {0x221f, 28}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0 -}; -#endif - -const static struct ciolib_cpmap cp866m_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00b0, 248}, {0x00B2, 253}, - {0x00b6, 20}, {0x00b7, 250}, {0x00F7, 246}, {0x0401, 240}, - {0x0410, 128}, {0x0411, 129}, {0x0412, 130}, {0x0413, 131}, - {0x0414, 132}, {0x0415, 133}, {0x0416, 134}, {0x0417, 135}, - {0x0418, 136}, {0x0419, 137}, {0x041a, 138}, {0x041b, 139}, - {0x041c, 140}, {0x041d, 141}, {0x041e, 142}, {0x041f, 143}, - {0x0420, 144}, {0x0421, 145}, {0x0422, 146}, {0x0423, 147}, - {0x0424, 148}, {0x0425, 149}, {0x0426, 150}, {0x0427, 151}, - {0x0428, 152}, {0x0429, 153}, {0x042a, 154}, {0x042b, 155}, - {0x042c, 156}, {0x042d, 157}, {0x042e, 158}, {0x042f, 159}, - {0x0430, 160}, {0x0431, 161}, {0x0432, 162}, {0x0433, 163}, - {0x0434, 164}, {0x0435, 165}, {0x0436, 166}, {0x0437, 167}, - {0x0438, 168}, {0x0439, 169}, {0x043a, 170}, {0x043b, 171}, - {0x043c, 172}, {0x043d, 173}, {0x043e, 174}, {0x043f, 175}, - {0x0440, 224}, {0x0441, 225}, {0x0442, 226}, {0x0443, 227}, - {0x0444, 228}, {0x0445, 229}, {0x0446, 230}, {0x0447, 231}, - {0x0448, 232}, {0x0449, 233}, {0x044a, 234}, {0x044b, 235}, - {0x044c, 236}, {0x044d, 237}, {0x044e, 238}, {0x044f, 239}, - {0x0451, 241}, {0x045F, 252}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 249}, - {0x221a, 251}, {0x221f, 28}, {0x2264, 243}, {0x2265, 242}, - {0x2320, 244}, {0x2321, 245}, {0x2248, 247}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866m_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x045F, 0x00B2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap iso8859_9_table[126] = { - {0x00a0, 160}, {0x00a1, 161}, {0x00a2, 162}, {0x00a3, 163}, - {0x00a4, 164}, {0x00a5, 165}, {0x00a6, 166}, {0x00a7, 167}, - {0x00a8, 168}, {0x00a9, 169}, {0x00aa, 170}, {0x00ab, 171}, - {0x00ac, 172}, {0x00ad, 173}, {0x00ae, 174}, {0x00af, 175}, - {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, {0x00b3, 179}, - {0x00b4, 180}, {0x00b5, 181}, {0x00b6, 182}, {0x00b7, 183}, - {0x00b8, 184}, {0x00b9, 185}, {0x00ba, 186}, {0x00bb, 187}, - {0x00bc, 188}, {0x00bd, 189}, {0x00be, 190}, {0x00bf, 191}, - {0x00c0, 192}, {0x00c1, 193}, {0x00c2, 194}, {0x00c3, 195}, - {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, {0x00c7, 199}, - {0x00c8, 200}, {0x00c9, 201}, {0x00ca, 202}, {0x00cb, 203}, - {0x00cc, 204}, {0x00cd, 205}, {0x00ce, 206}, {0x00cf, 207}, - {0x00d1, 209}, {0x00d2, 210}, {0x00d3, 211}, {0x00d4, 212}, - {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, {0x00d8, 216}, - {0x00d9, 217}, {0x00da, 218}, {0x00db, 219}, {0x00dc, 220}, - {0x00df, 223}, {0x00e0, 224}, {0x00e1, 225}, {0x00e2, 226}, - {0x00e3, 227}, {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, - {0x00e7, 231}, {0x00e8, 232}, {0x00e9, 233}, {0x00ea, 234}, - {0x00eb, 235}, {0x00ec, 236}, {0x00ed, 237}, {0x00ee, 238}, - {0x00ef, 239}, {0x00f1, 241}, {0x00f2, 242}, {0x00f3, 243}, - {0x00f4, 244}, {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, - {0x00f8, 248}, {0x00f9, 249}, {0x00fa, 250}, {0x00fb, 251}, - {0x00fc, 252}, {0x00ff, 255}, {0x011e, 208}, {0x011f, 240}, - {0x0130, 221}, {0x0131, 253}, {0x015e, 222}, {0x015f, 254}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_9_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff -}; - -const static struct ciolib_cpmap iso8859_8_table[90] = { - {0x00a0, 160}, {0x00a2, 162}, {0x00a3, 163}, {0x00a4, 164}, - {0x00a5, 165}, {0x00a6, 166}, {0x00a7, 167}, {0x00a8, 168}, - {0x00a9, 169}, {0x00ab, 171}, {0x00ac, 172}, {0x00ad, 173}, - {0x00ae, 174}, {0x00af, 175}, {0x00b0, 176}, {0x00b1, 177}, - {0x00b2, 178}, {0x00b3, 179}, {0x00b4, 180}, {0x00b5, 181}, - {0x00b6, 182}, {0x00b7, 183}, {0x00b8, 184}, {0x00b9, 185}, - {0x00bb, 187}, {0x00bc, 188}, {0x00bd, 189}, {0x00be, 190}, - {0x00d7, 170}, {0x00f7, 186}, {0x05d0, 224}, {0x05d1, 225}, - {0x05d2, 226}, {0x05d3, 227}, {0x05d4, 228}, {0x05d5, 229}, - {0x05d6, 230}, {0x05d7, 231}, {0x05d8, 232}, {0x05d9, 233}, - {0x05da, 234}, {0x05db, 235}, {0x05dc, 236}, {0x05dd, 237}, - {0x05de, 238}, {0x05df, 239}, {0x05e0, 240}, {0x05e1, 241}, - {0x05e2, 242}, {0x05e3, 243}, {0x05e4, 244}, {0x05e5, 245}, - {0x05e6, 246}, {0x05e7, 247}, {0x05e8, 248}, {0x05e9, 249}, - {0x05ea, 250}, {0x200e, 253}, {0x200f, 254}, {0x2017, 223}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_8_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, - 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, - 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, - 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, - 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd -}; - -const static struct ciolib_cpmap koi8_u_table[160] = { - {0x00a0, 154}, {0x00a7, 21}, {0x00a9, 191}, {0x00b0, 156}, - {0x00b2, 157}, {0x00b6, 20}, {0x00b7, 158}, {0x00f7, 159}, - {0x0401, 179}, {0x0404, 180}, {0x0406, 182}, {0x0407, 183}, - {0x0410, 225}, {0x0411, 226}, {0x0412, 247}, {0x0413, 231}, - {0x0414, 228}, {0x0415, 229}, {0x0416, 246}, {0x0417, 250}, - {0x0418, 233}, {0x0419, 234}, {0x041a, 235}, {0x041b, 236}, - {0x041c, 237}, {0x041d, 238}, {0x041e, 239}, {0x041f, 240}, - {0x0420, 242}, {0x0421, 243}, {0x0422, 244}, {0x0423, 245}, - {0x0424, 230}, {0x0425, 232}, {0x0426, 227}, {0x0427, 254}, - {0x0428, 251}, {0x0429, 253}, {0x042a, 255}, {0x042b, 249}, - {0x042c, 248}, {0x042d, 252}, {0x042e, 224}, {0x042f, 241}, - {0x0430, 193}, {0x0431, 194}, {0x0432, 215}, {0x0433, 199}, - {0x0434, 196}, {0x0435, 197}, {0x0436, 214}, {0x0437, 218}, - {0x0438, 201}, {0x0439, 202}, {0x043a, 203}, {0x043b, 204}, - {0x043c, 205}, {0x043d, 206}, {0x043e, 207}, {0x043f, 208}, - {0x0440, 210}, {0x0441, 211}, {0x0442, 212}, {0x0443, 213}, - {0x0444, 198}, {0x0445, 200}, {0x0446, 195}, {0x0447, 222}, - {0x0448, 219}, {0x0449, 221}, {0x044a, 223}, {0x044b, 217}, - {0x044c, 216}, {0x044d, 220}, {0x044e, 192}, {0x044f, 209}, - {0x0451, 163}, {0x0454, 164}, {0x0456, 166}, {0x0457, 167}, - {0x0490, 189}, {0x0491, 173}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 149}, - {0x221a, 150}, {0x221f, 28}, {0x2248, 151}, {0x2264, 152}, - {0x2265, 153}, {0x2320, 147}, {0x2321, 155}, {0x2500, 128}, - {0x2502, 129}, {0x250c, 130}, {0x2510, 131}, {0x2514, 132}, - {0x2518, 133}, {0x251c, 134}, {0x2524, 135}, {0x252c, 136}, - {0x2534, 137}, {0x253c, 138}, {0x2550, 160}, {0x2551, 161}, - {0x2552, 162}, {0x2554, 165}, {0x2557, 168}, {0x2558, 169}, - {0x2559, 170}, {0x255a, 171}, {0x255b, 172}, {0x255d, 174}, - {0x255e, 175}, {0x255f, 176}, {0x2560, 177}, {0x2561, 178}, - {0x2563, 181}, {0x2566, 184}, {0x2567, 185}, {0x2568, 186}, - {0x2569, 187}, {0x256a, 188}, {0x256c, 190}, {0x2580, 139}, - {0x2584, 140}, {0x2588, 141}, {0x258c, 142}, {0x2590, 143}, - {0x2591, 144}, {0x2592, 145}, {0x2593, 146}, {0x25a0, 148}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t koi8_u_unicode_table[128] = { - 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, - 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, - 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, - 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, - 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, - 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, - 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, - 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a -}; - -const static struct ciolib_cpmap iso8859_15_table[126] = { - {0x00a0, 160}, {0x00a1, 161}, {0x00a2, 162}, {0x00a3, 163}, - {0x00a5, 165}, {0x00a7, 167}, {0x00a9, 169}, {0x00aa, 170}, - {0x00ab, 171}, {0x00ac, 172}, {0x00ad, 173}, {0x00ae, 174}, - {0x00af, 175}, {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, - {0x00b3, 179}, {0x00b5, 181}, {0x00b6, 20}, {0x00b7, 183}, - {0x00b9, 185}, {0x00ba, 186}, {0x00bb, 187}, {0x00bf, 191}, - {0x00c0, 192}, {0x00c1, 193}, {0x00c2, 194}, {0x00c3, 195}, - {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, {0x00c7, 199}, - {0x00c8, 200}, {0x00c9, 201}, {0x00ca, 202}, {0x00cb, 203}, - {0x00cc, 204}, {0x00cd, 205}, {0x00ce, 206}, {0x00cf, 207}, - {0x00d0, 208}, {0x00d1, 209}, {0x00d2, 210}, {0x00d3, 211}, - {0x00d4, 212}, {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, - {0x00d8, 216}, {0x00d9, 217}, {0x00da, 218}, {0x00db, 219}, - {0x00dc, 220}, {0x00dd, 221}, {0x00de, 222}, {0x00df, 223}, - {0x00e0, 224}, {0x00e1, 225}, {0x00e2, 226}, {0x00e3, 227}, - {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, {0x00e7, 231}, - {0x00e8, 232}, {0x00e9, 233}, {0x00ea, 234}, {0x00eb, 235}, - {0x00ec, 236}, {0x00ed, 237}, {0x00ee, 238}, {0x00ef, 239}, - {0x00f0, 240}, {0x00f1, 241}, {0x00f2, 242}, {0x00f3, 243}, - {0x00f4, 244}, {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, - {0x00f8, 248}, {0x00f9, 249}, {0x00fa, 250}, {0x00fb, 251}, - {0x00fc, 252}, {0x00fd, 253}, {0x00fe, 254}, {0x00ff, 255}, - {0x0152, 188}, {0x0153, 189}, {0x0160, 166}, {0x0161, 168}, - {0x0178, 190}, {0x017d, 180}, {0x017e, 184}, {0x2022, 7}, - {0x203c, 19}, {0x20ac, 164}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_15_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, - 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, - 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff -}; - -const static struct ciolib_cpmap iso8859_5_table[127] = { - {0x00a0, 160}, {0x00a7, 21}, {0x00ad, 173}, {0x00b6, 20}, - {0x0401, 161}, {0x0402, 162}, {0x0403, 163}, {0x0404, 164}, - {0x0405, 165}, {0x0406, 166}, {0x0407, 167}, {0x0408, 168}, - {0x0409, 169}, {0x040a, 170}, {0x040b, 171}, {0x040c, 172}, - {0x040e, 174}, {0x040f, 175}, {0x0410, 176}, {0x0411, 177}, - {0x0412, 178}, {0x0413, 179}, {0x0414, 180}, {0x0415, 181}, - {0x0416, 182}, {0x0417, 183}, {0x0418, 184}, {0x0419, 185}, - {0x041a, 186}, {0x041b, 187}, {0x041c, 188}, {0x041d, 189}, - {0x041e, 190}, {0x041f, 191}, {0x0420, 192}, {0x0421, 193}, - {0x0422, 194}, {0x0423, 195}, {0x0424, 196}, {0x0425, 197}, - {0x0426, 198}, {0x0427, 199}, {0x0428, 200}, {0x0429, 201}, - {0x042a, 202}, {0x042b, 203}, {0x042c, 204}, {0x042d, 205}, - {0x042e, 206}, {0x042f, 207}, {0x0430, 208}, {0x0431, 209}, - {0x0432, 210}, {0x0433, 211}, {0x0434, 212}, {0x0435, 213}, - {0x0436, 214}, {0x0437, 215}, {0x0438, 216}, {0x0439, 217}, - {0x043a, 218}, {0x043b, 219}, {0x043c, 220}, {0x043d, 221}, - {0x043e, 222}, {0x043f, 223}, {0x0440, 224}, {0x0441, 225}, - {0x0442, 226}, {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, - {0x0446, 230}, {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, - {0x044a, 234}, {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, - {0x044e, 238}, {0x044f, 239}, {0x0451, 241}, {0x0452, 242}, - {0x0453, 243}, {0x0454, 244}, {0x0455, 245}, {0x0456, 246}, - {0x0457, 247}, {0x0458, 248}, {0x0459, 249}, {0x045a, 250}, - {0x045b, 251}, {0x045c, 252}, {0x045e, 254}, {0x045f, 255}, - {0x2022, 7}, {0x203c, 19}, {0x2116, 240}, {0x2190, 27}, - {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, - {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, - {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, - {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, - {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, - {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, - {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_5_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f -}; - -const static struct ciolib_cpmap cp850_table[158] = { - {0x00a0, 255}, {0x00a1, 173}, {0x00a2, 189}, {0x00a3, 156}, - {0x00a4, 207}, {0x00a5, 190}, {0x00a6, 221}, {0x00a7, 21}, - {0x00a8, 249}, {0x00a9, 184}, {0x00aa, 166}, {0x00ab, 174}, - {0x00ac, 170}, {0x00ad, 240}, {0x00ae, 169}, {0x00af, 238}, - {0x00b0, 248}, {0x00b1, 241}, {0x00b2, 253}, {0x00b3, 252}, - {0x00b4, 239}, {0x00b5, 230}, {0x00b6, 20}, {0x00b7, 250}, - {0x00b8, 247}, {0x00b9, 251}, {0x00ba, 167}, {0x00bb, 175}, - {0x00bc, 172}, {0x00bd, 171}, {0x00be, 243}, {0x00bf, 168}, - {0x00c0, 183}, {0x00c1, 181}, {0x00c2, 182}, {0x00c3, 199}, - {0x00c4, 142}, {0x00c5, 143}, {0x00c6, 146}, {0x00c7, 128}, - {0x00c8, 212}, {0x00c9, 144}, {0x00ca, 210}, {0x00cb, 211}, - {0x00cc, 222}, {0x00cd, 214}, {0x00ce, 215}, {0x00cf, 216}, - {0x00d0, 209}, {0x00d1, 165}, {0x00d2, 227}, {0x00d3, 224}, - {0x00d4, 226}, {0x00d5, 229}, {0x00d6, 153}, {0x00d7, 158}, - {0x00d8, 157}, {0x00d9, 235}, {0x00da, 233}, {0x00db, 234}, - {0x00dc, 154}, {0x00dd, 237}, {0x00de, 232}, {0x00df, 225}, - {0x00e0, 133}, {0x00e1, 160}, {0x00e2, 131}, {0x00e3, 198}, - {0x00e4, 132}, {0x00e5, 134}, {0x00e6, 145}, {0x00e7, 135}, - {0x00e8, 138}, {0x00e9, 130}, {0x00ea, 136}, {0x00eb, 137}, - {0x00ec, 141}, {0x00ed, 161}, {0x00ee, 140}, {0x00ef, 139}, - {0x00f0, 208}, {0x00f1, 164}, {0x00f2, 149}, {0x00f3, 162}, - {0x00f4, 147}, {0x00f5, 228}, {0x00f6, 148}, {0x00f7, 246}, - {0x00f8, 155}, {0x00f9, 151}, {0x00fa, 163}, {0x00fb, 150}, - {0x00fc, 129}, {0x00fd, 236}, {0x00fe, 231}, {0x00ff, 152}, - {0x0131, 213}, {0x0192, 159}, {0x2017, 242}, {0x2022, 7}, - {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, - {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, - {0x221f, 28}, {0x2500, 196}, {0x2502, 179}, {0x250c, 218}, - {0x2510, 191}, {0x2514, 192}, {0x2518, 217}, {0x251c, 195}, - {0x2524, 180}, {0x252c, 194}, {0x2534, 193}, {0x253c, 197}, - {0x2550, 205}, {0x2551, 186}, {0x2554, 201}, {0x2557, 187}, - {0x255a, 200}, {0x255d, 188}, {0x2560, 204}, {0x2563, 185}, - {0x2566, 203}, {0x2569, 202}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x2591, 176}, {0x2592, 177}, - {0x2593, 178}, {0x25a0, 254}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t cp850_unicode_table[128] = { - 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, - 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, - 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, - 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, - 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, - 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, - 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, - 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, - 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, - 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, - 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, - 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, - 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap cp865_table[160] = { - {0x00a0, 255}, {0x00a1, 173}, {0x00a3, 156}, {0x00a4, 175}, - {0x00a7, 21}, {0x00aa, 166}, {0x00ab, 174}, {0x00ac, 170}, - {0x00b0, 248}, {0x00b1, 241}, {0x00b2, 253}, {0x00b5, 230}, - {0x00b6, 20}, {0x00b7, 250}, {0x00ba, 167}, {0x00bc, 172}, - {0x00bd, 171}, {0x00bf, 168}, {0x00c4, 142}, {0x00c5, 143}, - {0x00c6, 146}, {0x00c7, 128}, {0x00c9, 144}, {0x00d1, 165}, - {0x00d6, 153}, {0x00d8, 157}, {0x00dc, 154}, {0x00df, 225}, - {0x00e0, 133}, {0x00e1, 160}, {0x00e2, 131}, {0x00e4, 132}, - {0x00e5, 134}, {0x00e6, 145}, {0x00e7, 135}, {0x00e8, 138}, - {0x00e9, 130}, {0x00ea, 136}, {0x00eb, 137}, {0x00ec, 141}, - {0x00ed, 161}, {0x00ee, 140}, {0x00ef, 139}, {0x00f1, 164}, - {0x00f2, 149}, {0x00f3, 162}, {0x00f4, 147}, {0x00f6, 148}, - {0x00f7, 246}, {0x00f8, 155}, {0x00f9, 151}, {0x00fa, 163}, - {0x00fb, 150}, {0x00fc, 129}, {0x00ff, 152}, {0x0192, 159}, - {0x0393, 226}, {0x0398, 233}, {0x03a3, 228}, {0x03a6, 232}, - {0x03a9, 234}, {0x03b1, 224}, {0x03b4, 235}, {0x03b5, 238}, - {0x03c0, 227}, {0x03c3, 229}, {0x03c4, 231}, {0x03c6, 237}, - {0x2022, 7}, {0x203c, 19}, {0x207f, 252}, {0x20a7, 158}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 249}, - {0x221a, 251}, {0x221e, 236}, {0x221f, 28}, {0x2229, 239}, - {0x2248, 247}, {0x2261, 240}, {0x2264, 243}, {0x2265, 242}, - {0x2310, 169}, {0x2320, 244}, {0x2321, 245}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp865_unicode_table[128] = { - 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, - 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, - 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, - 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, - 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, - 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00a4, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, - 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, - 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 - -}; - -const static struct ciolib_cpmap iso8859_7_table[124] = { - {0x00a0, 160}, {0x00a3, 163}, {0x00a6, 166}, {0x00a7, 21}, - {0x00a8, 168}, {0x00a9, 169}, {0x00ab, 171}, {0x00ac, 172}, - {0x00ad, 173}, {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, - {0x00b3, 179}, {0x00b6, 20}, {0x00b7, 183}, {0x00bb, 187}, - {0x00bd, 189}, {0x037a, 170}, {0x0384, 180}, {0x0385, 181}, - {0x0386, 182}, {0x0388, 184}, {0x0389, 185}, {0x038a, 186}, - {0x038c, 188}, {0x038e, 190}, {0x038f, 191}, {0x0390, 192}, - {0x0391, 193}, {0x0392, 194}, {0x0393, 195}, {0x0394, 196}, - {0x0395, 197}, {0x0396, 198}, {0x0397, 199}, {0x0398, 200}, - {0x0399, 201}, {0x039a, 202}, {0x039b, 203}, {0x039c, 204}, - {0x039d, 205}, {0x039e, 206}, {0x039f, 207}, {0x03a0, 208}, - {0x03a1, 209}, {0x03a3, 211}, {0x03a4, 212}, {0x03a5, 213}, - {0x03a6, 214}, {0x03a7, 215}, {0x03a8, 216}, {0x03a9, 217}, - {0x03aa, 218}, {0x03ab, 219}, {0x03ac, 220}, {0x03ad, 221}, - {0x03ae, 222}, {0x03af, 223}, {0x03b0, 224}, {0x03b1, 225}, - {0x03b2, 226}, {0x03b3, 227}, {0x03b4, 228}, {0x03b5, 229}, - {0x03b6, 230}, {0x03b7, 231}, {0x03b8, 232}, {0x03b9, 233}, - {0x03ba, 234}, {0x03bb, 235}, {0x03bc, 236}, {0x03bd, 237}, - {0x03be, 238}, {0x03bf, 239}, {0x03c0, 240}, {0x03c1, 241}, - {0x03c2, 242}, {0x03c3, 243}, {0x03c4, 244}, {0x03c5, 245}, - {0x03c6, 246}, {0x03c7, 247}, {0x03c8, 248}, {0x03c9, 249}, - {0x03ca, 250}, {0x03cb, 251}, {0x03cc, 252}, {0x03cd, 253}, - {0x03ce, 254}, {0x2015, 175}, {0x2018, 161}, {0x2019, 162}, - {0x2022, 7}, {0x203c, 19}, {0x20ac, 164}, {0x20af, 165}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x221f, 28}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_7_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, - 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, - 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, - 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd -}; - -const static struct ciolib_cpmap iso8859_1_table[126] = { - {0x00a0, 160}, {0x00a1, 161}, {0x00a2, 162}, {0x00a3, 163}, - {0x00a4, 164}, {0x00a5, 165}, {0x00a6, 166}, {0x00a7, 167}, - {0x00a8, 168}, {0x00a9, 169}, {0x00aa, 170}, {0x00ab, 171}, - {0x00ac, 172}, {0x00ad, 173}, {0x00ae, 174}, {0x00af, 175}, - {0x00b0, 176}, {0x00b1, 177}, {0x00b2, 178}, {0x00b3, 179}, - {0x00b4, 180}, {0x00b5, 181}, {0x00b6, 182}, {0x00b7, 183}, - {0x00b8, 184}, {0x00b9, 185}, {0x00ba, 186}, {0x00bb, 187}, - {0x00bc, 188}, {0x00bd, 189}, {0x00be, 190}, {0x00bf, 191}, - {0x00c0, 192}, {0x00c1, 193}, {0x00c2, 194}, {0x00c3, 195}, - {0x00c4, 196}, {0x00c5, 197}, {0x00c6, 198}, {0x00c7, 199}, - {0x00c8, 200}, {0x00c9, 201}, {0x00ca, 202}, {0x00cb, 203}, - {0x00cc, 204}, {0x00cd, 205}, {0x00ce, 206}, {0x00cf, 207}, - {0x00d0, 208}, {0x00d1, 209}, {0x00d2, 210}, {0x00d3, 211}, - {0x00d4, 212}, {0x00d5, 213}, {0x00d6, 214}, {0x00d7, 215}, - {0x00d8, 216}, {0x00d9, 217}, {0x00da, 218}, {0x00db, 219}, - {0x00dc, 220}, {0x00dd, 221}, {0x00de, 222}, {0x00df, 223}, - {0x00e0, 224}, {0x00e1, 225}, {0x00e2, 226}, {0x00e3, 227}, - {0x00e4, 228}, {0x00e5, 229}, {0x00e6, 230}, {0x00e7, 231}, - {0x00e8, 232}, {0x00e9, 233}, {0x00ea, 234}, {0x00eb, 235}, - {0x00ec, 236}, {0x00ed, 237}, {0x00ee, 238}, {0x00ef, 239}, - {0x00f0, 240}, {0x00f1, 241}, {0x00f2, 242}, {0x00f3, 243}, - {0x00f4, 244}, {0x00f5, 245}, {0x00f6, 246}, {0x00f7, 247}, - {0x00f8, 248}, {0x00f9, 249}, {0x00fa, 250}, {0x00fb, 251}, - {0x00fc, 252}, {0x00fd, 253}, {0x00fe, 254}, {0x00ff, 255}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t iso8859_1_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff -}; - -const static struct ciolib_cpmap cp866m2_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00A9, 252}, {0x00b0, 248}, - {0x00B2, 253}, {0x00b6, 20}, {0x00b7, 250}, {0x00F7, 246}, - {0x0401, 240}, {0x0410, 128}, {0x0411, 129}, {0x0412, 130}, - {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, {0x0416, 134}, - {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, {0x041a, 138}, - {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, {0x041e, 142}, - {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, {0x0422, 146}, - {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, {0x0426, 150}, - {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, {0x042a, 154}, - {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, {0x042e, 158}, - {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, {0x0432, 162}, - {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, {0x0436, 166}, - {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, {0x043a, 170}, - {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, {0x043e, 174}, - {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, {0x0442, 226}, - {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, {0x0446, 230}, - {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, {0x044a, 234}, - {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, {0x044e, 238}, - {0x044f, 239}, {0x0451, 241}, {0x2022, 7}, {0x203c, 19}, - {0x2190, 27}, {0x2191, 24}, {0x2192, 26}, {0x2193, 25}, - {0x2194, 29}, {0x2195, 18}, {0x21a8, 23}, {0x2219, 249}, - {0x221a, 251}, {0x221f, 28}, {0x2264, 243}, {0x2265, 242}, - {0x2320, 244}, {0x2321, 245}, {0x2248, 247}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866m2_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00b0, 0x2219, 0x00b7, 0x221a, 0x00A9, 0x00B2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap cp866u_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00A9, 252}, {0x00B2, 253}, - {0x00b6, 20}, {0x00b7, 250}, {0x0401, 240}, {0x0404, 244}, - {0x0406, 246}, {0x0407, 248}, {0x0410, 128}, {0x0411, 129}, - {0x0412, 130}, {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, - {0x0416, 134}, {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, - {0x041a, 138}, {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, - {0x041e, 142}, {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, - {0x0422, 146}, {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, - {0x0426, 150}, {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, - {0x042a, 154}, {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, - {0x042e, 158}, {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, - {0x0432, 162}, {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, - {0x0436, 166}, {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, - {0x043a, 170}, {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, - {0x043e, 174}, {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, - {0x0442, 226}, {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, - {0x0446, 230}, {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, - {0x044a, 234}, {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, - {0x044e, 238}, {0x044f, 239}, {0x0451, 241}, {0x0454, 245}, - {0x0456, 247}, {0x0457, 249}, {0x0490, 242}, {0x0491, 243}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221a, 251}, {0x221f, 28}, {0x2500, 196}, - {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, {0x2514, 192}, - {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, {0x252c, 194}, - {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, {0x2551, 186}, - {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, {0x2555, 184}, - {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, {0x2559, 211}, - {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, {0x255d, 188}, - {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, {0x2561, 181}, - {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, {0x2565, 210}, - {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, {0x2569, 202}, - {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, {0x2580, 223}, - {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, {0x2590, 222}, - {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, {0x25a0, 254}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp866u_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0490, 0x0491, 0x0404, 0x0454, 0x0406, 0x0456, - 0x0407, 0x0457, 0x00b7, 0x221a, 0x00A9, 0x00B2, 0x25a0, 0x00a0 -}; - -const static struct ciolib_cpmap cp1131_table[160] = { - {0x00a0, 255}, {0x00a7, 21}, {0x00b6, 20}, {0x00b7, 250}, - {0x0401, 240}, {0x0404, 242}, {0x0406, 248}, {0x0407, 244}, - {0x040e, 246}, {0x0410, 128}, {0x0411, 129}, {0x0412, 130}, - {0x0413, 131}, {0x0414, 132}, {0x0415, 133}, {0x0416, 134}, - {0x0417, 135}, {0x0418, 136}, {0x0419, 137}, {0x041a, 138}, - {0x041b, 139}, {0x041c, 140}, {0x041d, 141}, {0x041e, 142}, - {0x041f, 143}, {0x0420, 144}, {0x0421, 145}, {0x0422, 146}, - {0x0423, 147}, {0x0424, 148}, {0x0425, 149}, {0x0426, 150}, - {0x0427, 151}, {0x0428, 152}, {0x0429, 153}, {0x042a, 154}, - {0x042b, 155}, {0x042c, 156}, {0x042d, 157}, {0x042e, 158}, - {0x042f, 159}, {0x0430, 160}, {0x0431, 161}, {0x0432, 162}, - {0x0433, 163}, {0x0434, 164}, {0x0435, 165}, {0x0436, 166}, - {0x0437, 167}, {0x0438, 168}, {0x0439, 169}, {0x043a, 170}, - {0x043b, 171}, {0x043c, 172}, {0x043d, 173}, {0x043e, 174}, - {0x043f, 175}, {0x0440, 224}, {0x0441, 225}, {0x0442, 226}, - {0x0443, 227}, {0x0444, 228}, {0x0445, 229}, {0x0446, 230}, - {0x0447, 231}, {0x0448, 232}, {0x0449, 233}, {0x044a, 234}, - {0x044b, 235}, {0x044c, 236}, {0x044d, 237}, {0x044e, 238}, - {0x044f, 239}, {0x0451, 241}, {0x0454, 243}, {0x0456, 249}, - {0x0457, 245}, {0x045e, 247}, {0x0490, 252}, {0x0491, 253}, - {0x2022, 7}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x2219, 254}, {0x221a, 251}, {0x221f, 28}, - {0x2500, 196}, {0x2502, 179}, {0x250c, 218}, {0x2510, 191}, - {0x2514, 192}, {0x2518, 217}, {0x251c, 195}, {0x2524, 180}, - {0x252c, 194}, {0x2534, 193}, {0x253c, 197}, {0x2550, 205}, - {0x2551, 186}, {0x2552, 213}, {0x2553, 214}, {0x2554, 201}, - {0x2555, 184}, {0x2556, 183}, {0x2557, 187}, {0x2558, 212}, - {0x2559, 211}, {0x255a, 200}, {0x255b, 190}, {0x255c, 189}, - {0x255d, 188}, {0x255e, 198}, {0x255f, 199}, {0x2560, 204}, - {0x2561, 181}, {0x2562, 182}, {0x2563, 185}, {0x2564, 209}, - {0x2565, 210}, {0x2566, 203}, {0x2567, 207}, {0x2568, 208}, - {0x2569, 202}, {0x256a, 216}, {0x256b, 215}, {0x256c, 206}, - {0x2580, 223}, {0x2584, 220}, {0x2588, 219}, {0x258c, 221}, - {0x2590, 222}, {0x2591, 176}, {0x2592, 177}, {0x2593, 178}, - {0x25ac, 22}, {0x25b2, 30}, {0x25ba, 16}, {0x25bc, 31}, - {0x25c4, 17}, {0x25cb, 9}, {0x25d8, 8}, {0x25d9, 10}, - {0x263a, 1}, {0x263b, 2}, {0x263c, 15}, {0x2640, 12}, - {0x2642, 11}, {0x2660, 6}, {0x2663, 5}, {0x2665, 3}, - {0x2666, 4}, {0x266a, 13}, {0x266b, 14}, {0xfffd, '?'} -}; - -const static uint32_t cp1131_unicode_table[128] = { - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, - 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, - 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, - 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, - 0x0406, 0x0456, 0x00b7, 0x221a, 0x0490, 0x0491, 0x2219, 0x00a0 -}; - -const static struct ciolib_cpmap armscii8_table[122] = { - {0x00a0, 160}, {0x00a7, 162}, {0x00ab, 167}, {0x00b6, 20}, - {0x00bb, 166}, {0x02bc, 254}, {0x0531, 178}, {0x0532, 180}, - {0x0533, 182}, {0x0534, 184}, {0x0535, 186}, {0x0536, 188}, - {0x0537, 190}, {0x0538, 192}, {0x0539, 194}, {0x053a, 196}, - {0x053b, 198}, {0x053c, 200}, {0x053d, 202}, {0x053e, 204}, - {0x053f, 206}, {0x0540, 208}, {0x0541, 210}, {0x0542, 212}, - {0x0543, 214}, {0x0544, 216}, {0x0545, 218}, {0x0546, 220}, - {0x0547, 222}, {0x0548, 224}, {0x0549, 226}, {0x054a, 228}, - {0x054b, 230}, {0x054c, 232}, {0x054d, 234}, {0x054e, 236}, - {0x054f, 238}, {0x0550, 240}, {0x0551, 242}, {0x0552, 244}, - {0x0553, 246}, {0x0554, 248}, {0x0555, 250}, {0x0556, 252}, - {0x055b, 176}, {0x055c, 175}, {0x055d, 170}, {0x055e, 177}, - {0x0561, 179}, {0x0562, 181}, {0x0563, 183}, {0x0564, 185}, - {0x0565, 187}, {0x0566, 189}, {0x0567, 191}, {0x0568, 193}, - {0x0569, 195}, {0x056a, 197}, {0x056b, 199}, {0x056c, 201}, - {0x056d, 203}, {0x056e, 205}, {0x056f, 207}, {0x0570, 209}, - {0x0571, 211}, {0x0572, 213}, {0x0573, 215}, {0x0574, 217}, - {0x0575, 219}, {0x0576, 221}, {0x0577, 223}, {0x0578, 225}, - {0x0579, 227}, {0x057a, 229}, {0x057b, 231}, {0x057c, 233}, - {0x057d, 235}, {0x057e, 237}, {0x057f, 239}, {0x0580, 241}, - {0x0581, 243}, {0x0582, 245}, {0x0583, 247}, {0x0584, 249}, - {0x0585, 251}, {0x0586, 253}, {0x0589, 163}, {0x058a, 173}, - {0x058e, 161}, {0x2013, 172}, {0x2014, 168}, {0x2022, 7}, - {0x2026, 174}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t armscii8_unicode_table[128] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x058e, 0x00a7, 0x0589, 0x0029, 0x002a, 0x00bb, 0x00ab, - 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, - 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, - 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, - 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, - 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, - 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, - 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, - 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, - 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, - 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, - 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x02bc, 0xfffd -}; - -const static struct ciolib_cpmap haik8_table[122] = { - {0x00a0, 128}, {0x00a7, 21}, {0x00ab, 135}, {0x00b6, 20}, - {0x00bb, 134}, {0x02bc, 254}, {0x0531, 146}, {0x0532, 148}, - {0x0533, 150}, {0x0534, 152}, {0x0535, 154}, {0x0536, 156}, - {0x0537, 158}, {0x0538, 160}, {0x0539, 162}, {0x053a, 164}, - {0x053b, 166}, {0x053c, 168}, {0x053d, 170}, {0x053e, 172}, - {0x053f, 174}, {0x0540, 176}, {0x0541, 178}, {0x0542, 180}, - {0x0543, 182}, {0x0544, 184}, {0x0545, 186}, {0x0546, 188}, - {0x0547, 190}, {0x0548, 224}, {0x0549, 226}, {0x054a, 228}, - {0x054b, 230}, {0x054c, 232}, {0x054d, 234}, {0x054e, 236}, - {0x054f, 238}, {0x0550, 240}, {0x0551, 242}, {0x0552, 244}, - {0x0553, 246}, {0x0554, 248}, {0x0555, 250}, {0x0556, 252}, - {0x055b, 144}, {0x055c, 143}, {0x055d, 138}, {0x055e, 145}, - {0x0561, 147}, {0x0562, 149}, {0x0563, 151}, {0x0564, 153}, - {0x0565, 155}, {0x0566, 157}, {0x0567, 159}, {0x0568, 161}, - {0x0569, 163}, {0x056a, 165}, {0x056b, 167}, {0x056c, 169}, - {0x056d, 171}, {0x056e, 173}, {0x056f, 175}, {0x0570, 177}, - {0x0571, 179}, {0x0572, 181}, {0x0573, 183}, {0x0574, 185}, - {0x0575, 187}, {0x0576, 189}, {0x0577, 191}, {0x0578, 225}, - {0x0579, 227}, {0x057a, 229}, {0x057b, 231}, {0x057c, 233}, - {0x057d, 235}, {0x057e, 237}, {0x057f, 239}, {0x0580, 241}, - {0x0581, 243}, {0x0582, 245}, {0x0583, 247}, {0x0584, 249}, - {0x0585, 251}, {0x0586, 253}, {0x0589, 131}, {0x058a, 141}, - {0x058e, 129}, {0x2013, 140}, {0x2014, 136}, {0x2022, 7}, - {0x2026, 142}, {0x203c, 19}, {0x2190, 27}, {0x2191, 24}, - {0x2192, 26}, {0x2193, 25}, {0x2194, 29}, {0x2195, 18}, - {0x21a8, 23}, {0x221f, 28}, {0x25ac, 22}, {0x25b2, 30}, - {0x25ba, 16}, {0x25bc, 31}, {0x25c4, 17}, {0x25cb, 9}, - {0x25d8, 8}, {0x25d9, 10}, {0x263a, 1}, {0x263b, 2}, - {0x263c, 15}, {0x2640, 12}, {0x2642, 11}, {0x2660, 6}, - {0x2663, 5}, {0x2665, 3}, {0x2666, 4}, {0x266a, 13}, - {0x266b, 14}, {0xfffd, 63} -}; - -const static uint32_t haik8_unicode_table[128] = { - 0x00a0, 0x058e, 0x00a7, 0x0589, 0x0029, 0x002a, 0x00bb, 0x00ab, - 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, - 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, - 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, - 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, - 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, - 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, - 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, - 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, - 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, - 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x02bc, 0xfffd -}; - -const static struct ciolib_cpmap atascii_table[148] = { - {0x0007, 252}, {0x0008, 126}, {0x0009, 127}, {0x000d, 155}, - {0x001b, 27}, {0x0020, 32}, {0x0021, 33}, {0x0022, 34}, - {0x0023, 35}, {0x0024, 36}, {0x0025, 37}, {0x0026, 38}, - {0x0027, 39}, {0x0028, 40}, {0x0029, 41}, {0x002a, 42}, - {0x002b, 43}, {0x002c, 44}, {0x002d, 45}, {0x002e, 46}, - {0x002f, 47}, {0x0030, 48}, {0x0031, 49}, {0x0032, 50}, - {0x0033, 51}, {0x0034, 52}, {0x0035, 53}, {0x0036, 54}, - {0x0037, 55}, {0x0038, 56}, {0x0039, 57}, {0x003a, 58}, - {0x003b, 59}, {0x003c, 60}, {0x003d, 61}, {0x003e, 62}, - {0x003f, 63}, {0x0040, 64}, {0x0041, 65}, {0x0042, 66}, - {0x0043, 67}, {0x0044, 68}, {0x0045, 69}, {0x0046, 70}, - {0x0047, 71}, {0x0048, 72}, {0x0049, 73}, {0x004a, 74}, - {0x004b, 75}, {0x004c, 76}, {0x004d, 77}, {0x004e, 78}, - {0x004f, 79}, {0x0050, 80}, {0x0051, 81}, {0x0052, 82}, - {0x0053, 83}, {0x0054, 84}, {0x0055, 85}, {0x0056, 86}, - {0x0057, 87}, {0x0058, 88}, {0x0059, 89}, {0x005a, 90}, - {0x005b, 91}, {0x005c, 92}, {0x005d, 93}, {0x005e, 94}, - {0x005f, 95}, {0x0061, 97}, {0x0062, 98}, {0x0063, 99}, - {0x0064, 100}, {0x0065, 101}, {0x0066, 102}, {0x0067, 103}, - {0x0068, 104}, {0x0069, 105}, {0x006a, 106}, {0x006b, 107}, - {0x006c, 108}, {0x006d, 109}, {0x006e, 110}, {0x006f, 111}, - {0x0070, 112}, {0x0071, 113}, {0x0072, 114}, {0x0073, 115}, - {0x0074, 116}, {0x0075, 117}, {0x0076, 118}, {0x0077, 119}, - {0x0078, 120}, {0x0079, 121}, {0x007a, 122}, {0x007c, 124}, - {0x007f, 253}, {0x00a0, 155}, {0x2022, 148}, {0x2190, 30}, - {0x2191, 28}, {0x2192, 159}, {0x2193, 157}, {0x21b0, 125}, - {0x241b, 27}, {0x2500, 18}, {0x250c, 145}, {0x2510, 5}, - {0x2514, 26}, {0x2518, 131}, {0x251c, 129}, {0x2524, 132}, - {0x252c, 23}, {0x2534, 24}, {0x253c, 147}, {0x2571, 6}, - {0x2572, 135}, {0x2580, 149}, {0x2582, 142}, {0x2584, 21}, - {0x2586, 141}, {0x2588, 160}, {0x258a, 130}, {0x258c, 25}, - {0x258e, 150}, {0x2590, 153}, {0x2596, 143}, {0x2597, 137}, - {0x2598, 140}, {0x2599, 139}, {0x259b, 137}, {0x259c, 143}, - {0x259d, 139}, {0x259f, 140}, {0x25b6, 127}, {0x25c0, 126}, - {0x25d8, 148}, {0x25e2, 136}, {0x25e3, 10}, {0x25e4, 136}, - {0x25e5, 138}, {0x2660, 123}, {0x2663, 144}, {0x2665, 63}, - {0x2666, 96}, {0xfffd, 63}, {0x1fb82, 13}, {0x1fb87, 2} -}; - -const static uint32_t atascii_unicode_table[256] = { - 0x2665, 0x251c,0x1fb87, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e2, 0x2597, 0x25e3, 0x259d, 0x2598,0x1fb82, 0x2582, 0x2596, - 0x2663, 0x250c, 0x2500, 0x253c, 0x2022, 0x2584, 0x258e, 0x252c, - 0x2534, 0x258c, 0x2514, 0x001b, 0x2191, 0x2193, 0x2190, 0x2192, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x007c, 0x21b0, 0x0008, 0x0009, - 0x2665, 0x251c, 0x258a, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e4, 0x259b, 0x25e5, 0x2599, 0x259f, 0x2586, 0x2582, 0x259c, - 0x2663, 0x250c, 0x2500, 0x253c, 0x25d8, 0x2580, 0x258e, 0x252c, - 0x2534, 0x2590, 0x2514, 0x000d, 0x2191, 0x2193, 0x2190, 0x2192, - 0x2588, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x0007, 0x007f, 0x25c0, 0x25b6 -}; - -const static uint32_t atascii_ext_table[256] = { - 0x2665, 0x251c,0x1fb87, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e2, 0x2597, 0x25e3, 0x259d, 0x2598,0x1fb82, 0x2582, 0x2596, - 0x2663, 0x250c, 0x2500, 0x253c, 0x2022, 0x2584, 0x258e, 0x252c, - 0x2534, 0x258c, 0x2514, 0x241b, 0x2191, 0x2193, 0x2190, 0x2192, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x007c, 0x21b0, 0x25c0, 0x25b6, - 0x2665, 0x251c,0x1fb87, 0x2518, 0x2524, 0x2510, 0x2571, 0x2572, - 0x25e2, 0x2597, 0x25e3, 0x259d, 0x2598,0x1fb82, 0x2582, 0x2596, - 0x2663, 0x250c, 0x2500, 0x253c, 0x2022, 0x2584, 0x258e, 0x252c, - 0x2534, 0x258c, 0x2514, 0x00a0, 0x2191, 0x2193, 0x2190, 0x2192, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x2666, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x2660, 0x007c, 0x21b0, 0x25c0, 0x25b6 -}; - -const static struct ciolib_cpmap petsciiu_table[129] = { - {0x0020, 32}, {0x0021, 33}, {0x0022, 34}, {0x0023, 35}, - {0x0024, 36}, {0x0025, 37}, {0x0026, 38}, {0x0027, 39}, - {0x0028, 40}, {0x0029, 41}, {0x002a, 42}, {0x002b, 43}, - {0x002c, 44}, {0x002d, 45}, {0x002e, 46}, {0x002f, 47}, - {0x0030, 48}, {0x0031, 49}, {0x0032, 50}, {0x0033, 51}, - {0x0034, 52}, {0x0035, 53}, {0x0036, 54}, {0x0037, 55}, - {0x0038, 56}, {0x0039, 57}, {0x003a, 58}, {0x003b, 59}, - {0x003c, 60}, {0x003d, 61}, {0x003e, 62}, {0x003f, 63}, - {0x0040, 64}, {0x0041, 65}, {0x0042, 66}, {0x0043, 67}, - {0x0044, 68}, {0x0045, 69}, {0x0046, 70}, {0x0047, 71}, - {0x0048, 72}, {0x0049, 73}, {0x004a, 74}, {0x004b, 75}, - {0x004c, 76}, {0x004d, 77}, {0x004e, 78}, {0x004f, 79}, - {0x0050, 80}, {0x0051, 81}, {0x0052, 82}, {0x0053, 83}, - {0x0054, 84}, {0x0055, 85}, {0x0056, 86}, {0x0057, 87}, - {0x0058, 88}, {0x0059, 89}, {0x005a, 90}, {0x005b, 91}, - {0x005d, 93}, {0x00a0, 160}, {0x00a3, 92}, {0x03c0, 126}, - {0x2190, 95}, {0x2191, 94}, {0x2500, 96}, {0x2502, 125}, - {0x250c, 176}, {0x2510, 174}, {0x2514, 173}, {0x2518, 189}, - {0x251c, 171}, {0x2524, 179}, {0x252c, 178}, {0x2534, 177}, - {0x253c, 123}, {0x256d, 117}, {0x256e, 105}, {0x256f, 107}, - {0x2570, 106}, {0x2571, 110}, {0x2572, 109}, {0x2573, 118}, - {0x2581, 164}, {0x2582, 175}, {0x2583, 185}, {0x2584, 162}, - {0x258c, 161}, {0x258d, 181}, {0x258e, 180}, {0x258f, 165}, - {0x2592, 166}, {0x2594, 163}, {0x2595, 167}, {0x2596, 187}, - {0x2597, 172}, {0x2598, 190}, {0x259a, 191}, {0x259d, 188}, - {0x25cb, 119}, {0x25cf, 113}, {0x25e4, 169}, {0x25e5, 127}, - {0x2660, 97}, {0x2663, 120}, {0x2665, 115}, {0x2666, 122}, - {0xfffd, 63}, {0x1fb70, 116}, {0x1fb71, 103}, {0x1fb72, 98}, - {0x1fb74, 104}, {0x1fb75, 121}, {0x1fb76, 101}, {0x1fb77, 100}, - {0x1fb78, 99}, {0x1fb7a, 102}, {0x1fb7b, 114}, {0x1fb7c, 108}, - {0x1fb7d, 111}, {0x1fb7e, 112}, {0x1fb7f, 186}, {0x1fb82, 183}, - {0x1fb83, 184}, {0x1fb87, 170}, {0x1fb88, 182}, {0x1fb8c, 124}, - {0x1fb8f, 168} -}; - -const static uint32_t petsciiu_unicode_table[256] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x00a3, 0x005d, 0x2191, 0x2190, - 0x2500, 0x2660,0x1fb72,0x1fb78,0x1fb77,0x1fb76,0x1fb7a,0x1fb71, - 0x1fb74,0x256e, 0x2570, 0x256f,0x1fb7c, 0x2572, 0x2571,0x1fb7d, - 0x1fb7e,0x25cf,0x1fb7b, 0x2665,0x1fb70, 0x256d, 0x2573, 0x25cb, - 0x2663,0x1fb75, 0x2666, 0x253c,0x1fb8c, 0x2502, 0x03c0, 0x25e5, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x25e4,0x1fb87, 0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583,0x1fb7f, 0x2596, 0x259d, 0x2518, 0x2598, 0x259a, - 0x2500, 0x2660,0x1fb72,0x1fb78,0x1fb77,0x1fb76,0x1fb7a,0x1fb71, - 0x1fb74,0x256e, 0x2570, 0x256f,0x1fb7c, 0x2572, 0x2571,0x1fb7d, - 0x1fb7e,0x25cf,0x1fb7b, 0x2665,0x1fb70, 0x256d, 0x2573, 0x25cb, - 0x2663,0x1fb75, 0x2666, 0x253c,0x1fb8c, 0x2502, 0x03c0, 0x25e5, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x25e4,0x1fb87, 0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583,0x1fb7f, 0x2596, 0x259d, 0x2518, 0x2598, 0x03c0 -}; - -const static struct ciolib_cpmap petsciil_table[129] = { - {0x0020, 32}, {0x0021, 33}, {0x0022, 34}, {0x0023, 35}, - {0x0024, 36}, {0x0025, 37}, {0x0026, 38}, {0x0027, 39}, - {0x0028, 40}, {0x0029, 41}, {0x002a, 42}, {0x002b, 43}, - {0x002c, 44}, {0x002d, 45}, {0x002e, 46}, {0x002f, 47}, - {0x0030, 48}, {0x0031, 49}, {0x0032, 50}, {0x0033, 51}, - {0x0034, 52}, {0x0035, 53}, {0x0036, 54}, {0x0037, 55}, - {0x0038, 56}, {0x0039, 57}, {0x003a, 58}, {0x003b, 59}, - {0x003c, 60}, {0x003d, 61}, {0x003e, 62}, {0x003f, 63}, - {0x0040, 64}, {0x0041, 97}, {0x0042, 98}, {0x0043, 99}, - {0x0044, 100}, {0x0045, 101}, {0x0046, 102}, {0x0047, 103}, - {0x0048, 104}, {0x0049, 105}, {0x004a, 106}, {0x004b, 107}, - {0x004c, 108}, {0x004d, 109}, {0x004e, 110}, {0x004f, 111}, - {0x0050, 112}, {0x0051, 113}, {0x0052, 114}, {0x0053, 115}, - {0x0054, 116}, {0x0055, 117}, {0x0056, 118}, {0x0057, 119}, - {0x0058, 120}, {0x0059, 121}, {0x005a, 122}, {0x005b, 91}, - {0x005d, 93}, {0x0061, 65}, {0x0062, 66}, {0x0063, 67}, - {0x0064, 68}, {0x0065, 69}, {0x0066, 70}, {0x0067, 71}, - {0x0068, 72}, {0x0069, 73}, {0x006a, 74}, {0x006b, 75}, - {0x006c, 76}, {0x006d, 77}, {0x006e, 78}, {0x006f, 79}, - {0x0070, 80}, {0x0071, 81}, {0x0072, 82}, {0x0073, 83}, - {0x0074, 84}, {0x0075, 85}, {0x0076, 86}, {0x0077, 87}, - {0x0078, 88}, {0x0079, 89}, {0x007a, 90}, {0x00a0, 160}, - {0x00a3, 92}, {0x2190, 95}, {0x2191, 94}, {0x2500, 96}, - {0x2502, 125}, {0x250c, 176}, {0x2510, 174}, {0x2514, 173}, - {0x2518, 189}, {0x251c, 171}, {0x2524, 179}, {0x252c, 178}, - {0x2534, 177}, {0x253c, 123}, {0x2581, 164}, {0x2582, 175}, - {0x2583, 185}, {0x2584, 162}, {0x258c, 161}, {0x258d, 181}, - {0x258e, 180}, {0x258f, 165}, {0x2592, 166}, {0x2594, 163}, - {0x2595, 167}, {0x2596, 187}, {0x2597, 172}, {0x2598, 190}, - {0x259a, 191}, {0x259d, 188}, {0x2713, 186}, {0xfffd, 63}, - {0x1fb82, 183}, {0x1fb83, 184}, {0x1fb87, 170}, {0x1fb88, 182}, - {0x1fb8c, 124}, {0x1fb8f, 168}, {0x1fb96, 126}, {0x1fb98, 127}, - {0x1fb99, 169} -}; - -const static uint32_t petsciil_unicode_table[256] = { - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x005b, 0x00a3, 0x005d, 0x2191, 0x2190, - 0x2500, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x253c,0x1fb8c, 0x2502,0x1fb96,0x1fb98, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x1fb99,0x1fb87,0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583, 0x2713, 0x2596, 0x259d, 0x2518, 0x2598, 0x259a, - 0x2500, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x253c,0x1fb8c, 0x2502,0x1fb96,0x1fb98, - 0x00a0, 0x258c, 0x2584, 0x2594, 0x2581, 0x258f, 0x2592, 0x2595, - 0x1fb8f,0x1fb99,0x1fb87,0x251c, 0x2597, 0x2514, 0x2510, 0x2582, - 0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d,0x1fb88,0x1fb82, - 0x1fb83,0x2583, 0x2713, 0x2596, 0x259d, 0x2518, 0x2598,0x1fb96 -}; - -static int -cmptab(const void *key, const void *entry) -{ - const uint32_t *pkey = key; - const struct ciolib_cpmap *pentry = entry; - - if (*pkey == pentry->unicode) - return 0; - if (*pkey < pentry->unicode) - return -1; - return 1; -} - -static uint8_t -cptable_from_unicode_cpoint(uint32_t cpoint, char unmapped, const struct codepage_def *cpdef) -{ - struct ciolib_cpmap *mapped; - - if (cpoint < 128) - return cpoint; - mapped = bsearch(&cpoint, cpdef->cp_table, cpdef->cp_table_sz, sizeof(cpdef->cp_table[0]), cmptab); - if (mapped == NULL) - return unmapped; - return mapped->cpchar; -} - -static uint32_t -cpoint_from_cptable(uint8_t ch, const struct codepage_def *cpdef) -{ - if (ch < 128) - return ch; - return cpdef->cp_unicode_table[ch - 128]; -} - -static uint32_t -cpoint_from_cptable_ext(uint8_t ch, const struct codepage_def *cpdef) -{ - if (ch < 32) - return cpdef->cp_ext_unicode_table[ch]; - return ciolib_cp[cpdef->cp].from_cpchar(ch, cpdef); -} - -static uint32_t -ft_cpoint_from_cptable(uint8_t ch, const struct codepage_def *cpdef) -{ - return cpdef->cp_unicode_table[ch]; -} - -static uint32_t -ft_cpoint_from_cptable_ext(uint8_t ch, const struct codepage_def *cpdef) -{ - return cpdef->cp_ext_unicode_table[ch]; -} - -static int -write_cp(uint8_t *str, uint32_t cp) -{ - if (cp < 128) { - *str = cp; - return 1; - } - if (cp < 0x800) { - *(str++) = 0xc0 | (cp >> 6); - *(str++) = 0x80 | (cp & 0x3f); - return 2; - } - if (cp < 0x10000) { - *(str++) = 0xe0 | (cp >> 12); - *(str++) = 0x80 | ((cp >> 6) & 0x3f); - *(str++) = 0x80 | (cp & 0x3f); - return 3; - } - if (cp < 0x110000) { - *(str++) = 0xf0 | (cp >> 18); - *(str++) = 0x80 | ((cp >> 12) & 0x3f); - *(str++) = 0x80 | ((cp >> 6) & 0x3f); - *(str++) = 0x80 | (cp & 0x3f); - return 4; - } - return -1; -} - -static int -read_cp(const uint8_t *str, uint32_t *cp) -{ - int incode; - const uint8_t *p = str; - - if (cp == NULL) - goto error; - - if (str == NULL) - goto error; - - if (*p & 0x80) { - if ((*p & 0xe0) == 0xc0) { - incode = 1; - *cp = *p & 0x1f; - } - else if ((*p & 0xf0) == 0xe0) { - incode = 2; - *cp = *p & 0x0f; - } - else if ((*p & 0xf8) == 0xf0) { - incode = 3; - *cp = *p & 0x07; - } - else - goto error; - - while (incode) { - p++; - incode--; - if ((*p & 0xc0) != 0x80) - goto error; - *cp <<= 6; - *cp |= (*p & 0x3f); - } - } - else { - *cp = *p; - } - return p - str + 1; - -error: - if (cp) - *cp = 0xffff; - return -1; -} - -static int -utf8_bytes(uint32_t cp) -{ - if (cp < 0x80) - return 1; - if (cp < 0x800) - return 2; - if (cp < 0x10000) - return 3; - if (cp < 0x11000) - return 4; - return -1; -} - -static uint8_t * -cpstr_to_utf8(const char *cpstr, size_t buflen, size_t *outlen, const struct codepage_def *cpdef) -{ - size_t needed = 0; - int cplen; - uint8_t *ret = NULL; - uint8_t *rp; - size_t idx; - uint8_t ch; - - // Calculate the number of bytes needed - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - if (ch == 0) - cplen = 4; - else if (ch < 128) - cplen = 1; - else - cplen = utf8_bytes(cpdef->cp_unicode_table[ch - 128]); - if (cplen == -1) - goto error; - needed += cplen; - } - - ret = malloc(needed + 1); - if (ret == NULL) - goto error; - - rp = ret; - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - if (ch == 0) { - *(rp++) = 0xef; - *(rp++) = 0xbf; - *(rp++) = 0xbe; - cplen = 0; - } - else if (ch < 128) { - *rp = ch; - cplen = 1; - } - else { - cplen = write_cp(rp, cpdef->cp_unicode_table[ch - 128]); - if (cplen < 1) - goto error; - } - rp += cplen; - } - *rp = 0; - if (outlen) - *outlen = rp - ret; - return ret; - -error: - free(ret); - return NULL; -} - -static uint8_t -ft_from_unicode_cpoint(uint32_t cpoint, char unmapped, const struct codepage_def *cpdef) -{ - struct ciolib_cpmap *mapped; - - mapped = bsearch(&cpoint, cpdef->cp_table, cpdef->cp_table_sz, sizeof(cpdef->cp_table[0]), cmptab); - if (mapped == NULL) - return unmapped; - return mapped->cpchar; -} - -static uint8_t * -ftstr_to_utf8(const char *cpstr, size_t buflen, size_t *outlen, const struct codepage_def *cpdef) -{ - size_t needed = 0; - int cplen; - uint8_t *ret = NULL; - uint8_t *rp; - size_t idx; - uint8_t ch; - - // Calculate the number of bytes needed - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - cplen = utf8_bytes(cpdef->cp_unicode_table[ch]); - if (cplen == -1) - goto error; - needed += cplen; - } - - ret = malloc(needed + 1); - if (ret == NULL) - goto error; - - rp = ret; - for (idx = 0; idx < buflen; idx++) { - ch = cpstr[idx]; - cplen = write_cp(rp, cpdef->cp_unicode_table[ch]); - if (cplen < 1) - goto error; - rp += cplen; - } - *rp = 0; - if (outlen) - *outlen = rp - ret; - return ret; - -error: - free(ret); - return NULL; -} - -/* - * Converts UTF-8 to defined codepage, replacing unmapped characters - * with unmapped if unmapped is zero, unmapped characters are stripped. - * - * Returns NULL if there are invalid sequences or codepoints. - * Does not normalize the unicode, just a simple mapping - * (TODO: Normalize into combined chars etc) - */ -static char * -utf8_to_cpstr(const uint8_t *utf8str, char unmapped, size_t inlen, size_t *outlen, const struct codepage_def *cpdef) -{ - size_t idx; - char *rp; - size_t outsz = 0; - int incode = 0; - uint32_t codepoint; - char *ret = NULL; - - // TODO: Normalize UTF-8... - - // Calculate the number of code points and validate. - for (idx = 0; idx < inlen; idx++) { - if (incode) { - switch (utf8str[idx] & 0xc0) { - case 0x80: - incode--; - if (incode == 0) - outsz++; - break; - default: - goto error; - } - } - else { - if (utf8str[idx] & 0x80) { - if ((utf8str[idx] & 0xe0) == 0xc0) - incode = 1; - else if ((utf8str[idx] & 0xf0) == 0xe0) - incode = 2; - else if ((utf8str[idx] & 0xf8) == 0xf0) - incode = 3; - else - goto error; - } - else - outsz++; - } - } - ret = malloc(outsz + 1); - if (ret == NULL) - goto error; - rp = ret; - - // Fill the string... - for (idx = 0; idx < inlen;) { - idx += read_cp(&utf8str[idx], &codepoint); - if (codepoint == 0xffff || codepoint == 0xfffe) - goto error; - *(rp++) = cpdef->from_unicode_cpoint(codepoint, unmapped, cpdef); - } - *rp = 0; - if (outlen) - *outlen = rp - ret; - - return ret; -error: - free(ret); - return NULL; -} - -const struct codepage_def ciolib_cp[CIOLIB_CP_COUNT] = { - // 0 - {"CP437", CIOLIB_CP437, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp437_table, sizeof(cp437_table) / sizeof(cp437_table[0]), - cp437_unicode_table, cp437_ext_table}, - {"CP1251", CIOLIB_CP1251, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp1251_table, sizeof(cp1251_table) / sizeof(cp1251_table[0]), - cp1251_unicode_table, cp437_ext_table}, - {"KOI8-R", CIOLIB_KOI8_R, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - koi8_r_table, sizeof(koi8_r_table) / sizeof(koi8_r_table[0]), - koi8_r_unicode_table, empty_ext_table}, - {"ISO-8859-2", CIOLIB_ISO_8859_2, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_2_table, sizeof(iso8859_2_table) / sizeof(iso8859_2_table[0]), - iso8859_2_unicode_table, empty_ext_table}, - {"ISO-8859-4", CIOLIB_ISO_8859_4, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_4_table, sizeof(iso8859_4_table) / sizeof(iso8859_4_table[0]), - iso8859_4_unicode_table, empty_ext_table}, - // 5 - {"CP866M", CIOLIB_CP866M, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp866m_table, sizeof(cp866m_table) / sizeof(cp866m_table[0]), - cp866m_unicode_table, cp437_ext_table}, - {"ISO-8859-9", CIOLIB_ISO_8859_9, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_9_table, sizeof(iso8859_9_table) / sizeof(iso8859_9_table[0]), - iso8859_9_unicode_table, empty_ext_table}, - {"ISO-8859-8", CIOLIB_ISO_8859_8, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_8_table, sizeof(iso8859_8_table) / sizeof(iso8859_8_table[0]), - iso8859_8_unicode_table, empty_ext_table}, - {"KOI8-U", CIOLIB_KOI8_U, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - koi8_u_table, sizeof(koi8_u_table) / sizeof(koi8_u_table[0]), - koi8_u_unicode_table, empty_ext_table}, - {"ISO-8859-15", CIOLIB_ISO_8859_15, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_15_table, sizeof(iso8859_15_table) / sizeof(iso8859_15_table[0]), - iso8859_15_unicode_table, empty_ext_table}, - // 10 - {"ISO-8859-5", CIOLIB_ISO_8859_5, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_5_table, sizeof(iso8859_5_table) / sizeof(iso8859_5_table[0]), - iso8859_5_unicode_table, empty_ext_table}, - {"CP850", CIOLIB_CP850, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp850_table, sizeof(cp850_table) / sizeof(cp850_table[0]), - cp850_unicode_table, cp437_ext_table}, - {"CP865", CIOLIB_CP865, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp865_table, sizeof(cp865_table) / sizeof(cp865_table[0]), - cp865_unicode_table, cp437_ext_table}, - {"ISO-8859-7", CIOLIB_ISO_8859_7, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_7_table, sizeof(iso8859_7_table) / sizeof(iso8859_7_table[0]), - iso8859_7_unicode_table, empty_ext_table}, - {"ISO-8859-1", CIOLIB_ISO_8859_1, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - iso8859_1_table, sizeof(iso8859_1_table) / sizeof(iso8859_1_table[0]), - iso8859_1_unicode_table, empty_ext_table}, - // 15 - {"CP866M2", CIOLIB_CP866M2, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp866m2_table, sizeof(cp866m2_table) / sizeof(cp866m2_table[0]), - cp866m2_unicode_table, cp437_ext_table}, - {"CP866U", CIOLIB_CP866U, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp866u_table, sizeof(cp866u_table) / sizeof(cp866u_table[0]), - cp866u_unicode_table, cp437_ext_table}, - {"CP1131", CIOLIB_CP1131, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - cp1131_table, sizeof(cp1131_table) / sizeof(cp1131_table[0]), - cp1131_unicode_table, cp437_ext_table}, - {"ARMSCII-8", CIOLIB_ARMSCII8, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - armscii8_table, sizeof(armscii8_table) / sizeof(armscii8_table[0]), - armscii8_unicode_table, cp437_ext_table}, - {"HAIK8", CIOLIB_HAIK8, cpstr_to_utf8, utf8_to_cpstr, cptable_from_unicode_cpoint, cpoint_from_cptable, cpoint_from_cptable_ext, - haik8_table, sizeof(haik8_table) / sizeof(haik8_table[0]), - haik8_unicode_table, cp437_ext_table}, - // 20 - {"ATASCII", CIOLIB_ATASCII, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, ft_cpoint_from_cptable_ext, - atascii_table, sizeof(atascii_table) / sizeof(atascii_table[0]), - atascii_unicode_table, atascii_ext_table}, - {"PETSCIIU", CIOLIB_PETSCIIU, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, cpoint_from_cptable_ext, - petsciiu_table, sizeof(petsciiu_table) / sizeof(petsciiu_table[0]), - petsciiu_unicode_table, empty_ext_table}, - {"PETSCIIL", CIOLIB_PETSCIIL, ftstr_to_utf8, utf8_to_cpstr, ft_from_unicode_cpoint, ft_cpoint_from_cptable, cpoint_from_cptable_ext, - petsciil_table, sizeof(petsciil_table) / sizeof(petsciil_table[0]), - petsciil_unicode_table, empty_ext_table}, -}; - -uint8_t *cp_to_utf8(enum ciolib_codepage cp, const char *cpstr, size_t buflen, size_t *outlen) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return NULL; - - return ciolib_cp[cp].to_utf8(cpstr, buflen, outlen, &ciolib_cp[cp]); -} - -char *utf8_to_cp(enum ciolib_codepage cp, const uint8_t *utf8str, char unmapped, size_t buflen, size_t *outlen) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return NULL; - - return ciolib_cp[cp].utf8_to(utf8str, unmapped, buflen, outlen, &ciolib_cp[cp]); -} - -uint8_t cpchar_from_unicode_cpoint(enum ciolib_codepage cp, uint32_t cpoint, char unmapped) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return unmapped; - - return ciolib_cp[cp].from_unicode_cpoint(cpoint, unmapped, &ciolib_cp[cp]); -} - -uint32_t cpoint_from_cpchar(enum ciolib_codepage cp, uint8_t ch) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return 0; - - return ciolib_cp[cp].from_cpchar(ch, &ciolib_cp[cp]); -} - -uint32_t cpoint_from_cpchar_ext(enum ciolib_codepage cp, uint8_t ch) -{ - if (cp < 0 || cp >= CIOLIB_CP_COUNT) - return 0; - - return ciolib_cp[cp].from_cpchar_ext(ch, &ciolib_cp[cp]); -} diff --git a/ciolib/utf8_codepages.h b/ciolib/utf8_codepages.h deleted file mode 100644 index f654d9c33d18687004723b3f63405669f10223ce..0000000000000000000000000000000000000000 --- a/ciolib/utf8_codepages.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef UTF8_CODEPAGES_H -#define UTF8_CODEPAGES_H - -enum ciolib_codepage { - CIOLIB_CP437, - CIOLIB_CP1251, - CIOLIB_KOI8_R, - CIOLIB_ISO_8859_2, - CIOLIB_ISO_8859_4, - CIOLIB_CP866M, - CIOLIB_ISO_8859_9, - CIOLIB_ISO_8859_8, - CIOLIB_KOI8_U, - CIOLIB_ISO_8859_15, - CIOLIB_ISO_8859_5, - CIOLIB_CP850, - CIOLIB_CP865, - CIOLIB_ISO_8859_7, - CIOLIB_ISO_8859_1, - CIOLIB_CP866M2, - CIOLIB_CP866U, - CIOLIB_CP1131, - CIOLIB_ARMSCII8, - CIOLIB_HAIK8, - CIOLIB_ATASCII, - CIOLIB_PETSCIIU, - CIOLIB_PETSCIIL, - CIOLIB_CP_COUNT -}; - -struct codepage_def { - const char name[32]; - const enum ciolib_codepage cp; - uint8_t *(*to_utf8)(const char *cp437str, size_t buflen, size_t *outlen, const struct codepage_def *cpdef); - char *(*utf8_to)(const uint8_t *utf8str, char unmapped, size_t buflen, size_t *outlen, const struct codepage_def *cpdef); - uint8_t (*from_unicode_cpoint)(uint32_t cpoint, char unmapped, const struct codepage_def *cpdef); - uint32_t (*from_cpchar)(uint8_t cpoint, const struct codepage_def *cpdef); - uint32_t (*from_cpchar_ext)(uint8_t cpoint, const struct codepage_def *cpdef); - const struct ciolib_cpmap *cp_table; - const size_t cp_table_sz; - const uint32_t *cp_unicode_table; - const uint32_t *cp_ext_unicode_table; -}; - -extern const struct codepage_def ciolib_cp[CIOLIB_CP_COUNT]; - -#ifdef __cplusplus -extern "C" { -#endif - -uint8_t *cp_to_utf8(enum ciolib_codepage cp, const char *cpstr, size_t buflen, size_t *outlen); -char *utf8_to_cp(enum ciolib_codepage cp, const uint8_t *utf8str, char unmapped, size_t buflen, size_t *outlen); -uint8_t cpchar_from_unicode_cpoint(enum ciolib_codepage cp, uint32_t cpoint, char unmapped); -uint32_t cpoint_from_cpchar(enum ciolib_codepage cp, uint8_t ch); -uint32_t cpoint_from_cpchar_ext(enum ciolib_codepage cp, uint8_t ch); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/vidmodes.c b/ciolib/vidmodes.c deleted file mode 100644 index cd8bbb8969eeca4138a769f0fbdbcb28a08ebf83..0000000000000000000000000000000000000000 --- a/ciolib/vidmodes.c +++ /dev/null @@ -1,390 +0,0 @@ -/* $Id: vidmodes.c,v 1.33 2020/06/27 00:04:45 deuce Exp $ */ - -#include <stdlib.h> -#include <stdbool.h> - -/* xpdev: */ -#include <gen_defs.h> /* FREE_AND_NULL */ - -#include "vidmodes.h" - -// TODO: Pretty much all the 1:1 aspect ratios are wrong... -struct video_params vparams[] = { - /* BW 40x25 */ - {BW40, GREYSCALE_PALETTE, 40, 25, 14, 15, 16, 8, 7, 0, 4, 3, 320, 200}, - /* CO 40x25 */ - {C40, COLOUR_PALETTE, 40, 25, 14, 15, 16, 8, 7, 0, 4, 3, 320, 200}, - /* BW 80x25 */ - {BW80, GREYSCALE_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* CO 80x25 */ - {C80, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* MONO */ - {MONO, 0, 80, 25, 14, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* CO 40x14 */ - {C40X14, COLOUR_PALETTE, 40, 14, 14, 15, 16, 8, 7, 0, 4, 3, 320, 224}, - /* CO 40x21 */ - {C40X21, COLOUR_PALETTE, 40, 21, 14, 15, 16, 8, 7, 0, 4, 3, 320, 336}, - /* CO 40x28 */ - {C40X28, COLOUR_PALETTE, 40, 28, 12, 13, 14, 8, 7, 0, 4, 3, 320, 392}, - /* CO 40x43 */ - {C40X43, COLOUR_PALETTE, 40, 43, 7, 7, 8, 8, 7, 0, 4, 3, 320, 774}, - /* CO 40x50 */ - {C40X50, COLOUR_PALETTE, 40, 50, 7, 7, 8, 8, 7, 0, 4, 3, 320, 400}, - /* CO 40x60 */ - {C40X60, COLOUR_PALETTE, 40, 60, 7, 7, 8, 8, 7, 0, 4, 3, 320, 480}, - /* CO 80x14 */ - {C80X14, COLOUR_PALETTE, 80, 14, 14, 15, 16, 8, 7, 0, 4, 3, 640, 224}, - /* CO 80x21 */ - {C80X21, COLOUR_PALETTE, 80, 21, 14, 15, 16, 8, 7, 0, 4, 3, 640, 336}, - /* CO 80x28 */ - {C80X28, COLOUR_PALETTE, 80, 28, 12, 13, 14, 8, 7, 0, 4, 3, 640, 392}, - /* CO 80x30 */ - {C80X30, COLOUR_PALETTE, 80, 30, 14, 15, 16, 8, 7, 0, 4, 3, 640, 480}, - /* CO 80x43 */ - {C80X43, COLOUR_PALETTE, 80, 43, 7, 7, 8, 8, 7, 0, 4, 3, 640, 350}, - /* EGA 80x25 */ - {EGA80X25, COLOUR_PALETTE, 80, 25, 12, 13, 14, 8, 7, 0, 4, 3, 640, 350}, - /* CO 80x50 */ - {C80X50, COLOUR_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* CO 80x60 */ - {C80X60, COLOUR_PALETTE, 80, 60, 7, 7, 8, 8, 7, 0, 4, 3, 640, 480}, - /* B 40x14 */ - {BW40X14, GREYSCALE_PALETTE, 40, 14, 14, 15, 16, 8, 7, 0, 4, 3, 320, 224}, - /* BW 40x21 */ - {BW40X21, GREYSCALE_PALETTE, 40, 21, 14, 15, 16, 8, 7, 0, 4, 3, 320, 336}, - /* BW 40x28 */ - {BW40X28, GREYSCALE_PALETTE, 40, 28, 12, 13, 14, 8, 7, 0, 4, 3, 320, 392}, - /* BW 40x43 */ - {BW40X43, GREYSCALE_PALETTE, 40, 43, 7, 7, 14, 8, 7, 0, 4, 3, 320, 350}, - /* BW 40x50 */ - {BW40X50, GREYSCALE_PALETTE, 40, 50, 7, 7, 8, 8, 7, 0, 4, 3, 320, 400}, - /* BW 40x60 */ - {BW40X60, GREYSCALE_PALETTE, 40, 60, 7, 7, 8, 8, 7, 0, 4, 3, 320, 480}, - /* BW 80x14 */ - {BW80X14, GREYSCALE_PALETTE, 80, 14, 14, 15, 16, 8, 7, 0, 4, 3, 640, 224}, - /* BW 80x21 */ - {BW80X21, GREYSCALE_PALETTE, 80, 21, 14, 15, 16, 8, 7, 0, 4, 3, 640, 336}, - /* BW 80x28 */ - {BW80X28, GREYSCALE_PALETTE, 80, 28, 12, 13, 14, 8, 7, 0, 4, 3, 640, 392}, - /* BW 80x43 */ - {BW80X43, GREYSCALE_PALETTE, 80, 43, 7, 7, 14, 8, 7, 0, 4, 3, 640, 350}, - /* BW 80x50 */ - {BW80X50, GREYSCALE_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* BW 80x60 */ - {BW80X60, GREYSCALE_PALETTE, 80, 60, 7, 7, 8, 8, 7, 0, 4, 3, 640, 480}, - /* MONO 80x14 */ - {MONO14, MONO_PALETTE, 80, 14, 14, 15, 16, 8, 7, 0, 4, 3, 640, 224}, - /* MONO 80x21 */ - {MONO21, MONO_PALETTE, 80, 21, 14, 15, 16, 8, 7, 0, 4, 3, 640, 336}, - /* MONO 80x28 */ - {MONO28, MONO_PALETTE, 80, 28, 12, 13, 14, 8, 7, 0, 4, 3, 640, 392}, - /* MONO 80x43 */ - {MONO43, MONO_PALETTE, 80, 43, 7, 7, 14, 8, 7, 0, 4, 3, 640, 350}, - /* MONO 80x50 */ - {MONO50, MONO_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* MONO 80x60 */ - {MONO60, MONO_PALETTE, 80, 60, 7, 7, 8, 8, 7, 0, 4, 3, 640, 480}, - /* Magical C4350 Mode */ - {C4350, COLOUR_PALETTE, 80, 50, 7, 7, 8, 8, 7, 0, 4, 3, 640, 400}, - /* Commodore 64 40x25 mode */ - // This is the NTSC aspect ratio... the pixel aspect ratio is about 75:100 due to the - // borders. - {C64_40X25, C64_PALETTE, 40, 25, 0, 7, 8, 8, 0x6e, CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK, 6, 5, 320, 200}, - /* Commodore 128 40x25 mode */ - // The C128 uses the same aspect ratio as the C64 in 40 column mode - {C128_40X25, C64_PALETTE, 40, 25, 0, 7, 8, 8, 0xbd, CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK, 6, 5, 320, 200}, - /* Commodore 128 80x25 mode */ - // But in 80-column mode is a 4:3 CGA style output. - {C128_80X25, COLOUR_PALETTE, 80, 25, 0, 7, 8, 8, 7, CIOLIB_VIDEO_BGBRIGHT|CIOLIB_VIDEO_NOBLINK, 4, 3, 640, 200}, - /* Atari 800 40x24 mode */ - {ATARI_40X24, ATARI_PALETTE, 40, 24, 0, 7, 8, 8, 7, 0, 4, 3, 320, 192}, - /* Atari 800 XEP80 80x25 mode */ - {ATARI_80X25, GREYSCALE_PALETTE, 80, 25, 0, 15, 16, 8, 7, 0, 4, 3, 640, 400}, - /* VESA 21x132 mode */ - {VESA_132X21, COLOUR_PALETTE, 132, 21, 14, 15, 16, 8, 7, 0, 4, 3, 1056, 336}, - /* VESA 25x132 mode */ - {VESA_132X25, COLOUR_PALETTE, 132, 25, 14, 15, 16, 8, 7, 0, 4, 3, 1056, 400}, - /* VESA 28x132 mode */ - {VESA_132X28, COLOUR_PALETTE, 132, 28, 12, 13, 14, 8, 7, 0, 4, 3, 1056, 392}, - /* VESA 30x132 mode */ - {VESA_132X30, COLOUR_PALETTE, 132, 30, 14, 15, 16, 8, 7, 0, 4, 3, 1056, 480}, - /* VESA 34x132 mode */ - {VESA_132X34, COLOUR_PALETTE, 132, 34, 12, 13, 14, 8, 7, 0, 4, 3, 1056, 476}, - /* VESA 43x132 mode */ - {VESA_132X43, COLOUR_PALETTE, 132, 43, 7, 7, 8, 8, 7, 0, 4, 3, 1056, 350}, - /* VESA 50x132 mode */ - {VESA_132X50, COLOUR_PALETTE, 132, 50, 7, 7, 8, 8, 7, 0, 4, 3, 1056, 400}, - /* VESA 60x132 mode */ - {VESA_132X60, COLOUR_PALETTE, 132, 60, 7, 7, 8, 8, 7, 0, 4, 3, 1056, 480}, - /* Awesome modes */ - {ST132X37_16_9, COLOUR_PALETTE, 132, 37, 14, 15, 16, 8, 7, 0, 16, 9, 1056, 600}, - {ST132X52_5_4, COLOUR_PALETTE, 132, 52, 14, 15, 16, 8, 7, 0, 5, 4, 1056, 823}, - /* Stupid modes */ - {VGA80X25, COLOUR_PALETTE, 80, 25, 14, 15, 16, 9, 7, CIOLIB_VIDEO_EXPAND | CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND, 4, 3, 720, 400}, - /* DigitalMon */ - {LCD80X25, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 8, 5, 640, 400}, - /* Custom mode */ - {CIOLIB_MODE_CUSTOM, COLOUR_PALETTE, 80, 25, 14, 15, 16, 8, 7, 0, 0, 0, -1, -1}, -}; - -uint32_t palettes[5][16] = { - /* Mono */ - { 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 - }, - /* Black and White */ - { 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f - }, - /* Colour */ - { 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07, - 0x08, 0x0c, 0x0a, 0x0e, 0x09, 0x0d, 0x0b, 0x0f - }, - /* C64 */ - { 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, - 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f - }, - /* Atari */ - { 0x110, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, - 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111, 0x111 - }, -}; - -struct dac_colors dac_default[TOTAL_DAC_SIZE] = { - /* "System" colours */ - {0, 0, 0}, // Black - {168, 0, 0}, // Red - {0, 168, 0}, // Green - {168, 84, 0}, // Brown - {0, 0, 168}, // Blue - {168, 0, 168}, // Magenta - {0, 168, 168}, // Cyan - {168, 168, 168}, // Light Gray - - {84, 84, 84}, // Dark Gray - {255, 84, 84}, // Light Red - {84, 255, 84}, // Light Green - {255, 255, 84}, // Yellow - {84, 84, 255}, // Light Blue - {255, 84, 255}, // Light Magenta - {84, 255, 255}, // Light Cyan - {255, 255, 255}, // White - - /* XTerm 256 colour palette */ - {0, 0, 0}, {0, 0, 95}, {0, 0, 135}, {0, 0, 175}, - {0, 0, 215}, {0, 0, 255}, {0, 95, 0}, {0, 95, 95}, - {0, 95, 135}, {0, 95, 175}, {0, 95, 215}, {0, 95, 255}, - {0, 135, 0}, {0, 135, 95}, {0, 135, 135}, {0, 135, 175}, - {0, 135, 215}, {0, 135, 255}, {0, 175, 0}, {0, 175, 95}, - {0, 175, 135}, {0, 175, 175}, {0, 175, 215}, {0, 175, 255}, - {0, 215, 0}, {0, 215, 95}, {0, 215, 135}, {0, 215, 175}, - {0, 215, 215}, {0, 215, 255}, {0, 255, 0}, {0, 255, 95}, - {0, 255, 135}, {0, 255, 175}, {0, 255, 215}, {0, 255, 255}, - {95, 0, 0}, {95, 0, 95}, {95, 0, 135}, {95, 0, 175}, - {95, 0, 215}, {95, 0, 255}, {95, 95, 0}, {95, 95, 95}, - {95, 95, 135}, {95, 95, 175}, {95, 95, 215}, {95, 95, 255}, - {95, 135, 0}, {95, 135, 95}, {95, 135, 135}, {95, 135, 175}, - {95, 135, 215}, {95, 135, 255}, {95, 175, 0}, {95, 175, 95}, - {95, 175, 135}, {95, 175, 175}, {95, 175, 215}, {95, 175, 255}, - {95, 215, 0}, {95, 215, 95}, {95, 215, 135}, {95, 215, 175}, - {95, 215, 215}, {95, 215, 255}, {95, 255, 0}, {95, 255, 95}, - {95, 255, 135}, {95, 255, 175}, {95, 255, 215}, {95, 255, 255}, - {135, 0, 0}, {135, 0, 95}, {135, 0, 135}, {135, 0, 175}, - {135, 0, 215}, {135, 0, 255}, {135, 95, 0}, {135, 95, 95}, - {135, 95, 135}, {135, 95, 175}, {135, 95, 215}, {135, 95, 255}, - {135, 135, 0}, {135, 135, 95}, {135, 135, 135}, {135, 135, 175}, - {135, 135, 215}, {135, 135, 255}, {135, 175, 0}, {135, 175, 95}, - {135, 175, 135}, {135, 175, 175}, {135, 175, 215}, {135, 175, 255}, - {135, 215, 0}, {135, 215, 95}, {135, 215, 135}, {135, 215, 175}, - {135, 215, 215}, {135, 215, 255}, {135, 255, 0}, {135, 255, 95}, - {135, 255, 135}, {135, 255, 175}, {135, 255, 215}, {135, 255, 255}, - {175, 0, 0}, {175, 0, 95}, {175, 0, 135}, {175, 0, 175}, - {175, 0, 215}, {175, 0, 255}, {175, 95, 0}, {175, 95, 95}, - {175, 95, 135}, {175, 95, 175}, {175, 95, 215}, {175, 95, 255}, - {175, 135, 0}, {175, 135, 95}, {175, 135, 135}, {175, 135, 175}, - {175, 135, 215}, {175, 135, 255}, {175, 175, 0}, {175, 175, 95}, - {175, 175, 135}, {175, 175, 175}, {175, 175, 215}, {175, 175, 255}, - {175, 215, 0}, {175, 215, 95}, {175, 215, 135}, {175, 215, 175}, - {175, 215, 215}, {175, 215, 255}, {175, 255, 0}, {175, 255, 95}, - {175, 255, 135}, {175, 255, 175}, {175, 255, 215}, {175, 255, 255}, - {215, 0, 0}, {215, 0, 95}, {215, 0, 135}, {215, 0, 175}, - {215, 0, 215}, {215, 0, 255}, {215, 95, 0}, {215, 95, 95}, - {215, 95, 135}, {215, 95, 175}, {215, 95, 215}, {215, 95, 255}, - {215, 135, 0}, {215, 135, 95}, {215, 135, 135}, {215, 135, 175}, - {215, 135, 215}, {215, 135, 255}, {215, 175, 0}, {215, 175, 95}, - {215, 175, 135}, {215, 175, 175}, {215, 175, 215}, {215, 175, 255}, - {215, 215, 0}, {215, 215, 95}, {215, 215, 135}, {215, 215, 175}, - {215, 215, 215}, {215, 215, 255}, {215, 255, 0}, {215, 255, 95}, - {215, 255, 135}, {215, 255, 175}, {215, 255, 215}, {215, 255, 255}, - {255, 0, 0}, {255, 0, 95}, {255, 0, 135}, {255, 0, 175}, - {255, 0, 215}, {255, 0, 255}, {255, 95, 0}, {255, 95, 95}, - {255, 95, 135}, {255, 95, 175}, {255, 95, 215}, {255, 95, 255}, - {255, 135, 0}, {255, 135, 95}, {255, 135, 135}, {255, 135, 175}, - {255, 135, 215}, {255, 135, 255}, {255, 175, 0}, {255, 175, 95}, - {255, 175, 135}, {255, 175, 175}, {255, 175, 215}, {255, 175, 255}, - {255, 215, 0}, {255, 215, 95}, {255, 215, 135}, {255, 215, 175}, - {255, 215, 215}, {255, 215, 255}, {255, 255, 0}, {255, 255, 95}, - {255, 255, 135}, {255, 255, 175}, {255, 255, 215}, {255, 255, 255}, - {8, 8, 8}, {18, 18, 18}, {28, 28, 28}, {38, 38, 38}, - {48, 48, 48}, {58, 58, 58}, {68, 68, 68}, {78, 78, 78}, - {88, 88, 88}, {98, 98, 98}, {108, 108, 108}, {118, 118, 118}, - {128, 128, 128}, {138, 138, 138}, {148, 148, 148}, {158, 158, 158}, - {168, 168, 168}, {178, 178, 178}, {188, 188, 188}, {198, 198, 198}, - {208, 208, 208}, {218, 218, 218}, {228, 228, 228}, {238, 238, 238}, - - /* C64 colours */ - /* Black, White, Red, Cyan, Purple, Green, Blue, Yellow */ - /* Orange, Brown, Lt Red, Dk Grey, Grey, Lt Green, Lt Blue, Lt Grey */ -#if 0 - /* Taken from CTerm source */ - {0x00, 0x00, 0x00}, // Black - {0xFD, 0xFE, 0xFC}, // White - {0xBE, 0x1A, 0x24}, // Red - {0x30, 0xE6, 0xC6}, // Cyan - {0xB4, 0x1A, 0xE2}, // Purple - {0x1F, 0xD2, 0x1E}, // Green - {0x21, 0x1B, 0xAE}, // Blue - {0xDF, 0xF6, 0x0A}, // Yellow - {0xB8, 0x41, 0x04}, // Orange - {0x6A, 0x33, 0x04}, // Brown - {0xFE, 0x4A, 0x57}, // Light Red - {0x42, 0x45, 0x40}, // Dark Grey - {0x70, 0x74, 0x6F}, // Grey - {0x59, 0xFE, 0x59}, // Light Green - {0x5F, 0x53, 0xFE}, // Light Blue - {0xA4, 0xA7, 0xA2}, // Light Grey -#else - /* - * Taken from https://www.pepto.de/projects/colorvic/ - * a much more convincing source. - */ - {0x00, 0x00, 0x00}, - {0xFF, 0xFF, 0xFF}, - {0x81, 0x33, 0x38}, - {0x75, 0xCE, 0xC8}, - {0x8E, 0x3C, 0x97}, - {0x56, 0xAC, 0x4D}, - {0x2E, 0x2C, 0x9B}, - {0xED, 0xF1, 0x71}, - {0x8E, 0x50, 0x29}, - {0x55, 0x38, 0x00}, - {0xC4, 0x6C, 0x71}, - {0x4A, 0x4A, 0x4A}, - {0x7B, 0x7B, 0x7B}, - {0xA9, 0xFF, 0x9F}, - {0x70, 0x6D, 0xEB}, - {0xB2, 0xB2, 0xB2}, -#endif - - /* Atari Colours */ - /* BG, FG */ - {0, 81, 129}, {96, 183, 231}, -}; - -int find_vmode(int mode) -{ - unsigned i; - - for (i = 0; i < NUMMODES; i++) - if (vparams[i].mode == mode) - return i; - - return -1; -} - -struct vstat_vmem *get_vmem(struct video_stats *vs) -{ - vs->vmem->refcount++; - return vs->vmem; -} - -void release_vmem(struct vstat_vmem *vm) -{ - if (vm == NULL) - return; - vm->refcount--; - if (vm->refcount == 0) { - FREE_AND_NULL(vm->vmem); - FREE_AND_NULL(vm); - } -} - -static struct vstat_vmem *new_vmem(int cols, int rows, bool palette) -{ - struct vstat_vmem *ret = malloc(sizeof(struct vstat_vmem)); - - if (ret == NULL) - return ret; - ret->refcount = 1; - ret->vmem = malloc(cols*rows*sizeof(ret->vmem[0])); - if (ret->vmem == NULL) { - free(ret); - return NULL; - } - return ret; -} - -int load_vmode(struct video_stats *vs, int mode) -{ - int i; - - i=find_vmode(mode); - if(i==-1) - return(-1); - release_vmem(vs->vmem); - vs->vmem=new_vmem(vparams[i].cols, vparams[i].rows, vs->flags & VIDMODES_FLAG_PALETTE_VMEM); - if (vs->vmem == NULL) - return -1; - vs->rows=vparams[i].rows; - vs->cols=vparams[i].cols; - vs->curs_start=vparams[i].curs_start; - vs->curs_end=vparams[i].curs_end; - vs->default_curs_start=vparams[i].curs_start; - vs->default_curs_end=vparams[i].curs_end; - vs->curs_blinks=1; - vs->curs_visible=1; - vs->curs_row=1; - vs->curs_col=1; - vs->bright_background=vparams[i].flags & CIOLIB_VIDEO_BGBRIGHT; - vs->no_bright=vparams[i].flags & CIOLIB_VIDEO_NOBRIGHT; - vs->bright_altcharset=vparams[i].flags & CIOLIB_VIDEO_ALTCHARS; - vs->no_blink=vparams[i].flags & CIOLIB_VIDEO_NOBLINK; - vs->blink_altcharset=vparams[i].flags & CIOLIB_VIDEO_BLINKALTCHARS; - if (vparams[i].flags & CIOLIB_VIDEO_EXPAND) - vs->flags |= VIDMODES_FLAG_EXPAND; - else - vs->flags &= ~VIDMODES_FLAG_EXPAND; - if (vparams[i].flags & CIOLIB_VIDEO_LINE_GRAPHICS_EXPAND) - vs->flags |= VIDMODES_FLAG_LINE_GRAPHICS_EXPAND; - else - vs->flags &= ~VIDMODES_FLAG_LINE_GRAPHICS_EXPAND; - if(vs->curs_row < 0) - vs->curs_row=0; - if(vs->curs_row >= vparams[i].rows) - vs->curs_row=vparams[i].rows-1; - if(vs->curs_col < 0) - vs->curs_col=0; - if(vs->curs_col >= vparams[i].cols) - vs->curs_col=vparams[i].cols-1; - memcpy(vs->palette, palettes[vparams[i].palette], sizeof(vs->palette)); - vs->charheight=vparams[i].charheight; - vs->charwidth=vparams[i].charwidth; - vs->mode=mode; - vs->currattr = vparams[i].default_attr; - vs->aspect_width = vparams[i].aspect_width; - vs->aspect_height = vparams[i].aspect_height; - if (vs->aspect_width == 0 || vs->aspect_height == 0) { - vs->aspect_width = vs->scrnwidth; - vs->aspect_height = vs->scrnheight; - } - if (vparams[i].xres > 0) - vs->scrnwidth = vparams[i].xres; - else - vs->scrnwidth = vs->charwidth * vs->cols; - if (vparams[i].yres > 0) - vs->scrnheight = vparams[i].yres; - else - vs->scrnheight = vs->charheight * vs->rows; - vs->forced_font = NULL; - return(0); -} diff --git a/ciolib/vidmodes.h b/ciolib/vidmodes.h deleted file mode 100644 index ebdcf38e74e182ed632cb15cf37d246c082d05a3..0000000000000000000000000000000000000000 --- a/ciolib/vidmodes.h +++ /dev/null @@ -1,142 +0,0 @@ -/* $Id: vidmodes.h,v 1.33 2020/06/27 00:04:45 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _VIDMODES_H_ -#define _VIDMODES_H_ - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" - -#define TOTAL_DAC_SIZE 274 - -/* Entry type for the DAC table. */ -struct dac_colors { - unsigned char red; - unsigned char green; - unsigned char blue; -}; - -struct video_params { - int mode; - int palette; - int cols; - int rows; - int curs_start; - int curs_end; - int charheight; - int charwidth; - int default_attr; - int flags; - int aspect_width; - int aspect_height; - int xres; - int yres; -}; - -struct vstat_vmem { - unsigned refcount; - struct vmem_cell *vmem; -}; - -struct video_stats { - int rows; - int cols; - int curs_row; - int curs_col; - int curs_start; - int curs_end; - int curs_blinks; - int curs_visible; - int default_curs_start; - int default_curs_end; - int mode; - int charheight; - int charwidth; - int bright_background; - int blink; - int curs_blink; - int no_bright; - int no_blink; - int bright_altcharset; - int blink_altcharset; - int currattr; - int scaling; - int scrnwidth; - int scrnheight; - int winwidth; - int winheight; - int aspect_width; - int aspect_height; - uint32_t flags; -#define VIDMODES_FLAG_PALETTE_VMEM 1 -#define VIDMODES_FLAG_EXPAND 2 -#define VIDMODES_FLAG_LINE_GRAPHICS_EXPAND 4 - uint32_t palette[16]; - struct vstat_vmem *vmem; - uint8_t *forced_font; -}; - -enum { - MONO_PALETTE - ,GREYSCALE_PALETTE - ,COLOUR_PALETTE - ,C64_PALETTE - ,ATARI_PALETTE -}; - -extern struct video_params vparams[56]; -#define NUMMODES (sizeof(vparams) / sizeof(struct video_params)) -extern uint32_t palettes[5][16]; -extern struct dac_colors dac_default[TOTAL_DAC_SIZE]; -extern char vga_font_bitmap[4096]; -extern char vga_font_bitmap14[3584]; -extern char vga_font_bitmap8[2048]; - -#ifdef __cplusplus -extern "C" { -#endif -int find_vmode(int mode); -struct vstat_vmem *get_vmem(struct video_stats *vs); -void release_vmem(struct vstat_vmem *vm); -int load_vmode(struct video_stats *vs, int mode); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/win32cio.c b/ciolib/win32cio.c deleted file mode 100644 index e1c4ac8f6bd3eba2f568ff5aaa79ce809daa3922..0000000000000000000000000000000000000000 --- a/ciolib/win32cio.c +++ /dev/null @@ -1,934 +0,0 @@ -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <windows.h> /* INPUT_RECORD, etc. */ -#include <genwrap.h> -#include <stdio.h> /* stdin */ -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ -#endif - -#include "ciolib.h" -#include "vidmodes.h" -#include "win32cio.h" - -struct keyvals { - int VirtualKeyCode - ,Key - ,Shift - ,CTRL - ,ALT; -}; - -CIOLIBEXPORTVAR const struct keyvals keyval[] = -{ - {VK_BACK, 0x08, 0x08, 0x7f, 0x0e00}, - {VK_TAB, 0x09, 0x0f00, 0x9400, 0xa500}, - {VK_RETURN, 0x0d, 0x0d, 0x0a, 0xa600}, - {VK_ESCAPE, 0x1b, 0x1b, 0x1b, 0x0100}, - {VK_SPACE, 0x20, 0x20, 0x0300, 0x20,}, - {'0', '0', ')', 0, 0x8100}, - {'1', '1', '!', 0, 0x7800}, - {'2', '2', '@', 0x0300, 0x7900}, - {'3', '3', '#', 0, 0x7a00}, - {'4', '4', '$', 0, 0x7b00}, - {'5', '5', '%', 0, 0x7c00}, - {'6', '6', '^', 0x1e, 0x7d00}, - {'7', '7', '&', 0, 0x7e00}, - {'8', '8', '*', 0, 0x7f00}, - {'9', '9', '(', 0, 0x8000}, - {'A', 'a', 'A', 0x01, 0x1e00}, - {'B', 'b', 'B', 0x02, 0x3000}, - {'C', 'c', 'C', 0x03, 0x2e00}, - {'D', 'd', 'D', 0x04, 0x2000}, - {'E', 'e', 'E', 0x05, 0x1200}, - {'F', 'f', 'F', 0x06, 0x2100}, - {'G', 'g', 'G', 0x07, 0x2200}, - {'H', 'h', 'H', 0x08, 0x2300}, - {'I', 'i', 'I', 0x09, 0x1700}, - {'J', 'j', 'J', 0x0a, 0x2400}, - {'K', 'k', 'K', 0x0b, 0x2500}, - {'L', 'l', 'L', 0x0c, 0x2600}, - {'M', 'm', 'M', 0x0d, 0x3200}, - {'N', 'n', 'N', 0x0e, 0x3100}, - {'O', 'o', 'O', 0x0f, 0x1800}, - {'P', 'p', 'P', 0x10, 0x1900}, - {'Q', 'q', 'Q', 0x11, 0x1000}, - {'R', 'r', 'R', 0x12, 0x1300}, - {'S', 's', 'S', 0x13, 0x1f00}, - {'T', 't', 'T', 0x14, 0x1400}, - {'U', 'u', 'U', 0x15, 0x1600}, - {'V', 'v', 'V', 0x16, 0x2f00}, - {'W', 'w', 'W', 0x17, 0x1100}, - {'X', 'x', 'X', 0x18, 0x2d00}, - {'Y', 'y', 'Y', 0x19, 0x1500}, - {'Z', 'z', 'Z', 0x1a, 0x2c00}, - {VK_PRIOR, 0x4900, 0x4900, 0x8400, 0x9900}, - {VK_NEXT, 0x5100, 0x5100, 0x7600, 0xa100}, - {VK_END, 0x4f00, 0x4f00, 0x7500, 0x9f00}, - {VK_HOME, 0x4700, 0x4700, 0x7700, 0x9700}, - {VK_LEFT, 0x4b00, 0x4b00, 0x7300, 0x9b00}, - {VK_UP, 0x4800, 0x4800, 0x8d00, 0x9800}, - {VK_RIGHT, 0x4d00, 0x4d00, 0x7400, 0x9d00}, - {VK_DOWN, 0x5000, 0x5000, 0x9100, 0xa000}, - {VK_INSERT, CIO_KEY_IC, CIO_KEY_SHIFT_IC, CIO_KEY_CTRL_IC, CIO_KEY_ALT_IC}, - {VK_DELETE, CIO_KEY_DC, CIO_KEY_SHIFT_DC, CIO_KEY_CTRL_DC, CIO_KEY_CTRL_IC}, - {VK_NUMPAD0, '0', 0x5200, 0x9200, 0}, - {VK_NUMPAD1, '1', 0x4f00, 0x7500, 0}, - {VK_NUMPAD2, '2', 0x5000, 0x9100, 0}, - {VK_NUMPAD3, '3', 0x5100, 0x7600, 0}, - {VK_NUMPAD4, '4', 0x4b00, 0x7300, 0}, - {VK_NUMPAD5, '5', 0x4c00, 0x8f00, 0}, - {VK_NUMPAD6, '6', 0x4d00, 0x7400, 0}, - {VK_NUMPAD7, '7', 0x4700, 0x7700, 0}, - {VK_NUMPAD8, '8', 0x4800, 0x8d00, 0}, - {VK_NUMPAD9, '9', 0x4900, 0x8400, 0}, - {VK_MULTIPLY, '*', '*', 0x9600, 0x3700}, - {VK_ADD, '+', '+', 0x9000, 0x4e00}, - {VK_SUBTRACT, '-', '-', 0x8e00, 0x4a00}, - {VK_DECIMAL, '.', '.', 0x5300, 0x9300}, - {VK_DIVIDE, '/', '/', 0x9500, 0xa400}, - {VK_F1, 0x3b00, 0x5400, 0x5e00, 0x6800}, - {VK_F2, 0x3c00, 0x5500, 0x5f00, 0x6900}, - {VK_F3, 0x3d00, 0x5600, 0x6000, 0x6a00}, - {VK_F4, 0x3e00, 0x5700, 0x6100, 0x6b00}, - {VK_F5, 0x3f00, 0x5800, 0x6200, 0x6c00}, - {VK_F6, 0x4000, 0x5900, 0x6300, 0x6d00}, - {VK_F7, 0x4100, 0x5a00, 0x6400, 0x6e00}, - {VK_F8, 0x4200, 0x5b00, 0x6500, 0x6f00}, - {VK_F9, 0x4300, 0x5c00, 0x6600, 0x7000}, - {VK_F10, 0x4400, 0x5d00, 0x6700, 0x7100}, - {VK_F11, 0x8500, 0x8700, 0x8900, 0x8b00}, - {VK_F12, 0x8600, 0x8800, 0x8a00, 0x8c00}, - {0xdc, '\\', '|', 0x1c, 0x2b00}, - {0xbf, '/', '?', 0, 0x3500}, - {0xbd, '-', '_', 0x1f, 0x8200}, - {0xbb, '=', '+', 0, 0x8300}, - {0xdb, '[', '{', 0x1b, 0x1a00}, - {0xdd, ']', '}', 0x1d, 0x1b00}, - {0xba, ';', ':', 0, 0x2700}, - {0xde, '\'', '"', 0, 0x2800}, - {0xbc, ',', '<', 0, 0x3300}, - {0xbe, '.', '>', 0, 0x3400}, - {0xc0, '`', '~', 0, 0x2900}, - {0, 0, 0, 0, 0} /** END **/ -}; - -/* Mouse related stuff */ -static int domouse=1; -static DWORD last_state=0; -static int LastX=-1, LastY=-1; - -static int modeidx=3; - -#if defined(_DEBUG) -static void dputs(const char* str) -{ - char msg[1024]; - - SAFEPRINTF(msg,"%s\r\n",str); - OutputDebugString(msg); -} -#endif - -static void dprintf(const char* fmt, ...) -{ -#if defined(_DEBUG) - va_list argptr; - char sbuf[1024]; - - va_start(argptr,fmt); - vsnprintf(sbuf,sizeof(sbuf),fmt,argptr); - sbuf[sizeof(sbuf)-1]=0; - va_end(argptr); - dputs(sbuf); -#endif /* _DEBUG */ -} - -static WORD DOStoWinAttr(int newattr) -{ - WORD ret=0; - - if(newattr&0x01) - ret|=FOREGROUND_BLUE; - if(newattr&0x02) - ret|=FOREGROUND_GREEN; - if(newattr&0x04) - ret|=FOREGROUND_RED; - if(newattr&0x08) - ret|=FOREGROUND_INTENSITY; - if(newattr&0x10) - ret|=BACKGROUND_BLUE; - if(newattr&0x20) - ret|=BACKGROUND_GREEN; - if(newattr&0x40) - ret|=BACKGROUND_RED; - if(newattr&0x80) - ret|=BACKGROUND_INTENSITY; - return(ret); -} - -static unsigned char WintoDOSAttr(WORD newattr) -{ - unsigned char ret=0; - - if(newattr&FOREGROUND_BLUE) - ret|=0x01; - if(newattr&FOREGROUND_GREEN) - ret|=0x02; - if(newattr&FOREGROUND_RED) - ret|=0x04; - if(newattr&FOREGROUND_INTENSITY) - ret|=0x08; - if(newattr&BACKGROUND_BLUE) - ret|=0x10; - if(newattr&BACKGROUND_GREEN) - ret|=0x20; - if(newattr&BACKGROUND_RED) - ret|=0x40; - if(newattr&BACKGROUND_INTENSITY) - ret|=0x80; - return(ret); -} - -static int win32_getchcode(WORD code, DWORD state) -{ - int i; - - for(i=0;keyval[i].Key;i++) { - if(keyval[i].VirtualKeyCode==code) { - if(state & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED)) - return(keyval[i].ALT); - if(state & (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)) - return(keyval[i].CTRL); - if((state & (CAPSLOCK_ON)) && isalpha(keyval[i].Key)) { - if(!(state & SHIFT_PRESSED)) - return(keyval[i].Shift); - } - else { - if(state & (SHIFT_PRESSED)) - return(keyval[i].Shift); - } - return(keyval[i].Key); - } - } - return(0); -} - -static int win32_keyboardio(int isgetch) -{ - INPUT_RECORD input; - DWORD num=0; - HANDLE h; - static WORD lastch; - - if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return(0); - - while(1) { - if(lastch) { - if(isgetch) { - BYTE ch; - ch=lastch&0xff; - lastch>>=8; - return(ch); - } - else - return(TRUE); - } - - while(1) { - GetNumberOfConsoleInputEvents(h, &num); - if(num) - break; - if(mouse_trywait()) { - lastch=CIO_KEY_MOUSE; - break; - } - if(isgetch) - SLEEP(1); - else - return(FALSE); - } - - if(lastch) - continue; - - if(!ReadConsoleInput(h, &input, 1, &num) - || !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT)) - continue; - - switch(input.EventType) { - case KEY_EVENT: - -#ifdef DEBUG_KEY_EVENTS - dprintf("KEY_EVENT: KeyDown=%u" - ,input.Event.KeyEvent.bKeyDown); - dprintf(" RepeatCount=%u" - ,input.Event.KeyEvent.wRepeatCount); - dprintf(" VirtualKeyCode=0x%04hX" - ,input.Event.KeyEvent.wVirtualKeyCode); - dprintf(" VirtualScanCode=0x%04hX" - ,input.Event.KeyEvent.wVirtualScanCode); - dprintf(" uChar.AsciiChar=0x%02X (%u)" - ,(BYTE)input.Event.KeyEvent.uChar.AsciiChar - ,(BYTE)input.Event.KeyEvent.uChar.AsciiChar); - dprintf(" ControlKeyState=0x%08lX" - ,input.Event.KeyEvent.dwControlKeyState); -#endif - - if(input.Event.KeyEvent.bKeyDown) { - /* Is this an AltGr key? */ - if(((input.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_CTRL_PRESSED)) == (RIGHT_ALT_PRESSED|LEFT_CTRL_PRESSED)) - && (BYTE)input.Event.KeyEvent.uChar.AsciiChar) { - lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar; - } - /* Is this a modified char? */ - else if((input.Event.KeyEvent.dwControlKeyState & (RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED|RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED|ENHANCED_KEY)) - || (input.Event.KeyEvent.wVirtualKeyCode >= VK_F1 && input.Event.KeyEvent.wVirtualKeyCode <= VK_F24) - || !input.Event.KeyEvent.uChar.AsciiChar) { - lastch=win32_getchcode(input.Event.KeyEvent.wVirtualKeyCode, input.Event.KeyEvent.dwControlKeyState); - } - /* Must be a normal char then! */ - else { - lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar; - } - } else if(input.Event.KeyEvent.wVirtualKeyCode == VK_MENU) - lastch=(BYTE)input.Event.KeyEvent.uChar.AsciiChar; - - break; - case MOUSE_EVENT: - if(domouse) { - if(input.Event.MouseEvent.dwMousePosition.X+1 != LastX || input.Event.MouseEvent.dwMousePosition.Y+1 != LastY) { - LastX=input.Event.MouseEvent.dwMousePosition.X+1; - LastY=input.Event.MouseEvent.dwMousePosition.Y+1; - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,LastX,LastY, -1, -1); - } - if (input.Event.MouseEvent.dwEventFlags == 0) { - if(last_state != input.Event.MouseEvent.dwButtonState) { - switch(input.Event.MouseEvent.dwButtonState ^ last_state) { - case FROM_LEFT_1ST_BUTTON_PRESSED: - if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) - ciomouse_gotevent(CIOLIB_BUTTON_1_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - else - ciomouse_gotevent(CIOLIB_BUTTON_1_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - break; - case FROM_LEFT_2ND_BUTTON_PRESSED: - if(input.Event.MouseEvent.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) - ciomouse_gotevent(CIOLIB_BUTTON_2_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - else - ciomouse_gotevent(CIOLIB_BUTTON_2_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - break; - case RIGHTMOST_BUTTON_PRESSED: - if(input.Event.MouseEvent.dwButtonState & RIGHTMOST_BUTTON_PRESSED) - ciomouse_gotevent(CIOLIB_BUTTON_3_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - else - ciomouse_gotevent(CIOLIB_BUTTON_3_RELEASE,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - break; - } - last_state=input.Event.MouseEvent.dwButtonState; - } - } - else if (input.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED) { - // If the high word of the dwButtonState member contains a positive value... ARGH! - if (input.Event.MouseEvent.dwButtonState & 0x80000000) { - ciomouse_gotevent(CIOLIB_BUTTON_5_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - } - else { - ciomouse_gotevent(CIOLIB_BUTTON_4_PRESS,input.Event.MouseEvent.dwMousePosition.X+1,input.Event.MouseEvent.dwMousePosition.Y+1, -1, -1); - } - } - } - } - } -} - -int win32_kbhit(void) -{ - return(win32_keyboardio(FALSE)); -} - -int win32_getch(void) -{ - int ret=win32_keyboardio(TRUE); - dprintf("win32_getch = 0x%02X (%u)", (BYTE)ret, (BYTE)ret); - return(ret); -} - -#ifndef ENABLE_EXTENDED_FLAGS -#define ENABLE_INSERT_MODE 0x0020 -#define ENABLE_QUICK_EDIT_MODE 0x0040 -#define ENABLE_EXTENDED_FLAGS 0x0080 -#define ENABLE_AUTO_POSITION 0x0100 -#endif - -static DWORD orig_in_conmode=0; -static DWORD orig_out_conmode=0; -static void * win32_suspendbuf=NULL; - -#ifndef CONSOLE_FULLSCREEN_MODE -/* SetConsoleDisplayMode parameter value */ -#define CONSOLE_FULLSCREEN_MODE 1 // Text is displayed in full-screen mode. -#define CONSOLE_WINDOWED_MODE 2 // Text is displayed in a console window. -#endif - -static DWORD orig_display_mode=0; - -/*----------------------------------------------------------------------------- -NT_SetConsoleDisplayMode - Set the console display to fullscreen or windowed. - -Parameters: - hOutputHandle - Output handle of cosole, usually - "GetStdHandle(STD_OUTPUT_HANDLE)" - dwNewMode - 0=windowed, 1=fullscreen - -Returns Values: - TRUE if successful, otherwise FALSE is returned. Call GetLastError() for - extened information. - -Remarks: - This only works on NT based versions of Windows. - - If dwNewMode is anything other than 0 or 1, FALSE is returned and - GetLastError() returns ERROR_INVALID_PARAMETER. - - If dwNewMode specfies the current mode, FALSE is returned and - GetLastError() returns ERROR_INVALID_PARAMETER. Use the (documented) - function GetConsoleDisplayMode() to determine the current display mode. ------------------------------------------------------------------------------*/ -BOOL NT_SetConsoleDisplayMode(HANDLE hOutputHandle, DWORD dwNewMode) -{ - typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, LPDWORD); - SCDMProc_t SetConsoleDisplayMode; - HMODULE hKernel32; - BOOL ret; - const char KERNEL32_NAME[] = "kernel32.dll"; - - hKernel32 = LoadLibrary(KERNEL32_NAME); - if (hKernel32 == NULL) - return FALSE; - - SetConsoleDisplayMode = - (SCDMProc_t)GetProcAddress(hKernel32, "SetConsoleDisplayMode"); - if (SetConsoleDisplayMode == NULL) - { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - ret = FALSE; - } - else - { - DWORD dummy=0; - ret = SetConsoleDisplayMode(hOutputHandle, dwNewMode, &dummy); - dprintf("SetConsoleDisplayMode(%d) returned %d", dwNewMode, ret); - } - - FreeLibrary(hKernel32); - - return ret; -} - -BOOL NT_GetConsoleDisplayMode(DWORD* mode) -{ - typedef BOOL (WINAPI *GCDMProc_t) (LPDWORD); - GCDMProc_t GetConsoleDisplayMode; - HMODULE hKernel32; - BOOL ret; - const char KERNEL32_NAME[] = "kernel32.dll"; - - hKernel32 = LoadLibrary(KERNEL32_NAME); - if (hKernel32 == NULL) - return FALSE; - - GetConsoleDisplayMode = - (GCDMProc_t)GetProcAddress(hKernel32, "GetConsoleDisplayMode"); - if (GetConsoleDisplayMode == NULL) - { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - ret = FALSE; - } - else - { - ret = GetConsoleDisplayMode(mode); - dprintf("GetConsoleDisplayMode() returned %d (%d)", ret, *mode); - } - - FreeLibrary(hKernel32); - - return ret; -} - - -void RestoreDisplayMode(void) -{ - if(orig_display_mode==0) - NT_SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE),CONSOLE_WINDOWED_MODE); -} - -void win32_suspend(void) -{ - HANDLE h; - - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, orig_out_conmode); - if((h=GetStdHandle(STD_INPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, orig_in_conmode); -} - -void win32_resume(void) -{ - DWORD conmode; - HANDLE h; - - conmode=ENABLE_MOUSE_INPUT|ENABLE_EXTENDED_FLAGS; - if((h=GetStdHandle(STD_INPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, conmode); - - conmode=orig_out_conmode; - conmode&=~ENABLE_PROCESSED_OUTPUT; - conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT; - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleMode(h, conmode); -} - -static BOOL WINAPI ControlHandler(unsigned long CtrlType) -{ - return TRUE; -} - -int win32_initciolib(long inmode) -{ - DWORD conmode; - HANDLE h; - CONSOLE_SCREEN_BUFFER_INFO sbuff; - - dprintf("win32_initciolib(%u)", inmode); - if(!isatty(fileno(stdin))) { - if(!AllocConsole()) - return(0); - } - - SetConsoleCtrlHandler(ControlHandler,TRUE); - if((h=GetStdHandle(STD_INPUT_HANDLE))==INVALID_HANDLE_VALUE - || !GetConsoleMode(h, &orig_in_conmode)) - return(0); - conmode=ENABLE_MOUSE_INPUT|ENABLE_EXTENDED_FLAGS; - if(!SetConsoleMode(h, conmode)) - return(0); - - if((h=GetStdHandle(STD_OUTPUT_HANDLE))==INVALID_HANDLE_VALUE - || !GetConsoleMode(h, &orig_out_conmode)) - return(0); - conmode=orig_out_conmode; - conmode&=~ENABLE_PROCESSED_OUTPUT; - conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT; - if(!SetConsoleMode(h, conmode)) - return(0); - - if(GetConsoleScreenBufferInfo(h, &sbuff)==0) { - win32_textmode(C80); // TODO: This likely won't work... - } - else { - /* Switch to closest mode to current screen size */ - unsigned screenwidth = sbuff.srWindow.Right - sbuff.srWindow.Left + 1; - unsigned screenheight = sbuff.srWindow.Bottom - sbuff.srWindow.Top + 1; - if (screenwidth > 0xff) - cio_textinfo.screenwidth = 0xff; - else - cio_textinfo.screenwidth = screenwidth; - if (screenheight > 0xff) - cio_textinfo.screenheight = 0xff; - else - cio_textinfo.screenheight = screenheight; - - if(cio_textinfo.screenwidth>=132) { - if(cio_textinfo.screenheight<25) - win32_textmode(VESA_132X21); - else if(cio_textinfo.screenheight<28) - win32_textmode(VESA_132X25); - else if(cio_textinfo.screenheight<30) - win32_textmode(VESA_132X28); - else if(cio_textinfo.screenheight<34) - win32_textmode(VESA_132X30); - else if(cio_textinfo.screenheight<43) - win32_textmode(VESA_132X34); - else if(cio_textinfo.screenheight<50) - win32_textmode(VESA_132X43); - else if(cio_textinfo.screenheight<60) - win32_textmode(VESA_132X50); - else - win32_textmode(VESA_132X60); - } - else if(cio_textinfo.screenwidth>=80) { - if(cio_textinfo.screenheight<21) - win32_textmode(C80X14); - else if(cio_textinfo.screenheight<25) - win32_textmode(C80X21); - else if(cio_textinfo.screenheight<28) - win32_textmode(C80); - else if(cio_textinfo.screenheight<43) - win32_textmode(C80X28); - else if(cio_textinfo.screenheight<50) - win32_textmode(C80X43); - else if(cio_textinfo.screenheight<60) - win32_textmode(C80X50); - else - win32_textmode(C80X60); - } - else { - if(cio_textinfo.screenheight<21) - win32_textmode(C40X14); - else if(cio_textinfo.screenheight<25) - win32_textmode(C40X21); - else if(cio_textinfo.screenheight<28) - win32_textmode(C40); - else if(cio_textinfo.screenheight<43) - win32_textmode(C40X28); - else if(cio_textinfo.screenheight<50) - win32_textmode(C40X43); - else if(cio_textinfo.screenheight<60) - win32_textmode(C40X50); - else - win32_textmode(C40X60); - } - } - - NT_GetConsoleDisplayMode(&orig_display_mode); - if(inmode==CIOLIB_MODE_CONIO_FULLSCREEN) { - NT_SetConsoleDisplayMode(h,CONSOLE_FULLSCREEN_MODE); - atexit(RestoreDisplayMode); - } - cio_api.mouse=1; - cio_api.options = CONIO_OPT_BRIGHT_BACKGROUND | CONIO_OPT_CUSTOM_CURSOR | CONIO_OPT_SET_TITLE; - return(1); -} - -int win32_hidemouse(void) -{ - /* domouse=0; */ - return(0); -} - -int win32_showmouse(void) -{ - /* domouse=1; */ - return(0); -} - -void win32_textmode(int mode) -{ - int i; - HANDLE h; - COORD sz; - SMALL_RECT rc; -#if 0 - CONSOLE_SCREEN_BUFFER_INFOEX bi; -#endif - - for(i=0;i<NUMMODES;i++) { - if(vparams[i].mode==mode) - modeidx=i; - } - sz.X = cio_textinfo.screenwidth > vparams[modeidx].cols ? cio_textinfo.screenwidth : vparams[modeidx].cols; - sz.Y = cio_textinfo.screenheight > vparams[modeidx].rows ? cio_textinfo.screenheight : vparams[modeidx].rows; - rc.Left=0; - rc.Right=vparams[modeidx].cols-1; - rc.Top=0; - rc.Bottom=vparams[modeidx].rows-1; - - if ((h=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return; - if (!SetConsoleScreenBufferSize(h,sz)) - return; // Note: This fails and returns here with large windows (e.g. width > 255) - if (!SetConsoleWindowInfo(h,TRUE,&rc)) - return; - sz.X=vparams[modeidx].cols; - sz.Y=vparams[modeidx].rows; - if (!SetConsoleScreenBufferSize(h,sz)) - return; - - cio_textinfo.attribute=7; - cio_textinfo.normattr=7; - cio_textinfo.currmode=vparams[modeidx].mode; - cio_textinfo.screenheight=(unsigned char)sz.Y; - cio_textinfo.screenwidth=(unsigned char)sz.X; - cio_textinfo.curx=1; - cio_textinfo.cury=1; - cio_textinfo.winleft=1; - cio_textinfo.wintop=1; - cio_textinfo.winright=cio_textinfo.screenwidth; - cio_textinfo.winbottom=cio_textinfo.screenheight; -#if 0 - if (GetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) { - for (i = 0; i < 16; i++) { - bi.ColorTable[] = RGB(dac_default[palettes[vparams[modeidx]][i]].red, dac_default[palettes[vparams[modeidx].palette][i]].green, dac_default[palettes[vparams[modeidx]][i]].blue); - } - if (SetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) { - cio_api.options |= CONIO_OPT_PALETTE_SETTING; - } - } -#endif -} - -int win32_gettext(int left, int top, int right, int bottom, void* buf) -{ - CHAR_INFO *ci; - int x; - int y; - COORD bs; - COORD bc; - HANDLE h; - SMALL_RECT reg; - unsigned char *bu; - - bu=buf; - bs.X=right-left+1; - bs.Y=bottom-top+1; - bc.X=0; - bc.Y=0; - reg.Left=left-1; - reg.Right=right-1; - reg.Top=top-1; - reg.Bottom=bottom-1; - ci=(CHAR_INFO *)alloca(sizeof(CHAR_INFO)*(bs.X*bs.Y)); - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return 0; // failure - ReadConsoleOutput(h,ci,bs,bc,®); - for(y=0;y<=(bottom-top);y++) { - for(x=0;x<=(right-left);x++) { - bu[((y*bs.X)+x)*2]=ci[(y*bs.X)+x].Char.AsciiChar; - bu[(((y*bs.X)+x)*2)+1]=WintoDOSAttr(ci[(y*bs.X)+x].Attributes); - } - } - return 1; -} - -void win32_gotoxy(int x, int y) -{ - COORD cp; - HANDLE h; - static int curx=-1; - static int cury=-1; - - cio_textinfo.curx=x; - cio_textinfo.cury=y; - cp.X=cio_textinfo.winleft+x-2; - cp.Y=cio_textinfo.wintop+y-2; - if(cp.X != curx || cp.Y != cury) { - if(!hold_update && (h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) { - SetConsoleCursorPosition(h,cp); - curx=cp.X; - cury=cp.Y; - } - } -} - -int win32_puttext(int left, int top, int right, int bottom, void* buf) -{ - CHAR_INFO *ci; - int x; - int y; - HANDLE h; - COORD bs; - COORD bc; - SMALL_RECT reg; - unsigned char *bu; - - bu=buf; - bs.X=right-left+1; - bs.Y=bottom-top+1; - bc.X=0; - bc.Y=0; - reg.Left=left-1; - reg.Right=right-1; - reg.Top=top-1; - reg.Bottom=bottom-1; - ci=(CHAR_INFO *)alloca(sizeof(CHAR_INFO)*(bs.X*bs.Y)); - for(y=0;y<bs.Y;y++) { - for(x=0;x<bs.X;x++) { - ci[(y*bs.X)+x].Char.AsciiChar=bu[((y*bs.X)+x)*2]; - ci[(y*bs.X)+x].Attributes=DOStoWinAttr(bu[(((y*bs.X)+x)*2)+1]); - } - } - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - WriteConsoleOutput(h,ci,bs,bc,®); - return 1; -} - -void win32_setcursortype(int type) -{ - HANDLE h; - CONSOLE_CURSOR_INFO ci; - - switch(type) { - case _NOCURSOR: - ci.bVisible=FALSE; - ci.dwSize=1; - break; - - case _SOLIDCURSOR: - ci.bVisible=TRUE; - ci.dwSize=99; - break; - - default: /* Normal cursor */ - ci.bVisible=TRUE; - ci.dwSize=13; - break; - } - if((h=GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) - SetConsoleCursorInfo(h,&ci); -} - -void win32_settitle(const char *title) -{ - SetConsoleTitle(title); -} - -void win32_copytext(const char *text, size_t buflen) -{ - HGLOBAL clipbuf; - LPWSTR clip; - int new_buflen = MultiByteToWideChar(CP_UTF8, 0, text, buflen, NULL, 0); - - new_buflen = MultiByteToWideChar(CP_UTF8, 0, text, buflen, NULL, 0); - if (new_buflen == 0) { - return; - } - clipbuf=GlobalAlloc(GMEM_MOVEABLE, new_buflen * sizeof(WCHAR)); - if (clipbuf == NULL) { - return; - } - clip=GlobalLock(clipbuf); - if (MultiByteToWideChar(CP_UTF8, 0, text, buflen, clip, new_buflen) != new_buflen) { - GlobalUnlock(clipbuf); - GlobalFree(clipbuf); - return; - } - GlobalUnlock(clipbuf); - if(!OpenClipboard(NULL)) { - GlobalFree(clipbuf); - return; - } - EmptyClipboard(); - if (SetClipboardData(CF_UNICODETEXT, clipbuf) == NULL) { - GlobalFree(clipbuf); - } - CloseClipboard(); -} - -char *win32_getcliptext(void) -{ - HGLOBAL clipbuf; - LPWSTR clip; - char *ret = NULL; - int u8sz; - - if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) - return(NULL); - if (!OpenClipboard(NULL)) - return(NULL); - clipbuf = GetClipboardData(CF_UNICODETEXT); - if (clipbuf != NULL) { - clip = GlobalLock(clipbuf); - if (clip != NULL) { - u8sz = WideCharToMultiByte(CP_UTF8, 0, clip, -1, NULL, 0, NULL, NULL); - if (u8sz > 0) { - ret = (char *)malloc(u8sz); - if(ret != NULL) { - if (WideCharToMultiByte(CP_UTF8, 0, clip, -1, ret, u8sz, NULL, NULL) == 0) - FREE_AND_NULL(ret); - } - } - GlobalUnlock(clipbuf); - } - } - CloseClipboard(); - - return(ret); -} - -void win32_getcustomcursor(int *s, int *e, int *r, int *b, int *v) -{ - CONSOLE_CURSOR_INFO ci; - HANDLE h; - - if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return; - - GetConsoleCursorInfo(h, &ci); - if(s) - *s=100-ci.dwSize; - if(e) - *e=99; - if(r) - *r=100; - if(b) - *b=1; - if(v) - *v=ci.bVisible?1:0; -} - -void win32_setcustomcursor(int s, int e, int r, int b, int v) -{ - CONSOLE_CURSOR_INFO ci; - HANDLE h; - - if((h=GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) - return; - - ci.bVisible=v; - if(e>s) - ci.bVisible=0; - else { - if(r>0) - ci.dwSize=(1+e-s)/r; - else - ci.dwSize=100; - } -} - -int win32_getvideoflags(void) -{ - DWORD mode; - - if(!NT_GetConsoleDisplayMode(&mode)) - return(CIOLIB_VIDEO_BGBRIGHT); - if(mode==CONSOLE_FULLSCREEN_MODE) - return(0); - return(CIOLIB_VIDEO_BGBRIGHT); -} - -int win32_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b) -{ -#if 0 - CONSOLE_SCREEN_BUFFER_INFOEX bi; - - if (entry > 15) - return 0; - - if (!GetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) - return 0; - - bi.ColorTable[entry] = RGB(r >> 8, g >> 8, b >> 8); - if (!SetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &bi)) - return 0; -#endif - - return 1; -} diff --git a/ciolib/win32cio.h b/ciolib/win32cio.h deleted file mode 100644 index 79ad4be9b0f31a243f711d60ee2175a383c16c76..0000000000000000000000000000000000000000 --- a/ciolib/win32cio.h +++ /dev/null @@ -1,68 +0,0 @@ -/* $Id: win32cio.h,v 1.15 2018/07/24 01:10:58 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _WIN32CIO_H_ -#define _WIN32CIO_H_ - -#ifdef __cplusplus -extern "C" { -#endif -int win32_kbhit(void); -int win32_getch(void); -int win32_getmouse(struct cio_mouse_event *mevent); -int win32_hidemouse(void); -int win32_showmouse(void); - -int win32_gettext(int left, int top, int right, int bottom, void*); -void win32_gotoxy(int x, int y); -int win32_puttext(int left, int top, int right, int bottom, void*); -void win32_textmode(int newmode); -void win32_setcursortype(int); -int win32_getch(void); -int win32_kbhit(void); -void win32_settitle(const char *title); -int win32_initciolib(long inmode); -void win32_copytext(const char *text, size_t buflen); -char *win32_getcliptext(void); -void win32_suspend(void); -void win32_resume(void); -void win32_getcustomcursor(int *s, int *e, int *r, int *b, int *v); -void win32_setcustomcursor(int s, int e, int r, int b, int v); -int win32_getvideoflags(void); -int win32_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/x_cio.c b/ciolib/x_cio.c deleted file mode 100644 index 1146a65d4a6512401bc22045095e5508bb74b7c6..0000000000000000000000000000000000000000 --- a/ciolib/x_cio.c +++ /dev/null @@ -1,558 +0,0 @@ -/* $Id: x_cio.c,v 1.56 2020/05/07 20:26:51 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <locale.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <threadwrap.h> -#include <xp_dl.h> - -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "x_cio.h" -#include "x_events.h" - -#define BITMAP_CIOLIB_DRIVER -#include "bitmap_con.h" - -int x_kbhit(void) -{ - fd_set rfd; - struct timeval tv; - - memset(&tv, 0, sizeof(tv)); - FD_ZERO(&rfd); - FD_SET(key_pipe[0], &rfd); - return(select(key_pipe[0]+1, &rfd, NULL, NULL, &tv)==1); -} - -int x_getch(void) -{ - unsigned char ch; - - while(read(key_pipe[0], &ch, 1)!=1); - return(ch); -} - -static void write_event(struct x11_local_event *ev) -{ - size_t sent = 0; - char *buf = (char *)ev; - fd_set wfd; - int rv; - - FD_ZERO(&wfd); - FD_SET(local_pipe[1], &wfd); - - while (sent < sizeof(*ev)) { - select(local_pipe[1]+1, NULL, &wfd, NULL, NULL); - rv = write(local_pipe[1], buf + sent, sizeof(*ev) - sent); - if (rv > 0) - sent += rv; - } -} - -void x_beep(void) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_BEEP; - write_event(&ev); -} - -void x_textmode(int mode) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_SETMODE; - ev.data.mode = mode; - write_event(&ev); - sem_wait(&mode_set); -} - -void x_setname(const char *name) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_SETNAME; - SAFECOPY(ev.data.name, name); - write_event(&ev); -} - -void x_settitle(const char *title) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_SETTITLE; - SAFECOPY(ev.data.title, title); - write_event(&ev); -} - -void x_seticon(const void *icon, unsigned long size) -{ - const uint32_t *icon32 = icon; - struct x11_local_event ev = {0}; - int i; - - ev.data.icon_data = malloc((size*size + 2)*sizeof(ev.data.icon_data[0])); - if (ev.data.icon_data != NULL) { - ev.type=X11_LOCAL_SETICON; - for (i = 0; i < size*size; i++) - ev.data.icon_data[i + 2] = ((icon32[i] & 0xff000000))|((icon32[i] & 0x00ff0000) >> 16)|((icon32[i] & 0x0000ff00))|((icon32[i] & 0x000000ff)<<16); - ev.data.icon_data[0] = size; - ev.data.icon_data[1] = size; - write_event(&ev); - } -} - -void x_copytext(const char *text, size_t buflen) -{ - struct x11_local_event ev = {0}; - - pthread_mutex_lock(©buf_mutex); - FREE_AND_NULL(copybuf); - - copybuf=strdup(text); - if(copybuf) { - ev.type=X11_LOCAL_COPY; - write_event(&ev); - copybuf_format = XA_STRING; - } - pthread_mutex_unlock(©buf_mutex); - return; -} - -char *x_getcliptext(void) -{ - char *ret=NULL; - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_PASTE; - write_event(&ev); - sem_wait(&pastebuf_set); - if(pastebuf!=NULL) - ret=strdup(pastebuf); - sem_post(&pastebuf_used); - return(ret); -} - -int x_get_window_info(int *width, int *height, int *xpos, int *ypos) -{ - if(width) - *width=x11_window_width; - if(height) - *height=x11_window_height; - if(xpos) - *xpos=x11_window_xpos; - if(ypos) - *ypos=x11_window_ypos; - - return(1); -} - -/* Mouse event/keyboard thread */ -void x11_mouse_thread(void *data) -{ - //uint16_t key=((CIO_KEY_MOUSE&0xFF)<<8)|((CIO_KEY_MOUSE>>8)&0xFF); - uint16_t key=CIO_KEY_MOUSE; - - SetThreadName("X11 Mouse"); - while(1) { - if(mouse_wait()) - write(key_pipe[1], &key, 2); - } -} - -int x_init(void) -{ - dll_handle dl; - const char *libnames[]={"X11",NULL}; - Status (*xit)(void); - - /* Ensure we haven't already initialized */ - if(x11_initialized) - return(0); - - /* Set up the pipe for local events */ - if(pipe(local_pipe)) - return(-1); - - /* And the keyboard pipe */ - if(pipe(key_pipe)) - return(-1); - - /* Load X11 functions */ - if((dl=xp_dlopen(libnames,RTLD_LAZY,7))==NULL) - return(-1); - if((xit=xp_dlsym(dl,XInitThreads))!=NULL) - xit(); - if((x11.XChangeGC=xp_dlsym(dl,XChangeGC))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCopyPlane=xp_dlsym(dl,XCopyPlane))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFillRectangle=xp_dlsym(dl,XFillRectangle))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XDrawPoint=xp_dlsym(dl,XDrawPoint))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFlush=xp_dlsym(dl,XFlush))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSync=xp_dlsym(dl,XSync))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XBell=xp_dlsym(dl,XBell))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XLookupString=xp_dlsym(dl,XLookupString))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XNextEvent=xp_dlsym(dl,XNextEvent))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocSizeHints=xp_dlsym(dl,XAllocSizeHints))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetWMNormalHints=xp_dlsym(dl,XSetWMNormalHints))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XResizeWindow=xp_dlsym(dl,XResizeWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XMapWindow=xp_dlsym(dl,XMapWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFree=xp_dlsym(dl,XFree))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFreePixmap=xp_dlsym(dl,XFreePixmap))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreatePixmap=xp_dlsym(dl,XCreatePixmap))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCopyArea=xp_dlsym(dl,XCopyArea))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateBitmapFromData=xp_dlsym(dl,XCreateBitmapFromData))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocColor=xp_dlsym(dl,XAllocColor))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XOpenDisplay=xp_dlsym(dl,XOpenDisplay))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCloseDisplay=xp_dlsym(dl,XCloseDisplay))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateSimpleWindow=xp_dlsym(dl,XCreateSimpleWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateGC=xp_dlsym(dl,XCreateGC))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSelectInput=xp_dlsym(dl,XSelectInput))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XStoreName=xp_dlsym(dl,XStoreName))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetSelectionOwner=xp_dlsym(dl,XGetSelectionOwner))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XConvertSelection=xp_dlsym(dl,XConvertSelection))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetWindowProperty=xp_dlsym(dl,XGetWindowProperty))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XChangeProperty=xp_dlsym(dl,XChangeProperty))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSendEvent=xp_dlsym(dl,XSendEvent))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XPutImage=xp_dlsym(dl,XPutImage))==NULL) { - xp_dlclose(dl); - return(-1); - } -#ifndef XDestroyImage - if((x11.XDestroyImage=xp_dlsym(dl,XDestroyImage))==NULL) { - xp_dlclose(dl); - return(-1); - } -#endif -#ifndef XPutPixel - if((x11.XPutPixel=xp_dlsym(dl,XPutPixel))==NULL) { - xp_dlclose(dl); - return(-1); - } -#endif - if((x11.XCreateImage=xp_dlsym(dl,XCreateImage))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetSelectionOwner=xp_dlsym(dl,XSetSelectionOwner))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetIconName=xp_dlsym(dl,XSetIconName))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSynchronize=xp_dlsym(dl,XSynchronize))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetWindowAttributes=xp_dlsym(dl,XGetWindowAttributes))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocWMHints=xp_dlsym(dl,XAllocWMHints))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetWMProperties=xp_dlsym(dl,XSetWMProperties))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetWMProtocols=xp_dlsym(dl,XSetWMProtocols))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XInternAtom=xp_dlsym(dl,XInternAtom))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFreeColors=xp_dlsym(dl,XFreeColors))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XGetVisualInfo=xp_dlsym(dl,XGetVisualInfo))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateWindow=xp_dlsym(dl,XCreateWindow))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateColormap=xp_dlsym(dl,XCreateColormap))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XAllocClassHint=xp_dlsym(dl,XAllocClassHint))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetForeground=xp_dlsym(dl,XSetForeground))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetLocaleModifiers=xp_dlsym(dl,XSetLocaleModifiers))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XOpenIM=xp_dlsym(dl,XOpenIM))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateIC=xp_dlsym(dl,XCreateIC))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XwcLookupString=xp_dlsym(dl,XwcLookupString))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XSetICFocus=xp_dlsym(dl,XSetICFocus))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFilterEvent=xp_dlsym(dl,XFilterEvent))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XCreateFontCursor=xp_dlsym(dl,XCreateFontCursor))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XDefineCursor=xp_dlsym(dl,XDefineCursor))==NULL) { - xp_dlclose(dl); - return(-1); - } - if((x11.XFreeCursor=xp_dlsym(dl,XFreeCursor))==NULL) { - xp_dlclose(dl); - return(-1); - } - setlocale(LC_ALL, ""); - x11.XSetLocaleModifiers("@im=none"); - - if(sem_init(&pastebuf_set, 0, 0)) { - xp_dlclose(dl); - return(-1); - } - if(sem_init(&pastebuf_used, 0, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - return(-1); - } - if(sem_init(&init_complete, 0, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - return(-1); - } - if(sem_init(&mode_set, 0, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - sem_destroy(&init_complete); - return(-1); - } - - if(pthread_mutex_init(©buf_mutex, 0)) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - sem_destroy(&init_complete); - sem_destroy(&mode_set); - return(-1); - } - - _beginthread(x11_event_thread,1<<16,NULL); - sem_wait(&init_complete); - if(!x11_initialized) { - xp_dlclose(dl); - sem_destroy(&pastebuf_set); - sem_destroy(&pastebuf_used); - sem_destroy(&init_complete); - sem_destroy(&mode_set); - pthread_mutex_destroy(©buf_mutex); - return(-1); - } - _beginthread(x11_mouse_thread,1<<16,NULL); - cio_api.options |= CONIO_OPT_SET_TITLE | CONIO_OPT_SET_NAME | CONIO_OPT_SET_ICON; - return(0); -} - -void x11_drawrect(struct rectlist *data) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_DRAWRECT; - if(x11_initialized) { - ev.data.rect=data; - write_event(&ev); - } -} - -void x11_flush(void) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_FLUSH; - if(x11_initialized) - write_event(&ev); -} - -void x_setscaling(int newval) -{ - if (newval < 1) - newval = 1; - pthread_mutex_lock(&vstatlock); - x_cvstat.scaling = vstat.scaling = newval; - pthread_mutex_unlock(&vstatlock); -} - -int x_getscaling(void) -{ - return x_cvstat.scaling; -} - -int x_mousepointer(enum ciolib_mouse_ptr type) -{ - struct x11_local_event ev = {0}; - - ev.type=X11_LOCAL_MOUSEPOINTER; - if(x11_initialized) { - ev.data.ptr=type; - write_event(&ev); - return 1; - } - return 0; -} diff --git a/ciolib/x_cio.h b/ciolib/x_cio.h deleted file mode 100644 index 158d052d33f59fd9de8aeb056e5cabe3afd26eaf..0000000000000000000000000000000000000000 --- a/ciolib/x_cio.h +++ /dev/null @@ -1,84 +0,0 @@ -/* $Id: x_cio.h,v 1.27 2020/05/07 20:26:51 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __unix__ -#if (defined CIOLIB_IMPORTS) - #undef CIOLIB_IMPORTS -#endif -#if (defined CIOLIB_EXPORTS) - #undef CIOLIB_EXPORTS -#endif - -#include "ciolib.h" -#include "bitmap_con.h" -#include "x_events.h" - -#ifdef __cplusplus -extern "C" { -#endif -int x_puttext(int sx, int sy, int ex, int ey, void *fill); -int x_gettext(int sx, int sy, int ex, int ey, void *fill); -void x_textattr(int attr); -int x_kbhit(void); -void x_delay(long msec); -int x_wherey(void); -int x_wherex(void); -int x_putch(int ch); -void x_gotoxy(int x, int y); -int x_init(void); -void x_initciolib(long inmode); -void x_gettextinfo(struct text_info *info); -void x_setcursortype(int type); -int x_getch(void); -int x_getche(void); -void x_beep(void); -void x_textmode(int mode); -void x_setname(const char *name); -void x_settitle(const char *title); -void x_copytext(const char *text, size_t buflen); -char *x_getcliptext(void); -int x_setfont(int font, int force); -int x_getfont(void); -int x_loadfont(char *filename); -int x_get_window_info(int *width, int *height, int *xpos, int *ypos); -void x11_drawrect(struct rectlist *data); -void x11_flush(void); -void x_setscaling(int newval); -int x_getscaling(void); -void x_seticon(const void *icon, unsigned long size); -int x_mousepointer(enum ciolib_mouse_ptr type); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ciolib/x_events.c b/ciolib/x_events.c deleted file mode 100644 index bd8d1c840a04266be98b09136fb23d84cddb1e5d..0000000000000000000000000000000000000000 --- a/ciolib/x_events.c +++ /dev/null @@ -1,1364 +0,0 @@ -/* - * This file contains ONLY the functions that are called from the - * event thread. - */ - -#include <math.h> -#include <unistd.h> -#include <stdbool.h> - -#include <fcntl.h> -#include <limits.h> -#include <locale.h> -#include <stdio.h> - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/keysym.h> -#include <X11/Xatom.h> -#include <X11/cursorfont.h> - -#include <threadwrap.h> -#include <genwrap.h> -#include <dirwrap.h> - -#include "vidmodes.h" - -#include "ciolib.h" -#define BITMAP_CIOLIB_DRIVER -#include "bitmap_con.h" -#include "link_list.h" -#include "scale.h" -#include "x_events.h" -#include "x_cio.h" -#include "utf8_codepages.h" - -/* - * Exported variables - */ - -int local_pipe[2]; /* Used for passing local events */ -int key_pipe[2]; /* Used for passing keyboard events */ - -struct x11 x11; - -char *copybuf; -pthread_mutex_t copybuf_mutex; -char *pastebuf; -sem_t pastebuf_set; -sem_t pastebuf_used; -sem_t init_complete; -sem_t mode_set; -int x11_window_xpos; -int x11_window_ypos; -int x11_window_width; -int x11_window_height; -int x11_initialized=0; -sem_t event_thread_complete; -int terminate = 0; -Atom copybuf_format; -Atom pastebuf_format; - -/* - * Local variables - */ - -/* Sets the atom to be used for copy/paste operations */ -#define CONSOLE_CLIPBOARD XA_PRIMARY -static Atom WM_DELETE_WINDOW=0; - -static Display *dpy=NULL; -static Window win; -static Cursor curs = None; -static Visual visual; -static bool VisualIsRGB8 = false; -static XImage *xim; -static XIM im; -static XIC ic; -static unsigned int depth=0; -static int xfd; -static unsigned long black; -static unsigned long white; -static int bitmap_width=0; -static int bitmap_height=0; -static int old_scaling = 0; -struct video_stats x_cvstat; -static unsigned long base_pixel; -static int r_shift; -static int g_shift; -static int b_shift; -static struct graphics_buffer *last = NULL; - -/* Array of Graphics Contexts */ -static GC gc; - -static WORD Ascii2Scan[] = { - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x000e, 0x000f, 0xffff, 0xffff, 0xffff, 0x001c, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x0001, 0xffff, 0xffff, 0xffff, 0xffff, - 0x0039, 0x0102, 0x0128, 0x0104, 0x0105, 0x0106, 0x0108, 0x0028, - 0x010a, 0x010b, 0x0109, 0x010d, 0x0033, 0x000c, 0x0034, 0x0035, - 0x000b, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, - 0x0009, 0x000a, 0x0127, 0x0027, 0x0133, 0x000d, 0x0134, 0x0135, - 0x0103, 0x011e, 0x0130, 0x012e, 0x0120, 0x0112, 0x0121, 0x0122, - 0x0123, 0x0117, 0x0124, 0x0125, 0x0126, 0x0132, 0x0131, 0x0118, - 0x0119, 0x0110, 0x0113, 0x011f, 0x0114, 0x0116, 0x012f, 0x0111, - 0x012d, 0x0115, 0x012c, 0x001a, 0x002b, 0x001b, 0x0107, 0x010c, - 0x0029, 0x001e, 0x0030, 0x002e, 0x0020, 0x0012, 0x0021, 0x0022, - 0x0023, 0x0017, 0x0024, 0x0025, 0x0026, 0x0032, 0x0031, 0x0018, - 0x0019, 0x0010, 0x0013, 0x001f, 0x0014, 0x0016, 0x002f, 0x0011, - 0x002d, 0x0015, 0x002c, 0x011a, 0x012b, 0x011b, 0x0129, 0xffff, -}; - -static struct { - WORD base; - WORD shift; - WORD ctrl; - WORD alt; -} ScanCodes[] = { - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 0 */ - { 0x011b, 0x011b, 0x011b, 0xffff }, /* key 1 - Escape key */ - { 0x0231, 0x0221, 0xffff, 0x7800 }, /* key 2 - '1' */ - { 0x0332, 0x0340, 0x0300, 0x7900 }, /* key 3 - '2' - special handling */ - { 0x0433, 0x0423, 0xffff, 0x7a00 }, /* key 4 - '3' */ - { 0x0534, 0x0524, 0xffff, 0x7b00 }, /* key 5 - '4' */ - { 0x0635, 0x0625, 0xffff, 0x7c00 }, /* key 6 - '5' */ - { 0x0736, 0x075e, 0x071e, 0x7d00 }, /* key 7 - '6' */ - { 0x0837, 0x0826, 0xffff, 0x7e00 }, /* key 8 - '7' */ - { 0x0938, 0x092a, 0xffff, 0x7f00 }, /* key 9 - '8' */ - { 0x0a39, 0x0a28, 0xffff, 0x8000 }, /* key 10 - '9' */ - { 0x0b30, 0x0b29, 0xffff, 0x8100 }, /* key 11 - '0' */ - { 0x0c2d, 0x0c5f, 0x0c1f, 0x8200 }, /* key 12 - '-' */ - { 0x0d3d, 0x0d2b, 0xffff, 0x8300 }, /* key 13 - '=' */ - { 0x0e08, 0x0e08, 0x0e7f, 0xffff }, /* key 14 - backspace */ - { 0x0f09, 0x0f00, 0xffff, 0xffff }, /* key 15 - tab */ - { 0x1071, 0x1051, 0x1011, 0x1000 }, /* key 16 - 'Q' */ - { 0x1177, 0x1157, 0x1117, 0x1100 }, /* key 17 - 'W' */ - { 0x1265, 0x1245, 0x1205, 0x1200 }, /* key 18 - 'E' */ - { 0x1372, 0x1352, 0x1312, 0x1300 }, /* key 19 - 'R' */ - { 0x1474, 0x1454, 0x1414, 0x1400 }, /* key 20 - 'T' */ - { 0x1579, 0x1559, 0x1519, 0x1500 }, /* key 21 - 'Y' */ - { 0x1675, 0x1655, 0x1615, 0x1600 }, /* key 22 - 'U' */ - { 0x1769, 0x1749, 0x1709, 0x1700 }, /* key 23 - 'I' */ - { 0x186f, 0x184f, 0x180f, 0x1800 }, /* key 24 - 'O' */ - { 0x1970, 0x1950, 0x1910, 0x1900 }, /* key 25 - 'P' */ - { 0x1a5b, 0x1a7b, 0x1a1b, 0xffff }, /* key 26 - '[' */ - { 0x1b5d, 0x1b7d, 0x1b1d, 0xffff }, /* key 27 - ']' */ - { 0x1c0d, 0x1c0d, 0x1c0a, 0xffff }, /* key 28 - CR */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 29 - control */ - { 0x1e61, 0x1e41, 0x1e01, 0x1e00 }, /* key 30 - 'A' */ - { 0x1f73, 0x1f53, 0x1f13, 0x1f00 }, /* key 31 - 'S' */ - { 0x2064, 0x2044, 0x2004, 0x2000 }, /* key 32 - 'D' */ - { 0x2166, 0x2146, 0x2106, 0x2100 }, /* key 33 - 'F' */ - { 0x2267, 0x2247, 0x2207, 0x2200 }, /* key 34 - 'G' */ - { 0x2368, 0x2348, 0x2308, 0x2300 }, /* key 35 - 'H' */ - { 0x246a, 0x244a, 0x240a, 0x2400 }, /* key 36 - 'J' */ - { 0x256b, 0x254b, 0x250b, 0x2500 }, /* key 37 - 'K' */ - { 0x266c, 0x264c, 0x260c, 0x2600 }, /* key 38 - 'L' */ - { 0x273b, 0x273a, 0xffff, 0xffff }, /* key 39 - ';' */ - { 0x2827, 0x2822, 0xffff, 0xffff }, /* key 40 - ''' */ - { 0x2960, 0x297e, 0xffff, 0xffff }, /* key 41 - '`' */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 42 - left shift */ - { 0x2b5c, 0x2b7c, 0x2b1c, 0xffff }, /* key 43 - '' */ - { 0x2c7a, 0x2c5a, 0x2c1a, 0x2c00 }, /* key 44 - 'Z' */ - { 0x2d78, 0x2d58, 0x2d18, 0x2d00 }, /* key 45 - 'X' */ - { 0x2e63, 0x2e43, 0x2e03, 0x2e00 }, /* key 46 - 'C' */ - { 0x2f76, 0x2f56, 0x2f16, 0x2f00 }, /* key 47 - 'V' */ - { 0x3062, 0x3042, 0x3002, 0x3000 }, /* key 48 - 'B' */ - { 0x316e, 0x314e, 0x310e, 0x3100 }, /* key 49 - 'N' */ - { 0x326d, 0x324d, 0x320d, 0x3200 }, /* key 50 - 'M' */ - { 0x332c, 0x333c, 0xffff, 0xffff }, /* key 51 - ',' */ - { 0x342e, 0x343e, 0xffff, 0xffff }, /* key 52 - '.' */ - { 0x352f, 0x353f, 0xffff, 0xffff }, /* key 53 - '/' */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 54 - right shift - */ - { 0x372a, 0xffff, 0x3772, 0xffff }, /* key 55 - prt-scr - */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 56 - Alt - */ - { 0x3920, 0x3920, 0x3920, 0x3920 }, /* key 57 - space bar */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 58 - caps-lock - */ - { 0x3b00, 0x5400, 0x5e00, 0x6800 }, /* key 59 - F1 */ - { 0x3c00, 0x5500, 0x5f00, 0x6900 }, /* key 60 - F2 */ - { 0x3d00, 0x5600, 0x6000, 0x6a00 }, /* key 61 - F3 */ - { 0x3e00, 0x5700, 0x6100, 0x6b00 }, /* key 62 - F4 */ - { 0x3f00, 0x5800, 0x6200, 0x6c00 }, /* key 63 - F5 */ - { 0x4000, 0x5900, 0x6300, 0x6d00 }, /* key 64 - F6 */ - { 0x4100, 0x5a00, 0x6400, 0x6e00 }, /* key 65 - F7 */ - { 0x4200, 0x5b00, 0x6500, 0x6f00 }, /* key 66 - F8 */ - { 0x4300, 0x5c00, 0x6600, 0x7000 }, /* key 67 - F9 */ - { 0x4400, 0x5d00, 0x6700, 0x7100 }, /* key 68 - F10 */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 69 - num-lock - */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 70 - scroll-lock - */ - { 0x4700, 0x4737, 0x7700, 0xffff }, /* key 71 - home */ - { 0x4800, 0x4838, 0x8d00, 0x9800 }, /* key 72 - cursor up */ - { 0x4900, 0x4939, 0x8400, 0xffff }, /* key 73 - page up */ - { 0x4a2d, 0x4a2d, 0xffff, 0xffff }, /* key 74 - minus sign */ - { 0x4b00, 0x4b34, 0x7300, 0xffff }, /* key 75 - cursor left */ - { 0xffff, 0x4c35, 0xffff, 0xffff }, /* key 76 - center key */ - { 0x4d00, 0x4d36, 0x7400, 0xffff }, /* key 77 - cursor right */ - { 0x4e2b, 0x4e2b, 0xffff, 0xffff }, /* key 78 - plus sign */ - { 0x4f00, 0x4f31, 0x7500, 0xffff }, /* key 79 - end */ - { 0x5000, 0x5032, 0x9100, 0xa000 }, /* key 80 - cursor down */ - { 0x5100, 0x5133, 0x7600, 0xffff }, /* key 81 - page down */ - { CIO_KEY_IC, CIO_KEY_SHIFT_IC, CIO_KEY_CTRL_IC, CIO_KEY_ALT_IC}, /* key 82 - insert */ - { CIO_KEY_DC, CIO_KEY_SHIFT_DC, CIO_KEY_CTRL_DC, CIO_KEY_ALT_IC}, /* key 83 - delete */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 84 - sys key */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 85 */ - { 0xffff, 0xffff, 0xffff, 0xffff }, /* key 86 */ - { 0x8500, 0x5787, 0x8900, 0x8b00 }, /* key 87 - F11 */ - { 0x8600, 0x5888, 0x8a00, 0x8c00 }, /* key 88 - F12 */ -}; - -static void resize_xim(void) -{ - int width = bitmap_width * x_cvstat.scaling; - int height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - if (xim) { - if (width == xim->width - && height == xim->height) { - if (last) { - release_buffer(last); - last = NULL; - } - x11.XFillRectangle(dpy, win, gc, 0, 0, x11_window_width, x11_window_height); - return; - } -#ifdef XDestroyImage - XDestroyImage(xim); -#else - x11.XDestroyImage(xim); -#endif - } - if (last) { - release_buffer(last); - last = NULL; - } - xim = x11.XCreateImage(dpy, &visual, depth, ZPixmap, 0, NULL, width, height, 32, 0); - xim->data=(char *)calloc(1, xim->bytes_per_line*xim->height); - x11.XFillRectangle(dpy, win, gc, 0, 0, x11_window_width, x11_window_height); -} - -/* Swiped from FreeBSD libc */ -static int -my_fls(unsigned long mask) -{ - int bit; - - if (mask == 0) - return (0); - for (bit = 1; mask != 1; bit++) - mask = mask >> 1; - return (bit); -} - -/* Get a connection to the X server and create the window. */ -static int init_window() -{ - XGCValues gcv; - int i; - XWMHints *wmhints; - XClassHint *classhints; - int ret; - int best=-1; - int best_depth=0; - int best_cmap=0; - XVisualInfo template = {0}; - XVisualInfo *vi; - - dpy = x11.XOpenDisplay(NULL); - if (dpy == NULL) { - return(-1); - } - xfd = ConnectionNumber(dpy); - x11.utf8 = x11.XInternAtom(dpy, "UTF8_STRING", False); - x11.targets = x11.XInternAtom(dpy, "TARGETS", False); - - template.screen = DefaultScreen(dpy); - template.class = TrueColor; - vi = x11.XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask, &template, &ret); - for (i=0; i<ret; i++) { - if (vi[i].depth >= best_depth && vi[i].colormap_size >= best_cmap) { - best = i; - best_depth = vi[i].depth; - } - } - if (best != -1) { - visual = *vi[best].visual; - /* - * TODO: Set VisualIsRGB8 if appropriate... - * "appropriate" in this context means it's a sequence of - * unpadded uint32_t values in XXRRGGBB format where XX is - * ignored, and RR, GG, and BB are Red, Green, Blue values - * respectively. - */ - base_pixel = ULONG_MAX; - base_pixel &= ~visual.red_mask; - base_pixel &= ~visual.green_mask; - base_pixel &= ~visual.blue_mask; - r_shift = my_fls(visual.red_mask)-16; - g_shift = my_fls(visual.green_mask)-16; - b_shift = my_fls(visual.blue_mask)-16; - } - else { - fprintf(stderr, "Unable to find TrueColor visual\n"); - x11.XFree(vi); - return -1; - } - x11.XFree(vi); - - /* Allocate black and white */ - black=BlackPixel(dpy, DefaultScreen(dpy)); - white=WhitePixel(dpy, DefaultScreen(dpy)); - - /* Create window, but defer setting a size and GC. */ - XSetWindowAttributes wa = {0}; - wa.colormap = x11.XCreateColormap(dpy, DefaultRootWindow(dpy), &visual, AllocNone); - wa.background_pixel = black; - wa.border_pixel = black; - depth = best_depth; - win = x11.XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, - 640*x_cvstat.scaling, 400*x_cvstat.scaling, 2, depth, InputOutput, &visual, CWColormap | CWBorderPixel | CWBackPixel, &wa); - - classhints=x11.XAllocClassHint(); - if (classhints) - classhints->res_name = classhints->res_class = "CIOLIB"; - wmhints=x11.XAllocWMHints(); - if(wmhints) { - wmhints->initial_state=NormalState; - wmhints->flags = (StateHint/* | IconPixmapHint | IconMaskHint*/ | InputHint); - wmhints->input = True; - x11.XSetWMProperties(dpy, win, NULL, NULL, 0, 0, NULL, wmhints, classhints); - x11.XFree(wmhints); - } - im = x11.XOpenIM(dpy, NULL, "CIOLIB", "CIOLIB"); - if (im != NULL) { - ic = x11.XCreateIC(im, XNClientWindow, win, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, NULL); - if (ic) - x11.XSetICFocus(ic); - } - - if (classhints) - x11.XFree(classhints); - - WM_DELETE_WINDOW = x11.XInternAtom(dpy, "WM_DELETE_WINDOW", False); - - gcv.function = GXcopy; - gcv.foreground = black | 0xff000000; - gcv.background = white; - gcv.graphics_exposures = False; - gc=x11.XCreateGC(dpy, win, GCFunction | GCForeground | GCBackground | GCGraphicsExposures, &gcv); - - x11.XSelectInput(dpy, win, KeyReleaseMask | KeyPressMask | - ExposureMask | ButtonPressMask - | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); - - x11.XStoreName(dpy, win, "SyncConsole"); - x11.XSetWMProtocols(dpy, win, &WM_DELETE_WINDOW, 1); - - return(0); -} - -/* - * Actually maps (shows) the window - */ -static void map_window() -{ - XSizeHints *sh; - int minwidth = bitmap_width; - int minheight = bitmap_height; - - sh = x11.XAllocSizeHints(); - if (sh == NULL) { - fprintf(stderr, "Could not get XSizeHints structure"); - exit(1); - } - - sh->base_width = bitmap_width * x_cvstat.scaling; - sh->base_height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&sh->base_width, &sh->base_height, x_cvstat.aspect_width, x_cvstat.aspect_height); - aspect_correct(&minwidth, &minheight, x_cvstat.aspect_width, x_cvstat.aspect_height); - - sh->min_width = sh->width_inc = sh->min_aspect.x = sh->max_aspect.x = minwidth; - sh->min_height = sh->height_inc = sh->min_aspect.y = sh->max_aspect.y = minheight; - - sh->flags = USSize | PMinSize | PSize | PResizeInc | PAspect; - - x11.XSetWMNormalHints(dpy, win, sh); - x11.XMapWindow(dpy, win); - - x11.XFree(sh); - - return; -} - -/* Resize the window. This function is called after a mode change. */ -static void resize_window() -{ - int width = bitmap_width * x_cvstat.scaling; - int height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - x11.XResizeWindow(dpy, win, width, height); - resize_xim(); - - return; -} - -static void init_mode_internal(int mode) -{ - int oldcols; - - oldcols=x_cvstat.cols; - - pthread_mutex_lock(&blinker_lock); - pthread_mutex_lock(&vstatlock); - if (last) { - release_buffer(last); - last = NULL; - } - bitmap_drv_init_mode(mode, &bitmap_width, &bitmap_height); - - /* Deal with 40 col doubling */ - if(oldcols != vstat.cols) { - if(oldcols == 40) - vstat.scaling /= 2; - if(vstat.cols == 40) - vstat.scaling *= 2; - } - if(vstat.scaling < 1) - vstat.scaling = 1; - - x_cvstat = vstat; - pthread_mutex_unlock(&vstatlock); - pthread_mutex_unlock(&blinker_lock); - map_window(); -} - -static void check_scaling(void) -{ - if (old_scaling != x_cvstat.scaling) { - resize_window(); - old_scaling = x_cvstat.scaling; - } -} - -static int init_mode(int mode) -{ - init_mode_internal(mode); - resize_window(); - bitmap_drv_request_pixels(); - - sem_post(&mode_set); - return(0); -} - -static int video_init() -{ - /* If we are running under X, get a connection to the X server and create - an empty window of size (1, 1). It makes a couple of init functions a - lot easier. */ - if(x_cvstat.scaling<1) - x_setscaling(1); - if(init_window()) - return(-1); - - bitmap_drv_init(x11_drawrect, x11_flush); - - /* Initialize mode 3 (text, 80x25, 16 colors) */ - init_mode_internal(3); - - return(0); -} - -static void -local_draw_rect(struct rectlist *rect) -{ - int x, y, xoff = 0, yoff = 0; - unsigned int r, g, b; - unsigned long pixel; - int cleft; - int cright = -100; - int ctop; - int cbottom = -1; - int idx; - uint32_t last_pixel = 0x55555555; - struct graphics_buffer *source; - - if (bitmap_width != rect->rect.width || bitmap_height != rect->rect.height) { - bitmap_drv_free_rect(rect); - return; - } - - xoff = (x11_window_width - xim->width) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - xim->height) / 2; - if (yoff < 0) - yoff = 0; - - // Scale... - source = do_scale(rect, x_cvstat.scaling, x_cvstat.scaling, x_cvstat.aspect_width, x_cvstat.aspect_height); - bitmap_drv_free_rect(rect); - if (source == NULL) - return; - cleft = source->w; - ctop = source->h; - - xoff = (x11_window_width - source->w) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - source->h) / 2; - if (yoff < 0) - yoff = 0; - - if (last && (last->w != source->w || last->h != source->h)) { - release_buffer(last); - last = NULL; - } - - /* TODO: Translate into local colour depth */ - idx = 0; - - for (y = 0; y < source->h; y++) { - for (x = 0; x < source->w; x++) { - if (last) { - if (last->data[idx] != source->data[idx]) { - if (x < cleft) - cleft = x; - if (x > cright) - cright = x; - if (y < ctop) - ctop = y; - if (y > cbottom) - cbottom = y; - } - else { - idx++; - continue; - } - } - if (VisualIsRGB8) { - pixel = source->data[idx]; - ((uint32_t*)xim->data)[idx] = pixel; - } - else { - if (last_pixel != source->data[idx]) { - last_pixel = source->data[idx]; - r = source->data[idx] >> 16 & 0xff; - g = source->data[idx] >> 8 & 0xff; - b = source->data[idx] & 0xff; - r = (r<<8)|r; - g = (g<<8)|g; - b = (b<<8)|b; - pixel = base_pixel; - if (r_shift >= 0) - pixel |= (r << r_shift) & visual.red_mask; - else - pixel |= (r >> (0-r_shift)) & visual.red_mask; - if (g_shift >= 0) - pixel |= (g << g_shift) & visual.green_mask; - else - pixel |= (g >> (0-g_shift)) & visual.green_mask; - if (b_shift >= 0) - pixel |= (b << b_shift) & visual.blue_mask; - else - pixel |= (b >> (0-b_shift)) & visual.blue_mask; - } -#ifdef XPutPixel - XPutPixel(xim, x, y, pixel); -#else - x11.XPutPixel(xim, x, y, pixel); -#endif - } - idx++; - } - /* This line was changed */ - // TODO: Previously this did one update per display line... - if (last && cright >= 0 && (cbottom != y || y == source->h - 1)) { - x11.XPutImage(dpy, win, gc, xim, cleft, ctop - , cleft + xoff, ctop + yoff - , (cright - cleft + 1), (cbottom - ctop + 1)); - cleft = source->w; - cright = cbottom = -100; - ctop = source->h; - } - } - - if (last == NULL) - x11.XPutImage(dpy, win, gc, xim, 0, 0, xoff, yoff, source->w, source->h); - else - release_buffer(last); - last = source; -} - -static void handle_resize_event(int width, int height) -{ - int newFSH=1; - int newFSW=1; - - aspect_fix(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - newFSH=width / bitmap_width; - newFSW=height / bitmap_height; - if(newFSW<1) - newFSW=1; - if(newFSH<1) - newFSH=1; - if(newFSH<newFSW) - x_setscaling(newFSH); - else - x_setscaling(newFSW); - old_scaling = x_cvstat.scaling; - if(x_cvstat.scaling > 16) - x_setscaling(16); - - /* - * We only need to resize if the width/height are not even multiples, - * or if the two axis don't scale the same way. - * Otherwise, we can simply resend everything - */ - if (newFSH != newFSW) - resize_window(); - else - resize_xim(); - bitmap_drv_request_pixels(); -} - -static void expose_rect(int x, int y, int width, int height) -{ - int sx,sy,ex,ey; - int xoff=0, yoff=0; - - xoff = (x11_window_width - xim->width) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - xim->height) / 2; - if (yoff < 0) - yoff = 0; - - if (xoff > 0 || yoff > 0) { - if (x < xoff || y < yoff || x + width > xoff + xim->width || y + height > yoff + xim->height) { - x11.XFillRectangle(dpy, win, gc, 0, 0, x11_window_width, yoff); - x11.XFillRectangle(dpy, win, gc, 0, yoff, xoff, yoff + xim->height); - x11.XFillRectangle(dpy, win, gc, xoff+xim->width, yoff, x11_window_width, yoff + xim->height); - x11.XFillRectangle(dpy, win, gc, 0, yoff + xim->height, x11_window_width, x11_window_height); - } - } - - sx=(x-xoff)/x_cvstat.scaling; - sy=(y-yoff)/(x_cvstat.scaling); - if (sx < 0) - sx = 0; - if (sy < 0) - sy = 0; - - ex=(x-xoff)+width-1; - ey=(y-yoff)+height-1; - if (ex < 0) - ex = 0; - if (ey < 0) - ey = 0; - if((ex+1)%x_cvstat.scaling) { - ex += x_cvstat.scaling-(ex%x_cvstat.scaling); - } - if((ey+1)%(x_cvstat.scaling)) { - ey += x_cvstat.scaling-(ey%(x_cvstat.scaling)); - } - ex=ex/x_cvstat.scaling; - ey=ey/(x_cvstat.scaling); - - /* Since we're exposing, we *have* to redraw */ - if (last) { - release_buffer(last); - last = NULL; - bitmap_drv_request_some_pixels(sx, sy, ex-sx+1, ey-sy+1); - } - // Do nothing... - if (sx == ex || sy == ey) - return; - bitmap_drv_request_some_pixels(sx, sy, ex-sx+1, ey-sy+1); -} - -static bool -xlat_mouse_xy(int *x, int *y) -{ - int xoff, yoff; - - xoff = (x11_window_width - xim->width) / 2; - if (xoff < 0) - xoff = 0; - yoff = (x11_window_height - xim->height) / 2; - if (yoff < 0) - yoff = 0; - - if (*x < xoff) - return false; - if (*y < yoff) - return false; - *x -= xoff; - *y -= yoff; - if (*x >= xim->width) - return false; - if (*y >= xim->height) - return false; - *x *= x_cvstat.scrnwidth; - *y *= x_cvstat.scrnheight; - *x /= xim->width; - *y /= xim->height; - return true; -} - -static int x11_event(XEvent *ev) -{ - if (x11.XFilterEvent(ev, win)) - return 0; - switch (ev->type) { - case ClientMessage: - if (ev->xclient.format == 32 && ev->xclient.data.l[0] == WM_DELETE_WINDOW) { - uint16_t key=CIO_KEY_QUIT; - write(key_pipe[1], &key, 2); - } - break; - /* Graphics related events */ - case ConfigureNotify: { - int width, height; - - if (x11_window_xpos != ev->xconfigure.x || x11_window_ypos != ev->xconfigure.y) { - x11_window_xpos=ev->xconfigure.x; - x11_window_ypos=ev->xconfigure.y; - } - if (x11_window_width != ev->xconfigure.width || x11_window_height != ev->xconfigure.height) { - x11_window_width=ev->xconfigure.width; - x11_window_height=ev->xconfigure.height; - handle_resize_event(ev->xconfigure.width, ev->xconfigure.height); - break; - } - width = bitmap_width * x_cvstat.scaling; - height = bitmap_height * x_cvstat.scaling; - - aspect_correct(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - if (ev->xconfigure.width != width || ev->xconfigure.height != height) { - // We can't have the size we requested... accept the size we got. - int newFSH=1; - int newFSW=1; - - width = ev->xconfigure.width; - height = ev->xconfigure.height; - aspect_fix(&width, &height, x_cvstat.aspect_width, x_cvstat.aspect_height); - newFSH=width / bitmap_width; - newFSW=height / bitmap_height; - if(newFSW<1) - newFSW=1; - if(newFSH<1) - newFSH=1; - if(newFSH<newFSW) - x_setscaling(newFSH); - else - x_setscaling(newFSW); - old_scaling = x_cvstat.scaling; - if(x_cvstat.scaling > 16) - x_setscaling(16); - - resize_xim(); - bitmap_drv_request_pixels(); - } - break; - } - case NoExpose: - break; - case GraphicsExpose: - expose_rect(ev->xgraphicsexpose.x, ev->xgraphicsexpose.y, ev->xgraphicsexpose.width, ev->xgraphicsexpose.height); - break; - case Expose: - expose_rect(ev->xexpose.x, ev->xexpose.y, ev->xexpose.width, ev->xexpose.height); - break; - - /* Copy/Paste events */ - case SelectionClear: - { - XSelectionClearEvent *req; - - req=&(ev->xselectionclear); - pthread_mutex_lock(©buf_mutex); - if(req->selection==CONSOLE_CLIPBOARD) - FREE_AND_NULL(copybuf); - pthread_mutex_unlock(©buf_mutex); - } - break; - case SelectionNotify: - { - int format; - unsigned long len, bytes_left, dummy; - - if(ev->xselection.selection != CONSOLE_CLIPBOARD) - break; - if(ev->xselection.requestor!=win) - break; - if(ev->xselection.property) { - x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, 0, True, AnyPropertyType, &pastebuf_format, &format, &len, &bytes_left, (unsigned char **)(&pastebuf)); - if(bytes_left > 0 && format==8) { - x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, bytes_left, True, AnyPropertyType, &pastebuf_format, &format, &len, &dummy, (unsigned char **)&pastebuf); - if (x11.utf8 && pastebuf_format == x11.utf8) { - char *opb = pastebuf; - pastebuf = (char *)utf8_to_cp(CIOLIB_ISO_8859_1, (uint8_t *)pastebuf, '?', strlen(pastebuf), NULL); - if (pastebuf == NULL) - pastebuf = opb; - else - x11.XFree(opb); - } - } - else - pastebuf=NULL; - } - else - pastebuf=NULL; - - /* Set paste buffer */ - sem_post(&pastebuf_set); - sem_wait(&pastebuf_used); - if (x11.utf8 && pastebuf_format == x11.utf8) - free(pastebuf); - else - x11.XFree(pastebuf); - pastebuf=NULL; - } - break; - case SelectionRequest: - { - XSelectionRequestEvent *req; - XEvent respond; - Atom supported[3]; - int count = 0; - - req=&(ev->xselectionrequest); - pthread_mutex_lock(©buf_mutex); - if (x11.targets == 0) - x11.targets = x11.XInternAtom(dpy, "TARGETS", False); - respond.xselection.property=None; - if(copybuf!=NULL) { - if(req->target==XA_STRING) { - char *cpstr = utf8_to_cp(CIOLIB_ISO_8859_1, (uint8_t *)copybuf, '?', strlen(copybuf), NULL); - if (cpstr != NULL) { - x11.XChangeProperty(dpy, req->requestor, req->property, XA_STRING, 8, PropModeReplace, (uint8_t *)cpstr, strlen((char *)cpstr)); - respond.xselection.property=req->property; - free(cpstr); - } - } - else if(req->target == x11.utf8) { - x11.XChangeProperty(dpy, req->requestor, req->property, x11.utf8, 8, PropModeReplace, (uint8_t *)copybuf, strlen((char *)copybuf)); - respond.xselection.property=req->property; - } - else if(req->target == x11.targets) { - if (x11.utf8 == 0) - x11.utf8 = x11.XInternAtom(dpy, "UTF8_STRING", False); - - supported[count++] = x11.targets; - supported[count++] = XA_STRING; - if (x11.utf8) - supported[count++] = x11.utf8; - x11.XChangeProperty(dpy, req->requestor, req->property, XA_ATOM, 32, PropModeReplace, (unsigned char *)supported, count); - respond.xselection.property=req->property; - } - } - respond.xselection.requestor=req->requestor; - respond.xselection.selection=req->selection; - respond.xselection.time=req->time; - respond.xselection.target=req->target; - respond.xselection.type=SelectionNotify; - respond.xselection.display=req->display; - x11.XSendEvent(dpy,req->requestor,0,0,&respond); - x11.XFlush(dpy); - pthread_mutex_unlock(©buf_mutex); - } - break; - - /* Mouse Events */ - case MotionNotify: - { - XMotionEvent *me = (XMotionEvent *)ev; - if (!xlat_mouse_xy(&me->x, &me->y)) - break; - int x_res = me->x; - int y_res = me->y; - - me->x /= x_cvstat.charwidth; - me->y /= x_cvstat.charheight; - me->x++; - me->y++; - if(me->x<1) - me->x=1; - if(me->y<1) - me->y=1; - if(me->x>x_cvstat.cols) - me->x=x_cvstat.cols; - if(me->y>x_cvstat.rows+1) - me->y=x_cvstat.rows+1; - ciomouse_gotevent(CIOLIB_MOUSE_MOVE,me->x,me->y, x_res, y_res); - } - break; - case ButtonRelease: - { - XButtonEvent *be = (XButtonEvent *)ev; - if (!xlat_mouse_xy(&be->x, &be->y)) - break; - int x_res = be->x; - int y_res = be->y; - - be->x/=x_cvstat.charwidth; - be->y/=x_cvstat.charheight; - be->x++; - be->y++; - if(be->x<1) - be->x=1; - if(be->y<1) - be->y=1; - if(be->x>x_cvstat.cols) - be->x=x_cvstat.cols; - if(be->y>x_cvstat.rows+1) - be->y=x_cvstat.rows+1; - if (be->button <= 3) { - ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(be->button),be->x,be->y, x_res, y_res); - } - } - break; - case ButtonPress: - { - XButtonEvent *be = (XButtonEvent *)ev; - if (!xlat_mouse_xy(&be->x, &be->y)) - break; - int x_res = be->x; - int y_res = be->y; - - be->x/=x_cvstat.charwidth; - be->y/=x_cvstat.charheight; - be->x++; - be->y++; - if(be->x<1) - be->x=1; - if(be->y<1) - be->y=1; - if(be->x>x_cvstat.cols) - be->x=x_cvstat.cols; - if(be->y>x_cvstat.rows+1) - be->y=x_cvstat.rows+1; - if (be->button <= 5) { - ciomouse_gotevent(CIOLIB_BUTTON_PRESS(be->button),be->x,be->y, x_res, y_res); - } - } - break; - - /* Keyboard Events */ - case KeyPress: - { - static char buf[128]; - static wchar_t wbuf[128]; - KeySym ks; - int nlock = 0; - WORD scan = 0xffff; - Status lus = 0; - int cnt; - int i; - uint8_t ch; - - if (ic) - cnt = x11.XwcLookupString(ic, (XKeyPressedEvent *)ev, wbuf, sizeof(wbuf)/sizeof(wbuf[0]), &ks, &lus); - else { - cnt = x11.XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &ks, NULL); - lus = XLookupKeySym; - } - - switch(lus) { - case XLookupNone: - ks = 0xffff; - break; - case XLookupBoth: - case XLookupChars: - if (lus == XLookupChars || ((ev->xkey.state & (Mod1Mask | ControlMask)) == 0)) { - for (i = 0; i < cnt; i++) { - if (wbuf[i] < 127) - ch = wbuf[i]; - else - ch = cpchar_from_unicode_cpoint(getcodepage(), wbuf[i], 0); - if (ch) { - write(key_pipe[1], &ch, 1); - } - } - break; - } - // Fallthrough - case XLookupKeySym: - switch (ks) { - case XK_Escape: - scan = 1; - goto docode; - - case XK_Tab: - case XK_ISO_Left_Tab: - scan = 15; - goto docode; - - case XK_Return: - case XK_KP_Enter: - scan = 28; - goto docode; - - case XK_Print: - scan = 55; - goto docode; - - case XK_F1: - case XK_F2: - case XK_F3: - case XK_F4: - case XK_F5: - case XK_F6: - case XK_F7: - case XK_F8: - case XK_F9: - case XK_F10: - scan = ks - XK_F1 + 59; - goto docode; - - case XK_KP_7: - nlock = 1; - case XK_Home: - case XK_KP_Home: - scan = 71; - goto docode; - - case XK_KP_8: - nlock = 1; - case XK_Up: - case XK_KP_Up: - scan = 72; - goto docode; - - case XK_KP_9: - nlock = 1; - case XK_Prior: - case XK_KP_Prior: - scan = 73; - goto docode; - - case XK_KP_Subtract: - scan = 74; - goto docode; - - case XK_KP_4: - nlock = 1; - case XK_Left: - case XK_KP_Left: - if (ev->xkey.state & Mod1Mask) { - if (x_cvstat.scaling > 1) - x_cvstat.scaling--; - } - scan = 75; - goto docode; - - case XK_KP_5: - nlock = 1; - case XK_Begin: - case XK_KP_Begin: - scan = 76; - goto docode; - - case XK_KP_6: - nlock = 1; - case XK_Right: - case XK_KP_Right: - scan = 77; - if (ev->xkey.state & Mod1Mask) { - if (x_cvstat.scaling < 7) - x_cvstat.scaling++; - } - goto docode; - - case XK_KP_Add: - scan = 78; - goto docode; - - case XK_KP_1: - nlock = 1; - case XK_End: - case XK_KP_End: - scan = 79; - goto docode; - - case XK_KP_2: - nlock = 1; - case XK_Down: - case XK_KP_Down: - scan = 80; - goto docode; - - case XK_KP_3: - nlock = 1; - case XK_Next: - case XK_KP_Next: - scan = 81; - goto docode; - - case XK_KP_0: - nlock = 1; - case XK_Insert: - case XK_KP_Insert: - scan = 82; - goto docode; - - case XK_KP_Decimal: - nlock = 1; - scan = 83; - goto docode; - - case XK_Delete: - case XK_KP_Delete: - /* scan = flipdelete ? 14 : 83; */ - scan = 83; - goto docode; - - case XK_BackSpace: - /* scan = flipdelete ? 83 : 14; */ - scan = 14; - goto docode; - - case XK_F11: - scan = 87; - goto docode; - case XK_F12: - scan = 88; - goto docode; - - - case XK_KP_Divide: - scan = Ascii2Scan['/']; - goto docode; - - case XK_KP_Multiply: - scan = Ascii2Scan['*']; - goto docode; - - default: - if (ks < ' ' || ks > '~') - break; - scan = Ascii2Scan[ks]; - docode: - if (nlock) - scan |= 0x100; - - if ((scan & ~0x100) > 88) { - scan = 0xffff; - break; - } - - if (ev->xkey.state & Mod1Mask) { - scan = ScanCodes[scan & 0xff].alt; - } else if ((ev->xkey.state & ShiftMask) || (scan & 0x100)) { - scan = ScanCodes[scan & 0xff].shift; - } else if (ev->xkey.state & ControlMask) { - scan = ScanCodes[scan & 0xff].ctrl; - } else - scan = ScanCodes[scan & 0xff].base; - - break; - } - if (scan != 0xffff) { - uint16_t key=scan; - write(key_pipe[1], &key, (scan&0xff)?1:2); - } - break; - } - return(1); - } - default: - break; - } - return(0); -} - -static void x11_terminate_event_thread(void) -{ - terminate = 1; - sem_wait(&event_thread_complete); -} - -static void readev(struct x11_local_event *lev) -{ - fd_set rfd; - int ret; - int rcvd = 0; - char *buf = (char *)lev; - - FD_ZERO(&rfd); - FD_SET(local_pipe[0], &rfd); - - while (rcvd < sizeof(*lev)) { - select(local_pipe[0]+1, &rfd, NULL, NULL, NULL); - ret = read(local_pipe[0], buf+rcvd, sizeof(*lev) - rcvd); - if (ret > 0) - rcvd += ret; - } -} - -void x11_event_thread(void *args) -{ - int x; - int high_fd; - fd_set fdset; - XEvent ev; - static struct timeval tv; - - SetThreadName("X11 Events"); - if(video_init()) { - sem_post(&init_complete); - return; - } - sem_init(&event_thread_complete, 0, 0); - atexit(x11_terminate_event_thread); - - if(local_pipe[0] > xfd) - high_fd=local_pipe[0]; - else - high_fd=xfd; - - x11.XSync(dpy, False); - x11_initialized=1; - sem_post(&init_complete); - for (;!terminate;) { - check_scaling(); - - tv.tv_sec=0; - tv.tv_usec=54925; /* was 54925 (was also 10) */ - - /* - * Handle any events just sitting around... - */ - while (QLength(dpy) > 0) { - x11.XNextEvent(dpy, &ev); - x11_event(&ev); - } - - FD_ZERO(&fdset); - FD_SET(xfd, &fdset); - FD_SET(local_pipe[0], &fdset); - - x = select(high_fd+1, &fdset, 0, 0, &tv); - - switch (x) { - case -1: - /* - * Errno might be wrong, so we just select again. - * This could cause a problem if something really - * was wrong with select.... - */ - - /* perror("select"); */ - break; - case 0: - /* Timeout */ - break; - default: - if (FD_ISSET(xfd, &fdset)) { - // This blocks for the event... - x11.XNextEvent(dpy, &ev); - x11_event(&ev); - // And this reads anything else from the queue. - while (QLength(dpy) > 0) { - x11.XNextEvent(dpy, &ev); - x11_event(&ev); - } - } - if(FD_ISSET(local_pipe[0], &fdset)) { - struct x11_local_event lev; - - readev(&lev); - switch(lev.type) { - case X11_LOCAL_SETMODE: - init_mode(lev.data.mode); - break; - case X11_LOCAL_SETNAME: - x11.XSetIconName(dpy, win, lev.data.name); - x11.XFlush(dpy); - break; - case X11_LOCAL_SETTITLE: - x11.XStoreName(dpy, win, lev.data.title); - x11.XFlush(dpy); - break; - case X11_LOCAL_COPY: - x11.XSetSelectionOwner(dpy, CONSOLE_CLIPBOARD, win, CurrentTime); - break; - case X11_LOCAL_PASTE: - { - Window sowner=None; - - sowner=x11.XGetSelectionOwner(dpy, CONSOLE_CLIPBOARD); - if(sowner==win) { - /* Get your own primary selection */ - if(copybuf==NULL) - pastebuf=NULL; - else { - pastebuf=strdup(copybuf); - pastebuf_format = copybuf_format; - } - /* Set paste buffer */ - sem_post(&pastebuf_set); - sem_wait(&pastebuf_used); - FREE_AND_NULL(pastebuf); - } - else if(sowner!=None) { - x11.XConvertSelection(dpy, CONSOLE_CLIPBOARD, x11.utf8 ? x11.utf8 : XA_STRING, x11.utf8 ? x11.utf8 : XA_STRING, win, CurrentTime); - } - else { - /* Set paste buffer */ - pastebuf=NULL; - sem_post(&pastebuf_set); - sem_wait(&pastebuf_used); - } - } - break; - case X11_LOCAL_DRAWRECT: - local_draw_rect(lev.data.rect); - break; - case X11_LOCAL_FLUSH: - x11.XFlush(dpy); - break; - case X11_LOCAL_BEEP: - x11.XBell(dpy, 100); - break; - case X11_LOCAL_SETICON: { - Atom wmicon = x11.XInternAtom(dpy, "_NET_WM_ICON", False); - if (wmicon) { - x11.XChangeProperty(dpy, win, wmicon, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)lev.data.icon_data, lev.data.icon_data[0] * lev.data.icon_data[1] + 2); - x11.XFlush(dpy); - } - free(lev.data.icon_data); - break; - } - case X11_LOCAL_MOUSEPOINTER: { - unsigned shape = UINT_MAX; - Cursor oc = curs; - switch (lev.data.ptr) { - case CIOLIB_MOUSEPTR_ARROW: - // Use default - break; - case CIOLIB_MOUSEPTR_BAR: - shape = XC_xterm; - break; - } - if (shape == UINT_MAX) - x11.XDefineCursor(dpy, win, None); - else { - curs = x11.XCreateFontCursor(dpy, shape); - x11.XDefineCursor(dpy, win, curs); - } - if (oc != None && oc != curs) - x11.XFreeCursor(dpy, oc); - break; - } - } - } - } - } - x11.XCloseDisplay(dpy); - sem_post(&event_thread_complete); -} diff --git a/ciolib/x_events.h b/ciolib/x_events.h deleted file mode 100644 index eb44f6ce2b190565f4443faf52c793fcb7abeb7d..0000000000000000000000000000000000000000 --- a/ciolib/x_events.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _X_EVENTS_H_ -#define _X_EVENTS_H_ - -#include <X11/Xlib.h> -#include <X11/Xresource.h> -#include <X11/Xutil.h> -#include <X11/keysym.h> -#include <X11/Xatom.h> - -enum x11_local_events { - X11_LOCAL_SETMODE - ,X11_LOCAL_SETNAME - ,X11_LOCAL_SETTITLE - ,X11_LOCAL_COPY - ,X11_LOCAL_PASTE - ,X11_LOCAL_DRAWRECT - ,X11_LOCAL_FLUSH - ,X11_LOCAL_BEEP - ,X11_LOCAL_SETICON - ,X11_LOCAL_MOUSEPOINTER -}; - -struct x11_local_event { - enum x11_local_events type; - union { - int mode; - char name[81]; - char title[81]; - struct rectlist *rect; - unsigned long *icon_data; - enum ciolib_mouse_ptr ptr; - } data; -}; - -/* X functions */ -struct x11 { - int (*XChangeGC) (Display*, GC, unsigned long, XGCValues*); - int (*XCopyPlane) (Display*, Drawable, Drawable, GC, int, int, unsigned int, unsigned int, int, int, unsigned long); - int (*XFillRectangle) (Display*, Drawable, GC, int, int, unsigned int, unsigned int); - int (*XDrawPoint) (Display*, Drawable, GC, int, int); - int (*XFlush) (Display*); - int (*XSync) (Display*, Bool); - int (*XBell) (Display*, int); - int (*XLookupString)(XKeyEvent*, char*, int, KeySym*, XComposeStatus*); - int (*XNextEvent) (Display*, XEvent *); - XSizeHints* (*XAllocSizeHints)(void); - void (*XSetWMNormalHints) (Display*, Window, XSizeHints*); - int (*XResizeWindow)(Display*, Window, unsigned int, unsigned int); - int (*XMapWindow) (Display*, Window); - int (*XFree) (void *data); - int (*XFreePixmap) (Display*, Pixmap); - Pixmap (*XCreatePixmap)(Display*, Drawable, unsigned int, unsigned int, unsigned int); - void (*XCopyArea) (Display*, Drawable, Drawable, GC, int, int, unsigned int, unsigned int, int, int); - Pixmap (*XCreateBitmapFromData) (Display*, Drawable, _Xconst char*, unsigned int, unsigned int); - Status (*XAllocColor) (Display*, Colormap, XColor*); - Display*(*XOpenDisplay) (_Xconst char*); - int (*XCloseDisplay) (Display*); - Window (*XCreateSimpleWindow) (Display*, Window, int, int, unsigned int, unsigned int, unsigned int, unsigned long, unsigned long); - GC (*XCreateGC) (Display*, Drawable, unsigned long, XGCValues*); - int (*XSelectInput) (Display*, Window, long); - int (*XStoreName) (Display*, Window, _Xconst char*); - Window (*XGetSelectionOwner) (Display*, Atom); - int (*XConvertSelection) (Display*, Atom, Atom, Atom, Window, Time); - int (*XGetWindowProperty) (Display*, Window, Atom, long, long, Bool, Atom, Atom*, int*, unsigned long *, unsigned long *, unsigned char **); - int (*XChangeProperty) (Display*, Window, Atom, Atom, int, int, _Xconst unsigned char*, int); - Status (*XSendEvent) (Display*, Window, Bool, long, XEvent*); - XImage* (*XCreateImage) (Display *, Visual *, unsigned int, int, int, char *,unsigned int, unsigned int, int, int); -#ifndef XPutPixel - void (*XPutPixel) (XImage*,int,int,unsigned long); -#endif - int (*XPutImage) (Display*, Drawable, GC, XImage *, int,int,int,int,unsigned int,unsigned int); -#ifndef XDestroyImage - void (*XDestroyImage)(XImage*); -#endif - int (*XSetSelectionOwner) (Display*, Atom, Window, Time); - int (*XSetIconName) (Display*, Window, _Xconst char *); - int (*XSynchronize) (Display*, Bool); - Status (*XGetWindowAttributes) (Display*,Window,XWindowAttributes*); - XWMHints* (*XAllocWMHints) (void); - void (*XSetWMProperties) (Display*, Window, XTextProperty*, XTextProperty*, char**, int, XSizeHints*, XWMHints*, XClassHint*); - Status (*XSetWMProtocols) (Display*, Window, Atom *, int); - Atom (*XInternAtom) (Display *, char *, Bool); - int (*XFreeColors) (Display*, Colormap, unsigned long *, int, unsigned long); - XVisualInfo *(*XGetVisualInfo)(Display *display, long vinfo_mask, XVisualInfo *vinfo_template, int *nitems_return); - Window (*XCreateWindow)(Display *display, Window parent, int x, int y, unsigned int width, unsigned int height, unsigned int border_width, int depth, - unsigned int class, Visual *visual, unsigned long valuemask, XSetWindowAttributes *attributes); - Colormap (*XCreateColormap)(Display *display, Window w, Visual *visual, int alloc); - XClassHint *(*XAllocClassHint)(void); - int (*XSetForeground)(Display *display, GC gc, unsigned long foreground); - char *(*XSetLocaleModifiers)(char *modifier_list); - XIM (*XOpenIM)(Display *display, XrmDatabase db, char *res_name, char *res_class); - XIC (*XCreateIC)(XIM im, ...); - int (*XwcLookupString)(XIC ic, XKeyPressedEvent *event, wchar_t *buffer_return, int wchars_buffer, KeySym *keysym_return, Status *status_return); - void (*XSetICFocus)(XIC ic); - Bool (*XFilterEvent)(XEvent *event, Window w); - Cursor (*XCreateFontCursor)(Display *display, unsigned int shape); - int (*XDefineCursor)(Display *display, Window w, Cursor cursor); - int (*XFreeCursor)(Display *display, Cursor cursor); - Atom utf8; - Atom targets; -}; - -extern int local_pipe[2]; /* Used for passing local events */ -extern int key_pipe[2]; /* Used for passing keyboard events */ - -extern struct x11 x11; - -extern char *copybuf; -extern pthread_mutex_t copybuf_mutex; -extern char *pastebuf; -extern sem_t pastebuf_set; -extern sem_t pastebuf_used; -extern Atom copybuf_format; -extern Atom pastebuf_format; -extern sem_t init_complete; -extern sem_t mode_set; -extern sem_t event_thread_complete; -extern int terminate; -extern int x11_window_xpos; -extern int x11_window_ypos; -extern int x11_window_width; -extern int x11_window_height; -extern int x11_initialized; -extern struct video_stats x_cvstat; - -void x11_event_thread(void *args); - -#endif diff --git a/ciolib/xbr.c b/ciolib/xbr.c deleted file mode 100644 index a7f02ed6e36332dc04aee59226c883b407d537e4..0000000000000000000000000000000000000000 --- a/ciolib/xbr.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * Copyright (c) 2011, 2012 Hyllian/Jararaca <sergiogdb@gmail.com> - * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com> - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * XBR Filter is used for depixelization of image. - * This is based on Hyllian's xBR shader. - * - * @see https://forums.libretro.com/t/xbr-algorithm-tutorial/123 - * @see https://github.com/yoyofr/iFBA/blob/master/fba_src/src/intf/video/scalers/xbr.cpp - */ - -#include <inttypes.h> -#include <stdlib.h> -#include "scale.h" - -#define LB_MASK 0x00FEFEFE -#define RED_BLUE_MASK 0x00FF00FF -#define GREEN_MASK 0x0000FF00 - -#ifdef PI -#undef PI -#endif - -static uint32_t pixel_diff(uint32_t x, uint32_t y) -{ -#define YMASK 0xff0000 -#define UMASK 0x00ff00 -#define VMASK 0x0000ff -#define ABSDIFF(a,b) (abs((int)(a)-(int)(b))) - - uint32_t yuv1 = r2y[x & 0xffffff]; - - uint32_t yuv2 = r2y[y & 0xffffff]; - - return (ABSDIFF(yuv1 & YMASK, yuv2 & YMASK) >> 16) + - (ABSDIFF(yuv1 & UMASK, yuv2 & UMASK) >> 8) + - ABSDIFF(yuv1 & VMASK, yuv2 & VMASK); -} - -#define ALPHA_BLEND_128_W(a, b) ((((a) & LB_MASK) >> 1) + (((b) & LB_MASK) >> 1)) -#define ALPHA_BLEND_BASE(a, b, m, s) ( (RED_BLUE_MASK & (((a) & RED_BLUE_MASK) + (((((b) & RED_BLUE_MASK) - ((a) & RED_BLUE_MASK)) * (m)) >> (s)))) \ - | (GREEN_MASK & (((a) & GREEN_MASK) + (((((b) & GREEN_MASK) - ((a) & GREEN_MASK)) * (m)) >> (s))))) -#define ALPHA_BLEND_32_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 3) -#define ALPHA_BLEND_64_W(a, b) ALPHA_BLEND_BASE(a, b, 1, 2) -#define ALPHA_BLEND_192_W(a, b) ALPHA_BLEND_BASE(a, b, 3, 2) -#define ALPHA_BLEND_224_W(a, b) ALPHA_BLEND_BASE(a, b, 7, 3) - -#define df(A, B) pixel_diff(A, B) -#define eq(A, B) (df(A, B) < 155) - -#define FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \ - N0, N1, N2, N3) do { \ - if (PE != PH && PE != PF) { \ - const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \ - const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \ - if (e <= i) { \ - const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \ - if ((e < i) && ((!eq(PF,PB) && !eq(PH,PD)) || (eq(PE,PI) \ - && (!eq(PF,I4) && !eq(PH,I5))) \ - || eq(PE,PG) || eq(PE,PC))) { \ - const unsigned ke = df(PF,PG); \ - const unsigned ki = df(PH,PC); \ - const int left = ke<<1 <= ki && PE != PG && PD != PG; \ - const int up = ke >= ki<<1 && PE != PC && PB != PC; \ - if (left && up) { \ - E[N3] = ALPHA_BLEND_224_W(E[N3], px); \ - E[N2] = ALPHA_BLEND_64_W( E[N2], px); \ - E[N1] = E[N2]; \ - } else if (left) { \ - E[N3] = ALPHA_BLEND_192_W(E[N3], px); \ - E[N2] = ALPHA_BLEND_64_W( E[N2], px); \ - } else if (up) { \ - E[N3] = ALPHA_BLEND_192_W(E[N3], px); \ - E[N1] = ALPHA_BLEND_64_W( E[N1], px); \ - } else { /* diagonal */ \ - E[N3] = ALPHA_BLEND_128_W(E[N3], px); \ - } \ - } else { \ - E[N3] = ALPHA_BLEND_128_W(E[N3], px); \ - } \ - } \ - } \ -} while (0) - -#define FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \ - N0, N1, N2, N3, N4, N5, N6, N7, N8) do { \ - if (PE != PH && PE != PF) { \ - const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \ - const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \ - if (e <= i) { \ - const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \ - if (e < i && ((!eq(PF,PB) && !eq(PF,PC)) || (!eq(PH,PD) && !eq(PH,PG)) || (eq(PE,PI) \ - && ((!eq(PF,F4) && !eq(PF,I4)) || (!eq(PH,H5) && !eq(PH,I5)))) \ - || eq(PE,PG) || eq(PE,PC))) { \ - const unsigned ke = df(PF,PG); \ - const unsigned ki = df(PH,PC); \ - const int left = ke<<1 <= ki && PE != PG && PD != PG; \ - const int up = ke >= ki<<1 && PE != PC && PB != PC; \ - if (left && up) { \ - E[N7] = ALPHA_BLEND_192_W(E[N7], px); \ - E[N6] = ALPHA_BLEND_64_W( E[N6], px); \ - E[N5] = E[N7]; \ - E[N2] = E[N6]; \ - E[N8] = px; \ - } else if (left) { \ - E[N7] = ALPHA_BLEND_192_W(E[N7], px); \ - E[N5] = ALPHA_BLEND_64_W( E[N5], px); \ - E[N6] = ALPHA_BLEND_64_W( E[N6], px); \ - E[N8] = px; \ - } else if (up) { \ - E[N5] = ALPHA_BLEND_192_W(E[N5], px); \ - E[N7] = ALPHA_BLEND_64_W( E[N7], px); \ - E[N2] = ALPHA_BLEND_64_W( E[N2], px); \ - E[N8] = px; \ - } else { /* diagonal */ \ - E[N8] = ALPHA_BLEND_224_W(E[N8], px); \ - E[N5] = ALPHA_BLEND_32_W( E[N5], px); \ - E[N7] = ALPHA_BLEND_32_W( E[N7], px); \ - } \ - } else { \ - E[N8] = ALPHA_BLEND_128_W(E[N8], px); \ - } \ - } \ - } \ -} while (0) - -#define FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, \ - N15, N14, N11, N3, N7, N10, N13, N12, N9, N6, N2, N1, N5, N8, N4, N0) do { \ - if (PE != PH && PE != PF) { \ - const unsigned e = df(PE,PC) + df(PE,PG) + df(PI,H5) + df(PI,F4) + (df(PH,PF)<<2); \ - const unsigned i = df(PH,PD) + df(PH,I5) + df(PF,I4) + df(PF,PB) + (df(PE,PI)<<2); \ - if (e <= i) { \ - const unsigned px = df(PE,PF) <= df(PE,PH) ? PF : PH; \ - if (e < i && ((!eq(PF,PB) && !eq(PH,PD)) || (eq(PE,PI) \ - && (!eq(PF,I4) && !eq(PH,I5))) \ - || eq(PE,PG) || eq(PE,PC))) { \ - const unsigned ke = df(PF,PG); \ - const unsigned ki = df(PH,PC); \ - const int left = ke<<1 <= ki && PE != PG && PD != PG; \ - const int up = ke >= ki<<1 && PE != PC && PB != PC; \ - if (left && up) { \ - E[N13] = ALPHA_BLEND_192_W(E[N13], px); \ - E[N12] = ALPHA_BLEND_64_W( E[N12], px); \ - E[N15] = E[N14] = E[N11] = px; \ - E[N10] = E[N3] = E[N12]; \ - E[N7] = E[N13]; \ - } else if (left) { \ - E[N11] = ALPHA_BLEND_192_W(E[N11], px); \ - E[N13] = ALPHA_BLEND_192_W(E[N13], px); \ - E[N10] = ALPHA_BLEND_64_W( E[N10], px); \ - E[N12] = ALPHA_BLEND_64_W( E[N12], px); \ - E[N14] = px; \ - E[N15] = px; \ - } else if (up) { \ - E[N14] = ALPHA_BLEND_192_W(E[N14], px); \ - E[N7 ] = ALPHA_BLEND_192_W(E[N7 ], px); \ - E[N10] = ALPHA_BLEND_64_W( E[N10], px); \ - E[N3 ] = ALPHA_BLEND_64_W( E[N3 ], px); \ - E[N11] = px; \ - E[N15] = px; \ - } else { /* diagonal */ \ - E[N11] = ALPHA_BLEND_128_W(E[N11], px); \ - E[N14] = ALPHA_BLEND_128_W(E[N14], px); \ - E[N15] = px; \ - } \ - } else { \ - E[N15] = ALPHA_BLEND_128_W(E[N15], px); \ - } \ - } \ - } \ -} while (0) - -#define CLAMP(x) do { \ - if (x < 0) \ - x = 0; \ - else if (x > 255) \ - x = 255; \ -} while(0) - -void -xbr_filter(uint32_t *data, uint32_t *out, int width, int height, int n) -{ - int x, y; - const int nl = width * n; - const int nl1 = nl + nl; - const int nl2 = nl1 + nl; - - for (y = 0; y < height; y++) { - - uint32_t *E = out + y * width * n * n; - const uint32_t *sa2 = (data + y * width - 2); /* center */ - const uint32_t *sa1 = sa2 - (width); /* up x1 */ - const uint32_t *sa0 = sa1 - (width); /* up x2 */ - const uint32_t *sa3 = sa2 + (width); /* down x1 */ - const uint32_t *sa4 = sa3 + (width); /* down x2 */ - - if (y <= 1) { - sa0 = sa1; - if (y == 0) { - sa0 = sa1 = sa2; - } - } - - if (y >= height - 2) { - sa4 = sa3; - if (y == height - 1) { - sa4 = sa3 = sa2; - } - } - - for (x = 0; x < width; x++) { - const uint32_t B1 = sa0[2]; - const uint32_t PB = sa1[2]; - const uint32_t PE = sa2[2]; - const uint32_t PH = sa3[2]; - const uint32_t H5 = sa4[2]; - - const int pprev = 2 - (x > 0); - const uint32_t A1 = sa0[pprev]; - const uint32_t PA = sa1[pprev]; - const uint32_t PD = sa2[pprev]; - const uint32_t PG = sa3[pprev]; - const uint32_t G5 = sa4[pprev]; - - const int pprev2 = pprev - (x > 1); - const uint32_t A0 = sa1[pprev2]; - const uint32_t D0 = sa2[pprev2]; - const uint32_t G0 = sa3[pprev2]; - - const int pnext = 3 - (x == width - 1); - const uint32_t C1 = sa0[pnext]; - const uint32_t PC = sa1[pnext]; - const uint32_t PF = sa2[pnext]; - const uint32_t PI = sa3[pnext]; - const uint32_t I5 = sa4[pnext]; - - const int pnext2 = pnext + 1 - (x >= width - 2); - const uint32_t C4 = sa1[pnext2]; - const uint32_t F4 = sa2[pnext2]; - const uint32_t I4 = sa3[pnext2]; - - if (n == 2) { - E[0] = E[1] = // 0, 1 - E[nl] = E[nl + 1] = PE; // 2, 3 - - FILT2(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, nl, nl+1); - FILT2(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl, 0, nl+1, 1); - FILT2(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl+1, nl, 1, 0); - FILT2(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 1, nl+1, 0, nl); - } else if (n == 3) { - E[0] = E[1] = E[2] = // 0, 1, 2 - E[nl] = E[nl+1] = E[nl+2] = // 3, 4, 5 - E[nl1] = E[nl1+1] = E[nl1+2] = PE; // 6, 7, 8 - - FILT3(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, 0, 1, 2, nl, nl+1, nl+2, nl1, nl1+1, nl1+2); - FILT3(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, nl1, nl, 0, nl1+1, nl+1, 1, nl1+2, nl+2, 2); - FILT3(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, nl1+2, nl1+1, nl1, nl+2, nl+1, nl, 2, 1, 0); - FILT3(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, 2, nl+2, nl1+2, 1, nl+1, nl1+1, 0, nl, nl1); - } else if (n == 4) { - E[0] = E[1] = E[2] = E[3] = // 0, 1, 2, 3 - E[nl] = E[nl+1] = E[nl+2] = E[nl+3] = // 4, 5, 6, 7 - E[nl1] = E[nl1+1] = E[nl1+2] = E[nl1+3] = // 8, 9, 10, 11 - E[nl2] = E[nl2+1] = E[nl2+2] = E[nl2+3] = PE; // 12, 13, 14, 15 - - FILT4(PE, PI, PH, PF, PG, PC, PD, PB, PA, G5, C4, G0, D0, C1, B1, F4, I4, H5, I5, A0, A1, nl2+3, nl2+2, nl1+3, 3, nl+3, nl1+2, nl2+1, nl2, nl1+1, nl+2, 2, 1, nl+1, nl1, nl, 0); - FILT4(PE, PC, PF, PB, PI, PA, PH, PD, PG, I4, A1, I5, H5, A0, D0, B1, C1, F4, C4, G5, G0, 3, nl+3, 2, 0, 1, nl+2, nl1+3, nl2+3, nl1+2, nl+1, nl, nl1, nl1+1, nl2+2, nl2+1, nl2); - FILT4(PE, PA, PB, PD, PC, PG, PF, PH, PI, C1, G0, C4, F4, G5, H5, D0, A0, B1, A1, I4, I5, 0, 1, nl, nl2, nl1, nl+1, 2, 3, nl+2, nl1+1, nl2+1, nl2+2, nl1+2, nl+3, nl1+3, nl2+3); - FILT4(PE, PG, PD, PH, PA, PI, PB, PF, PC, A0, I5, A1, B1, I4, F4, H5, G5, D0, G0, C1, C4, nl2, nl1, nl2+1, nl2+3, nl2+2, nl1+1, nl, 0, nl+1, nl1+2, nl1+3, nl+3, nl+2, 1, 2, 3); - } - - sa0 += 1; - sa1 += 1; - sa2 += 1; - sa3 += 1; - sa4 += 1; - - E += n; - } - } -} diff --git a/ciolib/xbr.h b/ciolib/xbr.h deleted file mode 100644 index c8c32aeb647a5f3ab1410368cd7a02cb5f9589c2..0000000000000000000000000000000000000000 --- a/ciolib/xbr.h +++ /dev/null @@ -1,4 +0,0 @@ -#include <inttypes.h> - -void xbr_filter(uint32_t *data, uint32_t *out, int width, int height, int n); - diff --git a/comio/CMakeLists.txt b/comio/CMakeLists.txt deleted file mode 100644 index 5212bed571b4d1d9b4ab6b898f551c608e7090cb..0000000000000000000000000000000000000000 --- a/comio/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -project (COMIO C) - -cmake_minimum_required(VERSION 3.11) - -set(SOURCE - comio.c -) - -set(HEADER - comio.h -) - -if(WIN32) - list(APPEND SOURCE comio_win32.c) -else() - list(APPEND SOURCE comio_nix.c) -endif() - -add_library(comio OBJECT ${SOURCE}) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_compile_definitions(comio PRIVATE SPEED_MACROS_ONLY) -endif() -target_include_directories(comio PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(comio xpdev) diff --git a/comio/comio.c b/comio/comio.c deleted file mode 100644 index 2901527a62088519b3374de53c09f85740792290..0000000000000000000000000000000000000000 --- a/comio/comio.c +++ /dev/null @@ -1,72 +0,0 @@ -/* comio.c */ - -/* Synchronet Serial Communications I/O Library Common Functions */ - -/* $Id: comio.c,v 1.4 2020/06/26 19:33:08 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "comio.h" -#include "genwrap.h" /* msclock */ - -size_t comReadBuf(COM_HANDLE handle, char* buf, size_t buflen, const char* terminators, int timeout) -{ - BYTE ch; - size_t len=0; - msclock_t start=msclock(); - - while(len < buflen) { - if(!comReadByte(handle, &ch)) { - if(msclock()-start >= timeout) - break; - YIELD(); - continue; - } - if(len && terminators!=NULL && strchr(terminators, ch)!=NULL) - break; - buf[len++]=ch; - } - - return len; -} - -size_t comReadLine(COM_HANDLE handle, char* buf, size_t buflen, int timeout) -{ - size_t len; - - len=comReadBuf(handle, buf, buflen-1, "\n", timeout); - - buf[len]=0; - - return len; -} - diff --git a/comio/comio.h b/comio/comio.h deleted file mode 100644 index 557381ba28d52fa5710637be26b19f82d1ec2f09..0000000000000000000000000000000000000000 --- a/comio/comio.h +++ /dev/null @@ -1,142 +0,0 @@ -/* comio.h */ - -/* Synchronet Serial Communications (COM) I/O Library */ - -/* $Id: comio.h,v 1.15 2020/06/26 19:56:48 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _COMIO_H -#define _COMIO_H - -#include <gen_defs.h> /* BOOL */ - -#define COM_ERROR -1 - -#ifdef _WIN32 - #if defined(COMIO_IMPORTS) || defined(COMIO_EXPORTS) - #if defined(COMIO_IMPORTS) - #define COMIOEXPORT __declspec( dllimport ) - #else - #define COMIOEXPORT __declspec( dllexport ) - #endif - #else /* self-contained executable */ - #define COMIOEXPORT - #endif -#else - #define COMIOEXPORT -#endif - -#ifdef _WIN32 - #include <windows.h> - - #define COM_HANDLE HANDLE - #define COM_HANDLE_INVALID INVALID_HANDLE_VALUE - #define COM_ERROR_VALUE GetLastError() -/* Modem Status bits */ - #define COM_CTS MS_CTS_ON - #define COM_DSR MS_DSR_ON - #define COM_RING MS_RING_ON - #define COM_DCD MS_RLSD_ON -#else - #include <termios.h> - - #define COM_HANDLE int - #define COM_HANDLE_INVALID -1 - #define COM_ERROR_VALUE errno - -/* Stuff we apparently don't care about... - * - * TIOCM_LE Line Enable. - * TIOCM_DTR Data Terminal Ready. - * TIOCM_RTS Request To Send. - * TIOCM_ST Secondary Transmit. - * TIOCM_SR Secondary Receive. - */ - - #define COM_CTS TIOCM_CTS /* Clear To Send. */ -#ifdef TIOCM_CAR - #define COM_DCD TIOCM_CAR /* Carrier Detect. */ -#else - #define COM_DCD TIOCM_CD /* Carrier Detect (synonym). */ -#endif -#ifdef TIOCM_RNG - #define COM_RING TIOCM_RNG /* Ring Indication. */ -#else - #define COM_RING TIOCM_RI /* Ring Indication (synonym). */ -#endif - #define COM_DSR TIOCM_DSR /* Data Set Ready. */ - -#endif - -#define COM_FLOW_CONTROL_NONE 0 -#define COM_FLOW_CONTROL_RTS_CTS (1<<0) -#define COM_FLOW_CONTROL_DTR_DSR (1<<1) -#define COM_FLOW_CONTROL_XON_OFF (1<<2) - -/**************/ -/* Prototypes */ -/**************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -COMIOEXPORT char* comVersion(char* str, size_t len); -COMIOEXPORT COM_HANDLE comOpen(const char* device); -COMIOEXPORT BOOL comClose(COM_HANDLE); -COMIOEXPORT long comGetBaudRate(COM_HANDLE); -COMIOEXPORT BOOL comSetBaudRate(COM_HANDLE, ulong rate); -COMIOEXPORT int comGetFlowControl(COM_HANDLE); -COMIOEXPORT BOOL comSetFlowControl(COM_HANDLE, int); -COMIOEXPORT int comGetModemStatus(COM_HANDLE); -COMIOEXPORT int comRaiseDTR(COM_HANDLE); -COMIOEXPORT int comLowerDTR(COM_HANDLE); -COMIOEXPORT int comRaiseRTS(COM_HANDLE); -COMIOEXPORT int comLowerRTS(COM_HANDLE); -COMIOEXPORT BOOL comWriteByte(COM_HANDLE, BYTE); -COMIOEXPORT int comWriteBuf(COM_HANDLE, const BYTE*, size_t buflen); -COMIOEXPORT int comWriteString(COM_HANDLE, const char*); -COMIOEXPORT BOOL comReadByte(COM_HANDLE, BYTE*); -COMIOEXPORT size_t comReadBuf(COM_HANDLE, char* buf, size_t buflen - ,const char* terminators, int timeout /* in milliseconds */); -COMIOEXPORT size_t comReadLine(COM_HANDLE, char* buf, size_t buflen - ,int timeout /* in milliseconds */); -COMIOEXPORT BOOL comPurgeInput(COM_HANDLE); -COMIOEXPORT BOOL comPurgeOutput(COM_HANDLE); - -#if defined(__cplusplus) -} -#endif - - -#endif /* Don't add anything after this #endif statement */ diff --git a/comio/comio_nix.c b/comio/comio_nix.c deleted file mode 100644 index 03f33d498d5423eb61dfc9823e2303261a57fa67..0000000000000000000000000000000000000000 --- a/comio/comio_nix.c +++ /dev/null @@ -1,413 +0,0 @@ -/* comio_nix.c */ - -/* Synchronet Serial Communications I/O Library Functions for *nix */ - -/* $Id: comio_nix.c,v 1.19 2020/06/27 08:23:39 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <sys/ioctl.h> -#include <sys/file.h> -#include <fcntl.h> // O_NONBLOCK -#include "comio.h" -#include "genwrap.h" - -#if defined(CCTS_OFLOW) && defined(CRTS_IFLOW) - #define CTSRTS_FLOW_CFLAGS (CCTS_OFLOW | CRTS_IFLOW) -#elif defined(CRTSCTS) - #define CTSRTS_FLOW_CFLAGS (CRTSCTS) -#else - #error No way to control CTS/RTS flow control -#endif - -#if defined(IXON) && defined (IXOFF) - #define XONXOFF_FLOW_IFLAGS (IXON | IXOFF) -#else - #error No way to control XON/XOFF flow control -#endif - -#ifdef SPEED_MACROS_ONLY - -#define SUPPORTED_SPEED(x) \ - if (speed <= (x)) \ - return B##x - -speed_t rate_to_macro(unsigned long speed) -{ - // Standard values - SUPPORTED_SPEED(0); - SUPPORTED_SPEED(50); - SUPPORTED_SPEED(75); - SUPPORTED_SPEED(110); - SUPPORTED_SPEED(134); - SUPPORTED_SPEED(150); - SUPPORTED_SPEED(200); - SUPPORTED_SPEED(300); - SUPPORTED_SPEED(600); - SUPPORTED_SPEED(1200); - SUPPORTED_SPEED(1800); - SUPPORTED_SPEED(2400); - SUPPORTED_SPEED(4800); - SUPPORTED_SPEED(9600); - SUPPORTED_SPEED(19200); - SUPPORTED_SPEED(38400); - - // Non-POSIX -#ifdef B57600 - SUPPORTED_SPEED(57600); -#endif -#ifdef B115200 - SUPPORTED_SPEED(115200); -#endif -#ifdef B230400 - SUPPORTED_SPEED(230400); -#endif -#ifdef B460800 - SUPPORTED_SPEED(460800); -#endif -#ifdef B500000 - SUPPORTED_SPEED(500000); -#endif -#ifdef B576000 - SUPPORTED_SPEED(576000); -#endif -#ifdef B921600 - SUPPORTED_SPEED(921600); -#endif -#ifdef B1000000 - SUPPORTED_SPEED(1000000); -#endif -#ifdef B1152000 - SUPPORTED_SPEED(1152000); -#endif -#ifdef B1500000 - SUPPORTED_SPEED(1500000); -#endif -#ifdef B2000000 - SUPPORTED_SPEED(2000000); -#endif -#ifdef B2500000 - SUPPORTED_SPEED(2500000); -#endif -#ifdef B3000000 - SUPPORTED_SPEED(3000000); -#endif -#ifdef B3500000 - SUPPORTED_SPEED(3500000); -#endif -#ifdef B4000000 - SUPPORTED_SPEED(4000000); -#endif - return B0; -} -#undef SUPPORTED_SPEED -#define SUPPORTED_SPEED(x) \ - if (speed == B##x) \ - return x; - -unsigned long macro_to_rate(speed_t speed) -{ - // Standard values - SUPPORTED_SPEED(0); - SUPPORTED_SPEED(50); - SUPPORTED_SPEED(75); - SUPPORTED_SPEED(110); - SUPPORTED_SPEED(134); - SUPPORTED_SPEED(150); - SUPPORTED_SPEED(200); - SUPPORTED_SPEED(300); - SUPPORTED_SPEED(600); - SUPPORTED_SPEED(1200); - SUPPORTED_SPEED(1800); - SUPPORTED_SPEED(2400); - SUPPORTED_SPEED(4800); - SUPPORTED_SPEED(9600); - SUPPORTED_SPEED(19200); - SUPPORTED_SPEED(38400); - - // Non-POSIX -#ifdef B57600 - SUPPORTED_SPEED(57600); -#endif -#ifdef B115200 - SUPPORTED_SPEED(115200); -#endif -#ifdef B230400 - SUPPORTED_SPEED(230400); -#endif -#ifdef B460800 - SUPPORTED_SPEED(460800); -#endif -#ifdef B500000 - SUPPORTED_SPEED(500000); -#endif -#ifdef B576000 - SUPPORTED_SPEED(576000); -#endif -#ifdef B921600 - SUPPORTED_SPEED(921600); -#endif -#ifdef B1000000 - SUPPORTED_SPEED(1000000); -#endif -#ifdef B1152000 - SUPPORTED_SPEED(1152000); -#endif -#ifdef B1500000 - SUPPORTED_SPEED(1500000); -#endif -#ifdef B2000000 - SUPPORTED_SPEED(2000000); -#endif -#ifdef B2500000 - SUPPORTED_SPEED(2500000); -#endif -#ifdef B3000000 - SUPPORTED_SPEED(3000000); -#endif -#ifdef B3500000 - SUPPORTED_SPEED(3500000); -#endif -#ifdef B4000000 - SUPPORTED_SPEED(4000000); -#endif - return 0; -} -#undef SUPPORTED_SPEED - -#else -#define rate_to_macro(x) (x) -#define macro_to_rate(x) (x) -#endif - -char* comVersion(char* str, size_t len) -{ - char revision[16]; - - sscanf("$Revision: 1.19 $", "%*s %s", revision); - - safe_snprintf(str,len,"Synchronet Communications I/O Library for "PLATFORM_DESC" v%s", revision); - return str; -} - -COM_HANDLE comOpen(const char* device) -{ - COM_HANDLE handle; - struct termios t; - - if((handle=open(device, O_NONBLOCK|O_RDWR))==COM_HANDLE_INVALID) - return COM_HANDLE_INVALID; - - if(tcgetattr(handle, &t)==-1) { - close(handle); - return COM_HANDLE_INVALID; - } - - t.c_iflag = ( - IGNBRK /* ignore BREAK condition */ - | IGNPAR /* ignore (discard) parity errors */ - ); - t.c_oflag = 0; /* No output processing */ - t.c_cflag = ( - CS8 /* 8 bits */ - | CREAD /* enable receiver */ -/* -Fun snippet from the FreeBSD manpage: - - If CREAD is set, the receiver is enabled. Otherwise, no character is - received. Not all hardware supports this bit. In fact, this flag is - pretty silly and if it were not part of the termios specification it - would be omitted. -*/ - | HUPCL /* hang up on last close */ - | CLOCAL /* ignore modem status lines */ - | CTSRTS_FLOW_CFLAGS - ); - t.c_lflag = 0; /* No local modes */ - if(tcsetattr(handle, TCSANOW, &t)==-1) { - close(handle); - return COM_HANDLE_INVALID; - } - - return handle; -} - -BOOL comClose(COM_HANDLE handle) -{ - return (!close(handle)); -} - -long comGetBaudRate(COM_HANDLE handle) -{ - struct termios t; - speed_t in; - speed_t out; - - if(tcgetattr(handle, &t)) - return COM_ERROR; - - /* - * We actually have TWO speeds available... - * return the biggest one - */ - in = macro_to_rate(cfgetispeed(&t)); - out = macro_to_rate(cfgetospeed(&t)); - return ((long)(in>out?in:out)); -} - -BOOL comSetBaudRate(COM_HANDLE handle, unsigned long rate) -{ - struct termios t; - - if(tcgetattr(handle, &t)) - return FALSE; - - cfsetispeed(&t, rate_to_macro(rate)); - cfsetospeed(&t, rate_to_macro(rate)); - if(tcsetattr(handle, TCSANOW, &t)==-1) - return FALSE; - - return TRUE; -} - -int comGetFlowControl(COM_HANDLE handle) -{ - int ret = 0; - struct termios t; - - if(tcgetattr(handle, &t)==-1) - return FALSE; - - if ((t.c_cflag & CTSRTS_FLOW_CFLAGS) == CTSRTS_FLOW_CFLAGS) - ret |= COM_FLOW_CONTROL_RTS_CTS; - if ((t.c_iflag & XONXOFF_FLOW_IFLAGS) == XONXOFF_FLOW_IFLAGS) - ret |= COM_FLOW_CONTROL_XON_OFF; - - return ret; -} - -BOOL comSetFlowControl(COM_HANDLE handle, int modes) -{ - struct termios t; - - if(tcgetattr(handle, &t)==-1) - return FALSE; - - if (modes & COM_FLOW_CONTROL_RTS_CTS) - t.c_cflag |= CTSRTS_FLOW_CFLAGS; - else - t.c_cflag &= ~CTSRTS_FLOW_CFLAGS; - - if (modes & COM_FLOW_CONTROL_XON_OFF) - t.c_iflag |= XONXOFF_FLOW_IFLAGS; - else - t.c_iflag &= ~XONXOFF_FLOW_IFLAGS; - - if(tcsetattr(handle, TCSANOW, &t)==-1) - return FALSE; - - return TRUE; -} - -int comGetModemStatus(COM_HANDLE handle) -{ - int status; - - if(ioctl(handle, TIOCMGET, &status)==-1) - return COM_ERROR; - - return status; -} - -static BOOL comSetFlags(COM_HANDLE handle, int flags, BOOL set) -{ - int cmd = set ? TIOCMBIS : TIOCMBIC; - - return (ioctl(handle, cmd, &flags) == 0); -} - -BOOL comRaiseDTR(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_DTR, TRUE); -} - -BOOL comLowerDTR(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_DTR, FALSE); -} - -BOOL comRaiseRTS(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_RTS, TRUE); -} - -BOOL comLowerRTS(COM_HANDLE handle) -{ - return comSetFlags(handle, TIOCM_RTS, FALSE); -} -BOOL comWriteByte(COM_HANDLE handle, BYTE ch) -{ - return(write(handle, &ch, 1)==1); -} - -int comWriteBuf(COM_HANDLE handle, const BYTE* buf, size_t buflen) -{ - return write(handle, buf, buflen); -} - -/* - * TODO: This seem kinda dangerous for short writes... - */ -int comWriteString(COM_HANDLE handle, const char* str) -{ - return comWriteBuf(handle, (BYTE*)str, strlen(str)); -} - -BOOL comReadByte(COM_HANDLE handle, BYTE* ch) -{ - return(read(handle, ch, 1)==1); -} - -BOOL comPurgeInput(COM_HANDLE handle) -{ - return(tcflush(handle, TCIFLUSH)==0); -} - -BOOL comPurgeOutput(COM_HANDLE handle) -{ - return(tcflush(handle, TCOFLUSH)==0); -} - -BOOL comDrainOutput(COM_HANDLE handle) -{ - return(tcdrain(handle)==0); -} diff --git a/comio/comio_win32.c b/comio/comio_win32.c deleted file mode 100644 index b539dd7d29655f10df289c384e825ae25da47c98..0000000000000000000000000000000000000000 --- a/comio/comio_win32.c +++ /dev/null @@ -1,228 +0,0 @@ -/* comio_win32.c */ - -/* Synchronet Serial Communications I/O Library Functions for Win32 */ - -/* $Id: comio_win32.c,v 1.13 2020/06/26 19:56:48 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "comio.h" -#include "genwrap.h" - -char* comVersion(char* str, size_t len) -{ - char revision[16]; - - sscanf("$Revision: 1.13 $", "%*s %s", revision); - - safe_snprintf(str,len,"Synchronet Communications I/O Library for "PLATFORM_DESC" v%s", revision); - return str; -} - -COM_HANDLE comOpen(const char* device) -{ - COM_HANDLE handle; - COMMTIMEOUTS timeouts; - DCB dcb; - - if((handle=CreateFile(device - ,GENERIC_READ|GENERIC_WRITE /* Access */ - ,0 /* Share mode */ - ,NULL /* Security attributes */ - ,OPEN_EXISTING /* Create access */ - ,FILE_ATTRIBUTE_NORMAL /* File attributes */ - ,NULL /* Template */ - ))==INVALID_HANDLE_VALUE) - return COM_HANDLE_INVALID; - - - if(GetCommTimeouts(handle, &timeouts)) { - timeouts.ReadIntervalTimeout=MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier=0; - timeouts.ReadTotalTimeoutConstant=0; // No-wait read timeout - timeouts.WriteTotalTimeoutMultiplier=0; - timeouts.WriteTotalTimeoutConstant=5000; // 5 seconds - SetCommTimeouts(handle,&timeouts); - } - - /* Force N-8-1 mode: */ - if(GetCommState(handle, &dcb)==TRUE) { - dcb.ByteSize = 8; - dcb.Parity = NOPARITY; - dcb.StopBits = ONESTOPBIT; - SetCommState(handle, &dcb); - } - - return handle; -} - -BOOL comClose(COM_HANDLE handle) -{ - return CloseHandle(handle); -} - -long comGetBaudRate(COM_HANDLE handle) -{ - DCB dcb; - - if(GetCommState(handle, &dcb)!=TRUE) - return COM_ERROR; - - return dcb.BaudRate; -} - -BOOL comSetBaudRate(COM_HANDLE handle, unsigned long rate) -{ - DCB dcb; - - if(GetCommState(handle, &dcb)!=TRUE) - return FALSE; - - dcb.BaudRate=rate; - - return SetCommState(handle, &dcb); -} - -int comGetFlowControl(COM_HANDLE handle) -{ - DCB dcb; - int result = 0; - - if(GetCommState(handle, &dcb) != TRUE) - return COM_ERROR; - - if(dcb.fOutxCtsFlow) - result |= COM_FLOW_CONTROL_RTS_CTS; - if(dcb.fOutxDsrFlow) - result |= COM_FLOW_CONTROL_DTR_DSR; - if(dcb.fInX && dcb.fOutX) - result |= COM_FLOW_CONTROL_XON_OFF; - return result; -} - -BOOL comSetFlowControl(COM_HANDLE handle, int type) -{ - DCB dcb; - - if(GetCommState(handle, &dcb) != TRUE) - return FALSE; - - dcb.fOutxCtsFlow = 0; - dcb.fRtsControl = RTS_CONTROL_DISABLE; // This is questionable - dcb.fOutxDsrFlow = 0; - dcb.fDsrSensitivity = 0; - dcb.fInX = 0; - dcb.fOutX = 0; - if(type&COM_FLOW_CONTROL_RTS_CTS) { - dcb.fOutxCtsFlow = 1; - dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; - } - if(type&COM_FLOW_CONTROL_DTR_DSR) { - dcb.fOutxDsrFlow = 1; - dcb.fDsrSensitivity = 1; - } - if(type&COM_FLOW_CONTROL_XON_OFF) { - dcb.fInX = 1; - dcb.fOutX = 1; - } - return SetCommState(handle, &dcb); -} - -int comGetModemStatus(COM_HANDLE handle) -{ - DWORD status=0; - - if(GetCommModemStatus(handle, &status)) - return status; - else - return COM_ERROR; -} - -BOOL comRaiseDTR(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, SETDTR); -} - -BOOL comLowerDTR(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, CLRDTR); -} - -BOOL comRaiseRTS(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, SETRTS); -} - -BOOL comLowerRTS(COM_HANDLE handle) -{ - return EscapeCommFunction(handle, CLRRTS); -} - -BOOL comWriteByte(COM_HANDLE handle, BYTE ch) -{ - DWORD wr=0; - - return WriteFile(handle, &ch, sizeof(ch), &wr, NULL) && wr==sizeof(BYTE); -} - -int comWriteBuf(COM_HANDLE handle, const BYTE* buf, size_t buflen) -{ - DWORD wr=0; - - if(!WriteFile(handle, buf, buflen, &wr, NULL)) - return COM_ERROR; - - return wr; -} - -int comWriteString(COM_HANDLE handle, const char* str) -{ - return comWriteBuf(handle, str, strlen(str)); -} - -BOOL comReadByte(COM_HANDLE handle, BYTE* ch) -{ - DWORD rd; - - return ReadFile(handle, ch, sizeof(BYTE), &rd, NULL) && rd==sizeof(BYTE); -} - -BOOL comPurgeInput(COM_HANDLE handle) -{ - return PurgeComm(handle, PURGE_RXCLEAR); -} - -BOOL comPurgeOutput(COM_HANDLE handle) -{ - return PurgeComm(handle, PURGE_TXCLEAR); -} - diff --git a/encode/CMakeLists.txt b/encode/CMakeLists.txt deleted file mode 100644 index 2e2be23da93a1f2c78be5f9b9d7147116f44e3a6..0000000000000000000000000000000000000000 --- a/encode/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# not currently used - -project (Encode C) - -cmake_minimum_required(VERSION 3.11) - -set(SOURCE - base64.c - hex.c - lzh.c - utf8.c - uucode.c - yenc.c -) - -set(HEADER - base64.h - lzh.h - utf8.h - uucode.h - yenc.h -) - -add_library(encode OBJECT ${SOURCE}) -target_compile_features(encode PUBLIC c_std_99) -target_include_directories(encode PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(encode xpdev) diff --git a/encode/README.md b/encode/README.md deleted file mode 100644 index bbc7dabb663db5bc6e86c032d750f27cf16caa75..0000000000000000000000000000000000000000 --- a/encode/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Synchronet library project: encoders and decoders - -This directory contains code and data for various data encoders / decoders: -e.g. base64, uuencode, yenc, UTF-8, etc. - -One-way/lossy encoders (e.g. checksum/hash/digest) do not belong here. diff --git a/encode/base64.c b/encode/base64.c deleted file mode 100644 index d7043e4c330aceaf407a851fb889696d15d8b08a..0000000000000000000000000000000000000000 --- a/encode/base64.c +++ /dev/null @@ -1,174 +0,0 @@ -/* Base64 encoding/decoding routines */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> -#include <string.h> -#include "base64.h" -#include "gen_defs.h" - -static const char * base64alphabet = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - -ssize_t b64_decode(char *target, size_t tlen, const char *source, size_t slen) -{ - const char *inp; - char *outp; - char *outend; - const char *inend; - int bits=0; - int working=0; - char * i; - - if(slen==0) - slen=strlen(source); - outp=target; - inp=source; - outend=target+tlen; - inend=source+slen; - for(;outp<outend && inp<inend;inp++) { - if(isspace(*inp)) - continue; - working<<=6; - i=strchr(base64alphabet,(char)*inp); - if(i==NULL) { - return(-1); - } - if(*i=='=') { /* pad char */ - if((working&0xFF) != 0) - return(-1); - break; - } - bits+=6; - working |= (i-base64alphabet); - if(bits>=8) { - *(outp++)=(char)((working&(0xFF<<(bits-8)))>>(bits-8)); - bits-=8; - } - } - if(outp == outend) { - *(--outp)=0; - return(-1); - } - *outp=0; - return(outp-target); -} - -static int add_char(char *pos, char ch, int done, char *end) -{ - if(pos>=end) { - return(1); - } - if(done) - *pos=base64alphabet[64]; - else - *pos=base64alphabet[(int)ch]; - return(0); -} - -ssize_t b64_encode(char *target, size_t tlen, const char *source, size_t slen) { - const char *inp; - char *outp; - char *outend; - const char *inend; - char *tmpbuf=NULL; - int done=0; - char enc; - int buf; - - inp=source; - if(source==target) { - tmpbuf=(char *)malloc(tlen); - if(tmpbuf==NULL) - return(-1); - outp=tmpbuf; - } - else - outp=target; - - outend=outp+tlen; - inend=inp+slen; - for(;(inp < inend) && !done;) { - enc=*(inp++); - buf=(enc & 0x03)<<4; - enc=(enc&0xFC)>>2; - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if (inp>=inend) - enc=buf; - else - enc=buf|((*inp & 0xF0) >> 4); - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if(inp==inend) - done=1; - if (!done) { - buf=(*(inp++)<<2)&0x3C; - if (inp == inend) - enc=buf; - else - enc=buf|((*inp & 0xC0)>>6); - } - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if(inp==inend) - done=1; - if (!done) - enc=((int)*(inp++))&0x3F; - if(add_char(outp++, enc, done, outend)) { - FREE_AND_NULL(tmpbuf); - return(-1); - } - if(inp==inend) - done=1; - } - if(outp<outend) - *outp=0; - int result; - if(source==target) { - memcpy(target,tmpbuf,tlen); - result = outp - tmpbuf; - free(tmpbuf); - } else - result = outp - target; - - return result; -} - -#ifdef BASE64_TEST -int main(int argc, char**argv) -{ - int i,j; - char buf[512]; - - for(i=1;i<argc;i++) { - j=b64_decode(buf,sizeof(buf),argv[i],0); - printf("%s (%d)\n",buf,j); - } - - return 0; -} -#endif diff --git a/encode/base64.h b/encode/base64.h deleted file mode 100644 index 9f6c19e0485beba1edf190d663836a5dbd288e31..0000000000000000000000000000000000000000 --- a/encode/base64.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Base64 encoding/decoding exported function prototypes */ - -/* $Id: base64.h,v 1.8 2019/03/22 21:29:12 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "gen_defs.h" // ssize_t - -#ifndef _base64_h_ -#define _base64_h_ - -#if defined(_WIN32) && (defined(B64_IMPORTS) || defined(B64_EXPORTS)) - #if defined(B64_IMPORTS) - #define B64EXPORT __declspec(dllimport) - #else - #define B64EXPORT __declspec(dllexport) - #endif -#else /* !_WIN32 */ - #define B64EXPORT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -B64EXPORT ssize_t b64_encode(char *target, size_t tlen, const char *source, size_t slen); -B64EXPORT ssize_t b64_decode(char *target, size_t tlen, const char *source, size_t slen); - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/encode/hex.c b/encode/hex.c deleted file mode 100644 index 5cf4c4de5d125f1e769a9c01579c383fa9b68533..0000000000000000000000000000000000000000 --- a/encode/hex.c +++ /dev/null @@ -1,59 +0,0 @@ -/* Hexadecimal encode/decode (e.g. URL encode/decode) functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "hex.h" -#include "genwrap.h" -#include "gen_defs.h" - -char* hex_encode(char esc, const char* src, char* chars, char* dest, size_t size) -{ - char* result = dest; - char* end = dest + (size - 1); - - while(*src != '\0' && dest < end) { - if((*src == esc || strchr(chars, *src) != NULL) && dest + 3 < end) - dest += sprintf(dest, "%c%2X", esc, *src); - else - *(dest++) = *src; - src++; - } - *end = '\0'; - return result; -} - -char* hex_decode(char esc, char* str) -{ - char* src = str; - char* dest = str; - while(*src != '\0') { - if(*src == esc && IS_HEXDIGIT(*(src + 1)) && IS_HEXDIGIT(*(src + 2))) { - src++; - *dest = HEX_CHAR_TO_INT(*src) << 4; - src++; - *dest |= HEX_CHAR_TO_INT(*src); - } else - *dest = *src; - src++; - dest++; - } - *dest = '\0'; - return str; -} diff --git a/encode/hex.h b/encode/hex.h deleted file mode 100644 index 9765bca85e502a4666a65a52b38369be6c152fa6..0000000000000000000000000000000000000000 --- a/encode/hex.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Hex encode/decode (e.g. URL encode/decode) functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef hex_h_ -#define hex_h_ - -#include <stdlib.h> // size_t - -#ifdef __cplusplus -extern "C" { -#endif - -char* hex_encode(char esc, const char* src, char* chars, char* dest, size_t size); -char* hex_decode(char esc, char* str); - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line */ \ No newline at end of file diff --git a/encode/lzh.c b/encode/lzh.c deleted file mode 100644 index ac863358d33da51c277044bd7437d8a588c2b578..0000000000000000000000000000000000000000 --- a/encode/lzh.c +++ /dev/null @@ -1,781 +0,0 @@ -/* lzh.c */ - -/* Synchronet LZH compression library */ - -/* $Id: lzh.c,v 1.16 2020/04/17 14:08:11 deuce Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Rob Swindell's conversion of 1988 LZH (LHarc) encoding functions * - * Based on Japanese version 29-NOV-1988 * - * LZSS coded by Haruhiko Okumura * - * Adaptive Huffman Coding coded by Haruyasu Yoshizaki * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -/* FreeBSD's malloc.h is deprecated, it drops a warning and */ -/* #includes <stdlib.h>, which is already here. */ -#if !defined(__unix__) - #include <malloc.h> -#endif - -#include "lzh.h" - -#define REALLOC realloc -#define LMALLOC malloc -#define MALLOC malloc -#define LFREE free -#define FREE free - - - -/* LZSS Parameters */ - -#define LZH_N 4096 /* Size of string buffer */ -#define LZH_F 60 /* Size of look-ahead buffer */ -#define LZH_THRESHOLD 2 -#define LZH_NIL LZH_N /* End of tree's node */ - -/* Huffman coding parameters */ - -#define LZH_N_CHAR (256 - LZH_THRESHOLD + LZH_F) - /* character code (= 0..LZH_N_CHAR-1) */ -#define LZH_T (LZH_N_CHAR * 2 - 1) /* Size of table */ -#define LZH_R (LZH_T - 1) /* root position */ -#define MAX_FREQ 0x8000 - /* update when cumulative frequency */ - /* reaches to this value */ - -/* Converted from global variables to struct Apr-21-2003 */ -typedef struct { - -#ifdef LZH_DYNAMIC_BUF - - unsigned char* text_buf; - short int match_position, match_length, - *lson, *rson, *dad; - - unsigned short* freq; /* cumulative freq table */ - - /* - * pointing parent nodes. - * area [LZH_T..(LZH_T + LZH_N_CHAR - 1)] are pointers for leaves - */ - short int* prnt; - - /* pointing children nodes (son[], son[] + 1)*/ - short int* son; - -#else /* STATIC */ - - unsigned char text_buf[LZH_N + LZH_F - 1]; - short int match_position, match_length, - lson[LZH_N + 1], rson[LZH_N + 257], dad[LZH_N + 1]; - - unsigned short freq[LZH_T + 1]; /* cumulative freq table */ - short int prnt[LZH_T + LZH_N_CHAR]; - short int son[LZH_T + 1]; /* bug fixed by Digital Dynamics */ - -#endif - - unsigned short getbuf; /* Was just "unsigned" fixed 04/12/95 */ - uint8_t getlen; - unsigned putbuf; - uint8_t putlen; - - unsigned short code, len; - -} lzh_t; - -static void lzh_init_tree(lzh_t* lzh) /* Initializing tree */ -{ - short int i; - - for (i = LZH_N + 1; i <= LZH_N + 256; i++) - lzh->rson[i] = LZH_NIL; /* root */ - for (i = 0; i < LZH_N; i++) - lzh->dad[i] = LZH_NIL; /* node */ -} - -/******************************/ -/* Inserting node to the tree */ -/* Only used during encoding */ -/******************************/ -static void lzh_insert_node(lzh_t* lzh, short int r) -{ - short int i, p, cmp; - unsigned char *key; - unsigned c; - - cmp = 1; - key = lzh->text_buf+r; - p = LZH_N + 1 + key[0]; - lzh->rson[r] = lzh->lson[r] = LZH_NIL; - lzh->match_length = 0; - for ( ; ; ) { - if (cmp >= 0) { - if (lzh->rson[p] != LZH_NIL) - p = lzh->rson[p]; - else { - lzh->rson[p] = r; - lzh->dad[r] = p; - return; - } - } else { - if (lzh->lson[p] != LZH_NIL) - p = lzh->lson[p]; - else { - lzh->lson[p] = r; - lzh->dad[r] = p; - return; - } - } - for (i = 1; i < LZH_F; i++) - if ((cmp = key[i] - lzh->text_buf[p + i]) != 0) - break; - if (i > LZH_THRESHOLD) { - if (i > lzh->match_length) { - lzh->match_position = ((r - p) & (LZH_N - 1)) - 1; - if ((lzh->match_length = i) >= LZH_F) - break; - } - if (i == lzh->match_length) { - if ((c = ((r - p) & (LZH_N - 1)) - 1) - < (unsigned)lzh->match_position) { - lzh->match_position = c; - } - } - } - } - lzh->dad[r] = lzh->dad[p]; - lzh->lson[r] = lzh->lson[p]; - lzh->rson[r] = lzh->rson[p]; - lzh->dad[lzh->lson[p]] = r; - lzh->dad[lzh->rson[p]] = r; - if (lzh->rson[lzh->dad[p]] == p) - lzh->rson[lzh->dad[p]] = r; - else - lzh->lson[lzh->dad[p]] = r; - lzh->dad[p] = LZH_NIL; /* remove p */ -} - -static void lzh_delete_node(lzh_t* lzh, short int p) /* Deleting node from the tree */ -{ - short int q; - - if (lzh->dad[p] == LZH_NIL) - return; /* unregistered */ - if (lzh->rson[p] == LZH_NIL) - q = lzh->lson[p]; - else - if (lzh->lson[p] == LZH_NIL) - q = lzh->rson[p]; - else { - q = lzh->lson[p]; - if (lzh->rson[q] != LZH_NIL) { - do { - q = lzh->rson[q]; - } while (lzh->rson[q] != LZH_NIL); - lzh->rson[lzh->dad[q]] = lzh->lson[q]; - lzh->dad[lzh->lson[q]] = lzh->dad[q]; - lzh->lson[q] = lzh->lson[p]; - lzh->dad[lzh->lson[p]] = q; - } - lzh->rson[q] = lzh->rson[p]; - lzh->dad[lzh->rson[p]] = q; - } - lzh->dad[q] = lzh->dad[p]; - if (lzh->rson[lzh->dad[p]] == p) - lzh->rson[lzh->dad[p]] = q; - else - lzh->lson[lzh->dad[p]] = q; - lzh->dad[p] = LZH_NIL; -} - -/* - * Tables for encoding/decoding upper 6 bits of - * sliding dictionary pointer - */ -/* encoder table */ -static uint8_t lzh_p_len[64] = { - 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 -}; - -static uint8_t lzh_p_code[64] = { - 0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, - 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, - 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, - 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, - 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, - 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* decoder table */ -static uint8_t lzh_d_code[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, - 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, - 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, - 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, - 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, - 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, - 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, -}; - -static uint8_t lzh_d_len[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -}; - - -static int lzh_getbit(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) /* get one bit */ -{ - short int i; - - while (lzh->getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh->getbuf |= i << (8 - lzh->getlen); - lzh->getlen += 8; - } - i = lzh->getbuf; - lzh->getbuf <<= 1; - lzh->getlen--; - return (i < 0); -} - -static short int lzh_getbyte(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) /* get a byte */ -{ - unsigned short i; - - while (lzh->getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh->getbuf |= i << (8 - lzh->getlen); - lzh->getlen += 8; - } - i = lzh->getbuf; - lzh->getbuf <<= 8; - lzh->getlen -= 8; - return i >> 8; -} - - -/* output c bits */ -static void lzh_putcode(lzh_t* lzh, short int l, unsigned short c, uint8_t *outbuf, int32_t *outlen) -{ - lzh->putbuf |= c >> lzh->putlen; - if ((lzh->putlen += l) >= 8) { - outbuf[(*outlen)++]=(lzh->putbuf >> 8); - if ((lzh->putlen -= 8) >= 8) { - outbuf[(*outlen)++]=lzh->putbuf; - lzh->putlen -= 8; - lzh->putbuf = c << (l - lzh->putlen); - } else { - lzh->putbuf <<= 8; - } - } -} - - -/* initialize freq tree */ - -static void lzh_start_huff(lzh_t* lzh) -{ - short int i, j; - - for (i = 0; i < LZH_N_CHAR; i++) { - lzh->freq[i] = 1; - lzh->son[i] = i + LZH_T; - lzh->prnt[i + LZH_T] = i; - } - i = 0; j = LZH_N_CHAR; - while (j <= LZH_R) { - lzh->freq[j] = lzh->freq[i] + lzh->freq[i + 1]; - lzh->son[j] = i; - lzh->prnt[i] = lzh->prnt[i + 1] = j; - i += 2; j++; - } - lzh->freq[LZH_T] = 0xffff; - lzh->prnt[LZH_R] = 0; -} - - -/* reconstruct freq tree */ - -static void lzh_reconst(lzh_t* lzh) -{ - short int i, j, k; - unsigned short f, l; - - /* halven cumulative freq for leaf nodes */ - j = 0; - for (i = 0; i < LZH_T; i++) { - if (lzh->son[i] >= LZH_T) { - lzh->freq[j] = (lzh->freq[i] + 1) / 2; - lzh->son[j] = lzh->son[i]; - j++; - } - } - /* make a tree : first, connect children nodes */ - for (i = 0, j = LZH_N_CHAR; j < LZH_T; i += 2, j++) { - k = i + 1; - f = lzh->freq[j] = lzh->freq[i] + lzh->freq[k]; - for (k = j - 1; f < lzh->freq[k]; k--); - k++; - l = (j - k) * 2; - - /* movmem() is Turbo-C dependent - rewritten to memmove() by Kenji */ - - /* movmem(&lzh->freq[k], &lzh->freq[k + 1], l); */ - (void)memmove(lzh->freq+k+1,lzh->freq+k, l); - lzh->freq[k] = f; - /* movmem(&lzh->son[k], &lzh->son[k + 1], l); */ - (void)memmove(lzh->son+k+1,lzh->son+k, l); - lzh->son[k] = i; - } - /* connect parent nodes */ - for (i = 0; i < LZH_T; i++) { - if ((k = lzh->son[i]) >= LZH_T) { - lzh->prnt[k] = i; - } else { - lzh->prnt[k] = lzh->prnt[k + 1] = i; - } - } -} - -/* update freq tree */ - -static void lzh_update(lzh_t* lzh, short int c) -{ - short int i, j, k, l; - - if (lzh->freq[LZH_R] == MAX_FREQ) { - lzh_reconst(lzh); - } - c = lzh->prnt[c + LZH_T]; - do { - k = ++lzh->freq[c]; - - /* swap nodes to keep the tree freq-ordered */ - if (((unsigned)k) > ((unsigned)lzh->freq[l = c + 1])) { - while (l < (sizeof(lzh->freq) / sizeof(lzh->freq[0]) - 1) && k > lzh->freq[++l]); - l--; - lzh->freq[c] = lzh->freq[l]; - lzh->freq[l] = k; - - i = lzh->son[c]; - lzh->prnt[i] = l; - if (i < LZH_T) lzh->prnt[i + 1] = l; - - j = lzh->son[l]; - lzh->son[l] = i; - - lzh->prnt[j] = c; - if (j < LZH_T) lzh->prnt[j + 1] = c; - lzh->son[c] = j; - - c = l; - } - } while (((c = lzh->prnt[c]) != 0) && c < ((sizeof(lzh->son)/sizeof(lzh->son[0]))-1)); /* do it until reaching the root */ -} - -static void lzh_encode_char(lzh_t* lzh, unsigned short c, uint8_t *outbuf, int32_t *outlen) -{ - unsigned short i; - short int j, k; - - i = 0; - j = 0; - k = lzh->prnt[c + LZH_T]; - - /* search connections from leaf node to the root */ - do { - i >>= 1; - - /* - if node's address is odd, output 1 - else output 0 - */ - if (k & 1) i += 0x8000; - - j++; - } while ((k = lzh->prnt[k]) != LZH_R); - lzh_putcode(lzh, j, i, outbuf, outlen); - lzh->code = i; - lzh->len = j; - lzh_update(lzh,c); -} - -static void lzh_encode_position(lzh_t* lzh, unsigned short c, uint8_t *outbuf, int32_t *outlen) -{ - unsigned short i; - - /* output upper 6 bits with encoding */ - i = c >> 6; - lzh_putcode(lzh, lzh_p_len[i], (unsigned short)(lzh_p_code[i] << 8), outbuf, outlen); - - /* output lower 6 bits directly */ - lzh_putcode(lzh, 6, (unsigned short)((c & 0x3f) << 10), outbuf, outlen); -} - -static void lzh_encode_end(lzh_t* lzh, uint8_t *outbuf, int32_t *outlen) -{ - if (lzh->putlen) { - outbuf[(*outlen)++]=(lzh->putbuf >> 8); - } -} - -static short int lzh_decode_char(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) -{ - unsigned short c; - - c = lzh->son[LZH_R]; - - /* - * start searching tree from the root to leaves. - * choose node #(lzh.son[]) if input bit == 0 - * else choose #(lzh.son[]+1) (input bit == 1) - */ - while (c < LZH_T) { - c += lzh_getbit(lzh,inbuf,incnt,inlen); - c = lzh->son[c]; - } - c -= LZH_T; - lzh_update(lzh,c); - return c; -} - -static short int lzh_decode_position(lzh_t* lzh, uint8_t *inbuf, int32_t *incnt, long inlen) -{ - unsigned short i, j, c; - - /* decode upper 6 bits from given table */ - i = lzh_getbyte(lzh,inbuf,incnt,inlen); - c = (unsigned)lzh_d_code[i] << 6; - j = lzh_d_len[i]; - - /* input lower 6 bits directly */ - j -= 2; - while (j--) { - i = (i << 1) + lzh_getbit(lzh,inbuf,incnt,inlen); - } - return c | (i & 0x3f); -} - -/* Compression */ - -/* Encoding/Compressing */ -/* Returns length of outbuf */ -int32_t lzh_encode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf) -{ - short int i, c, len, r, s, last_match_length; - int32_t incnt,outlen; /* textsize=0; */ - lzh_t lzh; - memset(&lzh,0,sizeof(lzh)); - -#ifdef LZH_DYNAMIC_BUF - - if((lzh.text_buf=(uint8_t *)malloc(LZH_N + LZH_F - 1))==NULL) - return(-1); - if((lzh.freq=(unsigned short*)malloc((LZH_T + 1)*sizeof(unsigned short)))==NULL) { - free(lzh.text_buf); - return(-1); } - if((lzh.prnt=(short *)malloc((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.freq); - return(-1); } - if((lzh.son=(short *)malloc((LZH_T + 1) * sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - return(-1); } - if((lzh.lson=(short *)malloc((LZH_N + 1)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - return(-1); } - if((lzh.rson=(short *)malloc((LZH_N + 257)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - return(-1); } - if((lzh.dad=(short *)malloc((LZH_N + 1)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - free(lzh.rson); - return(-1); } -#endif - - incnt=0; - memcpy(outbuf,&inlen,sizeof(inlen)); - outlen=sizeof(inlen); - if(!inlen) { -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - free(lzh.rson); - free(lzh.dad); -#endif - return(outlen); } - lzh_start_huff(&lzh); - lzh_init_tree(&lzh); - s = 0; - r = LZH_N - LZH_F; - for (i = s; i < r; i++) - lzh.text_buf[i] = ' '; - for (len = 0; len < LZH_F && incnt<inlen; len++) - lzh.text_buf[r + len] = inbuf[incnt++]; - /* textsize = len; */ - for (i = 1; i <= LZH_F; i++) - lzh_insert_node(&lzh,(short)(r - i)); - lzh_insert_node(&lzh,r); - do { - if (lzh.match_length > len) - lzh.match_length = len; - if (lzh.match_length <= LZH_THRESHOLD) { - lzh.match_length = 1; - lzh_encode_char(&lzh,lzh.text_buf[r],outbuf,&outlen); - } else { - lzh_encode_char(&lzh,(unsigned short)(255 - LZH_THRESHOLD + lzh.match_length) - ,outbuf,&outlen); - lzh_encode_position(&lzh,lzh.match_position - ,outbuf,&outlen); - } - last_match_length = lzh.match_length; - for (i = 0; i < last_match_length && incnt<inlen; i++) { - lzh_delete_node(&lzh,s); - c=inbuf[incnt++]; - lzh.text_buf[s] = (uint8_t)c; - if (s < LZH_F - 1) - lzh.text_buf[s + LZH_N] = (uint8_t)c; - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - lzh_insert_node(&lzh,r); - } -/*** - if ((textsize += i) > printcount) { - printf("%12ld\r", textsize); - printcount += 1024; - } -***/ - while (i++ < last_match_length) { - lzh_delete_node(&lzh,s); - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - if (--len) lzh_insert_node(&lzh,r); - } - } while (len > 0); - lzh_encode_end(&lzh,outbuf,&outlen); -/* - printf("input: %ld (%ld) bytes\n", inlen,textsize); - printf("output: %ld bytes\n", outlen); - printf("output/input: %.3f\n", (double)outlen / inlen); -*/ - -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); - free(lzh.lson); - free(lzh.rson); - free(lzh.dad); -#endif - - return(outlen); -} - -/* Decoding/Uncompressing */ -/* Returns length of outbuf */ -int32_t lzh_decode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf) -{ - short int i, j, k, r, c; - uint32_t count; - int32_t incnt,textsize; - lzh_t lzh; - - memset(&lzh,0,sizeof(lzh)); -#ifdef LZH_DYNAMIC_BUF - - if((lzh.text_buf=(uint8_t *)malloc((LZH_N + LZH_F - 1)*2))==NULL) - return(-1); - if((lzh.freq=(unsigned short *)malloc((LZH_T + 1)*sizeof(unsigned short))) - ==NULL) { - free(lzh.text_buf); - return(-1); } - if((lzh.prnt=(short *)malloc((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.freq); - return(-1); } - if((lzh.son=(short *)malloc((LZH_T + 1) * sizeof(short)))==NULL) { - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - return(-1); } - -#endif - - incnt=0; - memcpy(&textsize,inbuf,sizeof(textsize)); - incnt+=sizeof(textsize); - if (textsize == 0) { -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); -#endif - return(textsize); } - lzh_start_huff(&lzh); - for (i = 0; i < LZH_N - LZH_F; i++) - *(lzh.text_buf+i) = ' '; - r = LZH_N - LZH_F; - for (count = 0; count < (unsigned long)textsize; ) { - c = lzh_decode_char(&lzh,inbuf,&incnt,inlen); - if (c < 256) { - outbuf[count]=(uint8_t)c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - getch(); - exit(-1); } -#endif - *(lzh.text_buf+r) = (uint8_t)c; - r++; - r &= (LZH_N - 1); - count++; - } else { - i = (r - lzh_decode_position(&lzh,inbuf,&incnt,inlen) - 1) - & (LZH_N - 1); - j = c - 255 + LZH_THRESHOLD; - for (k = 0; k < j && count<(unsigned long)textsize; k++) { - c = lzh.text_buf[(i + k) & (LZH_N - 1)]; - outbuf[count]=(uint8_t)c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - exit(-1); } -#endif - *(lzh.text_buf+r) = (uint8_t)c; - r++; - r &= (LZH_N - 1); - count++; - } - } - } -/*** - printf("%12ld\n", count); -***/ - -#ifdef LZH_DYNAMIC_BUF - free(lzh.text_buf); - free(lzh.prnt); - free(lzh.freq); - free(lzh.son); -#endif - -return(count); -} - - diff --git a/encode/lzh.h b/encode/lzh.h deleted file mode 100644 index 9776651f86b12550f4290bf854810345b389f60a..0000000000000000000000000000000000000000 --- a/encode/lzh.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Synchronet LZH compression library */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Rob Swindell's conversion of 1988 LZH (LHarc) encoding functions * - * Based on Japanese version 29-NOV-1988 * - * LZSS coded by Haruhiko Okumura * - * Adaptive Huffman Coding coded by Haruyasu Yoshizaki * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _LZH_H_ -#define _LZH_H_ - -#ifdef LZHEXPORT - #undef LZHEXPORT -#endif - -#ifdef _WIN32 - #ifdef LZHDLL /* LZH functions in DLL */ - #ifdef LZH_EXPORTS - #define LZHEXPORT __declspec( dllexport ) - #else - #define LZHEXPORT __declspec( dllimport ) - #endif - #else /* self-contained executable */ - #define LZHEXPORT - #endif -#else /* !_WIN32 */ - #define LZHEXPORT -#endif - -#include "gen_defs.h" - -#ifdef __cplusplus -extern "C" { -#endif -LZHEXPORT int32_t lzh_encode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf); -LZHEXPORT int32_t lzh_decode(uint8_t *inbuf, int32_t inlen, uint8_t *outbuf); -#ifdef __cplusplus -} -#endif - -#ifdef __WATCOMC__ /* Use MSC standard (prepended underscore) */ -#pragma aux lzh_encode "_*" -#pragma aux lzh_decode "_*" -#endif - -#endif /* Do not add anything after this line */ diff --git a/encode/utf8.c b/encode/utf8.c deleted file mode 100644 index 94c6d7d3ce8992d533005ceff1681e38ade281c8..0000000000000000000000000000000000000000 --- a/encode/utf8.c +++ /dev/null @@ -1,524 +0,0 @@ -/* Synchronet UTF-8 encode/decode/translate functions */ - -/* $Id: utf8.c,v 1.9 2019/08/03 08:05:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "utf8.h" -#include "unicode.h" -#include <stdbool.h> -#include <string.h> - -char* utf8_normalize_str(char* str) -{ - char* dest = str; - - for(char* src = str; *src != 0; src++) { - if(*src == '\xC2' && *(src + 1) == '\xA0') { // NO-BREAK SPACE - src++; - *dest++ = ' '; - continue; - } - if(*src == '\xE2') { - if(*(src + 1) == '\x80') { - switch(*(src + 2)) { - case '\x82': // EN SPACE - case '\x83': // EM SPACE - src += 2; - *dest++ = ' '; - continue; - case '\x8B': // ZERO WIDTH SPACE - case '\x8C': // ZERO WIDTH NON-JOINER - case '\x8D': // ZERO WIDTH JOINER - src += 2; - continue; - case '\x90': // HYPHEN - case '\x91': // NON-BREAKING HYPHEN - case '\x92': // FIGURE DASH - case '\x93': // EN DASH - src += 2; - *dest++ = '-'; - continue; - case '\x98': // LEFT SINGLE QUOTATION MARK - src += 2; - *dest++ = '`'; - continue; - case '\x99': // RIGHT SINGLE QUOTATION MARK - case '\xB2': // PRIME - src += 2; - *dest++ = '\''; - continue; - case '\x9C': // LEFT DOUBLE QUOTATION MARK - case '\x9D': // RIGHT DOUBLE QUOTATION MARK - src += 2; - *dest++ = '"'; - continue; - case '\xA6': // HORIZONTAL ELLIPSIS -> ASCII periods (3) - src += 2; - for(int i = 0; i < 3; i++) - *dest++ = '.'; - continue; - } - } - else if(*(src + 1) == '\x81') { - switch(*(src + 2)) { - case '\x83': // HYPEN BULLET - src += 2; - *dest++ = '-'; - continue; - case '\x84': // FRACTION SLASH - src += 2; - *dest++ = '/'; - continue; - } - } - else if(*(src + 1) == '\x88') { - switch(*(src + 2)) { - case '\x92': // MINUS SIGN - src += 2; - *dest++ = '-'; - continue; - } - } - } - else if(*src == '\xEF') { - if(*(src + 1) == '\xBB' && *(src + 2) == '\xBF') { - // Zero Width No-Break Space (BOM, ZWNBSP) - src += 2; - continue; - } - if(*(src + 1) == '\xBC') { - if(*(src + 2) >= '\x81' && *(src + 2) <= '\xBF') { // FULLWIDTH EXCLAMATION MARK through FULLWIDTH LOW LINE - src += 2; - *src -= '\x81'; - *dest++ = '!' + *src; - continue; - } - } - else if(*(src + 1) == '\xBD') { - if(*(src + 2) >= '\x80' && *(src + 2) <= '\x9E') { // FULLWIDTH GRAVE ACCENT through FULLWIDTH TILDE - src += 2; - *src -= '\x80'; - *dest++ = '`' + *src; - continue; - } - } - } - *dest++ = *src; - } - *dest = 0; - return str; -} - -/* Replace all multi-byte UTF-8 sequences with 'ch' or 'zwch' (when non-zero) */ -/* When ch and zwch are 0, effectively strips all multi-byte UTF-8 codepoints from str */ -char* utf8_replace_chars(char* str, char (*lookup)(enum unicode_codepoint), char unsupported_ch, char unsupported_zwch, char error_ch) -{ - char* end = str + strlen(str); - char* dest = str; - - int len ; - for(char* src= str; src < end; src += len) { - if(!(*src & 0x80)) { - *dest++ = *src; - len = 1; - continue; - } - enum unicode_codepoint codepoint = 0; - len = utf8_getc(src, end - src, &codepoint); - if(len < 2) { - if(error_ch) - *dest++ = error_ch; - len = 1; - continue; - } - if(lookup != NULL) { - char ch = lookup(codepoint); - if(ch) { - *dest++ = ch; - continue; - } - } - if(unicode_width(codepoint) == 0) { - if(unsupported_zwch) - *dest++ = unsupported_zwch; - } - else if(unsupported_ch) - *dest++ = unsupported_ch; - } - *dest = 0; - return str; -} - -bool utf8_str_is_valid(const char* str) -{ - const char* end = str + strlen(str); - while (str < end) { - int len = utf8_getc(str, end - str, NULL); - if (len < 1) - return false; - str += len; - } - return true; -} - -// Return the total printed-width of UTF-8 string (str) accounting for zero/half/full-width codepoints -size_t utf8_str_total_width(const char* str) -{ - size_t count = 0; - const char* end = str + strlen(str); - while (str < end) { - enum unicode_codepoint codepoint = 0; - int len = utf8_getc(str, end - str, &codepoint); - if (len < 1) - break; - count += unicode_width(codepoint); - str += len; - } - return count; -} - -// Return the count of codepoints within the specified width range in UTF-8 string (str) -size_t utf8_str_count_width(const char* str, size_t min_width, size_t max_width) -{ - size_t count = 0; - const char* end = str + strlen(str); - while (str < end) { - enum unicode_codepoint codepoint = 0; - int len = utf8_getc(str, end - str, &codepoint); - if (len < 1) - break; - size_t width = unicode_width(codepoint); - if(width >= min_width && width <= max_width) - count++; - str += len; - } - return count; -} - -int cp437_to_utf8_str(const char* str, char* dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const unsigned char* p = (const unsigned char*)str; *p != 0; p++) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint = 0; - if(*p >= minval) - codepoint = cp437_unicode_tbl[*p]; - if(codepoint) { - retval = utf8_putc(dest + *outlen, maxlen - *outlen, codepoint); - if(retval < 1) - break; - *outlen += retval; - } else { - *(dest + *outlen) = *p; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -int utf8_to_cp437_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - unsigned char ch; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const char* p = src; *p != 0; p += retval) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint; - retval = utf8_getc(p, maxlen - *outlen, &codepoint); - if (retval < 1) - break; - ch = unicode_to_cp437(codepoint); - if (ch) { - *(dest + *outlen) = ch; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -int latin1_to_utf8_str(const char* str, char* dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const unsigned char* p = (const unsigned char *)str; *p != 0; p++) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint = 0; - if(*p >= minval) - codepoint = *p; - if(codepoint) { - retval = utf8_putc(dest + *outlen, maxlen - *outlen, codepoint); - if(retval < 1) - break; - *outlen += retval; - } else { - *(dest + *outlen) = *p; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -int utf8_to_latin1_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen) -{ - int retval = 0; - size_t lcl_outlen; - unsigned char ch; - if (outlen == NULL) - outlen = &lcl_outlen; - *outlen = 0; - for(const char* p = src; *p != 0; p += retval) { - if(*outlen >= maxlen) { - retval = -1; - break; - } - enum unicode_codepoint codepoint; - retval = utf8_getc(p, maxlen - *outlen, &codepoint); - if (retval < 1) - break; - ch = unicode_to_latin1(codepoint); - if (ch) { - *(dest + *outlen) = ch; - (*outlen)++; - } - } - *(dest + *outlen) = 0; - return retval; -} - -// From openssl/crypto/asn1/a_utf8.c: -/* - * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* UTF8 utilities */ - -/*- - * This parses a UTF8 string one codepoint at a time. It is passed a pointer - * to the string and the size of the string (in bytes). It sets 'value' to - * the value of the current codepoint. It returns the number of bytes read - * or a negative error code: - * -1 = string too short - * -2 = illegal character - * -3 = subsequent characters not of the form 10xxxxxx - * -4 = character encoded incorrectly (not minimal length). - */ - -int utf8_getc(const char *str, size_t len, enum unicode_codepoint* val) -{ - const unsigned char *p; - unsigned long value; - int ret; - if (len <= 0) - return 0; - p = (const unsigned char*)str; - - /* Check syntax and work out the encoded value (if correct) */ - if ((*p & 0x80) == 0) { - value = *p++ & 0x7f; - ret = 1; - } else if ((*p & 0xe0) == 0xc0) { - if (len < 2) - return -1; - if ((p[1] & 0xc0) != 0x80) - return -3; - value = (*p++ & 0x1f) << 6; - value |= *p++ & 0x3f; - if (value < 0x80) - return -4; - ret = 2; - } else if ((*p & 0xf0) == 0xe0) { - if (len < 3) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80)) - return -3; - value = (*p++ & 0xf) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x800) - return -4; - ret = 3; - } else if ((*p & 0xf8) == 0xf0) { - if (len < 4) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80) - || ((p[3] & 0xc0) != 0x80)) - return -3; - value = ((unsigned long)(*p++ & 0x7)) << 18; - value |= (*p++ & 0x3f) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x10000) - return -4; - ret = 4; - } else if ((*p & 0xfc) == 0xf8) { - if (len < 5) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80) - || ((p[3] & 0xc0) != 0x80) - || ((p[4] & 0xc0) != 0x80)) - return -3; - value = ((unsigned long)(*p++ & 0x3)) << 24; - value |= ((unsigned long)(*p++ & 0x3f)) << 18; - value |= ((unsigned long)(*p++ & 0x3f)) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x200000) - return -4; - ret = 5; - } else if ((*p & 0xfe) == 0xfc) { - if (len < 6) - return -1; - if (((p[1] & 0xc0) != 0x80) - || ((p[2] & 0xc0) != 0x80) - || ((p[3] & 0xc0) != 0x80) - || ((p[4] & 0xc0) != 0x80) - || ((p[5] & 0xc0) != 0x80)) - return -3; - value = ((unsigned long)(*p++ & 0x1)) << 30; - value |= ((unsigned long)(*p++ & 0x3f)) << 24; - value |= ((unsigned long)(*p++ & 0x3f)) << 18; - value |= ((unsigned long)(*p++ & 0x3f)) << 12; - value |= (*p++ & 0x3f) << 6; - value |= *p++ & 0x3f; - if (value < 0x4000000) - return -4; - ret = 6; - } else - return -2; - if(val != NULL) - *val = value; - return ret; -} - -/* - * This takes a codepoint 'value' and writes the UTF8 encoded sequence in 'str' - * where 'str' is a buffer of 'len' bytes. Returns the number of bytes written - * or -1 if 'len' is too small. 'str' can be set to NULL in which case it just - * returns the number of bytes. It will need at most 6 bytes. - */ - -int utf8_putc(char *str, size_t len, unsigned value) -{ - if (!str) - len = 6; /* Maximum we will need */ - else if (len <= 0) - return -1; - if (value < 0x80) { - if (str) - *str = (unsigned char)value; - return 1; - } - if (value < 0x800) { - if (len < 2) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 2; - } - if (value < 0x10000) { - if (len < 3) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 3; - } - if (value < 0x200000) { - if (len < 4) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 4; - } - if (value < 0x4000000) { - if (len < 5) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8); - *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 5; - } - if (len < 6) - return -1; - if (str) { - *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc); - *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 6; -} diff --git a/encode/utf8.h b/encode/utf8.h deleted file mode 100644 index 2cbe6b9289e9d3c67c87bbe67a09fc11f594c919..0000000000000000000000000000000000000000 --- a/encode/utf8.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Synchronet UTF-8 translation functions */ - -/* $Id: utf8.h,v 1.6 2019/08/03 08:05:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef UTF8_H_ -#define UTF8_H_ - -#include <stdbool.h> -#include <stdlib.h> -#include "unicode_defs.h" - -#define UTF8_MAX_LEN 6 // Longest possible UTF-8 sequence - -#if defined(__cplusplus) -extern "C" { -#endif - -// Returns true if the string is valid UTF-8 -bool utf8_str_is_valid(const char*); - -// Returns the fixed printed-width of the UTF-8 string -size_t utf8_str_total_width(const char*); - -// Return the count of codepoints within the specified width range in UTF-8 string (str) -size_t utf8_str_count_width(const char*, size_t min_width, size_t max_width); - -// Normalizes (to ASCII) chars in UTF-8 string 'str', in-place, resulting in string <= original in length -char* utf8_normalize_str(char* str); - -// Replace or strip UTF-8 sequences in str (in-place) -// 'lookup' is a Unicode codepoint look-up function (optional) -// 'unsupported_ch' is the byte used to replace unsupported Unicode codepoints (optional) -// 'unsupported_zwch' is the byte used to replace unsupported zero-width Unicode codepoints (optional) -// 'error_ch' is the byte used to replace invalid UTF-8 sequence bytes (optional) -char* utf8_replace_chars(char* str, char (*lookup)(enum unicode_codepoint), char unsupported_ch, char unsupported_zwch, char error_ch); - -// Convert a CP437 char string (src) to UTF-8 string (dest) up to 'maxlen' bytes long (sans NUL-terminator) -// 'minval' can be used to limit the range of converted chars. On return, *outlen is set to the number -// of bytes written to dest unless it is NULL -int cp437_to_utf8_str(const char* src, char* dest, size_t maxlen, unsigned char minval, size_t *outlen); -int utf8_to_cp437_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen); - -// Convert a Latin1 char string (src) to UTF-8 string (dest) up to 'maxlen' bytes long (sans NUL-terminator) -// 'minval' can be used to limit the range of converted chars. On return, *outlen is set to the number -// of bytes written to dest unless it is NULL -int latin1_to_utf8_str(const char* str, char* dest, size_t maxlen, unsigned char minval, size_t *outlen); -int utf8_to_latin1_str(const char *src, char *dest, size_t maxlen, unsigned char minval, size_t *outlen); - -// Decode a UTF-8 sequence to a UNICODE code point -int utf8_getc(const char* str, size_t len, enum unicode_codepoint* codepoint); - -// Encode a UNICODE code point into a UTF-8 sequence (str) -int utf8_putc(char* str, size_t len, unsigned codepoint); - -#if defined(__cplusplus) -} -#endif - -#endif // Don't add anything after this line diff --git a/encode/uucode.c b/encode/uucode.c deleted file mode 100644 index 8c985aea4eb78e757b40b9ad77d539d101d1604c..0000000000000000000000000000000000000000 --- a/encode/uucode.c +++ /dev/null @@ -1,248 +0,0 @@ -/* uucode.c */ - -/* Unix-to-unix encoding/decoding routines */ - -/* $Id: uucode.c,v 1.6 2019/07/18 03:10:54 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include "uucode.h" - -ssize_t uudecode(char *target, size_t tlen, const char *source, size_t slen) -{ - int i; - char ch; - size_t rd=0; - size_t wr=0; - size_t block; - size_t len; - unsigned char cell[4]; - - if(slen==0) - slen=strlen(source); - while(rd<slen && wr<tlen) { - ch=source[rd++]; - if(ch<' ') - continue; - len=(ch-' ')&0x3f; - if(len<=0 || rd>=slen) - break; - block=0; - while(block<len && wr<tlen && rd<slen) { - memset(cell,0,sizeof(cell)); - /* Remove space bias */ - for(i=0;i<sizeof(cell) && rd<slen;i++) { - cell[i]=source[rd++]; - if(cell[i]>=' ') cell[i]-=' '; - } - /* Convert block of 4 6-bit chars into 3 8-bit chars */ - target[wr]=(cell[0]&0x3f)<<2; /* lower 6 (s1) to upper 6 (d1) */ - target[wr++]|=(cell[1]&0x30)>>4; /* upper 2 (s2) to lower 2 (d1) */ - target[wr]=(cell[1]&0x0f)<<4; /* lower 4 (s2) to upper 4 (d2) */ - target[wr++]|=(cell[2]&0x3c)>>2; /* upper 4 (s3) to lower 4 (d2) */ - target[wr]=(cell[2]&0x03)<<6; /* lower 2 (s3) to upper 2 (d3) */ - target[wr++]|=cell[3]&0x3f; /* lower 6 (s4) to lower 6 (d3) */ - block+=3; - } -#if 0 - if(block!=len) { - fprintf(stderr,"block (%d) != len (%d)\n",block,len); - return(-1); - } -#endif - while(rd<slen && source[rd]>' ') - rd++; /* find whitespace (line termination) */ - while(rd<slen && source[rd]!=0 && source[rd]<=' ') - rd++; /* skip whitespace separating blocks/lines */ - } - - return(wr); -} - -#define BIAS(b) if((b)==0) (b)='`'; else (b)+=' '; - -ssize_t uuencode(char *target, size_t tlen, const char *source, size_t slen) -{ - size_t rd=0; - size_t wr=0; - size_t block; - size_t len; - - if(slen==0) - slen=strlen(source); - - if(tlen<3) - return(-1); - tlen-=3; /* reserve room for terminator */ - while(rd<=slen && wr<tlen) { - len=45; - if(rd+len>slen) - len=slen-rd; - BIAS(len); - target[wr++]=(char)len; - - block=0; - while(block<len && wr<tlen && rd<slen) { - target[wr]=source[rd]>>2; /* upper 6 (s1) to lower 6 (d1) */ - BIAS(target[wr]); wr++; - target[wr]=(source[rd++]&0x03)<<4; /* lower 2 (s1) to upper 2 (d2) */ - target[wr]|=source[rd]>>4; /* upper 4 (s2) to lower 4 (d2) */ - BIAS(target[wr]); wr++; - target[wr]=(source[rd++]&0x0f)<<2; /* lower 4 (s2) to upper 4 (d3) */ - target[wr]|=source[rd]>>6; /* upper 2 (s3) to lower 2 (d3) */ - BIAS(target[wr]); wr++; - target[wr]=source[rd++]&0x3f; /* lower 6 (s3) to lower 6 (d4) */ - BIAS(target[wr]); wr++; - block+=3; - } - if(wr<tlen) { - target[wr++]='\r'; - target[wr++]='\n'; - } - if(rd>=slen) - break; - } - - if(wr<tlen) - target[wr++]=0; - return(wr); -} - -#ifdef UUDECODE_TEST - -static char* truncstr(char* str, const char* set) -{ - char* p; - - p=strpbrk(str,set); - if(p!=NULL) - *p=0; - - return(p); -} - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - char* p; - FILE* in; - FILE* out=NULL; - int len; - int line; - - if(argc<2) { - fprintf(stderr,"usage: uudecode infile\n"); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - memset(str,0,sizeof(str)); - if(fgets(str,sizeof(str),in)==NULL) - break; - truncstr(str,"\r\n"); - if(strncmp(str,"begin ",6)==0) { - p=str+7; - while(*p && isdigit(*p)) p++; /* skip mode */ - while(*p && *p<=' ') p++; - if((out=fopen(p,"wb"))==NULL) { - perror(p); - return 1; - } - fprintf(stderr,"Creating %s\n",p); - line=1; - continue; - } - if(strcmp(str,"end")==0) { - if(out!=NULL) { - fclose(out); - out=NULL; - } - continue; - } - if(out==NULL) - continue; - len=uudecode(buf,sizeof(buf),str,0); - if(len<0) { - fprintf(stderr,"!Error decoding: %s\n",str); - break; - } - fwrite(buf,len,1,out); - line++; - } - - return 0; -} -#elif defined(UUENCODE_TEST) - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - FILE* in; - int len; - - if(argc<2) { - fprintf(stderr,"usage: uuencode infile\n"); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - len=fread(buf,1,45,in); - if(len<0) - break; - len=uuencode(str,sizeof(str),buf,len); - if(len<1) - break; - printf("%.*s",len,str); - } - - return 0; -} - -#endif - - diff --git a/encode/uucode.h b/encode/uucode.h deleted file mode 100644 index 2f506f97513e2dfb77b9d858c03e5f5997b38761..0000000000000000000000000000000000000000 --- a/encode/uucode.h +++ /dev/null @@ -1,49 +0,0 @@ -/* uucode.c */ - -/* Unix-to-Unix encoding/decoding exported function prototypes */ - -/* $Id: uucode.h,v 1.2 2018/07/24 01:11:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "gen_defs.h" // ssize_t - -#ifdef __cplusplus -extern "C" { -#endif - -ssize_t uuencode(char *target, size_t tlen, const char *source, size_t slen); -ssize_t uudecode(char *target, size_t tlen, const char *source, size_t slen); - -#ifdef __cplusplus -} -#endif diff --git a/encode/yenc.c b/encode/yenc.c deleted file mode 100644 index 9cba43e78581f0930d9693a7106f488fa6a4f1df..0000000000000000000000000000000000000000 --- a/encode/yenc.c +++ /dev/null @@ -1,203 +0,0 @@ -/* yenc.c */ - -/* yEnc encoding/decoding routines */ - -/* $Id: yenc.c,v 1.2 2018/02/20 11:57:13 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include "yenc.h" - -#define YENC_BIAS 42 -#define YENC_ESCAPE_CHAR '=' -#define YENC_ESCAPE_BIAS 64 - -ssize_t ydecode(char *target, size_t tlen, const char *source, size_t slen) -{ - char ch; - size_t rd=0; - size_t wr=0; - - if(slen==0) - slen=strlen(source); - while(rd<slen && wr<tlen) { - ch=source[rd++]; - if(ch==YENC_ESCAPE_CHAR && rd<slen) - ch=source[rd++]-YENC_ESCAPE_BIAS; - ch-=YENC_BIAS; - target[wr++]=ch; - } - - return(wr); -} - -ssize_t yencode(char *target, size_t tlen, const char *source, size_t slen) -{ - char ch; - size_t rd=0; - size_t wr=0; - int done=0; - - if(slen==0) - slen=strlen(source); - while(rd<=slen && wr<tlen && !done) { - ch=source[rd++]; - ch+=YENC_BIAS; - switch(ch) { - case 0: - case '\r': - case '\n': - case YENC_ESCAPE_CHAR: - if(wr+1>=tlen) { /* no room for escaped char */ - done=1; - continue; - } - ch+=YENC_ESCAPE_BIAS; - target[wr++]=YENC_ESCAPE_CHAR; - break; - } - target[wr++]=ch; - } - - if(wr<tlen) - target[wr++]=0; - return(wr); -} - -#if defined(YDECODE_TEST) - -static char* truncstr(char* str, const char* set) -{ - char* p; - - p=strpbrk(str,set); - if(p!=NULL) - *p=0; - - return(p); -} - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - char* p; - FILE* in; - FILE* out=NULL; - int len; - int line; - - if(argc<2) { - fprintf(stderr,"usage: %s infile\n",argv[0]); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - memset(str,0,sizeof(str)); - if(fgets(str,sizeof(str),in)==NULL) - break; - truncstr(str,"\r\n"); - if(strncmp(str,"=ybegin ",8)==0) { - p=strstr(str,"name="); - p+=5; - if((out=fopen(p,"wb"))==NULL) { - perror(p); - return 1; - } - fprintf(stderr,"Creating %s\n",p); - line=1; - continue; - } - if(strncmp(str,"=yend ",6)==0) { - if(out!=NULL) { - fclose(out); - out=NULL; - } - continue; - } - if(out==NULL) - continue; - len=ydecode(buf,sizeof(buf),str,0); - if(len<0) { - fprintf(stderr,"!Error decoding: %s\n",str); - break; - } - fwrite(buf,len,1,out); - line++; - } - - return 0; -} -#elif defined(YENCODE_TEST) - -int main(int argc, char**argv) -{ - char str[1024]; - char buf[256]; - FILE* in; - int len; - - if(argc<2) { - fprintf(stderr,"usage: %s infile\n",argv[0]); - return 1; - } - - if((in=fopen(argv[1],"rb"))==NULL) { - perror(argv[1]); - return 1; - } - - while(!feof(in)) { - len=fread(buf,1,45,in); - if(len<0) - break; - len=yencode(str,sizeof(str),buf,len); - if(len<1) - break; - printf("%.*s",len,str); - } - - return 0; -} - -#endif - - diff --git a/encode/yenc.h b/encode/yenc.h deleted file mode 100644 index 2e31d25f828ee6c613e39671994282e10165d9a5..0000000000000000000000000000000000000000 --- a/encode/yenc.h +++ /dev/null @@ -1,49 +0,0 @@ -/* yenc.c */ - -/* yEnc encoding/decoding exported function prototypes */ - -/* $Id: yenc.h,v 1.2 2018/07/24 01:11:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "gen_defs.h" // ssize_t - -#ifdef __cplusplus -extern "C" { -#endif - -ssize_t yencode(char *target, size_t tlen, const char *source, size_t slen); -ssize_t ydecode(char *target, size_t tlen, const char *source, size_t slen); - -#ifdef __cplusplus -} -#endif diff --git a/hash/CMakeLists.txt b/hash/CMakeLists.txt deleted file mode 100644 index 8303fff3fb04ad249a531450efb9e3cfb2279c94..0000000000000000000000000000000000000000 --- a/hash/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -project (Hash C) -find_package(XPDev QUIET CONFIG PATHS lib/cmake/XPDev) - -cmake_minimum_required(VERSION 3.11) - -set(SOURCE - crc16.c - crc32.c - md5.c - sha1.c -) - -set(HEADER - crc16.h - crc32.h - md5.h - sha1.h -) - -add_library(hash OBJECT ${SOURCE}) -target_include_directories(hash PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(hash xpdev) diff --git a/hash/README.md b/hash/README.md deleted file mode 100644 index 5f4b0c0c1df017433622fde23aee5669915d098e..0000000000000000000000000000000000000000 --- a/hash/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Synchronet project: hash library - -This directory contains code and data for various one-way hash functions -e.g. checksums, CRCs, digests, etc. - diff --git a/hash/crc16.c b/hash/crc16.c deleted file mode 100644 index c95801d1252f30d3dcb3f4fb51cec5d29943278c..0000000000000000000000000000000000000000 --- a/hash/crc16.c +++ /dev/null @@ -1,81 +0,0 @@ -/* CCITT 16-bit CRC table and calculation function */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strlen */ -#include "crc16.h" - -uint16_t crc16tbl[] = { -0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, -0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, -0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, -0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, -0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, -0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, -0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, -0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, -0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, -0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, -0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, -0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, -0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, -0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, -0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, -0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, -0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, -0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, -0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, -0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, -0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, -0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, -0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, -0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, -0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, -0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, -0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, -0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, -0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, -0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, -0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, -0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; - -uint16_t crc16(const char* data, size_t len) -{ - uint16_t crc = 0; - size_t l; - - if(len==0 && data!=NULL) - len=strlen(data); - for(l=0;l<len;l++) - crc = ucrc16(data[l],crc); - - return crc; -} - -uint16_t icrc16(uint16_t crc, const char* data, size_t len) -{ - size_t l; - - for(l=0; l<len; l++) - crc = ucrc16(data[l], crc); - - return crc; -} diff --git a/hash/crc16.h b/hash/crc16.h deleted file mode 100644 index bca8a90eb7b6741eac372948ca52fb2003284b2c..0000000000000000000000000000000000000000 --- a/hash/crc16.h +++ /dev/null @@ -1,42 +0,0 @@ -/* CCITT 16-bit CRC table and calculation macro */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CRC16_H_ -#define _CRC16_H_ - -#include "gen_defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern uint16_t crc16tbl[]; - -uint16_t crc16(const char* data, size_t len); -uint16_t icrc16(uint16_t crc, const char* data, size_t len); - -#ifdef __cplusplus -} -#endif - -#define ucrc16(ch,crc) (crc16tbl[((crc>>8)&0xff)^(unsigned char)ch]^(crc << 8)) - -#endif /* Don't add anything after this line */ diff --git a/hash/crc32.c b/hash/crc32.c deleted file mode 100644 index 2ad0843043a7f15b7913fe2ab85d0976f0f5a5ad..0000000000000000000000000000000000000000 --- a/hash/crc32.c +++ /dev/null @@ -1,89 +0,0 @@ -/* IEEE 802.3 32-bit CRC table and convenience functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strlen */ -#include "crc32.h" - -int32_t crc32tbl[]={ /* CRC polynomial 0xedb88320 */ -0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -/****************************************************************************/ -/* Returns CRC-32 of sequence of bytes (binary or ASCIIZ) */ -/* Pass len of 0 to auto-determine ASCIIZ string length */ -/* or non-zero for arbitrary binary data */ -/****************************************************************************/ -uint32_t crc32i(uint32_t crc, const char *buf, size_t len) -{ - size_t l; - - if(len==0 && buf!=NULL) - len=strlen(buf); - for(l=0;l<len;l++) - crc=ucrc32(buf[l],crc); - return ~crc; -} - -uint32_t fcrc32(FILE* fp, size_t len) -{ - int ch; - uint32_t crc=0xffffffff; - size_t l; - - rewind(fp); - for(l=0;(len==0 || l<len) && !feof(fp);l++) { - if((ch=fgetc(fp))==EOF) - break; - crc=ucrc32(ch,crc); - } - return ~crc; -} diff --git a/hash/crc32.h b/hash/crc32.h deleted file mode 100644 index b7b7ba49f69c8d587264f0fc9a27e3c5739a1f52..0000000000000000000000000000000000000000 --- a/hash/crc32.h +++ /dev/null @@ -1,44 +0,0 @@ -/* 32-bit CRC table and calculation macro */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CRC32_H_ -#define _CRC32_H_ - -#include <stdio.h> /* FILE */ -#include "gen_defs.h" /* uint32_t */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int32_t crc32tbl[]; - -uint32_t crc32i(uint32_t crc, const char* buf, size_t); -uint32_t fcrc32(FILE* fp, size_t); - -#ifdef __cplusplus -} -#endif - -#define ucrc32(ch,crc) (crc32tbl[(crc^(ch))&0xff]^(crc>>8)) -#define crc32(x,y) crc32i(0xffffffff,x,y) - -#endif /* Don't add anything after this line */ diff --git a/hash/md5.c b/hash/md5.c deleted file mode 100644 index 107ce8a8496e521df3957c050d259f3eb6c28dc5..0000000000000000000000000000000000000000 --- a/hash/md5.c +++ /dev/null @@ -1,304 +0,0 @@ -/* md5.c - RSA Data Security, Inc., MD5 Message-Digest Algorithm */ - -/* $Id: md5.c,v 1.7 2012/10/23 07:59:36 deuce Exp $ */ - -/* NOTE: Numerous changes have been made; the following notice is -included to satisfy legal requirements. - -Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this -documentation and/or software. -*/ - -#include <memory.h> -#include "md5.h" - -#if !defined(BIG_ENDIAN) - #define LITTLE_ENDIAN /* Little Endian by default */ -#endif - -void MD5_open(MD5 *md5) -{ - md5->count[0] = md5->count[1] = 0; - /* Load magic initialization constants.*/ - md5->state[0] = 0x67452301; - md5->state[1] = 0xefcdab89; - md5->state[2] = 0x98badcfe; - md5->state[3] = 0x10325476; -} - -/* Constants for MD5Transform routine. */ - -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - -/* F, G, H and I are basic MD5 functions. */ - -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | (~z))) - -/* ROTATE_LEFT rotates x left n bits. */ - -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) - -/* Round1, Round2, Round3, and Round4 transformations for rounds 1, 2, 3, and 4. - Rotation is separate from addition to prevent recomputation. -*/ - -#define Round1(a, b, c, d, x, s, ac) { \ - (a) += F((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define Round2(a, b, c, d, x, s, ac) { \ - (a) += G((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define Round3(a, b, c, d, x, s, ac) { \ - (a) += H((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } -#define Round4(a, b, c, d, x, s, ac) { \ - (a) += I((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT((a), (s)); \ - (a) += (b); \ - } - - -/* MD5 basic transformation. Transforms state based on block. */ - -static void MD5Transform(uint32_t state[4], const BYTE block[64]) -{ - uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[MD5_DIGEST_SIZE]; - /* Move contents of block to x, putting bytes in little-endian order. */ - #ifdef LITTLE_ENDIAN - memcpy(x, block, 64); - #else - { - unsigned int i, j; - for (i = j = 0; i < MD5_DIGEST_SIZE; i++, j+= 4) - { - x[i] = (uint32_t) block[j] | (uint32_t) block[j+1] << 8 | - (uint32_t) block[j+2] << 16 | (uint32_t) block[j+3] << 24; - } - } - #endif - /* Round 1 */ - Round1(a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ - Round1(d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ - Round1(c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ - Round1(b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ - Round1(a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ - Round1(d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ - Round1(c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ - Round1(b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ - Round1(a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ - Round1(d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ - Round1(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ - Round1(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ - Round1(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ - Round1(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ - Round1(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ - Round1(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ - /* Round 2 */ - Round2(a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ - Round2(d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ - Round2(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ - Round2(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ - Round2(a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ - Round2(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ - Round2(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ - Round2(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ - Round2(a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ - Round2(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ - Round2(c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ - Round2(b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ - Round2(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ - Round2(d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ - Round2(c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ - Round2(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ - /* Round 3 */ - Round3(a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ - Round3(d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ - Round3(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ - Round3(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ - Round3(a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ - Round3(d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ - Round3(c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ - Round3(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ - Round3(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ - Round3(d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ - Round3(c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ - Round3(b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ - Round3(a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ - Round3(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ - Round3(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ - Round3(b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ - /* Round 4 */ - Round4(a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ - Round4(d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ - Round4(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ - Round4(b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ - Round4(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ - Round4(d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ - Round4(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ - Round4(b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ - Round4(a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ - Round4(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ - Round4(c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ - Round4(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ - Round4(a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ - Round4(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ - Round4(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ - Round4(b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - /* Zeroize sensitive information. */ - memset(x, 0, sizeof(x)); -} - -void MD5_digest(MD5 *md5, const void *input, size_t inputLen) -{ - unsigned int i, index, partLen; - /* Compute number of bytes mod 64 */ - index = (unsigned int)((md5->count[0] >> 3) & 0x3F); - /* Update number of bits */ - if ((md5->count[0] += ((uint32_t)inputLen << 3)) < ((uint32_t)inputLen << 3)) - md5->count[1]++; - md5->count[1] += ((uint32_t)inputLen >> 29); - partLen = 64 - index; - /* Transform as many times as possible.*/ - if (inputLen >= partLen) - { - memcpy(&md5->buffer[index], input, partLen); - MD5Transform(md5->state, md5->buffer); - for (i = partLen; i + 63 < inputLen; i += 64) - MD5Transform(md5->state, (BYTE *) input + i); - index = 0; - } - else - i = 0; - /* Buffer remaining input */ - memcpy(&md5->buffer[index], (char *) input + i, inputLen-i); -} - -/* ENCODE packs a 32-bit unsigned integer into 4 bytes in little-endian - order. -*/ - -#ifdef LITTLE_ENDIAN -#define ENCODE(p,n) *(uint32_t *)(p) = n -#else -#define ENCODE(p,n) (p)[0]=n,(p)[1]=n>>8,(p)[2]=n>>16,(p)[3]=n>>24 -#endif - -void MD5_close(MD5 *md5, BYTE digest[MD5_DIGEST_SIZE]) -{ - BYTE bits[8]; - unsigned int index, padLen; - static BYTE PADDING[64] = - { - 0x80, 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, 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, 0, 0, 0, 0, 0 - }; - /* Save number of bits */ - ENCODE(bits, md5->count[0]); - ENCODE(bits+4, md5->count[1]); - /* Pad out to 56 mod 64. */ - index = (unsigned int)((md5->count[0] >> 3) & 0x3f); - padLen = (index < 56) ? (56 - index) : (120 - index); - MD5_digest(md5, PADDING, padLen); - /* Append length (before padding) */ - MD5_digest(md5, bits, 8); - /* Store state in digest */ - ENCODE(digest, md5->state[0]); - ENCODE(digest+4, md5->state[1]); - ENCODE(digest+8, md5->state[2]); - ENCODE(digest+12, md5->state[3]); - /* Zeroize sensitive information. */ - memset(md5, 0, sizeof(MD5)); -} - -BYTE* MD5_calc(BYTE digest[MD5_DIGEST_SIZE], const void* buf, size_t len) -{ - MD5 ctx; - - MD5_open(&ctx); - MD5_digest(&ctx,buf,len); - MD5_close(&ctx,digest); - - return(digest); -} - -/* conversion for 16 character binary md5 to hex */ - -char* MD5_hex(char* to, const BYTE digest[MD5_DIGEST_SIZE]) -{ - BYTE const* from = digest; - const char *hexdigits = "0123456789abcdef"; - const BYTE *end = digest + MD5_DIGEST_SIZE; - char *d = to; - - while (from < end) { - *d++ = hexdigits[(*from >> 4)]; - *d++ = hexdigits[(*from & 0x0F)]; - from++; - } - *d = '\0'; - return to; -} - -#ifdef MD5_TEST - -int main(int argc, char**argv) -{ - int i; - char hexbuf[(MD5_DIGEST_SIZE*2)+1]; - BYTE digest[MD5_DIGEST_SIZE]; - - for(i=1;i<argc;i++) - printf("%s\n" - ,MD5_hex(hexbuf,MD5_calc(digest,argv[i],strlen(argv[i])))); - - return 0; -} - -#endif diff --git a/hash/md5.h b/hash/md5.h deleted file mode 100644 index c23a4a1254b355ff50692d6d9c164c7b2dbc1074..0000000000000000000000000000000000000000 --- a/hash/md5.h +++ /dev/null @@ -1,75 +0,0 @@ -/* md5.h - header file for md5.c */ - -/* $Id: md5.h,v 1.7 2019/03/22 21:29:12 rswindell Exp $ */ - -/* RSA Data Security, Inc., MD5 Message-Digest Algorithm */ - -/* NOTE: Numerous changes have been made; the following notice is -included to satisfy legal requirements. - -Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. - -These notices must be retained in any copies of any part of this -documentation and/or software. -*/ - -#ifndef H__MD5 -#define H__MD5 - -#include <stddef.h> /* size_t */ -#include <gen_defs.h> /* uint32_t */ - -#define MD5_DIGEST_SIZE 16 - -#ifndef BYTE - typedef unsigned char BYTE; -#endif - -typedef struct -{ - uint32_t state[4]; - uint32_t count[2]; - BYTE buffer[64]; -} MD5; - -#if defined(_WIN32) && (defined(MD5_IMPORTS) || defined(MD5_EXPORTS)) - #if defined(MD5_IMPORTS) - #define MD5EXPORT __declspec(dllimport) - #else - #define MD5EXPORT __declspec(dllexport) - #endif -#else /* !_WIN32 */ - #define MD5EXPORT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -MD5EXPORT void MD5_open(MD5* ctx); -MD5EXPORT void MD5_digest(MD5* ctx, const void* buf, size_t len); -MD5EXPORT void MD5_close(MD5* ctx, BYTE digest[MD5_DIGEST_SIZE]); -MD5EXPORT BYTE* MD5_calc(BYTE digest[MD5_DIGEST_SIZE], const void* buf, size_t len); -MD5EXPORT char* MD5_hex(char* dest, const BYTE digest[MD5_DIGEST_SIZE]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/hash/sha1.c b/hash/sha1.c deleted file mode 100644 index a9dc3a5e4cef6728031987363a974c3d6a5bf852..0000000000000000000000000000000000000000 --- a/hash/sha1.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -SHA-1 in C -By Steve Reid <steve@edmweb.com> -100% Public Domain - -Test Vectors (from FIPS PUB 180-1) -"abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 -A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ -/* #define SHA1HANDSOFF * Copies data before messing with it. */ - -#define SHA1HANDSOFF - -#include <stdio.h> -#include <string.h> - -/* for uint32_t */ -#include <stdint.h> - -#include "sha1.h" - - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#if BYTE_ORDER == LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#elif BYTE_ORDER == BIG_ENDIAN -#define blk0(i) block->l[i] -#else -#error "Endianness not defined!" -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void SHA1Transform( - uint32_t state[5], - const uint8_t buffer[64] -) -{ - uint32_t a, b, c, d, e; - - typedef union - { - uint8_t c[64]; - uint32_t l[16]; - } CHAR64LONG16; - -#ifdef SHA1HANDSOFF - CHAR64LONG16 block[1]; /* use array to appear as a pointer */ - - memcpy(block, buffer, 64); -#else - /* The following had better never be used because it causes the - * pointer-to-const buffer to be cast into a pointer to non-const. - * And the result is written through. I threw a "const" in, hoping - * this will cause a diagnostic. - */ - CHAR64LONG16 *block = (const CHAR64LONG16 *) buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; -#ifdef SHA1HANDSOFF - memset(block, '\0', sizeof(block)); -#endif -} - - -/* SHA1Init - Initialize new context */ - -void SHA1Init( - SHA1_CTX * context -) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - - -/* Run your data through this. */ - -void SHA1Update( - SHA1_CTX * context, - const void * buf, - size_t len -) -{ - uint32_t i; - uint32_t j; - uint8_t* data = (uint8_t*)buf; - - j = context->count[0]; - if ((context->count[0] += len << 3) < j) - context->count[1]++; - context->count[1] += (len >> 29); - j = (j >> 3) & 63; - if ((j + len) > 63) - { - memcpy(&context->buffer[j], data, (i = 64 - j)); - SHA1Transform(context->state, context->buffer); - for (; i + 63 < len; i += 64) - { - SHA1Transform(context->state, &data[i]); - } - j = 0; - } - else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void SHA1Final( - SHA1_CTX * context, - uint8_t digest[SHA1_DIGEST_SIZE] -) -{ - unsigned i; - - uint8_t finalcount[8]; - - uint8_t c; - -#if 0 /* untested "improvement" by DHR */ - /* Convert context->count to a sequence of bytes - * in finalcount. Second element first, but - * big-endian order within element. - * But we do it all backwards. - */ - uint8_t *fcp = &finalcount[8]; - - for (i = 0; i < 2; i++) - { - uint32_t t = context->count[i]; - - int j; - - for (j = 0; j < 4; t >>= 8, j++) - *--fcp = (uint8_t) t} -#else - for (i = 0; i < 8; i++) - { - finalcount[i] = (uint8_t) ((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ - } -#endif - c = 0200; - SHA1Update(context, &c, 1); - while ((context->count[0] & 504) != 448) - { - c = 0000; - SHA1Update(context, &c, 1); - } - SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ - for (i = 0; i < 20; i++) - { - digest[i] = (uint8_t) - ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); - } - /* Wipe variables */ - memset(context, '\0', sizeof(*context)); - memset(&finalcount, '\0', sizeof(finalcount)); -} - -void SHA1_calc( - uint8_t *hash_out, - const void *data, - size_t len) -{ - SHA1_CTX ctx; - unsigned int ii; - - SHA1Init(&ctx); - for (ii=0; ii<len; ii+=1) - SHA1Update(&ctx, (const char*)data + ii, 1); - SHA1Final(&ctx, hash_out); -} - -/* conversion for 20 byte binary sha1 to hex */ -char* SHA1_hex(char* to, const uint8_t digest[SHA1_DIGEST_SIZE]) -{ - uint8_t const* from = digest; - const char *hexdigits = "0123456789abcdef"; - const uint8_t *end = digest + SHA1_DIGEST_SIZE; - char *d = to; - - while (from < end) { - *d++ = hexdigits[(*from >> 4)]; - *d++ = hexdigits[(*from & 0x0F)]; - from++; - } - *d = '\0'; - return to; -} diff --git a/hash/sha1.h b/hash/sha1.h deleted file mode 100644 index 852585ca2bd9638f82ec26dfd0db4718c21cd508..0000000000000000000000000000000000000000 --- a/hash/sha1.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef SHA1_H -#define SHA1_H - -/* - SHA-1 in C - By Steve Reid <steve@edmweb.com> - 100% Public Domain - */ - -#include <stddef.h> /* size_t */ -#include <gen_defs.h> /* uint32_t */ - -#define SHA1_DIGEST_SIZE 20 - -typedef struct -{ - uint32_t state[5]; - uint32_t count[2]; - uint8_t buffer[64]; -} SHA1_CTX; - -#ifdef __cplusplus -extern "C" { -#endif - -void SHA1Transform( - uint32_t state[5], - const uint8_t buffer[64] - ); - -void SHA1Init( - SHA1_CTX * context - ); - -void SHA1Update( - SHA1_CTX * context, - const void * data, - size_t len - ); - -void SHA1Final( - SHA1_CTX * context, - uint8_t digest[SHA1_DIGEST_SIZE] - ); - -void SHA1_calc( - uint8_t *hash_out, - const void *str, - size_t len); - -char* SHA1_hex(char* to, const uint8_t digest[SHA1_DIGEST_SIZE]); - -#ifdef __cplusplus -} -#endif - -#endif /* SHA1_H */ diff --git a/uifc/CMakeLists.txt b/uifc/CMakeLists.txt deleted file mode 100644 index a6ddccd7fd77e701aa3811e1a2162d7f59f445a0..0000000000000000000000000000000000000000 --- a/uifc/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -project (UIfC C) - -cmake_minimum_required(VERSION 3.11) - -INCLUDE (FindThreads) - -set(SOURCE - filepick.c - uifc32.c - uifcx.c -) - -set(HEADER - filepick.h - uifc.h -) - -add_library(uifc OBJECT ${SOURCE}) -target_include_directories(uifc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(uifc ciolib xpdev) diff --git a/uifc/filepick.c b/uifc/filepick.c deleted file mode 100644 index c960d50d6baa69475261539443964006e59d1ef4..0000000000000000000000000000000000000000 --- a/uifc/filepick.c +++ /dev/null @@ -1,721 +0,0 @@ -#include <ctype.h> - -#include "dirwrap.h" -#include "uifc.h" -#include "ciolib.h" - -#include "filepick.h" - -enum { - DIR_LIST - ,FILE_LIST - ,MASK_FIELD - ,CURRENT_PATH - ,FIELD_LIST_TERM -}; - -void drawfpwindow(uifcapi_t *api) -{ - struct vmem_cell lbuf[512]; - int i; - int j; - int listheight=0; - int height; - int width; - struct vmem_cell shade[512]; - - width=SCRN_RIGHT-SCRN_LEFT+1; - - height=api->scrn_len-3; - /* Make sure it's odd */ - if(!(width%2)) - width--; - - listheight=height-7; - - i=0; - set_vmem(&lbuf[i++], '\xc9', api->hclr|(api->bclr<<4), 0); - for(j=1;j<width-1;j++) - set_vmem(&lbuf[i++], '\xcd', api->hclr|(api->bclr<<4), 0); - if(api->mode&UIFC_MOUSE && width>6) { - set_vmem(&lbuf[1], '[', api->hclr|(api->bclr<<4), 0); - set_vmem(&lbuf[2], '\xfe', api->lclr|(api->bclr<<4), 0); - set_vmem(&lbuf[3], ']', api->hclr|(api->bclr<<4), 0); - set_vmem(&lbuf[4], '[', api->hclr|(api->bclr<<4), 0); - set_vmem(&lbuf[5], '?', api->lclr|(api->bclr<<4), 0); - set_vmem(&lbuf[6], ']', api->hclr|(api->bclr<<4), 0); - api->buttony=SCRN_TOP; - api->exitstart=SCRN_LEFT+1; - api->exitend=SCRN_LEFT+3; - api->helpstart=SCRN_LEFT+4; - api->helpend=SCRN_LEFT+6; - } - set_vmem(&lbuf[i++], '\xbb', api->hclr|(api->bclr<<4), 0); - vmem_puttext(SCRN_LEFT,SCRN_TOP,SCRN_LEFT+width-1,SCRN_TOP,lbuf); - set_vmem_attr(&lbuf[2], api->hclr|(api->bclr<<4)); - set_vmem_attr(&lbuf[5], api->hclr|(api->bclr<<4)); - for(j=1;j<7;j++) - lbuf[j].ch='\xcd'; - lbuf[0].ch='\xc8'; - lbuf[(width-1)].ch='\xbc'; - vmem_puttext(SCRN_LEFT,SCRN_TOP+height-1 - ,SCRN_LEFT+width-1,SCRN_TOP+height-1,lbuf); - lbuf[0].ch='\xcc'; - lbuf[(width-1)].ch='\xb9'; - lbuf[(width-1)/2].ch='\xcb'; - vmem_puttext(SCRN_LEFT,SCRN_TOP+2,SCRN_LEFT+width-1,SCRN_TOP+2,lbuf); - lbuf[(width-1)/2].ch='\xca'; - vmem_puttext(SCRN_LEFT,SCRN_TOP+3+listheight - ,SCRN_LEFT+width-1,SCRN_TOP+3+listheight,lbuf); - lbuf[0].ch='\xba'; - lbuf[(width-1)].ch='\xba'; - for(j=1;j<(width-1);j++) - lbuf[j].ch=' '; - vmem_puttext(SCRN_LEFT,SCRN_TOP+1, - SCRN_LEFT+width-1,SCRN_TOP+1,lbuf); - vmem_puttext(SCRN_LEFT,SCRN_TOP+height-2, - SCRN_LEFT+width-1,SCRN_TOP+height-2,lbuf); - vmem_puttext(SCRN_LEFT,SCRN_TOP+height-3, - SCRN_LEFT+width-1,SCRN_TOP+height-3,lbuf); - lbuf[(width-1)/2].ch='\xba'; - for(j=0;j<listheight;j++) - vmem_puttext(SCRN_LEFT,SCRN_TOP+3+j - ,SCRN_LEFT+width-1,SCRN_TOP+3+j,lbuf); - - /* Shadow */ - if(api->bclr==BLUE) { - vmem_gettext(SCRN_LEFT+width,SCRN_TOP+1,SCRN_LEFT+width+1 - ,SCRN_TOP+(height-1),shade); - for(j=0;j<512;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(SCRN_LEFT+width,SCRN_TOP+1,SCRN_LEFT+width+1 - ,SCRN_TOP+(height-1),shade); - vmem_gettext(SCRN_LEFT+2,SCRN_TOP+height,SCRN_LEFT+width+1 - ,SCRN_TOP+height,shade); - for(j=0;j<width;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(SCRN_LEFT+2,SCRN_TOP+height,SCRN_LEFT+width+1 - ,SCRN_TOP+height,shade); - } -} - -void free_opt_list(char ***opts) -{ - char **p; - - if(*opts==NULL) - return; - for(p=*opts; *p && (*p)[0]; p++) { - if(*p) - FREE_AND_NULL((*p)); - } - FREE_AND_NULL(*opts); -} - -char *insensitive_mask(char *mask) -{ -#ifdef __unix__ - char *in; - char *out; - static char nmask[MAX_PATH*4+1]; - - out=nmask; - for(in=mask; *in; in++) { - if(isalpha(*in)) { - *(out++)='['; - *(out++)=tolower(*in); - *(out++)=toupper(*in); - *(out++)=']'; - } - else - *(out++)=*in; - } - *out=0; - return(nmask); -#else - return(mask); -#endif -} - -char **get_file_opt_list(char **fns, int files, int dirsonly, int root) -{ - char **opts; - int i; - int j=0; - - opts=(char **)malloc((files+2)*sizeof(char *)); - if(opts==NULL) - return(NULL); - memset(opts, 0, (files+2)*sizeof(char *)); - if(dirsonly) { - if(!root) - opts[j++]=strdup(".."); - } - for(i=0;i<files;i++) { - if(isdir(fns[i])) { - if(dirsonly) - opts[j++]=strdup(getdirname(fns[i])); - } - else { - if(!dirsonly) - opts[j++]=strdup(getfname(fns[i])); - } - } - opts[j]=""; - return(opts); -} - -void display_current_path(uifcapi_t *api, char *path) -{ - char dpath[MAX_PATH+2]; - size_t width; - int height; -#ifdef _WIN32 - char *p; -#endif - - height=api->scrn_len-3; - width=SCRN_RIGHT-SCRN_LEFT-3; - SAFECOPY(dpath, path); - while(strlen(dpath) > width) { - /* Just remove paths from the start. */ - dpath[0]='.'; - dpath[1]='.'; - dpath[2]='.'; - memmove(dpath+3, dpath+(strlen(dpath)-width+4), width-1); - } - /* For Win32, convert all "confusing" / to \\ */ -#ifdef _WIN32 - for(p=dpath; *p; p++) { - if(*p=='/') - *p='\\'; - } - if (strncmp(dpath, "\\\\?\\", 4)==0) - memmove(dpath, dpath+4, strlen(dpath+3)); -#endif - - api->printf(SCRN_LEFT+2, SCRN_TOP+height-2, api->lclr|(api->bclr<<4), "%-*s", width, dpath); -} - -int mousetofield(int currfield, int opts, int height, int width, int listheight, int listwidth, int *dcur, int *dbar, int *fcur, int *fbar) -{ - int newfield; - int bardif; - struct mouse_event mevnt; - - newfield=currfield; - if(getmouse(&mevnt)==0) { - if(mevnt.endx >= SCRN_LEFT + 1 - && mevnt.endx <= SCRN_LEFT + listwidth - && mevnt.endy >= SCRN_TOP + 3 - && mevnt.endy <= SCRN_TOP + 2 + listheight) { - newfield = DIR_LIST; - if(mevnt.endx == SCRN_LEFT + 1) - ungetmouse(&mevnt); - else { - bardif = (mevnt.starty - SCRN_TOP - 3) - *dbar; - *dbar += bardif; - *dcur += bardif; - } - } - if(mevnt.endx >= SCRN_LEFT + 1 + listwidth + 1 - && mevnt.endx <= SCRN_LEFT + 1 + listwidth * 2 - && mevnt.endy >= SCRN_TOP + 3 - && mevnt.endy <= SCRN_TOP + 2 + listheight) { - newfield = FILE_LIST; - if(mevnt.endx == SCRN_LEFT + 1 + listwidth + 1) - ungetmouse(&mevnt); - else { - bardif = (mevnt.starty - SCRN_TOP - 3) - *fbar; - *fbar += bardif; - *fcur += bardif; - } - } - if(!(opts & UIFC_FP_MSKNOCHG) - && (mevnt.endx >= SCRN_LEFT + 1 - && mevnt.endx <= SCRN_LEFT + width - 2 - && mevnt.endy == SCRN_TOP + height - 3)) { - newfield = MASK_FIELD; - ungetmouse(&mevnt); - } - if(opts & UIFC_FP_ALLOWENTRY - && mevnt.endx >= SCRN_LEFT + 1 - && mevnt.endx <= SCRN_LEFT + width - 2 - && mevnt.endy == SCRN_TOP + height - 2) { - newfield = CURRENT_PATH; - ungetmouse(&mevnt); - } - } - return(newfield); -} - -int filepick(uifcapi_t *api, char *title, struct file_pick *fp, char *dir, char *msk, int opts) -{ - char cfile[MAX_PATH*8+1]; /* Current full path to file */ - char cpath[(MAX_PATH<<2)+1]; /* Current path */ - char drive[3]; - char tdir[MAX_PATH+1]; - char fname[MAX_PATH+1]; - char ext[MAX_PATH+1]; - char cmsk[MAX_PATH*4+1]; /* Current file mask */ - char cglob[MAX_PATH*4+1]; /* File glob patter */ - char dglob[MAX_PATH*4+2]; /* Directory glob pattern */ - char *p; - glob_t fgl; /* Files */ - glob_t dgl; /* Directories */ - int dircur=0; - int dirbar=0; - int filecur=0; - int filebar=0; - int listwidth; - char **dir_list=NULL; - char **file_list=NULL; - int currfield; - int lastfield; - int i; - int root=0; /* Is this the root of the file system? */ - /* On *nix, this just means no .. on Win32, - * Something should be done about drive letters. */ - int reread=FALSE; - int lbclr; - char *lastpath=NULL; - char *tmplastpath=NULL; - char *tmppath=NULL; - int width; - int height; - char *YesNo[]={"Yes", "No", ""}; - int finished=FALSE; - int retval=0; - int fieldmove; - int oldhu=hold_update; - int oldx=wherex(); - int oldy=wherey(); - - height=api->scrn_len-3; - width=SCRN_RIGHT-SCRN_LEFT-3; - - lbclr=api->lbclr; - - /* No struct passed */ - if(fp==NULL) - return(-1); - - /* Illegal options */ - if((opts & UIFC_FP_MULTI)==UIFC_FP_MULTI && (opts & (UIFC_FP_ALLOWENTRY|UIFC_FP_OVERPROMPT|UIFC_FP_CREATPROMPT))) - return(-1); - - if (opts & UIFC_FP_DIRSEL) - currfield = lastfield = DIR_LIST; - else - currfield = lastfield = FILE_LIST; - - fp->files=0; - fp->selected=NULL; - - /* No initial path specified */ - if(dir==NULL || !dir[0]) - SAFECOPY(cpath,"."); - - FULLPATH(cpath,((dir==NULL||dir[0]==0)?".":dir),sizeof(cpath)); - backslash(cpath); - - if(msk==NULL || msk[0]==0) { - SAFECOPY(cmsk,"*"); - } - else { - SAFECOPY(cmsk,msk); - } - sprintf(cfile,"%s%s",cpath,cmsk); - listwidth=SCRN_RIGHT-SCRN_LEFT+1; - listwidth-=listwidth%2; - listwidth-=3; - listwidth/=2; - /* Draw the file picker itself... */ - hold_update = TRUE; - drawfpwindow(api); - /* Display the title centered */ - i=strlen(title); - if(i>width-4) - i=width-4; - api->printf(SCRN_LEFT+2, SCRN_TOP+1, api->hclr|(api->bclr<<4), "%*s%-*s", (width-i)/2-2, "", i, title); - api->printf(SCRN_LEFT+2, SCRN_TOP+height-3, api->hclr|(api->bclr<<4), "Mask: "); - while(!finished) { - hold_update = TRUE; - api->printf(SCRN_LEFT+8, SCRN_TOP+height-3, api->lclr|(api->bclr<<4), "%-*s", width-7, cmsk); - tmppath=strdup(cpath); - if(tmppath != NULL) { -#ifdef _WIN32 - if (tmppath[0] == 0 || (tmppath[5]==0 && tmppath[3]=='.' && tmppath[4]=='.' && tmppath[1]==':' && IS_PATH_DELIM(tmppath[2]))) - strcpy(cpath, "\\\\?\\"); - else if(strncmp(tmppath, "\\\\?\\", 4)==0 && tmppath[4]) - strcpy(cpath, tmppath+4); - else -#endif - { - FULLPATH(cpath,tmppath,sizeof(cpath)); - } - } - FREE_AND_NULL(tmppath); - -#ifdef __unix__ - if(cpath[0]==0) { - cpath[0]='/'; - cpath[1]=0; - } -#endif - backslash(cpath); - sprintf(cglob,"%s%s",cpath,(opts&UIFC_FP_MSKCASE)?cmsk:insensitive_mask(cmsk)); - sprintf(dglob,"%s*",cpath); - switch(currfield) { - case DIR_LIST: - if(lastfield==DIR_LIST) - sprintf(cfile,"%s%s",cpath,cmsk); - break; - } - -#ifdef __unix__ - if(cpath[0]==0) { - cpath[0]='/'; - cpath[1]=0; - } - if(cpath[1]==0) - root=TRUE; - else - root=FALSE; -#endif - -#ifdef _WIN32 - if (strcmp(cpath, "\\\\?\\")==0) - root = TRUE; - else - root = FALSE; -#endif - -#ifdef _WIN32 - // Hack together some hawtness - if (root) { - unsigned long drives = _getdrives(); - int j; - char path[4]; - - memset(&dgl, 0, sizeof(dgl)); - strcpy(path, "A:\\"); - dgl.gl_pathv=malloc(sizeof(char *)*('Z'-'A'+2)); - for (j=0; j<='Z'-'A'; j++) { - if(drives & (1<<j)) { - path[0]='A'+j; - dgl.gl_pathv[dgl.gl_pathc++]=strdup(path); - } - } - } - else -#endif - { - if(glob(dglob, GLOB_MARK, NULL, &dgl)!=0 && !isdir(cpath)) { - if(lastpath==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - hold_update=FALSE; - api->msg("Cannot read directory!"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - SAFECOPY(cpath, lastpath); - FREE_AND_NULL(lastpath); - currfield=lastfield; - continue; - } - } - if(glob(cglob, 0, NULL, &fgl)!=0) - fgl.gl_pathc=0; - api->list_height=api->scrn_len-3-7; - dir_list=get_file_opt_list(dgl.gl_pathv, dgl.gl_pathc, TRUE, root); - file_list=get_file_opt_list(fgl.gl_pathv, fgl.gl_pathc, FALSE, root); - globfree(&dgl); - globfree(&fgl); - reread=FALSE; - dircur=dirbar=filecur=filebar=0; - while(!reread) { - hold_update=TRUE; - display_current_path(api, cfile); - api->lbclr=api->lclr|(api->bclr<<4); - api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1,3,listwidth,&dircur,&dirbar,NULL,dir_list); - api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list); - api->lbclr=lbclr; - lastfield=currfield; - fieldmove=0; - hold_update = FALSE; - switch(currfield) { - case DIR_LIST: - i=api->list(WIN_DYN|WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_EXTKEYS|WIN_UNGETMOUSE|WIN_REDRAW,1,3,listwidth,&dircur,&dirbar,NULL,dir_list); - if(i==-1) { /* ESC */ - retval=fp->files=0; - goto cleanup; - } - if(i==-2-'\t' || i==-2-CIO_KEY_RIGHT) /* TAB */ - fieldmove=1; - if(i==-3842) /* Backtab */ - fieldmove=-1; - if(i==-2-CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - if(i>=0) { - FREE_AND_NULL(lastpath); - lastpath=strdup(cpath); - strcat(cpath,dir_list[i]); - reread=TRUE; - sprintf(cfile,"%s%s",cpath,cmsk); - } - break; - case FILE_LIST: - i=api->list(WIN_DYN|WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_EXTKEYS|WIN_UNGETMOUSE|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list); - if(i==-1) { - retval=fp->files=0; - goto cleanup; - } - if(i>=0) { - sprintf(cfile,"%s%s",cpath,file_list[i]); - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI) { - retval=fp->files=1; - fp->selected=(char **)malloc(sizeof(char *)); - if(fp->selected==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - fp->selected[0]=strdup(cfile); - if(fp->selected[0]==NULL) { - FREE_AND_NULL(fp->selected); - fp->files=0; - retval=-1; - goto cleanup; - } - api->list(WIN_NOBRDR|WIN_FIXEDHEIGHT|WIN_IMM|WIN_REDRAW,1+listwidth+1,3,listwidth,&filecur,&filebar,NULL,file_list); - finished=reread=TRUE; - } - } - if(i==-2-'\t') - fieldmove=1; - if(i==-3842 || i==-2-CIO_KEY_LEFT) /* Backtab */ - fieldmove=-1; - if(i==-2-CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - break; - case CURRENT_PATH: - FREE_AND_NULL(tmplastpath); - tmplastpath=strdup(cpath); -#ifdef _WIN32 - if (strncmp(tmplastpath, "\\\\?\\", 4)==0) - memmove(tmplastpath, tmplastpath+4, strlen(tmplastpath+3)); - if (strncmp(cfile, "\\\\?\\", 4)==0) - memmove(cfile, cfile+4, strlen(cfile+3)); -#endif - api->getstrxy(SCRN_LEFT+2, SCRN_TOP+height-2, width-1, cfile, sizeof(cfile)-1, K_EDIT|K_TABEXIT|K_MOUSEEXIT, &i); - if(i==ESC) { - retval=fp->files=0; - goto cleanup; - } - if((opts & (UIFC_FP_FILEEXIST|UIFC_FP_PATHEXIST)) && !fexist(cfile)) { -#ifdef _WIN32 - if (cfile[0]) // Allow zero-length path to mean "Drive list" -#endif - { - FREE_AND_NULL(tmplastpath); - api->msg("No such path/file!"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - continue; - } - } - if(isdir(cfile) && cfile[0]) - backslash(cfile); - _splitpath(cfile, drive, tdir, fname, ext); - sprintf(cpath,"%s%s",drive,tdir); - if(!isdir(cpath)) { -#ifdef _WIN32 - if (cfile[0] && strcmp(cfile, cmsk)) // Allow zero-length path to mean "Drive list" -#endif - { - FREE_AND_NULL(tmplastpath); - api->msg("No such path!"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - continue; - } - } - if(i==CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - if(i==3840) - fieldmove=-1; - else { - if(currfield == CURRENT_PATH) - fieldmove=1; - } - sprintf(cfile,"%s%s%s%s",drive,tdir,fname,ext); - if(strchr(fname,'*') !=NULL || strchr(fname,'?') !=NULL - || strchr(ext,'*') !=NULL || strchr(ext,'?') !=NULL - || ((isdir(cfile) || cfile[0]==0) && !(opts & UIFC_FP_DIRSEL) && (i=='\r' || i=='\n')) - || (!isdir(cfile) && i!='\r' && i!='\n')) { - if(opts & UIFC_FP_MSKNOCHG) { - sprintf(cfile,"%s%s%s",drive,tdir,cmsk); - FREE_AND_NULL(tmplastpath); - api->msg("File mask cannot be changed"); - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - continue; - } - else { - if((!isdir(cfile)) && cpath[0] != 0) - sprintf(cmsk, "%s%s", fname, ext); - reread=TRUE; - } - break; - } - else { - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && (i=='\r' || i!='\n')) - fieldmove=0; - } - if((currfield != CURRENT_PATH) || fieldmove) - break; - if(isdir(cfile)) { - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && i!='\t' && i != 3840) { - if(opts & UIFC_FP_DIRSEL) { - finished=reread=TRUE; - retval=fp->files=1; - fp->selected=(char **)malloc(sizeof(char *)); - if(fp->selected==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - fp->selected[0]=strdup(cfile); - if(fp->selected[0]==NULL) { - free(fp->selected); - fp->files=0; - retval=-1; - goto cleanup; - } - } - } - SAFECOPY(cpath, cfile); - backslash(cfile); - strcat(cfile,cmsk); - } - if(tmplastpath != NULL) { - if(strcmp(tmplastpath, cpath)) { - reread=TRUE; - FREE_AND_NULL(lastpath); - lastpath=tmplastpath; - tmplastpath=NULL; - } - } - FREE_AND_NULL(tmplastpath); - if((opts & UIFC_FP_MULTI)!=UIFC_FP_MULTI && i!='\t' && i!=3840 && cpath[0]) { - retval=fp->files=1; - fp->selected=(char **)malloc(sizeof(char *)); - if(fp->selected==NULL) { - fp->files=0; - retval=-1; - goto cleanup; - } - fp->selected[0]=strdup(cfile); - if(fp->selected[0]==NULL) { - FREE_AND_NULL(fp->selected); - fp->files=0; - retval=-1; - goto cleanup; - } - finished=reread=TRUE; - } - break; - case MASK_FIELD: - p=strdup(cmsk); - api->getstrxy(SCRN_LEFT+8, SCRN_TOP+height-3, width-7, cmsk, sizeof(cmsk)-1, K_EDIT|K_TABEXIT|K_MOUSEEXIT, &i); - if(i==CIO_KEY_MOUSE) - currfield=mousetofield(currfield, opts, height, width, api->list_height, listwidth, &dircur, &dirbar, &filecur, &filebar); - if(i==ESC || i==CIO_KEY_QUIT || (api->exit_flags & UIFC_XF_QUIT)) { - FREE_AND_NULL(p); - retval=fp->files=0; - goto cleanup; - } - if(strcmp(cmsk, p)) { - sprintf(cfile,"%s%s",cpath,cmsk); - reread=TRUE; - } - FREE_AND_NULL(p); - if(i==3840) - fieldmove=-1; - else - fieldmove=1; - break; - } - currfield+=fieldmove; - if(currfield<0) - currfield=FIELD_LIST_TERM-1; - while(1) { - if(currfield==MASK_FIELD && (opts & UIFC_FP_MSKNOCHG)) { - currfield+=fieldmove; - continue; - } - if(currfield==CURRENT_PATH && !(opts & UIFC_FP_ALLOWENTRY)) { - currfield+=fieldmove; - continue; - } - break; - } - if(currfield==FIELD_LIST_TERM) - currfield=DIR_LIST; - } - free_opt_list(&file_list); - free_opt_list(&dir_list); - if(finished) { - if((opts & UIFC_FP_OVERPROMPT) && fexist(cfile)) { - if(api->list(WIN_MID|WIN_SAV, 0,0,0, &i, NULL, "File exists, overwrite?", YesNo)!=0) { - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - finished=FALSE; - } - } - if((opts & UIFC_FP_CREATPROMPT) && !fexist(cfile)) { - if(api->list(WIN_MID|WIN_SAV, 0,0,0, &i, NULL, "File does not exist, create?", YesNo)!=0) { - if (api->exit_flags & UIFC_XF_QUIT) { - retval=fp->files=0; - goto cleanup; - } - finished=FALSE; - } - } - } - } - -cleanup: /* Cleans up allocated variables returns from function */ - hold_update=oldhu; - gotoxy(oldx,oldy); - FREE_AND_NULL(lastpath); - FREE_AND_NULL(tmppath); - FREE_AND_NULL(tmplastpath); - free_opt_list(&file_list); - free_opt_list(&dir_list); - return(retval); -} - -int filepick_free(struct file_pick *fp) -{ - int i; - - for(i=0; i<fp->files; i++) { - FREE_AND_NULL(fp->selected[i]); - } - FREE_AND_NULL(fp->selected); - return(0); -} diff --git a/uifc/filepick.h b/uifc/filepick.h deleted file mode 100644 index 2d1285a06bbbc029f1ccaf8ff40c34f0a7dda606..0000000000000000000000000000000000000000 --- a/uifc/filepick.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _FILEPICK_H_ -#define _FILEPICK_H_ - -#include "dirwrap.h" -#include "uifc.h" - -#define UIFC_FP_MSKNOCHG (1<<0) /* Don't allow user to change the file mask */ -#define UIFC_FP_MSKCASE (1<<1) /* Make the mask case-sensitive */ -#define UIFC_FP_UNIXSORT (1<<2) /* ToDo: Sort upper-case first, then lower-case */ -#define UIFC_FP_DIRSEL (1<<3) /* ToDo: Select directory, not file */ -#define UIFC_FP_PATHEXIST (1<<4) /* Do not allow selection of non-existant paths */ -#define UIFC_FP_FILEEXIST (1<<5) /* File must exist */ -#define UIFC_FP_SHOWHIDDEN (1<<6) /* Show hidden files */ -#define UIFC_FP_MULTI ((1<<7)|UIFC_FP_PATHEXIST|UIFC_FP_FILEEXIST) - /* ToDo: Allow multiple files to be chosen */ - -/* The following can NOT be used with multi selects (Returns an error) */ -#define UIFC_FP_ALLOWENTRY (1<<8) /* Allow user to type a file/path name */ -#define UIFC_FP_OVERPROMPT (1<<9) /* Prompt "Overwrite?" if file exists */ -#define UIFC_FP_CREATPROMPT (1<<10) /* Prompt "Create?" if file does not exist */ - -struct file_pick { - int files; - char **selected; -}; - -int filepick(uifcapi_t *api, char *title, struct file_pick *, char *initial_dir, char *default_mask, int opts); -int filepick_free(struct file_pick *); - -#endif diff --git a/uifc/uifc.h b/uifc/uifc.h deleted file mode 100644 index 6eeffa3553fc9c9f6aa1787d33bb941c8bff1196..0000000000000000000000000000000000000000 --- a/uifc/uifc.h +++ /dev/null @@ -1,535 +0,0 @@ -/* Text-mode User Interface Library (inspired by Novell SYSCON look & feel) */ - -/* $Id: uifc.h,v 1.97 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _UIFC_H_ -#define _UIFC_H_ - -#include <time.h> -#include <fcntl.h> -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <stdlib.h> -/* OS Specific */ -#if defined(_WIN32) - #include <windows.h> -#endif -#if defined(__unix__) - #include <sys/param.h> /* PATH_MAX */ -#endif - -#ifdef _WIN32 - #if defined(UIFC_IMPORTS) || defined(UIFC_EXPORTS) - #if defined(UIFC_IMPORTS) - #define UIFCEXPORT __declspec( dllimport ) - #define UIFCEXPORTVAR __declspec( dllimport ) - #else - #define UIFCEXPORT __declspec( dllexport ) - #define UIFCEXPORTVAR __declspec( dllexport ) - #endif - #else /* self-contained executable */ - #define UIFCEXPORT - #define UIFCEXPORTVAR extern - #endif -#else - #define UIFCEXPORT - #define UIFCEXPORTVAR extern -#endif - -#if defined(__unix__) && !defined(stricmp) - #define stricmp strcasecmp - #define strnicmp strncasecmp -#endif - -#if !defined(FREE_AND_NULL) - #define FREE_AND_NULL(x) if(x!=NULL) { free(x); x=NULL; } -#endif - -#if !defined(MAX_PATH) /* maximum path length */ - #if defined MAXPATHLEN - #define MAX_PATH MAXPATHLEN /* clib.h */ - #elif defined PATH_MAX - #define MAX_PATH PATH_MAX - #elif defined _MAX_PATH - #define MAX_PATH _MAX_PATH - #else - #define MAX_PATH 260 - #endif -#endif - -#define MAX_OPTS 100000 -#define MSK_ON 0xf0000000 -#define MSK_OFF 0x0fffffff -#define MSK_INS 0x10000000 -#define MSK_DEL 0x20000000 -#define MSK_COPY 0x30000000 -#define MSK_CUT 0x40000000 -#define MSK_PASTE 0x50000000 /* Overwrite selected item with previously copied item */ -#define MSK_EDIT 0x60000000 - -/* Legacy terms (get/put instead of copy/paste) */ -#define MSK_GET MSK_COPY -#define MSK_PUT MSK_PASTE - -/* Don't forget, negative return values are used for extended keys (if WIN_EXTKEYS used)! */ -#define MAX_OPLN 75 /* Maximum length of each option per menu call */ -#define MAX_BUFS 7 /* Maximum number of screen buffers to save */ -#define MIN_LINES 14 /* Minimum number of screen lines supported */ -#define MAX_LINES 255 /* Maximum number of screen lines supported (ciolib screenheight is a uchar) */ -#define MAX_COLS 255 /* Maximum number of screen columns supported (ciolib screenwidth is a uchar) */ -#define MAX_BFLN (MAX_COLS*MAX_LINES*2) /* Maximum size of screen buffers, char + attr */ - -#ifndef uint -#define uint unsigned int -#endif - - /**************************/ - /* Bits in uifcapi_t.mode */ - /**************************/ -#define UIFC_INMSG (1<<0) /* Currently in Message Routine non-recursive */ -#define UIFC_MOUSE (1<<1) /* Mouse installed and available */ -#define UIFC_MONO (1<<2) /* Force monochrome mode */ -#define UIFC_COLOR (1<<3) /* Force color mode */ -#define UIFC_IBM (1<<4) /* Force use of IBM charset */ -#define UIFC_NOCTRL (1<<5) /* Don't allow usage of CTRL keys for movement - * etc in menus (Still available in text boxes) */ -#define UIFC_NHM (1<<6) /* Don't hide the mouse pointer */ -#define UIFC_NOMOUSE (1<<7) /* Don't enable/use the mouse */ - - /*******************************/ - /* Bits in uifcapi_t.list mode */ - /*******************************/ -#define WIN_ORG (1<<0) /* Original menu - destroy valid screen area */ -#define WIN_SAV (1<<1) /* Save existing text and replace when finished */ -#define WIN_ACT (1<<2) /* Menu remains active after a selection */ -#define WIN_L2R (1<<3) /* Center the window based on 'width' */ -#define WIN_T2B (1<<4) /* Center the window based on 'height' */ -#define WIN_INS (1<<5) /* Allows user to use insert key */ -#define WIN_INSACT (1<<6) /* Remains active after insert key */ -#define WIN_DEL (1<<7) /* Allows user to use delete key */ -#define WIN_DELACT (1<<8) /* Remains active after delete key */ -#define WIN_ESC (1<<9) /* Screen is active when escape is hit */ -#define WIN_RHT (1<<10) /* Place window against right side of screen */ -#define WIN_BOT (1<<11) /* Place window against bottom of screen */ -#define WIN_COPY (1<<12) /* Allows F5 to Get (copy) a menu item */ -#define WIN_PASTE (1<<13) /* Allows F6 to Put (paste) a menu item */ -#define WIN_CHE (1<<14) /* Stay active after escape if changes */ -#define WIN_XTR (1<<15) /* Add extra line at end for inserting at end */ -#define WIN_DYN (1<<16) /* Dynamic window - return at least every second */ -#define WIN_CUT (1<<17) /* Allow ^X (cut) a menu item */ -#define WIN_HLP (1<<17) /* Parse 'Help codes' - showbuf() */ -#define WIN_PACK (1<<18) /* Pack text in window (No padding) - showbuf() */ -#define WIN_IMM (1<<19) /* Draw window and return immediately */ -#define WIN_FAT (1<<20) /* Do not pad outside borders */ -#define WIN_REDRAW (1<<21) /* Force redraw on dynamic window */ -#define WIN_NODRAW (1<<22) /* Force not to redraw on dynamic window */ -#define WIN_EXTKEYS (1<<23) /* Return on any keypress... if it's not handled internally - * Return value is -2 - keyvalue */ -#define WIN_NOBRDR (1<<24) /* Do not draw a border around the window */ -#define WIN_FIXEDHEIGHT (1<<25) /* Use list_height from uifc struct */ -#define WIN_UNGETMOUSE (1<<26) /* If the mouse is clicked outside the window, */ - /* Put the mouse event back into the event queue */ -#define WIN_EDIT (1<<27) /* Allow F2 to edit a menu item */ -#define WIN_PASTEXTR (1<<28) /* Allow paste into extra (blank) item */ -#define WIN_INACT (1<<29) /* Draw window inactive... intended for use with WIN_IMM */ -#define WIN_POP (1<<30) /* Exit the list. Act as though ESC was pressed. */ - /* Intended for use after a WIN_EXTKEYS or WIN_DYN */ -#define WIN_SEL (1<<31) /* Exit the list. Act as though ENTER was pressed. */ - /* Intended for use after a WIN_EXTKEYS or WIN_DYN */ - -#define WIN_MID WIN_L2R|WIN_T2B /* Place window in middle of screen */ -#define WIN_GET WIN_COPY -#define WIN_PUT WIN_PASTE - -#define SCRN_TOP 3 -#define SCRN_LEFT 5 -#define SCRN_RIGHT ((int)api->scrn_width-4) - - /* Bits in 'mode' for getkey and getstr */ -#define K_UPPER (1L<<0) /* Converts all letters to upper case */ -#define K_UPRLWR (1L<<1) /* Upper/Lower case automatically */ -#define K_NUMBER (1L<<2) /* Allow numbers only */ -#define K_WRAP (1L<<3) /* Allows word wrap */ -#define K_MSG (1L<<4) /* Allows ANSI, ^N ^A ^G */ -#define K_SPIN (1L<<5) /* Spinning cursor (same as SPIN) */ -#define K_LINE (1L<<6) /* Input line (inverse color) */ -#define K_EDIT (1L<<7) /* Edit string passed */ -#define K_CHAT (1L<<8) /* In chat multi-chat */ -#define K_NOCRLF (1L<<9) /* Don't print CRLF after string input */ -#define K_ALPHA (1L<<10) /* Only allow alphabetic characters */ -#define K_SCANNING (1L<<11) /* UPC Scanner is active... return on '%' */ -#define K_TABEXIT (1L<<12) /* Return on TAB or BACKTAB */ -#define K_DECIMAL (1L<<13) /* Allow floating point numbers only */ -#define K_DEUCEEXIT (1L<<14) /* Return whenever Deuce wants to exit */ - /* Returns on up/down/F2 */ -#define K_MOUSEEXIT (1L<<15) /* Returns when mouse is clicked outside of */ - /* Input area (NOT outside of window!) */ - /* And ungets the mouse event. */ -#define K_PASSWORD (1L<<16) /* Does not display text while editing */ -#define K_FIND (1L<<17) /* Don't set the "changes" flag */ - - - /* Extra exit flags */ -#define UIFC_XF_QUIT (1<<0) /* Returned -1 due to CIO_KEY_QUIT */ - -#define HELPBUF_SIZE 4000 - -#ifndef _GEN_DEFS_H - /* Control characters */ -#define STX 0x02 /* Start of text ^B */ -#define ETX 0x03 /* End of text ^C */ -#define BS '\b' /* Back space ^H */ -#define TAB '\t' /* Horizontal tabulation ^I */ -#define LF '\n' /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR '\r' /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define DEL 0x7f /* Delete ^BS */ - -enum { - CTRL_A=1 - ,CTRL_B - ,CTRL_C - ,CTRL_D - ,CTRL_E - ,CTRL_F - ,CTRL_G - ,CTRL_H - ,CTRL_I - ,CTRL_J - ,CTRL_K - ,CTRL_L - ,CTRL_M - ,CTRL_N - ,CTRL_O - ,CTRL_P - ,CTRL_Q - ,CTRL_R - ,CTRL_S - ,CTRL_T - ,CTRL_U - ,CTRL_V - ,CTRL_W - ,CTRL_X - ,CTRL_Y - ,CTRL_Z -}; - -#endif - -#ifndef uchar /* Short-hand for unsigned data types */ -#define uchar unsigned char -#endif -#ifndef uint -#define uint unsigned int -#endif -#ifndef ulong -#define ulong unsigned long -#endif - -#ifndef BOOL -#define BOOL int -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif -#endif - -typedef struct { - int left,top,right,bot; - int *cur,*bar; - uchar* buf; -} win_t; - -typedef struct { - char background; - char help_char; - char close_char; - char up_arrow; - char down_arrow; - char button_left; - char button_right; - - char list_top_left; - char list_top; - char list_top_right; - char list_separator_left; - char list_separator_right; - char list_horizontal_separator; - char list_left; - char list_right; - char list_bottom_left; - char list_bottom_right; - char list_bottom; - char list_scrollbar_separator; - - char input_top_left; - char input_top; - char input_top_right; - char input_left; - char input_right; - char input_bottom_left; - char input_bottom_right; - char input_bottom; - - char popup_top_left; - char popup_top; - char popup_top_right; - char popup_left; - char popup_right; - char popup_bottom_left; - char popup_bottom_right; - char popup_bottom; - - char help_top_left; - char help_top; - char help_top_right; - char help_left; - char help_right; - char help_bottom_left; - char help_bottom_right; - char help_bottom; - char help_titlebreak_left; - char help_titlebreak_right; - char help_hitanykey_left; - char help_hitanykey_right; -} uifc_graphics_t; - -typedef struct { -/****************************************************************************/ -/* Size of the structure (for version compatibility verification). */ -/****************************************************************************/ - size_t size; -/****************************************************************************/ -/* Controls general UIFC library behavior. */ -/****************************************************************************/ - long mode; -/****************************************************************************/ -/* Set to TRUE when changes to data have been made by input function. */ -/****************************************************************************/ - BOOL changes; -/****************************************************************************/ -/* Set to TRUE to enable insert mode by default (not overwrite) */ -/****************************************************************************/ - BOOL insert_mode; -/****************************************************************************/ -/* The overlapped-window save buffer number. */ -/****************************************************************************/ - uint savnum; -/****************************************************************************/ -/* The current overlapped-window save buffer depth. */ -/****************************************************************************/ - uint savdepth; -/****************************************************************************/ -/* Screen length */ -/****************************************************************************/ - uint scrn_len; -/****************************************************************************/ -/* Screen Width */ -/****************************************************************************/ - uint scrn_width; -/****************************************************************************/ -/* ESC key delay for curses */ -/****************************************************************************/ - uint esc_delay; -/****************************************************************************/ -/* Alternative method of setting current help text. */ -/****************************************************************************/ - char* helpbuf; -/****************************************************************************/ -/* Location of the help data and index files. */ -/****************************************************************************/ - char helpdatfile[MAX_PATH+1]; - char helpixbfile[MAX_PATH+1]; - BOOL help_available; -/****************************************************************************/ -/* Help and exit button locations for current/last window */ -/****************************************************************************/ - int buttony; - int exitstart; - int exitend; - int helpstart; - int helpend; -/****************************************************************************/ -/* List height for WIN_FIXEDHEIGHT lists. */ -/****************************************************************************/ - int list_height; - -/****************************************************************************/ -/* Colours for the various bits */ -/****************************************************************************/ - uchar hclr,lclr,bclr,cclr,lbclr; - -/****************************************************************************/ -/* Have we initialized successfully? */ -/****************************************************************************/ - BOOL initialized; - -/****************************************************************************/ -/* UIFC_XF_* bits for extra exit status */ -/****************************************************************************/ - uint exit_flags; - -/****************************************************************************/ -/* Custom drawing characters */ -/****************************************************************************/ - uifc_graphics_t *chars; - -/****************************************************************************/ -/* Allow application override */ -/****************************************************************************/ - char** yesNoOpts; - -/****************************************************************************/ -/* Exit/uninitialize function. */ -/****************************************************************************/ - void (*bail) (void); -/****************************************************************************/ -/* Fill the screen with the appropriate background attribute. */ -/* str is the title for the application banner. */ -/* Returns 0 on success, non-zero on failure. */ -/****************************************************************************/ - int (*scrn) (const char* str); -/****************************************************************************/ -/* Popup a message, maybe wait for the user to hit a key or click button. */ -/****************************************************************************/ - int (*msg) (const char* str); - int (*msgf) (char* fmt, ...); - BOOL (*deny) (char* fmt, ...); - BOOL (*confirm) (char* fmt, ...); -/****************************************************************************/ -/* Popup/down a status message. */ -/* str is the message to display on popup. */ -/* if str==NULL, then the the status is to be cleared (popdown). */ -/****************************************************************************/ - void (*pop) (const char* str); -/****************************************************************************/ -/* General menu function. */ -/* mode contains WIN_* flags to control display and functionality. */ -/* left, top and width specify desired screen locations and window size. */ -/* cur is a pointer to the current (default) option. */ -/* bar is a pointer to the current location of the lightbar (which used). */ -/* title is the caption for the menu. */ -/* Menus can centered left to right and top to bottom automatically. */ -/* mode bits are set with macros WIN_*. */ -/* option is an array of char arrays, first element of last char array */ -/* must be NULL. */ -/* Returns the 0-based selected option number, -1 for ESC, or the selected */ -/* option number OR'd with MSK_INS, MSK_DEL, MSK_GET, MSK_PUT, or MSK_EDIT. */ -/****************************************************************************/ - int (*list) (int mode, int left, int top, int width, int* dflt - ,int* bar, const char *title, char** option); -/****************************************************************************/ -/* Windowed string input routine. */ -/* mode contains WIN_* flags to control display and functionality. */ -/* left and top specify desired screen location. */ -/* prompt is displayed before the input is requested. */ -/* str is the string to input or edit. */ -/* len is the maximum length of the string. */ -/* kmode contains flags that control the string input (K_* macros). */ -/* This function sets uifcapi_t.changes to TRUE if the string is modified. */ -/* Returns the length of the string or -1 on escape/abort. */ -/****************************************************************************/ - int (*input)(int mode, int left, int top, const char* prompt, char* str - ,int len, int kmode); -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ - void (*sethelp)(int line, char* file); - -/****************************************************************************/ -/* Shows the current help text */ -/****************************************************************************/ - void (*showhelp)(void); - -/****************************************************************************/ -/* Shows a scrollable text buffer - optionally parsing "help markup codes" */ -/****************************************************************************/ - void (*showbuf)(int mode, int left, int top, int width, int height - ,const char *title, const char *hbuf, int *curp, int *barp); - -/****************************************************************************/ -/* Updates time in upper left corner of screen with current time in ASCII/ */ -/* Unix format */ -/****************************************************************************/ - void (*timedisplay)(BOOL force); - -/****************************************************************************/ -/* Displays the bottom line using the WIN_* mode flags */ -/****************************************************************************/ - void (*bottomline)(int mode); - -/****************************************************************************/ -/* String input/exit box at a specified position */ -/****************************************************************************/ - int (*getstrxy)(int left, int top, int width, char *outstr, int max - ,long mode, int *lastkey); - -/****************************************************************************/ -/* Formatted print with attribute */ -/****************************************************************************/ - int (*printf)(int x, int y, unsigned attr, char *fmat, ...); - -} uifcapi_t; - -#ifdef __cplusplus -extern "C" { -#endif - -/* Return value from uifc_api.list() when uifcYesNoOpts is used */ -enum { - uifcYes=0, - uifcNo=1 -}; - -UIFCEXPORTVAR char* uifcYesNoOpts[]; - -/****************************************************************************/ -/* Initialization routines for each UIFC implementation. */ -/* Returns 0 on success, non-zero on failure. */ -/****************************************************************************/ -int uifcini(uifcapi_t*); /* Original implementation based on conio */ -UIFCEXPORT int uifcinix(uifcapi_t*); /* Standard I/O implementation */ -UIFCEXPORT int uifcini32(uifcapi_t*); /* modern implementation */ -/****************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line! */ diff --git a/uifc/uifc32.c b/uifc/uifc32.c deleted file mode 100644 index bf2d2637ca2b4f63f8815cdffa7488440ecbb385..0000000000000000000000000000000000000000 --- a/uifc/uifc32.c +++ /dev/null @@ -1,3077 +0,0 @@ -/* Modern implementation of UIFC (user interface) library based on uifc.c */ -// vi: tabstop=4 - -/* $Id: uifc32.c,v 1.268 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifdef __unix__ - #include <stdio.h> - #include <unistd.h> - #ifdef __QNX__ - #include <strings.h> - #endif - #define mswait(x) delay(x) -#elif defined(_WIN32) - #include <share.h> - #include <windows.h> - #define mswait(x) Sleep(x) -#endif -#include <genwrap.h> // for alloca() -#include <datewrap.h> // localtime_r() -#include "xpprintf.h" - -#include "ciolib.h" -#include "uifc.h" -#define MAX_GETSTR 5120 - -#define BLINK 128 - -static int cursor; -static char* helpfile=0; -static uint helpline=0; -static size_t blk_scrn_len; -static struct vmem_cell *blk_scrn; -static struct vmem_cell *tmp_buffer; -static struct vmem_cell *tmp_buffer2; -static win_t sav[MAX_BUFS]; -static uifcapi_t* api; - -/* Prototypes */ -static int uprintf(int x, int y, unsigned attr, char *fmt,...); -static void bottomline(int line); -static char *utimestr(time_t *intime); -static void help(void); -static int ugetstr(int left, int top, int width, char *outstr, int max, long mode, int *lastkey); -static void timedisplay(BOOL force); - -/* API routines */ -static void uifcbail(void); -static int uscrn(const char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,const char *title, char **option); -static int uinput(int imode, int left, int top, const char *prompt, char *str - ,int len ,int kmode); -static int umsg(const char *str); -static int umsgf(char *fmt, ...); -static BOOL confirm(char *fmt, ...); -static BOOL deny(char *fmt, ...); -static void upop(const char *str); -static void sethelp(int line, char* file); -static void showbuf(int mode, int left, int top, int width, int height, const char *title - , const char *hbuf, int *curp, int *barp); - -/* Dynamic menu support */ -static int *last_menu_cur=NULL; -static int *last_menu_bar=NULL; -static int save_menu_cur=-1; -static int save_menu_bar=-1; -static int save_menu_opts=-1; - -char* uifcYesNoOpts[]={"Yes","No",NULL}; - -static void reset_dynamic(void) { - last_menu_cur=NULL; - last_menu_bar=NULL; - save_menu_cur=-1; - save_menu_bar=-1; - save_menu_opts=-1; -} - -static uifc_graphics_t cp437_chars = { - .background=0xb0, - .help_char='?', - .close_char=0xfe, - .up_arrow=30, - .down_arrow=31, - .button_left='[', - .button_right=']', - - .list_top_left=0xc9, - .list_top=0xcd, - .list_top_right=0xbb, - .list_separator_left=0xcc, - .list_separator_right=0xb9, - .list_horizontal_separator=0xcd, - .list_left=0xba, - .list_right=0xba, - .list_bottom_left=0xc8, - .list_bottom_right=0xbc, - .list_bottom=0xcd, - .list_scrollbar_separator=0xb3, - - .input_top_left=0xc9, - .input_top=0xcd, - .input_top_right=0xbb, - .input_left=0xba, - .input_right=0xba, - .input_bottom_left=0xc8, - .input_bottom_right=0xbc, - .input_bottom=0xcd, - - .popup_top_left=0xda, - .popup_top=0xc4, - .popup_top_right=0xbf, - .popup_left=0xb3, - .popup_right=0xb3, - .popup_bottom_left=0xc0, - .popup_bottom_right=0xd9, - .popup_bottom=0xc4, - - .help_top_left=0xda, - .help_top=0xc4, - .help_top_right=0xbf, - .help_left=0xb3, - .help_right=0xb3, - .help_bottom_left=0xc0, - .help_bottom_right=0xd9, - .help_bottom=0xc4, - .help_titlebreak_left=0xb4, - .help_titlebreak_right=0xc3, - .help_hitanykey_left=0xb4, - .help_hitanykey_right=0xc3, -}; - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ - -void uifc_mouse_enable(void) -{ - ciomouse_setevents(0); - ciomouse_addevent(CIOLIB_BUTTON_1_DRAG_START); - ciomouse_addevent(CIOLIB_BUTTON_1_DRAG_MOVE); - ciomouse_addevent(CIOLIB_BUTTON_1_DRAG_END); - ciomouse_addevent(CIOLIB_BUTTON_1_CLICK); - ciomouse_addevent(CIOLIB_BUTTON_2_CLICK); - ciomouse_addevent(CIOLIB_BUTTON_3_CLICK); - ciomouse_addevent(CIOLIB_BUTTON_4_PRESS); - ciomouse_addevent(CIOLIB_BUTTON_5_PRESS); - mousepointer(CIOLIB_MOUSEPTR_BAR); - showmouse(); -} - -void uifc_mouse_disable(void) -{ - ciomouse_setevents(0); - hidemouse(); -} - -int kbwait(void) { - int timeout=0; - while(timeout++<50) { - if(kbhit()) - return(TRUE); - mswait(1); - } - return(FALSE); -} - -int inkey(void) -{ - int c; - - c=getch(); - if(!c || c==0xe0) - c|=(getch()<<8); - return(c); -} - -int uifcini32(uifcapi_t* uifcapi) -{ - unsigned i; - struct text_info txtinfo; - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - if (api->chars == NULL) - api->chars = &cp437_chars; - - if (api->yesNoOpts == NULL) - api->yesNoOpts = uifcYesNoOpts; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->msgf=umsgf; - api->confirm=confirm; - api->deny=deny; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=showbuf; - api->timedisplay=timedisplay; - api->bottomline=bottomline; - api->getstrxy=ugetstr; - api->printf=uprintf; - - if(api->scrn_len!=0) { - switch(api->scrn_len) { - case 14: - textmode(C80X14); - break; - case 21: - textmode(C80X21); - break; - case 25: - textmode(C80); - break; - case 28: - textmode(C80X28); - break; - case 43: - textmode(C80X43); - break; - case 50: - textmode(C80X50); - break; - case 60: - textmode(C80X60); - break; - default: - textmode(C4350); - break; - } - } - -#if 0 - clrscr(); -#endif - - gettextinfo(&txtinfo); - /* unsupported mode? */ - if(txtinfo.screenheight<MIN_LINES -/* || txtinfo.screenheight>MAX_LINES */ - || txtinfo.screenwidth<40) { - textmode(C80); /* set mode to 80x25*/ - gettextinfo(&txtinfo); - } - window(1,1,txtinfo.screenwidth,txtinfo.screenheight); - - api->scrn_len=txtinfo.screenheight; - if(api->scrn_len<MIN_LINES) { - uifcbail(); - printf("\r\nUIFC: Screen length (%u) must be %d lines or greater\r\n" - ,api->scrn_len,MIN_LINES); - return(-2); - } - api->scrn_len--; /* account for status line */ - - if(txtinfo.screenwidth<40) { - uifcbail(); - printf("\r\nUIFC: Screen width (%u) must be at least 40 characters\r\n" - ,txtinfo.screenwidth); - return(-3); - } - api->scrn_width=txtinfo.screenwidth; - - if(!(api->mode&UIFC_COLOR) - && (api->mode&UIFC_MONO - || txtinfo.currmode==MONO || txtinfo.currmode==BW40 || txtinfo.currmode==BW80 - || txtinfo.currmode==MONO14 || txtinfo.currmode==BW40X14 || txtinfo.currmode==BW80X14 - || txtinfo.currmode==MONO21 || txtinfo.currmode==BW40X21 || txtinfo.currmode==BW80X21 - || txtinfo.currmode==MONO28 || txtinfo.currmode==BW40X28 || txtinfo.currmode==BW80X28 - || txtinfo.currmode==MONO43 || txtinfo.currmode==BW40X43 || txtinfo.currmode==BW80X43 - || txtinfo.currmode==MONO50 || txtinfo.currmode==BW40X50 || txtinfo.currmode==BW80X50 - || txtinfo.currmode==MONO60 || txtinfo.currmode==BW40X60 || txtinfo.currmode==BW80X60 - || txtinfo.currmode==ATARI_40X24 || txtinfo.currmode==ATARI_80X25)) - { - api->bclr=BLACK; - api->hclr=WHITE; - api->lclr=LIGHTGRAY; - api->cclr=LIGHTGRAY; - api->lbclr=BLACK|(LIGHTGRAY<<4); /* lightbar color */ - } else { - api->bclr=BLUE; - api->hclr=YELLOW; - api->lclr=WHITE; - api->cclr=CYAN; - api->lbclr=BLUE|(LIGHTGRAY<<4); /* lightbar color */ - } - - blk_scrn_len=api->scrn_width*api->scrn_len; - if((blk_scrn=(struct vmem_cell *)malloc(blk_scrn_len * sizeof(*blk_scrn)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,blk_scrn_len * sizeof(*blk_scrn)); - return(-1); - } - if((tmp_buffer=(struct vmem_cell *)malloc(blk_scrn_len * sizeof(*blk_scrn)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,blk_scrn_len * sizeof(*blk_scrn)); - return(-1); - } - if((tmp_buffer2=(struct vmem_cell *)malloc(blk_scrn_len * sizeof(*blk_scrn)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,blk_scrn_len * sizeof(*blk_scrn)); - return(-1); - } - for(i=0;i<blk_scrn_len;i++) { - blk_scrn[i].legacy_attr = api->cclr|(api->bclr<<4); - blk_scrn[i].ch = api->chars->background; - blk_scrn[i].font = 0; - attr2palette(blk_scrn[i].legacy_attr, &blk_scrn[i].fg, &blk_scrn[i].bg); - } - - cursor=_NOCURSOR; - _setcursortype(cursor); - - if(cio_api.mouse && !(api->mode&UIFC_NOMOUSE)) { - api->mode|=UIFC_MOUSE; - uifc_mouse_enable(); - } - - /* A esc_delay of less than 10 is stupid... silently override */ - if(api->esc_delay < 10) - api->esc_delay=25; - - if(cio_api.escdelay) - *(cio_api.escdelay)=api->esc_delay; - - for(i=0; i<MAX_BUFS; i++) - sav[i].buf=NULL; - api->savnum=0; - - api->initialized=TRUE; - - return(0); -} - -void docopy(void) -{ - int key; - struct mouse_event mevent; - struct ciolib_screen *screen; - struct ciolib_screen *sbuffer; - int sbufsize; - int x,y,startx,starty,endx,endy,lines; - int outpos; - char *copybuf; - uint32_t bg0; - uint32_t bg1; - uint32_t bg6; - uint32_t fg8; - - attr2palette(0x08, &fg8, &bg0); - attr2palette(0x10, NULL, &bg1); - attr2palette(0x60, NULL, &bg6); - screen=ciolib_savescreen(); - sbuffer=ciolib_savescreen(); - freepixels(sbuffer->pixels); - sbuffer->pixels = NULL; - sbufsize=screen->text_info.screenwidth * screen->text_info.screenheight * sizeof(screen->vmem[0]); - while(1) { - key=getch(); - if(key==0 || key==0xe0) - key|=getch()<<8; - switch(key) { - case CIO_KEY_MOUSE: - getmouse(&mevent); - if(mevent.startx<mevent.endx) { - startx=mevent.startx; - endx=mevent.endx; - } - else { - startx=mevent.endx; - endx=mevent.startx; - } - if(mevent.starty<mevent.endy) { - starty=mevent.starty; - endy=mevent.endy; - } - else { - starty=mevent.endy; - endy=mevent.starty; - } - switch(mevent.event) { - case CIOLIB_BUTTON_1_DRAG_MOVE: - memcpy(sbuffer->vmem,screen->vmem,sbufsize); - for(y=starty-1;y<endy;y++) { - for(x=startx-1;x<endx;x++) { - int pos=y*api->scrn_width+x; - - if (sbuffer->vmem[pos].bg != bg1) - sbuffer->vmem[pos].bg = bg1; - else - sbuffer->vmem[pos].bg = bg6; - if (sbuffer->vmem[pos].bg == sbuffer->vmem[pos].fg) - attr2palette(sbuffer->vmem[pos].legacy_attr | 0x08, &sbuffer->vmem[pos].fg, &sbuffer->vmem[pos].bg); - if ((sbuffer->vmem[pos].legacy_attr & 0x70) != 0x10) - sbuffer->vmem[pos].legacy_attr = (sbuffer->vmem[pos].legacy_attr & 0x8f) | 0x10; - else - sbuffer->vmem[pos].legacy_attr = (sbuffer->vmem[pos].legacy_attr & 0x8f) | 0x60; - if (((sbuffer->vmem[pos].legacy_attr & 0x70) >> 4) == (sbuffer->vmem[pos].legacy_attr & 0x08)) - sbuffer->vmem[pos].legacy_attr |= 0x08; - } - } - restorescreen(sbuffer); - break; - case CIOLIB_BUTTON_1_DRAG_END: - lines=abs(mevent.endy-mevent.starty)+1; - copybuf=malloc(((endy-starty+1)*(endx-startx+1)+1+lines*2)*4); - outpos=0; - for(y=starty-1;y<endy;y++) { - for(x=startx-1;x<endx;x++) { - size_t outlen; - uint8_t *utf8str; - char ch; - - ch = screen->vmem[(y*api->scrn_width+x)].ch ? screen->vmem[(y*api->scrn_width+x)].ch : ' '; - utf8str = cp_to_utf8(conio_fontdata[screen->vmem[(y*api->scrn_width+x)].font].cp, &ch, 1, &outlen); - if (utf8str == NULL) - continue; - memcpy(copybuf + outpos, utf8str, outlen); - outpos += outlen; - } - #ifdef _WIN32 - copybuf[outpos++]='\r'; - #endif - copybuf[outpos++]='\n'; - } - copybuf[outpos]=0; - copytext(copybuf, strlen(copybuf)); - free(copybuf); - restorescreen(screen); - freescreen(screen); - freescreen(sbuffer); - return; - } - break; - default: - restorescreen(screen); - freescreen(screen); - freescreen(sbuffer); - ungetch(key); - return; - } - } -} - -static int uifc_getmouse(struct mouse_event *mevent) -{ - mevent->startx=0; - mevent->starty=0; - mevent->event=0; - if(api->mode&UIFC_MOUSE) { - getmouse(mevent); - if(mevent->event==CIOLIB_BUTTON_3_CLICK) - return(ESC); - if(mevent->event==CIOLIB_BUTTON_1_DRAG_START) { - docopy(); - return(0); - } - if(mevent->starty==api->buttony) { - if(mevent->startx>=api->exitstart - && mevent->startx<=api->exitend - && mevent->event==CIOLIB_BUTTON_1_CLICK) { - return(ESC); - } - if(mevent->startx>=api->helpstart - && mevent->startx<=api->helpend - && mevent->event==CIOLIB_BUTTON_1_CLICK) { - return(CIO_KEY_F(1)); - } - } - if (mevent->event == CIOLIB_BUTTON_4_PRESS) - return(CIO_KEY_UP); - if (mevent->event == CIOLIB_BUTTON_5_PRESS) - return(CIO_KEY_DOWN); - return(0); - } - return(-1); -} - -void uifcbail(void) -{ - int i; - - _setcursortype(_NORMALCURSOR); - textattr(LIGHTGRAY); - uifc_mouse_disable(); - suspendciolib(); - FREE_AND_NULL(blk_scrn); - FREE_AND_NULL(tmp_buffer); - FREE_AND_NULL(tmp_buffer2); - api->initialized=FALSE; - for(i=0; i< MAX_BUFS; i++) - FREE_AND_NULL(sav[i].buf); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(const char *str) -{ - textattr(api->bclr|(api->cclr<<4)); - gotoxy(1,1); - clreol(); - gotoxy(3,1); - cputs(str); - if(!vmem_puttext(1,2,api->scrn_width,api->scrn_len,blk_scrn)) - return(-1); - gotoxy(1,api->scrn_len+1); - clreol(); - reset_dynamic(); - setname(str); - return(0); -} - -/****************************************************************************/ -/****************************************************************************/ -static void scroll_text(int x1, int y1, int x2, int y2, int down) -{ - vmem_gettext(x1,y1,x2,y2,tmp_buffer2); - if(down) - vmem_puttext(x1,y1+1,x2,y2,tmp_buffer2); - else - vmem_puttext(x1,y1,x2,y2-1,tmp_buffer2+(((x2-x1)+1))); -} - -/****************************************************************************/ -/* Updates time in upper left corner of screen with current time in ASCII/ */ -/* Unix format */ -/****************************************************************************/ -static void timedisplay(BOOL force) -{ - static time_t savetime; - static int savemin; - time_t now; - struct tm gm; - int old_hold; - - now=time(NULL); - localtime_r(&now, &gm); - if(force || savemin != gm.tm_min || difftime(now,savetime)>=60) { - old_hold=hold_update; - hold_update=FALSE; - uprintf(api->scrn_width-25,1,api->bclr|(api->cclr<<4),utimestr(&now)); - hold_update=old_hold; - savetime=now; - savemin = gm.tm_min; - } -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' */ -/****************************************************************************/ -static void truncspctrl(char *str) -{ - uint c; - - c=strlen(str); - while(c && (uchar)str[c-1]<=' ') c--; - if(str[c]!=0) /* don't write to string constants */ - str[c]=0; -} - -static void -inactive_win(struct vmem_cell *buf, int left, int top, int right, int bottom, int y, int hbrdrsize, uchar cclr, uchar lclr, uchar hclr, int btop) -{ - int width = right - left + 1; - int height = bottom - top + 1; - int i, j; - - vmem_gettext(left, top, right, bottom, buf); - for (i=0; i < (width * height); i++) - set_vmem_attr(&buf[i], lclr | (cclr<<4)); - j=(((y-btop)*width))+3+((width-hbrdrsize-2)); - for(i=(((y-btop)*width))+3;i<j;i++) - set_vmem_attr(&buf[i], hclr|(cclr<<4)); - - vmem_puttext(left, top, right, bottom, buf); -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , const char *initial_title, char **option) -{ - struct vmem_cell *ptr, *win, shade[MAX_LINES*2], line[MAX_COLS]; - static char search[MAX_OPLN] = ""; - int height,y; - int i,j,opts=0,s=0; /* s=search index into options */ - int is_redraw=0; - int s_top=SCRN_TOP; - int s_left=SCRN_LEFT; - int s_right=SCRN_RIGHT; - int s_bottom=api->scrn_len-3; - int hbrdrsize=2; - int lbrdrwidth=1; - int rbrdrwidth=1; - int vbrdrsize=4; - int tbrdrwidth=3; - int bbrdrwidth=1; - int title_len; - int tmpcur=0; - struct mouse_event mevnt; - char *title=NULL; - int a,b,c,longopt; - int optheight=0; - int gotkey; - uchar hclr,lclr,bclr,cclr,lbclr; - - if(cur==NULL) cur=&tmpcur; - api->exit_flags = 0; - hclr=api->hclr; - lclr=api->lclr; - bclr=api->bclr; - cclr=api->cclr; - lbclr=api->lbclr; - if(mode & WIN_INACT) { - bclr=api->cclr; - hclr=api->lclr; - lclr=api->lclr; - cclr=api->cclr; - lbclr=(api->cclr<<4)|api->hclr; - } - title=strdup(initial_title==NULL?"":initial_title); - - if(!(api->mode&UIFC_NHM)) - uifc_mouse_disable(); - - title_len=strlen(title); - - if(mode&WIN_FAT) { - s_top=1; - s_left=2; - s_right=api->scrn_width-3; /* Leave space for the shadow */ - s_bottom=api->scrn_len-1; /* Leave one for the shadow */ - } - if(mode&WIN_NOBRDR) { - hbrdrsize=0; - vbrdrsize=0; - lbrdrwidth=0; - rbrdrwidth=0; - tbrdrwidth=0; - bbrdrwidth=0; - } - /* Count the options */ - while (option != NULL && opts < MAX_OPTS) { - if (option[opts] == NULL || option[opts][0] == 0) - break; - else opts++; - } - if (mode&WIN_XTR && opts<MAX_OPTS) - opts++; - - /* Sanity-check the savnum */ - if(mode&WIN_SAV && api->savnum>=MAX_BUFS-1) - putch(7); - - api->help_available = (api->helpbuf!=NULL || api->helpixbfile[0]!=0); - - /* Create the status bar/bottom-line */ - int bline = mode; - if (api->bottomline != NULL) { - if ((mode&(WIN_XTR | WIN_PASTEXTR)) == WIN_XTR && (*cur) == opts - 1) - api->bottomline(bline & ~WIN_PASTE); - else - api->bottomline(bline); - } - optheight=opts+vbrdrsize; - height=optheight; - if(mode&WIN_FIXEDHEIGHT) { - height=api->list_height; - } - if(top+height>s_bottom) - height=(s_bottom)-top; - if(optheight>height) - optheight=height; - if(!width || width<title_len+hbrdrsize+2) { - width=title_len+hbrdrsize+2; - for(i=0;i<opts;i++) { - if(option[i]!=NULL) { - truncspctrl(option[i]); - if((j=strlen(option[i])+hbrdrsize+2+1)>width) - width=j; - } - } - } - /* Determine minimum widths here to accommodate mouse "icons" in border */ - if(!(mode&WIN_NOBRDR) && api->mode&UIFC_MOUSE) { - if(api->help_available && width<8) - width=8; - else if(width<5) - width=5; - } - if(width>(s_right+1)-s_left) { - width=(s_right+1)-s_left; - if(title_len>(width-hbrdrsize-2)) { - *(title+width-hbrdrsize-2-3)='.'; - *(title+width-hbrdrsize-2-2)='.'; - *(title+width-hbrdrsize-2-1)='.'; - *(title+width-hbrdrsize-2)=0; - title_len=strlen(title); - } - } - if(mode&WIN_L2R) - left=(s_right-s_left-width+1)/2; - else if(mode&WIN_RHT) - left=s_right-(width+hbrdrsize+2+left); - if(mode&WIN_T2B) - top=(api->scrn_len-height+1)/2-2; - else if(mode&WIN_BOT) - top=s_bottom-height-top; - if(left<0) - left=0; - if(top<0) - top=0; - - /* Dynamic Menus */ - if(mode&WIN_DYN - && cur != NULL - && bar != NULL - && last_menu_cur==cur - && last_menu_bar==bar - && save_menu_cur==*cur - && save_menu_bar==*bar - && save_menu_opts==opts) { - is_redraw=1; - } - - if(mode&WIN_DYN && mode&WIN_REDRAW) - is_redraw=1; - if(mode&WIN_DYN && mode&WIN_NODRAW) - is_redraw=0; - - if(mode&WIN_ORG && !(mode&WIN_SAV)) { /* Clear all save buffers on WIN_ORG */ - for(i=0; i< MAX_BUFS; i++) - FREE_AND_NULL(sav[i].buf); - api->savnum=0; - } - - if(mode&WIN_SAV) { - /* Check if this screen (by cur/bar) is already saved */ - for(i=0; i<MAX_BUFS; i++) { - if(sav[i].buf!=NULL) { - if(cur==sav[i].cur && bar==sav[i].bar) { - /* Yes, it is... */ - for(j=api->savnum-1; j>i; j--) { - /* Restore old screens */ - vmem_puttext(sav[j].left,sav[j].top,sav[j].right,sav[j].bot - ,(void *)sav[j].buf); /* put original window back */ - FREE_AND_NULL(sav[j].buf); - } - api->savnum=i; - } - } - } - /* savnum not the next one - must be a dynamic window or we popped back up the stack */ - if(sav[api->savnum].buf != NULL) { - /* Is this even the right window? */ - if(sav[api->savnum].cur==cur - && sav[api->savnum].bar==bar) { - if((sav[api->savnum].left!=s_left+left - || sav[api->savnum].top!=s_top+top - || sav[api->savnum].right!=s_left+left+width+1 - || sav[api->savnum].bot!=s_top+top+height)) { /* dimensions have changed */ - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); /* put original window back */ - FREE_AND_NULL(sav[api->savnum].buf); - if ((sav[api->savnum].buf = malloc((width + 3) * (height + 2) * sizeof(struct vmem_cell)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*sizeof(struct vmem_cell)); - free(title); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - return(-1); - } - vmem_gettext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,(void *)sav[api->savnum].buf); /* save again */ - sav[api->savnum].left=s_left+left; - sav[api->savnum].top=s_top+top; - sav[api->savnum].right=s_left+left+width+1; - sav[api->savnum].bot=s_top+top+height; - sav[api->savnum].cur=cur; - sav[api->savnum].bar=bar; - } - } - else { - /* Find something available... */ - while(sav[api->savnum].buf!=NULL) - api->savnum++; - } - } - else { - if((sav[api->savnum].buf=malloc((width+3)*(height+2)*sizeof(struct vmem_cell)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*sizeof(struct vmem_cell)); - free(title); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - return(-1); - } - vmem_gettext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,(void *)sav[api->savnum].buf); - sav[api->savnum].left=s_left+left; - sav[api->savnum].top=s_top+top; - sav[api->savnum].right=s_left+left+width+1; - sav[api->savnum].bot=s_top+top+height; - sav[api->savnum].cur=cur; - sav[api->savnum].bar=bar; - } - } - - if(!is_redraw) { - if(mode&WIN_ORG) { /* Clear around menu */ - if(top) - vmem_puttext(1,2,api->scrn_width,s_top+top-1,blk_scrn); - if((unsigned)(s_top+height+top)<=api->scrn_len) - vmem_puttext(1,s_top+height+top,api->scrn_width,api->scrn_len,blk_scrn); - if(left) - vmem_puttext(1,s_top+top,s_left+left-1,s_top+height+top - ,blk_scrn); - if(s_left+left+width<=s_right) - vmem_puttext(s_left+left+width,s_top+top,/* s_right+2 */api->scrn_width - ,s_top+height+top,blk_scrn); - } - ptr=tmp_buffer; - if(!(mode&WIN_NOBRDR)) { - set_vmem(ptr++, api->chars->list_top_left, hclr|(bclr<<4), 0); - - if(api->mode&UIFC_MOUSE) { - set_vmem(ptr++, api->chars->button_left, hclr|(bclr<<4), 0); - /* *(ptr++)='�'; */ - set_vmem(ptr++, api->chars->close_char, lclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->button_right, hclr|(bclr<<4), 0); - i=3; - if(api->help_available) { - set_vmem(ptr++, api->chars->button_left, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->help_char, lclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->button_right, hclr|(bclr<<4), 0); - i+=3; - } - api->buttony=s_top+top; - api->exitstart=s_left+left+1; - api->exitend=s_left+left+3; - api->helpstart=s_left+left+4; - api->helpend=s_left+left+6; - } - else - i=0; - - for(;i<width-2;i++) - set_vmem(ptr++, api->chars->list_top, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_top_right, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_left, hclr|(bclr<<4), 0); - a=title_len; - b=(width-a-1)/2; - for(i=0;i<b;i++) { - set_vmem(ptr++, ' ', hclr|(bclr<<4), 0); - } - for(i=0;i<a;i++) - set_vmem(ptr++, title[i], hclr|(bclr<<4), 0); - for(i=0;i<width-(a+b)-2;i++) - set_vmem(ptr++, ' ', hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_right, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_separator_left, hclr|(bclr<<4), 0); - for(i=0;i<width-2;i++) - set_vmem(ptr++, api->chars->list_horizontal_separator, hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_separator_right, hclr|(bclr<<4), 0); - } - - if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - - if(!bar) { - if((*cur)>height-vbrdrsize-1) - (*cur)=height-vbrdrsize-1; - if((*cur)>opts-1) - (*cur)=opts-1; - i=0; - } - else { - if((*bar)>=opts) - (*bar)=opts-1; - if((*bar)>height-vbrdrsize-1) - (*bar)=height-vbrdrsize-1; - if((*cur)==opts-1) - (*bar)=height-vbrdrsize-1; - if((*bar)>opts-1) - (*bar)=opts-1; - if((*bar)<0) - (*bar)=0; - i=(*cur)-(*bar); - if (i < 0) { - *bar += i; - i = 0; - } - if(i+(height-vbrdrsize-1)>=opts) { - (*bar)=(height-vbrdrsize); - if (*bar > *cur) - *bar = *cur; - i=(*cur)-(*bar)+1; - } - } - if((*cur)<0) - (*cur)=0; - - j=0; - if(i<0) i=0; - longopt=0; - while(j<height-vbrdrsize) { - if(!(mode&WIN_NOBRDR)) - set_vmem(ptr++, api->chars->list_left, hclr|(bclr<<4), 0); - set_vmem(ptr++, ' ', hclr|(bclr<<4), 0); - set_vmem(ptr++, api->chars->list_scrollbar_separator, lclr|(bclr<<4), 0); - if(i==(*cur)) - a=lbclr; - else - a=lclr|(bclr<<4); - if(i<opts && option[i]!=NULL) { - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+hbrdrsize+2>width) - b=width-hbrdrsize-2; - for(c=0;c<b;c++) - set_vmem(ptr++, option[i][c], a, 0); - } - else - c=0; - while(c<width-hbrdrsize-2) { - set_vmem(ptr++, ' ', a, 0); - c++; - } - if(!(mode&WIN_NOBRDR)) - set_vmem(ptr++, api->chars->list_right, hclr|(bclr<<4), 0); - i++; - j++; - } - if(!(mode&WIN_NOBRDR)) { - set_vmem(ptr++, api->chars->list_bottom_left, hclr|(bclr<<4), 0); - for(i=0;i<width-2;i++) - set_vmem(ptr++, api->chars->list_bottom, hclr|(bclr<<4), 0); - set_vmem(ptr, api->chars->list_bottom_right, hclr|(bclr<<4), 0); /* Not incremented to shut up BCC */ - } - vmem_puttext(s_left+left,s_top+top,s_left+left+width-1 - ,s_top+top+height-1,tmp_buffer); - if(bar) - y=top+tbrdrwidth+(*bar); - else - y=top+tbrdrwidth+(*cur); - if(opts+vbrdrsize>height && ((!bar && (*cur)!=opts-1) - || (bar && ((*cur)-(*bar))+(height-vbrdrsize)<opts))) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - textattr(lclr|(bclr<<4)); - putch(api->chars->down_arrow); /* put down arrow */ - textattr(hclr|(bclr<<4)); - } - - if(bar && (*bar)!=(*cur)) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - textattr(hclr|(bclr<<4)); - } - - if(!(mode&WIN_NOBRDR)) { - /* Shadow */ - if(api->bclr==BLUE) { - vmem_gettext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+height-1,shade); - for(i=0;i<height*2;i++) - set_vmem_attr(&shade[i], DARKGRAY); - vmem_puttext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+height-1,shade); - vmem_gettext(s_left+left+2,s_top+top+height,s_left+left+width+1 - ,s_top+top+height,shade); - for(i=0;i<width;i++) - set_vmem_attr(&shade[i], DARKGRAY); - vmem_puttext(s_left+left+2,s_top+top+height,s_left+left+width+1 - ,s_top+top+height,shade); - } - } - } - else { /* Is a redraw */ - if(bar) - y=top+tbrdrwidth+(*bar); - else - y=top+tbrdrwidth+(*cur); - i=(*cur)+(top+tbrdrwidth-y); - j=tbrdrwidth-1; - - longopt=0; - while(j<height-bbrdrwidth-1) { - ptr=tmp_buffer; - if(i==(*cur)) - a=lbclr; - else - a=lclr|(bclr<<4); - if(i<opts && option[i]!=NULL) { - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+hbrdrsize+2>width) - b=width-hbrdrsize-2; - for(c=0;c<b;c++) - set_vmem(ptr++, option[i][c], a, 0); - } - else - c=0; - while(c<width-hbrdrsize-2) { - set_vmem(ptr++, ' ', a, 0); - c++; - } - i++; - j++; - vmem_puttext(s_left+left+lbrdrwidth+2,s_top+top+j,s_left+left+width-rbrdrwidth-1 - ,s_top+top+j,tmp_buffer); - } - } - free(title); - - last_menu_cur=cur; - last_menu_bar=bar; - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - - if(mode&WIN_IMM) { - return(-2); - } - - if(mode&WIN_ORG) { - if(api->timedisplay != NULL) - api->timedisplay(/* force? */TRUE); - } - - while(1) { - #if 0 /* debug */ - struct text_info txtinfo; - gettextinfo(&txtinfo); - gotoxy(30,1); - cprintf("y=%2d h=%2d c=%2d b=%2d s=%2d o=%2d w=%d/%d h=%d/%d" - ,y,height,*cur,bar ? *bar :0xff,api->savnum,opts,txtinfo.screenwidth, api->scrn_width, txtinfo.screenheight, api->scrn_len); - #endif - if(api->timedisplay != NULL) - api->timedisplay(/* force? */FALSE); - gotkey=0; - textattr(((api->lbclr)&0x0f)|((api->lbclr >> 4)&0x0f)); - gotoxy(s_left+lbrdrwidth+2+left, s_top+y); - if((api->exit_flags & UIFC_XF_QUIT) || kbwait() || (mode&(WIN_POP|WIN_SEL))) { - if(api->exit_flags & UIFC_XF_QUIT) - gotkey = CIO_KEY_QUIT; - else if(mode&WIN_POP) - gotkey=ESC; - else if(mode&WIN_SEL) - gotkey=CR; - else - gotkey=inkey(); - if(gotkey==CIO_KEY_MOUSE) { - if((gotkey=uifc_getmouse(&mevnt))==0) { - /* Clicked in menu */ - if(mevnt.startx>=s_left+left+lbrdrwidth+2 - && mevnt.startx<=s_left+left+width-rbrdrwidth-1 - && mevnt.starty>=s_top+top+tbrdrwidth - && mevnt.starty<=(s_top+top+optheight)-bbrdrwidth-1 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - - (*cur)=((mevnt.starty)-(s_top+top+tbrdrwidth))+(*cur+(top+tbrdrwidth-y)); - if(bar) - (*bar)=(*cur); - y=top+tbrdrwidth+((mevnt.starty)-(s_top+top+tbrdrwidth)); - - if(!opts) - continue; - - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ACT) { - if(!(api->mode&UIFC_NHM)) - uifc_mouse_disable(); - if((win=malloc((width+3)*(height+2)*sizeof(*win)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*sizeof(*win)); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - return(-1); - } - inactive_win(win, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - free(win); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - } - else if(mode&WIN_SAV) { - api->savnum--; - if(!(api->mode&UIFC_NHM)) - uifc_mouse_disable(); - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - if(!(api->mode&UIFC_NHM)) - uifc_mouse_enable(); - FREE_AND_NULL(sav[api->savnum].buf); - } - if(mode&WIN_XTR && (*cur)==opts-1) - return(MSK_INS|*cur); - return(*cur); - } - /* Clicked Scroll Up */ - else if(mevnt.startx==s_left+left+lbrdrwidth - && mevnt.starty==s_top+top+tbrdrwidth - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - gotkey=CIO_KEY_PPAGE; - } - /* Clicked Scroll Down */ - else if(mevnt.startx==s_left+left+lbrdrwidth - && mevnt.starty==(s_top+top+height)-bbrdrwidth-1 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - gotkey=CIO_KEY_NPAGE; - } - /* Clicked Outside of Window */ - else if((mevnt.startx<s_left+left - || mevnt.startx>s_left+left+width-1 - || mevnt.starty<s_top+top - || mevnt.starty>s_top+top+height-1) - && (mevnt.event==CIOLIB_BUTTON_1_CLICK - || mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - if(mode&WIN_UNGETMOUSE) { - ungetmouse(&mevnt); - gotkey=CIO_KEY_MOUSE; - } - else { - gotkey=ESC; - } - } - } - } - /* For compatibility with terminals lacking special keys */ - switch(gotkey) { - case '\b': - gotkey=ESC; - break; - case '+': - gotkey=CIO_KEY_IC; /* insert */ - break; - case '-': - case DEL: - gotkey=CIO_KEY_DC; /* delete */ - break; - case CTRL_B: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_HOME; - break; - case CTRL_C: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_F(5); /* copy */ - break; - case CTRL_D: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_NPAGE; - break; - case CTRL_E: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_END; - break; - case CTRL_U: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_PPAGE; - break; - case CTRL_V: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_F(6); /* paste */ - break; - case CTRL_X: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_SHIFT_DC; /* cut */ - break; - case CTRL_Z: - if(!(api->mode&UIFC_NOCTRL)) - gotkey=CIO_KEY_F(1); /* help */ - break; - case CIO_KEY_ABORTED: - gotkey=ESC; - break; - case CIO_KEY_QUIT: - api->exit_flags |= UIFC_XF_QUIT; - gotkey=ESC; - break; - } - if(gotkey>255) { - s=0; - switch(gotkey) { - /* ToDo extended keys */ - case CIO_KEY_HOME: /* home */ - if(!opts) - break; - if(opts+vbrdrsize>optheight) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[0]); - for(i=1;i<optheight-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+tbrdrwidth; - break; - } - vmem_gettext(s_left+left+lbrdrwidth+2,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+left+lbrdrwidth+2,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+tbrdrwidth; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - case CIO_KEY_UP: /* up arrow */ - if(!opts) - break; - if(!(*cur) && opts+vbrdrsize>optheight) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); /* like end */ - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - for(i=(opts+vbrdrsize)-optheight,j=0;i<opts;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==opts-1 ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=opts-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - y=top+optheight-bbrdrwidth-1; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if(!(*cur)) { - y=top+optheight-bbrdrwidth-1; - (*cur)=opts-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - } - else { - (*cur)--; - y--; - if(bar && *bar) - (*bar)--; - } - if(y<top+tbrdrwidth) { /* scroll */ - if(!(*cur)) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(' '); /* delete the up arrow */ - } - if((*cur)+optheight-vbrdrsize==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - textattr(lclr|(bclr<<4)); - putch(api->chars->down_arrow); /* put the dn arrow */ - } - y++; - scroll_text(s_left+left+lbrdrwidth+1,s_top+top+tbrdrwidth - ,s_left+left+width-rbrdrwidth-1,s_top+top+height-bbrdrwidth-1,1); - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[*cur]); - } - else { - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - } - break; - case CIO_KEY_PPAGE: /* PgUp */ - if(!opts) - break; - *cur -= (optheight-vbrdrsize-1); - if(*cur<0) - *cur = 0; - if(bar) - *bar=0; - y=top+tbrdrwidth; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(*cur) /* Scroll mode */ - putch(api->chars->up_arrow); /* put the up arrow */ - else - putch(' '); /* delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - if(opts >= height-tbrdrwidth && *cur + height - vbrdrsize < opts) - putch(api->chars->down_arrow); /* put the down arrow */ - else - putch(' '); /* delete the down arrow */ - for(i=*cur,j=0;i<=*cur-vbrdrsize-1+optheight;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==*cur ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - break; - case CIO_KEY_NPAGE: /* PgDn */ - if(!opts) - break; - *cur += (height-vbrdrsize-1); - if(*cur>opts-1) - *cur = opts-1; - if(bar) - *bar = optheight-vbrdrsize-1; - y=top+optheight-bbrdrwidth-1; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(*cur>height-vbrdrsize-1) /* Scroll mode */ - putch(api->chars->up_arrow); /* put the up arrow */ - else - putch(' '); /* delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - if(*cur < opts-1) - putch(api->chars->down_arrow); /* put the down arrow */ - else - putch(' '); /* delete the down arrow */ - for(i=*cur+vbrdrsize+1-optheight,j=0;i<=*cur;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==*cur ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - break; - case CIO_KEY_END: /* end */ - if(!opts) - break; - if(opts+vbrdrsize>height) { /* Scroll mode */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - for(i=(opts+vbrdrsize)-height,j=0;i<opts;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==opts-1 ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=opts-1; - y=top+optheight-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<width;i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - (*cur)=opts-1; - y=top+optheight-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0;i<74;i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - case CIO_KEY_DOWN: /* dn arrow */ - if(!opts) - break; - if((*cur)==opts-1 && opts+vbrdrsize>height) { /* like home */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[0]); - for(i=1;i<height-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - (*cur)=0; - y=top+tbrdrwidth; - if(bar) - (*bar)=0; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if((*cur)==opts-1) { - (*cur)=0; - y=top+tbrdrwidth; - if(bar) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)=0; - } - } - else { - (*cur)++; - y++; - if(bar && (*bar)<height-vbrdrsize-1) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)++; - } - } - if(y==top+height-bbrdrwidth) { /* scroll */ - if(*cur==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - textattr(lclr|(bclr<<4)); - putch(' '); /* delete the down arrow */ - } - if((*cur)+vbrdrsize==height) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - } - y--; - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - scroll_text(s_left+left+lbrdrwidth+1,s_top+top+tbrdrwidth - ,s_left+left+width-rbrdrwidth-1,s_top+top+height-bbrdrwidth-1,0); - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+height-bbrdrwidth-1 - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[*cur]); - } - else { - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y - ,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y - ,line); - } - break; - case CIO_KEY_F(1): /* F1 - Help */ - { - struct vmem_cell *save = malloc(width*height*sizeof(*save)); - if(save != NULL) { - vmem_gettext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,save); - struct vmem_cell *copy = malloc(width*height*sizeof(*copy)); - if(copy != NULL) { - inactive_win(copy, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - free(copy); - } - } - api->showhelp(); - if(save != NULL) { - vmem_puttext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,save); - free(save); - } - break; - } - case CIO_KEY_F(2): /* F2 - Edit */ - if(mode&WIN_XTR && (*cur)==opts-1) /* can't edit */ - break; /* extra line */ - if(mode&WIN_EDIT) { - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ACT) - inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - return((*cur)|MSK_EDIT); - } - break; - case CIO_KEY_F(5): /* F5 - Copy */ - case CIO_KEY_CTRL_IC: /* Ctrl-Insert */ - if(mode&WIN_COPY && !(mode&WIN_XTR && (*cur)==opts-1)) - return((*cur) | MSK_COPY); - break; - case CIO_KEY_SHIFT_DC: /* Shift-Del: Cut */ - if(mode&WIN_CUT && !(mode&WIN_XTR && (*cur) == opts - 1)) - return((*cur) | MSK_CUT); - break; - case CIO_KEY_SHIFT_IC: /* Shift-Insert: Paste */ - case CIO_KEY_F(6): /* F6 - Paste */ - if(mode&WIN_PASTE && (mode&WIN_PASTEXTR || !(mode&WIN_XTR && (*cur)==opts-1))) - return((*cur)|MSK_PASTE); - break; - case CIO_KEY_IC: /* insert */ - if(mode&WIN_INS) { - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_INSACT) - inactive_win(tmp_buffer, s_left+left,s_top+top,s_left+left+width-1,s_top+top+height-1,y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - if(!opts) { - return(MSK_INS); - } - return((*cur)|MSK_INS); - } - break; - case CIO_KEY_DC: /* delete */ - if(mode&WIN_XTR && (*cur)==opts-1) /* can't delete */ - break; /* extra line */ - if(mode&WIN_DEL) { - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_DELACT) - inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - return((*cur)|MSK_DEL); - } - break; - default: - if(mode&WIN_EXTKEYS) - return(-2-gotkey); - break; - } - } - else { - gotkey&=0xff; - if(isalnum(gotkey) && opts>1 && option[0][0]) { - search[s]=gotkey; - search[s+1]=0; - for(j=(*cur)+1,a=b=0;a<2;j++) { /* a = search count */ - if(j==opts) { /* j = option count */ - j=-1; /* b = letter count */ - continue; - } - if(j==(*cur)) { - b++; - continue; - } - if(b>=longopt) { - b=0; - a++; - } - if(a==1 && !s) - break; - if(option[j]!=NULL - && strlen(option[j])>(size_t)b - && ((!a && s && !strnicmp(option[j]+b,search,s+1)) - || ((a || !s) && toupper(option[j][b])==toupper(gotkey)))) { - if(a) s=0; - else s++; - if(y+(j-(*cur))+2>height+top) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - if((*cur)==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - } - for(i=((*cur)+vbrdrsize+1)-height,j=0;i<(*cur)+1;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==(*cur) ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - y=top+height-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - break; - } - if(y-((*cur)-j)<top+tbrdrwidth) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(!(*cur)) - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[(*cur)]); - for(i=1;i<height-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2 - ,option[(*cur)+i]); - y=top+tbrdrwidth; - if(bar) - (*bar)=0; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i<width; i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if((*cur)>j) - y-=(*cur)-j; - else - y+=j-(*cur); - if(bar) { - if((*cur)>j) - (*bar)-=(*cur)-j; - else - (*bar)+=j-(*cur); - } - (*cur)=j; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - } - } - if(a==2) - s=0; - } - else - switch(gotkey) { - case CR: - if(!opts) - break; - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ACT) - inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); - else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - if(mode&WIN_XTR && (*cur)==opts-1) - return(MSK_INS|*cur); - return(*cur); - case 3: - case ESC: - if(mode&WIN_SAV) - api->savnum++; - if(mode&WIN_ESC || (mode&WIN_CHE && api->changes)) { - vmem_gettext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,tmp_buffer); - for(i=0; i < (width * height);i++) - set_vmem_attr(&tmp_buffer[i], lclr|(cclr<<4)); - vmem_puttext(s_left+left,s_top+top,s_left - +left+width-1,s_top+top+height-1,tmp_buffer); - } - else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,(void *)sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); - } - return(-1); - case CTRL_F: /* find */ - case CTRL_G: - if(/*!(api->mode&UIFC_NOCTRL)*/1) { // No no, *this* control key is fine! - if (gotkey == CTRL_G || api->input(WIN_MID|WIN_SAV, 0, 0, "Find", search, sizeof(search), K_EDIT|K_FIND) > 0) { - for (j = (*cur) + 1; j != *cur; j++, j = (j >= opts) ? 0 : j) { - if (option[j] == NULL || j >= opts) - continue; - if (strcasestr(option[j], search) != NULL) { - // Copy/pasted from search above. - if(y+(j-(*cur))+2>height+top) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - putch(api->chars->up_arrow); /* put the up arrow */ - if((*cur)==opts-1) { - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(' '); /* delete the down arrow */ - } - for(i=((*cur)+vbrdrsize+1)-height,j=0;i<(*cur)+1;i++,j++) - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+j - ,i==(*cur) ? lbclr - : lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[i]); - y=top+height-bbrdrwidth-1; - if(bar) - (*bar)=optheight-vbrdrsize-1; - break; - } - if(y-((*cur)-j)<top+tbrdrwidth) { - (*cur)=j; - gotoxy(s_left+left+lbrdrwidth,s_top+top+tbrdrwidth); - textattr(lclr|(bclr<<4)); - if(!(*cur)) - putch(' '); /* Delete the up arrow */ - gotoxy(s_left+left+lbrdrwidth,s_top+top+height-bbrdrwidth-1); - putch(api->chars->down_arrow); /* put the down arrow */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth - ,lbclr - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2,option[(*cur)]); - for(i=1;i<height-vbrdrsize;i++) /* re-display options */ - uprintf(s_left+left+lbrdrwidth+2,s_top+top+tbrdrwidth+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-hbrdrsize-2,width-hbrdrsize-2 - ,option[(*cur)+i]); - y=top+tbrdrwidth; - if(bar) - (*bar)=0; - break; - } - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i<width; i++) - set_vmem_attr(&line[i], lclr|(bclr<<4)); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - if((*cur)>j) - y-=(*cur)-j; - else - y+=j-(*cur); - if(bar) { - if((*cur)>j) - (*bar)-=(*cur)-j; - else - (*bar)+=j-(*cur); - } - (*cur)=j; - vmem_gettext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - for(i=0; i < width; i++) - set_vmem_attr(&line[i], lbclr); - vmem_puttext(s_left+lbrdrwidth+2+left,s_top+y - ,s_left+left+width-rbrdrwidth-1,s_top+y,line); - break; - } - } - } - } - break; - default: - if(mode&WIN_EXTKEYS) - return(-2-gotkey); - } - } - /* Update the status bar to reflect the Put/Paste option applicability */ - if (bline&WIN_PASTE && api->bottomline != NULL) { - if ((mode&(WIN_XTR | WIN_PASTEXTR)) == WIN_XTR && (*cur) == opts - 1) - api->bottomline(bline & ~WIN_PASTE); - else - api->bottomline(bline); - } - } - else - mswait(1); - if(mode&WIN_DYN) { - save_menu_cur=*cur; - save_menu_bar=*bar; - save_menu_opts=opts; - return(-2-gotkey); - } - } -} - - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, const char *inprompt, char *str, - int max, int kmode) -{ - struct vmem_cell shade[MAX_COLS], save_buf[MAX_COLS*4], in_win[MAX_COLS*3]; - int width; - int height=3; - int i,plen,slen,j; - int iwidth; - int l; - char *prompt; - int s_top=SCRN_TOP; - int s_left=SCRN_LEFT; - int s_right=SCRN_RIGHT; - int s_bottom=api->scrn_len-3; - int hbrdrsize=2; - int tbrdrwidth=1; - - reset_dynamic(); - - if(mode&WIN_FAT) { - s_top=1; - s_left=2; - s_right=api->scrn_width-3; /* Leave space for the shadow */ - } - if(mode&WIN_NOBRDR) { - hbrdrsize=0; - tbrdrwidth=0; - height=1; - } - - prompt=strdup(inprompt==NULL ? "":inprompt); - plen=strlen(prompt); - if(!plen) - slen=2+hbrdrsize; - else - slen=4+hbrdrsize; - - width=plen+slen+max; - if(width>(s_right-s_left+1)) - width=(s_right-s_left+1); - if(mode&WIN_T2B) - top=(api->scrn_len-height+1)/2-2; - else if(mode&WIN_BOT) - top=s_bottom-height-top; - if(mode&WIN_L2R) - left=(s_right-s_left-width+1)/2; - if(left<=-(s_left)) - left=-(s_left)+1; - if(top<0) - top=0; - if(mode&WIN_SAV) - vmem_gettext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,save_buf); - if(mode&WIN_ORG) { /* Clear around menu */ - if(top) - vmem_puttext(1,2,api->scrn_width,s_top+top-1,blk_scrn); - if((unsigned)(s_top+height+top)<=api->scrn_len) - vmem_puttext(1,s_top+height+top,api->scrn_width,api->scrn_len,blk_scrn); - if(left) - vmem_puttext(1,s_top+top,s_left+left-1,s_top+height+top - ,blk_scrn); - if(s_left+left+width<=s_right) - vmem_puttext(s_left+left+width,s_top+top,/* s_right+2 */api->scrn_width - ,s_top+height+top,blk_scrn); - } - - iwidth=width-plen-slen; - while(iwidth<1 && plen>4) { - plen=strlen(prompt); - prompt[plen-1]=0; - prompt[plen-2]='.'; - prompt[plen-3]='.'; - prompt[plen-4]='.'; - plen--; - iwidth=width-plen-slen; - } - - i=0; - if(!(mode&WIN_NOBRDR)) { - set_vmem(&in_win[i++], api->chars->input_top_left, api->hclr|(api->bclr<<4), 0); - for(j=1;j<width-1;j++) - set_vmem(&in_win[i++], api->chars->input_top, api->hclr|(api->bclr<<4), 0); - if(api->mode&UIFC_MOUSE && width>6) { - j=1; - set_vmem(&in_win[j++], api->chars->button_left, api->hclr|(api->bclr<<4), 0); - /* in_win[4]='�'; */ - set_vmem(&in_win[j++], api->chars->close_char, api->lclr|(api->bclr<<4), 0); - set_vmem(&in_win[j++], api->chars->button_right, api->hclr|(api->bclr<<4), 0); - l=3; - if(api->helpbuf!=NULL || api->helpixbfile[0]!=0) { - set_vmem(&in_win[j++], api->chars->button_left, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[j++], api->chars->help_char, api->lclr|(api->bclr<<4), 0); - set_vmem(&in_win[j++], api->chars->button_right, api->hclr|(api->bclr<<4), 0); - l+=3; - } - api->buttony=s_top+top; - api->exitstart=s_left+left+1; - api->exitend=s_left+left+3; - api->helpstart=s_left+left+4; - api->helpend=s_left+left+l; - } - - set_vmem(&in_win[i++], api->chars->input_top_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[i++], api->chars->input_right, api->hclr|(api->bclr<<4), 0); - } - - if(plen) - set_vmem(&in_win[i++], ' ', api->lclr|(api->bclr<<4), 0); - - for(j=0;prompt[j];j++) - set_vmem(&in_win[i++], prompt[j], api->lclr|(api->bclr<<4), 0); - - if(plen) - set_vmem(&in_win[i++], ':', api->lclr|(api->bclr<<4), 0); - - for(j=0;j<iwidth+2;j++) { - set_vmem(&in_win[i++], ' ', api->lclr|(api->bclr<<4), 0); - } - - if(!(mode&WIN_NOBRDR)) { - set_vmem(&in_win[i++], api->chars->input_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[i++], api->chars->input_bottom_left, api->hclr|(api->bclr<<4), 0); - for(j=1;j<width-1;j++) - set_vmem(&in_win[i++], api->chars->input_bottom, api->hclr|(api->bclr<<4), 0); - set_vmem(&in_win[i], api->chars->input_bottom_right, api->hclr|(api->bclr<<4), 0); /* I is not incremented to shut up BCC */ - } - vmem_puttext(s_left+left,s_top+top,s_left+left+width-1 - ,s_top+top+height-1,in_win); - - if(!(mode&WIN_NOBRDR)) { - /* Shadow */ - if(api->bclr==BLUE) { - vmem_gettext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+(height-1),shade); - for(j=0;j<6;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(s_left+left+width,s_top+top+1,s_left+left+width+1 - ,s_top+top+(height-1),shade); - vmem_gettext(s_left+left+2,s_top+top+3,s_left+left+width+1 - ,s_top+top+height,shade); - for(j=0;j<width;j++) - set_vmem_attr(&shade[j], DARKGRAY); - vmem_puttext(s_left+left+2,s_top+top+3,s_left+left+width+1 - ,s_top+top+height,shade); - } - } - - if(api->bottomline != NULL) - api->bottomline(WIN_COPY|WIN_CUT|WIN_PASTE); - textattr(api->lclr|(api->bclr<<4)); - if(!plen) - i=ugetstr(s_left+left+2,s_top+top+tbrdrwidth,iwidth,str,max,kmode,NULL); - else - i=ugetstr(s_left+left+plen+4,s_top+top+tbrdrwidth,iwidth,str,max,kmode,NULL); - if(mode&WIN_SAV) - vmem_puttext(s_left+left,s_top+top,s_left+left+width+1 - ,s_top+top+height,save_buf); - free(prompt); - return(i); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -int umsg(const char *str) -{ - int i=0; - char *ok[2]={"OK",""}; - - if(api->mode&UIFC_INMSG) /* non-cursive */ - return -1; - api->mode|=UIFC_INMSG; - i = ulist(WIN_SAV|WIN_MID,0,0,0,&i,0,str,ok); - api->mode&=~UIFC_INMSG; - return i; -} - -/* Same as above, using printf-style varargs */ -int umsgf(char* fmt, ...) -{ - int retval = -1; - va_list va; - char* buf = NULL; - - va_start(va, fmt); - vasprintf(&buf, fmt, va); - va_end(va); - if(buf != NULL) { - retval = umsg(buf); - free(buf); - } - return retval; -} - -static int yesno(int dflt, char* fmt, va_list va) -{ - int retval; - char* buf = NULL; - - vasprintf(&buf, fmt, va); - if(buf == NULL) - return dflt; - retval = ulist(WIN_SAV|WIN_MID,0,0,0,&dflt,0,buf,api->yesNoOpts); - free(buf); - return retval; -} - -static BOOL confirm(char* fmt, ...) -{ - int retval; - - va_list va; - va_start(va, fmt); - retval = yesno(0, fmt, va); - va_end(va); - return retval == 0; -} - -static BOOL deny(char* fmt, ...) -{ - int retval; - - va_list va; - va_start(va, fmt); - retval = yesno(1, fmt, va); - va_end(va); - return retval != 0; -} - -/***************************************/ -/* Private sub - updates a ugetstr box */ -/***************************************/ -void getstrupd(int left, int top, int width, char *outstr, int cursoffset, int *scrnoffset, int mode) -{ - _setcursortype(_NOCURSOR); - if(cursoffset<*scrnoffset) - *scrnoffset=cursoffset; - - if(*scrnoffset+width < cursoffset) - *scrnoffset=cursoffset-width; - - gotoxy(left,top); - if(mode&K_PASSWORD) - // This typecast is to suppress a clang warning "adding 'unsigned long' to a string does not append to the string [-Wstring-plus-int]" - cprintf("%-*.*s",width,width,((char *)"********************************************************************************")+(80-strlen(outstr+*scrnoffset))); - else - cprintf("%-*.*s",width,width,outstr+*scrnoffset); - gotoxy(left+(cursoffset-*scrnoffset),top); - _setcursortype(cursor); -} - -/****************************************************************************/ -/* Gets a string of characters from the user. Turns cursor on. Allows */ -/* Different modes - K_* macros. ESC aborts input. */ -/****************************************************************************/ -int ugetstr(int left, int top, int width, char *outstr, int max, long mode, int *lastkey) -{ - char *str; - int ch; - int i,j,k,f=0; /* i=offset, j=length */ - BOOL gotdecimal=FALSE; - int soffset=0; - struct mouse_event mevnt; - char *pastebuf=NULL; - unsigned char *pb=NULL; - - api->exit_flags = 0; - if((str=alloca(max+1))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,(max+1)); - _setcursortype(cursor); - return(-1); - } - gotoxy(left,top); - _setcursortype(cursor = api->insert_mode ? _SOLIDCURSOR : _NORMALCURSOR); - str[0]=0; - if(mode&K_EDIT && outstr[0]) { - /*** - truncspctrl(outstr); - ***/ - outstr[max]=0; - i=j=strlen(outstr); - textattr(api->lbclr); - getstrupd(left, top, width, outstr, i, &soffset, mode); - textattr(api->lclr|(api->bclr<<4)); - if(strlen(outstr)<(size_t)width) { - k=wherex(); - f=wherey(); - cprintf("%*s",width-strlen(outstr),""); - gotoxy(k,f); - } - strcpy(str,outstr); -#if 0 - while(kbwait()==0) { - mswait(1); - } -#endif - f=inkey(); - if(f==CIO_KEY_QUIT) { - api->exit_flags |= UIFC_XF_QUIT; - return -1; - } - - if(f==CIO_KEY_MOUSE) { - f=uifc_getmouse(&mevnt); - if(f==0 || (f==ESC && mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - if(mode & K_MOUSEEXIT - && (mevnt.starty != top - || mevnt.startx > left+width - || mevnt.startx < left) - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - if(lastkey) - *lastkey=CIO_KEY_MOUSE; - ungetmouse(&mevnt); - return(j); - } - if(mevnt.startx>=left - && mevnt.startx<=left+width - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - } - if(mevnt.starty == top - && mevnt.startx>=left - && mevnt.startx<=left+width - && (mevnt.event==CIOLIB_BUTTON_2_CLICK - || mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - pb=(uint8_t *)getcliptext(); - if (pb) { - pastebuf = utf8_to_cp(CIOLIB_CP437, pb, '?', strlen((char *)pb), NULL); - free(pb); - pb=(unsigned char *)pastebuf; - } - else { - free(pastebuf); - pastebuf = NULL; - } - f=0; - } - } - } - - if(f == CR - || (f >= 0xff && f != CIO_KEY_DC) - || (f == 3840 && mode&K_TABEXIT) // Backtab - || (f == '\t' && mode&K_TABEXIT) - || (f == '%' && mode&K_SCANNING) - || f==CTRL_B - || f==CTRL_E - || f==CTRL_Z - || f==CTRL_X /* Cut */ - || f==CTRL_C /* Copy */ - || f==0) - { - getstrupd(left, top, width, str, i, &soffset, mode); - } - else - { - getstrupd(left, top, width, str, i, &soffset, mode); - i=j=0; - } - } - else - i=j=0; - - ch=0; - while(ch!=CR) - { - if(i>j) j=i; - str[j]=0; - getstrupd(left, top, width, str, i, &soffset, mode); - if(f || pb!=NULL || (ch=inkey())!=0) - { - if(f) { - ch=f; - f=0; - } - else if(pb!=NULL) { - ch=*(pb++); - if(!*pb) { - free(pastebuf); - pastebuf=NULL; - pb=NULL; - } - } - if(ch==CIO_KEY_MOUSE) { - ch=uifc_getmouse(&mevnt); - if(ch==0 || (ch==ESC && mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - if(mode & K_MOUSEEXIT - && (mevnt.starty != top - || mevnt.startx > left+width - || mevnt.startx < left) - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - if(lastkey) - *lastkey=CIO_KEY_MOUSE; - ungetmouse(&mevnt); - ch=CR; - continue; - } - if(mevnt.starty == top - && mevnt.startx>=left - && mevnt.startx<=left+width - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - } - if(mevnt.starty == top - && mevnt.startx>=left - && mevnt.startx<=left+width - && (mevnt.event==CIOLIB_BUTTON_2_CLICK - || mevnt.event==CIOLIB_BUTTON_3_CLICK)) { - i=mevnt.startx-left+soffset; - if(i>j) - i=j; - pb=(uint8_t *)getcliptext(); - if (pb) { - pastebuf = utf8_to_cp(CIOLIB_CP437, pb, '?', strlen((char *)pb), NULL); - free(pb); - pb=(unsigned char *)pastebuf; - } - else { - free(pastebuf); - pastebuf = NULL; - } - ch=0; - } - } - } - if(lastkey != NULL) - *lastkey=ch; - switch(ch) - { - case CTRL_Z: - case CIO_KEY_F(1): /* F1 Help */ - api->showhelp(); - if(api->exit_flags & UIFC_XF_QUIT) - f = CIO_KEY_QUIT; - continue; - case CIO_KEY_LEFT: /* left arrow */ - if(i) - { - i--; - } - continue; - case CIO_KEY_RIGHT: /* right arrow */ - if(i<j) - { - i++; - } - continue; - case CTRL_B: - case CIO_KEY_HOME: /* home */ - if(i) - { - i=0; - } - continue; - case CTRL_E: - case CIO_KEY_END: /* end */ - if(i<j) - { - i=j; - } - continue; - case CTRL_V: - case CIO_KEY_SHIFT_IC: /* Shift-Insert: Paste */ - pb=(uint8_t *)getcliptext(); - if (pb) { - pastebuf = utf8_to_cp(CIOLIB_CP437, pb, '?', strlen((char *)pb), NULL); - free(pb); - pb=(unsigned char *)pastebuf; - } - else { - free(pastebuf); - pastebuf = NULL; - } - continue; - case CIO_KEY_IC: /* insert */ - api->insert_mode = !api->insert_mode; - _setcursortype(cursor = api->insert_mode ? _SOLIDCURSOR : _NORMALCURSOR); - continue; - case BS: - if(i) - { - if(i==j) - { - j--; - i--; - } - else { - i--; - j--; - if(str[i]=='.') - gotdecimal=FALSE; - for(k=i;k<=j;k++) - str[k]=str[k+1]; - } - if (soffset > 0) - soffset--; - continue; - } - break; - case CIO_KEY_DC: /* delete */ - case DEL: /* sdl_getch() is returning 127 when keypad "Del" is hit */ - if(i<j) - { - if(str[i]=='.') - gotdecimal=FALSE; - for(k=i;k<j;k++) - str[k]=str[k+1]; - j--; - } - continue; - case CIO_KEY_QUIT: - api->exit_flags |= UIFC_XF_QUIT; - /* Fall-through */ - case CIO_KEY_ABORTED: - case ESC: - { - cursor=_NOCURSOR; - _setcursortype(cursor); - if(pastebuf!=NULL) { - free(pastebuf); - pastebuf = NULL; - } - return(-1); - } - case CR: - break; - case 3840: /* Backtab */ - case '\t': - if(mode&K_TABEXIT) - ch=CR; - break; - case '%': /* '%' indicates that a UPC is coming next */ - if(mode&K_SCANNING) - ch=CR; - break; - case CIO_KEY_F(2): - case CIO_KEY_UP: - case CIO_KEY_DOWN: - if(mode&K_DEUCEEXIT) { - ch=CR; - break; - } - continue; - case CTRL_C: - case CIO_KEY_CTRL_IC: /* Ctrl-Insert */ - { - size_t sz; - uint8_t *utf8 = cp_to_utf8(CIOLIB_CP437, str, j, &sz); - copytext((char *)utf8, sz); - free(utf8); - continue; - } - case CTRL_X: - case CIO_KEY_SHIFT_DC: - if(j) - { - size_t sz; - uint8_t *utf8 = cp_to_utf8(CIOLIB_CP437, str, j, &sz); - copytext((char *)utf8, sz); - free(utf8); - i=j=0; - } - continue; - case CTRL_Y: - if(i<j) - { - j=i; - } - continue; - } - if(mode&K_NUMBER && !isdigit(ch)) - continue; - if(mode&K_DECIMAL && !isdigit(ch)) { - if(ch!='.') - continue; - if(gotdecimal) - continue; - gotdecimal=TRUE; - } - if(mode&K_ALPHA && !isalpha(ch)) - continue; - if((ch>=' ' || (ch==1 && mode&K_MSG)) && i<max && (!api->insert_mode || j<max) && ch < 256) - { - if(mode&K_UPPER) - ch=toupper(ch); - if(api->insert_mode) - { - for(k=++j;k>i;k--) - str[k]=str[k-1]; - } - str[i++]=ch; - } - } - } - - - str[j]=0; - if(mode&K_EDIT) - { - truncspctrl(str); - if(!(mode&K_FIND) && strcmp(outstr,str)) - api->changes=1; - } - else - { - if(!(mode&K_FIND) && j) - api->changes=1; - } - strcpy(outstr,str); - cursor=_NOCURSOR; - _setcursortype(cursor); - if(pastebuf!=NULL) - free(pastebuf); - return(j); -} - -/****************************************************************************/ -/* Performs printf() through puttext() routine */ -/****************************************************************************/ -static int uprintf(int x, int y, unsigned attr, char *fmat, ...) -{ - va_list argptr; - char str[MAX_COLS+1]; - struct vmem_cell buf[MAX_COLS]; - int i; - - va_start(argptr,fmat); - vsprintf(str,fmat,argptr); - va_end(argptr); - for(i = 0; str[i]; i++) - set_vmem(&buf[i], str[i], attr, 0); - vmem_puttext(x,y,x+(i-1),y,buf); - return(i); -} - - -/****************************************************************************/ -/* Display bottom line of screen in inverse */ -/****************************************************************************/ -void bottomline(int mode) -{ - int i=1; - - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4)," "); - if(api->help_available) { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F1 "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Help "); - } - if(mode&WIN_EDIT) { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F2 "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Edit Item "); - } - if(mode&WIN_COPY) { - if(api->mode&UIFC_NOCTRL) { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F5 "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Copy "); - } else { - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"^C"); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"opy "); - } - } - if(mode&WIN_CUT) { - if(api->mode&UIFC_NOCTRL) - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"Shift-DEL "); - else - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"^X "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Cut "); - } - if(mode&WIN_PASTE) { - if(api->mode&UIFC_NOCTRL) - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"F6 "); - else - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"^V "); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Paste "); - } - if(mode&WIN_INS) { -#ifdef __DARWIN__ - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"+/"); -#endif - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"INS"); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"ert Item "); - } - if(mode&WIN_DEL) { -#ifdef __DARWIN__ - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"fn-"); -#endif - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"DEL"); - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"ete Item "); - } - i += uprintf(i,api->scrn_len+1,api->bclr|(api->cclr<<4),"ESC "); /* Backspace is no good no way to abort editing */ - i += uprintf(i,api->scrn_len+1,BLACK|(api->cclr<<4),"Exit"); - gotoxy(i,api->scrn_len+1); - if (wherex() == i && wherey() == api->scrn_len+1) { - textattr(BLACK|(api->cclr<<4)); - clreol(); - } -} - -/*****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/*****************************************************************************/ -char *utimestr(time_t *intime) -{ - static char str[25]; - const char* wday=""; - const char* mon=""; - const char* mer= ""; - int hour; - struct tm *gm; - - gm=localtime(intime); - switch(gm->tm_wday) { - case 0: - wday = "Sun"; - break; - case 1: - wday = "Mon"; - break; - case 2: - wday = "Tue"; - break; - case 3: - wday = "Wed"; - break; - case 4: - wday = "Thu"; - break; - case 5: - wday = "Fri"; - break; - case 6: - wday = "Sat"; - break; - } - switch(gm->tm_mon) { - case 0: - mon = "Jan"; - break; - case 1: - mon = "Feb"; - break; - case 2: - mon = "Mar"; - break; - case 3: - mon = "Apr"; - break; - case 4: - mon = "May"; - break; - case 5: - mon = "Jun"; - break; - case 6: - mon = "Jul"; - break; - case 7: - mon = "Aug"; - break; - case 8: - mon = "Sep"; - break; - case 9: - mon = "Oct"; - break; - case 10: - mon = "Nov"; - break; - case 11: - mon = "Dec"; - break; - } - if(gm->tm_hour>=12) { - mer = "pm"; - hour=gm->tm_hour; - if (hour > 12) - hour-=12; - } - else { - if(!gm->tm_hour) - hour=12; - else - hour=gm->tm_hour; - mer = "am"; - } - safe_snprintf(str, sizeof(str), "%s %s %02d %4d %02d:%02d %s",wday,mon,gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); - return(str); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(const char *str) -{ - static struct vmem_cell sav[80*3], buf[80*3]; - int i,j,k; - static int width; - - if(str == NULL) { - vmem_puttext((api->scrn_width-width+1)/2+1,(api->scrn_len-3+1)/2+1 - ,(api->scrn_width+width-1)/2+1,(api->scrn_len+3-1)/2+1,sav); - return; - } - - width = strlen(str); - if(!width) - return; - width += 7; - vmem_gettext((api->scrn_width-width+1)/2+1,(api->scrn_len-3+1)/2+1 - ,(api->scrn_width+width-1)/2+1,(api->scrn_len+3-1)/2+1,sav); - for(i=0; i < width*3; i++) - set_vmem(&buf[i], ' ', api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[0], api->chars->popup_top_left, api->hclr|(api->bclr<<4), 0); - for(i=1;i<(width-1);i++) - set_vmem(&buf[i], api->chars->popup_top, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i++], api->chars->popup_top_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i++], api->chars->popup_left, api->hclr|(api->bclr<<4), 0); - k=strlen(str); - i+=((((width-3)-k)/2)); - for(j=0;j<k;j++,i++) - set_vmem(&buf[i], str[j], api->hclr|(api->bclr<<4)|BLINK, 0); - i=(((width-1)*2)+1); - set_vmem(&buf[i++], api->chars->popup_right, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i++], api->chars->popup_bottom_left, api->hclr|(api->bclr<<4), 0); - for(;i<((width*3)-1);i++) - set_vmem(&buf[i], api->chars->popup_bottom, api->hclr|(api->bclr<<4), 0); - set_vmem(&buf[i], api->chars->popup_bottom_right, api->hclr|(api->bclr<<4), 0); - - vmem_puttext((api->scrn_width-width+1)/2+1,(api->scrn_len-3+1)/2+1 - ,(api->scrn_width+width-1)/2+1,(api->scrn_len+3-1)/2+1,buf); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -/****************************************************************************/ -/* Shows a scrollable text buffer - optionally parsing "help markup codes" */ -/****************************************************************************/ -void showbuf(int mode, int left, int top, int width, int height, const char *title, const char *hbuf, int *curp, int *barp) -{ - char inverse=0,high=0; - struct vmem_cell *textbuf; - struct vmem_cell *p; - const char *pc; - struct vmem_cell *oldp=NULL; - int i,j,k,len; - int lines; - int pad=1; - int is_redraw=0; - uint title_len=0; - struct mouse_event mevnt; - - api->exit_flags = 0; - _setcursortype(_NOCURSOR); - - title_len=strlen(title); - if(api->mode&UIFC_MOUSE) - title_len+=6; - - if((unsigned)(top+height)>=api->scrn_len) - height = api->scrn_len - top; - if(!width || (unsigned)width<title_len+6) - width=title_len+6; - if((unsigned)(width + left) > api->scrn_width) - width = api->scrn_width - left + 1; - if(mode&WIN_L2R) - left=(api->scrn_width-width+2)/2; - else if(mode&WIN_RHT) - left=SCRN_RIGHT-(width+4+left); - if(mode&WIN_T2B) - top=(api->scrn_len-height+1)/2; - else if(mode&WIN_BOT) - top=api->scrn_len-height-3-top; - if(left<0) - left=0; - if(top<0) - top=0; - - if(mode&WIN_PACK) - pad=0; - - /* Dynamic Menus */ - if(mode&WIN_DYN - && curp != NULL - && barp != NULL - && last_menu_cur==curp - && last_menu_bar==barp - && save_menu_cur==*curp - && save_menu_bar==*barp) - is_redraw=1; - if(mode&WIN_DYN && mode&WIN_REDRAW) - is_redraw=1; - if(mode&WIN_DYN && mode&WIN_NODRAW) - is_redraw=0; - - vmem_gettext(1,1,api->scrn_width,api->scrn_len,tmp_buffer); - - if(!is_redraw) { - for(i=0; i<width*height; i++) - set_vmem(&tmp_buffer2[i], ' ', api->hclr|(api->bclr<<4), 0); - tmp_buffer2[0].ch=api->chars->help_top_left; - j=title_len; - if(j>width-6) { - j=width-6; - title_len = j; - } - for(i=1;i<(width-j)/2;i++) - tmp_buffer2[i].ch=api->chars->help_top; - if((api->mode&UIFC_MOUSE) && (!(mode&WIN_DYN))) { - set_vmem(&tmp_buffer2[1], api->chars->button_left, api->hclr|(api->bclr<<4), 0); - /* tmp_buffer2[4]='�'; */ - set_vmem(&tmp_buffer2[2], api->chars->close_char, api->lclr|(api->bclr<<4), 0); - set_vmem(&tmp_buffer2[3], api->chars->button_right, api->hclr|(api->bclr<<4), 0); - /* Buttons are ignored - leave it this way to not confuse stuff from help() */ - } - tmp_buffer2[i].ch = api->chars->help_titlebreak_left; - i+=2; - for(j=0,pc=title;j<title_len&&*pc;j++,pc++) { - tmp_buffer2[i].ch=*pc; - i++; - } - i++; - tmp_buffer2[i].ch=api->chars->help_titlebreak_right; - i++; - for(;i<((width-1));i++) - tmp_buffer2[i].ch=api->chars->help_top; - tmp_buffer2[i].ch=api->chars->help_top_right; - i++; - j=i; /* leave i alone */ - for(k=0;k<(height-2);k++) { /* the sides of the box */ - tmp_buffer2[j].ch=api->chars->help_left; - j++; - j+=((width-2)); - tmp_buffer2[j].ch=api->chars->help_right; - j++; - } - tmp_buffer2[j].ch = api->chars->help_bottom_left; - j++; - if(!(mode&WIN_DYN) && (width>31)) { - for(k=j;k<j+(((width-4)/2-13));k++) - tmp_buffer2[k].ch=api->chars->help_bottom; - tmp_buffer2[k].ch = api->chars->help_hitanykey_left; k+=2; - tmp_buffer2[k].ch='H'; k++; - tmp_buffer2[k].ch='i'; k++; - tmp_buffer2[k].ch='t'; k+=2; - tmp_buffer2[k].ch='a'; k++; - tmp_buffer2[k].ch='n'; k++; - tmp_buffer2[k].ch='y'; k+=2; - tmp_buffer2[k].ch='k'; k++; - tmp_buffer2[k].ch='e'; k++; - tmp_buffer2[k].ch='y'; k+=2; - tmp_buffer2[k].ch='t'; k++; - tmp_buffer2[k].ch='o'; k+=2; - tmp_buffer2[k].ch='c'; k++; - tmp_buffer2[k].ch='o'; k++; - tmp_buffer2[k].ch='n'; k++; - tmp_buffer2[k].ch='t'; k++; - tmp_buffer2[k].ch='i'; k++; - tmp_buffer2[k].ch='n'; k++; - tmp_buffer2[k].ch='u'; k++; - tmp_buffer2[k].ch='e'; k+=2; - tmp_buffer2[k].ch=api->chars->help_hitanykey_right; k++; - for(j=k;j<k+(((width-4)/2-12))+(width&1);j++) - tmp_buffer2[j].ch=api->chars->help_bottom; - } - else { - for(k=j;k<j+((width-2));k++) - tmp_buffer2[k].ch=api->chars->help_bottom; - j=k; - } - tmp_buffer2[j].ch=api->chars->help_bottom_right; - if(!(mode&WIN_DYN)) { - tmp_buffer2[j-1].ch=api->chars->button_right; - tmp_buffer2[j-2].ch=' '; - tmp_buffer2[j-3].ch=' '; - tmp_buffer2[j-4].ch=api->chars->button_left; -#define SCROLL_UP_BUTTON_X left + (width - 4) -#define SCROLL_UP_BUTTON_Y top + height -#define SCROLL_DN_BUTTON_X left + (width - 3) -#define SCROLL_DN_BUTTON_Y top + height - } - vmem_puttext(left,top+1,left+width-1,top+height,tmp_buffer2); - } - len=strlen(hbuf); - - lines=0; - k=0; - for(j=0;j<len;j++) { - if(mode&WIN_HLP && (hbuf[j]==2 || hbuf[j]=='~' || hbuf[j]==1 || hbuf[j]=='`')) - continue; - if(hbuf[j]==CR) - continue; - k++; - if((hbuf[j]==LF) || (k>=width-2-pad-pad && (hbuf[j+1]!='\n' && hbuf[j+1]!='\r'))) { - k=0; - lines++; - } - } - if(k) - lines++; - if(lines < height-2-pad-pad) - lines=height-2-pad-pad; - - if((textbuf=(struct vmem_cell *)malloc((width-2-pad-pad)*lines*sizeof(*textbuf)))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,(width-2-pad-pad)*lines*sizeof(*textbuf)); - _setcursortype(cursor); - return; - } - for(i=0; i < (width - 2 - pad - pad) * lines;i++) - set_vmem(&textbuf[i], ' ', (api->hclr|(api->bclr<<4)), 0); - for(j=i=0; j < len; j++, i++) { - if(hbuf[j]==LF) { - i++; - while(i%((width-2-pad-pad))) - i++; - i--; - } - else if(mode&WIN_HLP && (hbuf[j]==2 || hbuf[j]=='~')) { /* Ctrl-b toggles inverse */ - inverse=!inverse; - i--; - } - else if(mode&WIN_HLP && (hbuf[j]==1 || hbuf[j]=='`')) { /* Ctrl-a toggles high intensity */ - high=!high; - i--; - } - else if(hbuf[j]!=CR) { - set_vmem(&textbuf[i], hbuf[j], inverse ? (api->bclr|(api->cclr<<4)) : high ? (api->hclr|(api->bclr<<4)) : (api->lclr|(api->bclr<<4)), 0); - if(((i+1)%((width-2-pad-pad))==0 && (hbuf[j+1]==LF)) || (hbuf[j+1]==CR && hbuf[j+2]==LF)) - i--; - } - else - i--; - } - i=0; - p=textbuf; - struct vmem_cell * textend = textbuf + (lines-(height-2-pad-pad))*(width-2-pad-pad); - if(mode&WIN_DYN) { - vmem_puttext(left+1+pad,top+2+pad,left+width-2-pad,top+height-1-pad,p); - } - else { - while(i==0) { - if(p!=oldp) { - if(p > textend) - p=textend; - if(p<textbuf) - p=textbuf; - if(p!=oldp) { - vmem_puttext(left+1+pad,top+2+pad,left+width-2-pad,top+height-1-pad,p); - oldp=p; - } - gotoxy(SCROLL_UP_BUTTON_X, SCROLL_UP_BUTTON_Y); - textattr(api->lclr|(api->bclr<<4)); - putch(p > textbuf ? api->chars->up_arrow : ' '); - putch(p < textend ? api->chars->down_arrow : ' '); - } - if(kbwait()) { - j=inkey(); - if(j==CIO_KEY_MOUSE) { - /* Ignores return value to avoid hitting help/exit hotspots */ - if(uifc_getmouse(&mevnt)>=0) { - /* Clicked Scroll Up */ - if(mevnt.startx>=left+pad - && mevnt.startx<=left+pad+width-3 - && mevnt.starty>=top+pad+1 - && mevnt.starty<=top+pad+(height/2)-2 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p -= ((width-2-pad-pad)*(height-5)); - continue; - } - if(mevnt.startx == SCROLL_UP_BUTTON_X && mevnt.starty == SCROLL_UP_BUTTON_Y - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p -= ((width-2-pad-pad)); - continue; - } - /* Clicked Scroll Down */ - if(mevnt.startx>=left+pad - && mevnt.startx<=left+pad+width - && mevnt.starty<=top+pad+height-2 - && mevnt.starty>=top+pad+height-(height/2+1)-2 - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p += (width-2-pad-pad)*(height-5); - continue; - } - if(mevnt.startx == SCROLL_DN_BUTTON_X && mevnt.starty == SCROLL_DN_BUTTON_Y - && mevnt.event==CIOLIB_BUTTON_1_CLICK) { - p += ((width-2-pad-pad)); - continue; - } - /* Scroll up */ - if (mevnt.event == CIOLIB_BUTTON_4_PRESS) { - p = p-((width-2-pad-pad)); - continue; - } - /* Scroll down */ - if (mevnt.event == CIOLIB_BUTTON_5_PRESS) { - p += ((width-2-pad-pad)); - continue; - } - /* Non-click events (drag, move, multiclick, etc) */ - if(mevnt.event!=CIOLIB_BUTTON_CLICK(CIOLIB_BUTTON_NUMBER(mevnt.event))) - continue; - i=1; - } - continue; - } - switch(j) { - case CIO_KEY_HOME: /* home */ - p = textbuf; - break; - - case CIO_KEY_UP: /* up arrow */ - p = p-((width-2-pad-pad)); - break; - - case CIO_KEY_PPAGE: /* PgUp */ - p = p-((width-2-pad-pad)*(height-5)); - break; - - case CIO_KEY_NPAGE: /* PgDn */ - p += (width-2-pad-pad)*(height-5); - break; - - case CIO_KEY_END: /* end */ - p = textend; - break; - - case CIO_KEY_DOWN: /* dn arrow */ - p += ((width-2-pad-pad)); - break; - - case CIO_KEY_QUIT: - api->exit_flags |= UIFC_XF_QUIT; - // Fall-through - default: - i=1; - } - } - mswait(1); - } - - vmem_puttext(1,1,api->scrn_width,api->scrn_len,tmp_buffer); - } - free(textbuf); - if(is_redraw) /* Force redraw of menu also. */ - reset_dynamic(); - _setcursortype(cursor); -} - -/************************************************************/ -/* Help (F1) key function. Uses helpbuf as the help input. */ -/************************************************************/ -static void help(void) -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; /* This must be 16-bits */ - long l; - FILE *fp; - - api->exit_flags = 0; - if(api->helpbuf==NULL && api->helpixbfile[0]==0) - return; - - _setcursortype(_NOCURSOR); - - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help index: %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(fread(str,12,1,fp)!=1) - break; - str[12]=0; - if(fread(&line,2,1,fp)!=1) - break; - if(stricmp(str,p) || line!=helpline) { - if(fseek(fp,4,SEEK_CUR)==0) - break; - continue; - } - if(fread(&l,4,1,fp)!=1) - l=-1L; - break; - } - fclose(fp); - if(l==-1L) - SAFEPRINTF3(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help file: %s" - ,api->helpdatfile); - else { - if(fseek(fp,l,SEEK_SET)!=0) { - SAFEPRINTF4(hbuf,"ERROR: Cannot seek to help key (%s:%u) at %ld in: %s" - ,p,helpline,l,api->helpixbfile); - } - else { - if(fread(hbuf,1,HELPBUF_SIZE,fp)<1) { - SAFEPRINTF4(hbuf,"ERROR: Cannot read help key (%s:%u) at %ld in: %s" - ,p,helpline,l,api->helpixbfile); - } - } - fclose(fp); - } - } - } - showbuf(WIN_MID|WIN_HLP, 0, 0, 76, api->scrn_len, "Online Help", hbuf, NULL, NULL); - } - else { - showbuf(WIN_MID|WIN_HLP, 0, 0, 76, api->scrn_len, "Online Help", api->helpbuf, NULL, NULL); - } -} diff --git a/uifc/uifctest.c b/uifc/uifctest.c deleted file mode 100644 index 490ad39a784ba1951bb0765d57100d299f4a2953..0000000000000000000000000000000000000000 --- a/uifc/uifctest.c +++ /dev/null @@ -1,187 +0,0 @@ -/* uedit.c */ - -/* Synchronet for *nix user editor */ - -/* $Id: uifctest.c,v 1.9 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <signal.h> -#include <stdio.h> -/* #include "curs_fix.h" */ -#include "filepick.h" -#include "uifc.h" - -/********************/ -/* Global Variables */ -/********************/ -uifcapi_t uifc; /* User Interface (UIFC) Library API */ -char YesStr[]="Yes"; -char NoStr[]="No"; -char *ok[2]={"OK",""}; - -int main(int argc, char** argv) { - char** opt; - char** mopt; - int main_dflt=0; - int main_bar=0; - char revision[16]; - char str[256],ctrl_dir[41],*p; - char title[256]; - int i,j; - int done; - int last; - int edtuser=0; - char longtitle[1024]; - struct file_pick fper; - /******************/ - /* Ini file stuff */ - /******************/ - char ini_file[MAX_PATH+1]; - FILE* fp; - - sscanf("$Revision: 1.9 $", "%*s %s", revision); - - printf("\nSynchronet UIFC Test Suite Copyright " - "Rob Swindell\n"); - - memset(&uifc,0,sizeof(uifc)); - - uifc.esc_delay=500; - - for(i=1;i<argc;i++) { - if(argv[i][0]=='-') - switch(toupper(argv[i][1])) { - case 'C': - uifc.mode|=UIFC_COLOR; - break; - case 'L': - uifc.scrn_len=atoi(argv[i]+2); - break; - case 'E': - uifc.esc_delay=atoi(argv[i]+2); - break; - case 'I': - /* Set up ex-ascii codes */ - uifc.mode|=UIFC_IBM; - break; - default: - printf("\nusage: %s [ctrl_dir] [options]" - "\n\noptions:\n\n" - "-c = force color mode\n" - "-e# = set escape delay to #msec\n" - "-i = force IBM charset\n" - "-l# = set screen lines to #\n" - ,argv[0] - ); - exit(0); - } - if(atoi(argv[i])) - edtuser=atoi(argv[i]); - } - -#ifdef __unix__ - signal(SIGPIPE, SIG_IGN); -#endif - - uifc.size=sizeof(uifc); -#ifdef USE_CURSES - i=uifcinic(&uifc); /* curses */ -#else - i=uifcini32(&uifc); /* curses */ -#endif - if(i!=0) { - printf("uifc library init returned error %d\n",i); - exit(1); - } - - opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)); - for(i=0;i<(MAX_OPTS+1);i++) - opt[i]=(char *)malloc(MAX_OPLN); - - mopt=(char **)malloc(sizeof(char *)*MAX_OPTS); - for(i=0;i<MAX_OPTS;i++) - mopt[i]=(char *)malloc(MAX_OPLN); - - sprintf(title,"Synchronet Test Suite"); - if(uifc.scrn(title)) { - printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1); - return(1); - } - - strcpy(mopt[0],"Long Title"); - strcpy(mopt[1],"String Input"); - strcpy(mopt[2],"File picker"); - mopt[3][0]=0; - - uifc.helpbuf= "`Test Suite:`\n" - "\nToDo: Add Help"; - - while(1) { - j=uifc.list(WIN_L2R|WIN_ESC|WIN_ACT|WIN_DYN|WIN_ORG,0,5,70,&main_dflt,&main_bar - ,title,mopt); - - if(j <= -2) - continue; - - if(j==-1) { - uifc.bail(); - return(0); - } - - if(j==0) { - /* Long Title */ - strcpy(longtitle,"This is a long title..."); - for(p=strchr(longtitle,0);p<longtitle+sizeof(longtitle)-1;p++) - *p='.'; - *p=0; - done=0; - uifc.list(WIN_ORG|WIN_MID|WIN_ACT,0,0,0,&i,0,longtitle,ok); - } - if(j==1) { - /* String input */ - strcpy(longtitle,"This is a test if string input... enter/edit this field"); - uifc.input(WIN_MID|WIN_NOBRDR,0,0,"Input",longtitle,sizeof(longtitle),K_EDIT); - uifc.showbuf(WIN_MID, 0, 0, uifc.scrn_width-4, uifc.scrn_len-4, "Result:", longtitle, NULL, NULL); - } - if(j==2) { - /* File picker */ - if(filepick(&uifc, "Bob", &fper, NULL, NULL, UIFC_FP_ALLOWENTRY)!=-1) { - if(fper.files==1) { - sprintf(str,"File selected: %-.200s",fper.selected[0]); - uifc.msg(str); - } - filepick_free(&fper); - } - } - } -} diff --git a/uifc/uifcx.c b/uifc/uifcx.c deleted file mode 100644 index 766f67527ea7393ca640a913e25a1dbf1c1cb559..0000000000000000000000000000000000000000 --- a/uifc/uifcx.c +++ /dev/null @@ -1,524 +0,0 @@ -/* Standard I/O Implementation of UIFC (user interface) library */ - -/* $Id: uifcx.c,v 1.41 2020/08/16 20:37:08 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "genwrap.h" -#include "gen_defs.h" -#include "xpprintf.h" -#include "uifc.h" - -#include <sys/types.h> - -#ifdef __unix__ -/* #include <sys/time.h> why? */ - #include <unistd.h> -#endif - -static char *helpfile=0; -static uint helpline=0; -static uifcapi_t* api; - -/* Prototypes */ -static void help(void); - -/* API routines */ -static void uifcbail(void); -static int uscrn(const char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,const char *title, char **option); -static int uinput(int imode, int left, int top, const char *prompt, char *str - ,int len ,int kmode); -static int umsg(const char *str); -static int umsgf(char *str, ...); -static BOOL confirm(char *str, ...); -static BOOL deny(char *str, ...); -static void upop(const char *str); -static void sethelp(int line, char* file); - -/****************************************************************************/ -/****************************************************************************/ -static int uprintf(int x, int y, unsigned attr, char *fmat, ...) -{ - va_list argptr; - char str[MAX_COLS + 1]; - int i; - - va_start(argptr, fmat); - vsprintf(str, fmat, argptr); - va_end(argptr); - i = printf("%s", str); - return(i); -} - - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinix(uifcapi_t* uifcapi) -{ - static char* yesNoOpts[] = {"Yes", "No", NULL}; - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - if (api->yesNoOpts == NULL) - api->yesNoOpts = yesNoOpts; // Not currently used in this interface instance - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->msgf=umsgf; - api->confirm=confirm; - api->deny=deny; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=NULL; - api->timedisplay=NULL; - api->printf = uprintf; - - setvbuf(stdin,NULL,_IONBF,0); - setvbuf(stdout,NULL,_IONBF,0); - api->scrn_len=24; - api->initialized=TRUE; - - return(0); -} - -/****************************************************************************/ -/* Exit/uninitialize UIFC implementation. */ -/****************************************************************************/ -void uifcbail(void) -{ - api->initialized=FALSE; -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(const char *str) -{ - return(0); -} - -static int getstr(char* str, int maxlen) -{ - char ch; - int len=0; -#ifdef __unix__ - int istty; - - istty=isatty(fileno(stdin)); -#endif - while(1) { - if(fread(&ch,1,1,stdin)!=1) - break; -#ifdef __unix__ - if(!istty) { - printf("%c",ch); - fflush(stdout); - } -#endif - if(ch=='\r' || ch=='\n') /* enter */ - break; - if(ch=='\b' || ch==DEL) { /* backspace */ - if(len) len--; - continue; - } - if(len<maxlen) - str[len++]=ch; - } - str[len]=0; /* we need The Terminator */ - - return(len); -} - -/****************************************************************************/ -/* Local utility function. */ -/****************************************************************************/ -static int which(char* prompt, int max) -{ - char str[41]; - int i; - - while(1) { - printf("%s which (1-%d): ",prompt,max); - str[0]=0; - getstr(str,sizeof(str)-1); - i=atoi(str); - if(i>0 && i<=max) - return(i-1); - } -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , const char *title, char **option) -{ - char str[128]; - int i,opts; - int optnumlen; - int yesno=0; - int lines; - - for(opts=0;opts<MAX_OPTS;opts++) - if(option[opts]==NULL || option[opts][0]==0) - break; - - if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - - if((*cur)<0) - (*cur)=0; - - if(opts>999) - optnumlen=4; - else if(opts>99) - optnumlen=3; - else if(opts>9) - optnumlen=2; - else - optnumlen=1; - while(1) { - if(opts==2 && !stricmp(option[0],"Yes") && !stricmp(option[1],"No")) { - yesno=1; - printf("%s? ",title); - } else { - printf("\n[%s]\n",title); - lines=2; - for(i=0;i<opts;i++) { - printf("%*d: %s\n",optnumlen,i+1,option[i]); - lines++; - if(!(lines%api->scrn_len)) { - printf("More? "); - str[0]=0; - getstr(str,sizeof(str)-1); - if(toupper(*str)=='N') - break; - } - } - str[0]=0; - if(mode&WIN_COPY) - strcat(str,", Copy"); - if(mode&WIN_CUT) - strcat(str,", X-Cut"); - if(mode&WIN_PASTE) - strcat(str,", Paste"); - if(mode&WIN_INS) - strcat(str,", Add"); - if(mode&WIN_DEL) - strcat(str,", Delete"); - printf("\nWhich (Help%s or Quit): ",str); - } - str[0]=0; - getstr(str,sizeof(str)-1); - - truncsp(str); - i=atoi(str); - if(i>0 && i<=opts) { - *cur=--i; - return(*cur); - } - i=atoi(str+1); - switch(toupper(*str)) { - case 0: - case ESC: - case 'Q': - printf("Quit\n"); - return(-1); - case 'Y': - if(!yesno) - break; - printf("Yes\n"); - return(0); - case 'N': - if(!yesno) - break; - printf("No\n"); - return(1); - case 'H': - case '?': - printf("Help\n"); - help(); - break; - case 'A': /* Add/Insert */ - if(!(mode&WIN_INS)) - break; - if(!opts) - return(MSK_INS); - if(i>0 && i<=opts+1) - return((i-1)|MSK_INS); - return(which("Add before",opts+1)|MSK_INS); - case 'D': /* Delete */ - if(!(mode&WIN_DEL)) - break; - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_DEL); - if(opts==1) - return(MSK_DEL); - return(which("Delete",opts)|MSK_DEL); - case 'C': /* Copy */ - if(!(mode&WIN_COPY)) - break; - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_COPY); - if(opts==1) - return(MSK_COPY); - return(which("Copy",opts)|MSK_COPY); - case 'X': /* Cut */ - if(!(mode&WIN_CUT)) - break; - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_CUT); - if(opts==1) - return(MSK_CUT); - return(which("Cut",opts)|MSK_CUT); - case 'P': /* Paste */ - if(!(mode&WIN_PASTE)) - break; - if(!opts) - break; - if(i>0 && i<=opts+1) - return((i-1)|MSK_PASTE); - if(opts==1) - return(MSK_PASTE); - return(which("Insert pasted item before",opts+1)|MSK_PASTE); - } - } -} - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, const char *prompt, char *outstr, - int max, int kmode) -{ - char str[256]; - - while(1) { - printf("%s (maxlen=%u): ",prompt,max); - - getstr(str,max); - truncsp(str); - if(strcmp(str,"?")) - break; - help(); - } - if(strcmp(outstr,str)) - api->changes=1; - if(kmode&K_UPPER) /* convert to uppercase? */ - strupr(str); - strcpy(outstr,str); - return(strlen(outstr)); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to hit ENTER */ -/****************************************************************************/ -int umsg(const char *str) -{ - int ch; - printf("%s\nHit enter to continue:",str); - ch = getchar(); - return ch == '\r' || ch == '\n'; -} - -/* Same as above, using printf-style varargs */ -int umsgf(char* fmt, ...) -{ - int retval = -1; - va_list va; - char* buf = NULL; - - va_start(va, fmt); - vasprintf(&buf, fmt, va); - va_end(va); - if(buf != NULL) { - retval = umsg(buf); - free(buf); - } - return retval; -} - -BOOL confirm(char* fmt, ...) -{ - int ch; - va_list va; - - va_start(va, fmt); - vprintf(fmt, va); - va_end(va); - printf(" (Y/n)? "); - ch = getchar(); - return tolower(ch) != 'n' && ch != EOF; -} - -BOOL deny(char* fmt, ...) -{ - int ch; - va_list va; - - va_start(va, fmt); - vprintf(fmt, va); - va_end(va); - printf(" (N/y)? "); - ch = getchar(); - return tolower(ch) != 'y'; -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(const char *str) -{ - static int len; - - if(str==NULL) - printf("\r%*s\r", len, ""); - else - len = printf("\r%s\r", str) - 2; -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -static void uputs(char* ptr) -{ - while(*ptr) { - if(*ptr>2) - putchar(*ptr); - ptr++; - } - putchar('\n'); -} - -/****************************************************************************/ -/* Help function. */ -/****************************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; - long l; - FILE *fp; - - printf("\n"); - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help index: %.128s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(fread(str,12,1,fp)!=1) - break; - str[12]=0; - if(fread(&line,2,1,fp)!=1) - break; - if(stricmp(str,p) || line!=helpline) { - if(fseek(fp,4,SEEK_CUR)==0) - break; - continue; - } - if(fread(&l,4,1,fp)!=1) - l=-1L; - break; - } - fclose(fp); - if(l==-1L) - SAFEPRINTF3(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %.128s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - SAFEPRINTF(hbuf,"ERROR: Cannot open help file: %.128s" - ,api->helpdatfile); - else { - if(fseek(fp,l,SEEK_SET)!=0) { - SAFEPRINTF4(hbuf,"ERROR: Cannot seek to help key (%s:%u) at %ld in: %.128s" - ,p,helpline,l,api->helpixbfile); - } - else { - if(fread(hbuf,1,HELPBUF_SIZE,fp)<1) { - SAFEPRINTF4(hbuf,"ERROR: Cannot read help key (%s:%u) at %ld in: %.128s" - ,p,helpline,l,api->helpixbfile); - } - hbuf[HELPBUF_SIZE-1] = 0; - } - fclose(fp); - } - } - } - uputs(hbuf); - if(strlen(hbuf)>200) { - printf("Hit enter"); - getstr(str,sizeof(str)-1); - } - } - else { - uputs(api->helpbuf); - if(strlen(api->helpbuf)>200) { - printf("Hit enter"); - getstr(str,sizeof(str)-1); - } - } -} diff --git a/xpdev/CMakeLists.txt b/xpdev/CMakeLists.txt deleted file mode 100644 index cb753fd6786b203c976dc0ef1b1475c33961e8d1..0000000000000000000000000000000000000000 --- a/xpdev/CMakeLists.txt +++ /dev/null @@ -1,189 +0,0 @@ -project (XPDev C) - -cmake_minimum_required(VERSION 3.11) - -INCLUDE (CheckIncludeFiles) -INCLUDE (CheckFunctionExists) -find_package(Threads) -find_package(X11) -if(NOT WIN32) - find_package(PkgConfig) - pkg_check_modules(SDL2 sdl2) -endif() - -set(SOURCE - conwrap.c - dat_file.c - datewrap.c - dirwrap.c - filewrap.c - genwrap.c - ini_file.c - link_list.c - msg_queue.c - multisock.c - netwrap.c - semfile.c - semwrap.c - sockwrap.c - str_list.c - strwrap.c - threadwrap.c - unicode.c - xp_dl.c - xpbeep.c - xpdatetime.c - xpmap.c - xpprintf.c - xptime.c -) - -set(HEADER - conwrap.h - cp437defs.h - dat_file.h - datewrap.h - dirwrap.h - eventwrap.h - filewrap.h - gen_defs.h - genwrap.h - haproxy.h - ini_file.h - link_list.h - msg_queue.h - multisock.h - netwrap.h - petdefs.h - semfile.h - semwrap.h - sockwrap.h - str_list.h - strwrap.h - threadwrap.h - unicode_defs.h - unicode.h - wrapdll.h - xp_dl.h - xp_syslog.h - xpbeep.h - xpdatetime.h - xpendian.h - xpevent.h - xpmap.h - xpprintf.h - xpsem.h -) - -if(NOT WIN32) - list(APPEND SOURCE xpevent.c) - list(APPEND SOURCE xpsem.c) -endif() - -if(SDL2_INCLUDE_DIRS) - list(APPEND SOURCE sdlfuncs.c) - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - list(APPEND SOURCE SDLMain.m) - endif() - if(WIN32) - list(APPEND SOURCE SDL_win32_main.c) - endif() -endif() - -add_library(xpdev OBJECT ${SOURCE}) -target_include_directories(xpdev PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_include_directories(xpdev PUBLIC ${XPDevPlus_BINARY_DIR}) -target_link_libraries(xpdev ${CMAKE_DL_LIBS}) - -CHECK_INCLUDE_FILES(inttypes.h HAS_INTTYPES_H) -CHECK_INCLUDE_FILES(stdint.h HAS_STDINT_H) -set(LINK_LIST_THREADSAFE TRUE PARENT_SCOPE) - -CHECK_INCLUDE_FILES(sys/soundcard.h HAS_SYS_SOUNDCARD_H) -CHECK_INCLUDE_FILES(soundcard.h HAS_SOUNDCARD_H) -CHECK_INCLUDE_FILES(linux/inttypes.h HAS_LINUX_SOUNDCARD_H) -if(HAS_SYS_SOUNDCARD_H) - target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=1) -elseif(HAS_SOUNDCARD_H) - target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=2) -elseif(HAS_LINUX_SOUNDCARD_H) - target_compile_definitions(xpdev PRIVATE SOUNDCARD_H_IN=3) -endif() - -CHECK_INCLUDE_FILES(dev/speaker/speaker.h HAS_DEV_SPEAKER_SPEAKER_H) -if(HAS_DEV_SPEAKER_SPEAKER_H) - target_compile_definitions(xpdev PRIVATE HAS_DEV_SPEAKER_SPEAKER_H) -endif() -CHECK_INCLUDE_FILES(dev/machine/speaker.h HAS_DEV_MACHINE_SPEAKER_H) -if(HAS_DEV_MACHINE_SPEAKER_H) - target_compile_definitions(xpdev PRIVATE HAS_DEV_MACHINE_SPEAKER_H) -endif() -CHECK_INCLUDE_FILES(dev/speaker/spkr.h HAS_DEV_MACHINE_SPKR_H) -if(HAS_DEV_MACHINE_SPKR_H) - target_compile_definitions(xpdev PRIVATE HAS_DEV_MACHINE_SPKR_H) -endif() - -if(WIN32) - target_compile_definitions(xpdev PUBLIC _WIN32 _WIN32_WINNT=0x0501 WINVER=0x0501 MSVCRT_VERSION=0x0501 _WIN32_IE=0x0500) - target_link_libraries(xpdev iphlpapi ws2_32 winmm netapi32) -elseif(CMAKE_SYSTEM_NAME STREQUAL "Haiku") - target_link_libraries(xpdev network m) -elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD") - target_link_libraries(xpdev ossaudio m) -elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") - target_link_libraries(xpdev ossaudio m) -elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS") - target_link_libraries(xpdev socket m) -else() - target_link_libraries(xpdev m) -endif() -target_link_libraries(xpdev ${CMAKE_THREAD_LIBS_INIT}) - -if(EXISTS /dev/urandom) - target_compile_definitions(xpdev PRIVATE HAS_DEV_URANDOM URANDOM_DEV="/dev/urandom") -endif() -if(EXISTS /dev/random) - target_compile_definitions(xpdev PRIVATE HAS_DEV_RANDOM RANDOM_DEV="/dev/random") -endif() - -CHECK_FUNCTION_EXISTS(random HAS_RANDOM_FUNC) -if(HAS_RANDOM_FUNC) - target_compile_definitions(xpdev PRIVATE HAS_RANDOM_FUNC) -endif() - -CHECK_FUNCTION_EXISTS(srandomdev HAS_SRANDOMDEV_FUNC) -if(HAS_SRANDOMDEV_FUNC) - target_compile_definitions(xpdev PRIVATE HAS_SRANDOMDEV_FUNC) -endif() - -if(SDL2_INCLUDE_DIRS) - target_include_directories(xpdev PUBLIC ${SDL2_INCLUDE_DIRS}) - set(WITH_SDL_AUDIO TRUE PARENT_SCOPE) -endif() - -if(X11_FOUND) - target_include_directories(xpdev PRIVATE ${X11_INCLUDE_DIR}) -endif() - -if (PKG_CONFIG_FOUND) - pkg_check_modules(PORTAUDIO2 portaudio-2.0) - if(PORTAUDIO2_FOUND) - set(PORTAUDIO_FOUND TRUE) - set(PORTAUDIO_LIBS PORTAUDIO2_LIBS) - set(PORTAUDIO_CFLAGS PORTAUDIO2_CFLAGS) - else() - find_path(PORTAUDIO_INCLUDEDIR portaudio.h) - if(PORTAUDIO_INCLUDEDIR) - set(PORTAUDIO_FOUND TRUE) - endif() - endif() -endif() - -if(PORTAUDIO_FOUND) - target_include_directories(xpdev PRIVATE ${PORTAUDIO_INCLUDEDIR}) -endif() - -CHECK_INCLUDE_FILES(alsa/asoundlib.h USE_ALSA_SOUND) -if(USE_ALSA_SOUND) - target_compile_definitions(xpdev PRIVATE USE_ALSA_SOUND) -endif() diff --git a/xpdev/Makefile b/xpdev/Makefile deleted file mode 100644 index d6aafc602aec1c2c09951f54fbb3d576dfed0c2a..0000000000000000000000000000000000000000 --- a/xpdev/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# To build the .dll files, use "make [OPTIONS] DLLIBS=1 dl" - -SRC_ROOT = .. -!include $(SRC_ROOT)/build/Common.bmake - -CFLAGS = $(CFLAGS) $(XPDEV_CFLAGS) -MT_CFLAGS = $(MT_CFLAGS) $(XPDEV-MT_CFLAGS) - -#The following is necessary only when DLL-exporting wrapper functions -!ifdef DLLIBS -CFLAGS = $(CFLAGS) -DWRAPPER_EXPORTS=1 -!endif - -MT_CFLAGS = $(MT_CFLAGS) -DLINK_LIST_THREADSAFE - -!ifdef USE_SDL_AUDIO -MTOBJS = $(MTOBJS) $(MTOBJODIR)$(DIRSEP)SDL_win32_main$(OFILE) -MTOBJS = $(MTOBJS) $(MTOBJODIR)$(DIRSEP)sdlfuncs$(OFILE) -OBJS = $(OBJS) $(OBJODIR)$(DIRSEP)SDL_win32_main$(OFILE) -OBJS = $(OBJS) $(OBJODIR)$(DIRSEP)sdlfuncs$(OFILE) -!endif - -$(WRAPTEST): $(XPDEV-MT_LIB_BUILD) $(TESTOBJS) $(EXEODIR) - @echo Linking $< - $(QUIET)$(CC) $(LDFLAGS) $(MT_LDFLAGS) $(XPDEV-MT_CFLAGS) $(XPDEV-MT_LDFLAGS) -e$@ $(TESTOBJS) $(XPDEV-MT_LIBS) - -$(XPTIME): $(XPDEV_LIB_BUILD) $(OBJODIR)$(DIRSEP)xptime$(OFILE) - @echo Linking $< - $(QUIET)$(CC) $(LDFLAGS) $(XPDEV-CFLAGS) $(XPDEV-LDFLAGS) -e$@ $** $(XPDEV-LIBS) - -$(XPDEV_LIB_BUILD): $(OBJS) - @echo Creating $< ... - -$(QUIET)$(DELETE) $@ - &$(QUIET)tlib $@ +$** - -$(XPDEV_SHLIB_BUILD): $(OBJS) - @echo Linking $@ - $(QUIET)$(MKSHLIB) $(MT_LDFLAGS) -lGi -e$@ $(LDFLAGS) $(SHLIBOPTS) @&&| - $** - cw32.lib -| - -$(XPDEV-MT_LIB_BUILD): $(MTOBJS) - @echo Creating $< ... - -$(QUIET)$(DELETE) $@ - &$(QUIET)tlib $@ +$** - -$(XPDEV-MT_SHLIB_BUILD): $(MTOBJS) - @echo Linking $@ - $(QUIET)$(MKSHLIB) $(MT_LDFLAGS) -lGi -e$@ $(LDFLAGS) $(SHLIBOPTS) @&&| - $** - cw32mt.lib -| diff --git a/xpdev/SDLMain.h b/xpdev/SDLMain.h deleted file mode 100644 index 4683df57a5e61fc41b189e67245f4a0a32d7552d..0000000000000000000000000000000000000000 --- a/xpdev/SDLMain.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#import <Cocoa/Cocoa.h> - -@interface SDLMain : NSObject -@end diff --git a/xpdev/SDLMain.m b/xpdev/SDLMain.m deleted file mode 100644 index f9c6394b012da9a7758380695bca74321ce92d06..0000000000000000000000000000000000000000 --- a/xpdev/SDLMain.m +++ /dev/null @@ -1,387 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser <dwaliss1@purdue.edu> - Non-NIB-Code & other changes: Max Horn <max@quendi.de> - - Feel free to customize this file to suit your needs -*/ - -#include "SDL.h" -#include "SDLMain.h" -#include <sys/param.h> /* for MAXPATHLEN */ -#include <unistd.h> - -/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, - but the method still is there and works. To avoid warnings, we declare - it ourselves here. */ -@interface NSApplication(SDL_Missing_Methods) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -/* Use this flag to determine whether we use SDLMain.nib or not */ -#define SDL_USE_NIB_FILE 0 - -/* Use this flag to determine whether we use CPS (docking) or not */ -#define SDL_USE_CPS 1 -#ifdef SDL_USE_CPS -/* Portions of CPS.h */ -typedef struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -} CPSProcessSerNum; - -extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); - -#endif /* SDL_USE_CPS */ - -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - -static NSString *getApplicationName(void) -{ - const NSDictionary *dict; - NSString *appName = 0; - - /* Determine the application name */ - dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); - if (dict) - appName = [dict objectForKey: @"CFBundleName"]; - - if (![appName length]) - appName = [[NSProcessInfo processInfo] processName]; - - return appName; -} - -#if SDL_USE_NIB_FILE -/* A helper category for NSString */ -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@end -#endif - -@interface NSApplication (SDLApplication) -@end - -@implementation NSApplication (SDLApplication) -/* Invoked from the Quit menu item */ -- (void)terminate:(id)sender -{ - /* Post a SDL_QUIT event */ - SDL_Event event; - event.type = SDL_QUIT; - SDL_PushEvent(&event); -} -@end - -/* The main class of the application, the application's delegate */ -@implementation SDLMain - -/* Set the working directory to the .app's parent directory */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir -{ - if (shouldChdir) - { - char parentdir[MAXPATHLEN]; - CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); - if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { - chdir(parentdir); /* chdir to the binary app's parent */ - } - CFRelease(url); - CFRelease(url2); - } -} - -#if SDL_USE_NIB_FILE - -/* Fix menu to contain the real app name instead of "SDL App" */ -- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName -{ - NSRange aRange; - NSEnumerator *enumerator; - NSMenuItem *menuItem; - - aRange = [[aMenu title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; - - enumerator = [[aMenu itemArray] objectEnumerator]; - while ((menuItem = [enumerator nextObject])) - { - aRange = [[menuItem title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; - if ([menuItem hasSubmenu]) - [self fixMenu:[menuItem submenu] withAppName:appName]; - } -} - -#else - -static void setApplicationMenu(void) -{ - /* warning: this code is very odd */ - NSMenu *appleMenu; - NSMenuItem *menuItem; - NSString *title; - NSString *appName; - - appName = getApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@""]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@""]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@""]; - - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - - /* Finally give up our references to the objects */ - [appleMenu release]; - [menuItem release]; -} - -/* Create a window menu */ -static void setupWindowMenu(void) -{ - NSMenu *windowMenu; - NSMenuItem *windowMenuItem; - NSMenuItem *menuItem; - - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* "Minimize" item */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@""]; - [windowMenu addItem:menuItem]; - [menuItem release]; - - /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [windowMenuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:windowMenuItem]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - - /* Finally give up our references to the objects */ - [windowMenu release]; - [windowMenuItem release]; -} - -/* Replacement for NSApplicationMain */ -static void CustomApplicationMain (int argc, char **argv) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; - - /* If there's no Window Server (ie: remote headless), go in dry. */ - if (_CGSDefaultConnection() == NULL) { - XPDEV_main(argc, argv, environ); - return; - } - - /* Ensure the application object is initialised */ - [NSApplication sharedApplication]; - -#ifdef SDL_USE_CPS - { - CPSProcessSerNum PSN; - /* Tell the dock about us */ - if (!CPSGetCurrentProcess(&PSN)) - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) - if (!CPSSetFrontProcess(&PSN)) - [NSApplication sharedApplication]; - } -#endif /* SDL_USE_CPS */ - - /* Set up the menubar */ - [NSApp setMainMenu:[[NSMenu alloc] init]]; - setApplicationMenu(); - setupWindowMenu(); - - /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; - - /* Start the main event loop */ - [NSApp run]; - - [sdlMain release]; - [pool release]; -} - -#endif - - -/* - * Catch document open requests...this lets us notice files when the app - * was launched by double-clicking a document, or when a document was - * dragged/dropped on the app's icon. You need to have a - * CFBundleDocumentsType section in your Info.plist to get this message, - * apparently. - * - * Files are added to gArgv, so to the app, they'll look like command line - * arguments. Previously, apps launched from the finder had nothing but - * an argv[0]. - * - * This message may be received multiple times to open several docs on launch. - * - * This message is ignored once the app's mainline has been called. - */ -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - const char *temparg; - size_t arglen; - char *arg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; - return TRUE; -} - -extern char **environ; -/* Called when the internal event loop has just started running */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - - /* Set the working directory to the .app's parent directory */ - [self setupWorkingDirectory:gFinderLaunch]; - -#if SDL_USE_NIB_FILE - /* Set the main menu to contain the real app name instead of "SDL App" */ - [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; -#endif - - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main_env (gArgc, gArgv, environ); - - /* We're done, thank you for playing */ - exit(status); -} -@end - - -@implementation NSString (ReplaceSubString) - -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString -{ - unsigned int bufferSize; - unsigned int selfLen = [self length]; - unsigned int aStringLen = [aString length]; - unichar *buffer; - NSRange localRange; - NSString *result; - - bufferSize = selfLen + aStringLen - aRange.length; - buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - - /* Get first part into buffer */ - localRange.location = 0; - localRange.length = aRange.location; - [self getCharacters:buffer range:localRange]; - - /* Get middle part into buffer */ - localRange.location = 0; - localRange.length = aStringLen; - [aString getCharacters:(buffer+aRange.location) range:localRange]; - - /* Get last part into buffer */ - localRange.location = aRange.location + aRange.length; - localRange.length = selfLen - localRange.location; - [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - - /* Build output string */ - result = [NSString stringWithCharacters:buffer length:bufferSize]; - - NSDeallocateMemoryPages(buffer, bufferSize); - - return result; -} - -@end - - - -#ifdef main -# undef main -#endif - - -/* Main entry point to executable - should *not* be SDL_main! */ -int main (int argc, char **argv) -{ - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - -#if SDL_USE_NIB_FILE - NSApplicationMain (argc, argv); -#else - CustomApplicationMain (argc, argv); -#endif - return 0; -} - diff --git a/xpdev/SDL_win32_main.c b/xpdev/SDL_win32_main.c deleted file mode 100644 index ef9b3608707e5db3f554fc59293c59a77aa2c606..0000000000000000000000000000000000000000 --- a/xpdev/SDL_win32_main.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98 - - The WinMain function -- calls your program's main() function -*/ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <stdlib.h> - -#include <windows.h> -#include <malloc.h> /* For _alloca() */ - -#define DIR_SEPERATOR TEXT("/") -#include <direct.h> - -/* 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); -} - -extern int main(int argc, char **argv); - -/* This is where execution begins [console apps] */ -static int console_main(int argc, char *argv[], char **env) -{ - int n; - char *bufp, *appname; - - /* Get the class name from argv[0] */ - appname = argv[0]; - if ( (bufp=strrchr(argv[0], '\\')) != NULL ) { - appname = bufp+1; - } else - if ( (bufp=strrchr(argv[0], '/')) != NULL ) { - appname = bufp+1; - } - - if ( (bufp=strrchr(appname, '.')) == NULL ) - n = strlen(appname); - else - n = (bufp-appname); - - bufp = (char *)alloca(n+1); - if ( bufp == NULL ) { - return 1; - } - strncpy(bufp, appname, n); - bufp[n] = '\0'; - appname = bufp; - - /* Run the application main() code */ - n=main(argc, argv); - - /* Exit cleanly, calling atexit() functions */ - exit(n); - - /* Hush little compiler, don't you cry... */ - return(n); -} - -/* This is where execution begins [windowed apps] */ -int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) -{ - HINSTANCE handle; - char **argv; - int argc; - char *cmdline; - char *bufp; - - /* 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); - } - - /* Grab the command line (use alloca() on Windows) */ - bufp = GetCommandLine(); - cmdline = (char *)alloca(strlen(bufp)+1); - if ( cmdline == NULL ) { - return 1; - } - strcpy(cmdline, bufp); - - /* Parse it into argv and argc */ - argc = ParseCommandLine(cmdline, NULL); - argv = (char **)alloca((argc+1)*(sizeof *argv)); - if ( argv == NULL ) { - return 1; - } - ParseCommandLine(cmdline, argv); - - /* Run the main program (after a little SDL initialization) */ - return(console_main(argc, argv, _environ)); -} diff --git a/xpdev/conwrap.c b/xpdev/conwrap.c deleted file mode 100644 index 01d85f94a64061787dc02ffb0f30bc2ca92772c9..0000000000000000000000000000000000000000 --- a/xpdev/conwrap.c +++ /dev/null @@ -1,161 +0,0 @@ -/* conwrap.c */ - -/* DOS's kbhit and getch functions for Unix - Casey Martin 2000 */ - -/* $Id: conwrap.c,v 1.15 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(__unix__) - -#include <stdlib.h> -#include <string.h> /* memcpy */ -#include <unistd.h> -#include <termios.h> - -#include <sys/time.h> -#include <sys/types.h> -#include <signal.h> - -#include "conwrap.h" /* Verify prototypes */ - -static struct termios current; /* our current term settings */ -static struct termios original; /* old termios settings */ -static int beensetup = 0; /* has _termios_setup() been called? */ -static int istty = 0; /* is stdin a tty? */ - -/* Resets the termios to its previous state */ -void _termios_reset(void) -{ - tcsetattr(STDIN_FILENO, TCSANOW, &original); -} - -/************************************************ - This pair of functions handles Ctrl-Z presses -************************************************/ -#if defined(__BORLANDC__) - #pragma argsused -#endif -void _sighandler_stop(int sig) -{ - /* clean up the terminal */ - _termios_reset(); - - /* ... and stop */ - kill(getpid(), SIGSTOP); -} -#if defined(__BORLANDC__) - #pragma argsused -#endif -void _sighandler_cont(int sig) -{ - /* restore terminal */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); -} - - -/* Prepares termios for non-blocking action */ -void _termios_setup(void) -{ - beensetup = 1; - - tcgetattr(STDIN_FILENO, &original); - - memcpy(¤t, &original, sizeof(struct termios)); - current.c_cc[VMIN] = 1; /* read() will return with one char */ - current.c_cc[VTIME] = 0; /* read() blocks forever */ - current.c_lflag &= ~ICANON; /* character mode */ - current.c_lflag &= ~ECHO; /* turn off echoing */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); - - /* Let's install an exit function, also. This way, we can reset - * the termios silently - */ - atexit(_termios_reset); - - /* install the Ctrl-Z handler */ - signal(SIGTSTP, _sighandler_stop); - signal(SIGCONT, _sighandler_cont); -} - -void _echo_on(void) -{ - tcgetattr(STDIN_FILENO, ¤t); - current.c_lflag |= ECHO; /* turn on echoing */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); -} - -void _echo_off(void) -{ - tcgetattr(STDIN_FILENO, ¤t); - current.c_lflag &= ~ECHO; /* turn off echoing */ - tcsetattr(STDIN_FILENO, TCSANOW, ¤t); -} - -int kbhit(void) -{ - fd_set inp; - struct timeval timeout = {0, 0}; - - if(!istty) { - istty = isatty(STDIN_FILENO); - if(!istty) - return 0; - } - - if(!beensetup) - _termios_setup(); - - /* set up select() args */ - FD_ZERO(&inp); - FD_SET(STDIN_FILENO, &inp); - - if(select(STDIN_FILENO+1, &inp, NULL, NULL, &timeout)<1) - return 0; - return 1; -} - -int getch(void) -{ - char c; - - if(!beensetup) - _termios_setup(); - - /* get a char out of stdin */ - if(read(STDIN_FILENO, &c, 1)==-1) - return 0; - - return c; -} - -#endif /* __unix__ */ diff --git a/xpdev/conwrap.h b/xpdev/conwrap.h deleted file mode 100644 index e79c18f5d46a7fa87bae53c6439a532806dabe2b..0000000000000000000000000000000000000000 --- a/xpdev/conwrap.h +++ /dev/null @@ -1,55 +0,0 @@ -/* conwrap.h */ - -/* Cross-platform local console I/O wrapppers */ - -/* $Id: conwrap.h,v 1.6 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _CONWRAP_H -#define _CONWRAP_H - -#if defined(__unix__) - - void _termios_reset(void); - void _echo_on(void); - void _echo_off(void); - int kbhit(void); - int getch(void); - -#else /* DOS-Based */ - - #include <conio.h> - -#endif - -#endif /* _CONWRAP_H */ diff --git a/xpdev/cp437defs.h b/xpdev/cp437defs.h deleted file mode 100644 index 6524710a2862c0b2c9f93f4149137c4820da7093..0000000000000000000000000000000000000000 --- a/xpdev/cp437defs.h +++ /dev/null @@ -1,178 +0,0 @@ -/* Synchronet IBM Code Page 437 (CP437) definitions */ - -/* $Id: cp437defs.h,v 1.5 2019/08/30 10:47:41 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef CP437DEFS_H_ -#define CP437DEFS_H_ - -enum cp437_char { - CP437_WHITE_SMILING_FACE = '\x01', - CP437_BLACK_SMILING_FACE = '\x02', - CP437_BLACK_HEART_SUIT = '\x03', - CP437_BLACK_DIAMOND_SUIT = '\x04', - CP437_BLACK_CLUB_SUIT = '\x05', - CP437_BLACK_SPADE_SUIT = '\x06', - CP437_BULLET = '\x07', - CP437_INVERSE_BULLET = '\x08', - CP437_WHITE_CIRCLE = '\x09', - CP437_INVERSE_WHITE_CIRCLE = '\x0A', - CP437_MALE_SIGN = '\x0B', - CP437_FEMALE_SIGN = '\x0C', - CP437_EIGHTH_NOTE = '\x0D', - CP437_BEAMED_EIGHTH_NOTES = '\x0E', - CP437_WHITE_SUN_WITH_RAYS = '\x0F', - CP437_BLACK_RIGHT_POINTING_POINTER = '\x10', - CP437_BLACK_LEFT_POINTING_POINTER = '\x11', - CP437_UP_DOWN_ARROW = '\x12', - CP437_DOUBLE_EXCLAMATION_MARK = '\x13', - CP437_PILCROW_SIGN = '\x14', // Paragraph mark - CP437_SECTION_SIGN = '\x15', - CP437_BLACK_RECTANGLE = '\x16', - CP437_UP_DOWN_ARROW_WITH_BASE = '\x17', - CP437_UPWARDS_ARROW = '\x18', - CP437_DOWNWARDS_ARROW = '\x19', - CP437_RIGHTWARDS_ARROW = '\x1A', - CP437_LEFTWARDS_ARROW = '\x1B', - CP437_RIGHT_ANGLE = '\x1C', - CP437_LEFT_RIGHT_ARROW = '\x1D', - CP437_BLACK_UP_POINTING_TRIANGLE = '\x1E', - CP437_BLACK_DOWN_POINTING_TRIANGLE = '\x1F', - - // 0x20 - 0x7E are ASCII characters - - CP437_HOUSE = '\x7F', - CP437_LATIN_CAPTIAL_LETTER_C_WITH_CEDILLA = '\x80', - CP437_LATIN_SMALL_LETTER_U_WITH_DIAERESIS = '\x81', - CP437_LATIN_SMALL_LETTER_E_WITH_ACUTE = '\x82', - CP437_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX = '\x83', - CP437_LATIN_SMALL_LETTER_A_WITH_DIAERESIS = '\x84', - CP437_LATIN_SMALL_LETTER_A_WITH_GRAVE = '\x85', - CP437_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE = '\x86', - CP437_LATIN_SMALL_LETTER_C_WITH_CEDILLA = '\x87', - CP437_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX = '\x88', - CP437_LATIN_SMALL_LETTER_E_WITH_DIAERESIS = '\x89', - CP437_LATIN_SMALL_LETTER_E_WITH_GRAVE = '\x8a', - CP437_LATIN_SMALL_LETTER_I_WITH_DIAERESIS = '\x8b', - CP437_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX = '\x8c', - CP437_LATIN_SMALL_LETTER_I_WITH_GRAVE = '\x8d', - CP437_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS = '\x8e', - CP437_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE = '\x8f', - CP437_LATIN_CAPITAL_LETTER_E_WITH_ACUTE = '\x90', - CP437_LATIN_SMALL_LETTER_AE = '\x91', - CP437_LATIN_CAPITAL_LETTER_AE = '\x92', - CP437_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX = '\x93', - CP437_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = '\x94', - CP437_LATIN_SMALL_LETTER_O_WITH_GRAVE = '\x95', - CP437_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX = '\x96', - CP437_LATIN_SMALL_LETTER_U_WITH_GRAVE = '\x97', - CP437_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = '\x98', - CP437_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = '\x99', - CP437_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS = '\x9A', - CP437_CENT_SIGN = '\x9B', - CP437_POUND_SIGN = '\x9C', - CP437_YEN_SIGN = '\x9E', - CP437_PESETA_SIGN = '\x9E', - CP437_LATIN_SMALL_LETTER_F_WITH_HOOK = '\x9F', - CP437_LATIN_SMALL_LETTER_A_WITH_ACUTE = '\xA0', - CP437_LATIN_SMALL_LETTER_I_WITH_ACUTE = '\xA1', - CP437_LATIN_SMALL_LETTER_O_WITH_ACUTE = '\xA2', - CP437_LATIN_SMALL_LETTER_U_WITH_ACUTE = '\xA3', - CP437_LATIN_SMALL_LETTER_N_WITH_TILDE = '\xA4', - CP437_LATIN_CAPITAL_LETTER_N_WITH_TILDE = '\xA5', - CP437_FEMININE_ORDINAL_INDICATOR = '\xA6', - CP437_MASCULINE_ORDINAL_INDICATOR = '\xA7', - CP437_INVERTED_QUESTION_MARK = '\xA8', - CP437_REVERSED_NOT_SIGN = '\xA9', - CP437_NOT_SIGN = '\xAA', - CP437_VULGAR_FRACTION_ONE_HALF = '\xAB', - CP437_VULGAR_FRACTION_ONE_QUARTER = '\xAC', - CP437_INVERTED_EXCLAMATION_MARK = '\xAD', - CP437_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = '\xAE', - CP437_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = '\xAF', - CP437_LIGHT_SHADE = '\xB0', - CP437_MEDIUM_SHADE = '\xB1', - CP437_DARK_SHADE = '\xB2', - CP437_BOX_DRAWINGS_LIGHT_VERTICAL = '\xB3', - CP437_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT = '\xB4', - CP437_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE = '\xB5', - CP437_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE = '\xB6', - CP437_BOX_DRAWINGS_DOUBLE_VERTICAL = '\xBA', - CP437_BOX_DRAWINGS_VERTICAL_AND_HORIZONTAL = '\xC5', - // TODO... - CP437_FULL_BLOCK = '\xDB', - CP437_LOWER_HALF_BLOCK = '\xDC', - CP437_LEFT_HALF_BLOCK = '\xDD', - CP437_RIGHT_HALF_BLOCK = '\xDE', - CP437_UPPER_HALF_BLOCK = '\xDF', - // TODO... - CP437_GREEK_SMALL_LETTER_ALPHA = '\xE0', - CP437_GREEK_SMALL_LETTER_BETA = '\xE1', - CP437_LATIN_SMALL_LETTER_SHARP_S = '\xE1', // Duplicate - CP437_GREEK_CAPITAL_LETTER_GAMMA = '\xE2', - CP437_GREEK_SMALL_LETTER_PI = '\xE3', - CP437_GREEK_CAPITAL_LETTER_SIGMA = '\xE4', - CP437_GREEK_SMALL_LETTER_SIGMA = '\xE5', - CP437_GREEK_SMALL_LETTER_MU = '\xE6', - CP437_MICRO_SIGN = '\xE6', // Duplicate - CP437_GREEK_SMALL_LETTER_TAU = '\xE7', - CP437_GREEK_CAPITAL_LETTER_PHI = '\xE8', - CP437_GREEK_SMALL_LETTER_THETA = '\xE9', - CP437_GREEK_CAPITAL_LETTER_OMEGA = '\xEA', - CP437_GREEK_SMALL_LETTER_DELTA = '\xEB', - CP437_INFINITY = '\xEC', - CP437_GREEK_SMALL_LETTER_PHI = '\xED', - CP437_GREEK_SMALL_LETTER_EPSILION = '\xEE', - CP437_INTERSECTION = '\xEF', - CP437_IDENTICAL_TO = '\xF0', - CP437_TRIPLE_BAR = '\xF0', // Duplicate - CP437_PLUS_MINUS_SIGN = '\xF1', - CP437_GREATER_THAN_OR_EQUAL_TO = '\xF2', - CP437_LESS_THAN_OR_EQUAL_TO = '\xF3', - CP437_TOP_HALF_INTEGRAL = '\xF4', - CP437_BOTTOM_HALF_INTEGRAL = '\xF5', - CP437_DIVISION_SIGN = '\xF6', - CP437_ALMOST_EQUAL_TO = '\xF7', - CP437_DEGREE_SIGN = '\xF8', - CP437_BULLET_OPERATOR = '\xF9', - CP437_MIDDLE_DOT = '\xFA', - CP437_SQUARE_ROOT = '\xFB', - CP437_CHECK_MARK = '\xFB', // Duplicate - CP437_SUPERSCRIPT_LATIN_SMALL_LETTER_N = '\xFC', - CP437_SUPERSCRIPT_TWO = '\xFD', - CP437_BLACK_SQUARE = '\xFE', - CP437_HALFWIDTH_BLACK_SQUARE = '\xFE', // Duplicate - CP437_NO_BREAK_SPACE = '\xFF' -}; - -#endif // Don't add anything after this line diff --git a/xpdev/dat_file.c b/xpdev/dat_file.c deleted file mode 100644 index 7b8e5b6cd080131090417b836a8e384cd2e50b0a..0000000000000000000000000000000000000000 --- a/xpdev/dat_file.c +++ /dev/null @@ -1,290 +0,0 @@ -/* dat_file.c */ - -/* Functions to deal with comma (CSV) and tab-delimited files and lists */ - -/* $Id: dat_file.c,v 1.8 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "dat_file.h" -#include "genwrap.h" /* lastchar */ -#include "filewrap.h" /* chsize */ -#include <stdlib.h> /* malloc */ -#include <string.h> /* strdup */ - -/***********************************/ -/* CSV (Comma Separated Value) API */ -/***********************************/ - -static char* csvEncode(char* field) -{ - char* dst; - char* src; - char* buf; - char* comma; - char* quote; - char first; - char last; - char* nl; - BOOL enclose; - - if((buf=malloc(strlen(field)*2))==NULL) - return(NULL); - - nl=strchr(field,'\n'); - comma=strchr(field,','); - quote=strchr(field,'"'); - first=field[0]; - last=*lastchar(field); - - enclose = (quote || comma || nl || first==' ' || last==' '); - - dst=buf; - if(enclose) - *(dst++)='"'; - src=field; - while(*src) { - if(*src=='"') - *(dst++)='"'; /* escape quotes */ - *(dst++)=*src++; - } - if(enclose) - *(dst++)='"'; - - *dst=0; - - return(buf); -} - -char* csvLineCreator(const str_list_t columns) -{ - char* str=NULL; - char* p; - char* val; - size_t i,len; - - if(columns==NULL) - return(NULL); - - for(i=0;columns[i]!=NULL;i++) { - len=strlen(columns[i])*2; - if(str) - len+=strlen(str); - if((p=realloc(str,len))==NULL) - break; - str=p; - if(i) strcat(str,","); - else *str=0; - if((val=csvEncode(columns[i]))==NULL) - break; - strcat(str,val); - free(val); - } - - return(str); -} - -str_list_t csvLineParser(const char* line) -{ - char* p; - char* buf; - char* tmp; - size_t count=0; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - - if((buf=strdup(line))==NULL) { - strListFree(&list); - return(NULL); - } - - truncsp(buf); - - for(p=strtok_r(buf,",",&tmp);p;p=strtok_r(NULL,",",&tmp)) - strListAppend(&list,p,count++); - - free(buf); - - return(list); -} - -/*********************/ -/* Tab-Delimited API */ -/*********************/ - -char* tabLineCreator(const str_list_t columns) -{ - char* str=NULL; - char* p; - size_t i,len; - - if(columns==NULL) - return(NULL); - - for(i=0;columns[i]!=NULL;i++) { - len=strlen(columns[i])*2; - if(str) - len+=strlen(str); - if((p=realloc(str,len))==NULL) - break; - str=p; - if(i) strcat(str,"\t"); - else *str=0; - strcat(str,columns[i]); - } - - return(str); -} - -str_list_t tabLineParser(const char* line) -{ - char* p; - char* buf; - char* tmp; - size_t count=0; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - - if((buf=strdup(line))==NULL) { - strListFree(&list); - return(NULL); - } - - for(p=strtok_r(buf,"\t",&tmp);p;p=strtok_r(NULL,"\t",&tmp)) - strListAppend(&list,p,count++); - - free(buf); - - return(list); -} - -/* Generic API */ - -str_list_t dataCreateList(const str_list_t records[], const str_list_t columns, dataLineCreator_t lineCreator) -{ - char* p; - str_list_t list; - size_t i; - size_t li=0; - - if((list=strListInit())==NULL) - return(NULL); - - if(columns!=NULL) { - p=lineCreator(columns); - strListAppend(&list,p,li++); - free(p); - } - - if(records!=NULL) - for(i=0;records[i]!=NULL;i++) { - p=lineCreator(records[i]); - strListAppend(&list,p,li++); - free(p); - } - - return(list); -} - -BOOL dataWriteFile(FILE* fp, const str_list_t records[], const str_list_t columns, const char* separator - ,dataLineCreator_t lineCreator) -{ - size_t count,total; - str_list_t list; - - rewind(fp); - - if(chsize(fileno(fp),0)!=0) /* truncate */ - return(FALSE); - - if((list=dataCreateList(records,columns,lineCreator))==NULL) - return(FALSE); - - total = strListCount(list); - count = strListWriteFile(fp,list,separator); - strListFree(&list); - - return(count == total); -} - -str_list_t* dataParseList(const str_list_t records, str_list_t* columns, dataLineParser_t lineParser) -{ - size_t ri=0; - size_t li=0; - str_list_t* list; - - if(records==NULL) - return(NULL); - - if((list=(str_list_t*)malloc(sizeof(str_list_t)*(strListCount(records)+1)))==NULL) - return(NULL); - - if(columns!=NULL) { - if((*columns=lineParser(records[ri++]))==NULL) { - free(list); - return(NULL); - } - } - - while(records[ri]!=NULL) - list[li++]=lineParser(records[ri++]); - - list[li]=NULL; /* terminate */ - - return(list); -} - -str_list_t* dataReadFile(FILE* fp, str_list_t* columns, dataLineParser_t lineParser) -{ - str_list_t* records; - str_list_t lines; - size_t i; - - rewind(fp); - - if((lines=strListReadFile(fp, NULL, 0))==NULL) - return(NULL); - - /* truncate line-feed chars off end of strings */ - for(i=0; lines[i]!=NULL; i++) - truncnl(lines[i]); - - records=dataParseList(lines,columns,lineParser); - - strListFree(&lines); - - return(records); -} diff --git a/xpdev/dat_file.h b/xpdev/dat_file.h deleted file mode 100644 index 4c45d8a97cffe2512ea2c11d3d0a619c13d256c3..0000000000000000000000000000000000000000 --- a/xpdev/dat_file.h +++ /dev/null @@ -1,82 +0,0 @@ -/* dat_file.h */ - -/* Functions to deal with comma (CSV) and tab-delimited files and lists */ - -/* $Id: dat_file.h,v 1.4 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _DAT_FILE_H -#define _DAT_FILE_H - -#include "str_list.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/***************/ -/* Generic API */ -/***************/ - -typedef str_list_t (*dataLineParser_t)(const char*); -typedef char* (*dataLineCreator_t)(const str_list_t); - -/* columns arguments are optional (may be NULL) */ -str_list_t* dataParseList(const str_list_t records, str_list_t* columns, dataLineParser_t); -str_list_t* dataReadFile(FILE* fp, str_list_t* columns, dataLineParser_t); - -str_list_t dataCreateList(const str_list_t records[], const str_list_t columns, dataLineCreator_t); -BOOL dataWriteFile(FILE* fp, const str_list_t records[], const str_list_t columns - ,const char* separator, dataLineCreator_t); - -/* CSV (comma separated value) API */ -char* csvLineCreator(const str_list_t); -str_list_t csvLineParser(const char* line); -#define csvParseList(list,col) dataParseList(list,col,csvLineParser) -#define csvCreateList(rec,col) dataCreateList(rec,col,csvLineCreator) -#define csvReadFile(fp,col) dataReadFile(fp,col,csvLineParser) -#define csvWriteFile(fp,rec,sep,col) dataWriteFile(fp,rec,col,sep,csvLineCreator) - -/* Tab-delimited API */ -char* tabLineCreator(const str_list_t); -str_list_t tabLineParser(const char* line); -#define tabParseList(list,col) dataParseList(list,col,tabLineParser) -#define tabCreateList(rec,col) dataCreateList(rec,col,tabLineCreator) -#define tabReadFile(fp,col) dataReadFile(fp,col,tabLineParser) -#define tabWriteFile(fp,rec,sep,col) dataWriteFile(fp,rec,col,sep,tabLineCreator) - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/datewrap.c b/xpdev/datewrap.c deleted file mode 100644 index 5f3759e676c353a193e3e1f97b90a82884a4c06b..0000000000000000000000000000000000000000 --- a/xpdev/datewrap.c +++ /dev/null @@ -1,213 +0,0 @@ -/* datewrap.c */ - -/* Wrappers for non-standard date and time functions */ - -/* $Id: datewrap.c,v 1.34 2015/08/29 10:40:15 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "string.h" /* memset */ -#include "genwrap.h" -#include "datewrap.h" - -/* Return difference (in seconds) in time() result from standard */ -time_t checktime(void) -{ - time_t t=0x2D24BD00L; /* Correct time_t value on Jan-1-1994 */ - struct tm gmt; - struct tm tm; - - memset(&tm,0,sizeof(tm)); - tm.tm_year=94; - tm.tm_mday=1; - return mktime(&tm) - mktime(gmtime_r(&t,&gmt)); -} - -/* Compensates for struct tm "weirdness" */ -time_t sane_mktime(struct tm* tm) -{ - if(tm->tm_year>=1900) - tm->tm_year-=1900; - if(tm->tm_mon) /* Month is zero-based */ - tm->tm_mon--; - tm->tm_isdst=-1; /* Auto-adjust for DST */ - - return mktime(tm); -} - -/* Compensates for struct tm "weirdness" */ -time_t sane_timegm(struct tm* tm) -{ - if(tm->tm_year>=1900) - tm->tm_year-=1900; - if(tm->tm_mon) /* Month is zero-based */ - tm->tm_mon--; - tm->tm_isdst=0; /* Don't adjust for DST */ - - return timegm(tm); -} - -time32_t time32(time32_t* tp) -{ - time_t t; - - t=time(NULL); - - if(tp!=NULL) - *tp=(time32_t)t; - - return (time32_t)t; -} - -time32_t mktime32(struct tm* tm) -{ - return (time32_t)mktime(tm); /* don't use sane_mktime since tm->tm_mon is assumed to be already zero-based */ -} - -struct tm* localtime32(const time32_t* t32, struct tm* tm) -{ - time_t t=*t32; - struct tm* tmp; - - if((tmp=localtime(&t))==NULL) - return(NULL); - - *tm = *tmp; - return(tm); -} - - -#if !defined(__BORLANDC__) - -/***********************************/ -/* Borland DOS date/time functions */ -/***********************************/ - -#if defined(_WIN32) - #include <windows.h> /* SYSTEMTIME and GetLocalTime() */ - #include <time.h> /* _mkgmtime */ -#else - #include <sys/time.h> /* stuct timeval, gettimeofday() */ -#endif - -void xp_getdate(struct date* nyd) -{ - time_t tim; - struct tm dte; - - tim=time(NULL); - localtime_r(&tim,&dte); - nyd->da_year=dte.tm_year+1900; - nyd->da_day=dte.tm_mday; - nyd->da_mon=dte.tm_mon+1; -} - -void gettime(struct time* nyt) -{ -#if defined(_WIN32) - SYSTEMTIME systime; - - GetLocalTime(&systime); - nyt->ti_hour=(unsigned char)systime.wHour; - nyt->ti_min=(unsigned char)systime.wMinute; - nyt->ti_sec=(unsigned char)systime.wSecond; - nyt->ti_hund=systime.wMilliseconds/10; -#else /* !Win32 (e.g. Unix) */ - struct tm dte; - time_t t; - struct timeval tim; - - gettimeofday(&tim, NULL); - t=tim.tv_sec; - localtime_r(&t,&dte); - nyt->ti_min=dte.tm_min; - nyt->ti_hour=dte.tm_hour; - nyt->ti_sec=dte.tm_sec; - nyt->ti_hund=tim.tv_usec/10000; -#endif -} - -#endif /* !Borland */ - -#if !defined(__unix__) - -/****************************************************************************/ -/* Win32 implementations of the recursive (thread-safe) versions of std C */ -/* time functions (gmtime, localtime, ctime, and asctime) used in Unix. */ -/* The native Win32 versions of these functions are already thread-safe. */ -/****************************************************************************/ - -struct tm* gmtime_r(const time_t* t, struct tm* tm) -{ - struct tm* tmp = gmtime(t); - - if(tmp==NULL) - return(NULL); - - *tm = *tmp; - return(tm); -} - -struct tm* localtime_r(const time_t* t, struct tm* tm) -{ - struct tm* tmp = localtime(t); - - if(tmp==NULL) - return(NULL); - - *tm = *tmp; - return(tm); -} - -char* ctime_r(const time_t *t, char *buf) -{ - char* p = ctime(t); - - if(p==NULL) - return(NULL); - - strcpy(buf,p); - return(buf); -} - -char* asctime_r(const struct tm *tm, char *buf) -{ - char* p = asctime(tm); - - if(p==NULL) - return(NULL); - - strcpy(buf,p); - return(buf); -} - -#endif /* !defined(__unix__) */ diff --git a/xpdev/datewrap.h b/xpdev/datewrap.h deleted file mode 100644 index c57cd9447f357a5cb0ff3cae2f564b353970bebd..0000000000000000000000000000000000000000 --- a/xpdev/datewrap.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Wrappers for non-standard date and time functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _DATEWRAP_H_ -#define _DATEWRAP_H_ - -#include "genwrap.h" /* time_t */ - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Return difference (in seconds) in time() result from standard (0 on success) */ -DLLEXPORT time_t checktime(void); - -/* Implementation of mktime()/timegm() that handles common tm element conversions for you */ -DLLEXPORT time_t sane_mktime(struct tm*); -DLLEXPORT time_t sane_timegm(struct tm*); - -/* Legacy (32-bit time_t) versions of time() and mktime() */ -DLLEXPORT time32_t time32(time32_t* tp); -DLLEXPORT time32_t mktime32(struct tm*); -DLLEXPORT struct tm* localtime32(const time32_t* t, struct tm* tm); - -/*********************************************************************************/ -/* Win32 implementations of recursive (thread-safe) std C time functions on Unix */ -/*********************************************************************************/ - -#if !defined(__unix__) - - #include <time.h> /* time_t, etc. */ - - DLLEXPORT struct tm* gmtime_r(const time_t* t, struct tm* tm); - DLLEXPORT struct tm* localtime_r(const time_t* t, struct tm* tm); - DLLEXPORT char* ctime_r(const time_t *t, char *buf); - DLLEXPORT char* asctime_r(const struct tm *tm, char *buf); - -#endif - -/* Microsoft's equivalent of GLIBC/BSD timegm() */ -#if defined(_MSC_VER) || defined(__MINGW32__) - #define timegm _mkgmtime -#endif - -/***********************************/ -/* Borland DOS date/time functions */ -/***********************************/ - -#if defined(__BORLANDC__) - -/* Borland C++ doesn't come with a timegm() or mkgmtime() equivalent */ -#define timegm mktime - -#include <dos.h> - -#else - -struct date { - short da_year; - char da_day; - char da_mon; -}; - -struct time { - unsigned char ti_min; - unsigned char ti_hour; - unsigned char ti_hund; - unsigned char ti_sec; -}; - -#define getdate(x) xp_getdate(x) -DLLEXPORT void xp_getdate(struct date*); -DLLEXPORT void gettime(struct time*); - -#endif /* !Borland */ - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/dirwrap.c b/xpdev/dirwrap.c deleted file mode 100644 index 1727adff95241596b4819ff2b1ed3053386e0654..0000000000000000000000000000000000000000 --- a/xpdev/dirwrap.c +++ /dev/null @@ -1,1231 +0,0 @@ -/* Directory-related system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strrchr */ - -#if defined(_WIN32) - - #include <windows.h> /* WINAPI, etc */ - #include <io.h> /* _findfirst */ - -#elif defined __unix__ - - #include <unistd.h> /* usleep */ - #include <fcntl.h> /* O_NOCCTY */ - #include <ctype.h> /* toupper */ - #include <sys/param.h> - - #if defined(BSD) - #include <sys/mount.h> - #endif - #if defined(__FreeBSD__) - #include <sys/kbio.h> - #endif - #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000 /* NetBSD 3.0 */) - #include <sys/statvfs.h> - #endif - - #include <sys/ioctl.h> /* ioctl */ - - #if defined(__GLIBC__) /* actually, BSD, but will work for now */ - #include <sys/vfs.h> /* statfs() */ - #endif - - #if defined(__solaris__) - #include <sys/statvfs.h> - #endif - -#endif /* __unix__ */ - -#if defined(__WATCOMC__) - #include <dos.h> -#endif - -#include <sys/types.h> /* _dev_t */ - -#include <stdio.h> /* sprintf */ -#include <stdlib.h> /* rand */ -#include <errno.h> /* ENOENT definitions */ - -#include "genwrap.h" /* strupr/strlwr */ -#include "dirwrap.h" -#include "filewrap.h" /* stat */ - -#if !defined(S_ISDIR) - #define S_ISDIR(x) ((x)&S_IFDIR) -#endif - -/****************************************************************************/ -/* Return the filename portion of a full pathname */ -/****************************************************************************/ -char* getfname(const char* path) -{ - const char* fname; - const char* bslash; - - fname=strrchr(path,'/'); - bslash=strrchr(path,'\\'); - if(bslash>fname) - fname=bslash; - if(fname!=NULL) - fname++; - else - fname=(char*)path; - return((char*)fname); -} - -/****************************************************************************/ -/* Return the filename or last directory portion of a full pathname */ -/* A directory pathname is expected to end in a '/' */ -/****************************************************************************/ -char* getdirname(const char* path) -{ - char* last = lastchar(path); - if(*last == '/') { - if(last == path) - return last; - for(last--; last >= path; last--) { - if(IS_PATH_DELIM(*last)) - return last + 1; - } - return (char*)path; - } - return getfname(path); -} - -/****************************************************************************/ -/* Return a pointer to a file's extension/suffix (beginning with '.') */ -/****************************************************************************/ -char* getfext(const char* path) -{ - char *fname; - char *fext; - - fname=getfname(path); - fext=strrchr(fname,'.'); - if(fext==NULL || fext==fname) - return(NULL); - return(fext); -} - -/****************************************************************************/ -/* Break a path name into components. */ -/****************************************************************************/ -#if defined(__unix__) -void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext) -{ - char* p; - - ext[0]=0; - drive[0]=0; /* no drive letters on Unix */ - - snprintf(dir, MAX_PATH+1, "%s", path); /* Optional directory path, including trailing slash. */ - p=getfname(dir); - snprintf(fname, MAX_PATH+1, "%s", p); /* Base filename (no extension) */ - if(p==dir) - dir[0]=0; /* no directory specified in path */ - else - *p=0; /* truncate dir at filename */ - p=getfext(fname); - if(p!=NULL) { - snprintf(ext, MAX_PATH+1, "%s", p); /* Optional filename extension, including leading period (.) */ - *p=0; - } -} -#endif - -/****************************************************************************/ -/* Win32 (minimal) implementation of POSIX.2 glob() function */ -/* This code _may_ work on other DOS-based platforms (e.g. OS/2) */ -/****************************************************************************/ -#if !defined(__unix__) -static int __cdecl glob_compare( const void *arg1, const void *arg2 ) -{ - /* Compare all of both strings: */ - return strcmp( * ( char** ) arg1, * ( char** ) arg2 ); -} - -#if defined(__BORLANDC__) - #pragma argsused -#endif - -#if defined(__WATCOMC__) - -int glob(const char *pattern, int flags, void* unused, glob_t* glob) -{ - struct find_t ff; - size_t found=0; - char path[MAX_PATH+1]; - char* p; - char** new_pathv; - - if(!(flags&GLOB_APPEND)) { - glob->gl_pathc=0; - glob->gl_pathv=NULL; - } - - if(_dos_findfirst((char*)pattern,(flags&GLOB_PERIOD) ? _A_HIDDEN : _A_NORMAL,&ff)!=0) - return(GLOB_NOMATCH); - - do { - if((flags&GLOB_PERIOD || ff.name[0]!='.') && - (!(flags&GLOB_ONLYDIR) || ff.attrib&_A_SUBDIR)) { - if((new_pathv=realloc(glob->gl_pathv - ,(glob->gl_pathc+1)*sizeof(char*)))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - glob->gl_pathv=new_pathv; - - /* build the full pathname */ - SAFECOPY(path,pattern); - p=getfname(path); - *p=0; - strcat(path,ff.name); - - if((glob->gl_pathv[glob->gl_pathc]=malloc(strlen(path)+2))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - strcpy(glob->gl_pathv[glob->gl_pathc],path); - if(flags&GLOB_MARK && ff.attrib&_A_SUBDIR) - strcat(glob->gl_pathv[glob->gl_pathc],"/"); - - glob->gl_pathc++; - found++; - } - } while(_dos_findnext(&ff)==0); - _dos_findclose(&ff); - - if(found==0) - return(GLOB_NOMATCH); - - if(!(flags&GLOB_NOSORT)) { - qsort(glob->gl_pathv,found,sizeof(char*),glob_compare); - } - - return(0); /* success */ -} - -#else - -int glob(const char *pattern, int flags, void* unused, glob_t* glob) -{ - struct _finddata_t ff; - long ff_handle; - size_t found=0; - char path[MAX_PATH+1]; - char* p; - char** new_pathv; - - if(!(flags&GLOB_APPEND)) { - glob->gl_pathc=0; - glob->gl_pathv=NULL; - } - - ff_handle=_findfirst((char*)pattern,&ff); - while(ff_handle!=-1) { - if((flags&GLOB_PERIOD || (ff.name[0]!='.' && !(ff.attrib&_A_HIDDEN))) && - (!(flags&GLOB_ONLYDIR) || ff.attrib&_A_SUBDIR)) { - if((new_pathv=(char**)realloc(glob->gl_pathv - ,(glob->gl_pathc+1)*sizeof(char*)))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - glob->gl_pathv=new_pathv; - - /* build the full pathname */ - SAFECOPY(path,pattern); - p=getfname(path); - *p=0; - SAFECAT(path,ff.name); - - if((glob->gl_pathv[glob->gl_pathc]=(char*)malloc(strlen(path)+2))==NULL) { - globfree(glob); - return(GLOB_NOSPACE); - } - strcpy(glob->gl_pathv[glob->gl_pathc],path); - if(flags&GLOB_MARK && ff.attrib&_A_SUBDIR) - strcat(glob->gl_pathv[glob->gl_pathc],"/"); - - glob->gl_pathc++; - found++; - } - if(_findnext(ff_handle, &ff)!=0) { - _findclose(ff_handle); - ff_handle=-1; - } - } - - if(found==0) - return(GLOB_NOMATCH); - - if(!(flags&GLOB_NOSORT)) { - qsort(glob->gl_pathv,found,sizeof(char*),glob_compare); - } - - return(0); /* success */ -} - -#endif - -void globfree(glob_t* glob) -{ - size_t i; - - if(glob==NULL) - return; - - if(glob->gl_pathv!=NULL) { - for(i=0;i<glob->gl_pathc;i++) - if(glob->gl_pathv[i]!=NULL) - free(glob->gl_pathv[i]); - - free(glob->gl_pathv); - glob->gl_pathv=NULL; - } - glob->gl_pathc=0; -} - -#endif /* !defined(__unix__) */ - -/****************************************************************************/ -/* Returns number of files and/or sub-directories in directory (path) */ -/* Similar, but not identical, to getfilecount() */ -/****************************************************************************/ -long getdirsize(const char* path, BOOL include_subdirs, BOOL subdir_only) -{ - char match[MAX_PATH+1]; - glob_t g; - unsigned gi; - long count=0; - - if(!isdir(path)) - return -1; - - SAFECOPY(match,path); - backslash(match); - SAFECAT(match,ALLFILES); - if (glob(match,GLOB_MARK,NULL,&g) != 0) - return 0; - if(include_subdirs && !subdir_only) - count=g.gl_pathc; - else - for(gi=0;gi<g.gl_pathc;gi++) { - if(*lastchar(g.gl_pathv[gi])=='/') { - if(!include_subdirs) - continue; - } else - if(subdir_only) - continue; - count++; - } - globfree(&g); - return(count); -} - -/****************************************************************************/ -/* POSIX directory operations using Microsoft _findfirst/next API. */ -/****************************************************************************/ -#if defined(_MSC_VER) || defined(__DMC__) -DIR* opendir(const char* dirname) -{ - DIR* dir; - - if((dir=(DIR*)calloc(1,sizeof(DIR)))==NULL) { - errno=ENOMEM; - return(NULL); - } - sprintf(dir->filespec,"%.*s",sizeof(dir->filespec)-5,dirname); - if(*dir->filespec && dir->filespec[strlen(dir->filespec)-1]!='\\') - strcat(dir->filespec,"\\"); - strcat(dir->filespec,"*.*"); - dir->handle=_findfirst(dir->filespec,&dir->finddata); - if(dir->handle==-1) { - errno=ENOENT; - free(dir); - return(NULL); - } - return(dir); -} -struct dirent* readdir(DIR* dir) -{ - if(dir==NULL) - return(NULL); - if(dir->end==TRUE) - return(NULL); - if(dir->handle==-1) - return(NULL); - sprintf(dir->dirent.d_name,"%.*s",sizeof(struct dirent)-1,dir->finddata.name); - if(_findnext(dir->handle,&dir->finddata)!=0) - dir->end=TRUE; - return(&dir->dirent); -} -int closedir (DIR* dir) -{ - if(dir==NULL) - return(-1); - _findclose(dir->handle); - free(dir); - return(0); -} -void rewinddir(DIR* dir) -{ - if(dir==NULL) - return; - _findclose(dir->handle); - dir->end=FALSE; - dir->handle=_findfirst(dir->filespec,&dir->finddata); -} -#endif /* defined(_MSC_VER) */ - -/****************************************************************************/ -/* Returns the creation time of the file 'filename' in time_t format */ -/****************************************************************************/ -time_t fcdate(const char* filename) -{ - struct stat st; - - if(stat(filename, &st) != 0) - return -1; - - return st.st_ctime; -} - -/****************************************************************************/ -/* Returns the time/date of the file in 'filename' in time_t (unix) format */ -/****************************************************************************/ -time_t fdate(const char* filename) -{ - struct stat st; - - if(stat(filename, &st)!=0) - return(-1); - - return(st.st_mtime); -} - -/****************************************************************************/ -/* Change the access and modification times for specified filename */ -/****************************************************************************/ -int setfdate(const char* filename, time_t t) -{ - struct utimbuf ut; - - memset(&ut,0,sizeof(ut)); - - ut.actime=t; - ut.modtime=t; - - return(utime(filename,&ut)); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filename' */ -/* or -1 if the file doesn't exist */ -/****************************************************************************/ -off_t flength(const char *filename) -{ -#if defined(__BORLANDC__) && !defined(__unix__) /* stat() doesn't work right */ - - long handle; - struct _finddata_t f; - - if((handle=_findfirst((char*)filename,&f))==-1) - return(-1); - - _findclose(handle); - - return(f.size); - -#else - - struct stat st; - - if(stat(filename, &st)!=0) - return(-1); - - return(st.st_size); - -#endif -} - - -/****************************************************************************/ -/* Checks the file system for the existence of a file. */ -/* Returns TRUE if it exists, FALSE if it doesn't. */ -/* 'filename' may *NOT* contain wildcards! */ -/****************************************************************************/ -static BOOL fnameexist(const char *filename) -{ - struct stat st; - - if(stat(filename, &st) != 0) - return FALSE; - - if(S_ISDIR(st.st_mode)) - return FALSE; - - return TRUE; -} - -/****************************************************************************/ -/* Checks the file system for the existence of one or more files. */ -/* Returns TRUE if it exists, FALSE if it doesn't. */ -/* 'filespec' may contain wildcards! */ -/****************************************************************************/ -BOOL fexist(const char *filespec) -{ -#if defined(_WIN32) - - long handle; - struct _finddata_t f; - BOOL found; - - if(!strchr(filespec,'*') && !strchr(filespec,'?')) - return(fnameexist(filespec)); - - if((handle=_findfirst((char*)filespec,&f))==-1) - return(FALSE); - found=TRUE; - while(f.attrib&_A_SUBDIR) - if(_findnext(handle,&f)!=0) { - found=FALSE; - break; - } - - _findclose(handle); - - return(found); - -#else /* Unix or OS/2 */ - - /* portion by cmartin */ - - glob_t g; - int c; - - if(!strchr(filespec,'*') && !strchr(filespec,'?')) - return(fnameexist(filespec)); - - /* start the search */ - glob(filespec, GLOB_MARK | GLOB_NOSORT, NULL, &g); - - if (!g.gl_pathc) { - /* no results */ - globfree(&g); - return FALSE; - } - - /* make sure it's not a directory */ - c = g.gl_pathc; - while (c--) { - if (*lastchar(g.gl_pathv[c]) != '/') { - globfree(&g); - return TRUE; - } - } - - globfree(&g); - return FALSE; - -#endif -} - -/****************************************************************************/ -/* Fixes upper/lowercase filename for Unix file systems */ -/****************************************************************************/ -BOOL fexistcase(char *path) -{ -#if defined(_WIN32) - - char* fname; - long handle; - struct _finddata_t f; - - if(access(path, F_OK)==-1 && !strchr(path,'*') && !strchr(path,'?')) - return(FALSE); - - if((handle=_findfirst((char*)path,&f))==-1) - return(FALSE); - - _findclose(handle); - - if(f.attrib&_A_SUBDIR) - return(FALSE); - - fname=getfname(path); /* Find filename in path */ - strcpy(fname,f.name); /* Correct filename */ - - return(TRUE); - -#else /* Unix or OS/2 */ - - char globme[MAX_PATH*4+1]; - char fname[MAX_PATH+1]; - char tmp[5]; - char *p; - int i; - glob_t glb; - - if(path[0]==0) /* work around glibc bug 574274 */ - return FALSE; - - if(!strchr(path,'*') && !strchr(path,'?') && fnameexist(path)) - return(TRUE); - - SAFECOPY(globme,path); - p=getfname(globme); - SAFECOPY(fname,p); - *p=0; - for(i=0;fname[i];i++) { - if(IS_ALPHA(fname[i])) - sprintf(tmp,"[%c%c]",toupper(fname[i]),tolower(fname[i])); - else - sprintf(tmp,"%c",fname[i]); - strncat(globme,tmp,MAX_PATH*4); - } -#if 0 - if(strcspn(path,"?*")!=strlen(path)) { - sprintf(path,"%.*s",MAX_PATH,globme); - return(fexist(path)); - } -#endif - - if(glob(globme,GLOB_MARK,NULL,&glb) != 0) - return(FALSE); - - if(glb.gl_pathc>0) { - for(i=0;i<glb.gl_pathc;i++) { - if(*lastchar(glb.gl_pathv[i]) != '/') - break; - } - if(i<glb.gl_pathc) { - sprintf(path,"%.*s",MAX_PATH,glb.gl_pathv[i]); - globfree(&glb); - return TRUE; - } - } - - globfree(&glb); - return FALSE; - -#endif -} - -/****************************************************************************/ -/* Returns TRUE if the filename specified is a directory */ -/****************************************************************************/ -BOOL isdir(const char *filename) -{ - char path[MAX_PATH+1]; - char* p; - struct stat st; - - SAFECOPY(path,filename); - - p=lastchar(path); - if(p!=path && IS_PATH_DELIM(*p)) { /* chop off trailing slash */ -#if !defined(__unix__) - if(*(p-1)!=':') /* Don't change C:\ to C: */ -#endif - *p=0; - } - -#if defined(__BORLANDC__) && !defined(__unix__) /* stat() doesn't work right */ - if(stat(path, &st)!=0 || strchr(path,'*')!=NULL || strchr(path,'?')!=NULL) -#else - if(stat(path, &st)!=0) -#endif - return(FALSE); - - return(S_ISDIR(st.st_mode) ? TRUE : FALSE); -} - -/****************************************************************************/ -/* Returns the attributes (mode) for specified 'filename' or -1 on failure. */ -/* The return value on Windows is *not* compatible with chmod(). */ -/****************************************************************************/ -int getfattr(const char* filename) -{ -#if defined(_WIN32) - long handle; - struct _finddata_t finddata; - - if((handle=_findfirst((char*)filename,&finddata))==-1) { - errno=ENOENT; - return(-1); - } - _findclose(handle); - return(finddata.attrib); -#else - struct stat st; - - if(stat(filename, &st)!=0) { - errno=ENOENT; - return(-1L); - } - - return(st.st_mode); -#endif -} - -/****************************************************************************/ -/* Returns the mode / type flags for specified 'filename' */ -/* The return value *is* compatible with chmod(), or -1 upon failure. */ -/****************************************************************************/ -int getfmode(const char* filename) -{ - struct stat st; - - if(stat(filename, &st) != 0) - return -1; - - return st.st_mode; -} - - -#ifdef __unix__ -int removecase(const char *path) -{ - char inpath[MAX_PATH+1]; - char fname[MAX_PATH*4+1]; - char tmp[5]; - char *p; - int i; - - if(strchr(path,'?') || strchr(path,'*')) - return(-1); - SAFECOPY(inpath,path); - p=getfname(inpath); - fname[0]=0; - for(i=0;p[i];i++) { - if(IS_ALPHA(p[i])) - sprintf(tmp,"[%c%c]",toupper(p[i]),tolower(p[i])); - else - sprintf(tmp,"%c",p[i]); - strncat(fname,tmp,MAX_PATH*4); - } - *p=0; - - return(delfiles(inpath,fname,0) >=1 ? 0 : -1); -} -#endif - -/****************************************************************************/ -/* Deletes all files in dir 'path' that match file spec 'spec' */ -/* Optionally, keep the last so many files (sorted by name) */ -/* Returns number of files deleted or negative on error */ -/****************************************************************************/ -long delfiles(const char *inpath, const char *spec, size_t keep) -{ - char *path; - char lastch; - size_t i; - ulong files = 0; - long errors = 0; - glob_t g; - size_t inpath_len=strlen(inpath); - - if(inpath_len==0) - lastch=0; - else - lastch=inpath[inpath_len-1]; - path=(char *)malloc(inpath_len+1/*Delim*/+strlen(spec)+1/*Terminator*/); - if(path==NULL) - return -1; - if(!IS_PATH_DELIM(lastch) && lastch) - sprintf(path,"%s%c",inpath,PATH_DELIM); - else - strcpy(path,inpath); - strcat(path,spec); - glob(path,0,NULL,&g); - free(path); - if(keep >= g.gl_pathc) - return 0; - for(i = 0; i < g.gl_pathc && files < g.gl_pathc - keep; i++) { - if(isdir(g.gl_pathv[i])) - continue; - (void)CHMOD(g.gl_pathv[i],S_IWRITE); /* In case it's been marked RDONLY */ - if(remove(g.gl_pathv[i])==0) - files++; - else - errors++; - } - globfree(&g); - if(errors) - return -errors; - return files; -} - -/****************************************************************************/ -/* Returns number of files matching 'inpath' */ -/* Similar, but not identical, to getdirsize(), e.g. subdirs never counted */ -/****************************************************************************/ -ulong getfilecount(const char *inpath) -{ - char path[MAX_PATH+1]; - glob_t g; - uint gi; - ulong count = 0; - - SAFECOPY(path, inpath); - if(isdir(path)) - backslash(path); - if(IS_PATH_DELIM(*lastchar(path))) - SAFECAT(path, ALLFILES); - if(glob(path, GLOB_MARK, NULL, &g)) - return 0; - for(gi = 0; gi < g.gl_pathc; ++gi) { - if(*lastchar(g.gl_pathv[gi]) == '/') - continue; - count++; - } - globfree(&g); - return count; -} - -/****************************************************************************/ -/* Returns number of bytes used by file(s) matching 'inpath' */ -/****************************************************************************/ -uint64_t getfilesizetotal(const char *inpath) -{ - char path[MAX_PATH+1]; - glob_t g; - uint gi; - off_t size; - uint64_t total = 0; - - SAFECOPY(path, inpath); - if(isdir(path)) - backslash(path); - if(IS_PATH_DELIM(*lastchar(path))) - SAFECAT(path, ALLFILES); - if(glob(path, GLOB_MARK, NULL, &g)) - return 0; - for(gi = 0; gi < g.gl_pathc; ++gi) { - if(*lastchar(g.gl_pathv[gi]) == '/') - continue; - size = flength(g.gl_pathv[gi]); - if(size >= 1) - total += size; - } - globfree(&g); - return total; -} - -/****************************************************************************/ -/* Return free disk space in bytes (up to a maximum of 4GB) */ -/****************************************************************************/ -#if defined(_WIN32) -typedef BOOL(WINAPI * GetDiskFreeSpaceEx_t) - (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); - -static int bit_num(ulong val) -{ - int i; - - for(i=31;i>=0;i--) - if(val&(1<<i)) - return(i); - - return(-1); -} -#endif - -/* Unit should be a power-of-2 (e.g. 1024 to report kilobytes) or 1 (to report bytes) */ -static ulong getdiskspace(const char* path, ulong unit, BOOL freespace) -{ -#if defined(_WIN32) - char root[16]; - DWORD TotalNumberOfClusters; - DWORD NumberOfFreeClusters; - DWORD BytesPerSector; - DWORD SectorsPerCluster; - ULARGE_INTEGER avail; - ULARGE_INTEGER size; - static HINSTANCE hK32; - GetDiskFreeSpaceEx_t GetDiskFreeSpaceEx; - - if(hK32 == NULL) - hK32 = LoadLibrary("KERNEL32"); - GetDiskFreeSpaceEx - = (GetDiskFreeSpaceEx_t)GetProcAddress(hK32,"GetDiskFreeSpaceExA"); - - if (GetDiskFreeSpaceEx!=NULL) { /* Windows 95-OSR2 or later */ - if(!GetDiskFreeSpaceEx( - path, /* pointer to the directory name */ - &avail, /* receives the number of bytes on disk avail to the caller */ - &size, /* receives the number of bytes on disk */ - NULL)) /* receives the free bytes on disk */ - return(0); - - if(freespace) - size=avail; - - if(unit>1) - size.QuadPart=Int64ShrlMod32(size.QuadPart,bit_num(unit)); - -#if defined(_ANONYMOUS_STRUCT) - if(size.HighPart) -#else - if(size.u.HighPart) -#endif - return(0xffffffff); /* 4GB max */ - -#if defined(_ANONYMOUS_STRUCT) - return(size.LowPart); -#else - return(size.u.LowPart); -#endif - } - - /* Windows 95 (old way), limited to 2GB */ - sprintf(root,"%.3s",path); - if(!GetDiskFreeSpace( - root, /* pointer to root path */ - (PDWORD)&SectorsPerCluster, /* pointer to sectors per cluster */ - (PDWORD)&BytesPerSector, /* pointer to bytes per sector */ - (PDWORD)&NumberOfFreeClusters, /* pointer to number of free clusters */ - (PDWORD)&TotalNumberOfClusters /* pointer to total number of clusters */ - )) - return(0); - - if(freespace) - TotalNumberOfClusters = NumberOfFreeClusters; - if(unit>1) - TotalNumberOfClusters/=unit; - return(TotalNumberOfClusters*SectorsPerCluster*BytesPerSector); - - -#elif defined(__solaris__) || (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000 /* NetBSD 3.0 */)) - - struct statvfs fs; - unsigned long blocks; - - if (statvfs(path, &fs) < 0) - return 0; - - if(freespace) - blocks=fs.f_bavail; - else - blocks=fs.f_blocks; - - if(unit>1) - blocks/=unit; - return fs.f_bsize * blocks; - -/* statfs is also used under FreeBSD (Though it *supports* statvfs() now too) */ -#elif defined(__GLIBC__) || defined(BSD) - - struct statfs fs; - unsigned long blocks; - - if(statfs(path, &fs) < 0) - return 0; - - if(freespace) - blocks=fs.f_bavail; - else - blocks=fs.f_blocks; - - if(unit>1) - blocks/=unit; - return fs.f_bsize * blocks; - -#else - - fprintf(stderr,"\n*** !Missing getfreediskspace implementation ***\n"); - return(0); - -#endif -} - -ulong getfreediskspace(const char* path, ulong unit) -{ - return getdiskspace(path, unit, /* freespace? */TRUE); -} - -ulong getdisksize(const char* path, ulong unit) -{ - return getdiskspace(path, unit, /* freespace? */FALSE); -} - -/****************************************************************************/ -/* Resolves //, /./, and /../ in a path. Should work identically to Windows */ -/****************************************************************************/ -#if defined(__unix__) -char * _fullpath(char *target, const char *path, size_t size) { - char *out; - char *p; - BOOL target_alloced=FALSE; - - if(target==NULL) { - if((target=malloc(MAX_PATH+1))==NULL) { - return(NULL); - } - target_alloced=TRUE; - } - out=target; - *out=0; - - if(*path != '/') { - if(*path == '~') { - p=getenv("HOME"); - if(p==NULL || strlen(p)+strlen(path)>=size) { - if(target_alloced) - free(target); - return(NULL); - } - strcpy(target,p); - out=strrchr(target,'\0'); - path++; - } - else { - p=getcwd(NULL,size); - if(p==NULL || strlen(p)+strlen(path)>=size) { - if(target_alloced) - free(target); - return(NULL); - } - strcpy(target,p); - free(p); - out=strrchr(target,'\0'); - *(out++)='/'; - *out=0; - out--; - } - } - strncat(target,path,size-1); - -/* if(stat(target,&sb)) - return(NULL); - if(sb.st_mode&S_IFDIR) - strcat(target,"/"); */ - - for(;*out;out++) { - while(*out=='/') { - if(*(out+1)=='/') - memmove(out,out+1,strlen(out)); - else if(*(out+1)=='.' && (*(out+2)=='/' || *(out+2)==0)) - memmove(out,out+2,strlen(out)-1); - else if(*(out+1)=='.' && *(out+2)=='.' && (*(out+3)=='/' || *(out+3)==0)) { - *out=0; - p=strrchr(target,'/'); - if(p==NULL) - p=target; - memmove(p,out+3,strlen(out+3)+1); - out=p; - } - else { - out++; - } - } - if (!*out) - break; - } - return(target); -} -#endif - -/****************************************************************************/ -/* Adds a trailing slash/backslash (path delimiter) on path strings */ -/****************************************************************************/ -char* backslash(char* path) -{ - char* p; - - p=lastchar(path); - - if(*p && !IS_PATH_DELIM(*p)) { -#if defined(__unix__) - /* Convert trailing backslash to forwardslash on *nix */ - if(*p!='\\') -#endif - p++; - *p=PATH_DELIM; - *(++p)=0; - } - return(path); -} - -/****************************************************************************/ -/* Returns true if the specified filename an absolute pathname */ -/****************************************************************************/ -BOOL isabspath(const char *filename) -{ - char path[MAX_PATH+1]; - - return(stricmp(filename,FULLPATH(path,filename,sizeof(path)))==0); -} - -/****************************************************************************/ -/* Returns true if the specified filename is a full ("rooted") path */ -/****************************************************************************/ -BOOL isfullpath(const char* filename) -{ - return(filename[0]=='/' -#ifdef WIN32 - || filename[0]=='\\' || (IS_ALPHA(filename[0]) && filename[1]==':') -#endif - ); -} - -/****************************************************************************/ -/* Matches file name against filespec */ -/* Optionally not allowing * to match PATH_DELIM (for paths) */ -/****************************************************************************/ - -BOOL wildmatch(const char *fname, const char *spec, BOOL path, BOOL case_sensitive) -{ - char *specp; - char *fnamep; - char *wildend; - - specp=(char *)spec; - fnamep=(char *)fname; - for(;;specp++, fnamep++) { - switch(*specp) { - case '?': - if(!(*fnamep)) - return(FALSE); - break; - case 0: - if(!*fnamep) - return(TRUE); - break; - case '*': - while(*specp=='*') - specp++; - if(path) { - for(wildend=fnamep; *wildend; wildend++) { - if(IS_PATH_DELIM(*wildend)) { - wildend--; - break; - } - } - } - else - wildend=strchr(fnamep, 0); - for(;wildend >= fnamep;wildend--) { - if(wildmatch(wildend, specp, path, case_sensitive)) - return(TRUE); - } - return(FALSE); - default: - if(case_sensitive && *specp != *fnamep) - return(FALSE); - if((!case_sensitive) && toupper(*specp) != toupper(*fnamep)) - return(FALSE); - } - if(!(*specp && *fnamep)) - break; - } - while(*specp=='*') - specp++; - if(*specp==*fnamep) - return(TRUE); - if((!case_sensitive) && toupper(*specp) == toupper(*fnamep)) - return(TRUE); - return(FALSE); -} - -/****************************************************************************/ -/* Matches file name against filespec, ignoring case */ -/****************************************************************************/ -BOOL wildmatchi(const char *fname, const char *spec, BOOL path) -{ - return wildmatch(fname, spec, path, /* case_sensitive: */FALSE); -} - -/****************************************************************************/ -/* Creates all the necessary directories in the specified path */ -/****************************************************************************/ -int mkpath(const char* path) -{ - const char* p=path; - const char* tp; - const char* sep= -#ifdef _WIN32 - "\\" -#endif - "/"; - char dir[MAX_PATH+1]; - int result=0; - -#ifdef _WIN32 - if(p[1]==':') /* Skip drive letter, if specified */ - p+=2; -#endif - - while(*p) { - SKIP_CHARSET(p,sep); - if(*p==0) - break; - tp=p; - FIND_CHARSET(tp,sep); - safe_snprintf(dir,sizeof(dir),"%.*s", (int)(tp-path), path); - if(!isdir(dir)) { - if((result=MKDIR(dir))!=0) - break; - } - p=tp; - } - - return(result); -} - -#if !defined _WIN32 -BOOL CopyFile(const char* src, const char* dest, BOOL failIfExists) -{ - uint8_t buf[256 * 1024]; - FILE* in; - FILE* out; - BOOL success=TRUE; - - if(failIfExists && fexist(dest)) - return FALSE; - if((in=fopen(src,"rb"))==NULL) - return FALSE; - if((out=fopen(dest,"wb"))==NULL) { - fclose(in); - return FALSE; - } - - time_t ftime = filetime(fileno(in)); - while(!feof(in)) { - size_t rd = fread(buf, sizeof(uint8_t), sizeof(buf), in); - if(rd < 1) - break; - if(fwrite(buf, sizeof(uint8_t), rd, out) != rd) { - success = FALSE; - break; - } - MAYBE_YIELD(); - } - - fclose(in); - fclose(out); - setfdate(dest,ftime); - - return success; -} -#endif diff --git a/xpdev/dirwrap.h b/xpdev/dirwrap.h deleted file mode 100644 index dce4345f214cc4cdf312769c1b503a33932aa2b1..0000000000000000000000000000000000000000 --- a/xpdev/dirwrap.h +++ /dev/null @@ -1,246 +0,0 @@ -/* Directory system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _DIRWRAP_H -#define _DIRWRAP_H - -#include <stdlib.h> /* _fullpath() on Win32 */ - -#if defined(__unix__) - #include <sys/param.h> /* PATH_MAX */ -#endif - -#if defined(INCLUDE_PATHS_H) - #include <paths.h> /* _PATHS_* macros */ -#endif - -#include "gen_defs.h" /* ulong */ -#include "wrapdll.h" /* DLLEXPORT */ - -#if defined(__cplusplus) -extern "C" { -#endif - -#define ALLFILES "*" /* matches all files in a directory */ - -/****************/ -/* RTL-specific */ -/****************/ - -#if defined(__unix__) - - #include <sys/types.h> - #include <sys/stat.h> - #include <glob.h> /* POSIX.2 directory pattern matching function */ - #define MKDIR(dir) mkdir(dir,0777) - - #if defined(__CYGWIN__) - #define DLLEXPORT /* CygWin's glob.h #undef's DLLEXPORT */ - #endif - -#else - - /* Values for the second argument to access. - These may be OR'd together. */ - #define R_OK 4 /* Test for read permission. */ - #define W_OK 2 /* Test for write permission. */ - #define X_OK 1 /* Test for execute permission. */ - #define F_OK 0 /* Test for existence. */ - - #include <direct.h> /* mkdir() */ - - #ifdef __WATCOMC__ - #define MKDIR(dir) mkdir(dir) - #else - #define MKDIR(dir) _mkdir(dir) - #endif - - /* glob-compatible findfirst/findnext wrapper */ - - typedef struct - { - size_t gl_pathc; /* Count of paths matched so far */ - char **gl_pathv; /* List of matched pathnames. */ - size_t gl_offs; /* Slots to reserve in 'gl_pathv'. */ - } glob_t; - - /* Bits set in the FLAGS argument to `glob'. */ - #define GLOB_ERR (1 << 0) /* Return on read errors. */ - #define GLOB_MARK (1 << 1) /* Append a slash to each name. */ - #define GLOB_NOSORT (1 << 2) /* Don't sort the names. */ - #define GLOB_DOOFFS (1 << 3) /* Insert PGLOB->gl_offs NULLs. */ - #define GLOB_NOCHECK (1 << 4) /* If nothing matches, return the pattern. */ - #define GLOB_APPEND (1 << 5) /* Append to results of a previous call. */ - #define GLOB_NOESCAPE (1 << 6) /* Backslashes don't quote metacharacters. */ - #define GLOB_PERIOD (1 << 7) /* Leading `.' can be matched by metachars. */ - #define GLOB_MAGCHAR (1 << 8) /* Set in gl_flags if any metachars seen. */ - #define GLOB_ALTDIRFUNC (1 << 9) /* Use gl_opendir et al functions. */ - #define GLOB_BRACE (1 << 10) /* Expand "{a,b}" to "a" "b". */ - #define GLOB_NOMAGIC (1 << 11) /* If no magic chars, return the pattern. */ - #define GLOB_TILDE (1 << 12) /* Expand ~user and ~ to home directories. */ - #define GLOB_ONLYDIR (1 << 13) /* Match only directories. */ - #define GLOB_TILDE_CHECK (1 << 14) /* Like GLOB_TILDE but return an error - if the user name is not available. */ - /* Error returns from `glob'. */ - #define GLOB_NOSPACE 1 /* Ran out of memory. */ - #define GLOB_ABORTED 2 /* Read error. */ - #define GLOB_NOMATCH 3 /* No matches found. */ - #define GLOB_NOSYS 4 /* Not implemented. */ - - DLLEXPORT int glob(const char *pattern, int flags, void* unused, glob_t*); - DLLEXPORT void globfree(glob_t*); - -#endif - -#define FULLPATH(a,r,l) _fullpath(a,r,l) - -/*****************************/ -/* POSIX Directory Functions */ -/*****************************/ -#if defined(_MSC_VER) || defined(__DMC__) - #include <io.h> /* _finddata_t */ - - /* dirent structure returned by readdir(). - */ - struct dirent - { - char d_name[260]; /* filename */ - }; - - /* DIR type returned by opendir(). The members of this structure - * must not be accessed by application programs. - */ - typedef struct - { - char filespec[260]; - struct dirent dirent; - long handle; - struct _finddata_t finddata; - BOOL end; /* End of directory flag */ - } DIR; - - - /* Prototypes. - */ - DLLEXPORT DIR* opendir (const char *__dirname); - DLLEXPORT struct dirent* readdir (DIR *__dir); - DLLEXPORT int closedir (DIR *__dir); - DLLEXPORT void rewinddir(DIR *__dir); -#elif !defined(__WATCOMC__) - #include <dirent.h> /* POSIX directory functions */ -#endif - - -/**********/ -/* Macros */ -/**********/ - -/* POSIX readdir convenience macro */ -#ifndef DIRENT -#define DIRENT struct dirent -#endif - -#if defined(__unix__) - #define PATH_DELIM '/' - #define IS_PATH_DELIM(x) (x=='/') - - /* These may be pre-defined in paths.h (BSD) */ - #ifndef _PATH_TMP - #define _PATH_TMP "/tmp/" - #endif - #ifndef _PATH_DEVNULL - #define _PATH_DEVNULL "/dev/null" - #endif - -#else /* MS-DOS based OS */ - - #define PATH_DELIM '\\' - #define IS_PATH_DELIM(x) ((x)=='/' || (x)=='\\') - #define _PATH_TMP getenv("TEMP") - #define _PATH_DEVNULL "NUL" - -#endif - -#if !defined(MAX_PATH) /* maximum path length */ - #if defined MAXPATHLEN - #define MAX_PATH MAXPATHLEN /* clib.h */ - #elif defined PATH_MAX - #define MAX_PATH PATH_MAX - #elif defined _MAX_PATH - #define MAX_PATH _MAX_PATH - #else - #define MAX_PATH 260 - #endif -#endif - -#if defined(_MSC_VER) || defined(__MINGW32__) - #define CHMOD(s,m) _chmod(s,m) -#elif defined(__BORLANDC__) && !defined(__unix__) - #define CHMOD(p,a) _rtl_chmod(p,1,a) /* _chmod obsolete in 4.x */ -#else - #define CHMOD(s,m) chmod(s,m) -#endif - -/* General file system wrappers for all platforms and compilers */ -DLLEXPORT BOOL fexist(const char *filespec); -DLLEXPORT BOOL fexistcase(char *filespec); /* fixes upr/lwr case fname */ -DLLEXPORT off_t flength(const char *filename); -DLLEXPORT time_t fdate(const char *filename); -DLLEXPORT time_t fcdate(const char* filename); -DLLEXPORT int setfdate(const char* filename, time_t t); -DLLEXPORT BOOL isdir(const char *filename); -DLLEXPORT BOOL isabspath(const char *filename); -DLLEXPORT BOOL isfullpath(const char* filename); -DLLEXPORT char* getfname(const char* path); -DLLEXPORT char* getfext(const char* path); -DLLEXPORT int getfattr(const char* filename); -DLLEXPORT int getfmode(const char* filename); -DLLEXPORT ulong getfilecount(const char *path); -DLLEXPORT char* getdirname(const char* path); -DLLEXPORT long getdirsize(const char* path, BOOL include_subdirs, BOOL subdir_only); -DLLEXPORT ulong getdisksize(const char* path, ulong unit); -DLLEXPORT ulong getfreediskspace(const char* path, ulong unit); -DLLEXPORT uint64_t getfilesizetotal(const char *path); -DLLEXPORT long delfiles(const char *inpath, const char *spec, size_t keep); -DLLEXPORT char* backslash(char* path); -DLLEXPORT BOOL wildmatch(const char *fname, const char *spec, BOOL path, BOOL case_sensitive); -DLLEXPORT BOOL wildmatchi(const char *fname, const char *spec, BOOL path); -DLLEXPORT int mkpath(const char* path); - - -#if defined(__unix__) -DLLEXPORT void _splitpath(const char *path, char *drive, char *dir, - char *fname, char *ext); -DLLEXPORT char * _fullpath(char *target, const char *path, size_t size); -DLLEXPORT int removecase(const char *path); -#else - #define removecase(x) remove(x) -#endif - -#if !defined _WIN32 -DLLEXPORT BOOL CopyFile(const char* src, const char* dest, BOOL failIfExists); -#endif - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/eventwrap.h b/xpdev/eventwrap.h deleted file mode 100644 index e98b666d190b872cfb7e5aafe6bcc87b993e2534..0000000000000000000000000000000000000000 --- a/xpdev/eventwrap.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Event-related cross-platform development wrappers (Win32 API emulation) */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _EVENTWRAP_H -#define _EVENTWRAP_H - -#include "gen_defs.h" - -#if defined(__unix__) - - #include "xpevent.h" - -#elif defined(_WIN32) - - typedef HANDLE xpevent_t; - #define WaitForEvent(event,ms) WaitForSingleObject(event,ms) - #define CloseEvent(event) CloseHandle(event) - -#else - - #error "Need event wrappers." - -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/filewrap.c b/xpdev/filewrap.c deleted file mode 100644 index 62c1670a59dd0ae032765205d7bcba50826845ba..0000000000000000000000000000000000000000 --- a/xpdev/filewrap.c +++ /dev/null @@ -1,427 +0,0 @@ -/* File-related system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* OS-specific */ -#if defined(__unix__) - -#include <stdarg.h> /* va_list */ -#include <string.h> /* strlen() */ -#include <unistd.h> /* getpid() */ -#include <fcntl.h> /* fcntl() file/record locking */ -#include <sys/file.h> /* L_SET for Solaris */ -#include <errno.h> -#include <sys/param.h> /* BSD */ - -#endif - -/* ANSI */ -#include <sys/types.h> /* _dev_t */ -#include <sys/stat.h> /* struct stat */ -#include <limits.h> /* struct stat */ -#include <stdlib.h> /* realloc() */ - -#include "filewrap.h" /* Verify prototypes */ - -/****************************************************************************/ -/* Returns the modification time of the file in 'fd' */ -/* or -1 if file doesn't exist. */ -/****************************************************************************/ -time_t filetime(int fd) -{ - struct stat st; - - if(fstat(fd, &st)!=0) - return(-1); - - return(st.st_mtime); -} - -#if defined(__unix__) && !defined(__BORLANDC__) - -/****************************************************************************/ -/* Returns the length of the file in 'fd' */ -/* or -1 if file doesn't exist. */ -/****************************************************************************/ -off_t filelength(int fd) -{ - struct stat st; - - if(fstat(fd, &st)!=0) - return(-1L); - - return(st.st_size); -} - -// See https://patchwork.kernel.org/patch/9289177/ -#if defined(F_OFD_SETLK) && _FILE_OFFSET_BITS != 64 - #undef F_OFD_SETLK -#endif - -/* Sets a lock on a portion of a file */ -int lock(int fd, off_t pos, off_t len) -{ - #if defined(F_SANERDLCKNO) || !defined(BSD) - struct flock alock = {0}; - int cmd = F_SETLK; - #ifdef F_OFD_SETLK - cmd = F_OFD_SETLK; - #endif - - #ifndef F_SANEWRLCKNO - int flags; - if((flags=fcntl(fd,F_GETFL))==-1) - return -1; - if((flags & (O_RDONLY|O_RDWR|O_WRONLY))==O_RDONLY) - alock.l_type = F_RDLCK; /* set read lock to prevent writes */ - else - alock.l_type = F_WRLCK; /* set write lock to prevent all access */ - #else - alock.l_type = F_SANEWRLCKNO; - #endif - alock.l_whence = L_SET; /* SEEK_SET */ - alock.l_start = pos; - alock.l_len = (int)len; - - int result = fcntl(fd, cmd, &alock); - if(result == -1 && errno != EINVAL) - return -1; - #ifdef F_OFD_SETLK - if(result == 0) - return 0; - #endif - #endif - - #if !defined(F_SANEWRLCKNO) && !defined(__QNX__) && !defined(__solaris__) - /* use flock (doesn't work over NFS) */ - if(flock(fd,LOCK_EX|LOCK_NB)!=0 && errno != EOPNOTSUPP) - return(-1); - #endif - - return(0); -} - -/* Removes a lock from a file record */ -int unlock(int fd, off_t pos, off_t len) -{ - -#if defined(F_SANEUNLCK) || !defined(BSD) - struct flock alock = {0}; - int cmd = F_SETLK; -#ifdef F_OFD_SETLK - cmd = F_OFD_SETLK; -#endif -#ifdef F_SANEUNLCK - alock.l_type = F_SANEUNLCK; /* remove the lock */ -#else - alock.l_type = F_UNLCK; /* remove the lock */ -#endif - alock.l_whence = L_SET; - alock.l_start = pos; - alock.l_len = (int)len; - int result = fcntl(fd, cmd, &alock); - if(result == -1 && errno != EINVAL) - return -1; -#ifdef F_OFD_SETLK - if(result == 0) - return 0; -#endif -#endif - -#if !defined(F_SANEUNLCK) && !defined(__QNX__) && !defined(__solaris__) - /* use flock (doesn't work over NFS) */ - if(flock(fd,LOCK_UN|LOCK_NB)!=0 && errno != EOPNOTSUPP) - return(-1); -#endif - - return(0); -} - -/* Opens a file in specified sharing (file-locking) mode */ -/* - * This is how it *SHOULD* work: - * Values of DOS 2-6.22 file sharing behavior: - * | Second and subsequent Opens - * First |Compat Deny Deny Deny Deny - * Open | All Write Read None - * |R W RW R W RW R W RW R W RW R W RW - * - - - - -| - - - - - - - - - - - - - - - - - - * Compat R |Y Y Y N N N 1 N N N N N 1 N N - * W |Y Y Y N N N N N N N N N N N N - * RW|Y Y Y N N N N N N N N N N N N - * - - - - -| - * Deny R |C C C N N N N N N N N N N N N - * All W |C C C N N N N N N N N N N N N - * RW|C C C N N N N N N N N N N N N - * - - - - -| - * Deny R |2 C C N N N Y N N N N N Y N N - * Write W |C C C N N N N N N Y N N Y N N - * RW|C C C N N N N N N N N N Y N N - * - - - - -| - * Deny R |C C C N N N N Y N N N N N Y N - * Read W |C C C N N N N N N N Y N N Y N - * RW|C C C N N N N N N N N N N Y N - * - - - - -| - * Deny R |2 C C N N N Y Y Y N N N Y Y Y - * None W |C C C N N N N N N Y Y Y Y Y Y - * RW|C C C N N N N N N N N N Y Y Y - * - * Legend: - * Y = open succeeds, - * N = open fails with error code 05h. - * C = open fails, INT 24 generated. - * 1 = open succeeds if file read-only, else fails with error code. - * 2 = open succeeds if file read-only, else fails with INT 24 - */ -#if !defined(__QNX__) -int sopen(const char *fn, int sh_access, int share, ...) -{ - int fd; - int pmode=S_IREAD; -#ifndef F_SANEWRLCKNO - int flock_op=LOCK_NB; /* non-blocking */ -#endif -#if defined(F_SANEWRLCKNO) || !defined(BSD) - struct flock alock = {0}; -#endif - va_list ap; - - if(sh_access&O_CREAT) { - va_start(ap,share); - pmode = va_arg(ap,unsigned int); - va_end(ap); - } - - if ((fd = open(fn, sh_access, pmode)) < 0) - return -1; - - if (share == SH_DENYNO || share == SH_COMPAT) /* no lock needed */ - return fd; -#if defined(F_SANEWRLCKNO) || !defined(BSD) - int cmd = F_SETLK; -#ifdef F_OFD_SETLK - cmd = F_OFD_SETLK; -#endif - /* use fcntl (doesn't work correctly with threads) */ - alock.l_type = share; - alock.l_whence = L_SET; - alock.l_start = 0; - alock.l_len = 0; /* lock to EOF */ - - if(fcntl(fd, cmd, &alock)==-1 && errno != EINVAL) { /* EINVAL means the file does not support locking */ - close(fd); - return -1; - } -#endif - -#if !defined(F_SANEWRLCKNO) && !defined(__QNX__) && !defined(__solaris__) - /* use flock (doesn't work over NFS) */ - if(share==SH_DENYRW) - flock_op|=LOCK_EX; - else /* SH_DENYWR */ - flock_op|=LOCK_SH; - if(flock(fd,flock_op)!=0 && errno != EOPNOTSUPP) { /* That object doesn't do locks */ - if(errno==EWOULDBLOCK) - errno=EAGAIN; - close(fd); - return(-1); - } -#endif - - return fd; -} -#endif /* !QNX */ - -#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__DMC__) - -#include <io.h> /* tell */ -#include <stdio.h> /* SEEK_SET */ -#include <sys/locking.h> /* _locking */ - -/* Fix MinGW locking.h typo */ -#if defined LK_UNLOCK && !defined LK_UNLCK - #define LK_UNLCK LK_UNLOCK -#endif - -int lock(int file, off_t offset, off_t size) -{ - int i; - off_t pos; - - pos=tell(file); - if(offset!=pos) - (void)lseek(file, offset, SEEK_SET); - i=_locking(file,LK_NBLCK,(long)size); - if(offset!=pos) - (void)lseek(file, pos, SEEK_SET); - return(i); -} - -int unlock(int file, off_t offset, off_t size) -{ - int i; - off_t pos; - - pos=tell(file); - if(offset!=pos) - (void)lseek(file, offset, SEEK_SET); - i=_locking(file,LK_UNLCK,(long)size); - if(offset!=pos) - (void)lseek(file, pos, SEEK_SET); - return(i); -} - -#endif /* !Unix && (MSVC || MinGW) */ - -#if defined(_WIN32 ) -static size_t -p2roundup(size_t n) -{ - if(n & (n-1)) { // If n isn't a power of two already... - n--; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; -#if SIZE_T_MAX > 0xffffffffU - n |= n >> 32; -#endif - n++; - } - return (n); -} - -static int expandtofit(char **linep, size_t len, size_t *linecapp) -{ - char *newline; - size_t newcap; - - if(len+1 >= LONG_MAX) - return -1; - if(len > *linecapp) { - if(len == LONG_MAX) - newcap = LONG_MAX; - else - newcap = p2roundup(len); - newline = (char *)realloc(*linep, newcap); - if(newline == NULL) - return -1; - *linecapp = newcap; - *linep = newline; - } - return 0; -} - -long getdelim(char **linep, size_t *linecapp, int delimiter, FILE *stream) -{ - size_t linelen; - int ch; - - if(linep == NULL || linecapp == NULL) - return -1; - if(*linep == NULL) - *linecapp = 0; - if(feof(stream)) { - if(expandtofit(linep, 1, linecapp)) - return -1; - (*linep)[0]=0; - return -1; - } - - linelen = 0; - for(;;) { - ch = fgetc(stream); - if(ch == EOF) - break; - if(expandtofit(linep, linelen+2, linecapp)) - return -1; - (*linep)[linelen++]=ch; - if(ch == delimiter) - break; - } - (*linep)[linelen]=0; - if(linelen==0) - return -1; - return linelen; -} -#endif - -#ifdef __unix__ -FILE *_fsopen(const char *pszFilename, const char *pszMode, int shmode) -{ - int file; - int Mode=0; - const char *p; - - for(p=pszMode;*p;p++) { - switch (*p) { - case 'r': - Mode |= 1; - break; - case 'w': - Mode |= 2; - break; - case 'a': - Mode |= 4; - break; - case '+': - Mode |= 8; - break; - case 'b': - case 't': - break; - default: - errno=EINVAL; - return(NULL); - } - } - switch(Mode) { - case 1: - Mode =O_RDONLY; - break; - case 2: - Mode=O_WRONLY|O_CREAT|O_TRUNC; - break; - case 4: - Mode=O_APPEND|O_WRONLY|O_CREAT; - break; - case 9: - Mode=O_RDWR|O_CREAT; - break; - case 10: - Mode=O_RDWR|O_CREAT|O_TRUNC; - break; - case 12: - Mode=O_RDWR|O_APPEND|O_CREAT; - break; - default: - errno=EINVAL; - return(NULL); - } - if(Mode&O_CREAT) - file=sopen(pszFilename,Mode,shmode,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - else - file=sopen(pszFilename,Mode,shmode); - if(file==-1) - return(NULL); - return(fdopen(file,pszMode)); -} -#endif diff --git a/xpdev/filewrap.h b/xpdev/filewrap.h deleted file mode 100644 index 706993d9ee0c6e1face3805c5f171f9e283c7c7a..0000000000000000000000000000000000000000 --- a/xpdev/filewrap.h +++ /dev/null @@ -1,181 +0,0 @@ -/* File system-call wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _FILEWRAP_H -#define _FILEWRAP_H - -#include "wrapdll.h" /* DLLEXPORT */ -#include "gen_defs.h" /* int32_t, int64_t */ - -#include <sys/stat.h> /* S_IREAD and S_IWRITE (for use with sopen) */ -#include <stdio.h> - -#if defined(__unix__) - #include <unistd.h> /* read, write, close, ftruncate, lseek, etc. */ -#endif - -#if defined(_WIN32) || defined(__BORLANDC__) - #include <io.h> -#endif - -#include <fcntl.h> /* O_RDONLY, O_CREAT, etc. */ - -/**********/ -/* Macros */ -/**********/ - -#if defined(_WIN32) - - - #include <windows.h> /* OF_SHARE_ */ - #include <share.h> /* SH_DENY */ - - #ifndef SH_DENYNO - #define SH_DENYNO OF_SHARE_DENY_NONE - #define SH_DENYWR OF_SHARE_DENY_WRITE - #define SH_DENYRW OF_SHARE_EXCLUSIVE - #endif - - #ifndef SH_COMPAT - #define SH_COMPAT 0 - #endif - - #if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64) - #define lseek _lseeki64 - #define tell _telli64 - #define filelength _filelengthi64 - #define stat _stati64 - #define fstat _fstati64 - #define fseeko _fseeki64 - #define ftello _ftelli64 - #else - #define fseeko fseek - #define ftello ftell - #endif - - #define mkstemp(t) _open(_mktemp(t), O_RDWR | O_CREAT | O_EXCL) - -#elif defined(__unix__) - - #ifdef __solaris__ - #define LOCK_NB 1 - #define LOCK_SH 2 - #define LOCK_EX 4 - #endif - - #ifdef __QNX__ - #include <share.h> - #define L_SET SEEK_SET - #else - #ifndef O_TEXT - #define O_TEXT 0 /* all files in binary mode on Unix */ - #define O_BINARY 0 /* all files in binary mode on Unix */ - #endif - #undef O_DENYNONE - #define O_DENYNONE (1<<31) /* req'd for Baja/nopen compatibility */ - - #define SH_DENYNO 2 /* no locks */ - #ifdef F_SANEWRLCKNO - #define SH_DENYRW F_SANEWRLCKNO /* exclusive lock */ - #else - #define SH_DENYRW F_WRLCK /* exclusive lock */ - #endif - - #ifdef F_SANERDLCKNO - #define SH_DENYWR F_SANERDLCKNO /* shareable lock */ - #else - #define SH_DENYWR F_RDLCK /* shareable lock */ - #endif - - #ifndef SH_COMPAT - #define SH_COMPAT 0 - #endif - #endif - - #ifndef DEFFILEMODE - #define DELFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) - #endif - - #define chsize(fd,size) ftruncate(fd,size) - #define tell(fd) lseek(fd,0,SEEK_CUR) - #define eof(fd) (tell(fd)==filelength(fd)) - -#elif defined(__OS2__) - - #include <share.h> /* SH_DENY */ - -#endif - -#ifndef DEFFILEMODE -#define DEFFILEMODE (S_IREAD|S_IWRITE) -#endif - -/* Standard file descriptors. */ -#ifndef STDIN_FILENO -#define STDIN_FILENO 0 /* Standard input */ -#define STDOUT_FILENO 1 /* Standard output */ -#define STDERR_FILENO 2 /* Standard error output */ -#endif - -#ifndef O_DENYNONE -#define O_DENYNONE SH_DENYNO -#endif - -#define CLOSE_OPEN_FILE(x) while((x) >= 0) { close(x); (x)=-1; break; } - -/**************/ -/* Prototypes */ -/**************/ - -#if defined(__cplusplus) -extern "C" { -#endif - -#if !defined(__BORLANDC__) && !defined(__WATCOMC__) - DLLEXPORT int lock(int fd, off_t pos, off_t len); - DLLEXPORT int unlock(int fd, off_t pos, off_t len); -#endif - -#if defined(_WIN32 ) - DLLEXPORT long getdelim(char **linep, size_t *linecapp, int delimiter, FILE *stream); -#endif - -#if !defined(__BORLANDC__) && defined(__unix__) - DLLEXPORT int sopen(const char* fn, int sh_access, int share, ...); - DLLEXPORT off_t filelength(int fd); -#endif - -#if defined(__unix__) - DLLEXPORT FILE * _fsopen(const char *pszFilename, const char *pszMode, int shmode); -#endif - -#if defined(_MSC_VER) && (_MSC_VER < 1300) /* missing prototypes */ - DLLEXPORT int _fseeki64(FILE*, int64_t, int origin); - DLLEXPORT int64_t _ftelli64(FILE*); -#endif - -DLLEXPORT time_t filetime(int fd); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/gen_defs.h b/xpdev/gen_defs.h deleted file mode 100644 index 405504c9440b0952c6c50dd02329219a342f70c7..0000000000000000000000000000000000000000 --- a/xpdev/gen_defs.h +++ /dev/null @@ -1,574 +0,0 @@ -/* General(ly useful) constant, macro, and type definitions */ - -/* $Id: gen_defs.h,v 1.85 2020/08/15 19:57:51 rswindell Exp $ */ -// vi: tabstop=4 - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _GEN_DEFS_H -#define _GEN_DEFS_H - -#include <xpdevplus.h> -#include "cp437defs.h" -#include <errno.h> - -/* Resolve multi-named errno constants */ -#if defined(EDEADLK) && !defined(EDEADLOCK) - #define EDEADLOCK EDEADLK -#endif - -#if defined(_WIN32) - #define WIN32_LEAN_AND_MEAN /* Don't bring in excess baggage */ - #include <windows.h> -#elif defined(__OS2__) - #define INCL_BASE /* need this for DosSleep prototype */ - #include <os2.h> -#else - #if (defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)) || defined (__NetBSD__) - #ifndef __unix__ - #define __unix__ - #endif - #endif -#endif - -#include <ctype.h> -#include <sys/types.h> -#ifdef HAS_INTTYPES_H -#if defined __cplusplus -#define __STDC_FORMAT_MACROS -#endif -#include <inttypes.h> -#else -#ifdef HAS_STDINT_H -#include <stdint.h> -#endif -#endif - - /* Control characters */ -#ifndef STX -#define STX 0x02 /* Start of text ^B */ -#endif -#ifndef ETX -#define ETX 0x03 /* End of text ^C */ -#endif -#ifndef BEL -#define BEL 0x07 /* Bell/beep ^G */ -#endif -#ifndef FF -#define FF 0x0c /* Form feed ^L */ -#endif -#ifndef ESC -#define ESC 0x1b /* Escape ^[ */ -#endif -#ifndef DEL -#define DEL 0x7f /* Delete ^BS */ -#endif -#ifndef BS -#define BS '\b' /* Back space ^H */ -#endif -#ifndef TAB -#define TAB '\t' /* Horizontal tabulation ^I */ -#endif -#ifndef LF -#define LF '\n' /* Line feed ^J */ -#endif -#ifndef CR -#define CR '\r' /* Carriage return ^M */ -#endif - -#ifndef CTRL_A -enum { - CTRL_AT // NUL - ,CTRL_A // SOH - ,CTRL_B // STX - ,CTRL_C // ETX - ,CTRL_D // EOT - ,CTRL_E // ENQ - ,CTRL_F // ACK - ,CTRL_G // BEL - ,CTRL_H // BS - ,CTRL_I // HT - ,CTRL_J // LF - ,CTRL_K // VT - ,CTRL_L // FF - ,CTRL_M // CR - ,CTRL_N // SO - ,CTRL_O // SI - ,CTRL_P // DLE - ,CTRL_Q // DC1 - ,CTRL_R // DC2 - ,CTRL_S // DC3 - ,CTRL_T // DC4 - ,CTRL_U // NAK - ,CTRL_V // SYN - ,CTRL_W // ETB - ,CTRL_X // CAN - ,CTRL_Y // EM - ,CTRL_Z // SUB - ,CTRL_OPEN_BRACKET // ESC - ,CTRL_BACKSLASH // FS - ,CTRL_CLOSE_BRACKET // GS - ,CTRL_CARET // RS - ,CTRL_UNDERSCORE // US - ,CTRL_QUESTION_MARK = 0x7f // DEL -}; -#endif - -/* Unsigned type short-hands */ -#ifndef uchar - #define uchar unsigned char -#endif -#ifndef ushort - #define ushort unsigned short - typedef unsigned int uint; /* Incompatible with Spidermonkey header files when #define'd */ - #define ulong unsigned long -#endif - -/* Printf format specifiers... */ -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) -#define XP_PRIsize_t "I" -#else -#define XP_PRIsize_t "z" -#endif - -#if !defined(HAS_INTTYPES_H) && !defined(XPDEV_DONT_DEFINE_INTTYPES) - -#if !defined(HAS_STDINT_H) - -typedef char int8_t; -#ifndef INT8_MAX -#define INT8_MAX 0x7f -#endif -#ifndef INT16_MAX -#define INT16_MAX (-0x7f-1) -#endif -typedef short int16_t; -#ifndef INT16_MAX -#define INT16_MAX 0x7fff -#endif -#ifndef INT16_MIN -#define INT16_MIN (-0x7fff-1) -#endif -typedef long int32_t; -#ifndef INT32_MAX -#define INT32_MAX 0x7fffffff -#endif -#ifndef INT32_MIN -#define INT32_MIN (-0x7fffffff-1) -#endif -typedef uchar uint8_t; -#ifndef UINT8_MAX -#define UINT8_MAX 0xff -#endif -typedef ushort uint16_t; -#ifndef UINT16_MAX -#define UINT16_MAX 0xffff -#endif -typedef ulong uint32_t; -#ifndef UINT32_MAX -#define UINT32_MAX 0xffffffff -#endif - -#endif - -#if !defined(__MSDOS__) -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) -typedef SSIZE_T ssize_t; -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; -#define INTTYPES_H_64BIT_PREFIX "I64" -#else -typedef signed long long int int64_t; -typedef unsigned long long int uint64_t; -#define INTTYPES_H_64BIT_PREFIX "ll" -#endif - -typedef uint64_t uintmax_t; -#define _UINTMAX_T_DECLARED -typedef int64_t intmax_t; -#define _INTMAX_T_DECLARED - -#if !defined(HAS_STDINT_H) && !defined(_UINTPTR_T_DEFINED) -typedef uintmax_t uintptr_t; -typedef intmax_t intptr_t; -#endif -#endif // !MSDOS - -/* printf integer formatters: */ - -#define PRId32 "d" -#define PRIu32 "u" -#define PRIi32 "i" -#define PRIx32 "x" -#define PRIX32 "X" -#define PRIo32 "o" - -#define PRIi64 INTTYPES_H_64BIT_PREFIX"i" -#define PRIu64 INTTYPES_H_64BIT_PREFIX"u" -#define PRId64 INTTYPES_H_64BIT_PREFIX"d" -#define PRIx64 INTTYPES_H_64BIT_PREFIX"x" -#define PRIX64 INTTYPES_H_64BIT_PREFIX"X" -#define PRIo64 INTTYPES_H_64BIT_PREFIX"o" - -#define PRIdMAX PRId64 -#define PRIiMAX PRIi64 -#define PRIuMAX PRIu64 -#define PRIxMAX PRIx64 -#define PRIXMAX PRIX64 -#define PRIoMAX PRIo64 - -/* scanf integer formatters: */ - -#define SCNd32 PRId32 -#define SCNi32 PRIi32 -#define SCNu32 PRIu32 -#define SCNx32 PRIx32 -#define SCNX32 PRIX32 -#define SCNo32 PRIo32 - -#define SCNd64 PRId64 -#define SCNi64 PRIi64 -#define SCNu64 PRIu64 -#define SCNx64 PRIx64 -#define SCNX64 PRIX64 -#define SCNo64 PRIo64 - -#define SCNdMAX PRId64 -#define SCNiMAX PRIi64 -#define SCNuMAX PRIu64 -#define SCNxMAX PRIx64 -#define SCNXMAX PRIX64 -#define SCNoMAX PRIo64 - -#endif - -/* Legacy 32-bit time_t */ -typedef int32_t time32_t; - -#if defined(_WIN32) -# if defined _MSC_VER && !defined _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64) -# define off_t int64_t -# define PRIdOFF PRId64 -# define PRIuOFF PRIu64 -# else -# define PRIdOFF "ld" -# define PRIuOFF "lu" -# endif -#elif defined(__linux__) || defined(__sun__) -# if (defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64)) || defined(__LP64__) -# define PRIdOFF PRId64 -# define PRIuOFF PRIu64 -# else -# define PRIdOFF "ld" -# define PRIuOFF "lu" -# endif -#else -# define PRIdOFF PRId64 -# define PRIuOFF PRIu64 -#endif - -/* Windows Types */ - -#ifndef _WIN32 -#ifndef BYTE -#define BYTE uint8_t -#endif -#ifndef WORD -#define WORD uint16_t -#endif -#ifndef DWORD -#define DWORD uint32_t -#endif -#ifndef BOOL -#define BOOL int -#endif - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif -#ifndef HANDLE -#define HANDLE void* -#endif -#endif - -#ifndef INT_TO_BOOL -#define INT_TO_BOOL(x) ((x)?TRUE:FALSE) -#endif - -/* Custom Types */ -typedef struct { - char* name; - char* value; -} named_string_t; - -typedef struct { - char* name; - int value; -} named_int_t; - -typedef struct { - char* name; - uint value; -} named_uint_t; - -typedef struct { - char* name; - long value; -} named_long_t; - -typedef struct { - char* name; - ulong value; -} named_ulong_t; - -typedef struct { - char* name; - short value; -} named_short_t; - -typedef struct { - char* name; - ushort value; -} named_ushort_t; - -typedef struct { - char* name; - float value; -} named_float_t; - -typedef struct { - char* name; - double value; -} named_double_t; - -typedef struct { - char* name; - BOOL value; -} named_bool_t; - -typedef struct { - int key; - char* value; -} keyed_string_t; - -typedef struct { - int key; - int value; -} keyed_int_t; - - -/************************/ -/* Handy Integer Macros */ -/************************/ - -/* Data Block Length Alignment Macro (returns required padding length for proper alignment) */ -#define PAD_LENGTH_FOR_ALIGNMENT(len,blk) (((len)%(blk))==0 ? 0 : (blk)-((len)%(blk))) - -#define HEX_DIGITS(n) ( n > 0xfffffff ? 8 \ - : n > 0x0ffffff ? 7 \ - : n > 0x00fffff ? 6 \ - : n > 0x000ffff ? 5 \ - : n > 0x0000fff ? 4 \ - : n > 0x00000ff ? 3 \ - : n > 0x000000f ? 2 : 1 ) -#define DEC_DIGITS(n) ( n < 10 ? 1 \ - : n < 100 ? 2 \ - : n < 1000 ? 3 \ - : n < 10000 ? 4 \ - : n < 100000 ? 5 \ - : n < 1000000 ? 6 \ - : n < 10000000 ? 7 \ - : n < 100000000 ? 8 \ - : n < 1000000000 ? 9 : 10 ) - -/***********************/ -/* Handy String Macros */ -/***********************/ - -/* Null-Terminate an ASCIIZ char array */ -#define TERMINATE(str) str[sizeof(str)-1]=0 - -/* This is a bound-safe version of strcpy basically - only works with fixed-length arrays */ -#ifdef SAFECOPY_USES_SPRINTF -#define SAFECOPY(dst,src) sprintf(dst,"%.*s",(int)sizeof(dst)-1,src) -#else /* strncpy is faster */ -#define SAFECOPY(dst,src) (strncpy(dst,src,sizeof(dst)), TERMINATE(dst)) -#endif - -#define SAFECAT(dst, src) do { \ - if(strlen((char*)(dst)) + strlen((char*)(src)) < sizeof(dst)) { \ - strcat((char*)(dst), (char*)(src)); \ - } \ -} while(0) - -/* Bound-safe version of sprintf() - only works with fixed-length arrays */ -#if (defined __FreeBSD__) || (defined __NetBSD__) || (defined __OpenBSD__) || (defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__)) -/* *BSD *nprintf() is already safe */ -#define SAFEPRINTF(dst,fmt,arg) snprintf(dst,sizeof(dst),fmt,arg) -#define SAFEPRINTF2(dst,fmt,a1,a2) snprintf(dst,sizeof(dst),fmt,a1,a2) -#define SAFEPRINTF3(dst,fmt,a1,a2,a3) snprintf(dst,sizeof(dst),fmt,a1,a2,a3) -#define SAFEPRINTF4(dst,fmt,a1,a2,a3,a4) snprintf(dst,sizeof(dst),fmt,a1,a2,a3,a4) -#else -#define SAFEPRINTF(dst,fmt,arg) snprintf(dst,sizeof(dst),fmt,arg), TERMINATE(dst) -#define SAFEPRINTF2(dst,fmt,a1,a2) snprintf(dst,sizeof(dst),fmt,a1,a2), TERMINATE(dst) -#define SAFEPRINTF3(dst,fmt,a1,a2,a3) snprintf(dst,sizeof(dst),fmt,a1,a2,a3), TERMINATE(dst) -#define SAFEPRINTF4(dst,fmt,a1,a2,a3,a4) snprintf(dst,sizeof(dst),fmt,a1,a2,a3,a4), TERMINATE(dst) -#endif - -/* Replace every occurrence of c1 in str with c2, using p as a temporary char pointer */ -#define REPLACE_CHARS(str,c1,c2,p) for((p)=(str);*(p);(p)++) if(*(p)==(c1)) *(p)=(c2); - -/* ASCIIZ char* parsing helper macros */ -/* These (unsigned char) typecasts defeat MSVC debug assertion when passed a negative value */ -#define IS_WHITESPACE(c) (isspace((unsigned char)(c)) || c == CP437_NO_BREAK_SPACE) -#define IS_CONTROL(c) iscntrl((unsigned char)(c)) -#define IS_ALPHA(c) isalpha((unsigned char)(c)) -#define IS_ALPHANUMERIC(c) isalnum((unsigned char)(c)) -#define IS_UPPERCASE(c) isupper((unsigned char)(c)) -#define IS_LOWERCASE(c) islower((unsigned char)(c)) -#define IS_PUNCTUATION(c) ispunct((unsigned char)(c)) -#define IS_PRINTABLE(c) isprint((unsigned char)(c)) -#define IS_DIGIT(c) isdigit((unsigned char)(c)) -#define IS_HEXDIGIT(c) isxdigit((unsigned char)(c)) -#define IS_OCTDIGIT(c) ((c) >= '0' && (c) <= '7') -#define SKIP_WHITESPACE(p) while((p) && *(p) && IS_WHITESPACE(*(p))) (p)++; -#define FIND_WHITESPACE(p) while((p) && *(p) && !IS_WHITESPACE(*(p))) (p)++; -#define SKIP_CHAR(p,c) while((p) && *(p)==c) (p)++; -#define FIND_CHAR(p,c) while((p) && *(p) && *(p)!=c) (p)++; -#define SKIP_CHARSET(p,s) while((p) && *(p) && strchr(s,*(p))!=NULL) (p)++; -#define FIND_CHARSET(p,s) while((p) && *(p) && strchr(s,*(p))==NULL) (p)++; -#define SKIP_CRLF(p) SKIP_CHARSET(p, "\r\n") -#define FIND_CRLF(p) FIND_CHARSET(p, "\r\n") -#define SKIP_ALPHA(p) while((p) && *(p) && IS_ALPHA(*(p))) (p)++; -#define FIND_ALPHA(p) while((p) && *(p) && !IS_ALPHA(*(p))) (p)++; -#define SKIP_ALPHANUMERIC(p) while((p) && *(p) && IS_ALPHANUMERIC(*(p))) (p)++; -#define FIND_ALPHANUMERIC(p) while((p) && *(p) && !IS_ALPHANUMERIC(*(p))) (p)++; -#define SKIP_DIGIT(p) while((p) && *(p) && IS_DIGIT(*(p))) (p)++; -#define FIND_DIGIT(p) while((p) && *(p) && !IS_DIGIT(*(p))) (p)++; -#define SKIP_HEXDIGIT(p) while((p) && *(p) && IS_HEXDIGIT(*(p))) (p)++; -#define FIND_HEXDIGIT(p) while((p) && *(p) && !IS_HEXDIGIT(*(p))) (p)++; - -#define HEX_CHAR_TO_INT(ch) (((ch)&0xf)+(((ch)>>6)&1)*9) -#define DEC_CHAR_TO_INT(ch) ((ch)&0xf) -#define OCT_CHAR_TO_INT(ch) ((ch)&0x7) - -/* Variable/buffer initialization (with zeros) */ -#define ZERO_VAR(var) memset(&(var),0,sizeof(var)) -#define ZERO_ARRAY(array) memset(array,0,sizeof(array)) - -/****************************************************************************/ -/* MALLOC/FREE Macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/* FAR16 is used to create a far (32-bit) pointer in 16-bit compilers */ -/* HUGE16 is used to create a huge (32-bit) pointer in 16-bit compilers */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #define HUGE16 huge - #define FAR16 far - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define HUGE16 - #define FAR16 - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - -/********************************/ -/* Handy Pointer-freeing Macros */ -/********************************/ -#define FREE_AND_NULL(x) do { \ - if((x)!=NULL) { \ - FREE(x); \ - (x)=NULL; \ - } \ - } while(0) -#define FREE_LIST_ITEMS(list,i) if(list!=NULL) { \ - for(i=0;list[i]!=NULL;i++) \ - FREE_AND_NULL(list[i]); \ - } -#define FREE_LIST(list,i) FREE_LIST_ITEMS(list,i) FREE_AND_NULL(list) - -/********************************/ -/* Other Pointer-List Macros */ -/********************************/ -#define COUNT_LIST_ITEMS(list,i) { i=0; if(list!=NULL) while(list[i]!=NULL) i++; } - -#if defined(__unix__) - #include <syslog.h> -#else - /* - * log priorities (copied from BSD syslog.h) - */ - #define LOG_EMERG 0 /* system is unusable */ - #define LOG_ALERT 1 /* action must be taken immediately */ - #define LOG_CRIT 2 /* critical conditions */ - #define LOG_ERR 3 /* error conditions */ - #define LOG_WARNING 4 /* warning conditions */ - #define LOG_NOTICE 5 /* normal but significant condition */ - #define LOG_INFO 6 /* informational */ - #define LOG_DEBUG 7 /* debug-level messages */ -#endif - -#ifdef WITH_SDL_AUDIO - #include <SDL.h> -#endif - -#endif /* Don't add anything after this #endif statement */ diff --git a/xpdev/genpack.pl b/xpdev/genpack.pl deleted file mode 100755 index 90d26f91117ca2f90e32de0a373342e721604740..0000000000000000000000000000000000000000 --- a/xpdev/genpack.pl +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/perl - -if($#ARGV != 2) { - print <<ENDOFUSAGE; -Usage: $0 infile.h outhead.h outprog.c - -ENDOFUSAGE - exit(1); -} - -my ($infile, $outhead, $outc) = @ARGV; -open IN,'<',$infile; - -while (<IN>) { - $header .= $_; -} -close IN; - -my $defs=''; -my $protos=''; -my $functions=''; - -my $count = 0; -my @structs = (); -while($header =~ m/struct\s+([^\s\r\n]*)[\s\r\n]+{([^}]*)}/gs) { - my($name, $def) = ($1,$2); - my ($packcode, $unpackcode, $size, @ints) = parse_defs($name, $def); - if(defined $size) { - $count++; - push @structs,"+ $name"; - $defs .= $size; - $protos .= "int pack_$name\_struct(char *buf, struct $name *data);\n"; - $protos .= "int unpack_$name\_struct(struct $name *data, char *buf);\n"; - $functions .= "int pack_$name\_struct(char *buf, struct $name *data)\n"; - $functions .= "{\n"; - $functions .= "\tchar\t*p;\n"; - if($#ints >= 0) { - $functions .= "\tint\t\t".join(', ',@ints).";\n"; - } - $functions .="\n\tp = buf;\n"; - $functions .= $packcode; - $functions .="\n\treturn((int)(p-buf));\n}\n\n"; - $functions .= "int unpack_$name\_struct(struct $name *data, char *buf)\n"; - $functions .= "{\n"; - $functions .= "\tchar\t*p;\n"; - if($#ints >= 0) { - $functions .= "\tint\t\t".join(', ',@ints).";\n"; - } - $functions .="\n\tp = buf;\n"; - $functions .= $unpackcode; - $functions .="\n\treturn((int)(p-buf));\n}\n\n"; - } - else { - push @structs,"! $name"; - } -} - -if($count) { - open HEAD,'>',$outhead; - open C,'>',$outc; - - print HEAD "/* Generated by genpack.pl from $infile on ".(scalar localtime(time))." */\n\n"; - my $macro = uc($outhead); - $macro=~s/[^A-Z0-9]/_/g; - print HEAD '#ifndef _INCLUDED_',$macro,"\n"; - print HEAD '#define _INCLUDED_',$macro,"\n\n"; - print HEAD "#include \"$infile\"\n#include \"xpendian.h\"\n\n"; - print HEAD "/* *_SIZE macros are the packed buffer size requred */\n"; - print HEAD $defs; - print HEAD "\n/* Function prototypes */\n"; - print HEAD "#if defined(__cplusplus)\nextern \"C\" {\n#endif\n"; - print HEAD $protos; - print HEAD "#if defined(__cplusplus)\n}\n#endif"; - print HEAD "\n\n"; - print HEAD "#endif /* Do not add anything after this line! */\n"; - close HEAD; - - open C,'>',$outc; - print HEAD "/* Generated by genpack.pl from $infile on ".(scalar localtime(time))." */\n\n"; - print C "#include \"$outhead\"\n\n"; - print C $functions; - print C "\n"; - close C; - - print "$count structures read successfully\n+ indicates functions were created\n! indicates a failure\n\n"; - print join("\n", @structs),"\n"; -} -else { - print "No structures imported... files not created.\n"; -} - -sub parse_defs -{ - my ($sname, $defs)=@_; - - my $packcode=''; - my $unpackcode=''; - my %vars=(); - my %sizes=(); - - # Remove comments - $defs=~s|/\*.*?\*/||gs; - my @lines=split(/[\r\n]+/, $defs); - foreach my $line (@lines) { - my ($p, $u); - my @newvars; - my $this_size=0; - chomp $line; - next if($line =~ /^\s*$/); - if($line =~ m/^\s*((?:char)|(?:BYTE)|(?:INT16)|(?:WORD)|(?:INT32)|(?:DWORD)|(?:float))\s+([^\s]+)\s*;\s*$/) { - my ($type, $name) = ($1, $2); - ($p, $u, @newvars) = parse_line(\%sizes, $type, $name, 0); - } - elsif($line =~ m/^\s*struct\s+([^\s]+)\s+([^\s]+)\s*;\s*$/) { - my ($struct, $name) = ($1, $2); - ($p, $u, @newvars) = parse_line(\%sizes, $struct, $name, 1); - } - else { - print "Cannot parse: $line\n"; - return(); - } - if(!defined $u) { - return(); - } - @vars{@newvars}=@newvars; - $packcode .= $p; - $unpackcode .= $u; - } - my $sizedef = '#define '.uc($sname)."_SIZE\t("; - foreach my $key (keys %sizes) { - if(defined $sizes{$key}{count} && !defined $sizes{$key}{multiplier}) { - if($sizes{$key}{count} == 1) { - $sizedef .= "$key + "; - } - else { - $sizedef .= "($key * $sizes{$key}{count}) + "; - } - } - elsif(!defined $sizes{$key}{count} && defined $sizes{$key}{multiplier}) { - $sizes{$key}{multiplier} = substr($sizes{$key}{multiplier}, 0, -3); - $sizedef .= "($key * ($sizes{$key}{multiplier})) + "; - } - elsif(defined $sizes{$key}{count} && defined $sizes{$key}{multiplier}) { - $sizes{$key}{multiplier} = substr($sizes{$key}{multiplier}, 0, -3); - $sizedef .= "($key * ($sizes{$key}{count} + $sizes{$key}{multiplier})) + "; - } - } - $sizedef = substr($sizedef, 0, -3) . ")\n"; - return($packcode, $unpackcode, $sizedef, sort keys %vars); -} - -sub parse_line -{ - my ($sizes, $type, $name, $struct) = @_; - my $tabs = "\t"; - my $end = ''; - my %vars=(); - my $nextint='i'; - my ($packcode, $unpackcode); - my $sizekey; - - if($struct) { - $sizekey = uc($type).'_SIZE'; - } - else { - $sizekey = "sizeof($type)"; - } - if($name =~ /\[/) { # Handle arrays! - while($name =~ s/\[([^\]]+)\]/;$nextint;/) { - my $size = $1; - $packcode .= $tabs."for($nextint = 0; $nextint < $size; $nextint++) {\n"; - $unpackcode .= $tabs."for($nextint = 0; $nextint < $size; $nextint++) {\n"; - $sizes->{$sizekey}{multiplier} .= "$size * "; - $end = "$tabs}\n$end"; - $tabs .= "\t"; - $vars{$nextint}=1; - $nextint=chr(ord($nextint)+1); - } - $sizes->{$sizekey}{multiplier} = substr($sizes->{$sizekey}{multiplier}, 0, -3); - $sizes->{$sizekey}{multiplier} .= ' + '; - $name =~ s/;(.);/[$1]/g; - } - else { - $sizes->{$sizekey}{count}++; - } - $name = "data->$name"; - my ($p, $u) = pack_line($type, $name, $struct, $tabs); - $p = "$packcode$p$end"; - $u = "$unpackcode$u$end"; - return($p, $u, sort keys %vars); -} - -sub pack_line -{ - my ($type, $name, $struct, $tabs)=@_; - my $packcode = ''; - my $unpackcode = ''; - - # ie: *(INT32)p = LE_LONG($name); - if(!$struct) { - if($type eq 'char') { - $packcode .= $tabs."*p = $name;\n"; - $packcode .= $tabs."p++;\n"; - $unpackcode .= $tabs."$name = *p;\n"; - $unpackcode .= $tabs."p++;\n"; - } - elsif($type eq 'BYTE') { - $packcode .= $tabs."*(BYTE *)p = $name;\n"; - $packcode .= $tabs."p++;\n"; - $unpackcode .= $tabs."$name = *(BYTE *)p;\n"; - $unpackcode .= $tabs."p++;\n"; - } - elsif($type eq 'INT16') { - $packcode .= $tabs."*(INT16 *)p = LE_SHORT($name);\n"; - $packcode .= $tabs."p += sizeof(INT16);\n"; - $unpackcode .= $tabs."$name = LE_SHORT(*(INT16 *)p);\n"; - $unpackcode .= $tabs."p += sizeof(INT16);\n"; - } - elsif($type eq 'WORD') { - $packcode .= $tabs."*(WORD *)p = LE_SHORT($name);\n"; - $packcode .= $tabs."p += sizeof(WORD);\n"; - $unpackcode .= $tabs."$name = LE_SHORT(*(WORD *)p);\n"; - $unpackcode .= $tabs."p += sizeof(WORD);\n"; - } - elsif($type eq 'INT32') { - $packcode .= $tabs."*(INT32 *)p = LE_LONG($name);\n"; - $packcode .= $tabs."p += sizeof(INT32);\n"; - $unpackcode .= $tabs."$name = LE_LONG(*(INT32 *)p);\n"; - $unpackcode .= $tabs."p += sizeof(INT32);\n"; - } - elsif($type eq 'DWORD') { - $packcode .= $tabs."*(DWORD *)p = LE_LONG($name);\n"; - $packcode .= $tabs."p += sizeof(DWORD);\n"; - $unpackcode .= $tabs."$name = LE_LONG(*(DWORD *)p);\n"; - $unpackcode .= $tabs."p += sizeof(DWORD);\n"; - } - elsif($type eq 'float') { - $packcode .= $tabs."*(DWORD *)p = LE_LONG(*((DWORD *)&($name)));\n"; - $packcode .= $tabs."p += sizeof(float);\n"; - $unpackcode .= $tabs."*(((DWORD *)&($name))) = LE_LONG(*(DWORD *)p);\n"; - $unpackcode .= $tabs."p += sizeof(DWORD);\n"; - } - else { - print "Unhandled type: $type\n"; - return(undef, undef); - } - } - else { - $packcode .= $tabs."p += pack_$type\_struct(p, &($name));\n"; - $unpackcode .= $tabs."p += unpack_$type\_struct(&($name), p);\n"; - } - - return($packcode, $unpackcode); -} diff --git a/xpdev/genwrap.c b/xpdev/genwrap.c deleted file mode 100644 index 04e9e06e6184b465e0413060f8a9602343452125..0000000000000000000000000000000000000000 --- a/xpdev/genwrap.c +++ /dev/null @@ -1,886 +0,0 @@ -/* General cross-platform development wrappers */ - -/* $Id: genwrap.c,v 1.118 2020/08/10 04:11:44 rswindell Exp $ */ -// vi: tabstop=4 - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* strlen() */ -#include <stdarg.h> /* vsnprintf() */ -#include <stdlib.h> /* RAND_MAX */ -#include <fcntl.h> /* O_NOCTTY */ -#include <time.h> /* clock() */ -#include <errno.h> /* errno */ -#include <ctype.h> /* toupper/tolower */ -#include <limits.h> /* CHAR_BIT */ -#include <math.h> /* fmod */ - -#if defined(__unix__) - #include <sys/ioctl.h> /* ioctl() */ - #include <sys/utsname.h> /* uname() */ - #include <signal.h> -#elif defined(_WIN32) - #include <windows.h> - #include <lm.h> /* NetWkstaGetInfo() */ -#endif - -#include "genwrap.h" /* Verify prototypes */ -#include "xpendian.h" /* BYTE_SWAP */ - -/****************************************************************************/ -/* Used to replace snprintf() guarantees to terminate. */ -/****************************************************************************/ -int safe_snprintf(char *dst, size_t size, const char *fmt, ...) -{ - va_list argptr; - int numchars; - - va_start(argptr,fmt); - numchars= vsnprintf(dst,size,fmt,argptr); - va_end(argptr); - if (size > 0) - dst[size-1]=0; -#ifdef _MSC_VER - if(numchars==-1) - numchars=strlen(dst); -#endif - if(numchars>=(int)size && numchars>0) - numchars=size-1; - return(numchars); -} - -#ifdef NEEDS_STRLCPY -size_t strlcpy(char *dst, const char *src, size_t size) -{ - size_t i; - - if(size < 1) - return 0; - - for(i = 0; src[i] != '\0'; i++) { - if(i < (size - 1)) - *(dst++) = src[i]; - } - *dst = 0; - return i; -} -#endif - -#ifdef _WIN32 -/****************************************************************************/ -/* Case insensitive version of strstr() - currently heavy-handed */ -/****************************************************************************/ -char* strcasestr(const char* haystack, const char* needle) -{ - const char* p; - size_t len = strlen(needle); - - for(p = haystack; *p != '\0'; p++) { - if(strnicmp(p, needle, len) == 0) - return (char*)p; - } - return NULL; -} -#endif - -/****************************************************************************/ -/* Return last character of string */ -/****************************************************************************/ -char* lastchar(const char* str) -{ - size_t len; - - len = strlen(str); - - if(len) - return((char*)&str[len-1]); - - return((char*)str); -} - -/****************************************************************************/ -/* Return character value of C-escaped (\) character */ -/****************************************************************************/ -char c_unescape_char(const char ch) -{ - switch(ch) { - case 'e': return(ESC); /* non-standard */ - case 'a': return('\a'); - case 'b': return('\b'); - case 'f': return('\f'); - case 'n': return('\n'); - case 'r': return('\r'); - case 't': return('\t'); - case 'v': return('\v'); - } - return(ch); -} - -/****************************************************************************/ -/* Return character value of C-escaped (\) character literal sequence */ -/* supports \x## (hex) and \### sequences (for octal or decimal) */ -/****************************************************************************/ -char c_unescape_char_ptr(const char* str, char** endptr) -{ - char ch; - - if(*str == 'x') { - int digits = 0; // \x## for hexadecimal character literals (only 2 digits supported) - ++str; - ch = 0; - while(digits < 2 && IS_HEXDIGIT(*str)) { - ch *= 0x10; - ch += HEX_CHAR_TO_INT(*str); - str++; - digits++; - } -#ifdef C_UNESCAPE_OCTAL_SUPPORT - } else if(IS_OCTDIGIT(*str)) { - int digits = 0; // \### for octal character literals (only 3 digits supported) - ch = 0; - while(digits < 3 && IS_OCTDIGIT(*str)) { - ch *= 8; - ch += OCT_CHAR_TO_INT(*str); - str++; - digits++; - } -#else - } else if(IS_DIGIT(*str)) { - int digits = 0; // \### for decimal character literals (only 3 digits supported) - ch = 0; - while(digits < 3 && IS_DIGIT(*str)) { - ch *= 10; - ch += DEC_CHAR_TO_INT(*str); - str++; - digits++; - } -#endif - } else - ch=c_unescape_char(*(str++)); - - if(endptr!=NULL) - *endptr=(char*)str; - - return ch; -} - -/****************************************************************************/ -/* Unescape a C string, in place */ -/****************************************************************************/ -char* c_unescape_str(char* str) -{ - char ch; - char* buf; - char* src; - char* dst; - - if(str==NULL || (buf=strdup(str))==NULL) - return(NULL); - - src=buf; - dst=str; - while((ch=*(src++))!=0) { - if(ch=='\\') /* escape */ - ch=c_unescape_char_ptr(src,&src); - *(dst++)=ch; - } - *dst=0; - free(buf); - return(str); -} - -char* c_escape_char(char ch) -{ - switch(ch) { - case 0: return("\\x00"); - case 1: return("\\x01"); - case ESC: return("\\e"); /* non-standard */ - case '\a': return("\\a"); - case '\b': return("\\b"); - case '\f': return("\\f"); - case '\n': return("\\n"); - case '\r': return("\\r"); - case '\t': return("\\t"); - case '\v': return("\\v"); - case '\\': return("\\\\"); - case '\"': return("\\\""); - case '\'': return("\\'"); - } - return(NULL); -} - -char* c_escape_str(const char* src, char* dst, size_t maxlen, BOOL ctrl_only) -{ - const char* s; - char* d; - const char* e; - - for(s=src,d=dst;*s && (size_t)(d-dst)<maxlen;s++) { - if((!ctrl_only || (uchar)*s < ' ') && (e=c_escape_char(*s))!=NULL) { - strncpy(d,e,maxlen-(d-dst)); - d+=strlen(d); - } else if((uchar)*s < ' ') { - d += safe_snprintf(d, maxlen-(d-dst), "\\x%02X", *s); - } else *d++=*s; - } - *d=0; - - return(dst); -} - -/* Returns a byte count parsed from the 'str' argument, supporting power-of-2 - * short-hands (e.g. 'K' for kibibytes). - * If 'unit' is specified (greater than 1), result is divided by this amount. - * - * Moved from ini_file.c/parseBytes() - */ -int64_t parse_byte_count(const char* str, ulong unit) -{ - char* p=NULL; - double bytes; - - bytes=strtod(str,&p); - if(p!=NULL) { - SKIP_WHITESPACE(p); - switch(toupper(*p)) { - case 'E': - bytes*=1024; - /* fall-through */ - case 'P': - bytes*=1024; - /* fall-through */ - case 'T': - bytes*=1024; - /* fall-through */ - case 'G': - bytes*=1024; - /* fall-through */ - case 'M': - bytes*=1024; - /* fall-through */ - case 'K': - bytes*=1024; - break; - } - } - return((int64_t)(unit>1 ? (bytes/unit):bytes)); -} - -static const double one_tebibyte = 1024.0*1024.0*1024.0*1024.0; -static const double one_gibibyte = 1024.0*1024.0*1024.0; -static const double one_mebibyte = 1024.0*1024.0; -static const double one_kibibyte = 1024.0; - -/* Convert an exact byte count to a string with a floating point value - and a single letter multiplier/suffix. - For values evenly divisible by 1024, no suffix otherwise. -*/ -char* byte_count_to_str(int64_t bytes, char* str, size_t size) -{ - if(bytes && fmod((double)bytes,one_tebibyte)==0) - safe_snprintf(str, size, "%gT",bytes/one_tebibyte); - else if(bytes && fmod((double)bytes,one_gibibyte)==0) - safe_snprintf(str, size, "%gG",bytes/one_gibibyte); - else if(bytes && fmod((double)bytes,one_mebibyte)==0) - safe_snprintf(str, size, "%gM",bytes/one_mebibyte); - else if(bytes && fmod((double)bytes,one_kibibyte)==0) - safe_snprintf(str, size, "%gK",bytes/one_kibibyte); - else - safe_snprintf(str, size, "%"PRIi64, bytes); - - return str; -} - -/* Convert a rounded byte count to a string with a floating point value - with a single decimal place and a single letter multiplier/suffix. - This function also appends 'B' for exact byte counts (< 1024). - 'unit' is the smallest divisor used. -*/ -char* byte_estimate_to_str(int64_t bytes, char* str, size_t size, ulong unit, int precision) -{ - if(bytes >= one_tebibyte) - safe_snprintf(str, size, "%1.*fT", precision, bytes/one_tebibyte); - else if(bytes >= one_gibibyte || unit == one_gibibyte) - safe_snprintf(str, size, "%1.*fG", precision, bytes/one_gibibyte); - else if(bytes >= one_mebibyte || unit == one_mebibyte) - safe_snprintf(str, size, "%1.*fM", precision, bytes/one_mebibyte); - else if(bytes >= one_kibibyte || unit == one_kibibyte) - safe_snprintf(str, size, "%1.*fK", precision, bytes/one_kibibyte); - else - safe_snprintf(str, size, "%"PRIi64"B", bytes); - - return str; -} - - -/* Parse a duration string, default unit is in seconds */ -/* (Y)ears, (W)eeks, (D)ays, (H)ours, and (M)inutes */ -/* suffixes/multipliers are supported. */ -/* Return value is in seconds */ -double parse_duration(const char* str) -{ - char* p=NULL; - double t; - - t=strtod(str,&p); - if(p!=NULL) { - SKIP_WHITESPACE(p); - switch(toupper(*p)) { - case 'Y': t*=365.0*24.0*60.0*60.0; break; - case 'W': t*= 7.0*24.0*60.0*60.0; break; - case 'D': t*= 24.0*60.0*60.0; break; - case 'H': t*= 60.0*60.0; break; - case 'M': t*= 60.0; break; - } - } - return t; -} - -/* Convert a duration (in seconds) to a string - * with a single letter multiplier/suffix: - * (Y)ears, (W)eeks, (D)ays, (H)ours, (M)inutes, or (S)econds - */ -char* duration_to_str(double value, char* str, size_t size) -{ - if(value && fmod(value,365.0*24.0*60.0*60.0)==0) - safe_snprintf(str, size, "%gY",value/(365.0*24.0*60.0*60.0)); - else if(value && fmod(value,7.0*24.0*60.0*60.0)==0) - safe_snprintf(str, size, "%gW",value/(7.0*24.0*60.0*60.0)); - else if(value && fmod(value,24.0*60.0*60.0)==0) - safe_snprintf(str, size, "%gD",value/(24.0*60.0*60.0)); - else if(value && fmod(value,60.0*60.0)==0) - safe_snprintf(str, size, "%gH",value/(60.0*60.0)); - else if(value && fmod(value,60.0)==0) - safe_snprintf(str, size, "%gM",value/60.0); - else - safe_snprintf(str, size, "%gS",value); - - return str; -} - -/* Convert a duration (in seconds) to a verbose string - * with a word clarifier / modifier: - * year[s], week[s], day[s], hour[s], minute[s] or second[s] - */ -char* duration_to_vstr(double value, char* str, size_t size) -{ - if(value && fmod(value,365.0*24.0*60.0*60.0)==0) { - value /= (365.0*24.0*60.0*60.0); - safe_snprintf(str, size, "%g year%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,7.0*24.0*60.0*60.0)==0) { - value /= (7.0*24.0*60.0*60.0); - safe_snprintf(str, size, "%g week%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,24.0*60.0*60.0)==0) { - value /= (24.0*60.0*60.0); - safe_snprintf(str, size, "%g day%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,60.0*60.0)==0) { - value /= (60.0*60.0); - safe_snprintf(str, size, "%g hour%s", value, value == 1 ? "":"s"); - } - else if(value && fmod(value,60.0)==0) { - value /= 60.0; - safe_snprintf(str, size, "%g minute%s", value, value == 1 ? "":"s"); - } - else - safe_snprintf(str, size, "%g second%s", value, value == 1 ? "":"s"); - - return str; -} - - -/****************************************************************************/ -/* Convert ASCIIZ string to upper case */ -/****************************************************************************/ -#if defined(__unix__) -char* strupr(char* str) -{ - char* p=str; - - while(*p) { - *p=toupper(*p); - p++; - } - return(str); -} -/****************************************************************************/ -/* Convert ASCIIZ string to lower case */ -/****************************************************************************/ -char* strlwr(char* str) -{ - char* p=str; - - while(*p) { - *p=tolower(*p); - p++; - } - return(str); -} -/****************************************************************************/ -/* Reverse characters of a string (provided by amcleod) */ -/****************************************************************************/ -char* strrev(char* str) -{ - char t, *i=str, *j=str+strlen(str); - - while (i<j) { - t=*i; *(i++)=*(--j); *j=t; - } - return str; -} -#endif - -#if !defined(__unix__) - -/****************************************************************************/ -/* Implementations of the recursive (thread-safe) version of strtok */ -/* Thanks to Apache Portable Runtime (APR) */ -/****************************************************************************/ -char* strtok_r(char *str, const char *delim, char **last) -{ - char* token; - - if (str==NULL) /* subsequent call */ - str = *last; /* start where we left off */ - - /* skip characters in delimiter (will terminate at '\0') */ - while(*str && strchr(delim, *str)) - ++str; - - if(!*str) { /* no more tokens */ - *last = str; - return NULL; - } - - token = str; - - /* skip valid token characters to terminate token and - * prepare for the next call (will terminate at '\0) - */ - *last = token + 1; - while(**last && !strchr(delim, **last)) - ++*last; - - if (**last) { - **last = '\0'; - ++*last; - } - - return token; -} - -#endif - -/****************************************************************************/ -/* Initialize (seed) the random number generator */ -/****************************************************************************/ -void xp_randomize(void) -{ -#if !(defined(HAS_SRANDOMDEV_FUNC) && defined(HAS_RANDOM_FUNC)) - unsigned seed=~0; -#if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV) - int rf; -#endif -#endif - -#if defined(HAS_SRANDOMDEV_FUNC) && defined(HAS_RANDOM_FUNC) - srandomdev(); - return; -#else - -#if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV) - if((rf=open(URANDOM_DEV, O_RDONLY))!=-1) { - read(rf, &seed, sizeof(seed)); - close(rf); - } - else { -#endif - unsigned curtime = (unsigned)time(NULL); - unsigned process_id = (unsigned)GetCurrentProcessId(); - - seed = curtime ^ BYTE_SWAP_INT(process_id); - - #if defined(_WIN32) || defined(GetCurrentThreadId) - seed ^= (unsigned)GetCurrentThreadId(); - #endif - -#if defined(HAS_DEV_URANDOM) && defined(URANDOM_DEV) - } -#endif - -#ifdef HAS_RANDOM_FUNC - srandom(seed); -#else - srand(seed); -#endif -#endif -} - -/****************************************************************************/ -/* Return random number between 0 and n-1 */ -/****************************************************************************/ -long xp_random(int n) -{ -#ifdef HAS_RANDOM_FUNC - long curr; - unsigned long limit; - - if(n<2) - return(0); - - limit = ((1UL<<((sizeof(long)*CHAR_BIT)-1)) / n) * n - 1; - - while(1) { - curr=random(); - if(curr <= limit) - return(curr % n); - } -#else - double f=0; - int ret; - - if(n<2) - return(0); - do { - f=(double)rand()/(double)(RAND_MAX+1); - ret=(int)(n*f); - } while(ret==n); - - return(ret); -#endif -} - -/****************************************************************************/ -/* Return ASCII string representation of ulong */ -/* There may be a native GNU C Library function to this... */ -/****************************************************************************/ -#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__WATCOMC__) -char* ultoa(ulong val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%lo",val); - break; - case 10: - sprintf(str,"%lu",val); - break; - case 16: - sprintf(str,"%lx",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} -#endif - -/****************************************************************************/ -/* Write the version details of the current operating system into str */ -/****************************************************************************/ -char* os_version(char *str) -{ -#if defined(__OS2__) && defined(__BORLANDC__) - - sprintf(str,"OS/2 %u.%u (%u.%u)",_osmajor/10,_osminor/10,_osmajor,_osminor); - -#elif defined(_WIN32) - - /* Windows Version */ - char* winflavor=""; - OSVERSIONINFO winver; - - winver.dwOSVersionInfoSize=sizeof(winver); - GetVersionEx(&winver); - - switch(winver.dwPlatformId) { - case VER_PLATFORM_WIN32_NT: - winflavor="NT "; - break; - case VER_PLATFORM_WIN32s: - winflavor="Win32s "; - break; - case VER_PLATFORM_WIN32_WINDOWS: - winver.dwBuildNumber&=0xffff; - break; - } - - /* Work-around Microsoft Windows 8.1 stupidity where GetVersionEx() lies about the current OS version */ - if(winver.dwMajorVersion == 6 && winver.dwMinorVersion == 2) { - WKSTA_INFO_100* wksta_info; - if(NetWkstaGetInfo(NULL, 100, (LPBYTE*)&wksta_info) == NERR_Success) { - winver.dwMajorVersion = wksta_info->wki100_ver_major; - winver.dwMinorVersion = wksta_info->wki100_ver_minor; - winver.dwBuildNumber = 0; - } - } - - sprintf(str,"Windows %sVersion %lu.%lu" - ,winflavor - ,winver.dwMajorVersion, winver.dwMinorVersion); - if(winver.dwBuildNumber) - sprintf(str+strlen(str), " (Build %lu)", winver.dwBuildNumber); - if(winver.szCSDVersion[0]) - sprintf(str+strlen(str), " %s", winver.szCSDVersion); - -#elif defined(__unix__) - - struct utsname unixver; - - if(uname(&unixver)<0) - sprintf(str,"Unix (uname errno: %d)",errno); - else - sprintf(str,"%s %s %s" - ,unixver.sysname /* e.g. "Linux" */ - ,unixver.release /* e.g. "2.2.14-5.0" */ - ,unixver.machine /* e.g. "i586" */ - ); - -#else /* DOS */ - - sprintf(str,"DOS %u.%02u",_osmajor,_osminor); - -#endif - - return(str); -} - -char* os_cmdshell(void) -{ - char* shell=getenv(OS_CMD_SHELL_ENV_VAR); - -#if defined(__unix__) - if(shell==NULL) -#ifdef _PATH_BSHELL - shell=_PATH_BSHELL; -#else - shell="/bin/sh"; -#endif -#endif - - return(shell); -} - -/****************************************************************/ -/* Microsoft (DOS/Win32) real-time system clock implementation. */ -/****************************************************************/ -#ifdef __unix__ -clock_t msclock(void) -{ - return (clock_t)(llroundl(xp_timer() * 1000.0)); -} -#endif - -/****************************************************************************/ -/* Skips all white-space chars at beginning of 'str' */ -/****************************************************************************/ -char* skipsp(char* str) -{ - SKIP_WHITESPACE(str); - return(str); -} - -/****************************************************************************/ -/* Truncates all white-space chars off end of 'str' (needed by STRERRROR) */ -/****************************************************************************/ -char* truncsp(char* str) -{ - size_t i,len; - - if(str!=NULL) { - i=len=strlen(str); - while(i && IS_WHITESPACE(str[i-1])) - i--; - if(i!=len) - str[i]=0; /* truncate */ - } - return(str); -} - -/****************************************************************************/ -/* Truncates common white-space chars off end of \n-terminated lines in */ -/* 'dst' and retains original line break format (e.g. \r\n or \n) */ -/****************************************************************************/ -char* truncsp_lines(char* dst) -{ - char* sp; - char* dp; - char* src; - - if((src=strdup(dst))==NULL) - return(dst); - - for(sp=src, dp=dst; *sp!=0; sp++) { - if(*sp=='\n') { - while(dp!=dst - && (*(dp-1)==' ' || *(dp-1)=='\t' || *(dp-1)=='\r')) - dp--; - if(sp!=src && *(sp-1)=='\r') - *(dp++)='\r'; - } - *(dp++)=*sp; - } - *dp=0; - - free(src); - return(dst); -} - -/****************************************************************************/ -/* Truncates carriage-return and line-feed chars off end of 'str' */ -/****************************************************************************/ -char* truncnl(char* str) -{ - size_t i,len; - - if(str!=NULL) { - i=len=strlen(str); - while(i && (str[i-1]=='\r' || str[i-1]=='\n')) - i--; - if(i!=len) - str[i]=0; /* truncate */ - } - return(str); -} - -/****************************************************************************/ -/* Return errno from the proper C Library implementation */ -/* (single/multi-threaded) */ -/****************************************************************************/ -int get_errno(void) -{ - return(errno); -} - -/****************************************************************************/ -/* Returns the current value of the systems best timer (in SECONDS) */ -/* Any value < 0 indicates an error */ -/****************************************************************************/ -long double xp_timer(void) -{ - long double ret; -#if defined(__unix__) - struct timespec ts; - - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - ret = ts.tv_sec; - ret += ((long double)ts.tv_nsec) / 1000000000; - } - else - ret = -1; -#elif defined(_WIN32) - LARGE_INTEGER freq; - LARGE_INTEGER tick; - if(QueryPerformanceFrequency(&freq) && QueryPerformanceCounter(&tick)) { -#if 0 - ret=((long double)tick.HighPart*4294967296)+((long double)tick.LowPart); - ret /= ((long double)freq.HighPart*4294967296)+((long double)freq.LowPart); -#else - /* In MSVC, a long double does NOT have 19 decimals of precision */ - ret=(((long double)(tick.QuadPart%freq.QuadPart))/freq.QuadPart); - ret+=tick.QuadPart/freq.QuadPart; -#endif - } - else { - ret=GetTickCount(); - ret /= 1000; - } -#else -#error no high-resolution time for this platform -#endif - return(ret); -} - -/* Returns TRUE if specified process is running */ -BOOL check_pid(pid_t pid) -{ -#if defined(__unix__) - return(kill(pid,0)==0); -#elif defined(_WIN32) - HANDLE h; - BOOL result=FALSE; - - if((h=OpenProcess(PROCESS_QUERY_INFORMATION,/* inheritable: */FALSE, pid)) != NULL) { - DWORD code; - if(GetExitCodeProcess(h,(PDWORD)&code)==TRUE && code==STILL_ACTIVE) - result=TRUE; - CloseHandle(h); - } - return result; -#else - return FALSE; /* Need check_pid() definition! */ -#endif -} - -/* Terminate (unconditionally) the specified process */ -BOOL terminate_pid(pid_t pid) -{ -#if defined(__unix__) - return(kill(pid,SIGKILL)==0); -#elif defined(_WIN32) - HANDLE h; - BOOL result=FALSE; - - if((h=OpenProcess(PROCESS_TERMINATE,/* inheritable: */FALSE, pid)) != NULL) { - if(TerminateProcess(h,255)) - result=TRUE; - CloseHandle(h); - } - return result; -#else - return FALSE; /* Need check_pid() definition! */ -#endif -} - -/****************************************************************************/ -/* Re-entrant (thread-safe) version of strerror() */ -/* GNU (not POSIX) inspired API */ -/****************************************************************************/ -char* safe_strerror(int errnum, char *buf, size_t buflen) -{ - strncpy(buf, "Unknown error", buflen); - buf[buflen - 1] = 0; - -#if defined(_MSC_VER) - strerror_s(buf, buflen, errnum); -#elif defined(_WIN32) - strncpy(buf, strerror(errnum), buflen); - buf[buflen - 1] = 0; -#elif defined(_GNU_SOURCE) - buf = strerror_r(errnum, buf, buflen); -#else - strerror_r(errnum, buf, buflen); -#endif - return buf; -} diff --git a/xpdev/genwrap.h b/xpdev/genwrap.h deleted file mode 100644 index e888aa02fa693c6de1820d0709c4f63b27f6401b..0000000000000000000000000000000000000000 --- a/xpdev/genwrap.h +++ /dev/null @@ -1,399 +0,0 @@ -/* General cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _GENWRAP_H -#define _GENWRAP_H - -#include <stdio.h> /* sprintf */ -#include <string.h> /* strerror() */ -#include <time.h> /* clock_t */ -#include "gen_defs.h" /* ulong */ -#include "wrapdll.h" /* DLLEXPORT and */ - -#if defined(__unix__) - #include <sched.h> /* sched_yield */ - #include <time.h> /* clock_t */ - #include <sys/time.h> /* struct timeval */ - #include <strings.h> /* strcasecmp() */ - #include <unistd.h> /* usleep */ - - #ifdef XPDEV_THREAD_SAFE - #include <pthread.h>/* Check for GNU PTH libs */ - #ifdef _PTH_PTHREAD_H_ - #include <pth.h> - #endif - #define GetCurrentThreadId() pthread_self() - #endif -#elif defined(_WIN32) - #include <process.h> /* getpid() */ - #ifndef __MINGW32__ - typedef DWORD pid_t; - #endif -#endif - -#if !defined(_WIN32) - /* Simple Win32 function equivalents */ - #define GetCurrentProcessId() getpid() -#endif - -/* utime() support */ -#if defined(_MSC_VER) || defined(__WATCOMC__) - #include <sys/utime.h> -#else - #include <utime.h> -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -/* - * The alloca() function can't be implemented in C, and on some - * platforms it can't be implemented at all as a callable function. - * The GNU C compiler provides a built-in alloca() which we can use; - * On platforms where alloca() is not in libc, programs which use - * it will fail to link when compiled with non-GNU compilers. - */ -#if __GNUC__ >= 2 || defined(__INTEL_COMPILER) -#undef alloca /* some GNU bits try to get cute and define this on their own */ -#define alloca(sz) __builtin_alloca(sz) -#elif defined(_WIN32) -#include <malloc.h> -#endif - -/*********************/ -/* Compiler-specific */ -/*********************/ - -/* Compiler Description */ -#if defined(__BORLANDC__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"BCC %X.%02X" \ - ,__BORLANDC__>>8,__BORLANDC__&0xff); - -#elif defined(_MSC_VER) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"MSC %u", _MSC_VER); - -#elif defined(__clang__) && defined(__clang_patchlevel__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF3(str,"Clang %u.%u.%u" \ - ,__clang_major__,__clang_minor__,__clang_patchlevel__); - -#elif defined(__clang__) && defined(__clang_minor__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"Clang %u.%u" \ - ,__clang_major__,__clang_minor__); - -#elif defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF3(str,"GCC %u.%u.%u" \ - ,__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__); - -#elif defined(__GNUC__) && defined(__GNUC_MINOR__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF2(str,"GCC %u.%u" \ - ,__GNUC__,__GNUC_MINOR__); - -#elif defined(__WATCOMC__) - - #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"WATC %d" \ - ,__WATCOMC__); - -#elif defined(__DMC__) /* Digital Mars C/C++ */ - - #define DESCRIBE_COMPILER(str) SAFEPRINTF(str,"DMC %X.%02X" \ - ,__DMC__>>8,__DMC__&0xff); - -#else /* Unknown compiler */ - - #define DESCRIBE_COMPILER(str) SAFECOPY(str,"UNKNOWN COMPILER"); - -#endif - -/**********/ -/* Macros */ -/**********/ - -/* Target Platform Description */ -#if defined(_WIN64) - #define PLATFORM_DESC "Win64" -#elif defined(_WIN32) - #define PLATFORM_DESC "Win32" -#elif defined(__OS2__) - #define PLATFORM_DESC "OS/2" -#elif defined(__MSDOS__) - #define PLATFORM_DESC "DOS" -#elif defined(__linux__) - #define PLATFORM_DESC "Linux" -#elif defined(__FreeBSD__) - #define PLATFORM_DESC "FreeBSD" -#elif defined(__OpenBSD__) - #define PLATFORM_DESC "OpenBSD" -#elif defined(__NetBSD__) - #define PLATFORM_DESC "NetBSD" -#elif defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__) - #define PLATFORM_DESC "MacOSX" -#elif defined(BSD) - #define PLATFORM_DESC "BSD" -#elif defined(__solaris__) - #define PLATFORM_DESC "Solaris" -#elif defined(__sun__) - #define PLATFORM_DESC "SunOS" -#elif defined(__gnu__) - #define PLATFORM_DESC "GNU/Hurd" -#elif defined(__QNX__) - #define PLATFORM_DESC "QNX" -#elif defined(__unix__) - #define PLATFORM_DESC "Unix" -#elif defined(__HAIKU__) - #define PLATFORM_DESC "Haiku" -#else - #error "Need to describe target platform" -#endif - -#if defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__amd64__) - #define ARCHITECTURE_DESC "x64" -#elif defined(__i386__) || _M_IX86 == 300 - #define ARCHITECTURE_DESC "i386" -#elif defined(__i486__) || _M_IX86 == 400 - #define ARCHITECTURE_DESC "i486" -#elif defined(__i586__) || _M_IX86 == 500 - #define ARCHITECTURE_DESC "i586" -#elif defined(__i686__) || _M_IX86 == 600 - #define ARCHITECTURE_DESC "i686" -#elif defined(__i786__) || _M_IX86 == 700 - #define ARCHITECTURE_DESC "i786" -#elif defined(_X86_) || defined(__x86__) || defined(_M_IX86) - #define ARCHITECTURE_DESC "x86" -#elif defined(__mips__) - #define ARCHITECTURE_DESC "mips" -#elif __ARM_ARCH == 5 || _M_ARM == 5 - #define ARCHITECTURE_DESC "armv5" -#elif __ARM_ARCH == 6 || _M_ARM == 6 - #define ARCHITECTURE_DESC "armv6" -#elif __ARM_ARCH == 7 || _M_ARM == 7 - #define ARCHITECTURE_DESC "armv7" -#elif __ARM_ARCH == 8 || _M_ARM == 8 - #define ARCHITECTURE_DESC "armv8" -#elif defined(__aarch64__) - #define ARCHITECTURE_DESC "arm64" -#elif defined(__arm__) - #define ARCHITECTURE_DESC "arm" -#elif defined(_M_PPC) || defined(__ppc__) - #define ARCHITECTURE_DESC "ppc" -#elif defined(_M_IA64) || defined(__ia64__) - #define ARCHITECTURE_DESC "ia64" -#else - #error "Need to describe target architecture" -#endif - -/*********************/ -/* String Functionss */ -/*********************/ - -#ifndef USE_SNPRINTF - #define snprintf safe_snprintf -#endif - -#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__DMC__) -#if !defined(snprintf) - #define snprintf _snprintf -#endif - #define vsnprintf _vsnprintf - #define NEEDS_STRLCPY -#endif - -#if defined(__WATCOMC__) - #define vsnprintf(s,l,f,a) vsprintf(s,f,a) -#endif - -#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__WATCOMC__) - DLLEXPORT char* ultoa(ulong, char*, int radix); -#endif - -#if defined(__unix__) - DLLEXPORT char* strupr(char* str); - DLLEXPORT char* strlwr(char* str); - DLLEXPORT char* strrev(char* str); - #if !defined(stricmp) - #define stricmp strcasecmp - #define strnicmp strncasecmp - #endif -#endif - -#if defined(NEEDS_STRLCPY) - size_t strlcpy(char *dst, const char *src, size_t size); -#endif - -#if defined(_WIN32) - DLLEXPORT char* strcasestr(const char* haystack, const char* needle); -#endif - -/* Skip white-space chars at beginning of string */ -DLLEXPORT char* skipsp(char* str); -/* Truncate white-space chars off end of string */ -DLLEXPORT char* truncsp(char* str); -/* Truncate white-space chars off end of every \n-terminated line in string */ -DLLEXPORT char* truncsp_lines(char* str); -/* Truncate new-line chars off end of string */ -DLLEXPORT char* truncnl(char* str); - -#define STRERROR(x) strerror(x) - -/* Re-entrant version of strerror() */ -DLLEXPORT char* safe_strerror(int errnum, char* buf, size_t buflen); - -/*********************/ -/* Utility Functions */ -/*********************/ -/* Thunking for multi-threaded specific implementations of "errno" */ -DLLEXPORT int get_errno(void); - -/**********************************/ -/* Common Utility Macro Functions */ -/**********************************/ - -#if defined(_WIN32) - - #define YIELD() Sleep(1) /* Must sleep at least 1ms to avoid 100% CPU utilization */ - #define MAYBE_YIELD() Sleep(0) - #define SLEEP(x) Sleep(x) - #define popen _popen - #define pclose _pclose - #define tzname _tzname - -#elif defined(__OS2__) - - #define YIELD() DosSleep(1) /* Must sleep at least 1ms to avoid 100% CPU utilization */ - #define MAYBE_YIELD() DosSleep(0) - #define SLEEP(x) DosSleep(x) - -#elif defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) - - #if defined(_PTH_PTHREAD_H_) - #define SLEEP(x) ({ int sleep_msecs=x; struct timeval tv; \ - tv.tv_sec=(sleep_msecs/1000); tv.tv_usec=((sleep_msecs%1000)*1000); \ - pth_nap(tv); }) - #else - #define SLEEP(x) ({ int sleep_msecs=x; struct timespec ts={0}; \ - ts.tv_sec=(sleep_msecs/1000); ts.tv_nsec=((sleep_msecs%1000)*1000000); \ - while(nanosleep(&ts, &ts) != 0 && errno==EINTR && x > 1); }) - #endif - - #define YIELD() SLEEP(1) - - #if defined(XPDEV_THREAD_SAFE) - #if defined(__FreeBSD__) - #define MAYBE_YIELD() pthread_yield() - #elif defined(_PTH_PTHREAD_H_) - #define MAYBE_YIELD() pth_yield(NULL) - #elif defined(_POSIX_PRIORITY_SCHEDULING) - #define MAYBE_YIELD() sched_yield() - #else - #define MAYBE_YIELD() YIELD() - #endif - #else - #if defined(_POSIX_PRIORITY_SCHEDULING) - #define MAYBE_YIELD() sched_yield() - #else - #define MAYBE_YIELD() YIELD() - #endif - #endif - - /* - * QNX doesn't support fork() in threaded apps (yet) using vfork() instead - * works, but relies on undefined behaviours not being nasty. On most OSs - * vfork() will share the stack between the parent and child... - */ - #if defined(__QNX__) - #define FORK() vfork() - #else - #define FORK() fork() - #endif - - -#else /* Unsupported OS */ - - #error "Unsupported Target: Need some macros and/or function prototypes here." - -#endif - -/* Command processor/shell environment variable name */ -#ifdef __unix__ - #define OS_CMD_SHELL_ENV_VAR "SHELL" -#else /* DOS/Windows/OS2 */ - #define OS_CMD_SHELL_ENV_VAR "COMSPEC" -#endif - -/* Win32 implementations of recursive (thread-safe) std C time functions on Unix */ -#if !defined(__unix__) - - DLLEXPORT char* strtok_r(char *str, const char *delim, char **last); -#endif - -/* Mimic the Borland randomize() and random() CRTL functions */ -DLLEXPORT void xp_randomize(void); -DLLEXPORT long xp_random(int); - -DLLEXPORT long double xp_timer(void); -DLLEXPORT char* os_version(char *str); -DLLEXPORT char* os_cmdshell(void); -DLLEXPORT char* lastchar(const char* str); -DLLEXPORT int safe_snprintf(char *dst, size_t size, const char *fmt, ...) -#if defined(__GNUC__) // Catch printf-format errors - __attribute__ ((format (printf, 3 , 4))); // 1 is 'this' -#endif -; - -/* C string/char escape-sequence processing */ -DLLEXPORT char* c_escape_str(const char* src, char* dst, size_t maxlen, BOOL ctrl_only); -DLLEXPORT char* c_escape_char(char ch); -DLLEXPORT char* c_unescape_str(char* str); -DLLEXPORT char c_unescape_char_ptr(const char* str, char** endptr); -DLLEXPORT char c_unescape_char(char ch); - -/* Power-of-2 byte count string parser (e.g. "100K" returns 102400 if unit is 1) */ -DLLEXPORT int64_t parse_byte_count(const char*, ulong unit); -DLLEXPORT double parse_duration(const char*); -DLLEXPORT char* duration_to_str(double value, char* str, size_t size); -DLLEXPORT char* duration_to_vstr(double value, char* str, size_t size); -DLLEXPORT char* byte_count_to_str(int64_t bytes, char* str, size_t size); -DLLEXPORT char* byte_estimate_to_str(int64_t bytes, char* str, size_t size, ulong unit, int precision); - -/* Microsoft (e.g. DOS/Win32) real-time system clock API (ticks since process started) */ -typedef clock_t msclock_t; -#if defined(_WIN32) || defined(__OS2__) - #define MSCLOCKS_PER_SEC CLOCKS_PER_SEC /* e.g. 18.2 on DOS, 1000.0 on Win32 */ - #define msclock() clock() -#else - #define MSCLOCKS_PER_SEC 1000 - msclock_t msclock(void); -#endif - -DLLEXPORT BOOL check_pid(pid_t); -DLLEXPORT BOOL terminate_pid(pid_t); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/haproxy.h b/xpdev/haproxy.h deleted file mode 100644 index b80d382b22ef101f0733e229d5b0185033f82d65..0000000000000000000000000000000000000000 --- a/xpdev/haproxy.h +++ /dev/null @@ -1,40 +0,0 @@ -/* haproxy.h */ - -/* HAPROXY PROTOCOL constant definitions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* HAPROXY PROTO BINARY DEFINITIONS */ -#define HAPROXY_AFINET 0x1 /* IPv4 Connection */ -#define HAPROXY_AFINET6 0x2 /* IPv6 Connection */ - -/* HAPROXY COMMANDS */ -#define HAPROXY_LOCAL 0x0 /* Connections instigated by the proxy, eg: health-check */ -#define HAPROXY_PROXY 0x1 /* Relay connections */ diff --git a/xpdev/ini_file.c b/xpdev/ini_file.c deleted file mode 100644 index 5b09d38b2e36ed1ac1357b08463f3f12295cddd8..0000000000000000000000000000000000000000 --- a/xpdev/ini_file.c +++ /dev/null @@ -1,2476 +0,0 @@ -/* Functions to create and parse .ini files */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "ini_file.h" -#include <stdlib.h> /* strtol */ -#include <string.h> /* strlen */ -#include <math.h> /* fmod */ -#include "xpdatetime.h" /* isoDateTime_t */ -#include "datewrap.h" /* ctime_r */ -#include "dirwrap.h" /* fexist */ -#include "filewrap.h" /* chsize */ - -/* Maximum length of entire line, includes '\0' */ -#define INI_MAX_LINE_LEN (INI_MAX_VALUE_LEN*2) -#define INI_COMMENT_CHAR ';' -#define INI_OPEN_SECTION_CHAR '[' -#define INI_CLOSE_SECTION_CHAR ']' -#define INI_SECTION_NAME_SEP "|" -#define INI_BIT_SEP '|' -#define INI_NEW_SECTION ((char*)~0) -#define INI_EOF_DIRECTIVE "!eof" -#define INI_INCLUDE_DIRECTIVE "!include " -#define INI_INCLUDE_MAX 10000 - -static ini_style_t default_style; - -void iniSetDefaultStyle(ini_style_t style) -{ - default_style = style; -} - -/* These correlate with the LOG_* definitions in syslog.h/gen_defs.h */ -static char* logLevelStringList[] - = {"Emergency", "Alert", "Critical", "Error", "Warning", "Notice", "Informational", "Debugging", NULL}; - -str_list_t iniLogLevelStringList(void) -{ - return(logLevelStringList); -} - -static BOOL is_eof(char* str) -{ - return(*str=='!' && stricmp(truncsp(str),INI_EOF_DIRECTIVE)==0); -} - -static char* section_name(char* p) -{ - char* tp; - - SKIP_WHITESPACE(p); - if(*p!=INI_OPEN_SECTION_CHAR) - return(NULL); - p++; - SKIP_WHITESPACE(p); - tp=strrchr(p,INI_CLOSE_SECTION_CHAR); - if(tp==NULL) - return(NULL); - *tp=0; - truncsp(p); - - return(p); -} - -static BOOL section_match(const char* name, const char* compare, BOOL case_sensitive) -{ - BOOL found=FALSE; - str_list_t names=strListSplitCopy(NULL,name,INI_SECTION_NAME_SEP); - str_list_t comps=strListSplitCopy(NULL,compare,INI_SECTION_NAME_SEP); - size_t i,j; - char* n; - char* c; - - /* Ignore trailing whitespace */ - for(i=0; names[i]!=NULL; i++) - truncsp(names[i]); - for(i=0; comps[i]!=NULL; i++) - truncsp(comps[i]); - - /* Search for matches */ - for(i=0; names[i]!=NULL && !found; i++) - for(j=0; comps[j]!=NULL && !found; j++) { - n=names[i]; - SKIP_WHITESPACE(n); - c=comps[j]; - SKIP_WHITESPACE(c); - if (case_sensitive) - found = strcmp(n, c) == 0; - else - found = stricmp(n, c) == 0; - } - - strListFree(&names); - strListFree(&comps); - - return(found); -} - -static BOOL seek_section(FILE* fp, const char* section) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - - rewind(fp); - - if(section==ROOT_SECTION) - return(TRUE); - - /* Perform case-sensitive search first */ - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(section_match(p, section, /* case-sensitive */TRUE)) - return(TRUE); - } - - /* Then perform case-insensitive search */ - rewind(fp); - while (!feof(fp)) { - if (fgets(str, sizeof(str), fp) == NULL) - break; - if (is_eof(str)) - break; - if ((p = section_name(str)) == NULL) - continue; - if (section_match(p, section, /* case-sensitive */FALSE)) - return(TRUE); - } - - return(FALSE); -} - -static size_t find_section_index(str_list_t list, const char* section) -{ - char* p; - char str[INI_MAX_VALUE_LEN]; - size_t i; - - /* Perform case-sensitive search first */ - for (i = 0; list[i] != NULL; i++) { - SAFECOPY(str, list[i]); - if(is_eof(str)) - return(strListCount(list)); - if((p=section_name(str))!=NULL && section_match(p, section, /* case-sensitive */TRUE)) - return(i); - } - - /* Then perform case-insensitive search */ - for (i = 0; list[i] != NULL; i++) { - SAFECOPY(str, list[i]); - if (is_eof(str)) - return(strListCount(list)); - if ((p = section_name(str)) != NULL && section_match(p, section, /* case-sensitive */FALSE)) - return(i); - } - - return(i); -} - -static size_t section_start(str_list_t list, size_t index) -{ - char* p = list[index]; - if(p != NULL) { - SKIP_WHITESPACE(p); - if(*p == INI_OPEN_SECTION_CHAR) // A new section starts immediately? - return strListCount(list); - } - return index; -} - -static size_t find_section(str_list_t list, const char* section) -{ - size_t i; - - if(section==ROOT_SECTION) - return section_start(list, 0); - - i=find_section_index(list,section); - if(list[i]!=NULL) - i++; - return section_start(list, i); -} - -static char* key_name(char* p, char** vp, BOOL literals_supported) -{ - char* equal; - char* colon; - char* tp; - - *vp=NULL; - - if(p==NULL) - return(NULL); - - /* Parse value name */ - SKIP_WHITESPACE(p); - if(*p==INI_COMMENT_CHAR) - return(NULL); - if(*p==INI_OPEN_SECTION_CHAR) - return(INI_NEW_SECTION); - equal=strchr(p,'='); - colon=strchr(p,':'); - if(colon==NULL || (equal!=NULL && equal<colon)) { - *vp=equal; - colon=NULL; - } else - *vp=colon; - - if(*vp==NULL) - return(NULL); - - *(*vp)=0; - truncsp(p); - - /* Parse value */ - (*vp)++; - SKIP_WHITESPACE(*vp); - if(literals_supported && colon!=NULL) { /* string literal value */ - truncnl(*vp); /* "key : value" - truncate new-line chars only */ - if(*(*vp) == '"') { /* handled quoted-strings here */ - (*vp)++; - tp = strrchr(*vp, '"'); - if(tp != NULL) { - *tp = 0; - } - } - c_unescape_str(*vp); - } else - truncsp(*vp); /* "key = value" - truncate all white-space chars */ - - return(p); -} - -static char* read_value(FILE* fp, const char* section, const char* key, char* value, BOOL literals_supported) -{ - char* p; - char* vp=NULL; - char str[INI_MAX_LINE_LEN]; - - if(fp==NULL) - return(NULL); - - if(!seek_section(fp,section)) - return(NULL); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=key_name(str, &vp, literals_supported))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(stricmp(p,key)!=0) - continue; - if(vp==NULL) - break; - /* key found */ - sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,vp); - return(value); - } - - return(NULL); -} - -static size_t get_value(str_list_t list, const char* section, const char* key, char* value, char** vpp, BOOL literals_supported) -{ - char str[INI_MAX_LINE_LEN]; - char* p; - char* vp; - size_t i; - - if(value!=NULL) - value[0]=0; - if(vpp!=NULL) - *vpp=NULL; - if(list==NULL) - return 0; - - for(i=find_section(list, section); list[i]!=NULL; i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=key_name(str, &vp, literals_supported))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(stricmp(p,key)!=0) - continue; - if(value!=NULL) - sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,vp); - if(vpp!=NULL) - *vpp=list[i] + (vp - str); - return(i); - } - - return(i); -} - -BOOL iniSectionExists(str_list_t list, const char* section) -{ - size_t i; - - if(list==NULL) - return(FALSE); - - if(section==ROOT_SECTION) - return(TRUE); - - i=find_section_index(list,section); - return(list[i]!=NULL); -} - -str_list_t iniGetSection(str_list_t list, const char *section) -{ - size_t i; - str_list_t retval; - char *p; - - if(list==NULL) - return(NULL); - - if((retval=strListInit())==NULL) - return(NULL); - - i=find_section(list,section); - if(list[i]!=NULL) { - strListPush(&retval, list[i]); - for(i++;list[i]!=NULL;i++) { - p=list[i]; - SKIP_WHITESPACE(p); - if(*p==INI_OPEN_SECTION_CHAR) - break; - if(*p) - strListPush(&retval, list[i]); - } - } - return(retval); -} - -BOOL iniKeyExists(str_list_t list, const char* section, const char* key) -{ - size_t i; - - if(list==NULL) - return(FALSE); - - i=get_value(list, section, key, NULL, NULL, /* literals_supported: */FALSE); - - if(list[i]==NULL || *(list[i])==INI_OPEN_SECTION_CHAR) - return(FALSE); - - return(TRUE); -} - -BOOL iniValueExists(str_list_t list, const char* section, const char* key) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - return(vp!=NULL && *vp!=0); -} - -BOOL iniRemoveKey(str_list_t* list, const char* section, const char* key) -{ - size_t i; - char* vp=NULL; - - i=get_value(*list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL) - return(FALSE); - - return(strListDelete(list,i)); -} - -BOOL iniRemoveValue(str_list_t* list, const char* section, const char* key) -{ - char* vp=NULL; - - get_value(*list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL) - return(FALSE); - - *vp=0; - return(TRUE); -} - -BOOL iniRemoveSection(str_list_t* list, const char* section) -{ - size_t i; - - i=find_section_index(*list,section); - if((*list)[i]==NULL) /* not found */ - return(FALSE); - do { - strListDelete(list,i); - } while((*list)[i]!=NULL && *(*list)[i]!=INI_OPEN_SECTION_CHAR); - - return(TRUE); -} - -BOOL iniRemoveSections(str_list_t* list, const char* prefix) -{ - str_list_t sections; - const char* section; - - if (list == NULL) - return FALSE; - sections = iniGetSectionList(*list, prefix); - while((section = strListPop(§ions)) != NULL) - if(!iniRemoveSection(list, section)) - return(FALSE); - - strListFree(§ions); - - return(TRUE); -} - -// This sorts comments too, so should not be used on human created/edited files -BOOL iniSortSections(str_list_t* list, BOOL sort_keys) -{ - size_t i; - str_list_t root_keys; - str_list_t new_list; - str_list_t keys; - str_list_t section_list = iniGetSectionList(*list, /* prefix */NULL); - - root_keys = iniGetSection(*list, ROOT_SECTION); - if(section_list == NULL && root_keys == NULL) - return TRUE; - - if(sort_keys) - strListSortAlphaCase(root_keys); - - if(section_list != NULL) - strListSortAlphaCase(section_list); - new_list = strListInit(); - if(new_list == NULL) { - strListFree(§ion_list); - strListFree(&root_keys); - return FALSE; - } - strListAppendList(&new_list, root_keys); - strListFree(&root_keys); - for(i = 0; section_list != NULL && section_list[i] != NULL; i++) { - keys = iniGetSection(*list, section_list[i]); - if(sort_keys) - strListSortAlphaCase(keys); - iniAppendSectionWithKeys(&new_list, section_list[i], keys, /* ini_style_t */NULL); - strListFree(&keys); - } - strListFree(§ion_list); - strListFree(list); - *list = new_list; - return TRUE; -} - -BOOL iniRenameSection(str_list_t* list, const char* section, const char* newname) -{ - char str[INI_MAX_LINE_LEN]; - size_t i; - - if(section==ROOT_SECTION) - return(FALSE); - - if(stricmp(section, newname)!=0) { - i=find_section_index(*list,newname); - if((*list)[i]!=NULL) /* duplicate */ - return(FALSE); - } - - i=find_section_index(*list,section); - if((*list)[i]==NULL) /* not found */ - return(FALSE); - - SAFEPRINTF(str,"[%s]",newname); - return(strListReplace(*list, i, str)!=NULL); -} - -static size_t ini_add_section(str_list_t* list, const char* section - ,ini_style_t* style, size_t index) -{ - char str[INI_MAX_LINE_LEN]; - - if(section==ROOT_SECTION) - return(0); - - if((*list)[index]!=NULL) - return(index); - - if(style==NULL) - style=&default_style; - if(index > 0 && style->section_separator!=NULL) - strListAppend(list, style->section_separator, index++); - SAFEPRINTF(str,"[%s]",section); - strListAppend(list, str, index); - - return(index); -} - -size_t iniAddSection(str_list_t* list, const char* section, ini_style_t* style) -{ - if(section==ROOT_SECTION) - return(0); - - return ini_add_section(list,section,style,find_section_index(*list, section)); -} - -size_t iniAppendSection(str_list_t* list, const char* section, ini_style_t* style) -{ - if(section==ROOT_SECTION) - return(0); - - return ini_add_section(list,section,style,strListCount(*list)); -} - -size_t iniAppendSectionWithKeys(str_list_t* list, const char* section, const str_list_t keys - , ini_style_t* style) -{ - if(section==ROOT_SECTION) - return(0); - - ini_add_section(list,section,style,strListCount(*list)); - - return strListAppendList(list, keys); -} - -static BOOL str_contains_ctrl_char(const char* str) -{ - while(*str) { - if(*(unsigned char*)str < ' ') - return TRUE; - str++; - } - return FALSE; -} - -static char* ini_set_string(str_list_t* list, const char* section, const char* key, const char* value, BOOL literal - ,ini_style_t* style) -{ - char str[INI_MAX_LINE_LEN]; - char litstr[INI_MAX_VALUE_LEN]; - char curval[INI_MAX_VALUE_LEN]; - const char* key_prefix = ""; - const char* value_separator = "="; - const char* literal_separator = ":"; - size_t i; - - if(style==NULL) - style=&default_style; - - iniAddSection(list, section, style); - - if(key==NULL) - return(NULL); - if(style->key_prefix != NULL) - key_prefix = style->key_prefix; - if(style->value_separator != NULL) - value_separator = style->value_separator; - if(style->literal_separator != NULL) - literal_separator = style->literal_separator; - if(value==NULL) - value=""; - if(literal) { - char cstr[INI_MAX_VALUE_LEN]; - SAFEPRINTF(litstr, "\"%s\"", c_escape_str(value, cstr, sizeof(cstr)-1, /* ctrl_only: */FALSE)); - value = litstr; - value_separator = literal_separator; - } - safe_snprintf(str, sizeof(str), "%s%-*s%s%s" - ,key_prefix, style->key_len, key, value_separator, value); - i=get_value(*list, section, key, curval, NULL, /* literals_supported: */literal); - if((*list)[i]==NULL || *(*list)[i]==INI_OPEN_SECTION_CHAR) { - while(i && *(*list)[i-1]==0) i--; /* Insert before blank lines, not after */ - return strListInsert(list, str, i); - } - - if(strcmp(curval,value)==0) - return((*list)[i]); /* no change */ - - return strListReplace(*list, i, str); -} -char* iniSetString(str_list_t* list, const char* section, const char* key, const char* value - ,ini_style_t* style) -{ - BOOL literal = value != NULL && (str_contains_ctrl_char(value) || *value==' ' || *lastchar(value)==' '); - - return ini_set_string(list, section, key, value, literal, style); -} - -char* iniSetStringLiteral(str_list_t* list, const char* section, const char* key, const char* value - ,ini_style_t* style) -{ - return ini_set_string(list, section, key, value, /* literal: */TRUE, style); -} - -char* iniSetValue(str_list_t* list, const char* section, const char* key, const char* value - ,ini_style_t* style) -{ - return ini_set_string(list, section, key, value, /* literal: */FALSE, style); -} - -char* iniSetInteger(str_list_t* list, const char* section, const char* key, long value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%ld",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetShortInt(str_list_t* list, const char* section, const char* key, ushort value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%hu",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetLongInt(str_list_t* list, const char* section, const char* key, ulong value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%lu",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetHexInt(str_list_t* list, const char* section, const char* key, ulong value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"0x%lx",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetFloat(str_list_t* list, const char* section, const char* key, double value - ,ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - SAFEPRINTF(str,"%g",value); - return iniSetString(list, section, key, str, style); -} - -char* iniSetBytes(str_list_t* list, const char* section, const char* key, ulong unit - ,int64_t value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - if(value==0) - SAFECOPY(str,"0"); - else - switch(unit) { - case 1024*1024*1024: - SAFEPRINTF(str,"%"PRIi64"G",value); - break; - case 1024*1024: - SAFEPRINTF(str,"%"PRIi64"M",value); - break; - case 1024: - SAFEPRINTF(str,"%"PRIi64"K",value); - break; - default: - if(unit<1) - unit=1; - byte_count_to_str(value*unit, str, sizeof(str)); - } - - return iniSetString(list, section, key, str, style); -} - -char* iniSetDuration(str_list_t* list, const char* section, const char* key - ,double value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - - return iniSetString(list, section, key, duration_to_str(value, str, sizeof(str)), style); -} - - -#if !defined(NO_SOCKET_SUPPORT) -char* iniSetIpAddress(str_list_t* list, const char* section, const char* key, ulong value - ,ini_style_t* style) -{ - struct in_addr in_addr; - in_addr.s_addr=htonl(value); - return iniSetString(list, section, key, inet_ntoa(in_addr), style); -} - -char* iniSetIp6Address(str_list_t* list, const char* section, const char* key, struct in6_addr value - ,ini_style_t* style) -{ - char addrstr[INET6_ADDRSTRLEN]; - union xp_sockaddr addr = {{0}}; - - addr.in6.sin6_addr = value; - addr.in6.sin6_family = AF_INET6; - inet_addrtop(&addr, addrstr, sizeof(addrstr)); - return iniSetString(list, section, key, addrstr, style); -} -#endif - -char* iniSetBool(str_list_t* list, const char* section, const char* key, BOOL value - ,ini_style_t* style) -{ - return iniSetString(list, section, key, value ? "true":"false", style); -} - -char* iniSetDateTime(str_list_t* list, const char* section, const char* key - ,BOOL include_time, time_t value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - char tstr[32]; - char* p; - - if(value==0) - SAFECOPY(str,"Never"); - else if((p=ctime_r(&value,tstr))==NULL) - SAFEPRINTF(str,"0x%lx",value); - else if(!include_time) /* reformat into "Mon DD YYYY" */ - safe_snprintf(str,sizeof(str),"%.3s %.2s %.4s" ,p+4,p+8,p+20); - else /* reformat into "Mon DD YYYY HH:MM:SS" */ - safe_snprintf(str,sizeof(str),"%.3s %.2s %.4s %.8s" ,p+4,p+8,p+20,p+11); - - return iniSetString(list, section, key, str, style); -} - -char* iniSetEnum(str_list_t* list, const char* section, const char* key, str_list_t names, unsigned value - ,ini_style_t* style) -{ - if(value < strListCount(names)) - return iniSetString(list, section, key, names[value], style); - - return iniSetLongInt(list, section, key, value, style); -} - -char* iniSetEnumList(str_list_t* list, const char* section, const char* key - ,const char* sep, str_list_t names, unsigned* val_list, unsigned count, ini_style_t* style) -{ - char value[INI_MAX_VALUE_LEN]; - size_t i; - size_t name_count; - - value[0]=0; - - if(sep==NULL) - sep=","; - - if(val_list!=NULL) { - name_count = strListCount(names); - for(i=0; i < count; i++) { - if(value[0]) - SAFECAT(value,sep); - if(val_list[i] < name_count) - SAFECAT(value, names[val_list[i]]); - else - sprintf(value + strlen(value), "%u", val_list[i]); - } - } - - return iniSetString(list, section, key, value, style); -} - -char* iniSetNamedInt(str_list_t* list, const char* section, const char* key, named_long_t* names - ,long value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetInteger(list, section, key, value, style); -} - -char* iniSetNamedHexInt(str_list_t* list, const char* section, const char* key, named_ulong_t* names - ,ulong value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetHexInt(list, section, key, value, style); -} - -char* iniSetNamedLongInt(str_list_t* list, const char* section, const char* key, named_ulong_t* names - ,ulong value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetLongInt(list, section, key, value, style); -} - -char* iniSetNamedFloat(str_list_t* list, const char* section, const char* key, named_double_t* names - ,double value, ini_style_t* style) -{ - size_t i; - - for(i=0;names[i].name!=NULL;i++) - if(names[i].value==value) - return iniSetString(list, section, key, names[i].name, style); - - return iniSetFloat(list, section, key, value, style); -} - -char* iniSetBitField(str_list_t* list, const char* section, const char* key - ,ini_bitdesc_t* bitdesc, ulong value, ini_style_t* style) -{ - char str[INI_MAX_VALUE_LEN]; - int i; - const char* bit_separator = "|"; - - if(style==NULL) - style=&default_style; - if(style->bit_separator!=NULL) - bit_separator = style->bit_separator; - str[0]=0; - for(i=0;bitdesc[i].name;i++) { - if((value&bitdesc[i].bit)==0) - continue; - if(str[0]) - SAFECAT(str, bit_separator); - SAFECAT(str,bitdesc[i].name); - value&=~bitdesc[i].bit; - } - if(value) { /* left over bits? */ - if(str[0]) - SAFECAT(str, bit_separator); - sprintf(str+strlen(str), "0x%lX", value); - } - return iniSetString(list, section, key, str, style); -} - -char* iniSetStringList(str_list_t* list, const char* section, const char* key - ,const char* sep, str_list_t val_list, ini_style_t* style) -{ - char value[INI_MAX_VALUE_LEN]; - - if(sep==NULL) - sep=","; - - return iniSetString(list, section, key, strListCombine(val_list, value, sizeof(value), sep), style); -} - -char* iniSetIntList(str_list_t* list, const char* section, const char* key - ,const char* sep, int* val_list, unsigned count, ini_style_t* style) -{ - unsigned i; - char value[INI_MAX_VALUE_LEN]; - - if(sep == NULL) - sep = ","; - for(i = 0; i < count; i++) { - if(i) { - int len = strlen(value); - if(len > INI_MAX_VALUE_LEN - 20) - return NULL; - sprintf(value + len, "%s%d", sep, *(val_list + i)); - } else - sprintf(value, "%d", *val_list); - } - - return iniSetString(list, section, key, value, style); -} - -static char* default_value(const char* deflt, char* value) -{ - if(deflt!=NULL && deflt!=value && value!=NULL) - sprintf(value,"%.*s",INI_MAX_VALUE_LEN-1,deflt); - - return((char*)deflt); -} - -/* Supports string literals: */ -char* iniReadString(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp, section, key, value, /* literals_supported: */TRUE)==NULL || *value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -/* Does NOT support string literals: */ -char* iniReadValue(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp, section, key, value, /* literals_supported: */FALSE)==NULL || *value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -/* Supports string literals: */ -char* iniGetString(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - char* vp=NULL; - - get_value(list, section, key, value, &vp, /* literals_supported: */TRUE); - - if(vp==NULL || *vp==0 /* blank value or missing key */) - return default_value(deflt,value); - - if(value != NULL) /* return the modified (trimmed) value */ - return value; - - return(vp); -} - -/* Does NOT support string literals: */ -char* iniGetValue(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - char* vp=NULL; - - get_value(list, section, key, value, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0 /* blank value or missing key */) - return default_value(deflt,value); - - if(value != NULL) /* return the modified (trimmed) value */ - return value; - - return(vp); -} - -/* Does NOT support string literals: */ -char* iniPopKey(str_list_t* list, const char* section, const char* key, char* value) -{ - size_t i; - - if(list==NULL || *list==NULL) - return NULL; - - i=get_value(*list, section, key, value, NULL, /* literals_supported: */FALSE); - - if((*list)[i]==NULL) - return NULL; - - strListDelete(list,i); - - return(value); -} - -/* Supports string literals: */ -char* iniPopString(str_list_t* list, const char* section, const char* key, char* value) -{ - size_t i; - - if(list==NULL || *list==NULL) - return NULL; - - i=get_value(*list, section, key, value, NULL, /* literals_supported: */TRUE); - - if((*list)[i]==NULL) - return NULL; - - strListDelete(list,i); - - return(value); -} - -char* iniReadExistingString(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp,section,key,value, /* literals_supported: */TRUE)==NULL) - return(NULL); - - if(*value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -char* iniGetExistingString(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - if(!iniKeyExists(list, section, key)) - return(NULL); - - return iniGetString(list, section, key, deflt, value); -} - -char* iniReadExistingValue(FILE* fp, const char* section, const char* key, const char* deflt, char* value) -{ - if(read_value(fp,section,key,value, /* literals_supported: */FALSE)==NULL) - return(NULL); - - if(*value==0 /* blank */) - return default_value(deflt,value); - - return(value); -} - -char* iniGetExistingValue(str_list_t list, const char* section, const char* key, const char* deflt, char* value) -{ - if(!iniKeyExists(list, section, key)) - return(NULL); - - return iniGetValue(list, section, key, deflt, value); -} - - -static str_list_t splitList(char* list, const char* sep) -{ - char* token; - char* tmp; - ulong items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(sep==NULL) - sep=","; - - token=strtok_r(list,sep,&tmp); - while(token!=NULL) { - SKIP_WHITESPACE(token); - truncsp(token); - if(strListAppend(&lp,token,items++)==NULL) - break; - token=strtok_r(NULL,sep,&tmp); - } - - return(lp); -} - -str_list_t iniReadStringList(FILE* fp, const char* section, const char* key - ,const char* sep, const char* deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - char list[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */TRUE))==NULL || *value==0 /* blank */) - value=(char*)deflt; - - if(value==NULL) - return(NULL); - - SAFECOPY(list,value); - - return(splitList(list,sep)); -} - -str_list_t iniGetStringList(str_list_t list, const char* section, const char* key - ,const char* sep, const char* deflt) -{ - char value[INI_MAX_VALUE_LEN]; - - get_value(list, section, key, value, NULL, /* literals_supported: */TRUE); - - if(*value==0 /* blank value or missing key */) { - if(deflt==NULL) - return(NULL); - SAFECOPY(value,deflt); - } - - return(splitList(value,sep)); -} - -void* iniFreeStringList(str_list_t list) -{ - strListFree(&list); - return(list); -} - -void* iniFreeNamedStringList(named_string_t** list) -{ - ulong i; - - if(list==NULL) - return(NULL); - - for(i=0;list[i]!=NULL;i++) { - if(list[i]->name!=NULL) - free(list[i]->name); - if(list[i]->value!=NULL) - free(list[i]->value); - free(list[i]); - } - - free(list); - return(NULL); -} - -str_list_t iniReadSectionList(FILE* fp, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(fp==NULL) - return(lp); - - rewind(fp); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - if(strListFind(lp, p, /* case_sensitive */FALSE) >= 0) - continue; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - -str_list_t iniGetSectionList(str_list_t list, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - ulong i,items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(list==NULL) - return(lp); - - for(i=0; list[i]!=NULL; i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - if(strListFind(lp, p, /* case_sensitive */FALSE) >= 0) - continue; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - -size_t iniGetSectionCount(str_list_t list, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - size_t i,items=0; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - items++; - } - - return(items); -} - -size_t iniReadSectionCount(FILE* fp, const char* prefix) -{ - char* p; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - - if(fp==NULL) - return(0); - - rewind(fp); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=section_name(str))==NULL) - continue; - if(prefix!=NULL) - if(strnicmp(p,prefix,strlen(prefix))!=0) - continue; - items++; - } - - return(items); -} - - -str_list_t iniReadKeyList(FILE* fp, const char* section) -{ - char* p; - char* vp; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(fp==NULL) - return(lp); - - rewind(fp); - - if(!seek_section(fp,section)) - return(lp); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((p=key_name(str, &vp, /* literals_supported: */FALSE))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - -str_list_t iniGetKeyList(str_list_t list, const char* section) -{ - char* p; - char* vp; - char str[INI_MAX_LINE_LEN]; - ulong i,items=0; - str_list_t lp; - - if((lp=strListInit())==NULL) - return(NULL); - - if(list==NULL) - return(lp); - - for(i=find_section(list,section);list[i]!=NULL;i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((p=key_name(str, &vp, /* literals_supported: */FALSE))==NULL) - continue; - if(p==INI_NEW_SECTION) - break; - if(strListAppend(&lp,p,items++)==NULL) - break; - } - - return(lp); -} - - -named_string_t** -iniReadNamedStringList(FILE* fp, const char* section) -{ - char* name; - char* value; - char str[INI_MAX_LINE_LEN]; - ulong items=0; - named_string_t** lp; - named_string_t** np; - - if(fp==NULL) - return(NULL); - - rewind(fp); - - if(!seek_section(fp,section)) - return(NULL); - - /* New behavior, if section exists but is empty, return single element array (terminator only) */ - if((lp=(named_string_t**)malloc(sizeof(named_string_t*)))==NULL) - return(NULL); - - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - if(is_eof(str)) - break; - if((name=key_name(str, &value, /* literals_supported: */TRUE))==NULL) - continue; - if(name==INI_NEW_SECTION) - break; - if((np=(named_string_t**)realloc(lp,sizeof(named_string_t*)*(items+2)))==NULL) - break; - lp=np; - if((lp[items]=(named_string_t*)malloc(sizeof(named_string_t)))==NULL) - break; - if((lp[items]->name=strdup(name))==NULL) - break; - if((lp[items]->value=strdup(value))==NULL) - break; - items++; - } - - lp[items]=NULL; /* terminate list */ - - return(lp); -} - -named_string_t** -iniGetNamedStringList(str_list_t list, const char* section) -{ - char* name; - char* value; - char str[INI_MAX_LINE_LEN]; - ulong i,items=0; - named_string_t** lp; - named_string_t** np; - - if(list==NULL) - return(NULL); - - i=find_section(list,section); - if(section!=ROOT_SECTION && list[i]==NULL) - return(NULL); - - /* New behavior, if section exists but is empty, return single element array (terminator only) */ - if((lp=(named_string_t**)malloc(sizeof(named_string_t*)))==NULL) - return(NULL); - - for(;list[i]!=NULL;i++) { - SAFECOPY(str,list[i]); - if(is_eof(str)) - break; - if((name=key_name(str, &value, /* literals_supported: */TRUE))==NULL) - continue; - if(name==INI_NEW_SECTION) - break; - if((np=(named_string_t**)realloc(lp,sizeof(named_string_t*)*(items+2)))==NULL) - break; - lp=np; - if((lp[items]=(named_string_t*)malloc(sizeof(named_string_t)))==NULL) - break; - if((lp[items]->name=strdup(name))==NULL) - break; - if((lp[items]->value=strdup(value))==NULL) - break; - items++; - } - - lp[items]=NULL; /* terminate list */ - - return(lp); -} - - -/* These functions read a single key of the specified type */ - -static BOOL isTrue(const char* value) -{ - char* str; - char* p; - BOOL is_true; - - if(!IS_ALPHA(*value)) - return FALSE; - - if((str=strdup(value)) == NULL) - return FALSE; - - /* Truncate value at first space, tab or semicolon for purposes of checking for special boolean words. */ - /* This allows comments or white-space to immediately follow a special boolean word: "True", "Yes", or "On" */ - p=str; - FIND_CHARSET(p, "; \t"); - *p=0; - - is_true = (stricmp(str,"TRUE")==0 || stricmp(str,"YES")==0 || stricmp(str,"ON")==0); - free(str); - return is_true; -} - -static long parseInteger(const char* value) -{ - if(isTrue(value)) - return(TRUE); - - return(strtol(value,NULL,0)); -} - -static ulong parseLongInteger(const char* value) -{ - if(isTrue(value)) - return(TRUE); - - return(strtoul(value,NULL,0)); -} - -static BOOL parseBool(const char* value) -{ - return(INT_TO_BOOL(parseInteger(value))); -} - -long iniReadInteger(FILE* fp, const char* section, const char* key, long deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseInteger(value)); -} - -long iniGetInteger(str_list_t list, const char* section, const char* key, long deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseInteger(vp)); -} - -ushort iniReadShortInt(FILE* fp, const char* section, const char* key, ushort deflt) -{ - return((ushort)iniReadInteger(fp, section, key, deflt)); -} - -ushort iniGetShortInt(str_list_t list, const char* section, const char* key, ushort deflt) -{ - return((ushort)iniGetInteger(list, section, key, deflt)); -} - -ulong iniReadLongInt(FILE* fp, const char* section, const char* key, ulong deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseLongInteger(value)); -} - -ulong iniGetLongInt(str_list_t list, const char* section, const char* key, ulong deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseLongInteger(vp)); -} - -int64_t iniReadBytes(FILE* fp, const char* section, const char* key, ulong unit, int64_t deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parse_byte_count(value,unit)); -} - -int64_t iniGetBytes(str_list_t list, const char* section, const char* key, ulong unit, int64_t deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parse_byte_count(vp,unit)); -} - -double iniReadDuration(FILE* fp, const char* section, const char* key, double deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parse_duration(value)); -} - -double iniGetDuration(str_list_t list, const char* section, const char* key, double deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parse_duration(vp)); -} - -#if !defined(NO_SOCKET_SUPPORT) - -int iniGetSocketOptions(str_list_t list, const char* section, SOCKET sock - ,char* error, size_t errlen) -{ - int i; - int result; - char* name; - char err[128]; - BYTE* vp; - socklen_t len; - int option; - int level; - int value; - int type=0; // Assignment is to silence Valgrind. - LINGER linger; - socket_option_t* socket_options=getSocketOptionList(); -#ifdef IPPROTO_IPV6 - union xp_sockaddr addr; -#endif - - len=sizeof(type); - if((result=getsockopt(sock, SOL_SOCKET, SO_TYPE, (char*)&type, &len)) != 0) { - safe_snprintf(error,errlen,"%d (%s) getting socket type", ERROR_VALUE, socket_strerror(socket_errno,err,sizeof(err))); - return(result); - } -#ifdef IPPROTO_IPV6 - len=sizeof(addr); - if((result=getsockname(sock, &addr.addr, &len)) != 0) { - safe_snprintf(error,errlen,"%d (%s) getting socket name", ERROR_VALUE, socket_strerror(socket_errno,err,sizeof(err))); - return(result); - } -#endif - for(i=0;socket_options[i].name!=NULL;i++) { - if(socket_options[i].type != 0 - && socket_options[i].type != type) - continue; -#ifdef IPPROTO_IPV6 - if(addr.addr.sa_family != AF_INET6 && socket_options[i].level == IPPROTO_IPV6) - continue; -#endif - name = socket_options[i].name; - if(!iniValueExists(list, section, name)) - continue; - value=iniGetInteger(list, section, name, 0); - - vp=(BYTE*)&value; - len=sizeof(value); - - level = socket_options[i].level; - option = socket_options[i].value; - - if(option == SO_LINGER) { - if(value) { - linger.l_onoff = TRUE; - linger.l_linger = value; - } else { - ZERO_VAR(linger); - } - vp=(BYTE*)&linger; - len=sizeof(linger); - } - - if((result=setsockopt(sock,level,option,(const char *)vp,len)) != 0) { - safe_snprintf(error,errlen,"%d (%s) setting socket option (%s, %d) to %d" - ,ERROR_VALUE, socket_strerror(socket_errno,err,sizeof(err)), name, option, value); - return(result); - } - } - - return(0); -} - -static ulong parseIpAddress(const char* value) -{ - if(strchr(value,'.')==NULL) - return(strtol(value,NULL,0)); - - return(ntohl(inet_addr(value))); -} - -static struct in6_addr parseIp6Address(const char* value) -{ - struct addrinfo hints = {0}; - struct addrinfo *res, *cur; - struct in6_addr ret = {{{0}}}; - - hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; - if(getaddrinfo(value, NULL, &hints, &res)) - return ret; - - for(cur = res; cur; cur++) { - if(cur->ai_addr->sa_family == AF_INET6) - break; - } - if(!cur) { - freeaddrinfo(res); - return ret; - } - memcpy(&ret, &((struct sockaddr_in6 *)(cur->ai_addr))->sin6_addr, sizeof(ret)); - freeaddrinfo(res); - return ret; -} - -ulong iniReadIpAddress(FILE* fp, const char* section, const char* key, ulong deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseIpAddress(value)); -} - -struct in6_addr iniReadIp6Address(FILE* fp, const char* section, const char* key, struct in6_addr deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseIp6Address(value)); -} - -ulong iniGetIpAddress(str_list_t list, const char* section, const char* key, ulong deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseIpAddress(vp)); -} - -struct in6_addr iniGetIp6Address(str_list_t list, const char* section, const char* key, struct in6_addr deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseIp6Address(vp)); -} - -#endif /* !NO_SOCKET_SUPPORT */ - -char* iniFileName(char* dest, size_t maxlen, const char* indir, const char* infname) -{ - char dir[MAX_PATH+1]; - char fname[MAX_PATH+1]; - char ext[MAX_PATH+1]; - char* p; - - SAFECOPY(dir,indir); - backslash(dir); - SAFECOPY(fname,infname); - ext[0]=0; - if((p=getfext(fname))!=NULL) { - SAFECOPY(ext,p); - *p=0; - } - -#if !defined(NO_SOCKET_SUPPORT) - { - char hostname[128]; - - if(gethostname(hostname,sizeof(hostname))==0) { - safe_snprintf(dest,maxlen,"%s%s.%s%s",dir,fname,hostname,ext); - if(fexistcase(dest)) /* path/file.host.domain.ini */ - return(dest); - if((p=strchr(hostname,'.'))!=NULL) { - *p=0; - safe_snprintf(dest,maxlen,"%s%s.%s%s",dir,fname,hostname,ext); - if(fexistcase(dest)) /* path/file.host.ini */ - return(dest); - } - } - } -#endif - - safe_snprintf(dest,maxlen,"%s%s.%s%s",dir,fname,PLATFORM_DESC,ext); - if(fexistcase(dest)) /* path/file.platform.ini */ - return(dest); - - safe_snprintf(dest,maxlen,"%s%s%s",dir,fname,ext); - fexistcase(dest); /* path/file.ini */ - return(dest); -} - -double iniReadFloat(FILE* fp, const char* section, const char* key, double deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(atof(value)); -} - -double iniGetFloat(str_list_t list, const char* section, const char* key, double deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(atof(vp)); -} - -BOOL iniReadBool(FILE* fp, const char* section, const char* key, BOOL deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseBool(value)); -} - -BOOL iniGetBool(str_list_t list, const char* section, const char* key, BOOL deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseBool(vp)); -} - -static BOOL validDate(struct tm* tm) -{ - return(tm->tm_mon && tm->tm_mon<=12 - && tm->tm_mday && tm->tm_mday<=31); -} - -static time_t fixedDateTime(struct tm* tm, const char* tstr, char pm) -{ - if(tm->tm_year<70) - tm->tm_year+=100; /* 05 == 2005 (not 1905) and 70 == 1970 (not 2070) */ - else if(tm->tm_year>1900) - tm->tm_year-=1900; - if(tm->tm_mon) - tm->tm_mon--; /* zero-based month field */ - - /* hh:mm:ss [p] */ - sscanf(tstr,"%u:%u:%u",&tm->tm_hour,&tm->tm_min,&tm->tm_sec); - if(tm->tm_hour < 12 && (toupper(pm)=='P' || strchr(tstr,'p') || strchr(tstr,'P'))) - tm->tm_hour += 12; /* pm, correct for 24 hour clock */ - - tm->tm_isdst=-1; /* auto-detect */ - - return(mktime(tm)); -} - -static int getMonth(const char* month) -{ - char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec",NULL}; - int i; - - for(i=0;mon[i]!=NULL;i++) - if(strnicmp(month,mon[i],3)==0) - return(i+1); - - return(atoi(month)); -} - -static time_t parseDateTime(const char* value) -{ - char month[INI_MAX_VALUE_LEN]; - char tstr[INI_MAX_VALUE_LEN]; - char pm=0; - time_t t; - struct tm tm; - struct tm curr_tm; - isoDate_t isoDate; - isoTime_t isoTime; - - ZERO_VAR(tm); - tstr[0]=0; - - /* Use current month and year as default */ - t=time(NULL); - if(localtime_r(&t,&curr_tm)!=NULL) { - tm.tm_mon=curr_tm.tm_mon+1; /* convert to one-based (reversed later) */ - tm.tm_year=curr_tm.tm_year; - } - - /* CCYYMMDDTHHMMSS <--- ISO-8601 date and time format */ - if(sscanf(value,"%uT%u" - ,&isoDate,&isoTime)>=2) - return(isoDateTime_to_time(isoDate,isoTime)); - - /* DD.MM.[CC]YY [time] [p] <-- Euro/Canadian numeric date format */ - if(sscanf(value,"%u.%u.%u %s %c" - ,&tm.tm_mday,&tm.tm_mon,&tm.tm_year,tstr,&pm)>=2 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* MM/DD/[CC]YY [time] [p] <-- American numeric date format */ - if(sscanf(value,"%u%*c %u%*c %u %s %c" - ,&tm.tm_mon,&tm.tm_mday,&tm.tm_year,tstr,&pm)>=2 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* DD[-]Mon [CC]YY [time] [p] <-- Perversion of RFC822 date format */ - if(sscanf(value,"%u%*c %s %u %s %c" - ,&tm.tm_mday,month,&tm.tm_year,tstr,&pm)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* Wday, DD Mon YYYY [time] <-- IETF standard (RFC2822) date format */ - if(sscanf(value,"%*s %u %s %u %s" - ,&tm.tm_mday,month,&tm.tm_year,tstr)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,0)); - - /* Mon DD[,] [CC]YY [time] [p] <-- Preferred date format */ - if(sscanf(value,"%s %u%*c %u %s %c" - ,month,&tm.tm_mday,&tm.tm_year,tstr,&pm)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,pm)); - - /* Wday Mon DD YYYY [time] <-- JavaScript (SpiderMonkey) Date.toString() format */ - if(sscanf(value,"%*s %s %u %u %s" - ,month,&tm.tm_mday,&tm.tm_year,tstr)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,0)); - - /* Wday Mon DD [time] YYYY <-- ctime() format */ - if(sscanf(value,"%*s %s %u %s %u" - ,month,&tm.tm_mday,tstr,&tm.tm_year)>=2 - && (tm.tm_mon=getMonth(month))!=0 - && validDate(&tm)) - return(fixedDateTime(&tm,tstr,0)); - - if((t=xpDateTime_to_time(isoDateTimeStr_parse(value))) != INVALID_TIME) - return t; - - return(strtoul(value,NULL,0)); -} - -time_t iniReadDateTime(FILE* fp, const char* section, const char* key, time_t deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseDateTime(value)); -} - -time_t iniGetDateTime(str_list_t list, const char* section, const char* key, time_t deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseDateTime(vp)); -} - -static unsigned parseEnum(const char* value, str_list_t names, unsigned deflt) -{ - unsigned i,count; - char val[INI_MAX_VALUE_LEN]; - char* p=val; - char* endptr; - - /* Strip trailing words (enums must be a single word with no white-space) */ - /* to support comments following enum values */ - SAFECOPY(val,value); - FIND_WHITESPACE(p); - *p=0; - - if((count=strListCount(names)) == 0) - return 0; - - /* Look for exact matches first */ - for(i=0; i<count; i++) - if(stricmp(names[i],val)==0) - return(i); - - /* Look for partial matches second */ - for(i=0; i<count; i++) - if(strnicmp(names[i],val,strlen(val))==0) - return(i); - - i=strtoul(val, &endptr, 0); - if(*endptr != 0 && !IS_WHITESPACE(*endptr)) - return deflt; - if(i>=count) - i=count-1; - return i; -} - -unsigned* parseEnumList(const char* values, const char* sep, const char** names, unsigned* count) -{ - char* vals; - str_list_t list; - unsigned* enum_list; - size_t i; - - *count=0; - - if(values==NULL) - return NULL; - - if((vals=strdup(values)) == NULL) - return NULL; - - list=splitList(vals, sep); - - free(vals); - - if((*count=strListCount(list)) < 1) { - strListFree(&list); - return NULL; - } - - if((enum_list=(unsigned *)malloc((*count)*sizeof(unsigned)))!=NULL) { - for(i=0;i<*count;i++) - enum_list[i]=parseEnum(list[i], names, /* default: */0); - } - - strListFree(&list); - - return enum_list; -} - -unsigned iniReadEnum(FILE* fp, const char* section, const char* key, str_list_t names, unsigned deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseEnum(value,names,deflt)); -} - -unsigned* iniReadEnumList(FILE* fp, const char* section, const char* key - ,str_list_t names, unsigned* cp - ,const char* sep, const char* deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - unsigned count; - - if(cp==NULL) - cp=&count; - - *cp=0; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL || *value==0 /* blank */) - value=(char*)deflt; - - return(parseEnumList(value, sep, names, cp)); -} - -unsigned iniGetEnum(str_list_t list, const char* section, const char* key, str_list_t names, unsigned deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseEnum(vp,names, deflt)); -} - -unsigned* iniGetEnumList(str_list_t list, const char* section, const char* key - ,str_list_t names, unsigned* cp, const char* sep, const char* deflt) -{ - char* vp=NULL; - unsigned count; - - if(cp==NULL) - cp=&count; - - *cp=0; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0 /* blank value or missing key */) { - if(deflt==NULL) - return(NULL); - vp=(char*)deflt; - } - return(parseEnumList(vp, sep, names, cp)); -} - -static long parseNamedInt(const char* value, named_long_t* names) -{ - unsigned i; - - /* Look for exact matches first */ - for(i=0; names[i].name!=NULL; i++) - if(stricmp(names[i].name,value)==0) - return(names[i].value); - - /* Look for partial matches second */ - for(i=0; names[i].name!=NULL; i++) - if(strnicmp(names[i].name,value,strlen(value))==0) - return(names[i].value); - - return(parseInteger(value)); -} - -long iniReadNamedInt(FILE* fp, const char* section, const char* key - ,named_long_t* names, long deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseNamedInt(value,names)); -} - -long iniGetNamedInt(str_list_t list, const char* section, const char* key - ,named_long_t* names, long deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseNamedInt(vp,names)); -} - -static ulong parseNamedLongInt(const char* value, named_ulong_t* names) -{ - unsigned i; - - /* Look for exact matches first */ - for(i=0; names[i].name!=NULL; i++) - if(stricmp(names[i].name,value)==0) - return(names[i].value); - - /* Look for partial matches second */ - for(i=0; names[i].name!=NULL; i++) - if(strnicmp(names[i].name,value,strlen(value))==0) - return(names[i].value); - - return(parseLongInteger(value)); -} - -ulong iniReadNamedLongInt(FILE* fp, const char* section, const char* key - ,named_ulong_t* names, ulong deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseNamedLongInt(value,names)); -} - -ulong iniGetNamedLongInt(str_list_t list, const char* section, const char* key - ,named_ulong_t* names, ulong deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseNamedLongInt(vp,names)); -} - -static double parseNamedFloat(const char* value, named_double_t* names) -{ - unsigned i; - - /* Look for exact matches first */ - for(i=0; names[i].name!=NULL; i++) - if(stricmp(names[i].name,value)==0) - return(names[i].value); - - /* Look for partial matches second */ - for(i=0; names[i].name!=NULL; i++) - if(strnicmp(names[i].name,value,strlen(value))==0) - return(names[i].value); - - return(atof(value)); -} - -double iniReadNamedFloat(FILE* fp, const char* section, const char* key - ,named_double_t* names, double deflt) -{ - char buf[INI_MAX_VALUE_LEN]; - char* value; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) - return(deflt); - - if(*value==0) /* blank value */ - return(deflt); - - return(parseNamedFloat(value,names)); -} - -double iniGetNamedFloat(str_list_t list, const char* section, const char* key - ,named_double_t* names, double deflt) -{ - char* vp=NULL; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL || *vp==0) /* blank value or missing key */ - return(deflt); - - return(parseNamedFloat(vp,names)); -} - -static ulong parseBitField(char* value, ini_bitdesc_t* bitdesc) -{ - int i; - char* p; - char* tp; - ulong v=0; - - for(p=value;*p;) { - tp=strchr(p,INI_BIT_SEP); - if(tp!=NULL) - *tp=0; - truncsp(p); - - for(i=0;bitdesc[i].name;i++) - if(!stricmp(bitdesc[i].name,p)) - break; - - if(bitdesc[i].name) - v|=bitdesc[i].bit; - else - v|=strtoul(p,NULL,0); - - if(tp==NULL) - break; - - p=tp+1; - SKIP_WHITESPACE(p); - } - - return(v); -} - -ulong iniReadBitField(FILE* fp, const char* section, const char* key, - ini_bitdesc_t* bitdesc, ulong deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - - if((value=read_value(fp,section,key,buf, /* literals_supported: */FALSE))==NULL) /* missing key */ - return(deflt); - - return(parseBitField(value,bitdesc)); -} - -ulong iniGetBitField(str_list_t list, const char* section, const char* key, - ini_bitdesc_t* bitdesc, ulong deflt) -{ - char* vp=NULL;; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp==NULL) /* missing key */ - return(deflt); - - return(parseBitField(vp,bitdesc)); -} - -int* parseIntList(const char* values, const char* sep, unsigned* count) -{ - char* vals; - str_list_t list; - int* int_list; - size_t i; - - *count = 0; - - if(values == NULL) - return NULL; - - if((vals = strdup(values)) == NULL) - return NULL; - - list = splitList(vals, sep); - - free(vals); - - if((*count = strListCount(list)) < 1) { - strListFree(&list); - return NULL; - } - - if((int_list = malloc((*count)*sizeof(int))) != NULL) { - for(i = 0; i < *count; i++) - int_list[i] = atoi(list[i]); - } - - strListFree(&list); - - return int_list; -} - -int* iniGetIntList(str_list_t list, const char* section, const char* key - ,unsigned* cp, const char* sep, const char* deflt) -{ - char* vp=NULL; - unsigned count; - - if(cp == NULL) - cp = &count; - - *cp=0; - - get_value(list, section, key, NULL, &vp, /* literals_supported: */FALSE); - - if(vp == NULL || *vp == 0 /* blank value or missing key */) { - if(deflt == NULL) - return NULL; - vp = (char*)deflt; - } - return parseIntList(vp, sep, cp); -} - -int* iniReadIntList(FILE* fp, const char* section, const char* key - ,unsigned* cp, const char* sep, const char* deflt) -{ - char* value; - char buf[INI_MAX_VALUE_LEN]; - unsigned count; - - if(cp == NULL) - cp = &count; - - *cp = 0; - - if((value = read_value(fp, section, key, buf, /* literals_supported: */FALSE)) == NULL || *value == 0 /* blank */) - value = (char*)deflt; - - return parseIntList(value, sep, cp); -} - -FILE* iniOpenFile(const char* fname, BOOL create) -{ - char* mode="r+"; - - if(create && !fexist(fname)) - mode="w+"; - - return(fopen(fname,mode)); -} - -BOOL iniCloseFile(FILE* fp) -{ - return(fclose(fp)==0); -} - -str_list_t iniReadFile(FILE* fp) -{ - char str[INI_MAX_LINE_LEN]; - char err[512]; - char* p; - size_t i; - size_t inc_len; - size_t inc_counter=0; - str_list_t list; - FILE* insert_fp=NULL; - - if(fp!=NULL) - rewind(fp); - - list = strListReadFile(fp, NULL, INI_MAX_LINE_LEN); - if(list==NULL) - return(NULL); - - /* Look for !include directives */ - inc_len=strlen(INI_INCLUDE_DIRECTIVE); - for(i=0; list[i]!=NULL; i++) { - if(strnicmp(list[i],INI_INCLUDE_DIRECTIVE,inc_len)==0) { - glob_t gl = {0}; - size_t j; - p=list[i]+inc_len; - SKIP_WHITESPACE(p); - truncsp(p); - (void)glob(p, GLOB_MARK, NULL, &gl); - safe_snprintf(str, sizeof(str), "; %s - %lu matches found", list[i], (ulong)gl.gl_pathc); - strListReplace(list, i, str); - for(j = 0; j < gl.gl_pathc; j++) { - char* fname = gl.gl_pathv[j]; - if(*lastchar(fname) == '/') - continue; - if(inc_counter >= INI_INCLUDE_MAX) - SAFEPRINTF2(str, "; %s - MAXIMUM INCLUDES REACHED: %u", fname, INI_INCLUDE_MAX); - else if((insert_fp=fopen(fname,"r"))==NULL) - SAFEPRINTF2(str, "; %s - FAILURE: %s", fname, safe_strerror(errno, err, sizeof(err))); - else - SAFEPRINTF(str, "; %s", fname); - strListInsert(&list, str, i + 1); - if(insert_fp!=NULL) { - strListInsertFile(insert_fp, &list, i + 2, INI_MAX_LINE_LEN); - fclose(insert_fp); - insert_fp=NULL; - inc_counter++; - } - } - globfree(&gl); - } - } - - /* truncate new-line chars off end of strings */ - for(i=0; list[i]!=NULL; i++) - truncnl(list[i]); - - return(list); -} - -BOOL iniHasInclude(const str_list_t list) -{ - size_t i; - - /* Look for !include directives */ - size_t inc_len=strlen(INI_INCLUDE_DIRECTIVE) + 1; - for(i=0; list[i]!=NULL; i++) { - if(strnicmp(list[i], ";" INI_INCLUDE_DIRECTIVE, inc_len)==0) - return TRUE; - } - return FALSE; -} - -BOOL iniWriteFile(FILE* fp, const str_list_t list) -{ - size_t count; - long pos; - - rewind(fp); - count = strListWriteFile(fp,list,"\n"); - fflush(fp); - pos = ftell(fp); - if (pos == -1) - return (FALSE); - if(chsize(fileno(fp), pos)!=0) /* truncate */ - return(FALSE); - - return(count == strListCount(list)); -} - -#ifdef INI_FILE_TEST -void main(int argc, char** argv) -{ - int i; - size_t l; - char str[128]; - FILE* fp; - str_list_t list; - - for(i=1;i<argc;i++) { - if((fp=iniOpenFile(argv[i],FALSE)) == NULL) { - perror(argv[i]); - continue; - } - if((list=iniReadFile(fp)) != NULL) { - iniSortSections(&list, TRUE); - for(size_t j = 0; list[j] != NULL; j++) - printf("%s\n", list[j]); - strListFree(&list); - } - fclose(fp); - } -} -#endif diff --git a/xpdev/ini_file.h b/xpdev/ini_file.h deleted file mode 100644 index 5830995ccbd20f6bd3fce3a1172e0ed54d3a94c0..0000000000000000000000000000000000000000 --- a/xpdev/ini_file.h +++ /dev/null @@ -1,293 +0,0 @@ -/* Functions to parse ini (initialization / configuration) files */ - -/* $Id: ini_file.h,v 1.60 2020/04/03 18:41:45 rswindell Exp $ */ -// vi: tabstop=4 - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _INI_FILE_H -#define _INI_FILE_H - -#if !defined(NO_SOCKET_SUPPORT) - #include "sockwrap.h" /* inet_addr, SOCKET */ -#endif -#include "genwrap.h" -#include "str_list.h" /* strList_t */ - -#define INI_MAX_VALUE_LEN 1024 /* Maximum value length, includes '\0' */ -#define ROOT_SECTION NULL - -typedef struct { - ulong bit; - const char* name; -} ini_bitdesc_t; - -typedef struct { - int key_len; - char* key_prefix; - char* section_separator; - char* value_separator; - char* bit_separator; - char* literal_separator; -} ini_style_t; - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Read all section names and return as an allocated string list */ -/* Optionally (if prefix!=NULL), returns a subset of section names */ -DLLEXPORT str_list_t iniReadSectionList(FILE*, const char* prefix); -/* Returns number (count) of sections */ -DLLEXPORT size_t iniReadSectionCount(FILE*, const char* prefix); -/* Read all key names and return as an allocated string list */ -DLLEXPORT str_list_t iniReadKeyList(FILE*, const char* section); -/* Read all key and value pairs and return as a named string list */ -DLLEXPORT named_string_t** - iniReadNamedStringList(FILE*, const char* section); - -/* Return the supported Log Levels in a string list - for *LogLevel macros */ -DLLEXPORT str_list_t iniLogLevelStringList(void); - -/* Return the unparsed/converted value */ -DLLEXPORT char* iniReadValue(FILE*, const char* section, const char* key - ,const char* deflt, char* value); -DLLEXPORT char* iniReadExistingValue(FILE*, const char* section, const char* key - ,const char* deflt, char* value); - -/* These functions read a single key of the specified type */ -DLLEXPORT char* iniReadString(FILE*, const char* section, const char* key - ,const char* deflt, char* value); -/* If the key doesn't exist, iniReadExistingString just returns NULL */ -DLLEXPORT char* iniReadExistingString(FILE*, const char* section, const char* key - ,const char* deflt, char* value); -DLLEXPORT str_list_t iniReadStringList(FILE*, const char* section, const char* key - ,const char* sep, const char* deflt); -DLLEXPORT long iniReadInteger(FILE*, const char* section, const char* key - ,long deflt); -DLLEXPORT ushort iniReadShortInt(FILE*, const char* section, const char* key - ,ushort deflt); -DLLEXPORT ulong iniReadLongInt(FILE*, const char* section, const char* key - ,ulong deflt); -DLLEXPORT int64_t iniReadBytes(FILE*, const char* section, const char* key - ,ulong unit, int64_t deflt); -DLLEXPORT double iniReadDuration(FILE*, const char* section, const char* key - ,double deflt); -DLLEXPORT double iniReadFloat(FILE*, const char* section, const char* key - ,double deflt); -DLLEXPORT BOOL iniReadBool(FILE*, const char* section, const char* key - ,BOOL deflt); -DLLEXPORT time_t iniReadDateTime(FILE*, const char* section, const char* key - ,time_t deflt); -DLLEXPORT unsigned iniReadEnum(FILE*, const char* section, const char* key - ,str_list_t names, unsigned deflt); -DLLEXPORT unsigned* iniReadEnumList(FILE*, const char* section, const char* key - ,str_list_t names, unsigned* count, const char* sep, const char* deflt); -DLLEXPORT int* iniReadIntList(FILE*, const char* section, const char* key - ,unsigned* count, const char* sep, const char* deflt); -DLLEXPORT long iniReadNamedInt(FILE*, const char* section, const char* key - ,named_long_t*, long deflt); -DLLEXPORT ulong iniReadNamedLongInt(FILE*, const char* section, const char* key - ,named_ulong_t*, ulong deflt); -DLLEXPORT double iniReadNamedFloat(FILE*, const char* section, const char* key - ,named_double_t*, double deflt); -DLLEXPORT ulong iniReadBitField(FILE*, const char* section, const char* key - ,ini_bitdesc_t* bitdesc, ulong deflt); -#define iniReadLogLevel(f,s,k,d) iniReadEnum(f,s,k,iniLogLevelStringList(),d) - -/* Free string list returned from iniRead*List functions */ -DLLEXPORT void* iniFreeStringList(str_list_t list); - -/* Free named string list returned from iniReadNamedStringList */ -DLLEXPORT void* iniFreeNamedStringList(named_string_t** list); - - -/* File I/O Functions */ -DLLEXPORT char* iniFileName(char* dest, size_t maxlen, const char* dir, const char* fname); -DLLEXPORT FILE* iniOpenFile(const char* fname, BOOL create); -DLLEXPORT str_list_t iniReadFile(FILE*); -DLLEXPORT BOOL iniWriteFile(FILE*, const str_list_t); -DLLEXPORT BOOL iniCloseFile(FILE*); - -/* StringList functions */ -DLLEXPORT str_list_t iniGetSectionList(str_list_t list, const char* prefix); -DLLEXPORT size_t iniGetSectionCount(str_list_t list, const char* prefix); -DLLEXPORT str_list_t iniGetKeyList(str_list_t list, const char* section); -DLLEXPORT named_string_t** - iniGetNamedStringList(str_list_t list, const char* section); - -/* Return the unparsed value (string literals not supported): */ -DLLEXPORT char* iniGetValue(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); -DLLEXPORT char* iniGetExistingValue(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); - -/* Return the string value (potentially string literals separated by colon rather than equal): */ -DLLEXPORT char* iniGetString(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); -/* If the key doesn't exist, iniGetExistingString just returns NULL */ -DLLEXPORT char* iniGetExistingString(str_list_t, const char* section, const char* key - ,const char* deflt, char* value /* may be NULL */); -DLLEXPORT str_list_t iniGetStringList(str_list_t, const char* section, const char* key - ,const char* sep, const char* deflt); -DLLEXPORT long iniGetInteger(str_list_t, const char* section, const char* key - ,long deflt); -DLLEXPORT ushort iniGetShortInt(str_list_t, const char* section, const char* key - ,ushort deflt); -DLLEXPORT ulong iniGetLongInt(str_list_t, const char* section, const char* key - ,ulong deflt); -DLLEXPORT int64_t iniGetBytes(str_list_t, const char* section, const char* key - ,ulong unit, int64_t deflt); -DLLEXPORT double iniGetDuration(str_list_t, const char* section, const char* key - ,double deflt); -DLLEXPORT double iniGetFloat(str_list_t, const char* section, const char* key - ,double deflt); -DLLEXPORT BOOL iniGetBool(str_list_t, const char* section, const char* key - ,BOOL deflt); -DLLEXPORT time_t iniGetDateTime(str_list_t, const char* section, const char* key - ,time_t deflt); -DLLEXPORT unsigned iniGetEnum(str_list_t, const char* section, const char* key - ,str_list_t names, unsigned deflt); -DLLEXPORT unsigned* iniGetEnumList(str_list_t, const char* section, const char* key - ,str_list_t names, unsigned* count, const char* sep, const char* deflt); -DLLEXPORT int* iniGetIntList(str_list_t, const char* section, const char* key - ,unsigned* count, const char* sep, const char* deflt); -DLLEXPORT long iniGetNamedInt(str_list_t, const char* section, const char* key - ,named_long_t*, long deflt); -DLLEXPORT ulong iniGetNamedLongInt(str_list_t, const char* section, const char* key - ,named_ulong_t*, ulong deflt); -DLLEXPORT double iniGetNamedFloat(str_list_t, const char* section, const char* key - ,named_double_t*, double deflt); -DLLEXPORT ulong iniGetBitField(str_list_t, const char* section, const char* key - ,ini_bitdesc_t* bitdesc, ulong deflt); -DLLEXPORT str_list_t iniGetSection(str_list_t, const char *section); -#define iniGetLogLevel(l,s,k,d) iniGetEnum(l,s,k,iniLogLevelStringList(),d) - -#if !defined(NO_SOCKET_SUPPORT) -DLLEXPORT ulong iniReadIpAddress(FILE*, const char* section, const char* key - ,ulong deflt); -DLLEXPORT ulong iniGetIpAddress(str_list_t, const char* section, const char* key - ,ulong deflt); -DLLEXPORT char* iniSetIpAddress(str_list_t*, const char* section, const char* key, ulong value - ,ini_style_t*); -DLLEXPORT struct in6_addr - iniReadIp6Address(FILE*, const char* section, const char* key - ,struct in6_addr deflt); -DLLEXPORT struct in6_addr - iniGetIp6Address(str_list_t, const char* section, const char* key - ,struct in6_addr deflt); -DLLEXPORT char* iniSetIp6Address(str_list_t*, const char* section, const char* key, struct in6_addr value - ,ini_style_t*); -DLLEXPORT int iniGetSocketOptions(str_list_t, const char* section - ,SOCKET sock, char* error, size_t errlen); -#endif - -DLLEXPORT void iniSetDefaultStyle(ini_style_t); - -DLLEXPORT char* iniSetString(str_list_t*, const char* section, const char* key, const char* value - ,ini_style_t*); -DLLEXPORT char* iniSetStringLiteral(str_list_t*, const char* section, const char* key, const char* value - ,ini_style_t*); -DLLEXPORT char* iniSetValue(str_list_t*, const char* section, const char* key, const char* value - ,ini_style_t*); -DLLEXPORT char* iniSetInteger(str_list_t*, const char* section, const char* key, long value - ,ini_style_t*); -DLLEXPORT char* iniSetShortInt(str_list_t*, const char* section, const char* key, ushort value - ,ini_style_t*); -DLLEXPORT char* iniSetLongInt(str_list_t*, const char* section, const char* key, ulong value - ,ini_style_t*); -DLLEXPORT char* iniSetBytes(str_list_t*, const char* section, const char* key, ulong unit, int64_t value - ,ini_style_t*); -DLLEXPORT char* iniSetDuration(str_list_t*, const char* section, const char* key, double value - ,ini_style_t*); -DLLEXPORT char* iniSetHexInt(str_list_t*, const char* section, const char* key, ulong value - ,ini_style_t*); -DLLEXPORT char* iniSetFloat(str_list_t*, const char* section, const char* key, double value - ,ini_style_t*); -DLLEXPORT char* iniSetBool(str_list_t*, const char* section, const char* key, BOOL value - ,ini_style_t*); -DLLEXPORT char* iniSetDateTime(str_list_t*, const char* section, const char* key, BOOL include_time, time_t - ,ini_style_t*); -DLLEXPORT char* iniSetEnum(str_list_t*, const char* section, const char* key, str_list_t names - ,unsigned value, ini_style_t*); -DLLEXPORT char* iniSetEnumList(str_list_t*, const char* section, const char* key - ,const char* sep, str_list_t names, unsigned* values, unsigned count, ini_style_t*); -DLLEXPORT char* iniSetNamedInt(str_list_t*, const char* section, const char* key, named_long_t* - ,long value, ini_style_t*); -DLLEXPORT char* iniSetNamedHexInt(str_list_t*, const char* section, const char* key, named_ulong_t* - ,ulong value, ini_style_t*); -DLLEXPORT char* iniSetNamedLongInt(str_list_t*, const char* section, const char* key, named_ulong_t* - ,ulong value, ini_style_t*); -DLLEXPORT char* iniSetNamedFloat(str_list_t*, const char* section, const char* key, named_double_t* - ,double value, ini_style_t*); -DLLEXPORT char* iniSetBitField(str_list_t*, const char* section, const char* key, ini_bitdesc_t*, ulong value - ,ini_style_t*); -DLLEXPORT char* iniSetStringList(str_list_t*, const char* section, const char* key - ,const char* sep, str_list_t value, ini_style_t*); -#define iniSetLogLevel(l,s,k,v,style) iniSetEnum(l,s,k,iniLogLevelStringList(),v,style) -DLLEXPORT char* iniSetIntList(str_list_t*, const char* section, const char* key - ,const char* sep, int* value, unsigned count, ini_style_t*); - -DLLEXPORT size_t iniAddSection(str_list_t*, const char* section - ,ini_style_t*); - -DLLEXPORT size_t iniAppendSection(str_list_t*, const char* section - ,ini_style_t*); - -DLLEXPORT size_t iniAppendSectionWithKeys(str_list_t*, const char* section, const str_list_t keys - ,ini_style_t*); - -DLLEXPORT BOOL iniSectionExists(str_list_t, const char* section); -DLLEXPORT BOOL iniKeyExists(str_list_t, const char* section, const char* key); -DLLEXPORT BOOL iniValueExists(str_list_t, const char* section, const char* key); -DLLEXPORT char* iniPopKey(str_list_t*, const char* section, const char* key, char* value); -DLLEXPORT char* iniPopString(str_list_t*, const char* section, const char* key, char* value); -DLLEXPORT BOOL iniRemoveKey(str_list_t*, const char* section, const char* key); -DLLEXPORT BOOL iniRemoveValue(str_list_t*, const char* section, const char* key); -DLLEXPORT BOOL iniRemoveSection(str_list_t*, const char* section); -DLLEXPORT BOOL iniRemoveSections(str_list_t*, const char* prefix); -DLLEXPORT BOOL iniRenameSection(str_list_t*, const char* section, const char* newname); -DLLEXPORT BOOL iniSortSections(str_list_t*, BOOL sort_keys); - -DLLEXPORT BOOL iniHasInclude(const str_list_t); - -/* - * Too handy to leave internal - */ -DLLEXPORT unsigned* parseEnumList(const char* values, const char* sep, const char** const names, unsigned* count); -DLLEXPORT int* parseIntList(const char* values, const char* sep, unsigned* count); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/ini_file.txt b/xpdev/ini_file.txt deleted file mode 100644 index 92c65d21c7b6872daef81aa08c3a3107af0cce33..0000000000000000000000000000000000000000 --- a/xpdev/ini_file.txt +++ /dev/null @@ -1,213 +0,0 @@ -$Id: ini_file.txt,v 1.2 2005/10/13 10:16:07 rswindell Exp $ - -Synchronet/xpdev ini_file module --------------------------------- -The basic format of the files supported by the xpdev ini_file module is that -of the Windows .ini file, with some additional features. - -The basic Windows .ini file format is as follows: - -1. The file contains ASCII text only with LF or CR/LF-terminated lines. - -2. The file is separated into logical "sections". Each section may have its - own list of keys with associated values, one per line. - -3. A section begins with a line consisting only of "[" <section name> "]". - -4. White space before or after the section name is ignored. - -5. A section ends when the end of file is reached or a new section begins. - -6. Keys and associated values within a section are specified, each on their - line, in the format: <key_name> "=" <value> - -7. White space before and after the key/value separator ("=") is ignored. - -8. Comments are lines with a semicolon (";") as the first non-whitespace - character. - -9. Blank lines between or within sections are ignored. - -Example basic Windows .ini file content: - -; for 16-bit app support -[fonts] -[extensions] -[Mail] -MAPI=1 -CMCDLLNAME32=mapi32.dll -CMCDLLNAME=mapi.dll -CMC=1 -MAPIX=1 -MAPIXVER=1.0.0.1 -OLEMessaging=1 -[SciCalc] -layout=0 -[MSUCE] -Advanced=1 -CodePage=Unicode -Font=Terminal - - -Synchronet/xpdev extended-ini_file format -========================================= -The Synchronet/xpdev ini_file module supports a somewhat "extended" .ini file -format with the following additions: - -Filenames ---------- -INI filenames typically end in a ".ini" suffix, but that is not a requirement. - -If the application uses the ini_file module's iniFileName() function to -determine the correct ini filename for the current system, different ini files -may be used for different systems on the same network, reading from the same -directory. - -The different ini filename permutations supported (assuming "file.ini" is the -base filename) are: - - path/file.<host>.<domain>.ini - path/file.<host>.ini - path/file.<platform>.ini - path/file.ini - -Root section ------------- -Key/value pairs in the file *before* the first section definition are -considered part of the "root" section. This section is often used to define -key/value pairs that apply globally to all the following sections. The root -section may have other uses as well. - -Section Prefixes ----------------- -Section names may be include a section "prefix", a fixed portion of the -section name that may be used be the application to logically group -related sections. Section pre-fixes typically end in a colon, but that is -not a requirement. - -Literal string values ---------------------- -String values separated by the key name with a colon (':') instead of an -equals sign ('='), are parsed as "literal" strings, which means the string -will retain any trailing white-space on the line. This may be enhanced in -the future to support C escape sequences, multiple/broken lines, etc. - -Section name list ------------------ -If one wishes to specify a list of sections for all values to be applied to -they may specify a list of section names, separated by '|', where a single -section name would normally be specified. Example: -"[telnet|rlogin]" - -Boolean values --------------- -Values with an either true or false (1 or 0) state can have their value -specified as a number (0, or non-zero), or the following strings (yes, -English only): "true", "yes", or "on" (interpretted as 1), or "false", -"no", or "off" (interpretted as 0). Any otherwise unrecognized text strings -will be interpretted as 0 (false). - -Integer values --------------- -Integer values may be negative or positive whole numbers of up to -(at least) 32-bits in size. - -Integer values may be specified in octal (base 8), decimal (base 10), -hexadecimal (base 16), or base 36 formats based on the following -interpretation of the specified value text: - -If the first character is 0 and the second character is not 'x' or 'X', the -string is interpreted as an octal integer; otherwise, it is interpreted as -a decimal number. If the first character is '0' and the second character is -'x' or 'X', the string is interpreted as a hexadecimal integer. If the -first character is '1' through '9', the string is interpreted as a decimal -integer. The letters 'a' through 'z' (or 'A' through 'Z') are assigned the -values 10 through 35. - -The exception to this rule are the values of "true", "yes", or "on", -always interpretted as the value of 1 (one). - -Long integer values -------------------- -Long integer values may be positive whole numbers of up to (at least) -32-bits in size. Otherwise, long integer values are interpretted the same as -normal integer values. - -Log levels ----------- -The ini_file module includes built-in support for the standard Unix syslog -levels: Emergency (0), Alert (1), Critical (2), Error (3), Warning (4), -Notice (5), Informational (6), and Debugging (7). - -The higher the log level, the more log output will be generated. - -Partial or complete log level names may be specified for the log level -value, or the numeric equivalent. - -Byte counts ------------ -Byte count values (e.g. file sizes) may be specified as positive numbers -(fractional numbers are supported), optionally with a 'T', 'G', 'M', or 'K' -suffix to specify terabytes, gigabytes, megabytes, or kilobytes, respectively. - -Date/Time stamps ----------------- -Date and time values may be specified in any of the following formats: - -ISO-8601 date and time format: "CCYYMMDDThhmmss" -Euro/Canadian numeric date format: "DD.MM.[CC]YY [time] [p]" -American numeric date format: "MM/DD/[CC]YY [time] [p]" -Perversion of RFC822 date format: "DD[-]Mon [CC]YY [time] [p]" -IETF standard (RFC2822) date format: "Wday, DD Mon [CC]YY [time]" -Preferred date format: "Mon DD[,] [CC]YY [time] [p]" -JavaScript Date.toString() format: "Wday Mon DD [CC]YY [time]" -ctime() format: "Wday Mon DD [time] [CC]YY" -time_t format: seconds since Jan 1, 1970 UTC - -where: - CC = Century (i.e. "19" or "20") - YY = Year number (e.g. "05") - MM = Month number (1-12) - DD = Day of month (1-31) - hh = Hour of day (0-23) - mm = Minute of hour (0-59) - ss = Second of minute (0-59) - p = AM/PM designation - time = Time of day specified as "hh[:mm[:ss]]" - Mon = Month name (e.g. "Jan", "Feb", etc.) - Wday = Weekday name (e.g. "Mon", "Tue", etc.) - [] = Optional parameter - -Bit-fields ----------- -Bit-field values may be specified as a positive number (same rules of -interpretation as integer values), a bit-name, or a list of numbers or -bit-names separated by the '|' character. - -Bit-fields are often used to specify multiple boolean-type values in -a single key/value pair. - -Include directive ------------------ -An ini file may be include/imported/inserted into a another with the -"!include" directive. The line must begin with "!include", followed by -white space, and then a filename to include (optionally with a path). -Sections may span files. - -file1.ini: -[section_one] - key1 = value1 -!include file2.ini - -file2.ini: - key2 = value2 - -In the above example, both key1 and key2 are part of section_one. - -End-of-file directive ---------------------- -An ini file may be prematurely terminated with the "!eof" directive. This -stops the ini_file module functions from processing any lines following this -directive. - - diff --git a/xpdev/link_list.c b/xpdev/link_list.c deleted file mode 100644 index 2ecbfa327733924b8903341dbb5be5374dcca96a..0000000000000000000000000000000000000000 --- a/xpdev/link_list.c +++ /dev/null @@ -1,963 +0,0 @@ -/* Double-Linked-list library */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* malloc */ -#include <string.h> /* memset */ -#include "link_list.h" -#include "genwrap.h" - -#if defined(_WIN32) && defined(LINK_LIST_USE_HEAPALLOC) - #define malloc(size) HeapAlloc(GetProcessHeap(), /* flags: */0, size) - #define free(ptr) HeapFree(GetProcessHeap(), /* flags: */0, ptr) -#endif - -link_list_t* listInit(link_list_t* list, long flags) -{ - if(list == NULL) - return NULL; - - memset(list,0,sizeof(link_list_t)); - - list->flags = flags; - -#if defined(LINK_LIST_THREADSAFE) - if(list->flags&LINK_LIST_MUTEX) { - list->mutex = pthread_mutex_initializer_np(/* recursive: */TRUE); - } - - if(list->flags&LINK_LIST_SEMAPHORE) - sem_init(&list->sem,0,0); -#endif - - if(flags&LINK_LIST_ATTACH) - listAttach(list); - - return(list); -} - -BOOL listFreeNodeData(list_node_t* node) -{ - if(node!=NULL && node->data!=NULL && !(node->flags&LINK_LIST_LOCKED)) { - free(node->data); - node->data = NULL; - return(TRUE); - } - return(FALSE); -} - -long listFreeNodes(link_list_t* list) -{ - list_node_t* node; - list_node_t* next; - - if(list==NULL) - return(-1); - - listLock(list); - - for(node=list->first; node!=NULL; node=next) { - - if(node->flags&LINK_LIST_LOCKED) - break; - - if(((list->flags&LINK_LIST_ALWAYS_FREE) || (node->flags&LINK_LIST_MALLOC)) - && !(list->flags&LINK_LIST_NEVER_FREE)) - listFreeNodeData(node); - - next = node->next; - - free(node); - - if(list->count) - list->count--; - } - - list->first = node; - if(!list->count) - list->last = NULL; - - listUnlock(list); - - return(list->count); -} - -BOOL listFree(link_list_t* list) -{ - if(list==NULL) - return(FALSE); - - if(listFreeNodes(list)) - return(FALSE); - -#if defined(LINK_LIST_THREADSAFE) - - if(list->flags&LINK_LIST_MUTEX) { - while(pthread_mutex_destroy((pthread_mutex_t*)&list->mutex)==EBUSY) - SLEEP(1); - list->flags&=~LINK_LIST_MUTEX; - } - - if(list->flags&LINK_LIST_SEMAPHORE) { - while(sem_destroy(&list->sem)==-1 && errno==EBUSY) - SLEEP(1); - //list->sem=(sem_t)NULL; /* Removed 08-20-08 - list->sem is never checked and this causes an error with gcc 4.1.2 (ThetaSigma) */ - list->flags&=~LINK_LIST_SEMAPHORE; - } -#endif - - return(TRUE); -} - -long listAttach(link_list_t* list) -{ - if(list==NULL) - return(-1); - - listLock(list); - list->refs++; - listUnlock(list); - - return(list->refs); -} - -long listDettach(link_list_t* list) -{ - int refs; - - if(list==NULL || list->refs<1) - return(-1); - - listLock(list); - if((refs=--list->refs)==0) - listFree(list); - else - listUnlock(list); - - return(refs); -} - -void* listSetPrivateData(link_list_t* list, void* p) -{ - void* old; - - if(list==NULL) - return(NULL); - - listLock(list); - old=list->private_data; - list->private_data=p; - listUnlock(list); - return(old); -} - -void* listGetPrivateData(link_list_t* list) -{ - if(list==NULL) - return(NULL); - return(list->private_data); -} - -#if defined(LINK_LIST_THREADSAFE) - -BOOL listSemPost(link_list_t* list) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_post(&list->sem)==0); -} - -BOOL listSemWait(link_list_t* list) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_wait(&list->sem)==0); -} - -BOOL listSemTryWait(link_list_t* list) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_trywait(&list->sem)==0); -} - -BOOL listSemTryWaitBlock(link_list_t* list, unsigned long timeout) -{ - if(list==NULL || !(list->flags&LINK_LIST_SEMAPHORE)) - return(FALSE); - - return(sem_trywait_block(&list->sem,timeout)==0); -} - -#endif - -BOOL listLock(link_list_t* list) -{ - int ret=0; - - if(list==NULL) - return(FALSE); -#if defined(LINK_LIST_THREADSAFE) - if((list->flags&LINK_LIST_MUTEX) && (ret=pthread_mutex_lock(&list->mutex))==0) -#endif - list->locks++; - return(ret==0); -} - -BOOL listIsLocked(const link_list_t* list) -{ - if(list==NULL) - return(FALSE); - return(list->locks > 0 ? TRUE : FALSE); -} - -BOOL listUnlock(link_list_t* list) -{ - int ret=0; - - if(list==NULL) - return(FALSE); -#if defined(LINK_LIST_THREADSAFE) - if((list->flags&LINK_LIST_MUTEX) && (ret=pthread_mutex_unlock(&list->mutex))==0) -#endif - list->locks--; - return(ret==0); -} - -long listCountNodes(link_list_t* list) -{ - long count=0; - list_node_t* node; - - if(list==NULL) - return(-1); - - if(list->count) - return(list->count); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) - count++; - - listUnlock(list); - - return(count); -} - -list_node_t* listFindNode(link_list_t* list, const void* data, size_t length) -{ - list_node_t* node; - - if(list==NULL) - return(NULL); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) { - if(length==0) { - if(node->data==data) - break; - } else if(data==NULL) { - if(node->tag==(list_node_tag_t)length) - break; - } else if(node->data!=NULL && memcmp(node->data,data,length)==0) - break; - } - - listUnlock(list); - - return(node); -} - -ulong listCountMatches(link_list_t* list, const void* data, size_t length) -{ - list_node_t* node; - ulong matches = 0; - - if(list==NULL) - return 0; - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) { - if(length==0) { - if(node->data!=data) - continue; - } else if(data==NULL) { - if(node->tag==(list_node_tag_t)length) - continue; - } else if(node->data==NULL || memcmp(node->data,data,length)!=0) - continue; - matches++; - } - - listUnlock(list); - - return matches; -} - -#ifndef NO_STR_LIST_SUPPORT - -str_list_t listStringList(link_list_t* list) -{ - list_node_t* node; - str_list_t str_list; - size_t count=0; - - if(list==NULL) - return(NULL); - - if((str_list=strListInit())==NULL) - return(NULL); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) { - if(node->data!=NULL) - strListAppend(&str_list, (char*)node->data, count++); - } - - listUnlock(list); - - return(str_list); -} - -str_list_t listSubStringList(const list_node_t* node, long max) -{ - long count; - str_list_t str_list; - link_list_t* list; - - if(node==NULL) - return(NULL); - - if((str_list=strListInit())==NULL) - return(NULL); - - list=node->list; - listLock(list); - - for(count=0; count<max && node!=NULL; node=node->next) { - if(node->data!=NULL) - strListAppend(&str_list, (char*)node->data, count++); - } - - listUnlock(list); - - return(str_list); -} - -void* listFreeStringList(str_list_t list) -{ - strListFree(&list); - return(list); -} - -#endif /* #ifndef NO_STR_LIST_SUPPORT */ - -list_node_t* listFirstNode(link_list_t* list) -{ - list_node_t* node; - - if(list==NULL) - return(NULL); - - listLock(list); - node=list->first; - listUnlock(list); - - return(node); -} - -list_node_t* listLastNode(link_list_t* list) -{ - list_node_t* node; - list_node_t* last=NULL; - - if(list==NULL) - return(NULL); - - listLock(list); - if(list->last!=NULL) - last=list->last; - else - for(node=list->first; node!=NULL; node=node->next) - last=node; - listUnlock(list); - - return(last); -} - -long listNodeIndex(link_list_t* list, list_node_t* find_node) -{ - long i=0; - list_node_t* node; - - if(list==NULL) - return(-1); - - listLock(list); - - for(node=list->first; node!=NULL; node=node->next) - if(node==find_node) - break; - - listUnlock(list); - - if(node==NULL) - return(-1); - - return(i); -} - -list_node_t* listNodeAt(link_list_t* list, long index) -{ - long i=0; - list_node_t* node; - - if(list==NULL || index<0) - return(NULL); - - listLock(list); - - for(node=list->first; node!=NULL && i<index; node=node->next) - i++; - - listUnlock(list); - - return(node); -} - -list_node_t* listNextNode(const list_node_t* node) -{ - list_node_t* next; - - if(node==NULL) - return(NULL); - - listLock(node->list); - next=node->next; - listUnlock(node->list); - - return(next); -} - -list_node_t* listPrevNode(const list_node_t* node) -{ - list_node_t* prev; - - if(node==NULL) - return(NULL); - - listLock(node->list); - prev=node->prev; - listUnlock(node->list); - - return(prev); -} - -void* listNodeData(const list_node_t* node) -{ - void* data; - - if(node==NULL) - return(NULL); - - listLock(node->list); - data=node->data; - listUnlock(node->list); - - return(data); -} - -BOOL listNodeIsLocked(const list_node_t* node) -{ - return(node!=NULL && (node->flags&LINK_LIST_LOCKED)); -} - -BOOL listLockNode(list_node_t* node) -{ - if(node==NULL || (node->flags&LINK_LIST_LOCKED)) - return(FALSE); - - listLock(node->list); - node->flags|=LINK_LIST_LOCKED; - listUnlock(node->list); - - return(TRUE); -} - -BOOL listUnlockNode(list_node_t* node) -{ - if(!listNodeIsLocked(node)) - return(FALSE); - - listLock(node->list); - node->flags&=~LINK_LIST_LOCKED; - listUnlock(node->list); - - return(TRUE); -} - -static list_node_t* list_add_node(link_list_t* list, list_node_t* node, list_node_t* after) -{ - if(list==NULL) - return(NULL); - - listLock(list); - - node->list = list; - if(after==LAST_NODE) /* e.g. listPushNode() */ - after=list->last; - node->prev = after; - - if(after==list->last) /* append to list */ - list->last = node; - if(after==FIRST_NODE) { /* insert at beginning of list */ - node->next = list->first; - if(node->next!=NULL) - node->next->prev = node; - list->first = node; - } else { - if(after->next!=NULL) { - after->next->prev = node; - node->next = after->next; - } - after->next = node; - } - - list->count++; - - listUnlock(list); - -#if defined(LINK_LIST_THREADSAFE) - if(list->flags&LINK_LIST_SEMAPHORE) - listSemPost(list); -#endif - - return(node); -} - -list_node_t* listAddNode(link_list_t* list, void* data, list_node_tag_t tag, list_node_t* after) -{ - list_node_t* node; - - if(list==NULL) - return(NULL); - - if((node=(list_node_t*)malloc(sizeof(list_node_t)))==NULL) - return(NULL); - - memset(node,0,sizeof(list_node_t)); - node->data = data; - node->tag = tag; - - return(list_add_node(list,node,after)); -} - -long listAddNodes(link_list_t* list, void** data, list_node_tag_t* tag, list_node_t* after) -{ - long i; - list_node_t* node=NULL; - - if(data==NULL) - return(-1); - - for(i=0; data[i]!=NULL ;i++) - if((node=listAddNode(list,data[i],tag==NULL ? LIST_NODE_TAG_DEFAULT : *(tag++),node==NULL ? after:node))==NULL) - return(i); - - return(i); -} - -list_node_t* listAddNodeData(link_list_t* list, const void* data, size_t length, list_node_tag_t tag, list_node_t* after) -{ - list_node_t* node; - void* buf; - - if((buf=malloc(length))==NULL) - return(NULL); - memcpy(buf,data,length); - - if((node=listAddNode(list,buf,tag,after))==NULL) { - free(buf); - return(NULL); - } - node->flags |= LINK_LIST_MALLOC; - - return(node); -} - -list_node_t* listAddNodeString(link_list_t* list, const char* str, list_node_tag_t tag, list_node_t* after) -{ - list_node_t* node; - char* buf; - - if(str==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - if((node=listAddNode(list,buf,tag,after))==NULL) { - free(buf); - return(NULL); - } - node->flags |= LINK_LIST_MALLOC; - - return(node); -} - -#ifndef NO_STR_LIST_SUPPORT - -long listAddStringList(link_list_t* list, str_list_t str_list, list_node_tag_t* tag, list_node_t* after) -{ - long i; - list_node_t* node=NULL; - - if(str_list==NULL) - return(-1); - - for(i=0; str_list[i]!=NULL ;i++) - if((node=listAddNodeString(list,str_list[i],tag==NULL ? LIST_NODE_TAG_DEFAULT : *(tag++),node==NULL ? after:node))==NULL) - return(i); - - return(i); -} - -#endif - -long listAddNodeList(link_list_t* list, const link_list_t* src, list_node_t* after) -{ - long count=0; - list_node_t* node=NULL; - list_node_t* src_node; - - if(src==NULL) - return(-1); - - for(src_node=src->first; src_node!=NULL; src_node=src_node->next, count++) { - if((node=listAddNode(list, src_node->data, src_node->tag, node==NULL ? after:node))==NULL) - return(count); - node->flags = src_node->flags; - } - - return(count); -} - -long listMerge(link_list_t* list, const link_list_t* src, list_node_t* after) -{ - long count=0; - list_node_t* node=NULL; - list_node_t* src_node; - - if(src==NULL) - return(-1); - - for(src_node=src->first; src_node!=NULL; src_node=src_node->next, count++) - if((node=list_add_node(list, src_node, node==NULL ? after:node))==NULL) - return(count); - - return(count); -} - -link_list_t* listExtract(link_list_t* dest_list, const list_node_t* node, long max) -{ - long count; - link_list_t* list; - - if(node==NULL || node->list==NULL) - return(NULL); - - if((list=listInit(dest_list, node->list->flags))==NULL) - return(NULL); - - for(count=0; count<max && node!=NULL; node=node->next) { - listAddNode(list, node->data, node->tag, list->last); - count++; - } - - return(list); -} - -static void* list_remove_node(link_list_t* list, list_node_t* node, BOOL free_data) -{ - void* data; - - if(node==FIRST_NODE) - node=list->first; - else if(node==LAST_NODE) - node=list->last; - if(node==NULL) - return(NULL); - - if(node->flags&LINK_LIST_LOCKED) - return(NULL); - - if(node->prev!=NULL) - node->prev->next = node->next; - if(node->next!=NULL) - node->next->prev = node->prev; - if(list->first==node) - list->first = node->next; - if(list->last==node) - list->last = node->prev; - - if(free_data) - listFreeNodeData(node); - - data = node->data; - - free(node); - - if(list->count) - list->count--; - - return(data); -} - -void* listRemoveNode(link_list_t* list, list_node_t* node, BOOL free_data) -{ - void* data; - - if(list==NULL) - return(NULL); - - listLock(list); - - data = list_remove_node(list, node, free_data); - - listUnlock(list); - - return(data); -} - -void* listRemoveTaggedNode(link_list_t* list, list_node_tag_t tag, BOOL free_data) -{ - void* data=NULL; - list_node_t* node; - - if(list==NULL) - return(NULL); - - listLock(list); - - if((node=listFindTaggedNode(list, tag)) != NULL) - data = list_remove_node(list, node, free_data); - - listUnlock(list); - - return(data); -} - -long listRemoveNodes(link_list_t* list, list_node_t* node, long max, BOOL free_data) -{ - list_node_t *next_node; - long count; - - if(list==NULL) - return(-1); - - listLock(list); - - if(node==FIRST_NODE) - node=list->first; - if(node==LAST_NODE) - node=list->last; - - for(count=0; node!=NULL && count<max; node=next_node, count++) { - next_node = node->next; - if(listRemoveNode(list, node, free_data)==NULL) - break; - } - - listUnlock(list); - - return(count); -} - -BOOL listSwapNodes(list_node_t* node1, list_node_t* node2) -{ - list_node_t tmp; - - if(node1==NULL || node2==NULL || node1==node2) - return(FALSE); - - if(listNodeIsLocked(node1) || listNodeIsLocked(node2)) - return(FALSE); - - if(node1->list==NULL || node2->list==NULL) - return(FALSE); - -#if defined(LINK_LIST_THREADSAFE) - listLock(node1->list); - if(node1->list != node2->list) - listLock(node2->list); -#endif - - tmp=*node1; - node1->tag=node2->tag; - node1->data=node2->data; - node1->flags=node2->flags; - node2->tag=tmp.tag; - node2->data=tmp.data; - node2->flags=tmp.flags; - -#if defined(LINK_LIST_THREADSAFE) - listUnlock(node1->list); - if(node1->list != node2->list) - listUnlock(node2->list); -#endif - - return(TRUE); -} - -static void list_update_prev(link_list_t* list) -{ - list_node_t* node; - list_node_t* prev = NULL; - - if(list == NULL) - return; - - node = list->first; - while(node != NULL) { - node->prev = prev; - prev = node; - node = node->next; - } -} - -void listReverse(link_list_t* list) -{ - list_node_t* node; - list_node_t* prev; - - if(list == NULL) - return; - - node = list->first; - - if(node == NULL) - return; - - listLock(list); - - list->last = list->first; - - prev = NULL; - while(node != NULL) { - list_node_t* next = node->next; - node->next = prev; - prev = node; - node = next; - } - - list->first = prev; - - list_update_prev(list); - - listUnlock(list); -} - -long listVerify(link_list_t* list) -{ - list_node_t* node; - list_node_t* prev = NULL; - long result = 0; - - if(list == NULL) - return -1; - - listLock(list); - - node = list->first; - while(node != NULL) { - if(node->list != list) { - result = -2; - break; - } - if(node->prev != prev) { - result = -3; - break; - } - prev = node; - node = node->next; - result++; - } - if(result >= 0 && list->last != prev) - result = -4; - - if(result >= 0 && result != list->count) - result = -5; - - listUnlock(list); - - return result; -} - -#if 0 - -#include <stdio.h> /* printf, sprintf */ - -int main(int arg, char** argv) -{ - int i; - long result; - char* p; - char str[32]; - link_list_t list; - - listInit(&list,0); - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - for(i=0; i<100; i++) { - sprintf(str,"%u",i); - listPushNodeString(&list,str); - } - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - listReverse(&list); - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - while((p=listShiftNode(&list))!=NULL) - printf("%d %s\n",listCountNodes(&list),p), free(p); - if((result = listVerify(&list)) < 0) { - fprintf(stderr, "line %d: listVerify() returned %ld\n", __LINE__, result); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} - -#endif diff --git a/xpdev/link_list.h b/xpdev/link_list.h deleted file mode 100644 index c2bf6fc6334f2091f95210e2b0affaaa07f1e6e0..0000000000000000000000000000000000000000 --- a/xpdev/link_list.h +++ /dev/null @@ -1,205 +0,0 @@ -/* Double-Linked-list library */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _LINK_LIST_H -#define _LINK_LIST_H - -#include <stddef.h> /* size_t */ -#include <xpdevplus.h> -#include "wrapdll.h" -#include "str_list.h" /* string list functions and types */ - -#if defined(LINK_LIST_THREADSAFE) - #include "threadwrap.h" /* mutexes */ - #include "semwrap.h" /* semaphores */ -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -#define FIRST_NODE ((list_node_t*)NULL) /* Special value to specify first node in list */ -#define LAST_NODE ((list_node_t*)-1) /* Special value to specify last node in list */ - -/* Valid link_list_t.flags and list_node_t.flags bits */ -#define LINK_LIST_MALLOC (1<<0) /* Node data allocated with malloc() */ -#define LINK_LIST_ALWAYS_FREE (1<<1) /* ALWAYS free node data in listFreeNodes() */ -#define LINK_LIST_NEVER_FREE (1<<2) /* NEVER free node data (careful of memory leaks!) */ -#define LINK_LIST_MUTEX (1<<3) /* Mutex-protected linked-list */ -#define LINK_LIST_SEMAPHORE (1<<4) /* Semaphore attached to linked-list */ -#define LINK_LIST_LOCKED (1<<5) /* Node is locked */ -#define LINK_LIST_ATTACH (1<<6) /* Attach during init */ - -/* in case the default tag type is not sufficient for your needs, you can over-ride */ -#if !defined(list_node_tag_t) - typedef long list_node_tag_t; -#endif -#if !defined(LIST_NODE_TAG_DEFAULT) - #define LIST_NODE_TAG_DEFAULT 0 -#endif - -typedef struct list_node { - void* data; /* pointer to some kind of data */ - struct list_node* next; /* next node in list (or NULL) */ - struct list_node* prev; /* previous node in list (or NULL) */ - struct link_list* list; - unsigned long flags; /* private use flags (by this library) */ - list_node_tag_t tag; /* application use value */ -} list_node_t; - -typedef struct link_list { - list_node_t* first; /* first node in list (or NULL) */ - list_node_t* last; /* last node in list (or NULL) */ - unsigned long flags; /* private use flags (by this library) */ - long count; /* number of nodes in list */ - void* private_data; /* for use by the application/caller */ - long refs; /* reference counter (attached clients) */ - long locks; /* recursive lock counter */ -#if defined(LINK_LIST_THREADSAFE) - pthread_mutex_t mutex; - sem_t sem; -#endif -} link_list_t; - -/* Initialization, Allocation, and Freeing of Lists and Nodes */ -DLLEXPORT link_list_t* listInit(link_list_t* /* NULL to auto-allocate */, long flags); -DLLEXPORT BOOL listFree(link_list_t*); -DLLEXPORT long listFreeNodes(link_list_t*); -DLLEXPORT BOOL listFreeNodeData(list_node_t* node); - -/* Increment/decrement reference counter (and auto-free when zero), returns -1 on error */ -DLLEXPORT long listAttach(link_list_t*); -DLLEXPORT long listDetach(link_list_t*); - -#if defined(LINK_LIST_THREADSAFE) -DLLEXPORT BOOL listSemPost(link_list_t*); -DLLEXPORT BOOL listSemWait(link_list_t*); -DLLEXPORT BOOL listSemTryWait(link_list_t*); -DLLEXPORT BOOL listSemTryWaitBlock(link_list_t*, unsigned long timeout); -#endif - -/* Lock/unlock linked lists (works best for mutex-protected lists) */ -/* Locks are recursive (e.g. must call Unlock for each call to Lock */ -DLLEXPORT BOOL listLock(link_list_t*); -DLLEXPORT BOOL listUnlock(link_list_t*); -DLLEXPORT BOOL listIsLocked(const link_list_t*); -#define listForceUnlock(list) while(listUnlock(list)==TRUE) - -/* Return count or index of nodes, or -1 on error */ -DLLEXPORT long listCountNodes(link_list_t*); -DLLEXPORT long listNodeIndex(link_list_t*, list_node_t*); - -/* Get/Set list private data */ -DLLEXPORT void* listSetPrivateData(link_list_t*, void*); -DLLEXPORT void* listGetPrivateData(link_list_t*); - -/* Return an allocated string list (which must be freed), array of all strings in linked list */ -DLLEXPORT str_list_t listStringList(link_list_t*); - -/* Return an allocated string list (which must be freed), subset of strings in linked list */ -DLLEXPORT str_list_t listSubStringList(const list_node_t*, long max); - -/* Free a string list returned from either of the above functions */ -DLLEXPORT void* listFreeStringList(str_list_t); - -/* Extract subset (up to max number of nodes) in linked list (src_node) and place into dest_list */ -/* dest_list == NULL, then allocate a return a new linked list */ -DLLEXPORT link_list_t* listExtract(link_list_t* dest_list, const list_node_t* src_node, long max); - -/* Simple search functions returning found node or NULL on error */ -DLLEXPORT list_node_t* listNodeAt(link_list_t*, long index); -/* Find a specific node by data or tag */ -/* Pass length of 0 to search by data pointer rather than by data content comparison (memcmp) */ -DLLEXPORT list_node_t* listFindNode(link_list_t*, const void* data, size_t length); -/* Find a specific node by its tag value */ -#define listFindTaggedNode(list, tag) listFindNode(list, NULL, tag) -/* Pass length of 0 to search by data pointer rather than by data content comparison (memcmp) */ -DLLEXPORT ulong listCountMatches(link_list_t*, const void* data, size_t length); - -/* Convenience functions */ -DLLEXPORT list_node_t* listFirstNode(link_list_t*); -DLLEXPORT list_node_t* listLastNode(link_list_t*); -DLLEXPORT list_node_t* listNextNode(const list_node_t*); -DLLEXPORT list_node_t* listPrevNode(const list_node_t*); -DLLEXPORT void* listNodeData(const list_node_t*); - -/* Primitive node locking (not recursive) */ -DLLEXPORT BOOL listLockNode(list_node_t*); -DLLEXPORT BOOL listUnlockNode(list_node_t*); -DLLEXPORT BOOL listNodeIsLocked(const list_node_t*); - -/* Add node to list, returns pointer to new node or NULL on error */ -DLLEXPORT list_node_t* listAddNode(link_list_t*, void* data, list_node_tag_t, list_node_t* after /* NULL=insert */); - -/* Add array of node data to list, returns number of nodes added (or negative on error) */ -/* tag array may be NULL */ -DLLEXPORT long listAddNodes(link_list_t*, void** data, list_node_tag_t*, list_node_t* after /* NULL=insert */); - -/* Add node to list, allocating and copying the data for the node */ -DLLEXPORT list_node_t* listAddNodeData(link_list_t*, const void* data, size_t length, list_node_tag_t, list_node_t* after); - -/* Add node to list, allocating and copying ASCIIZ string data */ -DLLEXPORT list_node_t* listAddNodeString(link_list_t*, const char* str, list_node_tag_t, list_node_t* after); - -/* Add a list of strings to the linked list, allocating and copying each */ -/* tag array may be NULL */ -DLLEXPORT long listAddStringList(link_list_t*, str_list_t, list_node_tag_t*, list_node_t* after); - -/* Add a list of nodes from a source linked list */ -DLLEXPORT long listAddNodeList(link_list_t*, const link_list_t* src, list_node_t* after); - -/* Merge a source linked list into the destination linked list */ -/* after merging, the nodes in the source linked list should not be modified or freed */ -DLLEXPORT long listMerge(link_list_t* dest, const link_list_t* src, list_node_t* after); - -/* Swap the data pointers and flags for 2 nodes (possibly in separate lists) */ -DLLEXPORT BOOL listSwapNodes(list_node_t* node1, list_node_t* node2); - -/* Convenience macros for pushing, popping, and inserting nodes */ -#define listPushNode(list, data) listAddNode(list, data, LIST_NODE_TAG_DEFAULT, LAST_NODE) -#define listInsertNode(list, data) listAddNode(list, data, LIST_NODE_TAG_DEFAULT, FIRST_NODE) -#define listPushNodeData(list, data, length) listAddNodeData(list, data, length, LIST_NODE_TAG_DEFAULT, LAST_NODE) -#define listInsertNodeData(list, data, length) listAddNodeData(list, data, length, LIST_NODE_TAG_DEFAULT, FIRST_NODE) -#define listPushNodeString(list, str) listAddNodeString(list, str, LIST_NODE_TAG_DEFAULT, LAST_NODE) -#define listInsertNodeString(list, str) listAddNodeString(list, str, LIST_NODE_TAG_DEFAULT, FIRST_NODE) -#define listPushStringList(list, str_list) listAddStringList(list, str_list, NULL, LAST_NODE) -#define listInsertStringList(list, str_list) listAddStringList(list, str_list, NULL, FIRST_NODE) -#define listPopNode(list) listRemoveNode(list, LAST_NODE, FALSE) -#define listShiftNode(list) listRemoveNode(list, FIRST_NODE, FALSE) - -/* Remove node from list, returning the node's data (if not free'd) */ -DLLEXPORT void* listRemoveNode(link_list_t*, list_node_t* /* NULL=first */, BOOL free_data); -DLLEXPORT void* listRemoveTaggedNode(link_list_t*, list_node_tag_t, BOOL free_data); - -/* Remove multiple nodes from list, returning the number of nodes removed */ -DLLEXPORT long listRemoveNodes(link_list_t*, list_node_t* /* NULL=first */, long count, BOOL free_data); - -/* Reverse the nodes in a list */ -DLLEXPORT void listReverse(link_list_t*); - -/* Return >= 0 (count of nodes) if list is valid, negative otherwise */ -DLLEXPORT long listVerify(link_list_t*); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/msg_queue.c b/xpdev/msg_queue.c deleted file mode 100644 index 7a0a733d4b24d069587705474fd5a87da83d1cd2..0000000000000000000000000000000000000000 --- a/xpdev/msg_queue.c +++ /dev/null @@ -1,234 +0,0 @@ -/* Uni or Bi-directional FIFO message queue */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* malloc */ -#include <string.h> /* memset */ - -#include "genwrap.h" /* msclock() */ -#include "threadwrap.h" /* pthread_self */ -#include "msg_queue.h" - -msg_queue_t* msgQueueInit(msg_queue_t* q, long flags) -{ - if(q==NULL) { - if((q=(msg_queue_t*)malloc(sizeof(msg_queue_t)))==NULL) - return(NULL); - flags |= MSG_QUEUE_MALLOC; - } - - memset(q,0,sizeof(msg_queue_t)); - - q->flags = flags; - q->refs = 1; - q->owner_thread_id = pthread_self(); - - if(q->flags&MSG_QUEUE_BIDIR) - listInit(&q->in,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - listInit(&q->out,LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); - - return(q); -} - -BOOL msgQueueOwner(msg_queue_t* q) -{ - if(q==NULL) - return(FALSE); - - return q->owner_thread_id == pthread_self(); -} - -BOOL msgQueueFree(msg_queue_t* q) -{ - if(q==NULL) - return(FALSE); - - listFree(&q->in); - listFree(&q->out); - - if(q->flags&MSG_QUEUE_MALLOC) - free(q); - - return(TRUE); -} - -long msgQueueAttach(msg_queue_t* q) -{ - if(q==NULL) - return(-1); - - q->refs++; - - return(q->refs); -} - -long msgQueueDetach(msg_queue_t* q) -{ - int refs; - - if(q==NULL || q->refs<1) - return(-1); - - if(msgQueueOwner(q)) - q->flags |= MSG_QUEUE_ORPHAN; - - if((refs=--q->refs)==0) - msgQueueFree(q); - - return(refs); -} - -void* msgQueueSetPrivateData(msg_queue_t* q, void* p) -{ - void* old; - - if(q==NULL) - return(NULL); - - old=q->private_data; - q->private_data=p; - return(old); -} - -void* msgQueueGetPrivateData(msg_queue_t* q) -{ - if(q==NULL) - return(NULL); - return(q->private_data); -} - -static link_list_t* msgQueueReadList(msg_queue_t* q) -{ - if(q==NULL) - return(NULL); - - if((q->flags&MSG_QUEUE_BIDIR) - && q->owner_thread_id == pthread_self()) - return(&q->in); - return(&q->out); -} - -static link_list_t* msgQueueWriteList(msg_queue_t* q) -{ - if(q==NULL) - return(NULL); - - if(!(q->flags&MSG_QUEUE_BIDIR) - || q->owner_thread_id == pthread_self()) - return(&q->out); - return(&q->in); -} - -long msgQueueReadLevel(msg_queue_t* q) -{ - return listCountNodes(msgQueueReadList(q)); -} - -static BOOL list_wait(link_list_t* list, long timeout) -{ -#if defined(LINK_LIST_THREADSAFE) - if(timeout<0) /* infinite */ - return listSemWait(list); - if(timeout==0) /* poll */ - return listSemTryWait(list); - - return listSemTryWaitBlock(list,timeout); -#else - clock_t start; - long count; - - start=msclock(); - while((count=listCountNodes(list))==0) { - if(timeout==0) - break; - if(timeout>0 && msclock()-start > timeout) - break; - YIELD(); - } - return(INT_TO_BOOL(count)); -#endif -} - -BOOL msgQueueWait(msg_queue_t* q, long timeout) -{ - BOOL result; - link_list_t* list = msgQueueReadList(q); - - if((result=list_wait(list,timeout))==TRUE) -#if defined(LINK_LIST_THREADSAFE) - listSemPost(list) /* Replace the semaphore we just cleared */ -#endif - ; - - return(result); -} - -void* msgQueueRead(msg_queue_t* q, long timeout) -{ - link_list_t* list = msgQueueReadList(q); - - list_wait(list,timeout); - - return listShiftNode(list); -} - -void* msgQueuePeek(msg_queue_t* q, long timeout) -{ - link_list_t* list = msgQueueReadList(q); - - if(list_wait(list,timeout)) -#if defined(LINK_LIST_THREADSAFE) - listSemPost(list) /* Replace the semaphore we just cleared */ -#endif - ; - - return listNodeData(listFirstNode(list)); -} - -void* msgQueueFind(msg_queue_t* q, const void* data, size_t length) -{ - link_list_t* list = msgQueueReadList(q); - list_node_t* node; - - if((node=listFindNode(list,data,length))==NULL) - return(NULL); - return listRemoveNode(list,node,/* Free Data? */FALSE); -} - -list_node_t* msgQueueFirstNode(msg_queue_t* q) -{ - return listFirstNode(msgQueueReadList(q)); -} - -list_node_t* msgQueueLastNode(msg_queue_t* q) -{ - return listLastNode(msgQueueReadList(q)); -} - -long msgQueueWriteLevel(msg_queue_t* q) -{ - return listCountNodes(msgQueueWriteList(q)); -} - -BOOL msgQueueWrite(msg_queue_t* q, const void* data, size_t length) -{ - return listPushNodeData(msgQueueWriteList(q),data,length)!=NULL; -} - diff --git a/xpdev/msg_queue.h b/xpdev/msg_queue.h deleted file mode 100644 index 5df9af8a801dbf7cd2c97e0ca1dd33d946df78e1..0000000000000000000000000000000000000000 --- a/xpdev/msg_queue.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Uni or Bi-directional FIFO message queue */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _MSG_QUEUE_H -#define _MSG_QUEUE_H - -#include "link_list.h" -#include "threadwrap.h" -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -typedef struct { - char name[128]; /* for named-queues */ - link_list_t in; - link_list_t out; - pthread_t owner_thread_id; /* reads from in, writes to out */ - long refs; - unsigned long flags; /* private use flags */ - void* private_data; -} msg_queue_t; - -#define MSG_QUEUE_MALLOC (1<<0) /* Queue allocated with malloc() */ -#define MSG_QUEUE_BIDIR (1<<1) /* Bi-directional message queue */ -#define MSG_QUEUE_ORPHAN (1<<2) /* Owner has detached */ - -DLLEXPORT msg_queue_t* msgQueueInit(msg_queue_t*, long flags); -DLLEXPORT BOOL msgQueueFree(msg_queue_t*); - -DLLEXPORT long msgQueueAttach(msg_queue_t*); -DLLEXPORT long msgQueueDetach(msg_queue_t*); -DLLEXPORT BOOL msgQueueOwner(msg_queue_t*); - -/* Get/Set queue private data */ -DLLEXPORT void* msgQueueSetPrivateData(msg_queue_t*, void*); -DLLEXPORT void* msgQueueGetPrivateData(msg_queue_t*); - -DLLEXPORT BOOL msgQueueWait(msg_queue_t* q, long timeout); -DLLEXPORT long msgQueueReadLevel(msg_queue_t*); -DLLEXPORT void* msgQueueRead(msg_queue_t*, long timeout); -DLLEXPORT void* msgQueuePeek(msg_queue_t*, long timeout); -DLLEXPORT void* msgQueueFind(msg_queue_t*, const void*, size_t length); -DLLEXPORT list_node_t* msgQueueFirstNode(msg_queue_t*); -DLLEXPORT list_node_t* msgQueueLastNode(msg_queue_t*); -#define msgQueueNextNode(node) listNextNode(node) -#define msgQueuePrevNode(node) listPrevNode(node) -#define msgQueueNodeData(node) listNodeData(node) - -DLLEXPORT long msgQueueWriteLevel(msg_queue_t*); -DLLEXPORT BOOL msgQueueWrite(msg_queue_t*, const void*, size_t length); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/multisock.c b/xpdev/multisock.c deleted file mode 100644 index bc4e2d2b261e22855599f1adc7de9bc8dae290ec..0000000000000000000000000000000000000000 --- a/xpdev/multisock.c +++ /dev/null @@ -1,642 +0,0 @@ -// Multi-socket versions ofthe socket API... - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "gen_defs.h" -#include "sockwrap.h" -#include "dirwrap.h" -#include "multisock.h" -#include "haproxy.h" -#include <stdarg.h> - -struct xpms_set* xpms_create(unsigned int retries, unsigned int wait_secs, - int (*lprintf)(int level, const char *fmt, ...)) -{ - struct xpms_set *ret=(struct xpms_set *)calloc(1, sizeof(struct xpms_set)); - - if(ret==NULL) - return ret; - ret->retries = retries; - ret->wait_secs = wait_secs; - ret->lprintf=lprintf; - return ret; -} - -void xpms_destroy(struct xpms_set *xpms_set, void (*sock_destroy)(SOCKET, const void *), const void *cbdata) -{ - size_t i; - - if(!xpms_set) - return; - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock != INVALID_SOCKET) { - if(xpms_set->lprintf!=NULL) - xpms_set->lprintf(LOG_INFO, "%04d %s closing socket %s port %d" - , xpms_set->socks[i].sock, xpms_set->socks[i].prot?xpms_set->socks[i].prot:"unknown" - , xpms_set->socks[i].address - , xpms_set->socks[i].port); - closesocket(xpms_set->socks[i].sock); - if(sock_destroy) - sock_destroy(xpms_set->socks[i].sock, cbdata); - } - xpms_set->socks[i].sock = INVALID_SOCKET; - FREE_AND_NULL(xpms_set->socks[i].address); - FREE_AND_NULL(xpms_set->socks[i].prot); - } - FREE_AND_NULL(xpms_set->socks); - free(xpms_set); -} - -BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *addr, uint16_t port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata) -{ - struct xpms_sockdef *new_socks; - struct addrinfo hints; - struct addrinfo *res=NULL; - struct addrinfo *cur; - unsigned int added = 0; - int ret; - char port_str[6]; - char err[128]; - -#ifndef _WIN32 - struct addrinfo dummy; - struct sockaddr_un un_addr; - - if(domain == AF_UNIX) { - memset(&dummy, 0, sizeof(dummy)); - memset(&un_addr, 0, sizeof(un_addr)); - dummy.ai_family = AF_UNIX; - dummy.ai_socktype = type; - dummy.ai_addr = (struct sockaddr *)&un_addr; - un_addr.sun_family=AF_UNIX; - - if(strlen(addr) >= sizeof(un_addr.sun_path)) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_ERR, "!%s ERROR %s is too long for a portable AF_UNIX socket", prot, addr); - return FALSE; - } - strcpy(un_addr.sun_path,addr); -#ifdef SUN_LEN - dummy.ai_addrlen = SUN_LEN(&un_addr); -#else - dummy.ai_addrlen = offsetof(struct sockaddr_un, un_addr.sun_path) + strlen(addr) + 1; -#endif - if(fexist(addr)) - unlink(addr); - res = &dummy; - } -#endif - if(res == NULL) { - memset(&hints, 0, sizeof(hints)); - hints.ai_flags=AI_PASSIVE; - hints.ai_family=domain; - hints.ai_socktype=type; - hints.ai_protocol=protocol; - hints.ai_flags|=AI_NUMERICSERV; -#ifdef AI_ADDRCONFIG - hints.ai_flags|=AI_ADDRCONFIG; -#endif - sprintf(port_str, "%hu", port); - if((ret=getaddrinfo(addr, port_str, &hints, &res))!=0) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_CRIT, "!%s ERROR %d calling getaddrinfo() on %s", prot, ret, addr); - return FALSE; - } - } - - for(cur=res; cur; cur=cur->ai_next) { - new_socks=(struct xpms_sockdef *)realloc(xpms_set->socks, sizeof(struct xpms_sockdef)*(xpms_set->sock_count+1)); - if(new_socks==NULL) { - /* This may be a partial failure */ - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_CRIT, "!%s ERROR out of memory adding to multisocket", prot); - break; - } - xpms_set->socks=new_socks; - xpms_set->socks[xpms_set->sock_count].address = strdup(addr); - xpms_set->socks[xpms_set->sock_count].cb_data = cbdata; - xpms_set->socks[xpms_set->sock_count].domain = cur->ai_family; /* Address/Protocol Family */ - xpms_set->socks[xpms_set->sock_count].type = cur->ai_socktype; - xpms_set->socks[xpms_set->sock_count].protocol = protocol; - xpms_set->socks[xpms_set->sock_count].port = port; - xpms_set->socks[xpms_set->sock_count].prot = strdup(prot); - xpms_set->socks[xpms_set->sock_count].sock = socket(cur->ai_family, cur->ai_socktype, protocol); - if(xpms_set->socks[xpms_set->sock_count].sock == INVALID_SOCKET) { - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); - continue; - } - if(sock_init) - sock_init(xpms_set->socks[xpms_set->sock_count].sock, cbdata); - - if(bind_init) { - if(port < IPPORT_RESERVED && port > 0) - bind_init(FALSE); - } - if(retry_bind(xpms_set->socks[xpms_set->sock_count].sock, cur->ai_addr, cur->ai_addrlen, xpms_set->retries, xpms_set->wait_secs, prot, xpms_set->lprintf)==-1) { - closesocket(xpms_set->socks[xpms_set->sock_count].sock); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); - if(bind_init) { - if(port < IPPORT_RESERVED) - bind_init(TRUE); - } - continue; - } - if(bind_init) { - if(port < IPPORT_RESERVED && port > 0) - bind_init(TRUE); - } - - if(type != SOCK_DGRAM) { - if(listen(xpms_set->socks[xpms_set->sock_count].sock, SOMAXCONN)==-1) { - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_WARNING, "%04d !%s ERROR %d listening on port %d: %s" - ,xpms_set->socks[xpms_set->sock_count].sock, prot, ERROR_VALUE - ,port, socket_strerror(socket_errno,err,sizeof(err))); - closesocket(xpms_set->socks[xpms_set->sock_count].sock); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].address); - FREE_AND_NULL(xpms_set->socks[xpms_set->sock_count].prot); - continue; - } - } - - added++; - xpms_set->sock_count++; - } - -#ifndef _WIN32 - if(res != &dummy) -#endif - freeaddrinfo(res); - if(added) - return TRUE; - return FALSE; -} - -BOOL xpms_add_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, str_list_t list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata) -{ - char **iface; - char *host; - char *host_str; - char *p, *p2; - BOOL one_good=FALSE; - - for(iface=list; iface && *iface; iface++) { - WORD port=default_port; - - host=strdup(*iface); - - host_str=host; - p = strrchr(host, ':'); - /* - * If there isn't a [, and the first and last colons aren't the same - * it's assumed to be an IPv6 address - */ - if(strchr(host,'[')==NULL && p != NULL && strchr(host, ':') != p) - p=NULL; - if(host[0]=='[') { - host_str++; - p2=strrchr(host,']'); - if(p2) - *p2=0; - if(p2 > p) - p=NULL; - } - if(p!=NULL) { - *(p++)=0; - sscanf(p, "%hu", &port); - } - if(xpms_set->lprintf) - xpms_set->lprintf(LOG_INFO, "%s listening on socket %s port %hu", prot, host_str, port); - if(xpms_add(xpms_set, domain, type, protocol, host_str, port, prot, sock_init, bind_init, cbdata)) - one_good=TRUE; - free(host); - } - return one_good; -} - -BOOL xpms_add_chararray_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata) -{ - str_list_t slist; - BOOL ret; - - slist = strListSplitCopy(NULL, list, ", \t\r\n"); - if (slist == NULL) - return FALSE; - ret = xpms_add_list(xpms_set, domain, type, protocol, slist, default_port, prot, - sock_init, bind_init, cbdata); - strListFree(&slist); - return ret; -} - -/* Convert a binary variable into a hex string - used for printing in the debug log */ -static void btox(char *hexstr, const char *srcbuf, size_t srcbuflen, size_t hexstrlen, int (*lprintf)(int level, const char *fmt, ...)) -{ - size_t i; - - if (hexstrlen < srcbuflen*2+1) { - lprintf(LOG_WARNING,"btox hexstr buffer too small [%d] - not all data will be processed",hexstrlen); - srcbuflen = hexstrlen/2-1; - } - - *hexstr = '\0'; - for (i=0;i<srcbuflen;i++) { - sprintf(hexstr+strlen(hexstr),"%02x",(unsigned char)srcbuf[i]); - } -} - -static BOOL read_socket(SOCKET sock, char *buffer, size_t len, int (*lprintf)(int level, const char *fmt, ...)) -{ - size_t i; - int rd; - unsigned char ch; - char err[128]; - - for (i=0;i<len;i++) { - if (socket_readable(sock, 1000)) { - rd = recv(sock,&ch,1,0); - if (rd == 0) { - lprintf(LOG_WARNING,"%04d multisock read_socket() - remote closed the connection",sock); - return FALSE; - - } else if (rd == 1) { - buffer[i] = ch; - - } else { - lprintf(LOG_WARNING,"%04d multisock read_socket() - failed to read from socket. Got [%d] with error [%s]",sock,rd,socket_strerror(socket_errno,err,sizeof(err))); - return FALSE; - } - - } else { - lprintf(LOG_WARNING,"%04d multisock read_socket() - No data?",sock); - return FALSE; - - } - } - - return TRUE; -} - -static BOOL read_socket_line(SOCKET sock, char *buffer, size_t buflen, int (*lprintf)(int level, const char *fmt, ...)) -{ - size_t i; - - for (i = 0; i < buflen - 1; i++) { - if (read_socket(sock, &buffer[i], 1, lprintf)) { - switch(buffer[i]) { - case 0: - return FALSE; - case '\n': - buffer[i+1] = 0; - return TRUE; - } - - } else { - buffer[i] = 0; - return FALSE; - } - } - - buffer[i] = 0; - return FALSE; -} - -SOCKET xpms_accept(struct xpms_set *xpms_set, union xp_sockaddr * addr, - socklen_t * addrlen, unsigned int timeout, uint32_t flags, const void **cb_data) -{ -#ifdef PREFER_POLL - struct pollfd *fds; - int poll_timeout; - nfds_t scnt = 0; -#else - fd_set read_fs; - struct timeval tv; - struct timeval *tvp; - SOCKET max_sock=0; -#endif - size_t i; - SOCKET ret; - char hapstr[128]; - char haphex[256]; - char *p, *tok; - long l; - void *vp; - - if (xpms_set->sock_count < 1) - return INVALID_SOCKET; - -#ifdef PREFER_POLL - fds = calloc(xpms_set->sock_count, sizeof(*fds)); - if (fds == NULL) - return INVALID_SOCKET; - for (i = 0; i < xpms_set->sock_count; i++) { - if (xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - fds[scnt].fd = xpms_set->socks[i].sock; - fds[scnt].events = POLLIN; - scnt++; - } - - if (timeout == XPMS_FOREVER) - poll_timeout = -1; - else if (timeout > INT_MAX) - poll_timeout = INT_MAX; - else - poll_timeout = timeout; - - switch (poll(fds, scnt, poll_timeout)) { - case 0: - free(fds); - return INVALID_SOCKET; - case -1: - free(fds); - return SOCKET_ERROR; - default: - scnt = 0; - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - if (fds[scnt].revents & ~(POLLIN)) { - scnt++; - closesocket(xpms_set->socks[i].sock); - xpms_set->lprintf(LOG_ERR, "%04d * Listening socket went bad", xpms_set->socks[i].sock); - xpms_set->socks[i].sock = INVALID_SOCKET; - continue; - } - if (fds[scnt++].revents & POLLIN) { -#else - FD_ZERO(&read_fs); - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - FD_SET(xpms_set->socks[i].sock, &read_fs); - if(xpms_set->socks[i].sock >= max_sock) - max_sock=xpms_set->socks[i].sock+1; - } - - if(timeout==XPMS_FOREVER) - tvp=NULL; - else { - tv.tv_sec=timeout/1000; - tv.tv_usec=(timeout%1000)*1000; - tvp=&tv; - } - switch(select(max_sock, &read_fs, NULL, NULL, tvp)) { - case 0: - return INVALID_SOCKET; - case -1: - return SOCKET_ERROR; - default: - for(i=0; i<xpms_set->sock_count; i++) { - if(xpms_set->socks[i].sock == INVALID_SOCKET) - continue; - if(FD_ISSET(xpms_set->socks[i].sock, &read_fs)) { -#endif - if(cb_data) - *cb_data=xpms_set->socks[i].cb_data; - ret = accept(xpms_set->socks[i].sock, &addr->addr, addrlen); - if (ret == INVALID_SOCKET) { - goto error_return; - } - - // Set host_ip from haproxy protocol, if its used - // http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt - if (flags & XPMS_ACCEPT_FLAG_HAPROXY) { - memset(addr, 0, sizeof(*addr)); - xpms_set->lprintf(LOG_DEBUG,"%04d Working out client address from HAProxy PROTO",ret); - - // Read the first line - // In normal proxy usage, we shouldnt fail here - but if there is a badly implemented HAPROXY PROTO - // or the user attempts to connect direct to the BBS (not via the proxy) there could be anything - // received (IAC sequences, SSH setup, or just badness) - if (! read_socket_line(ret, hapstr, 108, xpms_set->lprintf)) { - btox(haphex,hapstr,strlen(hapstr),sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for version - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - - btox(haphex,hapstr,strlen(hapstr)>16 ? 16 : strlen(hapstr),sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY looking for version - 1st %d bytes received [%s] of (%d)",ret,strlen(hapstr)>16 ? 16 : strlen(hapstr),haphex,strlen(hapstr)); - - // v1 of the protocol uses plain text, starting with "PROXY " - // eg: "PROXY TCP4 255.255.255.255 255.255.255.255 65535 65535\r\n" - if (strncmp((char *)hapstr,"PROXY ",6) == 0) { - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY PROTO v1",ret); - - tok = &hapstr[6]; - // IPV4 - if (strncmp(tok, "TCP4 ", 5) == 0) { - tok += 5; - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Proto TCP4",ret,hapstr); - addr->addr.sa_family = AF_INET; - if (addrlen) - *addrlen = sizeof(struct sockaddr_in); - vp = &addr->in.sin_addr; - // IPV6 - } else if (strncmp(tok,"TCP6 ",5) == 0) { - tok += 5; - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Proto TCP6",ret,hapstr); - addr->addr.sa_family = AF_INET6; - if (addrlen) - *addrlen = sizeof(struct sockaddr_in6); - vp = &addr->in6.sin6_addr; - // Unknown? - } else { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unknown Protocol",ret); - closesocket(ret); - goto error_return; - } - - // Look for the space between the next IP - p = strchr(tok, ' '); - if (p == NULL) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Couldnt find IP address",ret); - closesocket(ret); - goto error_return; - } - *p = 0; - if (inet_pton(addr->addr.sa_family, tok, vp) != 1) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unable to parse %s address [%s]",addr->addr.sa_family == AF_INET ? "IPv4" : "IPv6", tok); - closesocket(ret); - goto error_return; - } - tok = p + 1; - // Look for the space before the port number - p = strchr(tok, ' '); - if (p == NULL) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Couldnt find port",ret); - closesocket(ret); - goto error_return; - } - tok = p + 1; - l = strtol(tok, NULL, 10); - if (l <= 0 || l > UINT16_MAX) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Source port out of range",ret); - closesocket(ret); - goto error_return; - } - switch(addr->addr.sa_family) { - case AF_INET: - addr->in.sin_port = htons((unsigned short)l); - break; - case AF_INET6: - addr->in6.sin6_port = htons((unsigned short)l); - break; - } - - // v2 is in binary with the first 12 bytes "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" - // we'll compare the 1st 6 bytes here, since we are determining if we are v1 or v2. - } else if (strcmp((char *)hapstr,"\r\n") == 0) { - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY PROTO v2",ret); - - // OK, just for sanity, our next 10 chars should be v2... - memset(hapstr, 0, 10); - if (read_socket(ret,hapstr,10,xpms_set->lprintf)==FALSE || memcmp(hapstr, "\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A", 10) != 0) { - btox(haphex,hapstr,10,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - incomplete v2 setup [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - - // Command and Version - if (read_socket(ret,hapstr,1,xpms_set->lprintf)==FALSE) { - btox(haphex,hapstr,1,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for Verson/Command - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Version [%x]",ret,(hapstr[0]>>4)&0x0f); //Should be 2 - - // Check the version - switch((hapstr[0]>>4)&0x0f) { - case 0x02: - break; - default: - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY invalid version [%x]",ret,(hapstr[0]>>4)&0x0f); - closesocket(ret); - goto error_return; - } - - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Command [%x]",ret,hapstr[0]&0x0f); //0=Local/1=Proxy - - // Check the command - switch(hapstr[0]&0x0f) { - case HAPROXY_LOCAL: - xpms_set->lprintf(LOG_INFO,"%04d * HAPROXY health check - we are alive!",ret); - closesocket(ret); - goto error_return; - case HAPROXY_PROXY: - break; - default: - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY invalid command [%x]",ret,hapstr[0]&0x0f); - closesocket(ret); - goto error_return; - } - - // Protocol and Family - if (read_socket(ret,hapstr,1,xpms_set->lprintf)==FALSE) { - btox(haphex,hapstr,1,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for Protocol/Family - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Protocol [%x]",ret,hapstr[0]&0x0f); //0=Unspec/1=AF_INET/2=AF_INET6/3=AF_UNIX - l = (hapstr[0]>>4)&0x0f; - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Family [%x]",ret,l); //0=UNSPEC/1=STREAM/2=DGRAM - - // Address Length - 2 bytes - if (read_socket(ret,hapstr,2,xpms_set->lprintf)==FALSE) { - btox(haphex,hapstr,2,sizeof(haphex), xpms_set->lprintf); - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for address length - failed [%s]",ret,haphex); - closesocket(ret); - goto error_return; - } - i = ntohs(*(uint16_t*)hapstr); - xpms_set->lprintf(LOG_DEBUG,"%04d * HAPROXY Address Length [%d]",ret,i); - - switch (l) { - // IPv4 - AF_INET - case HAPROXY_AFINET: - if (i != 12) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - IPv4 address length is incorrect",ret); - closesocket(ret); - goto error_return; - } - addr->in.sin_family = AF_INET; - if (read_socket(ret, hapstr, i, xpms_set->lprintf)==FALSE) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for IPv4 address - failed",ret); - closesocket(ret); - goto error_return; - } - memcpy(&addr->in.sin_addr.s_addr, hapstr, 4); - memcpy(&addr->in.sin_port, &hapstr[8], 2); - if (addrlen) - *addrlen = sizeof(struct sockaddr_in); - - break; - - // IPv6 - AF_INET6 - case HAPROXY_AFINET6: - if (i != 36) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Something went wrong - IPv6 address length is incorrect.",ret); - closesocket(ret); - goto error_return; - } - addr->in6.sin6_family = AF_INET6; - if (read_socket(ret,hapstr,i,xpms_set->lprintf)==FALSE) { - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY looking for IPv6 address - failed",ret); - closesocket(ret); - goto error_return; - } - memcpy(&addr->in6.sin6_addr.s6_addr, hapstr, 16); - memcpy(&addr->in6.sin6_port, &hapstr[32], 2); - if (addrlen) - *addrlen = sizeof(struct sockaddr_in6); - - break; - - default: - xpms_set->lprintf(LOG_ERR,"%04d * HAPROXY Unknown Family [%x]",ret,l); - closesocket(ret); - goto error_return; - } - - } else { - xpms_set->lprintf(LOG_ERR,"%04d Unknown HAProxy Initialisation - is HAProxy used?",ret); - closesocket(ret); - goto error_return; - } - - hapstr[0] = 0; - inet_addrtop(addr, hapstr, sizeof(hapstr)); - xpms_set->lprintf(LOG_INFO,"%04d * HAPROXY Source [%s]",ret,hapstr); - -#ifdef PREFER_POLL - free(fds); -#endif - return ret; - } else { -#ifdef PREFER_POLL - free(fds); -#endif - return ret; - } - } - } - } - -error_return: -#ifdef PREFER_POLL - free(fds); -#endif - return INVALID_SOCKET; -} diff --git a/xpdev/multisock.h b/xpdev/multisock.h deleted file mode 100644 index cc7f1c20f0277d7c6787c81f7588da46465ffb37..0000000000000000000000000000000000000000 --- a/xpdev/multisock.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef MULTISOCK_H -#define MULTISOCK_H - -#include <limits.h> -#include "str_list.h" -#include "wrapdll.h" - -struct xpms_sockdef -{ - const void* cb_data; - int domain; - int type; - int protocol; - SOCKET sock; - char* address; - uint16_t port; - char* prot; -}; - -struct xpms_set { - struct xpms_sockdef* socks; - int (*lprintf)(int level, const char *fmt, ...); - size_t sock_count; - unsigned int retries; - unsigned int wait_secs; -}; - -#define XPMS_FOREVER UINT_MAX -#define XPMS_FLAGS_NONE 0 -#define XPMS_ACCEPT_FLAG_HAPROXY (1<<0) - -#ifdef __cplusplus -extern "C" { -#endif - -DLLEXPORT struct xpms_set* xpms_create(unsigned int retries, unsigned int wait_secs, - int (*lprintf)(int level, const char *fmt, ...)); -DLLEXPORT void xpms_destroy(struct xpms_set *xpms_set, void (*sock_destroy)(SOCKET, const void *), const void *cbdata); -DLLEXPORT BOOL xpms_add(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *addr, uint16_t port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata); -DLLEXPORT BOOL xpms_add_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, str_list_t list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata); -DLLEXPORT BOOL xpms_add_chararray_list(struct xpms_set *xpms_set, int domain, int type, - int protocol, const char *list, uint16_t default_port, const char *prot, - void (*sock_init)(SOCKET, const void *), int(*bind_init)(BOOL), const void *cbdata); -DLLEXPORT SOCKET xpms_accept(struct xpms_set *, union xp_sockaddr * addr, - socklen_t * addrlen, unsigned int timeout, uint32_t flags, const void **cb_data); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/xpdev/netwrap.c b/xpdev/netwrap.c deleted file mode 100644 index 87a4ce3531659aadae23841a8d8d52776b5a6bd3..0000000000000000000000000000000000000000 --- a/xpdev/netwrap.c +++ /dev/null @@ -1,145 +0,0 @@ -/* netwrap.c */ - -/* Network related wrapper functions */ - -/* $Id: netwrap.c,v 1.8 2019/07/24 04:21:42 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "sockwrap.h" -#include "genwrap.h" /* truncsp */ -#include "netwrap.h" /* verify prototypes */ - -#include <stdlib.h> /* malloc() */ - -#if defined(_WIN32) - #include <iphlpapi.h> /* GetNetworkParams */ -#endif - -str_list_t getNameServerList(void) -{ -#ifdef __unix__ /* Look up DNS server address */ - FILE* fp; - char* p; - char str[128]; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - if((fp=fopen("/etc/resolv.conf","r"))!=NULL) { - while(!feof(fp)) { - if(fgets(str,sizeof(str),fp)==NULL) - break; - truncsp(str); - p=str; - SKIP_WHITESPACE(p); - if(strnicmp(p,"nameserver",10)!=0) /* no match */ - continue; - FIND_WHITESPACE(p); /* skip "nameserver" */ - SKIP_WHITESPACE(p); /* skip more white-space */ - strListPush(&list,p); - } - fclose(fp); - } - return(list); - -#elif defined(_WIN32) - FIXED_INFO* FixedInfo=NULL; - ULONG FixedInfoLen=0; - IP_ADDR_STRING* ip; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_BUFFER_OVERFLOW) { - FixedInfo=(FIXED_INFO*)malloc(FixedInfoLen); - if(GetNetworkParams(FixedInfo,&FixedInfoLen) == ERROR_SUCCESS) { - ip=&FixedInfo->DnsServerList; - for(; ip!=NULL; ip=ip->Next) - strListPush(&list,ip->IpAddress.String); - } - if(FixedInfo!=NULL) - free(FixedInfo); - } - return(list); -#else - #error "Need a get_nameserver() implementation for this platform" -#endif -} - -const char* getHostNameByAddr(const char* str) -{ - HOSTENT* h; - uint32_t ip; - -#ifdef _WIN32 - WSADATA wsaData; - WSAStartup(MAKEWORD(2, 2), &wsaData); -#endif - if(str==NULL) - return NULL; - if((ip=inet_addr(str)) == INADDR_NONE) - return str; - if((h=gethostbyaddr((char *)&ip,sizeof(ip),AF_INET))==NULL) - return NULL; - -#ifdef _WIN32 - WSACleanup(); -#endif - - return h->h_name; -} - -/* In case we want to DLL-export getNameServerList in the future */ -void freeNameServerList(str_list_t list) -{ - strListFree(&list); -} - -#if NETWRAP_TEST -int main(int argc, char** argv) -{ - size_t i; - str_list_t list; - - if((list=getNameServerList())!=NULL) { - for(i=0;list[i]!=NULL;i++) - printf("%s\n",list[i]); - freeNameServerList(list); - } - - if(argc>1) - printf("%s\n", getHostNameByAddr(argv[1])); - return 0; -} -#endif - diff --git a/xpdev/netwrap.h b/xpdev/netwrap.h deleted file mode 100644 index d8fc18f88d0d45538d7e8d2c8e2338787d85e0e9..0000000000000000000000000000000000000000 --- a/xpdev/netwrap.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Network related wrapper functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _NETWRAP_H -#define _NETWRAP_H - -#include <stddef.h> /* size_t */ -#include "str_list.h" /* string list functions and types */ -#include "wrapdll.h" - -#define IPv4_LOCALHOST 0x7f000001U /* 127.0.0.1 */ - -#if defined(__cplusplus) -extern "C" { -#endif - -DLLEXPORT const char* getHostNameByAddr(const char*); -DLLEXPORT str_list_t getNameServerList(void); -DLLEXPORT void freeNameServerList(str_list_t); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/petdefs.h b/xpdev/petdefs.h deleted file mode 100644 index bdf83ab9873d22f5a9a199cf6d222900afef6337..0000000000000000000000000000000000000000 --- a/xpdev/petdefs.h +++ /dev/null @@ -1,103 +0,0 @@ -/* $Id: petdefs.h,v 1.4 2019/07/09 23:54:43 rswindell Exp $ */ - -/* Commodore/PET definitions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ -#ifndef _PETDEFS_H_ -#define _PETDEFS_H_ - -enum petscii_char { - /* Colors */ - PETSCII_BLACK = 144, - PETSCII_WHITE = 5, - PETSCII_RED = 28, - PETSCII_GREEN = 30, - PETSCII_BLUE = 31, - PETSCII_ORANGE = 129, // Dark purple in 80 column mode - PETSCII_BROWN = 149, // Dark yellow in 80 column mode - PETSCII_YELLOW = 158, - PETSCII_CYAN = 159, // Light cyan in 80 column mode - PETSCII_LIGHTRED = 150, - PETSCII_DARKGRAY = 151, // Dark cyan in 80 column mode - PETSCII_MEDIUMGRAY = 152, - PETSCII_LIGHTGREEN = 153, - PETSCII_LIGHTBLUE = 154, - PETSCII_LIGHTGRAY = 155, - PETSCII_PURPLE = 156, - /* Char-set */ - PETSCII_UPPERLOWER = 14, - PETSCII_UPPERGRFX = 142, - /* Attributes */ - PETSCII_FLASH_ON = 15, - PETSCII_FLASH_OFF = 143, - PETSCII_REVERSE_ON = 18, - PETSCII_REVERSE_OFF = 146, - /* Cursor movement */ - PETSCII_UP = 145, - PETSCII_DOWN = 17, - PETSCII_LEFT = 157, - PETSCII_RIGHT = 29, - PETSCII_HOME = 19, - PETSCII_CLEAR = 147, - PETSCII_INSERT = 148, - PETSCII_DELETE = 20, - PETSCII_CRLF = 141, - /* Symbols (which don't align with ASCII) */ - PETSCII_BRITPOUND = 92, - /* Graphic chars */ - PETSCII_UPARROW = 0x5E, - PETSCII_LEFTARROW = 0x5f, - PETSCII_LIGHTHASH = 0xA6, - PETSCII_MEDIUMHASH = 0xDE, - PETSCII_HEAVYHASH = 0xA9, - PETSCII_SOLID = 0xA0, // Actually inversed solid (empty) - PETSCII_LEFTHALF = 0xA1, - PETSCII_RIGHTHALF = 0xB6, // Not quite a full half - PETSCII_TOPHALF = 0xB8, // Not quite a full half - PETSCII_BOTTOMHALF = 0xA2, - PETSCII_CHECKMARK = 0xBA, - PETSCII_CROSS = 0xDB, - PETSCII_HORZLINE = 0xC0, - PETSCII_VERTLINE = 0xDD, - PETSCII_LWRRHTBOX = 0xAC, - PETSCII_LWRLFTBOX = 0xBB, - PETSCII_UPRRHTBOX = 0xBC, - PETSCII_UPRLFTBOX = 0xBE, - PETSCII_CHECKERBRD = 0xBF, - /* Replacement chars (missing ASCII chars) */ - PETSCII_BACKSLASH = '/', // the 109 graphics char is an 'M' in shifted/text mode :-( - PETSCII_BACKTICK = 0xAD, // a graphics char actually - PETSCII_TILDE = 0xA8, // a graphics char actually - PETSCII_UNDERSCORE = 0xA4, // a graphics char actually -}; - -#endif /* Don't add anything after this line */ diff --git a/xpdev/sdlfuncs.c b/xpdev/sdlfuncs.c deleted file mode 100644 index 3eab1578aa558fd7ae7675e7ab4e1746c66ad5f4..0000000000000000000000000000000000000000 --- a/xpdev/sdlfuncs.c +++ /dev/null @@ -1,111 +0,0 @@ -#include <stdlib.h> /* getenv()/exit()/atexit() */ -#include <stdio.h> /* NULL */ - -#include <SDL.h> -#include "gen_defs.h" -#include "threadwrap.h" -#include "sdlfuncs.h" - -struct sdlfuncs xpbeep_sdl; - -/* Make xp_dl do static linking */ -#ifdef STATIC_SDL -#define STATIC_LINK -#endif -#include "xp_dl.h" - -static int sdl_funcs_loaded=0; -static int sdl_initialized=0; -static int sdl_audio_initialized=0; - -int xpbeep_load_sdl_funcs(struct sdlfuncs *sdlf) -{ - dll_handle sdl_dll; - const char *libnames[]={"SDL", "SDL-1.2", "SDL-1.1", NULL}; - - putenv("SDL_VIDEO_ALLOW_SCREENSAVER=1"); - sdlf->gotfuncs=0; - if((sdl_dll=xp_dlopen(libnames,RTLD_LAZY|RTLD_GLOBAL,SDL_PATCHLEVEL))==NULL) - return(-1); - - if((sdlf->Init=xp_dlsym(sdl_dll, SDL_Init))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->Quit=xp_dlsym(sdl_dll, SDL_Quit))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SemWait=xp_dlsym(sdl_dll, SDL_SemWait))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SemPost=xp_dlsym(sdl_dll, SDL_SemPost))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SDL_CreateSemaphore=xp_dlsym(sdl_dll, SDL_CreateSemaphore))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->SDL_DestroySemaphore=xp_dlsym(sdl_dll, SDL_DestroySemaphore))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->InitSubSystem=xp_dlsym(sdl_dll, SDL_InitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->QuitSubSystem=xp_dlsym(sdl_dll, SDL_QuitSubSystem))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->OpenAudio=xp_dlsym(sdl_dll, SDL_OpenAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->CloseAudio=xp_dlsym(sdl_dll, SDL_CloseAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->PauseAudio=xp_dlsym(sdl_dll, SDL_PauseAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->LockAudio=xp_dlsym(sdl_dll, SDL_LockAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->UnlockAudio=xp_dlsym(sdl_dll, SDL_UnlockAudio))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - if((sdlf->GetAudioStatus=xp_dlsym(sdl_dll, SDL_GetAudioStatus))==NULL) { - xp_dlclose(sdl_dll); - return(-1); - } - sdlf->gotfuncs=1; - sdl_funcs_loaded=1; - return(0); -} - -int init_sdl_audio(void) -{ - if (!sdl_funcs_loaded) { - if (xpbeep_load_sdl_funcs(&xpbeep_sdl) != 0) - return -1; - } - if(!sdl_initialized) { - if(xpbeep_sdl.Init(0)==0) - sdl_initialized=TRUE; - else - return(-1); - } - if(sdl_audio_initialized) - return(0); - if(xpbeep_sdl.InitSubSystem(SDL_INIT_AUDIO)==0) { - sdl_audio_initialized=TRUE; - return(0); - } - return(-1); -} diff --git a/xpdev/sdlfuncs.h b/xpdev/sdlfuncs.h deleted file mode 100644 index f2eaf34192a73912e9032debd87066a6562d3dd6..0000000000000000000000000000000000000000 --- a/xpdev/sdlfuncs.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _SDLFUNCS_H_ -#define _SDLFUNCS_H_ - -#include "SDL.h" -#include "SDL_audio.h" -#include "SDL_thread.h" -#include "SDL_syswm.h" - -struct sdlfuncs { - int (*Init) (Uint32 flags); - void (*Quit) (void); - int (*SemWait) (SDL_sem *sem); - int (*SemPost) (SDL_sem *sem); - SDL_sem *(*SDL_CreateSemaphore) (Uint32 initial_value); - void (*SDL_DestroySemaphore) (SDL_sem *semaphore); - int (*InitSubSystem)(Uint32 flags); - void (*QuitSubSystem)(Uint32 flags); - int (*OpenAudio)(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); - void (*CloseAudio)(void); - void (*LockAudio)(void); - void (*UnlockAudio)(void); - void (*PauseAudio)(int pause_on); - SDL_AudioStatus (*GetAudioStatus)(void); - int gotfuncs; -}; - -extern struct sdlfuncs xpbeep_sdl; -extern SDL_sem *sdl_exit_sem; - -#ifdef __cplusplus -extern "C" { -#endif -int load_sdl_funcs(struct sdlfuncs *sdlf); -int init_sdl_audio(void); -int SDL_main_env(int argc, char *argv[], char **env); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/xpdev/semfile.c b/xpdev/semfile.c deleted file mode 100644 index 5b17cb940773b1df94d95bafe06c08d2e8f64565..0000000000000000000000000000000000000000 --- a/xpdev/semfile.c +++ /dev/null @@ -1,146 +0,0 @@ -/* semfile.c */ - -/* $Id: semfile.c,v 1.8 2019/07/24 04:11:23 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> - -#include "semfile.h" -#include "filewrap.h" -#include "dirwrap.h" -#include "genwrap.h" - -#if !defined(NO_SOCKET_SUPPORT) - #include "sockwrap.h" -#endif - -/****************************************************************************/ -/* This function compares a single semaphore file's */ -/* date/time stamp (if the file exists) against the passed time stamp (t) */ -/* updating the time stamp to the latest dated semaphore file and returning */ -/* TRUE if any where newer than the initial value. */ -/****************************************************************************/ -BOOL semfile_check(time_t* t, const char* fname) -{ - time_t ft; - - if(*t==0) /* uninitialized */ - *t=time(NULL); - - if((ft=fdate(fname))==-1 || ft<=*t) - return(FALSE); - - *t=ft; - return(TRUE); -} - -/****************************************************************************/ -/* This function goes through a list of semaphore files, comparing the file */ -/* date/time stamp (if the file exists) against the passed time stamp (t) */ -/* updating the time stamp to the latest dated semaphore file and returning */ -/* a pointer to the filename if any where newer than the initial timestamp. */ -/****************************************************************************/ -char* semfile_list_check(time_t* t, str_list_t filelist) -{ - char* signaled=NULL; - size_t i; - - for(i=0;filelist[i]!=NULL;i++) - if(semfile_check(t, filelist[i])) - signaled = filelist[i]; - - return(signaled); -} - -str_list_t semfile_list_init(const char* parent, - const char* action, const char* service) -{ - char path[MAX_PATH+1]; - char hostname[128]; - char* p; - str_list_t list; - - if((list=strListInit())==NULL) - return(NULL); - SAFEPRINTF2(path,"%s%s",parent,action); - strListPush(&list,path); - SAFEPRINTF3(path,"%s%s.%s",parent,action,service); - strListPush(&list,path); -#if !defined(NO_SOCKET_SUPPORT) - if(gethostname(hostname,sizeof(hostname))==0) { - SAFEPRINTF3(path,"%s%s.%s",parent,action,hostname); - strListPush(&list,path); - SAFEPRINTF4(path,"%s%s.%s.%s",parent,action,hostname,service); - strListPush(&list,path); - if((p=strchr(hostname,'.'))!=NULL) { - *p=0; - SAFEPRINTF3(path,"%s%s.%s",parent,action,hostname); - strListPush(&list,path); - SAFEPRINTF4(path,"%s%s.%s.%s",parent,action,hostname,service); - strListPush(&list,path); - } - } -#endif - return(list); -} - -void semfile_list_add(str_list_t* filelist, const char* path) -{ - strListPush(filelist, path); -} - -void semfile_list_free(str_list_t* filelist) -{ - strListFree(filelist); -} - -BOOL semfile_signal(const char* fname, const char* text) -{ - int file; - struct utimbuf ut; -#if !defined(NO_SOCKET_SUPPORT) - char hostname[128]; - - if(text==NULL && gethostname(hostname,sizeof(hostname))==0) - text=hostname; -#endif - if((file=open(fname,O_CREAT|O_WRONLY, DEFFILEMODE))<0) /* use sopen instead? */ - return(FALSE); - if(text!=NULL) - write(file,text,strlen(text)); - close(file); - - /* update the time stamp */ - ut.actime = ut.modtime = time(NULL); - return utime(fname, &ut)==0; -} diff --git a/xpdev/semfile.h b/xpdev/semfile.h deleted file mode 100644 index 1b73d1b7d5bffe1970cdc26d045649365e5487dc..0000000000000000000000000000000000000000 --- a/xpdev/semfile.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Semaphore file functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _SEMFILE_H -#define _SEMFILE_H - -#include <time.h> /* time_t */ -#include "str_list.h" /* string list functions and types */ -#include "wrapdll.h" /* DLLEXPORT */ - -#if defined(__cplusplus) -extern "C" { -#endif - -/* semfile.c */ -DLLEXPORT BOOL semfile_signal(const char* fname, const char* text); -DLLEXPORT BOOL semfile_check(time_t* t, const char* fname); -DLLEXPORT char* semfile_list_check(time_t* t, str_list_t filelist); -DLLEXPORT str_list_t - semfile_list_init(const char* parent, const char* action - ,const char* service); -DLLEXPORT void semfile_list_add(str_list_t* filelist, const char* fname); -DLLEXPORT void semfile_list_free(str_list_t* filelist); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/semwrap.c b/xpdev/semwrap.c deleted file mode 100644 index daad53883c243fd0ab25c28d6d7e528906310dc9..0000000000000000000000000000000000000000 --- a/xpdev/semwrap.c +++ /dev/null @@ -1,125 +0,0 @@ -/* semwrap.c */ - -/* Semaphore-related cross-platform development wrappers */ - -/* $Id: semwrap.c,v 1.15 2018/07/24 01:13:09 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <errno.h> -#include "semwrap.h" - -#if defined(__unix__) - -#include <sys/time.h> /* timespec */ -#include <stdlib.h> /* NULL */ - -int -sem_trywait_block(sem_t *sem, unsigned long timeout) -{ - int retval; - struct timespec abstime; - struct timeval currtime; - - gettimeofday(&currtime,NULL); - abstime.tv_sec=currtime.tv_sec + (currtime.tv_usec/1000 + timeout)/1000; - abstime.tv_nsec=(currtime.tv_usec*1000 + timeout*1000000)%1000000000; - - retval=sem_timedwait(sem, &abstime); - if(retval && errno==ETIMEDOUT) - errno=EAGAIN; - return retval; -} - -#elif defined(_WIN32) - -#include <limits.h> /* INT_MAX */ - -#if defined(__BORLANDC__) - #pragma argsused -#endif -int sem_init(sem_t* psem, int pshared, unsigned int value) -{ - - if((*(psem)=CreateSemaphore(NULL,value,INT_MAX,NULL))==NULL) - return -1; - - return 0; -} - -int sem_trywait_block(sem_t* psem, unsigned long timeout) -{ - if(WaitForSingleObject(*(psem),timeout)!=WAIT_OBJECT_0) { - errno=EAGAIN; - return -1; - } - - return 0; -} - -int sem_post(sem_t* psem) -{ - if(ReleaseSemaphore(*(psem),1,NULL)==TRUE) - return 0; - - return -1; -} - -int sem_getvalue(sem_t* psem, int* vp) -{ -#if 0 /* This only works on 9x *sniff* */ - ReleaseSemaphore(*(psem),0,(LPLONG)vp); - return 0; -#else - /* Note, this should REALLY be in a critical section... */ - int retval=0; - - if(WaitForSingleObject(*(psem),0)!=WAIT_OBJECT_0) - *vp=0; - else { - if(ReleaseSemaphore(*(psem),1,(LPLONG)vp)) - (*vp)++; - else - retval=-1; - } - return(retval); -#endif -} - -int sem_destroy(sem_t* psem) -{ - if(CloseHandle(*(psem))==TRUE) - return 0; - return -1; -} - -#endif /* _WIN32 */ diff --git a/xpdev/semwrap.h b/xpdev/semwrap.h deleted file mode 100644 index 17cae498a634d26854e716061fe837af87963ce4..0000000000000000000000000000000000000000 --- a/xpdev/semwrap.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Semaphore-related cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _SEMWRAP_H -#define _SEMWRAP_H - -#include "gen_defs.h" -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#if defined(__unix__) - #if defined(USE_XP_SEMAPHORES) - #include "xpsem.h" - #define sem_init(x, y, z) xp_sem_init(x, y, z) - #define sem_destroy(x) xp_sem_destroy(x) - #define sem_close(x) xp_sem_close(x) - #define sem_unlink(x) xp_sem_unlink(x) - #define sem_wait(x) xp_sem_wait(x) - #define sem_trywait(x) xp_sem_trywait(x) - #define sem_post(x) xp_sem_post(x) - #define sem_getvalue(x,y) xp_sem_getvalue(x,y) - #define sem_timedwait(x,y) xp_sem_timedwait(x,y) - #define sem_t xp_sem_t - #else - #include <semaphore.h> /* POSIX semaphores */ - #endif - -#elif defined(_WIN32) - - #include <process.h> /* _beginthread */ - - /* POSIX semaphores */ - typedef HANDLE sem_t; - DLLEXPORT int sem_init(sem_t*, int pshared, unsigned int value); - DLLEXPORT int sem_post(sem_t*); - DLLEXPORT int sem_getvalue(sem_t*, int* value); - DLLEXPORT int sem_destroy(sem_t*); - #define sem_wait(psem) sem_trywait_block(psem,INFINITE) - #define sem_trywait(psem) sem_trywait_block(psem,0) - -#elif defined(__OS2__) /* These have *not* been tested! */ - - /* POSIX semaphores */ - typedef HEV sem_t; - #define sem_init(psem,ps,v) DosCreateEventSem(NULL,psem,0,0); - #define sem_wait(psem) DosWaitEventSem(*(psem),-1) - #define sem_post(psem) DosPostEventSem(*(psem)) - #define sem_destroy(psem) DosCloseEventSem(*(psem)) - -#else - - #error "Need semaphore wrappers." - -#endif - -/* NOT POSIX */ -DLLEXPORT int sem_trywait_block(sem_t* psem, unsigned long timeout); - - -/* Change semaphore to "unsignaled" (NOT POSIX) */ -#ifdef USE_XP_SEMAPHORES -#define sem_reset(psem) xp_sem_setvalue((psem), 0) -#else -#define sem_reset(psem) while(sem_trywait(psem)==0) -#endif - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/sockwrap.c b/xpdev/sockwrap.c deleted file mode 100644 index 42ae2c8198ec1161847528836c611050321ca8f1..0000000000000000000000000000000000000000 --- a/xpdev/sockwrap.c +++ /dev/null @@ -1,844 +0,0 @@ -/* Berkley/WinSock socket API wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* alloca/free on FreeBSD */ -#include <string.h> /* bzero (for FD_ZERO) on FreeBSD */ -#include <errno.h> /* ENOMEM */ -#include <stdio.h> /* SEEK_SET */ -#include <string.h> -#if defined(_WIN32) - #include <malloc.h> /* alloca() on Win32 */ -#endif - -#include "genwrap.h" /* SLEEP */ -#include "gen_defs.h" /* BOOL/LOG_WARNING */ -#include "sockwrap.h" /* sendsocket */ -#include "filewrap.h" /* filelength */ - -static socket_option_t socket_options[] = { - { "TYPE", 0, SOL_SOCKET, SO_TYPE }, - { "ERROR", 0, SOL_SOCKET, SO_ERROR }, - { "DEBUG", 0, SOL_SOCKET, SO_DEBUG }, - { "LINGER", SOCK_STREAM, SOL_SOCKET, SO_LINGER }, - { "SNDBUF", 0, SOL_SOCKET, SO_SNDBUF }, - { "RCVBUF", 0, SOL_SOCKET, SO_RCVBUF }, - -#ifndef _WINSOCKAPI_ /* Defined, but not supported, by WinSock */ - { "SNDLOWAT", 0, SOL_SOCKET, SO_SNDLOWAT }, - { "RCVLOWAT", 0, SOL_SOCKET, SO_RCVLOWAT }, - { "SNDTIMEO", 0, SOL_SOCKET, SO_SNDTIMEO }, - { "RCVTIMEO", 0, SOL_SOCKET, SO_RCVTIMEO }, -#ifdef SO_USELOOPBACK /* SunOS */ - { "USELOOPBACK", 0, SOL_SOCKET, SO_USELOOPBACK }, -#endif -#endif - - { "REUSEADDR", 0, SOL_SOCKET, SO_REUSEADDR }, -#ifdef SO_REUSEPORT /* BSD */ - { "REUSEPORT", 0, SOL_SOCKET, SO_REUSEPORT }, -#endif -#ifdef SO_EXCLUSIVEADDRUSE /* WinSock */ - { "EXCLUSIVEADDRUSE", 0, SOL_SOCKET, SO_EXCLUSIVEADDRUSE }, -#endif - { "KEEPALIVE", SOCK_STREAM, SOL_SOCKET, SO_KEEPALIVE }, - { "DONTROUTE", 0, SOL_SOCKET, SO_DONTROUTE }, - { "BROADCAST", SOCK_DGRAM, SOL_SOCKET, SO_BROADCAST }, - { "OOBINLINE", SOCK_STREAM, SOL_SOCKET, SO_OOBINLINE }, - -#ifdef SO_ACCEPTCONN - { "ACCEPTCONN", SOCK_STREAM, SOL_SOCKET, SO_ACCEPTCONN }, -#endif -#ifdef SO_PRIORITY /* Linux */ - { "PRIORITY", 0, SOL_SOCKET, SO_PRIORITY }, -#endif -#ifdef SO_NO_CHECK /* Linux */ - { "NO_CHECK", 0, SOL_SOCKET, SO_NO_CHECK }, -#endif -#ifdef SO_PROTOTYPE /* SunOS */ - { "PROTOTYPE", 0, SOL_SOCKET, SO_PROTOTYPE }, -#endif -#ifdef SO_MAX_MSG_SIZE /* WinSock2 */ - { "MAX_MSG_SIZE", SOCK_DGRAM, SOL_SOCKET, SO_MAX_MSG_SIZE }, -#endif -#ifdef SO_CONNECT_TIME /* WinSock2 */ - { "CONNECT_TIME", SOCK_STREAM, SOL_SOCKET, SO_CONNECT_TIME }, -#endif - - /* IPPROTO-level socket options */ - { "TCP_NODELAY", SOCK_STREAM, IPPROTO_TCP, TCP_NODELAY }, - /* The following are platform-specific */ -#ifdef TCP_MAXSEG - { "TCP_MAXSEG", SOCK_STREAM, IPPROTO_TCP, TCP_MAXSEG }, -#endif -#ifdef TCP_CORK - { "TCP_CORK", SOCK_STREAM, IPPROTO_TCP, TCP_CORK }, -#endif -#ifdef TCP_KEEPIDLE - { "TCP_KEEPIDLE", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPIDLE }, -#endif -#ifdef TCP_KEEPINTVL - { "TCP_KEEPINTVL", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPINTVL }, -#endif -#ifdef TCP_KEEPCNT - { "TCP_KEEPCNT", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPCNT }, -#endif -#ifdef TCP_KEEPALIVE /* SunOS */ - { "TCP_KEEPALIVE", SOCK_STREAM, IPPROTO_TCP, TCP_KEEPALIVE }, -#endif -#ifdef TCP_SYNCNT - { "TCP_SYNCNT", SOCK_STREAM, IPPROTO_TCP, TCP_SYNCNT }, -#endif -#ifdef TCP_LINGER2 - { "TCP_LINGER2", SOCK_STREAM, IPPROTO_TCP, TCP_LINGER2 }, -#endif -#ifdef TCP_DEFER_ACCEPT - { "TCP_DEFER_ACCEPT", SOCK_STREAM, IPPROTO_TCP, TCP_DEFER_ACCEPT }, -#endif -#ifdef TCP_WINDOW_CLAMP - { "TCP_WINDOW_CLAMP", SOCK_STREAM, IPPROTO_TCP, TCP_WINDOW_CLAMP }, -#endif -#ifdef TCP_QUICKACK - { "TCP_QUICKACK", SOCK_STREAM, IPPROTO_TCP, TCP_QUICKACK }, -#endif -#ifdef TCP_NOPUSH - { "TCP_NOPUSH", SOCK_STREAM, IPPROTO_TCP, TCP_NOPUSH }, -#endif -#ifdef TCP_NOOPT - { "TCP_NOOPT", SOCK_STREAM, IPPROTO_TCP, TCP_NOOPT }, -#endif -#if defined(IPV6_V6ONLY) && defined(IPPROTO_IPV6) - { "IPV6_V6ONLY", 0, IPPROTO_IPV6, IPV6_V6ONLY }, -#endif - { NULL } -}; - -int getSocketOptionByName(const char* name, int* level) -{ - int i; - - if(level!=NULL) - *level=SOL_SOCKET; /* default option level */ - for(i=0;socket_options[i].name;i++) { - if(stricmp(name,socket_options[i].name)==0) { - if(level!=NULL) - *level = socket_options[i].level; - return(socket_options[i].value); - } - } - if(!IS_DIGIT(*name)) /* unknown option name */ - return(-1); - return(strtol(name,NULL,0)); -} - -socket_option_t* getSocketOptionList(void) -{ - return(socket_options); -} - -off_t sendfilesocket(int sock, int file, off_t *offset, off_t count) -{ - char buf[1024*16]; - off_t len; - ssize_t rd; - ssize_t wr=0; - off_t total=0; - ssize_t i; - -/* sendfile() on Linux may or may not work with non-blocking sockets ToDo */ - len=filelength(file); - - if(offset!=NULL) - if(lseek(file,*offset,SEEK_SET)<0) - return(-1); - - if(count<1 || count>len) { - count=len; - count-=tell(file); /* don't try to read beyond EOF */ - } -#if USE_SENDFILE - while((i=sendfile(file,sock,(offset==NULL?0:*offset)+total,count-total,NULL,&wr,0))==-1 && errno==EAGAIN) { - total+=wr; - SLEEP(1); - } - if(i==0) - return(count); -#endif - - if(count<0) { - errno=EINVAL; - return(-1); - } - - while(total<count) { - rd=read(file,buf,sizeof(buf)); - if(rd==-1) - return(-1); - if(rd==0) - break; - for(i=wr=0;i<rd;i+=wr) { - wr=sendsocket(sock,buf+i,rd-i); - if(wr>0) - continue; - if(wr==SOCKET_ERROR && ERROR_VALUE==EWOULDBLOCK) { - wr=0; - SLEEP(1); - continue; - } - return(wr); - } - if(i!=rd) - return(-1); - total+=rd; - } - - if(offset!=NULL) - (*offset)+=total; - - return(total); -} - -off_t recvfilesocket(int sock, int file, off_t *offset, off_t count) -{ - /* Writes a file from a socket - - * - * sock - Socket to read from - * file - File descriptior to write to - * MUST be open and writeable - * offset - pointer to file offset to start writing at - * is set to offset writing STOPPED - * on return - * count - number of bytes to read/write - * - * returns -1 if an error occurse, otherwise - * returns number ob bytes written and sets offset - * to the new offset - */ - - char* buf; - ssize_t rd; - ssize_t wr; - - if(count<1) { - errno=ERANGE; - return(-1); - } - - if((buf=(char*)malloc((size_t)count))==NULL) { - errno=ENOMEM; - return(-1); - } - - if(offset!=NULL) { - if(lseek(file,*offset,SEEK_SET)<0) { - free(buf); - return(-1); - } - } - - rd=read(sock,buf,(size_t)count); - if(rd!=count) { - free(buf); - return(-1); - } - - wr=write(file,buf,rd); - - if(offset!=NULL) - (*offset)+=wr; - - free(buf); - return(wr); -} - - -/* Return true if connected, optionally sets *rd_p to true if read data available */ -/* - * The exact conditions where rd_p is set to TRUE and the return value - * is true or false are complex, but the intent appears to be as follows: - * - * If the remote has half-closed the socket, rd_p should be FALSE and - * the function should return FALSE, unless rd_p is NULL in which case - * the function should return TRUE. wr_p will indicate that transmit - * buffers are available. - * - * If we have half-closed the socket, wr_p should be TRUE, the function - * should return TRUE, and rd_p will indicate if there is data available - * to be received. - * - * If the socket is completely closed, wr_p should be TRUE, rd_p should be - * FALSE, and the function should return FALSE, unless rd_p is NULL in which - * case, the function should return TRUE. - * - * When the function is open in both directions, wr_p will indicate transmit - * buffers are available, rd_p will indicate data is available to be recv()ed - * and the return value should be TRUE. - * - * If the socket is invalid, rd_p should be FALSE, wr_p should be FALSE, and - * the function should return FALSE. - * - * These rules have various exceptions when errors are returned by select(), - * poll(), or recv(), which will generally cause a FALSE return with rd_p - * being FALSE and wr_p being FALSE if select/poll failed, or indicating - * available write buffers otherwise. - */ -BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - int j, rd; - char ch; - - if(rd_p!=NULL) - *rd_p=FALSE; - - if(wr_p!=NULL) - *wr_p=FALSE; - - if(sock==INVALID_SOCKET) - return(FALSE); - - pfd.fd = sock; - pfd.events = POLLIN | POLLHUP; - if (wr_p != NULL) - pfd.events |= POLLOUT; - - j = poll(&pfd, 1, timeout); - - if (j == 0) - return TRUE; - - if (j == 1) { - if (wr_p != NULL && (pfd.revents & POLLOUT)) { - *wr_p = TRUE; - if (rd_p == NULL) - return TRUE; - } - - if (pfd.revents & (POLLERR | POLLNVAL | POLLHUP)) - return FALSE; - - if(pfd.revents & ~(POLLOUT) && (rd_p !=NULL || wr_p==NULL)) { - rd=recv(sock,&ch,1,MSG_PEEK); - if(rd==1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) { - if(rd_p!=NULL) - *rd_p=TRUE; - return TRUE; - } - } - return FALSE; - } - - if (j == -1) { - if (errno == EINTR || errno == ENOMEM) - return TRUE; - } - - return FALSE; -#else - char ch; - int i,rd; - fd_set rd_set; - fd_set* rd_set_p=&rd_set; - fd_set wr_set; - fd_set* wr_set_p=NULL; - struct timeval tv; - - if(rd_p!=NULL) - *rd_p=FALSE; - - if(wr_p!=NULL) - *wr_p=FALSE; - - if(sock==INVALID_SOCKET) - return(FALSE); - - FD_ZERO(&rd_set); - FD_SET(sock,&rd_set); - if(wr_p!=NULL) { - wr_set_p=&wr_set; - FD_ZERO(wr_set_p); - FD_SET(sock,wr_set_p); - if(rd_p==NULL) - rd_set_p=NULL; - } - - /* Convert timeout from ms to sec/usec */ - tv.tv_sec=timeout/1000; - tv.tv_usec=(timeout%1000)*1000; - - i=select(sock+1,rd_set_p,wr_set_p,NULL,&tv); - if(i==SOCKET_ERROR) - return(FALSE); - - if(i==0) - return(TRUE); - - if(wr_p!=NULL && FD_ISSET(sock,wr_set_p)) { - *wr_p=TRUE; - if(i==1) - return(TRUE); - } - - if(rd_p !=NULL || wr_p==NULL) { - rd=recv(sock,&ch,1,MSG_PEEK); - if(rd==1 - || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) { - if(rd_p!=NULL) - *rd_p=TRUE; - return(TRUE); - } - } - - return(FALSE); -#endif -} - -/* - * Return TRUE if recv() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if recv() will return an error - * as well as if the socket is closed (and recv() will return 0) - */ -BOOL socket_readable(SOCKET sock, int timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - pfd.fd = sock; - pfd.events = POLLIN; - - if (poll(&pfd, 1, timeout) == 1) - return TRUE; - return FALSE; -#else - fd_set rd_set; - struct timeval tv = {0}; - struct timeval *tvp = &tv; - - FD_ZERO(&rd_set); - FD_SET(sock, &rd_set); - if (timeout < 0) - tvp = NULL; - else { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - switch (select(sock+1, &rd_set, NULL, NULL, tvp)) { - case 0: // Nothing to read - return FALSE; - case 1: - return TRUE; - } - // Errors and unexpected cases - return TRUE; -#endif -} - -/* - * Return TRUE if send() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if send() will return an error - * as well as if the socket is closed (and send() will return 0) - */ -BOOL socket_writable(SOCKET sock, int timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - pfd.fd = sock; - pfd.events = POLLOUT; - - if (poll(&pfd, 1, timeout) == 1) - return TRUE; - return FALSE; -#else - fd_set wr_set; - struct timeval tv = {0}; - struct timeval *tvp = &tv; - - FD_ZERO(&wr_set); - FD_SET(sock, &wr_set); - if (timeout < 0) - tvp = NULL; - else { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - switch (select(sock+1, NULL, &wr_set, NULL, tvp)) { - case 0: // Nothing to read - return FALSE; - case 1: - return TRUE; - } - // Errors and unexpected cases - return TRUE; -#endif -} - -/* - * Return TRUE if recv() will not block and will return zero - * or an error. This is *not* a test if a socket is - * disconnected, but rather that it is disconnected *AND* all - * data has been recv()ed. - */ -BOOL socket_recvdone(SOCKET sock, int timeout) -{ -#ifdef PREFER_POLL - struct pollfd pfd = {0}; - pfd.fd = sock; - pfd.events = POLLIN; - char ch; - int rd; - - switch (poll(&pfd, 1, timeout)) { - case 1: - if (pfd.revents) { - rd = recv(sock,&ch,1,MSG_PEEK); - if (rd == 1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) - return FALSE; - return TRUE; - } - return FALSE; - case -1: - if (errno == EINTR || errno == ENOMEM) - return FALSE; - return TRUE; - } - return FALSE; -#else - fd_set rd_set; - struct timeval tv = {0}; - struct timeval *tvp = &tv; - char ch; - int rd; - - FD_ZERO(&rd_set); - FD_SET(sock, &rd_set); - if (timeout < 0) - tvp = NULL; - else { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - switch (select(sock+1, &rd_set, NULL, NULL, tvp)) { - case -1: // Error, call this disconnected - return TRUE; - case 0: // Nothing to read - return FALSE; - } - rd = recv(sock,&ch,1,MSG_PEEK); - if (rd == 1 || (rd==SOCKET_ERROR && ERROR_VALUE==EMSGSIZE)) - return FALSE; - return TRUE; -#endif -} - -int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen - ,uint retries, uint wait_secs - ,const char* prot - ,int (*lprintf)(int level, const char *fmt, ...)) -{ - char port_str[128]; - char err[256]; - int result=-1; - uint i; - - if(addr->sa_family==AF_INET) - SAFEPRINTF(port_str," to port %u",ntohs(((SOCKADDR_IN *)(addr))->sin_port)); - else - port_str[0]=0; - for(i=0;i<=retries;i++) { - if((result=bind(s,addr,addrlen))==0) - break; - if(lprintf!=NULL) - lprintf(i<retries ? LOG_WARNING:LOG_CRIT - ,"%04d !ERROR %d binding %s socket%s: %s", s, ERROR_VALUE, prot, port_str, socket_strerror(socket_errno, err, sizeof(err))); - if(i<retries) { - if(lprintf!=NULL) - lprintf(LOG_WARNING,"%04d Will retry in %u seconds (%u of %u)" - ,s, wait_secs, i+1, retries); - SLEEP(wait_secs*1000); - } - } - return(result); -} - -int nonblocking_connect(SOCKET sock, struct sockaddr* addr, size_t size, unsigned timeout) -{ - int result; - socklen_t optlen; - - result=connect(sock, addr, size); - - if(result==SOCKET_ERROR) { - result=ERROR_VALUE; - if(result==EWOULDBLOCK || result==EINPROGRESS) { - if (socket_writable(sock, timeout * 1000)) { - result = 0; - } - else { - optlen = sizeof(result); - if(getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&result, &optlen)==SOCKET_ERROR) - result=ERROR_VALUE; - } - } - } - return result; -} - - -union xp_sockaddr* inet_ptoaddr(const char *addr_str, union xp_sockaddr *addr, size_t size) -{ - struct addrinfo hints = {0}; - struct addrinfo *res, *cur; - - hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; - if(getaddrinfo(addr_str, NULL, &hints, &res)) - return NULL; - - for(cur = res; cur; cur = cur->ai_next) { - if(cur->ai_addr->sa_family == AF_INET6) - break; - if(cur->ai_addr->sa_family == AF_INET) - break; - } - if(!cur) { - freeaddrinfo(res); - return NULL; - } - if (size < sizeof(struct sockaddr_in6)) { - freeaddrinfo(res); - return NULL; - } - size = sizeof(struct sockaddr_in6); - memcpy(addr, ((struct sockaddr_in6 *)(cur->ai_addr)), size); - freeaddrinfo(res); - return addr; -} - -const char* inet_addrtop(union xp_sockaddr *addr, char *dest, size_t size) -{ -#ifdef _WIN32 - if(getnameinfo(&addr->addr, xp_sockaddr_len(addr), dest, size, NULL, 0, NI_NUMERICHOST)) - safe_snprintf(dest, size, "<Error %u converting address, family=%u>", WSAGetLastError(), addr->addr.sa_family); - return dest; -#else - switch(addr->addr.sa_family) { - case AF_INET: - return inet_ntop(addr->in.sin_family, &addr->in.sin_addr, dest, size); - case AF_INET6: - return inet_ntop(addr->in6.sin6_family, &addr->in6.sin6_addr, dest, size); - case AF_UNIX: - strncpy(dest, addr->un.sun_path, size); - dest[size-1]=0; - return dest; - default: - safe_snprintf(dest, size, "<unknown address family: %u>", addr->addr.sa_family); - return NULL; - } -#endif -} - -uint16_t inet_addrport(union xp_sockaddr *addr) -{ - switch(addr->addr.sa_family) { - case AF_INET: - return ntohs(addr->in.sin_port); - case AF_INET6: - return ntohs(addr->in6.sin6_port); - default: - return 0; - } -} - -void inet_setaddrport(union xp_sockaddr *addr, uint16_t port) -{ - switch(addr->addr.sa_family) { - case AF_INET: - addr->in.sin_port = htons(port); - break; - case AF_INET6: - addr->in6.sin6_port = htons(port); - break; - } -} - -/* Return TRUE if the 2 addresses are the same host (type and address) */ -BOOL inet_addrmatch(union xp_sockaddr* addr1, union xp_sockaddr* addr2) -{ - if(addr1->addr.sa_family != addr2->addr.sa_family) - return FALSE; - - switch(addr1->addr.sa_family) { - case AF_INET: - return memcmp(&addr1->in.sin_addr, &addr2->in.sin_addr, sizeof(addr1->in.sin_addr)) == 0; - case AF_INET6: - return memcmp(&addr1->in6.sin6_addr, &addr2->in6.sin6_addr, sizeof(addr1->in6.sin6_addr)) == 0; - } - return FALSE; -} - -/* Return the current socket error description (for Windows), like strerror() does for errno */ -DLLEXPORT char* socket_strerror(int error_number, char* buf, size_t buflen) -{ -#if defined(_WINSOCKAPI_) - strncpy(buf, "Unknown error", buflen); - buf[buflen - 1] = 0; - if(error_number > 0 && error_number < WSABASEERR) - error_number += WSABASEERR; - if(!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, // dwFlags - NULL, // lpSource - error_number, // dwMessageId - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // dwLanguageId - buf, - buflen, - NULL)) - safe_snprintf(buf, buflen, "Error %d getting error description", GetLastError()); - truncsp(buf); - return buf; -#else - return safe_strerror(error_number, buf, buflen); -#endif -} - -DLLEXPORT void set_socket_errno(int err) -{ -#if defined(_WINSOCKAPI_) - WSASetLastError(err); -#else - errno = err; -#endif -} - -DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst) -{ - struct addrinfo hints = {0}; - struct addrinfo *res, *cur; - - if (af != AF_INET && af != AF_INET6) { - set_socket_errno(EAFNOSUPPORT); - return -1; - } - - hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; - if(getaddrinfo(src, NULL, &hints, &res)) - return -1; - - for(cur = res; cur; cur++) { - if(cur->ai_addr->sa_family == af) - break; - } - if(!cur) { - freeaddrinfo(res); - return 0; - } - switch(af) { - case AF_INET: - memcpy(dst, &(((struct sockaddr_in *)cur)->sin_addr), sizeof(((struct sockaddr_in *)cur)->sin_addr)); - break; - case AF_INET6: - memcpy(dst, &(((struct sockaddr_in6 *)cur)->sin6_addr), sizeof(((struct sockaddr_in6 *)cur)->sin6_addr)); - break; - } - freeaddrinfo(res); - return 1; -} - -#ifdef _WIN32 -DLLEXPORT int -socketpair(int domain, int type, int protocol, SOCKET *sv) -{ - union xp_sockaddr la = {0}; - const int ra = 1; - SOCKET ls; - SOCKET *check; - fd_set rfd; - struct timeval tv; - size_t sa_len; - - sv[0] = sv[1] = INVALID_SOCKET; - ls = socket(domain, type, protocol); - if (ls == INVALID_SOCKET) - goto fail; - switch (domain) { - case PF_INET: - if (inet_ptoaddr("127.0.0.1", &la, sizeof(la)) == NULL) - goto fail; - sa_len = sizeof(la.in); - break; - case PF_INET6: - if (inet_ptoaddr("::1", &la, sizeof(la)) == NULL) - goto fail; - sa_len = sizeof(la.in6); - break; - default: - goto fail; - } - inet_setaddrport(&la, 0); - if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char *)&ra, sizeof(ra)) == -1) - goto fail; - if (bind(ls, &la.addr, sa_len) == -1) - goto fail; - if (getsockname(ls, &la.addr, &sa_len) == -1) - goto fail; - if (listen(ls, 1) == -1) - goto fail; - sv[0] = socket(la.addr.sa_family, type, protocol); - if (sv[0] == INVALID_SOCKET) - goto fail; - if (connect(sv[0], &la.addr, sa_len) == -1) - goto fail; - sv[1] = accept(ls, NULL, NULL); - if (sv[1] == INVALID_SOCKET) - goto fail; - closesocket(ls); - ls = INVALID_SOCKET; - - if (send(sv[1], (const char *)&sv, sizeof(sv), 0) != sizeof(sv)) - goto fail; - tv.tv_sec = 0; - tv.tv_usec = 50000; - FD_ZERO(&rfd); - FD_SET(sv[0], &rfd); - if (select(sv[0] + 1, &rfd, NULL, NULL, &tv) != 1) - goto fail; - if (recv(sv[0], (char *)&check, sizeof(check), 0) != sizeof(check)) - goto fail; - if (check != sv) - goto fail; - return 0; - -fail: - if (ls != INVALID_SOCKET) - closesocket(ls); - if (sv[0] != INVALID_SOCKET) - closesocket(sv[0]); - sv[0] = INVALID_SOCKET; - if (sv[1] != INVALID_SOCKET) - closesocket(sv[1]); - sv[1] = INVALID_SOCKET; - return -1; -} -#endif - diff --git a/xpdev/sockwrap.h b/xpdev/sockwrap.h deleted file mode 100644 index b5d3866f255326b9b8b64e6e2352b7b19f78f278..0000000000000000000000000000000000000000 --- a/xpdev/sockwrap.h +++ /dev/null @@ -1,308 +0,0 @@ -/* Berkley/WinSock socket API wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _SOCKWRAP_H -#define _SOCKWRAP_H - -#include "gen_defs.h" /* BOOL */ - -/***************/ -/* OS-specific */ -/***************/ -#if defined(_WIN32) /* Use WinSock */ - -#ifndef _WINSOCKAPI_ - #include <winsock2.h> /* socket/bind/etc. */ - #include <mswsock.h> /* Microsoft WinSock2 extensions */ -#if defined(__BORLANDC__) -// Borland C++ builder 6 comes with a broken ws2tcpip.h header for GCC. -#define _MSC_VER 7 -#endif - #include <ws2tcpip.h> /* More stuff */ -#if defined(__BORLANDC__) -#undef _MSC_VER -#endif - #if (_WIN32_WINNT < _WIN32_WINNT_WINXP) - #include <wspiapi.h> /* getaddrinfo() for Windows 2k */ - #endif - #define SOCK_MAXADDRLEN sizeof(SOCKADDR_STORAGE) - /* Let's agree on a standard WinSock symbol here, people */ - #define _WINSOCKAPI_ -#endif -#ifndef MSG_WAITALL -#define MSG_WAITALL 0x08 -#endif - -#elif defined __unix__ /* Unix-variant */ - -#include <netdb.h> /* gethostbyname */ -#include <sys/types.h> /* For u_int32_t on FreeBSD */ -#include <netinet/in.h> /* IPPROTO_IP */ -#include <sys/un.h> -/* define _BSD_SOCKLEN_T_ in order to define socklen_t on darwin */ -#ifdef __DARWIN__ -#define _BSD_SOCKLEN_T_ int -#endif -#include <sys/socket.h> /* socket/bind/etc. */ -#include <sys/time.h> /* struct timeval */ -#include <arpa/inet.h> /* inet_ntoa */ -#include <netinet/tcp.h> /* TCP_NODELAY */ -#include <unistd.h> /* close */ -#include <poll.h> -#if defined(__solaris__) - #include <sys/filio.h> /* FIONBIO */ - #define INADDR_NONE -1L -#else - #include <sys/ioctl.h> /* FIONBIO */ -#endif - -#endif - -#include <errno.h> /* errno */ -#include "wrapdll.h" /* DLLEXPORT */ - -typedef struct { - char* name; - int type; /* Supported socket types (or 0 for unspecified) */ - int level; - int value; -} socket_option_t; - -/* - * Fancy sockaddr_* union - */ -union xp_sockaddr { - struct sockaddr addr; - struct sockaddr_in in; - struct sockaddr_in6 in6; -#ifndef _WIN32 - struct sockaddr_un un; -#endif - struct sockaddr_storage store; -}; - -#define xp_sockaddr_len(a) ((((struct sockaddr *)a)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) - - - -/**********************************/ -/* Socket Implementation-specific */ -/**********************************/ -#if defined(_WINSOCKAPI_) - -#undef EINTR -#define EINTR (WSAEINTR-WSABASEERR) -#undef ENOTSOCK -#define ENOTSOCK (WSAENOTSOCK-WSABASEERR) -#undef EMSGSIZE -#define EMSGSIZE (WSAEMSGSIZE-WSABASEERR) -#undef EWOULDBLOCK -#define EWOULDBLOCK (WSAEWOULDBLOCK-WSABASEERR) - -#ifndef EPROTOTYPE -#define EPROTOTYPE (WSAEPROTOTYPE-WSABASEERR) -#endif -#ifndef ENOPROTOOPT -#define ENOPROTOOPT (WSAENOPROTOOPT-WSABASEERR) -#endif -#ifndef EPROTONOSUPPORT -#define EPROTONOSUPPORT (WSAEPROTONOSUPPORT-WSABASEERR) -#endif -#ifndef ESOCKTNOSUPPORT -#define ESOCKTNOSUPPORT (WSAESOCKTNOSUPPORT-WSABASEERR) -#endif -#ifndef EOPNOTSUPP -#define EOPNOTSUPP (WSAEOPNOTSUPP-WSABASEERR) -#endif -#ifndef EPFNOSUPPORT -#define EPFNOSUPPORT (WSAEPFNOSUPPORT-WSABASEERR) -#endif -#ifndef EAFNOSUPPORT -#define EAFNOSUPPORT (WSAEAFNOSUPPORT-WSABASEERR) -#endif - -#undef EADDRINUSE -#define EADDRINUSE (WSAEADDRINUSE-WSABASEERR) -#undef EADDRNOTAVAIL -#define EADDRNOTAVAIL (WSAEADDRNOTAVAIL-WSABASEERR) -#undef ECONNABORTED -#define ECONNABORTED (WSAECONNABORTED-WSABASEERR) -#undef ECONNRESET -#define ECONNRESET (WSAECONNRESET-WSABASEERR) -#undef ENOBUFS -#define ENOBUFS (WSAENOBUFS-WSABASEERR) -#undef EISCONN -#define EISCONN (WSAEISCONN-WSABASEERR) -#undef ENOTCONN -#define ENOTCONN (WSAENOTCONN-WSABASEERR) -#undef ESHUTDOWN -#define ESHUTDOWN (WSAESHUTDOWN-WSABASEERR) -#undef ETIMEDOUT -#define ETIMEDOUT (WSAETIMEDOUT-WSABASEERR) -#undef ECONNREFUSED -#define ECONNREFUSED (WSAECONNREFUSED-WSABASEERR) -#undef EINPROGRESS -#define EINPROGRESS (WSAEINPROGRESS-WSABASEERR) - -/* for shutdown() */ -#define SHUT_RD SD_RECEIVE -#define SHUT_WR SD_SEND -#define SHUT_RDWR SD_BOTH - -#define s_addr S_un.S_addr -#define sa_family_t ushort -typedef uint32_t in_addr_t; - -static int wsa_error; -#define ERROR_VALUE ((wsa_error=WSAGetLastError())>0 ? wsa_error-WSABASEERR : wsa_error) -#define socket_errno WSAGetLastError() -#define sendsocket(s,b,l) send(s,b,l,0) -typedef ULONG nfds_t; -/* - * NOTE: WSAPoll() has a bug where a non-blocking socket which has connect() - * called on it that is trying to connect to a closed port will timeout - * instead of returning a failure, even with POLLOUT specified. - */ -#define poll(s, c, t) WSAPoll(s, c, t) - -/* For getaddrinfo() */ -#ifndef AI_ADDRCONFIG -# define AI_ADDRCONFIG 0x400 // Vista or later -#endif -#ifndef AI_NUMERICSERV -# define AI_NUMERICSERV 0 // Not supported by Win32 -#endif - -#else /* BSD sockets */ - -/* WinSock-isms */ -#define HOSTENT struct hostent -#define IN_ADDR struct in_addr -#define SOCKADDR struct sockaddr -#define SOCKADDR_IN struct sockaddr_in -#define LINGER struct linger -#define SOCKET int -#define SOCKET_ERROR -1 -#define INVALID_SOCKET (SOCKET)(~0) -#define closesocket close -#define ioctlsocket ioctl -#define ERROR_VALUE errno -#define socket_errno errno -#define sendsocket write /* FreeBSD send() is broken */ - -#ifdef __WATCOMC__ - #define socklen_t int -#endif - -#endif /* __unix__ */ - -#ifdef __cplusplus -extern "C" { -#endif - -DLLEXPORT socket_option_t* getSocketOptionList(void); -DLLEXPORT int getSocketOptionByName(const char* name, int* level); - -DLLEXPORT off_t sendfilesocket(int sock, int file, off_t* offset, off_t count); -DLLEXPORT off_t recvfilesocket(int sock, int file, off_t* offset, off_t count); -DLLEXPORT BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout); -DLLEXPORT int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen - ,uint retries, uint wait_secs, const char* prot - ,int (*lprintf)(int level, const char *fmt, ...)); -DLLEXPORT int nonblocking_connect(SOCKET, struct sockaddr*, size_t, unsigned timeout /* seconds */); -DLLEXPORT union xp_sockaddr* inet_ptoaddr(const char *addr_str, union xp_sockaddr *addr, size_t size); -DLLEXPORT const char* inet_addrtop(union xp_sockaddr *addr, char *dest, size_t size); -DLLEXPORT uint16_t inet_addrport(union xp_sockaddr *addr); -DLLEXPORT void inet_setaddrport(union xp_sockaddr *addr, uint16_t port); -DLLEXPORT BOOL inet_addrmatch(union xp_sockaddr* addr1, union xp_sockaddr* addr2); -DLLEXPORT char* socket_strerror(int, char*, size_t); -DLLEXPORT void set_socket_errno(int); -DLLEXPORT int xp_inet_pton(int af, const char *src, void *dst); -#if defined(_WIN32) // mingw and WinXP's WS2_32.DLL don't have inet_pton(): - #define inet_pton xp_inet_pton -DLLEXPORT int socketpair(int domain, int type, int protocol, SOCKET *sv); -#endif - -/* - * Return TRUE if recv() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if recv() will return an error - * as well as if the socket is closed (and recv() will return 0) - */ -DLLEXPORT BOOL socket_readable(SOCKET sock, int timeout); - -/* - * Return TRUE if send() will not block on socket - * Will block for timeout ms or forever if timeout is negative - * - * This means it will return true if send() will return an error - * as well as if the socket is closed (and send() will return 0) - */ -DLLEXPORT BOOL socket_writable(SOCKET sock, int timeout); - -/* - * Return TRUE if recv() will not block and will return zero - * or an error. This is *not* a test if a socket is - * disconnected, but rather that it is disconnected *AND* all - * data has been recv()ed. - */ -DLLEXPORT BOOL socket_recvdone(SOCKET sock, int timeout); - -#ifdef __cplusplus -} -#endif - -#ifndef IPPORT_HTTP -#define IPPORT_HTTP 80 -#endif -#ifndef IPPORT_HTTPS -#define IPPORT_HTTPS 443 -#endif -#ifndef IPPORT_FTP -#define IPPORT_FTP 21 -#endif -#ifndef IPPORT_TELNET -#define IPPORT_TELNET 23 -#endif -#ifndef IPPORT_SMTP -#define IPPORT_SMTP 25 -#endif -#ifndef IPPORT_POP3 -#define IPPORT_POP3 110 -#endif -#ifndef IPPORT_POP3S -#define IPPORT_POP3S 995 -#endif -#ifndef IPPORT_IDENT -#define IPPORT_IDENT 113 -#endif -#ifndef IPPORT_SUBMISSION -#define IPPORT_SUBMISSION 587 -#endif -#ifndef IPPORT_SUBMISSIONS -#define IPPORT_SUBMISSIONS 465 -#endif -#ifndef IPPORT_BINKP -#define IPPORT_BINKP 24554 -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/str_list.c b/xpdev/str_list.c deleted file mode 100644 index aeace2d05c0f3ffb1fb5f62cde5aa5e387c2eba6..0000000000000000000000000000000000000000 --- a/xpdev/str_list.c +++ /dev/null @@ -1,876 +0,0 @@ -/* Functions to deal with NULL-terminated string lists */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdlib.h> /* malloc and qsort */ -#include <string.h> /* strtok */ -#include "genwrap.h" /* stricmp */ -#include "str_list.h" -#include "xpprintf.h" - -str_list_t strListInit(void) -{ - str_list_t list; - - if((list=(str_list_t)malloc(sizeof(char*)))==NULL) - return(NULL); - - list[0]=NULL; /* terminated by default */ - return(list); -} - -size_t strListCount(const str_list_t list) -{ - size_t i; - - COUNT_LIST_ITEMS(list,i); - - return(i); -} - -BOOL strListIsEmpty(const str_list_t list) -{ - return (list == NULL) || (list[0] == NULL); -} - -int strListIndexOf(const str_list_t list, const char* str) -{ - size_t i; - - if(list==NULL) - return -1; - - for(i=0; list[i]!=NULL; i++) { - if(list[i]==str) - return i; - } - - return -1; -} - -int strListFind(const str_list_t list, const char* str, BOOL case_sensitive) -{ - size_t i; - - if(list == NULL || str == NULL) - return -1; - - for(i=0; list[i]!=NULL; i++) { - if(case_sensitive) { - if(strcmp(list[i],str) == 0) - return i; - } else { - if(stricmp(list[i],str) == 0) - return i; - } - } - - return -1; -} - -static char* str_list_append(str_list_t* list, char* str, size_t index) -{ - str_list_t lp; - - if((lp=(str_list_t)realloc(*list,sizeof(char*)*(index+2)))==NULL) - return(NULL); - - *list=lp; - lp[index++]=str; - lp[index]=NULL; /* terminate list */ - - return(str); -} - -static char* str_list_insert(str_list_t* list, char* str, size_t index) -{ - size_t i; - size_t count; - str_list_t lp; - - if(*list == NULL) - *list = strListInit(); - count = strListCount(*list); - if(index > count) /* invalid index, do nothing */ - return(NULL); - - count++; - if((lp=(str_list_t)realloc(*list,sizeof(char*)*(count+1)))==NULL) - return(NULL); - - *list=lp; - for(i=count; i>index; i--) - lp[i]=lp[i-1]; - lp[index]=str; - - return(str); -} - -char* strListRemove(str_list_t* list, size_t index) -{ - char* str; - size_t i; - size_t count; - str_list_t lp; - - count = strListCount(*list); - - if(index==STR_LIST_LAST_INDEX && count) - index = count-1; - - if(index >= count) /* invalid index, do nothing */ - return(NULL); - - count--; - if((lp=(str_list_t)realloc(*list,sizeof(char*)*(count+1)))==NULL) - return(NULL); - - *list=lp; - str=lp[index]; - for(i=index; i<count; i++) - lp[i]=lp[i+1]; - lp[count]=NULL; - - return(str); -} - -// Remove without realloc -char* strListFastRemove(str_list_t list, size_t index) -{ - char* str; - size_t i; - size_t count; - - count = strListCount(list); - - if(index == STR_LIST_LAST_INDEX && count) - index = count-1; - - if(index >= count) /* invalid index, do nothing */ - return NULL; - - str = list[index]; - for(i = index; i < count; i++) - list[i] = list[i + 1]; - - return str; -} - -BOOL strListDelete(str_list_t* list, size_t index) -{ - char* str; - - if((str=strListRemove(list, index))==NULL) - return(FALSE); - - free(str); - - return(TRUE); -} - -BOOL strListFastDelete(str_list_t list, size_t index) -{ - char* str; - - if((str=strListFastRemove(list, index))==NULL) - return(FALSE); - - free(str); - - return(TRUE); -} - -char* strListReplace(const str_list_t list, size_t index, const char* str) -{ - char* buf; - size_t count; - - if(str==NULL) - return(NULL); - - count = strListCount(list); - - if(index==STR_LIST_LAST_INDEX && count) - index = count-1; - - if(index >= count) /* invalid index, do nothing */ - return(NULL); - - if((buf=(char*)realloc(list[index],strlen(str)+1))==NULL) - return(NULL); - - list[index]=buf; - strcpy(buf,str); - - return(buf); -} - -size_t strListModifyEach(const str_list_t list, char*(modify(size_t, char*, void*)), void* cbdata) -{ - size_t i; - if(list == NULL) - return 0; - for(i = 0; list[i] != NULL; i++) { - char* str = modify(i, list[i], cbdata); - if(str == NULL || str == list[i]) // Same old pointer (or NULL), no modification - continue; - str = strdup(str); - if(str == NULL) - break; - free(list[i]); - list[i] = str; - } - return i; -} - -BOOL strListSwap(const str_list_t list, size_t index1, size_t index2) -{ - char* tmp; - size_t count; - - count = strListCount(list); - - if(index1==STR_LIST_LAST_INDEX && count) - index1 = count-1; - - if(index2==STR_LIST_LAST_INDEX && count) - index2 = count-1; - - if(index1 >= count || index2 >= count || index1 == index2) - return(FALSE); /* invalid index, do nothing */ - - tmp=list[index1]; - list[index1]=list[index2]; - list[index2]=tmp; - - return(TRUE); -} - -char* strListAppend(str_list_t* list, const char* str, size_t index) -{ - char* buf; - char *ret; - - if(str==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - if(index==STR_LIST_LAST_INDEX) - index=strListCount(*list); - - ret = str_list_append(list,buf,index); - if (ret == NULL) - free(buf); - return ret; -} - -size_t strListAppendList(str_list_t* list, const str_list_t add_list) -{ - size_t i; - size_t count; - - count=strListCount(*list); - for(i=0; add_list != NULL && add_list[i] != NULL; i++) - strListAppend(list,add_list[i],count++); - - return(count); -} - -#if !defined(__BORLANDC__) // Doesn't have asprintf() or va_copy()_vscprintf() -char* strListAppendFormat(str_list_t* list, const char* format, ...) -{ - char *ret; - char* buf = NULL; - int len; - va_list va; - - va_start(va, format); - len = vasprintf(&buf, format, va); - va_end(va); - - if(len == -1 || buf == NULL) - return NULL; - - ret = str_list_append(list, buf, strListCount(*list)); - if (ret == NULL) - free(buf); - return ret; -} -#endif - -char* strListInsert(str_list_t* list, const char* str, size_t index) -{ - char* buf; - char* ret; - - if(str==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - ret = str_list_insert(list,buf,index); - if (ret == NULL) - free(buf); - return ret; -} - -size_t strListInsertList(str_list_t* list, const str_list_t add_list, size_t index) -{ - size_t i; - - if(add_list == NULL) - return 0; - - for(i=0; add_list[i]!=NULL; i++) - if(strListInsert(list,add_list[i],index++)==NULL) - break; - - return(i); -} - -#if !defined(__BORLANDC__) // Doesn't have asprintf() or va_copy()_vscprintf() -char* strListInsertFormat(str_list_t* list, size_t index, const char* format, ...) -{ - char *ret; - char* buf = NULL; - int len; - va_list va; - - va_start(va, format); - len = vasprintf(&buf, format, va); - va_end(va); - - if(len == -1 || buf == NULL) - return NULL; - - ret = str_list_insert(list, buf, index); - if (ret == NULL) - free(buf); - return ret; -} -#endif - -str_list_t strListSplit(str_list_t* lp, char* str, const char* delimit) -{ - size_t count; - char* token; - char* tmp; - str_list_t list; - - if(str==NULL || delimit==NULL) - return(NULL); - - if(lp==NULL) { - if((list = strListInit())==NULL) - return(NULL); - lp=&list; - count=0; - } else - count=strListCount(*lp); - - for(token = strtok_r(str, delimit, &tmp); token!=NULL; token=strtok_r(NULL, delimit, &tmp)) - if(strListAppend(lp, token, count++)==NULL) - break; - - return(*lp); -} - -str_list_t strListSplitCopy(str_list_t* list, const char* str, const char* delimit) -{ - char* buf; - str_list_t new_list; - - if(str==NULL || delimit==NULL) - return(NULL); - - if((buf=strdup(str))==NULL) - return(NULL); - - new_list=strListSplit(list,buf,delimit); - - free(buf); - - if(list!=NULL) - *list = new_list; - - return(new_list); -} - -size_t strListMerge(str_list_t* list, str_list_t add_list) -{ - size_t i; - size_t count; - - if(add_list == NULL) - return 0; - - count=strListCount(*list); - for(i=0; add_list[i]!=NULL; i++) - str_list_append(list,add_list[i],count++); - - return(i); -} - -char* strListCombine(str_list_t list, char* buf, size_t maxlen, const char* delimit) -{ - size_t i; - char* end; - char* ptr; - - if(maxlen<1) - return(NULL); - - if(buf==NULL) - if((buf=(char*)malloc(maxlen))==NULL) - return(NULL); - - memset(buf, 0, maxlen); - if(list==NULL) - return buf; - - end=buf+maxlen; - for(i=0, ptr=buf; list[i]!=NULL && buf<end; i++) - ptr += safe_snprintf(ptr, end-ptr, "%s%s", i ? delimit:"", list[i]); - - return(buf); -} - -#if defined(_WIN32) - #define QSORT_CALLBACK_TYPE __cdecl -#else - #define QSORT_CALLBACK_TYPE -#endif - -static int QSORT_CALLBACK_TYPE strListCompareAlpha(const void *arg1, const void *arg2) -{ - return stricmp(*(char**)arg1, *(char**)arg2); -} - -static int QSORT_CALLBACK_TYPE strListCompareAlphaReverse(const void *arg1, const void *arg2) -{ - return stricmp(*(char**)arg2, *(char**)arg1); -} - -static int QSORT_CALLBACK_TYPE strListCompareAlphaCase(const void *arg1, const void *arg2) -{ - return strcmp(*(char**)arg1, *(char**)arg2); -} - -static int QSORT_CALLBACK_TYPE strListCompareAlphaCaseReverse(const void *arg1, const void *arg2) -{ - return strcmp(*(char**)arg2, *(char**)arg1); -} - -void strListSortAlpha(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlpha); -} - -void strListSortAlphaReverse(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlphaReverse); -} - -void strListSortAlphaCase(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlphaCase); -} - -void strListSortAlphaCaseReverse(str_list_t list) -{ - if(list != NULL) - qsort(list,strListCount(list),sizeof(char*),strListCompareAlphaCaseReverse); -} - -str_list_t strListDup(str_list_t list) -{ - str_list_t ret; - size_t count=0; - - if(list == NULL) - return NULL; - ret = strListInit(); - for(; *list; list++) - strListAppend(&ret, *list, count++); - return ret; -} - -int strListCmp(str_list_t list1, str_list_t list2) -{ - str_list_t l1=strListDup(list1); - str_list_t l2=strListDup(list2); - str_list_t ol1=l1; - str_list_t ol2=l2; - int tmp; - int ret; - - if(*l1 == NULL && *l2 == NULL) { - ret=0; - goto early_return; - } - if(*l1 == NULL) { - ret = -1; - goto early_return; - } - if(*l2 == NULL) { - ret = 1; - goto early_return; - } - - strListSortAlphaCase(l1); - strListSortAlphaCase(l2); - - for(; *l1; l1++) { - l2++; - if(*l2==NULL) { - ret=1; - goto early_return; - } - tmp = strcmp(*l1, *l2); - if(tmp != 0) { - ret=tmp; - goto early_return; - } - } - l2++; - if(*l2==NULL) - ret=0; - else - ret=-1; - -early_return: - strListFree(&ol1); - strListFree(&ol2); - return ret; -} - -void strListFreeStrings(str_list_t list) -{ - size_t i; - - FREE_LIST_ITEMS(list,i); -} - -void strListFree(str_list_t* list) -{ - if(list != NULL && *list != NULL) { - strListFreeStrings(*list); - FREE_AND_NULL(*list); - } -} - -static str_list_t str_list_read_file(FILE* fp, str_list_t* lp, size_t max_line_len) -{ - char* buf=NULL; - size_t count; - str_list_t list; - - if(max_line_len<1) - max_line_len=2048; - - if(lp==NULL) { - if((list = strListInit())==NULL) - return(NULL); - lp=&list; - } - - if(fp!=NULL) { - count=strListCount(*lp); - while(!feof(fp)) { - if(buf==NULL && (buf=(char*)malloc(max_line_len+1))==NULL) - return(NULL); - - if(fgets(buf,max_line_len+1,fp)==NULL) - break; - strListAppend(lp, buf, count++); - } - } - if(buf) - free(buf); - - return(*lp); -} - -size_t strListInsertFile(FILE* fp, str_list_t* lp, size_t index, size_t max_line_len) -{ - str_list_t list; - size_t count; - - if((list=str_list_read_file(fp, NULL, max_line_len)) == NULL) - return(0); - - count = strListInsertList(lp, list, index); - - strListFree(&list); - - return(count); -} - -str_list_t strListReadFile(FILE* fp, str_list_t* lp, size_t max_line_len) -{ - return str_list_read_file(fp,lp,max_line_len); -} - -size_t strListWriteFile(FILE* fp, const str_list_t list, const char* separator) -{ - size_t i; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - if(fputs(list[i],fp)==EOF) - break; - if(separator!=NULL && fputs(separator,fp)==EOF) - break; - } - - return(i); -} - -char* strListJoin(const str_list_t list, char* buf, size_t buflen, const char* separator) -{ - size_t i; - - if(buflen < 1) - return NULL; - - *buf = '\0'; - - if(list == NULL) - return buf; - - if(separator == NULL) - separator = ", "; - - for(i = 0; list[i] != NULL; i++) { - if(strlen(buf) + strlen(separator) + strlen(list[i]) >= buflen) - break; - if(i > 0) - strcat(buf, separator); - strcat(buf, list[i]); - } - return buf; -} - -size_t strListBlockLength(char* block) -{ - char* p=block; - size_t str_len; - size_t block_len=0; - - if(block==NULL) - return(0); - - /* calculate total block length */ - while((str_len=strlen(p))!=0) { - block_len+=(str_len + 1); - p+=(str_len + 1); - } - /* block must be double-NULL terminated */ - if(!block_len) - block_len=1; - block_len++; - - return(block_len); -} - -char* strListCopyBlock(char* block) -{ - char* p; - size_t block_len; - - if((block_len=strListBlockLength(block))==0) - return(NULL); - - if((p=(char*)malloc(block_len))==NULL) - return(NULL); - memcpy(p, block, block_len); - return(p); -} - -char* strListAppendBlock(char* block, str_list_t list) -{ - char* p; - size_t str_len; - size_t block_len; - size_t i; - - if((block_len=strListBlockLength(block))!=0) - block_len--; /* Over-write existing NULL terminator */ - - for(i=0; list != NULL && list[i] != NULL; i++) { - str_len=strlen(list[i]); - if(str_len==0) - continue; /* can't include empty strings in block */ - if((p=(char*)realloc(block, block_len + str_len + 1))==NULL) { - FREE_AND_NULL(block); - return(block); - } - block=p; - strcpy(block + block_len, list[i]); - block_len += (str_len + 1); - } - - /* block must be double-NULL terminated */ - if(!block_len) - block_len=1; - block_len++; - if((p=(char*)realloc(block, block_len))==NULL) { - FREE_AND_NULL(block); - return(block); - } - block=p; - memset(block + (block_len-2), 0, 2); - - return(block); -} - -char* strListCreateBlock(str_list_t list) -{ - return(strListAppendBlock(NULL,list)); -} - -void strListFreeBlock(char* block) -{ - if(block!=NULL) - free(block); /* this must be done here for Windows-DLL reasons */ -} - -int strListTruncateTrailingWhitespaces(str_list_t list) -{ - size_t i; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - truncsp(list[i]); - } - return i; -} - -int strListTruncateTrailingLineEndings(str_list_t list) -{ - size_t i; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - truncnl(list[i]); - } - return i; -} - -/* Truncate strings in list at first occurrence of any char in 'set' */ -int strListTruncateStrings(str_list_t list, const char* set) -{ - size_t i; - char* p; - - if(list==NULL) - return(0); - - for(i=0; list[i]!=NULL; i++) { - p=strpbrk(list[i], set); - if(p!=NULL && *p!=0) - *p=0; - } - return i; -} - -/* Strip chars in 'set' from strings in list */ -int strListStripStrings(str_list_t list, const char* set) -{ - size_t i; - char* o; - char* p; - - if(list == NULL) - return 0; - - for(i = 0; list[i] != NULL; i++) { - for(o = p = list[i]; (*p != '\0'); p++) { - if(strchr(set, *p) == NULL) - *(o++) = *p; - } - *o = '\0'; - } - return i; -} - -/* Remove duplicate strings from list, return the new list length */ -int strListDedupe(str_list_t* list, BOOL case_sensitive) -{ - size_t i,j; - - if(list == NULL || *list == NULL) - return 0; - - for(i = 0; (*list)[i] != NULL; i++) { - for(j = i + 1; (*list)[j] != NULL; ) { - if((case_sensitive && strcmp((*list)[i], (*list)[j]) == 0) - || (!case_sensitive && stricmp((*list)[i], (*list)[j]) == 0)) - strListDelete(list, j); - else - j++; - } - } - return i; -} - -int strListDeleteBlanks(str_list_t* list) -{ - size_t i; - - if(list == NULL || *list == NULL) - return 0; - - for(i = 0; (*list)[i] != NULL; ) { - if((*list)[i][0] == '\0') - strListDelete(list, i); - else - i++; - } - return i; -} - -int strListFastDeleteBlanks(str_list_t list) -{ - size_t i; - - if(list == NULL || *list == NULL) - return 0; - - for(i = 0; list[i] != NULL; ) { - if(list[i][0] == '\0') - strListFastDelete(list, i); - else - i++; - } - return i; -} diff --git a/xpdev/str_list.h b/xpdev/str_list.h deleted file mode 100644 index a5994b359efe7f4c14c6b49ff7b4ab374b864a34..0000000000000000000000000000000000000000 --- a/xpdev/str_list.h +++ /dev/null @@ -1,177 +0,0 @@ -/* Functions to deal with NULL-terminated string lists */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _STR_LIST_H -#define _STR_LIST_H - -#include <stdio.h> /* FILE */ -#include <stddef.h> /* size_t */ -#include "gen_defs.h" -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -#define STR_LIST_LAST_INDEX (~0) - -typedef char** str_list_t; - -/* Returns an allocated and terminated string list */ -DLLEXPORT str_list_t strListInit(void); - -/* Frees the strings in the list (and the list itself) */ -DLLEXPORT void strListFree(str_list_t*); - -/* Frees the strings in the list */ -DLLEXPORT void strListFreeStrings(str_list_t); - -/* Adds a string to the end of a string list (see strListPush) */ -/* Pass a pointer to a string list, the string to add (append) */ -/* The string to add is duplicated (using strdup) and the duplicate is added to the list */ -/* If you already know the index of the last string, pass it, otherwise pass STR_LIST_LAST_INDEX */ -/* Returns the updated list or NULL on error */ -DLLEXPORT char* strListAppend(str_list_t*, const char* str, size_t index); - -/* Append a string list onto another string list */ -DLLEXPORT size_t strListAppendList(str_list_t*, const str_list_t append_list); - -/* Append a malloc'd formatted string to the end of the list */ -DLLEXPORT char* strListAppendFormat(str_list_t* list, const char* format, ...); - -/* Inserts a string into the list at a specific index */ -/* Pass a pointer to a string list, the string to add (insert) */ -/* The string to add is duplicated (using strdup) and the duplicate is added to the list */ -DLLEXPORT char* strListInsert(str_list_t*, const char* str, size_t index); - -/* Insert a string list into another string list */ -DLLEXPORT size_t strListInsertList(str_list_t*, const str_list_t append_list, size_t index); - -/* Insert a malloc'd formatted string into the list */ -DLLEXPORT char* strListInsertFormat(str_list_t* list, size_t index, const char* format, ...); - -/* Remove a string at a specific index */ -DLLEXPORT char* strListRemove(str_list_t*, size_t index); -DLLEXPORT char* strListFastRemove(str_list_t, size_t index); - -/* Remove and free a string at a specific index */ -DLLEXPORT BOOL strListDelete(str_list_t*, size_t index); -DLLEXPORT BOOL strListFastDelete(str_list_t, size_t index); - -/* Replace a string at a specific index */ -DLLEXPORT char* strListReplace(const str_list_t, size_t index, const char* str); - -/* Return a single-string representation of the entire string list, joined with the specified separator */ -DLLEXPORT char* strListJoin(const str_list_t, char* buf, size_t buflen, const char* separator); - -/* Call a modification callback function for each string in a list */ -/* and replace each string with the result of the modification callback. */ -/* If the modification callback function returns NULL, the string is not modified. */ -/* If the modification callback function returns the same string item pointer it was passed, the string is not realloc'd. */ -/* If the modification callback function needs to expand the string item (make it bigger), it must return a new valid pointer */ -/* (possibly, the cbdata, a global array or a static automatic variable). Since the new pointer is not free'd here, it should */ -/* not be dynamically allocated by the callback function. */ -/* Returns the number of modified strings (normally, the list count unless there was a failure) */ -DLLEXPORT size_t strListModifyEach(const str_list_t list, char*(modify(size_t index, char* str, void*)), void* cbdata); - -/* Swap the strings at index1 and index2 */ -DLLEXPORT BOOL strListSwap(const str_list_t, size_t index1, size_t index2); - -/* Convenience macros for pushing, popping strings (LIFO stack) */ -#define strListPush(list, str) strListAppend(list, str, STR_LIST_LAST_INDEX) -#define strListPop(list) strListRemove(list, STR_LIST_LAST_INDEX) - -/* Add to an existing or new string list by splitting specified string (str) */ -/* into multiple strings, separated by one of the delimit characters */ -DLLEXPORT str_list_t strListSplit(str_list_t*, char* str, const char* delimit); - -/* Same as above, but copies str to temporary heap buffer first */ -DLLEXPORT str_list_t strListSplitCopy(str_list_t*, const char* str, const char* delimit); - -/* Merge 2 string lists (no copying of string data) */ -DLLEXPORT size_t strListMerge(str_list_t*, str_list_t append_list); - -/* Create a single delimited string from the specified list */ -/* If buf is NULL, the buf is malloc'd and should be freed using strListFreeBlock() */ -/* Note: maxlen includes '\0' terminator */ -DLLEXPORT char* strListCombine(str_list_t, char* buf, size_t maxlen, const char* delimit); - -/* Count the number of strings in the list and returns the count */ -DLLEXPORT size_t strListCount(const str_list_t); -DLLEXPORT BOOL strListIsEmpty(const str_list_t); - -/* Returns the index of the specified str (by ptr compare) or -1 if not found */ -DLLEXPORT int strListIndexOf(const str_list_t, const char* str); -/* Returns the index of the specified str (by string compare) or -1 if not found */ -DLLEXPORT int strListFind(const str_list_t, const char* str, BOOL case_sensitive); - -/* Sort the strings in the string list */ -DLLEXPORT void strListSortAlpha(str_list_t); -DLLEXPORT void strListSortAlphaReverse(str_list_t); - -/* Case-sensitive sorting */ -DLLEXPORT void strListSortAlphaCase(str_list_t); -DLLEXPORT void strListSortAlphaCaseReverse(str_list_t); - -/* Create/Copy/Append/Free NULL-terminated string block */ -/* (e.g. for environment variable blocks) */ -DLLEXPORT char* strListCreateBlock(str_list_t); -DLLEXPORT char* strListCopyBlock(char* block); -DLLEXPORT char* strListAppendBlock(char* block, str_list_t); -DLLEXPORT size_t strListBlockLength(char* block); -DLLEXPORT void strListFreeBlock(char*); - -/* Duplicates a list */ -DLLEXPORT str_list_t strListDup(str_list_t list); - -/* Compares two lists */ -DLLEXPORT int strListCmp(str_list_t list1, str_list_t list2); - -/* Modifies strings in list (returns count of items in list) */ -DLLEXPORT int strListTruncateTrailingWhitespaces(str_list_t); -DLLEXPORT int strListTruncateTrailingLineEndings(str_list_t); -/* Truncate strings in list at first occurrence of any char in 'set' */ -DLLEXPORT int strListTruncateStrings(str_list_t, const char* set); -/* Remove all occurrences of chars in set from string in list */ -DLLEXPORT int strListStripStrings(str_list_t, const char* set); -/* Remove duplicate strings from list, return the new list length */ -DLLEXPORT int strListDedupe(str_list_t*, BOOL case_sensitive); -/* Remove blank strings from list, return the new list length */ -DLLEXPORT int strListDeleteBlanks(str_list_t*); -DLLEXPORT int strListFastDeleteBlanks(str_list_t); - -/************/ -/* File I/O */ -/************/ - -/* Read lines from file appending each line (with '\n' char) to string list */ -/* Pass NULL list to have list allocated for you */ -DLLEXPORT str_list_t strListReadFile(FILE*, str_list_t*, size_t max_line_len); -DLLEXPORT size_t strListInsertFile(FILE*, str_list_t*, size_t index, size_t max_line_len); - -/* Write to file (fp) each string in the list, optionally separated by separator (e.g. "\n") */ -DLLEXPORT size_t strListWriteFile(FILE*, const str_list_t, const char* separator); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/strwrap.c b/xpdev/strwrap.c deleted file mode 100644 index 00fff9a4c5612bca9db38e3c70c3a9f6b0d81124..0000000000000000000000000000000000000000 --- a/xpdev/strwrap.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#if !defined _MSC_VER && !defined __BORLANDC__ -char* itoa(int val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%o",val); - break; - case 10: - sprintf(str,"%u",val); - break; - case 16: - sprintf(str,"%x",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} - -char* ltoa(long val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%lo",val); - break; - case 10: - sprintf(str,"%lu",val); - break; - case 16: - sprintf(str,"%lx",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} -#endif - -#if defined(_WIN32) && !defined(_MSC_VER) -/* From FreeBSD */ -size_t -strnlen(const char *s, size_t maxlen) -{ - size_t len; - - for (len = 0; len < maxlen; len++, s++) { - if (!*s) - break; - } - return (len); -} -#endif - -#ifdef _WIN32 -/* From FreeBSD */ -char * -strndup(const char *str, size_t maxlen) -{ - char *copy; - size_t len; - - len = strnlen(str, maxlen); - copy = malloc(len + 1); - if (copy != NULL) { - (void)memcpy(copy, str, len); - copy[len] = '\0'; - } - - return copy; -} -#endif diff --git a/xpdev/strwrap.h b/xpdev/strwrap.h deleted file mode 100644 index e52986f122e4baa1a5fe5ec95b0fd4daa36fdf1d..0000000000000000000000000000000000000000 --- a/xpdev/strwrap.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _STRWRAP_H_ -#define _STRWRAP_H_ - -#include <string.h> - -#if !defined _MSC_VER && !defined __BORLANDC__ - -#if defined(__cplusplus) -extern "C" { -#endif -char* itoa(int val, char* str, int radix); -char* ltoa(long val, char* str, int radix); -#if defined(__cplusplus) -} -#endif - -#define strset(x,y) memset(x, y, strlen(x)) - -#endif - -#if defined(_MSC_VER) || defined(__MSVCRT__) -#if defined(__cplusplus) -extern "C" { -#endif - -char *strndup(const char *str, size_t maxlen); -size_t strnlen(const char *s, size_t maxlen); - -#if defined(__cplusplus) -} -#endif -#endif - -#endif diff --git a/xpdev/threadwrap.c b/xpdev/threadwrap.c deleted file mode 100644 index 782ee302e98847e4bba32607632c88f2923de469..0000000000000000000000000000000000000000 --- a/xpdev/threadwrap.c +++ /dev/null @@ -1,304 +0,0 @@ -/* threadwrap.c */ - -/* Thread-related cross-platform development wrappers */ - -/* $Id: threadwrap.c,v 1.37 2019/02/18 04:04:11 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(__unix__) - #include <unistd.h> /* _POSIX_THREADS */ - #include <sys/param.h> /* BSD */ -#endif - -#if defined(_WIN32) && !defined(_WIN32_WINNT) - #define _WIN32_WINNT 0x0400 /* Needed for TryEnterCriticalSection */ -#endif - -#include "genwrap.h" /* SLEEP() */ -#include "threadwrap.h" - -/****************************************************************************/ -/* Wrapper for Win32 create/begin thread function */ -/* Uses POSIX threads */ -/****************************************************************************/ -#if defined(__unix__) -#if defined(_POSIX_THREADS) -ulong _beginthread(void( *start_address )( void * ) - ,unsigned stack_size, void *arglist) -{ - pthread_t thread; - pthread_attr_t attr; - size_t default_stack; - - (void)stack_size; - - pthread_attr_init(&attr); /* initialize attribute structure */ - - /* set thread attributes to PTHREAD_CREATE_DETACHED which will ensure - that thread resources are freed on exit() */ - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - - /* Default stack size in BSD is too small for JS stuff */ - /* Force to at least 256k */ -#define XPDEV_MIN_THREAD_STACK_SIZE (256*1024) - if(stack_size==0 && pthread_attr_getstacksize(&attr, &default_stack)==0 - && default_stack < XPDEV_MIN_THREAD_STACK_SIZE) - stack_size=XPDEV_MIN_THREAD_STACK_SIZE; - - if(stack_size!=0) - pthread_attr_setstacksize(&attr, stack_size); - - if(pthread_create(&thread -#if defined(__BORLANDC__) /* a (hopefully temporary) work-around */ - ,NULL -#else - ,&attr /* default attributes */ -#endif - /* POSIX defines this arg as "void *(*start_address)" */ - ,(void * (*)(void *)) start_address - ,arglist)==0) { - pthread_attr_destroy(&attr); - return((ulong) thread /* thread handle */); - } - - pthread_attr_destroy(&attr); - return(-1); /* error */ -} -#else - -#error "Need _beginthread implementation for non-POSIX thread library." - -#endif - -#endif /* __unix__ */ - -/****************************************************************************/ -/* Wrappers for POSIX thread (pthread) mutexes */ -/****************************************************************************/ -pthread_mutex_t pthread_mutex_initializer_np(BOOL recursive) -{ - pthread_mutex_t mutex; -#if defined(_POSIX_THREADS) - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - if(recursive) -#if defined(__linux__) && defined(PTHREAD_MUTEX_RECURSIVE_NP) && !defined(__USE_UNIX98) - pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP); -#else - pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); -#endif - pthread_mutex_init(&mutex, &attr); -#else /* Assumes recursive (e.g. Windows) */ - (void)recursive; - pthread_mutex_init(&mutex,NULL); -#endif - return(mutex); -} - -#if !defined(_POSIX_THREADS) - -int pthread_once(pthread_once_t *oc, void (*init)(void)) -{ - if (oc == NULL || init == NULL) - return EINVAL; - switch(InterlockedCompareExchange(&(oc->state), 1, 0)) { - case 0: // Never called - init(); - InterlockedIncrement(&(oc->state)); - return 0; - case 1: // In init function - /* We may not need to use InterlockedCompareExchange() here, - * but I hate marking things as volatile, and hate tight loops - * testing things that aren't marked volatile. - */ - while(InterlockedCompareExchange(&(oc->state), 1, 0) != 2) - SLEEP(1); - return 0; - case 2: // Done. - return 0; - } - return EINVAL; -} - -int pthread_mutex_init(pthread_mutex_t* mutex, void* attr) -{ - (void)attr; -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return ((((*mutex)=CreateMutex(/* security */NULL, /* owned */FALSE, /* name */NULL))==NULL) ? -1 : 0); -#elif defined(_WIN32) /* Win32 Critical Section */ - InitializeCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosCreateMutexSem(/* name */NULL, mutex, /* attr */0, /* owned */0); -#endif -} - -int pthread_mutex_lock(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (WaitForSingleObject(*mutex, INFINITE)==WAIT_OBJECT_0 ? 0 : EBUSY); -#elif defined(_WIN32) /* Win32 Critical Section */ - EnterCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosRequestMutexSem(*mutex, -1 /* SEM_INDEFINITE_WAIT */); -#endif -} - -int pthread_mutex_trylock(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (WaitForSingleObject(*mutex, 0)==WAIT_OBJECT_0 ? 0 : EBUSY); -#elif defined(_WIN32) /* Win32 Critical Section */ - /* TryEnterCriticalSection only available on NT4+ :-( */ - return (TryEnterCriticalSection(mutex) ? 0 : EBUSY); -#elif defined(__OS2__) - return DosRequestMutexSem(*mutex, 0 /* SEM_IMMEDIATE_RETURN */); -#endif -} - -int pthread_mutex_unlock(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (ReleaseMutex(*mutex) ? 0 : GetLastError()); -#elif defined(_WIN32) /* Win32 Critical Section */ - LeaveCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosReleaseMutexSem(*mutex); -#endif -} - -int pthread_mutex_destroy(pthread_mutex_t* mutex) -{ -#if defined(PTHREAD_MUTEX_AS_WIN32_MUTEX) - return (CloseHandle(*mutex) ? 0 : GetLastError()); -#elif defined(_WIN32) /* Win32 Critical Section */ - DeleteCriticalSection(mutex); - return 0; /* No error */ -#elif defined(__OS2__) - return DosCloseMutexSem(*mutex); -#endif -} - -#endif /* POSIX thread mutexes */ - -/************************************************************************/ -/* Protected (thread-safe) Integers (e.g. atomic/interlocked variables) */ -/************************************************************************/ - -#if __STDC_NO_ATOMICS__ -void protected_int32_init(protected_int32_t* prot, int32_t value) -{ - prot->value = value; - pthread_mutex_init(&prot->mutex,NULL); -} - -void protected_int64_init(protected_int64_t* prot, int64_t value) -{ - prot->value = value; - pthread_mutex_init(&prot->mutex,NULL); -} - -int32_t protected_int32_adjust(protected_int32_t* i, int32_t adjustment) -{ - int32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint32_t protected_uint32_adjust(protected_uint32_t* i, int32_t adjustment) -{ - uint32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -int64_t protected_int64_adjust(protected_int64_t* i, int64_t adjustment) -{ - int64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint64_t protected_uint64_adjust(protected_uint64_t* i, int64_t adjustment) -{ - uint64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value += adjustment; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -int32_t protected_int32_set(protected_int32_t* i, int32_t val) -{ - int32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint32_t protected_uint32_set(protected_uint32_t* i, uint32_t val) -{ - uint32_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -int64_t protected_int64_set(protected_int64_t* i, int64_t val) -{ - int64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} - -uint64_t protected_uint64_set(protected_uint64_t* i, uint64_t val) -{ - uint64_t newval; - pthread_mutex_lock(&i->mutex); - newval = i->value = val; - pthread_mutex_unlock(&i->mutex); - return newval; -} -#endif diff --git a/xpdev/threadwrap.h b/xpdev/threadwrap.h deleted file mode 100644 index 29638b532ef1e093480502d9730c49fd2fe9b27d..0000000000000000000000000000000000000000 --- a/xpdev/threadwrap.h +++ /dev/null @@ -1,278 +0,0 @@ -/* Thread-related cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _THREADWRAP_H -#define _THREADWRAP_H - -#include "gen_defs.h" /* HANDLE */ -#include "wrapdll.h" /* DLLEXPORT and */ - -#if !__STDC_NO_ATOMICS__ - #if defined __GNUC__ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)) && !defined(__llvm__) && !defined(__INTEL_COMPILER) - #define __STDC_NO_ATOMICS__ 1 - #elif defined __BORLANDC__ || defined _MSC_VER - #define __STDC_NO_ATOMICS__ 1 - #endif -#endif -#if !__STDC_NO_ATOMICS__ -#include <stdbool.h> -#ifdef __cplusplus -#include <atomic> -#else -#include <stdatomic.h> -#endif -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -#if defined(__unix__) - - #include <sys/param.h> - #include <pthread.h> /* POSIX threads and mutexes */ - #include <unistd.h> /* _POSIX_THREADS definition on FreeBSD (at least) */ - - /* Win32 thread API wrappers */ - ulong _beginthread(void( *start_address )( void * ) - ,unsigned stack_size, void *arglist); - - #define GetCurrentThreadId() pthread_self() - -#elif defined(_WIN32) - - #include <process.h> /* _beginthread */ - #include <limits.h> /* INT_MAX */ - #include <errno.h> /* EAGAIN and EBUSY */ - - /* POSIX threads */ - typedef DWORD pthread_t; - #define pthread_self() GetCurrentThreadId() - #define pthread_equal(t1,t2) ((t1)==(t2)) - - /* POSIX mutexes */ - #ifdef PTHREAD_MUTEX_AS_WIN32_MUTEX /* Much slower/heavier than critical sections */ - - typedef HANDLE pthread_mutex_t; - - #else /* Implemented as Win32 Critical Sections */ - - typedef CRITICAL_SECTION pthread_mutex_t; - - #endif - -#elif defined(__OS2__) - - /* POSIX mutexes */ - typedef TID pthread_t; - typedef HEV pthread_mutex_t; - -#else - - #error "Need thread wrappers." - -#endif - -/****************************************************************************/ -/* Wrappers for POSIX thread (pthread) mutexes */ -/****************************************************************************/ - -pthread_mutex_t pthread_mutex_initializer_np(BOOL recursive); - -#if defined(_POSIX_THREADS) - -#if defined (__FreeBSD__) || defined (__OpenBSD__) - #include <pthread_np.h> - #define SetThreadName(c) pthread_set_name_np(pthread_self(),c) -#elif defined(__GLIBC__) - #include <features.h> - #if (__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12)) - #define SetThreadName(c) pthread_setname_np(pthread_self(),c) - #else - #define SetThreadName(c) - #endif -#else - #define SetThreadName(c) -#endif - -#else - -DLLEXPORT int pthread_mutex_init(pthread_mutex_t*, void* attr); -DLLEXPORT int pthread_mutex_lock(pthread_mutex_t*); -DLLEXPORT int pthread_mutex_trylock(pthread_mutex_t*); -DLLEXPORT int pthread_mutex_unlock(pthread_mutex_t*); -DLLEXPORT int pthread_mutex_destroy(pthread_mutex_t*); - -#define SetThreadName(c) - -// A structure in case we need to add an event or something... -typedef struct { - long state; -} pthread_once_t; - -#define PTHREAD_ONCE_INIT {0}; -DLLEXPORT int pthread_once(pthread_once_t *oc, void (*init)(void)); - -#endif - -#if !defined(PTHREAD_MUTEX_INITIALIZER_NP) - #define PTHREAD_MUTEX_INITIALIZER_NP pthread_mutex_initializer_np(/* recursive: */FALSE) -#endif -#if !defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) - #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP pthread_mutex_initializer_np(/* recursive: */TRUE) -#endif - -/************************************************************************/ -/* Protected (thread-safe) Integers (e.g. atomic/interlocked variables) */ -/************************************************************************/ -/* Use of these types and functions is not as fast as your compiler or */ -/* platform-specific functions (e.g. InterlockedIncrement on Windows or */ -/* atomic_add_int on FreeBSD) but they have the advantage of always */ -/* working and being thread-safe on all platforms that support pthread */ -/* mutexes. */ -/************************************************************************/ -#if !__STDC_NO_ATOMICS__ -#ifdef __cplusplus -typedef std::atomic<int32_t> protected_int32_t; -typedef std::atomic<uint32_t> protected_uint32_t; -typedef std::atomic<int64_t> protected_int64_t; -typedef std::atomic<uint64_t> protected_uint64_t; -#define protected_int32_init(pval, val) std::atomic_store<int32_t>(pval, val) -#define protected_uint32_init(pval, val) std::atomic_store<uint32_t>(pval, val) -#define protected_int64_init(pval, val) std::atomic_store<int64_t>(pval, val) -#define protected_uint64_init(pval, val) std::atomic_store<uint64_t>(pval, val) - -#define protected_int32_set(pval, val) std::atomic_store<int32_t>(pval, val) -#define protected_uint32_set(pval, val) std::atomic_store<uint32_t>(pval, val) -#define protected_int64_set(pval, val) std::atomic_store<int64_t>(pval, val) -#define protected_uint64_(pval, val) std::atomic_store<uint64_t>(pval, val) - -#define protected_int32_adjust(pval, adj) std::atomic_fetch_add<int32_t>(pval, adj) -#define protected_uint32_adjust(pval, adj) std::atomic_fetch_add<uint32_t>(pval, adj) -#define protected_int64_adjust(pval, adj) std::atomic_fetch_add<int64_t>(pval, adj) -#define protected_uint64_adjust(pval, adj) std::atomic_fetch_add<uint64_t>(pval, adj) - -#define protected_int32_adjust_fetch(pval, adj) (std::atomic_fetch_add<int32_t>(pval, adj) + adj) -#define protected_uint32_adjust_fetch(pval, adj) (std::atomic_fetch_add<uint32_t>(pval, adj) + adj) -#define protected_int64_adjust_fetch(pval, adj) (std::atomic_fetch_add<int64_t>(pval, adj) + adj) -#define protected_uint64_adjust_fetch(pval, adj) (std::atomic_fetch_add<uint64_t>(pval, adj) + adj) - -#define protected_int32_value(val) std::atomic_load<int32_t>(&val) -#define protected_uint32_value(val) std::atomic_load<uint32_t>(&val) -#define protected_int64_value(val) std::atomic_load<int64_t>(&val) -#define protected_uint64_value(val) std::atomic_load<uint64_t>(&val) -#else -typedef _Atomic(int32_t) protected_int32_t; -typedef _Atomic(uint32_t) protected_uint32_t; -typedef _Atomic(int64_t) protected_int64_t; -typedef _Atomic(uint64_t) protected_uint64_t; - -#define protected_int32_init(pval, val) atomic_init(pval, val) -#define protected_uint32_init(pval, val) atomic_init(pval, val) -#define protected_int64_init(pval, val) atomic_init(pval, val) -#define protected_uint64_init(pval, val) atomic_init(pval, val) - -#define protected_int32_set(pval, val) atomic_init(pval, val) -#define protected_uint32_set(pval, val) atomic_init(pval, val) -#define protected_int64_set(pval, val) atomic_init(pval, val) -#define protected_uint64_set(pval, val) atomic_init(pval, val) - -#define protected_int32_adjust(pval, adj) atomic_fetch_add(pval, adj) -#define protected_uint32_adjust(pval, adj) atomic_fetch_add(pval, adj) -#define protected_int64_adjust(pval, adj) atomic_fetch_add(pval, adj) -#define protected_uint64_adjust(pval, adj) atomic_fetch_add(pval, adj) - -#define protected_int32_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) -#define protected_uint32_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) -#define protected_int64_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) -#define protected_uint64_adjust_fetch(pval, adj) (atomic_fetch_add(pval, adj) + adj) - -#define protected_int32_value(val) atomic_load(&val) -#define protected_uint32_value(val) atomic_load(&val) -#define protected_int64_value(val) atomic_load(&val) -#define protected_uint64_value(val) atomic_load(&val) -#endif - -#define protected_int32_destroy(i) -#define protected_uint32_destroy(i) -#define protected_int64_destroy(i) -#define protected_uint64_destroy(i) -#else -typedef struct { - int32_t value; - pthread_mutex_t mutex; -} protected_int32_t; - -typedef struct { - uint32_t value; - pthread_mutex_t mutex; -} protected_uint32_t; - -typedef struct { - int64_t value; - pthread_mutex_t mutex; -} protected_int64_t; - -typedef struct { - uint64_t value; - pthread_mutex_t mutex; -} protected_uint64_t; - -#define protected_uint32_init(i, val) protected_int32_init((protected_int32_t*)i, val) -#define protected_uint64_init(i, val) protected_int64_init((protected_int64_t*)i, val) -/* Return 0 on success, non-zero on failure (see pthread_mutex_destroy): */ -#define protected_int32_destroy(i) pthread_mutex_destroy(&(i).mutex) -#define protected_uint32_destroy protected_int32_destroy -#define protected_int64_destroy protected_int32_destroy -#define protected_uint64_destroy protected_int32_destroy -#define protected_int32_value(i) protected_int32_adjust(&(i),0) -#define protected_uint32_value(i) protected_uint32_adjust(&(i),0) -#define protected_int64_value(i) protected_int64_adjust(&(i),0) -#define protected_uint64_value(i) protected_uint64_adjust(&(i),0) - -#define protected_int32_adjust_fetch(a, b) protected_int32_adjust(a, b) -#define protected_uint32_adjust_fetch(a, b) protected_uint32_adjust(a, b) -#define protected_int64_adjust_fetch(a, b) protected_int64_adjust(a, b) -#define protected_uint64_adjust_fetch(a, b) protected_uint64_adjust(a, b) - -/* Return 0 on success, non-zero on failure (see pthread_mutex_init): */ -DLLEXPORT void protected_int32_init(protected_int32_t*, int32_t value); -DLLEXPORT void protected_int64_init(protected_int64_t*, int64_t value); - -/* Return new value: */ -DLLEXPORT int32_t protected_int32_adjust(protected_int32_t*, int32_t adjustment); -DLLEXPORT int32_t protected_int32_set(protected_int32_t*, int32_t val); -DLLEXPORT uint32_t protected_uint32_adjust(protected_uint32_t*, int32_t adjustment); -DLLEXPORT uint32_t protected_uint32_set(protected_uint32_t*, uint32_t val); -DLLEXPORT int64_t protected_int64_adjust(protected_int64_t*, int64_t adjustment); -DLLEXPORT int64_t protected_int64_set(protected_int64_t*, int64_t val); -DLLEXPORT uint64_t protected_uint64_adjust(protected_uint64_t*, int64_t adjustment); -DLLEXPORT uint64_t protected_uint64_set(protected_uint64_t*, uint64_t adjustment); - -#endif - -#if defined(__cplusplus) -} -#endif - -#include "semwrap.h" - -#endif /* Don't add anything after this line */ diff --git a/xpdev/tutorial.doc b/xpdev/tutorial.doc deleted file mode 100644 index 4f13c2ba0b02db75f708b131a98fe53d7a6c0118..0000000000000000000000000000000000000000 Binary files a/xpdev/tutorial.doc and /dev/null differ diff --git a/xpdev/tutorial.ppt b/xpdev/tutorial.ppt deleted file mode 100644 index 58ce1a865f9ec7e520ab7f3b0b2238bbfdcb7af6..0000000000000000000000000000000000000000 Binary files a/xpdev/tutorial.ppt and /dev/null differ diff --git a/xpdev/unicode.c b/xpdev/unicode.c deleted file mode 100644 index 96a333764decdf64aa4edd8394233d8ca1c68036..0000000000000000000000000000000000000000 --- a/xpdev/unicode.c +++ /dev/null @@ -1,744 +0,0 @@ -/* Synchronet Unicode encode/decode/translate functions */ - -/* $Id: unicode.c,v 1.15 2019/08/30 11:04:53 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "unicode.h" -#include "cp437defs.h" -#include "unicode_defs.h" - -// Want UNICDE encodings of terminal control characters? -#if defined USE_UNICODE_FOR_TERM_CTRL_CHARS -# define UNICODE_TERM_CTRL_CHAR_CODE(x) x -#else -# define UNICODE_TERM_CTRL_CHAR_CODE(x) 0 -#endif - -// CP437 character to/from UNICODE code point conversion -// The CP437 character value is the index into the table. -// If the value at that index is 0, no translation is needed (1:1 mapping). -enum unicode_codepoint cp437_unicode_tbl[] = -{ - /* 0x00 */ UNICODE_UNDEFINED, - /* 0x01 */ UNICODE_WHITE_SMILING_FACE, - /* 0x02 */ UNICODE_BLACK_SMILING_FACE, - /* 0x03 */ UNICODE_BLACK_HEART_SUIT, - /* 0x04 */ UNICODE_BLACK_DIAMOND_SUIT, - /* 0x05 */ UNICODE_BLACK_CLUB_SUIT, - /* 0x06 */ UNICODE_BLACK_SPADE_SUIT, - /* 0x07 '\a' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_BULLET), - /* 0x08 '\b' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_INVERSE_BULLET), - /* 0x09 '\t' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_WHITE_CIRCLE), - /* 0x0A '\n' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_INVERSE_WHITE_CIRCLE), - /* 0x0B */ UNICODE_MALE_SIGN, - /* 0x0C '\f' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_FEMALE_SIGN), - /* 0x0D '\r' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_EIGHTH_NOTE), - /* 0x0E */ UNICODE_BEAMED_EIGHTH_NOTES, - /* 0x0F */ UNICODE_WHITE_SUN_WITH_RAYS, - /* 0x10 */ UNICODE_BLACK_RIGHT_POINTING_POINTER, - /* 0x11 */ UNICODE_BLACK_LEFT_POINTING_POINTER, - /* 0x12 */ UNICODE_UP_DOWN_ARROW, - /* 0x13 */ UNICODE_DOUBLE_EXCLAMATION_MARK, - /* 0x14 */ UNICODE_PILCROW_SIGN, - /* 0x15 */ UNICODE_SECTION_SIGN, - /* 0x16 */ UNICODE_BLACK_RECTANGLE, - /* 0x17 */ UNICODE_UP_DOWN_ARROW_WITH_BASE, - /* 0x18 */ UNICODE_UPWARDS_ARROW, - /* 0x19 */ UNICODE_DOWNWARDS_ARROW, - /* 0x1A */ UNICODE_RIGHTWARDS_ARROW, - /* 0x1B '\e' */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_LEFTWARDS_ARROW), - /* 0x1C */ UNICODE_RIGHT_ANGLE, - /* 0x1D */ UNICODE_LEFT_RIGHT_ARROW, - /* 0x1E */ UNICODE_BLACK_UP_POINTING_TRIANGLE, - /* 0x1F */ UNICODE_BLACK_DOWN_POINTING_TRIANGLE, - /* 0x20-0x7E (1:1 with US-ASCII and CP437) */ - 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, - 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, - 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, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - /* 0x7F (DEL) */ UNICODE_TERM_CTRL_CHAR_CODE(UNICODE_HOUSE), - /* 0x80 */ UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA, - /* 0x81 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS, - /* 0x82 */ UNICODE_LATIN_SMALL_LETTER_E_WITH_ACUTE, - /* 0x83 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX, - /* 0x84 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS, - /* 0x85 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_GRAVE, - /* 0x86 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE, - /* 0x87 */ UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA, - /* 0x88 */ UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX, - /* 0x89 */ UNICODE_LATIN_SMALL_LETTER_E_WITH_DIAERESIS, - /* 0x8A */ UNICODE_LATIN_SMALL_LETTER_E_WITH_GRAVE, - /* 0x8B */ UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS, - /* 0x8C */ UNICODE_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX, - /* 0x8D */ UNICODE_LATIN_SMALL_LETTER_I_WITH_GRAVE, - /* 0x8E */ UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS, - /* 0x8F */ UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE, - /* 0x90 */ UNICODE_LATIN_CAPITAL_LETTER_E_WITH_ACUTE, - /* 0x91 */ UNICODE_LATIN_SMALL_LETTER_AE, - /* 0x92 */ UNICODE_LATIN_CAPITAL_LETTER_AE, - /* 0x93 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX, - /* 0x94 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS, - /* 0x95 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_GRAVE, - /* 0x96 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX, - /* 0x97 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_GRAVE, - /* 0x98 */ UNICODE_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS, - /* 0x99 */ UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS, - /* 0x9A */ UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS, - /* 0x9B */ UNICODE_CENT_SIGN, - /* 0x9C */ UNICODE_POUND_SIGN, - /* 0x9D */ UNICODE_YEN_SIGN, - /* 0x9E */ UNICODE_PESETA_SIGN, - /* 0x9F */ UNICODE_LATIN_SMALL_LETTER_F_WITH_HOOK, - /* 0xA0 */ UNICODE_LATIN_SMALL_LETTER_A_WITH_ACUTE, - /* 0xA1 */ UNICODE_LATIN_SMALL_LETTER_I_WITH_ACUTE, - /* 0xA2 */ UNICODE_LATIN_SMALL_LETTER_O_WITH_ACUTE, - /* 0xA3 */ UNICODE_LATIN_SMALL_LETTER_U_WITH_ACUTE, - /* 0xA4 */ UNICODE_LATIN_SMALL_LETTER_N_WITH_TILDE, - /* 0xA5 */ UNICODE_LATIN_CAPITAL_LETTER_N_WITH_TILDE, - /* 0xA6 */ UNICODE_FEMININE_ORDINAL_INDICATOR, - /* 0xA7 */ UNICODE_MASCULINE_ORDINAL_INDICATOR, - /* 0xA8 */ UNICODE_INVERTED_QUESTION_MARK, - /* 0xA9 */ UNICODE_REVERSED_NOT_SIGN, - /* 0xAA */ UNICODE_NOT_SIGN, - /* 0xAB */ UNICODE_VULGAR_FRACTION_ONE_HALF, - /* 0xAC */ UNICODE_VULGAR_FRACTION_ONE_QUARTER, - /* 0xAD */ UNICODE_INVERTED_EXCLAMATION_MARK, - /* 0xAE */ UNICODE_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK, - /* 0xAF */ UNICODE_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK, - /* 0xB0 */ UNICODE_LIGHT_SHADE, - /* 0xB1 */ UNICODE_MEDIUM_SHADE, - /* 0xB2 */ UNICODE_DARK_SHADE, - /* 0xB3 */ UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL, - /* 0xB4 */ UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT, - /* 0xB5 */ UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE, - /* 0xB6 */ UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE, - /* 0xB7 */ 0x2556, - /* 0xB8 */ 0x2555, - /* 0xB9 */ 0x2563, - /* 0xBA */ 0x2551, - /* 0xBB */ 0x2557, - /* 0xBC */ 0x255D, - /* 0xBD */ 0x255C, - /* 0xBE */ 0x255B, - /* 0xBF */ 0x2510, - /* 0xC0 */ 0x2514, - /* 0xC1 */ 0x2534, - /* 0xC2 */ 0x252C, - /* 0xC3 */ 0x251C, - /* 0xC4 */ 0x2500, - /* 0xC5 */ 0x253C, - /* 0xC6 */ 0x255E, - /* 0xC7 */ 0x255F, - /* 0xC8 */ 0x255A, - /* 0xC9 */ 0x2554, - /* 0xCA */ 0x2569, - /* 0xCB */ 0x2566, - /* 0xCC */ 0x2560, - /* 0xCD */ 0x2550, - /* 0xCE */ 0x256C, - /* 0xCF */ 0x2567, - /* 0xD0 */ 0x2568, - /* 0xD1 */ 0x2564, - /* 0xD2 */ 0x2565, - /* 0xD3 */ 0x2559, - /* 0xD4 */ 0x2558, - /* 0xD5 */ 0x2552, - /* 0xD6 */ 0x2553, - /* 0xD7 */ 0x256B, - /* 0xD8 */ 0x256A, - /* 0xD9 */ 0x2518, - /* 0xDA */ 0x250C, - /* 0xDB */ 0x2588, - /* 0xDC */ UNICODE_LOWER_HALF_BLOCK, - /* 0xDD */ 0x258C, - /* 0xDE */ 0x2590, - /* 0xDF */ UNICODE_UPPER_HALF_BLOCK, - /* 0xE0 */ UNICODE_GREEK_SMALL_LETTER_ALPHA, - /* 0xE1 */ UNICODE_GREEK_SMALL_LETTER_BETA, // or UNICODE_LATIN_SMALL_LETTER_SHARP_S - /* 0xE2 */ UNICODE_GREEK_SMALL_LETTER_GAMMA, - /* 0xE3 */ UNICODE_GREEK_SMALL_LETTER_PI, - /* 0xE4 */ UNICODE_GREEK_CAPITAL_LETTER_SIGMA, - /* 0xE5 */ UNICODE_GREEK_SMALL_LETTER_SIGMA, - /* 0xE6 */ UNICODE_GREEK_SMALL_LETTER_MU, // or UNICODE_MICRO_SIGN - /* 0xE7 */ UNICODE_GREEK_SMALL_LETTER_TAU, - /* 0xE8 */ UNICODE_GREEK_CAPITAL_LETTER_PHI, - /* 0xE9 */ UNICODE_GREEK_SMALL_LETTER_THETA, // or UNICODE_GREEK_CAPITAL_LETTER_THETA - /* 0xEA */ UNICODE_GREEK_CAPITAL_LETTER_OMEGA, - /* 0xEB */ UNICODE_GREEK_SMALL_LETTER_DELTA, - /* 0xEC */ UNICODE_INFINITY, - /* 0xED */ UNICODE_GREEK_SMALL_LETTER_PHI, - /* 0xEE */ UNICODE_GREEK_SMALL_LETTER_EPSILON, - /* 0xEF */ UNICODE_INTERSECTION, - /* 0xF0 */ UNICODE_IDENTICAL_TO, // A.K.A. "TRIPLE BAR" - /* 0xF1 */ UNICODE_PLUS_MINUS_SIGN, - /* 0xF2 */ UNICODE_GREATER_THAN_OR_EQUAL_TO, - /* 0xF3 */ UNICODE_LESS_THAN_OR_EQUAL_TO, - /* 0xF4 */ UNICODE_TOP_HALF_INTEGRAL, - /* 0xF5 */ UNICODE_BOTTOM_HALF_INTEGRAL, - /* 0xF6 */ UNICODE_DIVISION_SIGN, - /* 0xF7 */ UNICODE_ALMOST_EQUAL_TO, - /* 0xF8 */ UNICODE_DEGREE_SIGN, - /* 0xF9 */ UNICODE_BULLET_OPERATOR, - /* 0xFA */ UNICODE_MIDDLE_DOT, - /* 0xFB */ UNICODE_SQUARE_ROOT, // or UNICODE_CHECK_MARK - /* 0xFC */ UNICODE_SUPERSCRIPT_LATIN_SMALL_LETTER_N, - /* 0xFD */ UNICODE_SUPERSCRIPT_TWO, - /* 0xFE */ UNICODE_HALFWIDTH_BLACK_SQUARE, // or UNICODE_BLACK_SQUARE - /* 0xFF */ UNICODE_NO_BREAK_SPACE -}; - -size_t unicode_width(enum unicode_codepoint u) -{ - switch(u) { - case UNICODE_UNDEFINED: - case UNICODE_ZERO_WIDTH_SPACE: - case UNICODE_ZERO_WIDTH_NON_JOINER: - case UNICODE_ZERO_WIDTH_JOINER: - case UNICODE_VARIATION_SELECTOR_1: - case UNICODE_VARIATION_SELECTOR_2: - case UNICODE_VARIATION_SELECTOR_3: - case UNICODE_VARIATION_SELECTOR_4: - case UNICODE_VARIATION_SELECTOR_5: - case UNICODE_VARIATION_SELECTOR_6: - case UNICODE_VARIATION_SELECTOR_7: - case UNICODE_VARIATION_SELECTOR_8: - case UNICODE_VARIATION_SELECTOR_9: - case UNICODE_VARIATION_SELECTOR_10: - case UNICODE_VARIATION_SELECTOR_11: - case UNICODE_VARIATION_SELECTOR_12: - case UNICODE_VARIATION_SELECTOR_13: - case UNICODE_VARIATION_SELECTOR_14: - case UNICODE_VARIATION_SELECTOR_15: - case UNICODE_VARIATION_SELECTOR_16: - case UNICODE_ZERO_WIDTH_NO_BREAK_SPACE: - return 0; - default: - if( (u >= UNICODE_BLOCK_CJK_RADICALS_SUPPLEMENT_BEGIN && u <= UNICIDE_BLOCK_YI_RADICALS_END) - || (u >= UNICIDE_BLOCK_HANGUL_SYLLABLES_BEGIN && u <= UNICIDE_BLOCK_HANGUL_SYLLABLES_END) - || (u >= UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_BEGIN && u <= UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_END) - || (u >= UNICODE_BLOCK_VERTICAL_FORMS_BEGIN && u <= UNICODE_BLOCK_VERTICAL_FORMS_END) - || (u >= UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_BEGIN && u <= UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_END) - || (u >= UNICODE_BLOCK_SMALL_FORM_VARIANTS_BEGIN && u <= UNICODE_BLOCK_SMALL_FORM_VARIANTS_END) - || (u >= UNICODE_SUBBLOCK_FULLWIDTH_CHARS_BEGIN && u <= UNICODE_SUBBLOCK_FULLWIDTH_CHARS_END) - || (u >= UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_BEGIN && u <= UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_END) - ) - return 2; - return 1; - } -} - -char unicode_to_latin1(enum unicode_codepoint codepoint) -{ - if (codepoint < 0 || codepoint > 255) - return UNICODE_UNDEFINED; - return codepoint; -} - -char unicode_to_cp437(enum unicode_codepoint codepoint) -{ - switch(codepoint) { - case UNICODE_ACUTE_ACCENT: return '\''; - - case UNICODE_BROKEN_BAR: return '|'; - case UNICODE_MACRON: return '~'; - - case UNICODE_CENT_SIGN: return CP437_CENT_SIGN; - case UNICODE_POUND_SIGN: return CP437_POUND_SIGN; - case UNICODE_YEN_SIGN: return CP437_YEN_SIGN; - case UNICODE_SECTION_SIGN: return CP437_SECTION_SIGN; - case UNICODE_DEGREE_CELSIUS: - case UNICODE_DEGREE_FAHRENHEIT: - case UNICODE_DEGREE_SIGN: return CP437_DEGREE_SIGN; - case UNICODE_PLUS_MINUS_SIGN: return CP437_PLUS_MINUS_SIGN; - case UNICODE_SUPERSCRIPT_TWO: return CP437_SUPERSCRIPT_TWO; - case UNICODE_PILCROW_SIGN: return CP437_PILCROW_SIGN; - case UNICODE_INVERTED_QUESTION_MARK: return CP437_INVERTED_QUESTION_MARK; - case UNICODE_INVERTED_EXCLAMATION_MARK: return CP437_INVERTED_EXCLAMATION_MARK; - case UNICODE_DOUBLE_EXCLAMATION_MARK: return CP437_DOUBLE_EXCLAMATION_MARK; - case UNICODE_LEFT_POINTING_ANGLE_BRACKET: return '<'; - case UNICODE_RIGHT_POINTING_ANGLE_BRACKET: return '>'; - case UNICODE_COUNTERSINK: return 'v'; - case UNICODE_APL_FUNCTIONAL_SYMBOL_I_BEAM: return 'I'; - - // Perform Upper -> Lower case mapping where an upper case equivalent doesn't exist in CP437: - case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_A_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_A_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX; - - case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_E_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX; - case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: return CP437_LATIN_SMALL_LETTER_E_WITH_DIAERESIS; - - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_I_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_I_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX; - case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: return CP437_LATIN_SMALL_LETTER_I_WITH_DIAERESIS; - - case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_O_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_O_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX; - - case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE: return CP437_LATIN_SMALL_LETTER_U_WITH_GRAVE; - case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE: return CP437_LATIN_SMALL_LETTER_U_WITH_ACUTE; - case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: return CP437_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX; - - case UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS: return CP437_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; - - // Greek letters - case UNICODE_GREEK_CAPITAL_LETTER_ALPHA: - case UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS: return 'A'; - case UNICODE_GREEK_CAPITAL_LETTER_BETA: return 'B'; - case UNICODE_GREEK_CAPITAL_LETTER_GAMMA: - case UNICODE_GREEK_SMALL_LETTER_GAMMA: return CP437_GREEK_CAPITAL_LETTER_GAMMA; - case UNICODE_GREEK_CAPITAL_LETTER_DELTA: - case UNICODE_GREEK_SMALL_LETTER_DELTA: return CP437_GREEK_SMALL_LETTER_DELTA; - case UNICODE_GREEK_CAPITAL_LETTER_EPSILON: - case UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS: - case UNICODE_GREEK_SMALL_LETTER_EPSILON: - case UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS: return CP437_GREEK_SMALL_LETTER_EPSILION; - case UNICODE_GREEK_CAPITAL_LETTER_ZETA: return 'Z'; - case UNICODE_GREEK_CAPITAL_LETTER_ETA: return 'H'; - case UNICODE_GREEK_CAPITAL_LETTER_THETA: - case UNICODE_GREEK_SMALL_LETTER_THETA: - case UNICODE_GREEK_THETA_SYMBOL: return CP437_GREEK_SMALL_LETTER_THETA; - case UNICODE_GREEK_CAPITAL_LETTER_IOTA: - case UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA: return 'I'; - case UNICODE_GREEK_CAPITAL_LETTER_KAPPA: return 'K'; - case UNICODE_GREEK_CAPITAL_LETTER_MU: return 'M'; - case UNICODE_GREEK_CAPITAL_LETTER_NU: return 'N'; - case UNICODE_GREEK_CAPITAL_LETTER_OMICRON: return 'O'; - case UNICODE_GREEK_CAPITAL_LETTER_PI: - case UNICODE_GREEK_SMALL_LETTER_PI: - case UNICODE_GREEK_PI_SYMBOL: return CP437_GREEK_SMALL_LETTER_PI; - case UNICODE_GREEK_CAPITAL_LETTER_RHO: return 'P'; - case UNICODE_GREEK_CAPITAL_LETTER_SIGMA: return CP437_GREEK_CAPITAL_LETTER_SIGMA; - case UNICODE_GREEK_CAPITAL_LETTER_TAU: - case UNICODE_GREEK_SMALL_LETTER_TAU: - return 'T'; - case UNICODE_GREEK_CAPITAL_LETTER_UPSILON: return 'Y'; - case UNICODE_GREEK_CAPITAL_LETTER_PHI: return CP437_GREEK_CAPITAL_LETTER_PHI; - case UNICODE_GREEK_CAPITAL_LETTER_CHI: return 'X'; - case UNICODE_GREEK_CAPITAL_LETTER_OMEGA: - case UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS: - case UNICODE_GREEK_SMALL_LETTER_OMEGA: - case UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS: return CP437_GREEK_CAPITAL_LETTER_OMEGA; - case UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA: - return CP437_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; - case UNICODE_GREEK_SMALL_LETTER_ALPHA: - case UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS: return CP437_GREEK_SMALL_LETTER_ALPHA; - case UNICODE_GREEK_SMALL_LETTER_BETA: return CP437_GREEK_SMALL_LETTER_BETA; - case UNICODE_GREEK_SMALL_LETTER_MU: return CP437_GREEK_SMALL_LETTER_MU; - case UNICODE_GREEK_SMALL_LETTER_NU: return 'v'; - case UNICODE_GREEK_SMALL_LETTER_OMICRON: return 'o'; - case UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS: return CP437_LATIN_SMALL_LETTER_O_WITH_ACUTE; - case UNICODE_GREEK_SMALL_LETTER_UPSILON: return 'u'; - case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS: return CP437_LATIN_SMALL_LETTER_U_WITH_ACUTE; - case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA: - case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS: - return CP437_LATIN_SMALL_LETTER_U_WITH_DIAERESIS; - case UNICODE_GREEK_SMALL_LETTER_IOTA: - case UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS: return 'i'; - case UNICODE_GREEK_SMALL_LETTER_KAPPA: return 'k'; - case UNICODE_GREEK_SMALL_LETTER_CHI: return 'x'; - case UNICODE_GREEK_SMALL_LETTER_SIGMA: - case UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA: return CP437_GREEK_SMALL_LETTER_SIGMA; - case UNICODE_GREEK_SMALL_LETTER_RHO: return 'p'; - case UNICODE_GREEK_SMALL_LETTER_ZETA: return 'z'; - case UNICODE_GREEK_SMALL_LETTER_ETA: return 'n'; - - case UNICODE_EM_DASH: - return '\xC4'; - - case UNICODE_BULLET: - case UNICODE_BULLET_OPERATOR: return CP437_BULLET_OPERATOR; - - case UNICODE_NO_BREAK_SPACE: - case UNICODE_EN_QUAD: - case UNICODE_EM_QUAD: - case UNICODE_EN_SPACE: - case UNICODE_EM_SPACE: return ' '; - - case UNICODE_SQUARE_ROOT: return CP437_SQUARE_ROOT; - case UNICODE_CHECK_MARK: - case UNICODE_HEAVY_CHECK_MARK: return CP437_CHECK_MARK; - - case UNICODE_MULTIPLICATION_X: - case UNICODE_HEAVY_MULTIPLICATION_X: - case UNICODE_BALLOT_X: - case UNICODE_HEAVY_BALLOT_X: return 'x'; - - case UNICODE_DIVISION_SLASH: return '/'; - case UNICODE_SET_MINUS: return '\\'; - case UNICODE_ASTERISK_OPERATOR: return '*'; - - case UNICODE_DOUBLE_VERTICAL_LINE: return CP437_BOX_DRAWINGS_DOUBLE_VERTICAL; - - case UNICODE_DOUBLE_LOW_LINE: return '='; - case UNICODE_LEFT_SINGLE_QUOTATION_MARK: - case UNICODE_RIGHT_SINGLE_QUOTATION_MARK: - case UNICODE_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: return '\''; - case UNICODE_SINGLE_LOW_9_QUOTATION_MARK: return ','; - case UNICODE_LEFT_DOUBLE_QUOTATION_MARK: - case UNICODE_RIGHT_DOUBLE_QUOTATION_MARK: - case UNICODE_DOUBLE_LOW_9_QUOTATION_MARK: - case UNICODE_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: return '"'; - case UNICODE_DAGGER: return CP437_BOX_DRAWINGS_VERTICAL_AND_HORIZONTAL; - - case UNICODE_BLACK_SQUARE: - case UNICODE_BLACK_SQUARE_CENTERED: - case UNICODE_BLACK_SQUARE_FOR_STOP: - case UNICODE_BLACK_SMALL_SQUARE: - case UNICODE_BLACK_MEDIUM_SQUARE: - case UNICODE_BLACK_LARGE_SQUARE: - case UNICODE_BLACK_MEDIUM_SMALL_SQUARE: - case UNICODE_BLACK_VERY_SMALL_SQUARE: - case UNICODE_HALFWIDTH_BLACK_SQUARE: return CP437_HALFWIDTH_BLACK_SQUARE; - - case UNICODE_HORIZONTAL_BAR: - case UNICODE_OVERLINE: - case 0x2500: // Box Drawings Light Horizontal - case 0x2501: // Box Drawings Heavy Horizontal - case 0x2504: // Box Drawings Light Triple Dash Horizontal - case 0x2505: // Box Drawings Heavy Triple Dash Horizontal - case 0x2508: // Box Drawings Light Quadruple Dash Horizontal - case 0x2509: // Box Drawings Heavy Quadruple Dash Horizontal - case 0x254C: // Box Drawings Light Double Dash Horizontal - case 0x254D: // Box Drawings Heavy Double Dash Horizontal - case 0x2574: // Box Drawings Light Left - case 0x2576: // Box Drawings Light Right - case 0x2578: // Box Drawings Heavy Left - case 0x257A: // Box Drawings Heavy Right - case 0x257C: // Box Drawings Light Left and Heavy Right - case 0x257E: // Box Drawings Heavy Left and Light Right - return '\xC4'; - - case 0x2502: // Box Drawings Light Vertical - case 0x2503: // Box Drawings Heavy Vertical - case 0x2506: // Box Drawings Light Triple Dash Vertical - case 0x2507: // Box Drawings Heavy Triple Dash Vertical - case 0x250A: // Box Drawings Light Quadruple Dash Vertical - case 0x250B: // Box Drawings Heavy Quadruple Dash Vertical - return '\xB3'; - - case 0x250C: // BOX DRAWINGS LIGHT DOWN AND RIGHT - case 0x250D: - case 0x250E: - case 0x250F: // BOX DRAWINGS HEAVY DOWN AND RIGHT - return '\xDA'; - - case 0x2510: // BOX DRAWINGS LIGHT DOWN AND LEFT - case 0x2511: - case 0x2512: - case 0x2513: // BOX DRAWINGS HEAVY DOWN AND LEFT - return '\xBF'; - - case 0x2514: // BOX DRAWINGS LIGHT UP AND RIGHT - case 0x2515: - case 0x2516: - case 0x2517: // BOX DRAWINGS HEAVY UP AND RIGHT - return '\xC0'; - - case 0x2518: // BOX DRAWINGS LIGHT UP AND LEFT - case 0x2519: - case 0x251A: - case 0x251B: // BOX DRAWINGS HEAVY UP AND LEFT - return '\xD9'; - - case 0x251C: // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - case 0x251D: - case 0x251E: - case 0x251F: - case 0x2520: - case 0x2521: - case 0x2522: - case 0x2523: // BOX DRAWINGS HEAVY VERTICAL AND RIGHT - return '\xC3'; - - case 0x2524: // BOX DRAWINGS LIGHT VERTICAL AND LEFT - case 0x2525: - case 0x2526: - case 0x2527: - case 0x2528: - case 0x2529: - case 0x252A: - case 0x252B: - return '\xB4'; - - case 0x252C: // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - case 0x252D: - case 0x252E: - case 0x252F: - case 0x2530: - case 0x2531: - case 0x2532: // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY - case 0x2533: // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL - return '\xC2'; - - case 0x2534: // BOX DRAWINGS LIGHT UP AND HORIZONTAL - case 0x2535: // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT - case 0x2536: // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT - case 0x2537: // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY - case 0x2538: // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT - case 0x2539: // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY - case 0x253A: // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY - case 0x253B: // BOX DRAWINGS HEAVY UP AND HORIZONTAL - return '\xC1'; - - case 0x253C: // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - case 0x253D: // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT - case 0x253E: // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT - case 0x253F: // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY - case 0x2540: // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT - case 0x2541: // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT - case 0x2542: // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT - case 0x2543: // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT - case 0x2544: // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT - case 0x2545: // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT - case 0x2546: // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT - case 0x2547: // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY - case 0x2548: // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY - case 0x2549: // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY - case 0x254A: // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY - case 0x254B: // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL - return '\xC5'; - - case 0x254E: // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL - case 0x254F: // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL - return '|'; - - case 0x256D: // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT - return '\xDA'; - - case 0x256E: // BOX DRAWINGS LIGHT ARC DOWN AND LEFT - return '\xBF'; - - case 0x256F: // BOX DRAWINGS LIGHT ARC UP AND LEFT - return '\xD9'; - - case 0x2570: // BOX DRAWINGS LIGHT ARC UP AND RIGHT - return '\xC0'; - - case 0x2571: // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - return '/'; - - case 0x2572: // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - return '\\'; - - case 0x2573: // BOX DRAWINGS LIGHT DIAGONAL CROSS - return 'X'; - - case 0x2575: // Box Drawings Light Up - case 0x2577: // Box Drawings Light Down - case 0x2579: // Box Drawings Heavy Up - case 0x257B: // Box Drawings Heavy Down - case 0x257D: // Box Drawings Light Up and Heavy Down - case 0x257F: // Box Drawings Heavy Up and Light Down - return '\xB3'; - - case UNICODE_FULL_BLOCK: - return CP437_FULL_BLOCK; - case UNICODE_LOWER_HALF_BLOCK: - return CP437_LOWER_HALF_BLOCK; - case UNICODE_LEFT_HALF_BLOCK: - return CP437_LEFT_HALF_BLOCK; - case UNICODE_RIGHT_HALF_BLOCK: - return CP437_RIGHT_HALF_BLOCK; - case UNICODE_UPPER_HALF_BLOCK: - return CP437_UPPER_HALF_BLOCK; - - case 0x2581: // Lower One Eighth Block - return '_'; - - case 0x2582: // Lower One Quarter Block - case 0x2583: // Lower Three Eighths Block - return '\x16'; - - case 0x2585: // Lower Five Eighths Block - case 0x2586: // Lower Three Quarters Block - case 0x2587: // Lower Seven Eighths Block - return '\xDC'; - - case 0x2589: // Left Seven Eighths Block - return '\xDB'; - - case 0x258A: // Left Three Quarters Block - case 0x258B: // Left Five Eighths Block - case 0x258D: // Left Three Eighths Block - case 0x258E: // Left One Quarter Block - case 0x258F: // Left One Eighth Block - return '\xDD'; - - case 0x2595: // Right One Eighth Block - return '\xDE'; - - case 0x2594: // Upper One Eighth Block - return '\xDF'; - - case UNICODE_KATAKANA_LETTER_TU: return CP437_BLACK_SMILING_FACE; - - case UNICODE_SMALL_COMMA: - case UNICODE_SMALL_IDEOGRAPHIC_COMMA: return ','; - case UNICODE_SMALL_FULL_STOP: return '.'; - case UNICODE_SMALL_SEMICOLON: return ';'; - case UNICODE_SMALL_COLON: return ':'; - case UNICODE_SMALL_QUESTION_MARK: return '?'; - case UNICODE_SMALL_EXCLAMATION_MARK: return '!'; - case UNICODE_SMALL_EM_DASH: return '-'; - case UNICODE_SMALL_LEFT_PARENTHESIS: return '('; - case UNICODE_SMALL_RIGHT_PARENTHESIS: return ')'; - case UNICODE_SMALL_LEFT_CURLY_BRACKET: return '{'; - case UNICODE_SMALL_RIGHT_CURLY_BRACKET: return '}'; - case UNICODE_SMALL_LEFT_TORTOISE_SHELL_BRACKET: return '['; - case UNICODE_SMALL_RIGHT_TORTOISE_SHELL_BRACKET: return ']'; - case UNICODE_SMALL_NUMBER_SIGN: return '#'; - case UNICODE_SMALL_AMPERSAND: return '&'; - case UNICODE_SMALL_ASTERISK: return '*'; - case UNICODE_SMALL_PLUS_SIGN: return '+'; - case UNICODE_SMALL_HYPHEN_MINUS: return '-'; - case UNICODE_SMALL_LESS_THAN_SIGN: return '<'; - case UNICODE_SMALL_GREATER_THAN_SIGN: return '>'; - case UNICODE_SMALL_EQUALS_SIGN: return '='; - case UNICODE_SMALL_REVERSE_SOLIDUS: return '\\'; - case UNICODE_SMALL_DOLLAR_SIGN: return '$'; - case UNICODE_SMALL_PERCENT_SIGN: return '%'; - case UNICODE_SMALL_COMMERCIAL_AT: return '@'; - - default: - { - int i; - - if(codepoint >= UNICODE_FULLWIDTH_EXCLAMATION_MARK && codepoint <= UNICODE_FULLWIDTH_TILDE) - return '!' + (codepoint - UNICODE_FULLWIDTH_EXCLAMATION_MARK); - - // Look for a 1:1 match in the CP437 -> Unicode table - for(i = 1; i < 0x100; i++) { - if(cp437_unicode_tbl[i] == codepoint) - return i; - } - break; - } - } - - return UNICODE_UNDEFINED; // Not-mapped -} diff --git a/xpdev/unicode.h b/xpdev/unicode.h deleted file mode 100644 index 461a4ecee65176507a0a589a16cee1b0324d284e..0000000000000000000000000000000000000000 --- a/xpdev/unicode.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Synchronet Unicode encode/decode/translate functions */ - -/* $Id: unicode.h,v 1.3 2019/07/10 00:02:40 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef UNICODE_H_ -#define UNICODE_H_ - -#include <stdlib.h> -#include "unicode_defs.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -extern enum unicode_codepoint cp437_unicode_tbl[]; -size_t unicode_width(enum unicode_codepoint); -char unicode_to_cp437(enum unicode_codepoint); -char unicode_to_latin1(enum unicode_codepoint); - -#if defined(__cplusplus) -} -#endif - -#endif // Don't add anything after this line diff --git a/xpdev/unicode_defs.h b/xpdev/unicode_defs.h deleted file mode 100644 index 790836fc53672ea5c1a4db3b6ed324285c3fc8fc..0000000000000000000000000000000000000000 --- a/xpdev/unicode_defs.h +++ /dev/null @@ -1,750 +0,0 @@ -/* Synchronet Unicode definitions */ - -/* $Id: unicode_defs.h,v 1.10 2019/08/30 10:48:47 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef UNICODE_DEFS_H_ -#define UNICODE_DEFS_H_ - -enum unicode_codepoint { - UNICODE_UNDEFINED = 0x0000, // UNICODE_NULL() is defined - - UNICODE_NEXT_LINE = 0x0085, - UNICODE_REVERSE_LINE_FEED = 0x008D, - UNICODE_NO_BREAK_SPACE = 0x00A0, - UNICODE_INVERTED_EXCLAMATION_MARK = 0x00A1, - UNICODE_CENT_SIGN = 0x00A2, - UNICODE_POUND_SIGN = 0x00A3, - UNICODE_CURRENCY_SIGN = 0x00A4, - UNICODE_YEN_SIGN = 0x00A5, - UNICODE_BROKEN_BAR = 0x00A6, - UNICODE_SECTION_SIGN = 0x00A7, - UNICODE_COPYRIGHT_SIGN = 0x0A9, - UNICODE_FEMININE_ORDINAL_INDICATOR = 0x00AA, - UNICODE_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = 0x00AB, - UNICODE_NOT_SIGN = 0x00AC, - UNICODE_SOFT_HYPHEN = 0x00AD, - UNICODE_REGISTERED_SIGN = 0x00AE, - UNICODE_MACRON = 0x00AF, - UNICODE_DEGREE_SIGN = 0x00B0, - UNICODE_PLUS_MINUS_SIGN = 0x00B1, - UNICODE_SUPERSCRIPT_TWO = 0x00B2, - UNICODE_ACUTE_ACCENT = 0x00B4, - UNICODE_MICRO_SIGN = 0x00B5, - UNICODE_PILCROW_SIGN = 0x00B6, // Paragraph mark - UNICODE_MIDDLE_DOT = 0x00B7, - UNICODE_MASCULINE_ORDINAL_INDICATOR = 0x00BA, - UNICODE_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = 0x00BB, - UNICODE_VULGAR_FRACTION_ONE_QUARTER = 0x00BC, - UNICODE_VULGAR_FRACTION_ONE_HALF = 0x00BD, - - UNICODE_INVERTED_QUESTION_MARK = 0x00BF, - - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE = 0x00C0, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE = 0x00C1, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX = 0x00C2, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_TILDE = 0x00C3, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS = 0x00C4, - UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE = 0x00C5, - UNICODE_LATIN_CAPITAL_LETTER_AE = 0x00C6, - UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA = 0x00C7, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE = 0x00C8, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_ACUTE = 0x00C9, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX = 0x00CA, - UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS = 0x00CB, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE = 0x00CC, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE = 0x00CD, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX = 0x00CE, - UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS = 0x00CF, - UNICODE_LATIN_CAPITAL_LETTER_ETH = 0x00D0, - UNICODE_LATIN_CAPITAL_LETTER_N_WITH_TILDE = 0x00D1, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE = 0x00D2, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE = 0x00D3, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX = 0x00D4, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE = 0x00D5, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = 0x00D6, - UNICODE_MULTIPLICATION_SIGN = 0x00D7, - UNICODE_LATIN_CAPITAL_LETTER_O_WITH_STROKE = 0x00D8, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE = 0x00D9, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE = 0x00DA, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX = 0x00DB, - UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS = 0x00DC, - UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_ACUTE = 0x00DD, - UNICODE_LATIN_CAPITAL_LETTER_THORN = 0x00DE, - UNICODE_LATIN_SMALL_LETTER_SHARP_S = 0x00DF, - UNICODE_LATIN_SMALL_LETTER_A_WITH_GRAVE = 0x00E0, - UNICODE_LATIN_SMALL_LETTER_A_WITH_ACUTE = 0x00E1, - UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX = 0x00E2, - UNICODE_LATIN_SMALL_LETTER_A_WITH_TILDE = 0x00E3, - UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS = 0x00E4, - UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE = 0x00E5, - UNICODE_LATIN_SMALL_LETTER_AE = 0x00E6, - UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA = 0x00E7, - UNICODE_LATIN_SMALL_LETTER_E_WITH_GRAVE = 0x00E8, - UNICODE_LATIN_SMALL_LETTER_E_WITH_ACUTE = 0x00E9, - UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX = 0x00EA, - UNICODE_LATIN_SMALL_LETTER_E_WITH_DIAERESIS = 0x00EB, - UNICODE_LATIN_SMALL_LETTER_I_WITH_GRAVE = 0x00EC, - UNICODE_LATIN_SMALL_LETTER_I_WITH_ACUTE = 0x00ED, - UNICODE_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX = 0x00EE, - UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS = 0x00EF, - UNICODE_LATIN_SMALL_LETTER_ETH = 0x00F0, - UNICODE_LATIN_SMALL_LETTER_N_WITH_TILDE = 0x00F1, - UNICODE_LATIN_SMALL_LETTER_O_WITH_GRAVE = 0x00F2, - UNICODE_LATIN_SMALL_LETTER_O_WITH_ACUTE = 0x00F3, - UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX = 0x00F4, - UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE = 0x00F5, - UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = 0x00F6, - UNICODE_DIVISION_SIGN = 0x00F7, - UNICODE_LATIN_SMALL_LETTER_O_WITH_STROKE = 0x00F8, - UNICODE_LATIN_SMALL_LETTER_U_WITH_GRAVE = 0x00F9, - UNICODE_LATIN_SMALL_LETTER_U_WITH_ACUTE = 0x00FA, - UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX = 0x00FB, - UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS = 0x00FC, - UNICODE_LATIN_SMALL_LETTER_Y_WITH_ACUTE = 0x00FD, - UNICODE_LATIN_SMALL_LETTER_THORN = 0x00FE, - UNICODE_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = 0x00FF, - UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS = 0x0178, - UNICODE_LATIN_SMALL_LETTER_F_WITH_HOOK = 0x0192, - - UNICODE_GREEK_CAPITAL_LETTER_HETA = 0x0370, - UNICODE_GREEK_SMALL_LETTER_HETA = 0x0371, - UNICODE_GREEK_CAPITAL_LETTER_ARCHAIC_SAMPI = 0x0372, - UNICODE_GREEK_SMALL_LETTER_ARCHAIC_SAMPI = 0x0373, - UNICODE_GREEK_NUMERAL_SIGN = 0x0374, - UNICODE_GREEK_LOWER_NUMERAL_SIGN = 0x0375, - UNICODE_GREEK_CAPITAL_LETTER_PAMPHYLIAN_DIGAMMA = 0x0376, - UNICODE_GREEK_SMALL_LETTER_PAMPHYLIAN_DIGAMMA = 0x0377, - UNICODE_GREEK_YPOGEGRAMMENI = 0x037A, - UNICODE_GREEK_SMALL_REVERSED_LUNATE_SIGMA_SYMBOL = 0x037B, - UNICODE_GREEK_SMALL_DOTTED_LUNATE_SIGMA_SYMBOL = 0x037C, - UNICODE_GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL = 0x037D, - UNICODE_GREEK_QUESTION_MARK = 0x037E, - UNICODE_GREEK_CAPITAL_LETTER_YOT = 0x037F, - UNICODE_GREEK_TONOS = 0x0384, - UNICODE_GREEK_DIALYTIKA_TONOS = 0x0385, - UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS = 0x0386, - UNICODE_GREEK_ANO_TELEIA = 0x0387, - UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS = 0x0388, - UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_TONOS = 0x0389, - UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS = 0x038A, - UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS = 0x038C, - UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS = 0x038E, - UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS = 0x038F, - UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS = 0x0390, - UNICODE_GREEK_CAPITAL_LETTER_ALPHA = 0x0391, - UNICODE_GREEK_CAPITAL_LETTER_BETA = 0x0392, - UNICODE_GREEK_CAPITAL_LETTER_GAMMA = 0x0393, - UNICODE_GREEK_CAPITAL_LETTER_DELTA = 0x0394, - UNICODE_GREEK_CAPITAL_LETTER_EPSILON = 0x0395, - UNICODE_GREEK_CAPITAL_LETTER_ZETA = 0x0396, - UNICODE_GREEK_CAPITAL_LETTER_ETA = 0x397, - UNICODE_GREEK_CAPITAL_LETTER_THETA = 0x0398, - UNICODE_GREEK_CAPITAL_LETTER_IOTA = 0x0399, - UNICODE_GREEK_CAPITAL_LETTER_KAPPA = 0x039A, - UNICODE_GREEK_CAPITAL_LETTER_LAMDA = 0x039B, - UNICODE_GREEK_CAPITAL_LETTER_MU = 0x039C, - UNICODE_GREEK_CAPITAL_LETTER_NU = 0x039D, - UNICODE_GREEK_CAPITAL_LETTER_XI = 0x039E, - UNICODE_GREEK_CAPITAL_LETTER_OMICRON = 0x039F, - UNICODE_GREEK_CAPITAL_LETTER_PI = 0x03A0, - UNICODE_GREEK_CAPITAL_LETTER_RHO = 0x03A1, - UNICODE_GREEK_CAPITAL_LETTER_SIGMA = 0x03A3, - UNICODE_GREEK_CAPITAL_LETTER_TAU = 0x03A4, - UNICODE_GREEK_CAPITAL_LETTER_UPSILON = 0x03A5, - UNICODE_GREEK_CAPITAL_LETTER_PHI = 0x03A6, - UNICODE_GREEK_CAPITAL_LETTER_CHI = 0x03A7, - UNICODE_GREEK_CAPITAL_LETTER_PSI = 0x03A8, - UNICODE_GREEK_CAPITAL_LETTER_OMEGA = 0x03A9, - UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA = 0x03AA, - UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA = 0x03AB, - UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS = 0x03AC, - UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS = 0x03AD, - UNICODE_GREEK_SMALL_LETTER_ETA_WITH_TONOS = 0x03AE, - UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS = 0x03AF, - UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS = 0x03B0, - UNICODE_GREEK_SMALL_LETTER_ALPHA = 0x03B1, - UNICODE_GREEK_SMALL_LETTER_BETA = 0x03B2, - UNICODE_GREEK_SMALL_LETTER_GAMMA = 0x03B3, - UNICODE_GREEK_SMALL_LETTER_DELTA = 0x03B4, - UNICODE_GREEK_SMALL_LETTER_EPSILON = 0x03B5, - UNICODE_GREEK_SMALL_LETTER_ZETA = 0x03B6, - UNICODE_GREEK_SMALL_LETTER_ETA = 0x03B7, - UNICODE_GREEK_SMALL_LETTER_THETA = 0x03B8, - UNICODE_GREEK_SMALL_LETTER_IOTA = 0x03B9, - UNICODE_GREEK_SMALL_LETTER_KAPPA = 0x03BA, - UNICODE_GREEK_SMALL_LETTER_LAMDA = 0x03BB, - UNICODE_GREEK_SMALL_LETTER_MU = 0x03BC, - UNICODE_GREEK_SMALL_LETTER_NU = 0x03BD, - UNICODE_GREEK_SMALL_LETTER_XI = 0x03BE, - UNICODE_GREEK_SMALL_LETTER_OMICRON = 0x03BF, - UNICODE_GREEK_SMALL_LETTER_PI = 0x03C0, - UNICODE_GREEK_SMALL_LETTER_RHO = 0x03C1, - UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA = 0x03C2, - UNICODE_GREEK_SMALL_LETTER_SIGMA = 0x03C3, - UNICODE_GREEK_SMALL_LETTER_TAU = 0x03C4, - UNICODE_GREEK_SMALL_LETTER_UPSILON = 0x03C5, - UNICODE_GREEK_SMALL_LETTER_PHI = 0x03C6, - UNICODE_GREEK_SMALL_LETTER_CHI = 0x03C7, - UNICODE_GREEK_SMALL_LETTER_PSI = 0x03C8, - UNICODE_GREEK_SMALL_LETTER_OMEGA = 0x03C9, - UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA = 0x03CA, - UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA = 0x03CB, - UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS = 0x03CC, - UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS = 0x03CD, - UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS = 0x03CE, - UNICODE_GREEK_CAPITLA_KAI_SYMBOL = 0x03CF, - UNICODE_GREEK_BETA_SYMBOL = 0x03D0, - UNICODE_GREEK_THETA_SYMBOL = 0x03D1, - UNICODE_GREEK_UPSILON_WITH_HOOK_SYMBOL = 0x03D2, - UNICODE_GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL = 0x03D3, - UNICODE_GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL = 0x03D4, - UNICODE_GREEK_PHI_SYMBOL = 0x03D5, - UNICODE_GREEK_PI_SYMBOL = 0x03D6, - UNICODE_GREEK_KAI_SYMBOL = 0x03D7, - UNICODE_GREEK_LETTER_ARCHAIC_KOPPA = 0x03D8, - UNICODE_GREEK_SMALL_LETTER_ARCHAIC_KOPPA = 0x03D9, - UNICODE_GREEK_LETTER_STIGMA = 0x03DA, - UNICODE_GREEK_SMALL_LETTER_STIGMA = 0x03DB, - UNICODE_GREEK_LETTER_DIGAMMA = 0x03DC, - UNICODE_GREEK_SMALL_LETTER_DIGAMMA = 0x03DD, - UNICODE_GREEK_LETTER_KOPPA = 0x03DE, - UNICODE_GREEK_SMALL_LETTER_KOPPA = 0x03DF, - UNICODE_GREEK_LETTER_SAMPI = 0x03E0, - UNICODE_GREEK_SMALL_LETTER_SAMPI = 0x03E1, - - UNICODE_EN_QUAD = 0x2000, - UNICODE_EM_QUAD = 0x2001, - UNICODE_EN_SPACE = 0x2002, - UNICODE_EM_SPACE = 0x2003, - UNICODE_ZERO_WIDTH_SPACE = 0x200B, - UNICODE_ZERO_WIDTH_NON_JOINER = 0x200C, - UNICODE_ZERO_WIDTH_JOINER = 0x200D, - UNICODE_EM_DASH = 0x2014, - UNICODE_HORIZONTAL_BAR = 0x2015, - UNICODE_DOUBLE_VERTICAL_LINE = 0x2016, - UNICODE_DOUBLE_LOW_LINE = 0x2017, - UNICODE_LEFT_SINGLE_QUOTATION_MARK = 0x2018, - UNICODE_RIGHT_SINGLE_QUOTATION_MARK = 0x2019, - UNICODE_SINGLE_LOW_9_QUOTATION_MARK = 0x201A, - UNICODE_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK = 0x201B, - UNICODE_LEFT_DOUBLE_QUOTATION_MARK = 0x201C, - UNICODE_RIGHT_DOUBLE_QUOTATION_MARK = 0x201D, - UNICODE_DOUBLE_LOW_9_QUOTATION_MARK = 0x201E, - UNICODE_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK = 0x201F, - UNICODE_DAGGER = 0x2020, - UNICODE_DOUBLE_DAGGER = 0x2021, - UNICODE_BULLET = 0x2022, - UNICODE_HORIZONTAL_ELLIPSIS = 0x2026, - UNICODE_LINE_SEPARATOR = 0x2028, - UNICODE_DOUBLE_EXCLAMATION_MARK = 0x203c, - UNICODE_OVERLINE = 0x203E, - UNICODE_SUPERSCRIPT_LATIN_SMALL_LETTER_N = 0x207F, - UNICODE_PESETA_SIGN = 0x20A7, - - UNICODE_DEGREE_CELSIUS = 0x2103, - UNICODE_CARE_OF = 0x2105, - UNICODE_DEGREE_FAHRENHEIT = 0x2109, - UNICODE_NUMERO_SIGN = 0x2116, - UNICODE_SOUND_RECORDING_COPYRIGHT = 0x2117, - UNICODE_TRADE_MARK_SIGN = 0x2122, - UNICODE_LEFTWARDS_ARROW = 0x2190, - UNICODE_UPWARDS_ARROW = 0x2191, - UNICODE_RIGHTWARDS_ARROW = 0x2192, - UNICODE_DOWNWARDS_ARROW = 0x2193, - UNICODE_LEFT_RIGHT_ARROW = 0x2194, - UNICODE_UP_DOWN_ARROW = 0x2195, - - UNICODE_UP_DOWN_ARROW_WITH_BASE = 0x21A8, - - UNICODE_DIVISION_SLASH = 0x2215, - UNICODE_SET_MINUS = 0x2216, - UNICODE_ASTERISK_OPERATOR = 0x2217, - UNICODE_RING_OPERATOR = 0x2218, - UNICODE_BULLET_OPERATOR = 0x2219, - UNICODE_SQUARE_ROOT = 0x221A, - UNICODE_INFINITY = 0x221E, - UNICODE_RIGHT_ANGLE = 0x221F, - - UNICODE_INTERSECTION = 0x2229, - - UNICODE_ALMOST_EQUAL_TO = 0x2248, - - UNICODE_IDENTICAL_TO = 0x2261, - UNICODE_LESS_THAN_OR_EQUAL_TO = 0x2264, - UNICODE_GREATER_THAN_OR_EQUAL_TO = 0x2265, - - UNICODE_DIAMETER_SIGN = 0x2300, - UNICODE_ELECTRIC_ARROW = 0x2301, - UNICODE_HOUSE = 0x2302, - UNICODE_UP_ARROWHEAD = 0x2303, - UNICODE_DOWN_ARROWHEAD = 0x2304, - UNICODE_PROJECTIVE = 0x2305, - UNICODE_PERSPECTIVE = 0x2306, - UNICODE_WAVY_LINE = 0x2307, - UNICODE_LEFT_CEILING = 0x2308, - UNICODE_RIGHT_CEILING = 0x2309, - UNICODE_LEFT_FLOOR = 0x230A, - UNICODE_RIGHT_FLOOR = 0x230B, - UNICODE_BOTTOM_RIGHT_CROP = 0x230C, - UNICODE_BOTTOM_LEFT_CROP = 0x230D, - UNICODE_TOP_RIGHT_CROP = 0x230E, - UNICODE_TOP_LEFT_CROP = 0x230F, - UNICODE_REVERSED_NOT_SIGN = 0x2310, - UNICODE_SQUARE_LOZENGE = 0x2311, - UNICODE_ARC = 0x2312, - UNICODE_SEGMENT = 0x2313, - UNICODE_SECTOR = 0x2314, - UNICODE_TELEPHONE_RECORDER = 0x2315, - UNICODE_POSITION_INDICATOR = 0x2316, - UNICODE_VIEWDATA_SQUARE = 0x2317, - UNICODE_PLACE_OF_INTEREST_SIGN = 0x2318, - UNICODE_TURNED_NOT_SIGN = 0x2319, - UNICODE_WATCH = 0x231A, - UNICODE_HOURGLASS = 0x231B, - UNICODE_TOP_LEFT_CORNER = 0x231C, - UNICODE_TOP_RIGHT_CORNER = 0x231D, - UNICODE_BOTTOM_LEFT_CORNER = 0x231E, - UNICODE_BOTTOM_RIGHT_CORNER = 0x231F, - UNICODE_TOP_HALF_INTEGRAL = 0x2320, - UNICODE_BOTTOM_HALF_INTEGRAL = 0x2321, - UNICODE_FROWN = 0x2322, - UNICODE_SMILE = 0x2323, - UNICODE_UP_ARROWHEAD_BETWEEN_TWO_HORIZONTAL_BARS = 0x2324, - UNICODE_OPTION_KEY = 0x2325, - UNICODE_ERASE_TO_THE_RIGHT = 0x2326, - UNICODE_X_IN_A_RECTANGLE_BOX = 0x2327, - UNICODE_KEYBOARD = 0x2328, - UNICODE_LEFT_POINTING_ANGLE_BRACKET = 0x2329, - UNICODE_RIGHT_POINTING_ANGLE_BRACKET = 0x232A, - UNICODE_ERASE_TO_THE_LEFT = 0x232B, - UNICODE_BENZENE_RING = 0x232C, - UNICODE_CYLINDRICITY = 0x232D, - UNICODE_ALL_AROUND_PROFILE = 0x232E, - UNICODE_SYMMETRY = 0x232F, - UNICODE_TOTAL_RUNOUT = 0x2330, - UNICODE_DIMENSION_ORIGIN = 0x2331, - UNICODE_CONICAL_TAPER = 0x2332, - UNICODE_SLOPE = 0x2333, - UNICODE_COUNTERBORE = 0x2334, - UNICODE_COUNTERSINK = 0x2335, - UNICODE_APL_FUNCTIONAL_SYMBOL_I_BEAM = 0x2336, - - UNICODE_ALARM_CLOCK = 0x23F0, - - UNICODE_HOURGLASS_WITH_FLOWING_SAND = 0x23F3, - UNICODE_BLACK_MEDIUM_LEFT_POINTING_TRIANGLE = 0x23F4, - UNICODE_BLACK_MEDIUM_RIGHT_POINTING_TRIANGLE = 0x23F5, - UNICODE_BLACK_MEDIUM_UP_POINTING_TRIANGLE = 0x23F6, - UNICODE_BLACK_MEDIUM_DOWN_POINTING_TRIANGLE = 0x23F7, - UNICODE_DOUBLE_VERTICAL_BAR = 0x23F8, - UNICODE_BLACK_SQUARE_FOR_STOP = 0x23F9, - UNICODE_BLACK_CIRCLE_FOR_RECORD = 0x23FA, - - UNICODE_SYMBOL_FOR_NULL = 0x2400, - UNICODE_SYMBOL_FOR_START_OF_HEADING = 0x2401, - UNICODE_SYMBOL_FOR_START_OF_TEXT = 0x2402, - UNICODE_SYMBOL_FOR_END_OF_TEXT = 0x2403, - UNICODE_SYMBOL_FOR_END_OF_TRANSMISSION = 0x2404, - UNICODE_SYMBOL_FOR_ENQUIRY = 0x2405, - UNICODE_SYMBOL_FOR_ACKNOWLEDGE = 0x2406, - UNICODE_SYMBOL_FOR_BELL = 0x2407, - UNICODE_SYMBOL_FOR_BACKSPACE = 0x2408, - UNICODE_SYMBOL_FOR_HORIZONTAL_TABULATION = 0x2409, - UNICODE_SYMBOL_FOR_LINE_FEED = 0x240A, - UNICODE_SYMBOL_FOR_VERTICAL_TABULATION = 0x240B, - UNICODE_SYMBOL_FOR_FORM_FEED = 0x240C, - UNICODE_SYMBOL_FOR_CARRIAGE_RETURN = 0x240D, - UNICODE_SYMBOL_FOR_SHIFT_OUT = 0x240E, - UNICODE_SYMBOL_FOR_SHIFT_IN = 0x240F, - UNICODE_SYMBOL_FOR_DATA_LINK_ESCAPE = 0x2410, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_ONE = 0x2411, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_TWO = 0x2412, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_THREE = 0x2413, - UNICODE_SYMBOL_FOR_DEVICE_CONTROL_FOUR = 0x2414, - UNICODE_SYMBOL_FOR_NEGATIVE_ACKNOWLEDGE = 0x2415, - UNICODE_SYMBOL_FOR_SYNCHRONOUS_IDLE = 0x2416, - UNICODE_SYMBOL_FOR_END_OF_TRANSMISSION_BLOCK = 0x2417, - UNICODE_SYMBOL_FOR_CANCEL = 0x2418, - UNICODE_SYMBOL_FOR_END_OF_MEDIUM = 0x2419, - UNICODE_SYMBOL_FOR_SUBSTITUTE = 0x241A, - UNICODE_SYMBOL_FOR_ESCAPE = 0x241B, - UNICODE_SYMBOL_FOR_FILE_SEPARATOR = 0x241C, - UNICODE_SYMBOL_FOR_GROUP_SEPARATOR = 0x241D, - UNICODE_SYMBOL_FOR_RECORD_SEPARATOR = 0x241E, - UNICODE_SYMBOL_FOR_UNIT_SEPARATOR = 0x241F, - UNICODE_SYMBOL_FOR_SPACE = 0x2420, - UNICODE_SYMBOL_FOR_DELETE = 0x2421, - UNICODE_BLANK_SYMBOL = 0x2422, - UNICODE_OPEN_BOX = 0x2423, - UNICODE_SYMBOL_FOR_NEWLINE = 0x2424, - UNICODE_SYMBOL_FOR_DELETE_FORM_TWO = 0x2425, - UNICODE_SYMBOL_FOR_SUBSTITUTE_FORM_TWO = 0x2426, - - UNICODE_BOX_DRAWINGS_LIGHT_HORIZONTAL = 0x2500, - UNICODE_BOX_DRAWINGS_HEAVY_HORIZONTAL = 0x2501, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL = 0x2502, - UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL = 0x2503, - UNICODE_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_HORIZONTAL = 0x2504, - UNICODE_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_HORIZONTAL = 0x2505, - UNICODE_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_VERTICAL = 0x2506, - UNICODE_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_VERTICAL = 0x2507, - UNICODE_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_HORIZONTAL = 0x2508, - UNICODE_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_HORIZONTAL = 0x2509, - UNICODE_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_VERTICAL = 0x250A, - UNICODE_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_VERTICAL = 0x250B, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT = 0x250C, - UNICODE_BOX_DRAWINGS_250D = 0x250D, - UNICODE_BOX_DRAWINGS_250E = 0x250E, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT = 0x250F, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT = 0x2510, - UNICODE_BOX_DRAWINGS_2511 = 0x2511, - UNICODE_BOX_DRAWINGS_2512 = 0x2512, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT = 0x2513, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT = 0x2514, - UNICODE_BOX_DRAWINGS_2515 = 0x2515, - UNICODE_BOX_DRAWINGS_2516 = 0x2516, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_RIGHT = 0x2517, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_LEFT = 0x2518, - UNICODE_BOX_DRAWINGS_2519 = 0x2519, - UNICODE_BOX_DRAWINGS_251A = 0x251A, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_LEFT = 0x251B, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT = 0x251C, - UNICODE_BOX_DRAWINGS_251D = 0x251D, - UNICODE_BOX_DRAWINGS_251E = 0x251E, - UNICODE_BOX_DRAWINGS_251F = 0x251F, - UNICODE_BOX_DRAWINGS_2520 = 0x2520, - UNICODE_BOX_DRAWINGS_2521 = 0x2521, - UNICODE_BOX_DRAWINGS_2522= 0x2522, - UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT = 0x2523, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT = 0x2524, - UNICODE_BOX_DRAWINGS_2525 = 0x2525, - UNICODE_BOX_DRAWINGS_2526 = 0x2526, - UNICODE_BOX_DRAWINGS_2527 = 0x2527, - UNICODE_BOX_DRAWINGS_2528 = 0x2528, - UNICODE_BOX_DRAWINGS_2529 = 0x2529, - UNICODE_BOX_DRAWINGS_252A = 0x252A, - UNICODE_BOX_DRAWINGS_252B = 0x252B, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL = 0x252C, - UNICODE_BOX_DRAWINGS_252D = 0x252D, - UNICODE_BOX_DRAWINGS_252E = 0x252E, - UNICODE_BOX_DRAWINGS_252F = 0x252F, - UNICODE_BOX_DRAWINGS_2530 = 0x2530, - UNICODE_BOX_DRAWINGS_2531 = 0x2531, - UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_DOWN_HEAVY = 0x2532, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL = 0x2533, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL = 0x2534, - UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_UP_LIGHT = 0x2535, - UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_UP_LIGHT = 0x2536, - UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_HORIZONTAL_HEAVY = 0x2537, - UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_HORIZONTAL_LIGHT = 0x2538, - UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_UP_HEAVY = 0x2539, - UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_UP_HEAVY = 0x253A, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL = 0x253B, - UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL = 0x253C, - UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_VERTICAL_LIGHT = 0x253D, - UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_VERTICAL_LIGHT = 0x253E, - UNICODE_BOX_DRAWINGS_VERTICAL_LIGHT_AND_HORIZONTAL_HEAVY = 0x253F, - UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_DOWN_HORIZONTAL_LIGHT = 0x2540, - UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_UP_HORIZONTAL_LIGHT = 0x2541, - UNICODE_BOX_DRAWINGS_VERTICAL_HEAVY_AND_HORIZONTAL_LIGHT = 0x2542, - UNICODE_BOX_DRAWINGS_LEFT_UP_HEAVY_AND_RIGHT_DOWN_LIGHT = 0x2543, - UNICODE_BOX_DRAWINGS_RIGHT_UP_HEAVY_AND_LEFT_DOWN_LIGHT = 0x2544, - UNICODE_BOX_DRAWINGS_LEFT_DOWN_HEAVY_AND_RIGHT_UP_LIGHT = 0x2545, - UNICODE_BOX_DRAWINGS_RIGHT_DOWN_HEAVY_AND_LEFT_UP_LIGHT = 0x2546, - UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_UP_HORIZONTAL_HEAVY = 0x2547, - UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_DOWN_HORIZONTAL_HEAVY = 0x2548, - UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_VERTICAL_HEAVY = 0x2549, - UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_VERTICAL_HEAVY = 0x254A, - UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL = 0x254B, - UNICODE_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_HORIZONTAL = 0x254C, - UNICODE_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_HORIZONTAL = 0x254D, - UNICODE_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_VERTICAL = 0x254E, - UNICODE_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_VERTICAL = 0x254F, - UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE = 0x2561, - UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE = 0x2562, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_RIGHT = 0x256D, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_LEFT = 0x256E, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_UP_AND_LEFT = 0x256F, - UNICODE_BOX_DRAWINGS_LIGHT_ARC_UP_AND_RIGHT = 0x2570, - UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_RIGHT_TO_LOWER_LEFT = 0x2571, - UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_LEFT_TO_LOWER_RIGHT = 0x2572, - UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_CROSS = 0x2573, - UNICODE_BOX_DRAWINGS_LIGHT_LEFT = 0x2574, - UNICODE_BOX_DRAWINGS_LIGHT_UP = 0x2575, - UNICODE_BOX_DRAWINGS_LIGHT_RIGHT = 0x2576, - UNICODE_BOX_DRAWINGS_LIGHT_DOWN = 0x2577, - UNICODE_BOX_DRAWINGS_HEAVY_LEFT = 0x2578, - UNICODE_BOX_DRAWINGS_HEAVY_UP = 0x2579, - UNICODE_BOX_DRAWINGS_HEAVY_RIGHT = 0x257A, - UNICODE_BOX_DRAWINGS_HEAVY_DOWN = 0x257B, - UNICODE_BOX_DRAWINGS_LIGHT_LEFT_AND_HEAVY_RIGHT = 0x257C, - UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_HEAVY_DOWN = 0x257D, - UNICODE_BOX_DRAWINGS_HEAVY_LEFT_AND_LIGHT_RIGHT = 0x257E, - UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_LIGHT_DOWN = 0x257F, - - UNICODE_UPPER_HALF_BLOCK = 0x2580, - UNICODE_LOWER_ONE_EIGHTH_BLOCK = 0x2581, - UNICODE_LOWER_ONE_QUARTER_BLOCK = 0x2582, - UNICODE_LOWER_THREE_EIGHTHS_BLOCK = 0x2583, - UNICODE_LOWER_HALF_BLOCK = 0x2584, - UNICODE_LOWER_FIVE_EIGHTHS_BLOCK = 0x2585, - UNICODE_LOWER_THREE_QUARTERS_BLOCK = 0x2586, - UNICODE_LOWER_SEVEN_EIGHTHS_BLOCK = 0x2587, - UNICODE_FULL_BLOCK = 0x2588, - UNICODE_LEFT_SEVEN_EIGHTHS_BLOCK = 0x2589, - UNICODE_LEFT_THREE_QUARTERS_BLOCK = 0x258A, - UNICODE_LEFT_FIVE_EIGHTHS_BLOCK = 0x258B, - UNICODE_LEFT_HALF_BLOCK = 0x258C, - UNICODE_LEFT_THREE_EIGHTHS_BLOCK = 0x258D, - UNICODE_LEFT_ONE_QUARTER_BLOCK = 0x258E, - UNICODE_LEFT_ONE_EIGHTH_BLOCK = 0x258F, - UNICODE_RIGHT_HALF_BLOCK = 0x2590, - UNICODE_LIGHT_SHADE = 0x2591, - UNICODE_MEDIUM_SHADE = 0x2591, - UNICODE_DARK_SHADE = 0x2592, - UNICODE_RIGHT_ONE_EIGHTH_BLOCK = 0x2595, - UNICODE_UPPER_ONE_EIGHTH_BLOCK = 0x2594, - - UNICODE_BLACK_SQUARE = 0x25A0, - UNICODE_BLACK_SMALL_SQUARE = 0x25AA, - UNICODE_BLACK_RECTANGLE = 0x25AC, - UNICODE_BLACK_UP_POINTING_TRIANGLE = 0x25B2, - UNICODE_BLACK_RIGHT_POINTING_POINTER = 0x25BA, - UNICODE_BLACK_DOWN_POINTING_TRIANGLE = 0x25BC, - UNICODE_BLACK_LEFT_POINTING_POINTER = 0x25C4, - UNICODE_WHITE_CIRCLE = 0x25CB, - UNICODE_INVERSE_BULLET = 0x25D8, - UNICODE_INVERSE_WHITE_CIRCLE = 0x25D9, - - UNICODE_BLACK_MEDIUM_SQUARE = 0x25FC, - UNICODE_WHITE_MEDIUM_SMALL_SQUARE = 0x25FD, - UNICODE_BLACK_MEDIUM_SMALL_SQUARE = 0x25FE, - UNICODE_LOWER_RIGHT_TRIANGLE = 0x25FF, - UNICODE_BLACK_SUN_WITH_RAYS = 0x2600, - UNICODE_CLOUD = 0x2601, - UNICODE_UMBRELLA = 0x2602, - UNICODE_SNOWMAN = 0x2603, - UNICODE_COMET = 0x2604, - UNICODE_BLACK_STAR = 0x2605, - UNICODE_WHITE_STAR = 0x2606, - UNICODE_LIGHTNING = 0x2607, - UNICODE_THUNDERSTORM = 0x2608, - UNICODE_SUN = 0x2609, - UNICODE_ASCENDING_NODE = 0x260A, - UNICODE_DESCENDING_NODE = 0x260B, - UNICODE_CONJUNCTION = 0x260C, - UNICODE_OPPOSITION = 0x260D, - UNICODE_BLACK_TELEPHONE = 0x260E, - UNICODE_WHITE_TELEPHONE = 0x260F, - UNICODE_BALLOT_BOX = 0x2610, - UNICODE_BALLOT_BOX_WITH_CHECK = 0x2611, - UNICODE_BALLOT_BOX_WITH_X = 0x2612, - UNICODE_SALTIRE = 0x2613, - UNICODE_UMBRELLA_WITH_RAIN_DROPS = 0x2614, - UNICODE_HOT_BEVERAGE = 0x2615, - UNICODE_WHITE_SHOGI_PIECE = 0x2616, - UNICODE_BLACK_SHOGI_PIECE = 0x2617, - UNICODE_SHAMROCK = 0x2618, - UNICODE_REVERSED_ROTATED_FLORAL_HEART_BULLET = 0x2619, - UNICODE_BLACK_LEFT_POINTING_INDEX = 0x261A, - UNICODE_BLACK_RIGHT_POINTING_INDEX = 0x261B, - UNICODE_WHITE_LEFT_POINTING_INDEX = 0x261C, - UNICODE_WHITE_UP_POINTING_INDEX = 0x261D, - UNICODE_WHITE_RIGHT_POINTING_INDEX = 0x261E, - UNICODE_WHITE_DOWN_POINTING_INDEX = 0x261F, - UNICODE_SKULL_AND_CROSSBONES = 0x2620, - UNICODE_CAUTION_SIGN = 0x2621, - UNICODE_RADIOACTIVE_SIGN = 0x2622, - UNICODE_BIOHAZARD_SIGN = 0x2623, - UNICODE_CADUCEUS = 0x2624, - UNICODE_ANKH = 0x2625, - UNICODE_ORTHODOX_CROSS = 0x2626, - UNICODE_CHI_RHO = 0x2627, - UNICODE_CROSS_OF_LORRAINE = 0x2628, - UNICODE_CROSS_OF_JERUSALEM = 0x2629, - UNICODE_STAR_AND_CRESCENT = 0x262A, - UNICODE_FARSI_SYMBOL = 0x262B, - UNICODE_ADI_SHAKTI = 0x262C, - UNICODE_HAMMER_AND_SICKLE = 0x262D, - UNICODE_PEACE_SYMBOL = 0x262E, - UNICODE_YIN_YANG = 0x262F, - UNICODE_TRIGRAM_FOR_HEAVEN = 0x2630, - UNICODE_TRIGRAM_FOR_LAKE = 0x2631, - UNICODE_TRIGRAM_FOR_FIRE = 0x2632, - UNICODE_TRIGRAM_FOR_THUNDER = 0x2633, - UNICODE_TRIGRAM_FOR_WIND = 0x2634, - UNICODE_TRIGRAM_FOR_WATER = 0x2635, - UNICODE_TRIGRAM_FOR_MOUNTAIN = 0x2636, - UNICODE_TRIGRAM_FOR_EARTH = 0x2637, - UNICODE_WHEEL_OF_DHARMA = 0x2638, - UNICODE_WHITE_FROWNING_FACE = 0x2639, - UNICODE_WHITE_SMILING_FACE = 0x263A, - UNICODE_BLACK_SMILING_FACE = 0x263B, - UNICODE_WHITE_SUN_WITH_RAYS = 0x263C, - UNICODE_FEMALE_SIGN = 0x2640, - UNICODE_EIGHTH_NOTE = 0x266A, - UNICODE_BEAMED_EIGHTH_NOTES = 0x266B, - UNICODE_MALE_SIGN = 0x2642, - UNICODE_BLACK_HEART_SUIT = 0x2665, - UNICODE_BLACK_DIAMOND_SUIT = 0x2666, - UNICODE_BLACK_CLUB_SUIT = 0x2663, - UNICODE_BLACK_SPADE_SUIT = 0x2660, - - UNICODE_CHECK_MARK = 0x2713, - UNICODE_HEAVY_CHECK_MARK = 0x2714, - - UNICODE_MULTIPLICATION_X = 0x2715, - UNICODE_HEAVY_MULTIPLICATION_X = 0x2716, - UNICODE_BALLOT_X = 0x2717, - UNICODE_HEAVY_BALLOT_X = 0x2718, - - UNICODE_BLACK_LARGE_SQUARE = 0x2B1B, - - UNICODE_BLACK_VERY_SMALL_SQUARE = 0x2B1D, - - UNICODE_BLACK_SQUARE_CENTERED = 0x2BC0, - - UNICODE_IDEOGRAPHIC_SPACE = 0x3000, // Fullwidth space - - UNICODE_KATAKANA_LETTER_TU = 0x30C4, - - UNICODE_VARIATION_SELECTOR_1 = 0xFE00, - UNICODE_VARIATION_SELECTOR_2 = 0xFE01, - UNICODE_VARIATION_SELECTOR_3 = 0xFE02, - UNICODE_VARIATION_SELECTOR_4 = 0xFE03, - UNICODE_VARIATION_SELECTOR_5 = 0xFE04, - UNICODE_VARIATION_SELECTOR_6 = 0xFE05, - UNICODE_VARIATION_SELECTOR_7 = 0xFE06, - UNICODE_VARIATION_SELECTOR_8 = 0xFE07, - UNICODE_VARIATION_SELECTOR_9 = 0xFE08, - UNICODE_VARIATION_SELECTOR_10 = 0xFE09, - UNICODE_VARIATION_SELECTOR_11 = 0xFE0A, - UNICODE_VARIATION_SELECTOR_12 = 0xFE0B, - UNICODE_VARIATION_SELECTOR_13 = 0xFE0C, - UNICODE_VARIATION_SELECTOR_14 = 0xFE0D, - UNICODE_VARIATION_SELECTOR_15 = 0xFE0E, - UNICODE_VARIATION_SELECTOR_16 = 0xFE0F, - UNICODE_ZERO_WIDTH_NO_BREAK_SPACE = 0xFEFF, - - UNICODE_SMALL_COMMA = 0xFE50, - UNICODE_SMALL_IDEOGRAPHIC_COMMA = 0xFE51, - UNICODE_SMALL_FULL_STOP = 0xFE52, - UNICODE_SMALL_SEMICOLON = 0xFE54, - UNICODE_SMALL_COLON = 0xFE55, - UNICODE_SMALL_QUESTION_MARK = 0xFE56, - UNICODE_SMALL_EXCLAMATION_MARK = 0xFE57, - UNICODE_SMALL_EM_DASH = 0xFE58, - UNICODE_SMALL_LEFT_PARENTHESIS = 0xFE59, - UNICODE_SMALL_RIGHT_PARENTHESIS = 0xFE5A, - UNICODE_SMALL_LEFT_CURLY_BRACKET = 0xFE5B, - UNICODE_SMALL_RIGHT_CURLY_BRACKET = 0xFE5C, - UNICODE_SMALL_LEFT_TORTOISE_SHELL_BRACKET = 0xFE5D, - UNICODE_SMALL_RIGHT_TORTOISE_SHELL_BRACKET = 0xFE5E, - UNICODE_SMALL_NUMBER_SIGN = 0xFE5F, - UNICODE_SMALL_AMPERSAND = 0xFE60, - UNICODE_SMALL_ASTERISK = 0xFE61, - UNICODE_SMALL_PLUS_SIGN = 0xFE62, - UNICODE_SMALL_HYPHEN_MINUS = 0xFE63, - UNICODE_SMALL_LESS_THAN_SIGN = 0xFE64, - UNICODE_SMALL_GREATER_THAN_SIGN = 0xFE65, - UNICODE_SMALL_EQUALS_SIGN = 0xFE66, - UNICODE_SMALL_REVERSE_SOLIDUS = 0xFE68, - UNICODE_SMALL_DOLLAR_SIGN = 0xFE69, - UNICODE_SMALL_PERCENT_SIGN = 0xFE6A, - UNICODE_SMALL_COMMERCIAL_AT = 0xFE6B, - - UNICODE_FULLWIDTH_EXCLAMATION_MARK = 0xFF01, - UNICODE_FULLWIDTH_TILDE = 0xFF5E, - UNICODE_FULLWIDTH_LEFT_WHITE_PARENTHESIS = 0xFF5F, - UNICODE_FULLWIDTH_RIGHT_WHITE_PARENTHESIS = 0xFF60, - - UNICODE_HALFWIDTH_BLACK_SQUARE = 0xFFED, - UNICODE_HALFWIDTH_WHITE_CIRCLE = 0xFFEE, - - UNICODE_REPLACEMENT_CHARACTER = 0xFFFD -}; - -// Blocks -#define UNICODE_BLOCK_BASIC_LATIN_BEGIN 0x0000 -#define UNICODE_BLOCK_BASIC_LATIN_END 0x007F -#define UNICODE_BLOCK_HANGUL_JAMO_BEGIN 0x1100 -#define UNICODE_BLOCK_HANGUL_JAMO_END 0x11FF -#define UNICODE_BLOCK_CJK_RADICALS_SUPPLEMENT_BEGIN 0x2E80 // Fullwidth -#define UNICODE_BLOCK_CJK_RADICALS_SUPPLEMENT_END 0x2EFF // Fullwidth -#define UNICODE_BLOCK_KANGXI_RADICALS_BEGIN 0x2F00 // Fullwidth -#define UNICODE_BLOCK_KANGXI_RADICALS_END 0x2FDF // Fullwidth -#define UNICODE_BLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS_BEGIN 0x2FF0 // Fullwidth -#define UNICODE_BLOCK_IDEOGRAPHIC_DESCRIPTION_CHARACTERS_END 0x2FFF // Fullwidth -#define UNICODE_BLOCK_CJK_SYMBOLS_AND_PUNCTUATION_BEGIN 0x3000 // Fullwidth 0x3000 - 0x3029 -#define UNICODE_BLOCK_CJK_SYMBOLS_AND_PUNCTUATION_END 0x303F // Fullwidth 0x3030 - 0x303E -#define UNICODE_BLOCK_HIRAGANA_BEGIN 0x3040 // Fullwidth 0x3040 - 0x3098 -#define UNICODE_BLOCK_HIRAGANA_END 0x309F // Fullwidth 0x309B - 0x309F -#define UNICODE_BLOCK_KATAKANA_BEGIN 0x30A0 // Fullwidth -#define UNICODE_BLOCK_KATAKANA_END 0x30FF // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_BEGIN 0x3100 // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_END 0x312F // Fullwidth -#define UNICODE_BLOCK_HANGUL_COMPATIBILITY_JAMO_BEGIN 0x3130 // Fullwidth -#define UNICODE_BLOCK_HANGUL_COMPATIBILITY_JAMO_END 0x318F // Fullwidth -#define UNICODE_BLOCK_KANBUN_BEGIN 0x3190 // Fullwidth -#define UNICODE_BLOCK_KANBUN_END 0x319F // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_EXTENDED_BEGIN 0x31A0 // Fullwidth -#define UNICODE_BLOCK_BOPOMOFO_EXTENDED_END 0x31BF // Fullwidth -#define UNICODE_BLOCK_CJK_STROKES_BEGIN 0x31C0 // Fullwidth -#define UNICODE_BLOCK_CJK_STROKES_END 0x31EF // Fullwidth -#define UNICODE_BLOCK_KATAKANA_PHONETIC_EXTENSIONS_BEGIN 0x31F0 // Fullwidth -#define UNICODE_BLOCK_KATAKANA_PHONETIC_EXTENSIONS_END 0x31FF // Fullwidth -#define UNICIDE_BLOCK_YI_RADICALS_BEGIN 0xA490 // Fullwidth -#define UNICIDE_BLOCK_YI_RADICALS_END 0xA4CF // Fullwidth -#define UNICIDE_BLOCK_HANGUL_SYLLABLES_BEGIN 0xAC00 // Fullwidth -#define UNICIDE_BLOCK_HANGUL_SYLLABLES_END 0xD7AF // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_BEGIN 0xF900 // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_END 0xFAFF // Fullwidth -#define UNICODE_BLOCK_VERTICAL_FORMS_BEGIN 0xFE10 // Fullwidth -#define UNICODE_BLOCK_VERTICAL_FORMS_END 0xFE1F // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_BEGIN 0xFE30 // Fullwidth -#define UNICODE_BLOCK_CJK_COMPATIBILITY_FORMS_END 0xFE4F // Fullwidth -#define UNICODE_BLOCK_SMALL_FORM_VARIANTS_BEGIN 0xFE50 // Fullwidth -#define UNICODE_BLOCK_SMALL_FORM_VARIANTS_END 0xFE6F -#define UNICODE_BLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS_BEGIN 0xFF00 -#define UNICODE_BLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS_END 0xFFEF - -// Sub-Blocks -#define UNICODE_SUBBLOCK_FULLWIDTH_HANGUL_BEGIN 0x1100 -#define UNICODE_SUBBLOCK_FULLWIDTH_HANGUL_END 0x115F -#define UNICODE_SUBBLOCK_FULLWIDTH_CHARS_BEGIN 0xFF01 -#define UNICODE_SUBBLOCK_FULLWIDTH_CHARS_END 0xFF60 -#define UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_BEGIN 0xFFE0 -#define UNICODE_SUBBLOCK_FULLWIDTH_SYMBOLS_END 0xFFE6 - -#endif // Don't add anything after this line diff --git a/xpdev/wrapdll.h b/xpdev/wrapdll.h deleted file mode 100644 index 74f9ecea587baa3b4b9b801d00c2ef025d92d03d..0000000000000000000000000000000000000000 --- a/xpdev/wrapdll.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Defines DLLEXPORT for cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(DLLEXPORT) - #undef DLLEXPORT -#endif - -#if defined(_WIN32) && (defined(WRAPPER_IMPORTS) || defined(WRAPPER_EXPORTS)) - #if defined(WRAPPER_IMPORTS) - #define DLLEXPORT __declspec(dllimport) - #else - #define DLLEXPORT __declspec(dllexport) - #endif -#else /* !_WIN32 || !_DLL*/ - #define DLLEXPORT -#endif - diff --git a/xpdev/wraptest.c b/xpdev/wraptest.c deleted file mode 100644 index cf92bf24d112c9e3d980f76114edba10b59e3e05..0000000000000000000000000000000000000000 --- a/xpdev/wraptest.c +++ /dev/null @@ -1,418 +0,0 @@ -/* wraptest.c */ - -/* Verification of cross-platform development wrappers */ - -/* $Id: wraptest.c,v 1.45 2019/07/24 04:15:54 rswindell Exp $ */ - -#include <time.h> /* ctime */ - -#include "genwrap.h" -#include "conwrap.h" -#include "dirwrap.h" -#include "filewrap.h" -#include "sockwrap.h" -#include "threadwrap.h" -#include "xpbeep.h" -#include "xpendian.h" - -#define LOCK_FNAME "test.fil" -#define LOCK_OFFSET 0 -#define LOCK_LEN 4 - -static void getkey(void); -static void sem_test_thread(void* arg); -static void sem_test_thread_block(void* arg); -static void sleep_test_thread(void* arg); -static void sopen_test_thread(void* arg); -static void sopen_child_thread(void* arg); -static void lock_test_thread(void* arg); - - -typedef struct { - sem_t parent_sem; - sem_t child_sem; -} thread_data_t; - -int main() -{ - char str[128]; - char compiler[128]; - char fpath[MAX_PATH+1]; - char* path = "."; - char* glob_pattern = "*wrap*"; - int i; - int ch; - uint u; - time_t t; - glob_t g; - DIR* dir; - DIRENT* dirent; - thread_data_t thread_data; - int fd; - int fd2; - int canrelock=0; - clock_t ticks; - - /* Show platform details */ - DESCRIBE_COMPILER(compiler); - printf("%-15s: %s\n","Platform",PLATFORM_DESC); - printf("%-15s: %s\n","Version",os_version(str)); - printf("%-15s: %s\n","Compiler" ,compiler); - printf("%-15s: %ld\n","Random Number",xp_random(1000)); - - for(i=0;i<3;i++) { - if(_beginthread( - sopen_child_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,(void*)i /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else - SLEEP(1); - } - printf("Waiting for all sopen_child_threads to close...\n"); - SLEEP(5000); /* wait for all threads to quit */ - - /* Exclusive sopen test */ - printf("\nsopen() test\n"); - if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYRW,S_IREAD|S_IWRITE))==-1) { - perror(LOCK_FNAME); - return(errno); - } - printf("%s is opened with an exclusive (read/write) lock\n",LOCK_FNAME); - getkey(); - if(_beginthread( - sopen_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,NULL /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else - SLEEP(1000); - close(fd); - - /* sopen()/lock test */ - printf("\nlock() test\n"); - if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE))==-1) { - perror(LOCK_FNAME); - return(errno); - } - write(fd,"lock testing\n",LOCK_LEN); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) - printf("lock() succeeds\n"); - else - printf("!FAILURE: lock() non-functional (or file already locked)\n"); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) { - printf("!FAILURE: Subsequent lock of region was allowed (will skip some tests)\n"); - canrelock=1; - } - - if(_beginthread( - lock_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,NULL /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else - SLEEP(1000); - if(canrelock) - printf("?? Skipping some tests due to inability to detect own locks\n"); - else { - if(lock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("Locks in first thread survive open()/close() in other thread\n"); - else - printf("!FAILURE: lock() in first thread lost by open()/close() in other thread\n"); - if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN)) - printf("!FAILURE: file locking\n"); - else - printf("Record locking\n"); - } - if((fd2=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))==-1) { - printf("Cannot reopen SH_DENYRW while lock is held\n"); - close(fd2); - } - else { - printf("!FAILURE: can reopen SH_DENYRW while lock is held\n"); - } - if(unlock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("!FAILURE: unlock() non-functional\n"); - if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN)) - printf("Cannot re-lock after non-overlapping unlock()\n"); - else - printf("!FAILURE: can re-lock after non-overlappping unlock()\n"); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("!FAILURE: cannot re-lock unlocked area\n"); - close(fd); - - /* getch test */ - printf("\ngetch() test (ESC to continue)\n"); - do { - ch=getch(); - printf("getch() returned %d\n",ch); - } while(ch!=ESC); - - /* kbhit test */ - printf("\nkbhit() test (any key to continue)\n"); - while(!kbhit()) { - printf("."); - fflush(stdout); - SLEEP(500); - } - getch(); /* remove character from keyboard buffer */ - - /* BEEP test */ - printf("\nBEEP() test\n"); - getkey(); - for(i=750;i>250;i-=5) - BEEP(i,15); - for(;i<1000;i+=5) - BEEP(i,15); - - /* SLEEP test */ - printf("\nSLEEP(5 second) test\n"); - getkey(); - t=time(NULL); - printf("sleeping... "); - fflush(stdout); - ticks=msclock(); - SLEEP(5000); - printf("slept %ld seconds (%ld according to msclock)\n",time(NULL)-t,(msclock()-ticks)/MSCLOCKS_PER_SEC); - - /* Thread SLEEP test */ - printf("\nThread SLEEP(5 second) test\n"); - getkey(); - i=0; - if(_beginthread( - sleep_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,&i /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else { - SLEEP(1); /* yield to child thread */ - while(i==0) { - printf("."); - fflush(stdout); - SLEEP(1000); - } - } - - /* glob test */ - printf("\nglob(%s) test\n",glob_pattern); - getkey(); - i=glob(glob_pattern,GLOB_MARK,NULL,&g); - if(i==0) { - for(u=0;u<g.gl_pathc;u++) - printf("%s\n",g.gl_pathv[u]); - globfree(&g); - } else - printf("glob(%s) returned %d\n",glob_pattern,i); - - /* opendir (and other directory functions) test */ - printf("\nopendir(%s) test\n",path); - getkey(); - printf("\nDirectory of %s\n\n",FULLPATH(fpath,path,sizeof(fpath))); - dir=opendir(path); - while(dir!=NULL && (dirent=readdir(dir))!=NULL) { - t=fdate(dirent->d_name); - printf("%.24s %10lu %06o %s%c\n" - ,ctime(&t) - ,flength(dirent->d_name) - ,getfattr(dirent->d_name) - ,dirent->d_name - ,isdir(dirent->d_name) ? '/':0 - ); - } - if(dir!=NULL) - closedir(dir); - printf("\nFree disk space: %lu kbytes\n",getfreediskspace(path,1024)); - - /* Thread (and inter-process communication) test */ - printf("\nSemaphore test\n"); - getkey(); - if(sem_init(&thread_data.parent_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - )) { - printf("sem_init failed\n"); - } - if(sem_init(&thread_data.child_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - )) { - printf("sem_init failed\n"); - } - if(_beginthread( - sem_test_thread /* entry point */ - ,0 /* stack size (0=auto) */ - ,&thread_data /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else { - sem_wait(&thread_data.child_sem); /* wait for thread to begin */ - for(i=0;i<10;i++) { - printf("<parent>"); - sem_post(&thread_data.parent_sem); - sem_wait(&thread_data.child_sem); - } - sem_wait(&thread_data.child_sem); /* wait for thread to end */ - } - sem_destroy(&thread_data.parent_sem); - sem_destroy(&thread_data.child_sem); - - printf("\nSemaphore blocking test\n"); - getkey(); - sem_init(&thread_data.parent_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - ); - sem_init(&thread_data.child_sem - ,0 /* shared between processes */ - ,0 /* initial count */ - ); - if(_beginthread( - sem_test_thread_block /* entry point */ - ,0 /* stack size (0=auto) */ - ,&thread_data /* data */ - )==(unsigned long)-1) - printf("_beginthread failed\n"); - else { - sem_wait(&thread_data.child_sem); /* wait for thread to begin */ - for(i=0;i<10;i++) { - printf("<parent>"); - SLEEP(5000); - sem_post(&thread_data.parent_sem); - sem_wait(&thread_data.child_sem); - } - sem_wait(&thread_data.child_sem); /* wait for thread to end */ - } - printf("\nsem_trywait_block test..."); - t=time(NULL); - sem_trywait_block(&thread_data.parent_sem,5000); - printf("\ntimed-out after %ld seconds (should be 5 seconds)\n",time(NULL)-t); - sem_destroy(&thread_data.parent_sem); - sem_destroy(&thread_data.child_sem); - printf("\nendian check..."); - memcpy(&i,"\x01\x02\x03\x04",4); - if(LE_LONG(i)==67305985) { - printf("OK!\n"); - } - else { - printf("FAILED!\n"); - } - return 0; -} - -static void getkey(void) -{ - printf("Hit any key to continue..."); - fflush(stdout); - getch(); - printf("\r%30s\r",""); - fflush(stdout); -} - -static void sleep_test_thread(void* arg) -{ - time_t t=time(NULL); - printf("child sleeping"); - fflush(stdout); - SLEEP(5000); - printf("\nchild awake after %ld seconds\n",time(NULL)-t); - - *(int*)arg=1; /* signal parent: we're done */ -} - -static void sem_test_thread(void* arg) -{ - ulong i; - thread_data_t* data = (thread_data_t*)arg; - - printf("sem_test_thread entry\n"); - sem_post(&data->child_sem); /* signal parent: we've started */ - - for(i=0;i<10;i++) { - sem_wait(&data->parent_sem); - printf(" <child>\n"); - sem_post(&data->child_sem); - } - - printf("sem_test_thread exit\n"); - sem_post(&data->child_sem); /* signal parent: we're done */ -} - -static void sem_test_thread_block(void* arg) -{ - ulong i; - thread_data_t* data = (thread_data_t*)arg; - - printf("sem_test_thread_block entry\n"); - sem_post(&data->child_sem); /* signal parent: we've started */ - - for(i=0;i<10;i++) { - if(sem_trywait_block(&data->parent_sem,500)) { - printf(" sem_trywait_block() timed out"); - sem_wait(&data->parent_sem); - } - else { - printf(" FAILURE: Didn't block"); - } - printf(" <child>\n"); - sem_post(&data->child_sem); - } - - printf("sem_test_thread_block exit\n"); - sem_post(&data->child_sem); /* signal parent: we're done */ -} - -static void lock_test_thread(void* arg) -{ - int fd; - - fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYNO); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) - printf("!FAILURE: Lock not effective between threads\n"); - else - printf("Locks effective between threads\n"); - close(fd); - fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYNO); - if(lock(fd,LOCK_OFFSET,LOCK_LEN)) - printf("Locks survive file open()/close() in other thread\n"); - else - printf("!FAILURE: Locks do not survive file open()/close() in other thread\n"); - close(fd); -} - -static void sopen_test_thread(void* arg) -{ - int fd; - - if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYWR))!=-1) - printf("!FAILURE: allowed to reopen with SH_DENYWR\n"); - else if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))!=-1) - printf("!FAILURE: allowed to reopen with SH_DENYRW\n"); - else - printf("reopen disallowed\n"); - - if(fd!=-1) - close(fd); -} - -static void sopen_child_thread(void* arg) -{ - int fd; - - printf("sopen_child_thread: %d begin\n",(int)arg); - if((fd=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))!=-1) { - if(arg) - printf("!FAILURE: was able to reopen in child thread\n"); - else { - SLEEP(5000); - } - close(fd); - } else if(arg==0) - perror(LOCK_FNAME); - printf("sopen_child_thread: %d end\n",(int)arg); -} - -/* End of wraptest.c */ diff --git a/xpdev/xp_dl.c b/xpdev/xp_dl.c deleted file mode 100644 index 11527c6b0e9fe3559c3a5cb2cf5acc03ad1719a6..0000000000000000000000000000000000000000 --- a/xpdev/xp_dl.c +++ /dev/null @@ -1,76 +0,0 @@ -#include <stdio.h> -#include "dirwrap.h" -#include "xp_dl.h" - -#ifndef STATIC_LINK -#if defined(__unix__) - -DLLEXPORT dll_handle xp_dlopen(const char **names, int mode, int major) -{ - const char *name; - char fname[MAX_PATH+1]; - dll_handle ret=NULL; - int i; - - for(; *names && (*names)[0]; names++) { - name=*names; - /* Try for version match */ - sprintf(fname, "lib%s.so.%d", name, major); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try for name match */ - sprintf(fname, "lib%s.so", name); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try for name match without the prefix */ - sprintf(fname, "%s.so", name); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try all previous major versions */ - for(i=major-1; i>=0; i--) { - sprintf(fname, "lib%s.so.%d", name, i); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - } - -#if defined(__APPLE__) && defined(__MACH__) - /* Try for version match */ - sprintf(fname, "lib%s.%d.dylib", name, major); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try for name match */ - sprintf(fname, "lib%s.dylib", name); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - - /* Try all previous major versions */ - for(i=major-1; i>=0; i--) { - sprintf(fname, "lib%s.%d.dylib", name, i); - if((ret=dlopen(fname, mode))!=NULL) - return(ret); - } -#endif /* OS X */ - } - - return(NULL); -} -#elif defined(_WIN32) -DLLEXPORT dll_handle xp_dlopen(const char **names, int mode, int major) -{ - char fname[MAX_PATH+1]; - dll_handle ret=NULL; - - for(; *names && (*names)[0]; names++) { - sprintf(fname, "%s.dll", *names); - if((ret=LoadLibrary(fname))!=NULL) - return(ret); - } - return(NULL); -} -#endif /* __unix__,_WIN32 */ - -#endif /* STATIC_LINK */ diff --git a/xpdev/xp_dl.h b/xpdev/xp_dl.h deleted file mode 100644 index 70779a662898d26795101ad4b2a1c85d0bf10dcc..0000000000000000000000000000000000000000 --- a/xpdev/xp_dl.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _XP_DL_H_ -#define _XP_DL_H_ - -#include "wrapdll.h" - -#ifndef STATIC_LINK -#if defined(__unix__) - #include <dlfcn.h> - - typedef void * dll_handle; - DLLEXPORT dll_handle xp_dlopen(const char **name, int mode, int major); - #define xp_dlsym(handle, name) dlsym(handle, #name) - #define xp_dlclose(handle) dlclose(handle) -#elif defined(_WIN32) - #include <windows.h> - - typedef HMODULE dll_handle; - DLLEXPORT dll_handle xp_dlopen(const char **name, int mode, int major); - #define xp_dlsym(handle, name) ((void *)GetProcAddress(handle, #name)) - #define xp_dlclose(handle) (FreeLibrary(handle)?0:-1) - - /* Unused values for *nix compatability */ - enum { - RTLD_LAZY - ,RTLD_NOW - ,RTLD_GLOBAL - ,RTLD_LOCAL - ,RTLD_TRACE - }; -#endif -#else - typedef void* dll_handle; - - #define xp_dlopen(name, mode, major) (name) - #define xp_dlsym(handle, name) (name) - #define xp_dlclose(handle) (0) -#endif - -#endif diff --git a/xpdev/xp_syslog.h b/xpdev/xp_syslog.h deleted file mode 100644 index 7d9cab5a2bee94feeb4da9e8487063519cb49e3d..0000000000000000000000000000000000000000 --- a/xpdev/xp_syslog.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef XP_SYSLOG_H_ -#define XP_SYSLOG_H_ -#include <stdarg.h> - - -/* priorities */ -#define LOG_EMERG 0 /* system is unusable */ -#define LOG_ALERT 1 /* action must be taken immediately */ -#define LOG_CRIT 2 /* critical conditions */ -#define LOG_ERR 3 /* error conditions */ -#define LOG_WARNING 4 /* warning conditions */ -#define LOG_NOTICE 5 /* normal but significant condition */ -#define LOG_INFO 6 /* informational */ -#define LOG_DEBUG 7 /* debug-level messages */ - -#define LOG_KERN (0<<3) /* kernel messages */ -#define LOG_USER (1<<3) /* random user-level messages */ -#define LOG_MAIL (2<<3) /* mail system */ -#define LOG_DAEMON (3<<3) /* system daemons */ -#define LOG_AUTH (4<<3) /* authorization messages */ -#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ -#define LOG_LPR (6<<3) /* line printer subsystem */ -#define LOG_NEWS (7<<3) /* network news subsystem */ -#define LOG_UUCP (8<<3) /* UUCP subsystem */ -#define LOG_CRON (9<<3) /* clock daemon */ -#define LOG_AUTHPRIV (10<<3) /* authorization messages (private) */ - /* Facility #10 clashes in DEC UNIX, where */ - /* it's defined as LOG_MEGASAFE for AdvFS */ - /* event logging. */ -#define LOG_FTP (11<<3) /* ftp daemon */ -#define LOG_NTP (12<<3) /* NTP subsystem */ -#define LOG_SECURITY (13<<3) /* security subsystems (firewalling, etc.) */ -#define LOG_CONSOLE (14<<3) /* /dev/console output */ - -/* facility codes */ -#define LOG_LOCAL0 (16<<3) /* reserved for local use */ -#define LOG_LOCAL1 (17<<3) /* reserved for local use */ -#define LOG_LOCAL2 (18<<3) /* reserved for local use */ -#define LOG_LOCAL3 (19<<3) /* reserved for local use */ -#define LOG_LOCAL4 (20<<3) /* reserved for local use */ -#define LOG_LOCAL5 (21<<3) /* reserved for local use */ -#define LOG_LOCAL6 (22<<3) /* reserved for local use */ -#define LOG_LOCAL7 (23<<3) /* reserved for local use */ - -/* Masks to extract parts */ -#define LOG_PRIMASK 0x07 /* mask to extract priority part */ -#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ - -/* Logopts for xp_openlog() */ -#define LOG_CONS 0x02 /* log on the console if errors in sending */ -#define LOG_PERROR 0x20 /* log to stderr as well */ - -/* Port number */ -#define SYSLOG_PORT 514 - -void xp_set_loghost(const char *hostname); -void xp_openlog(const char *ident, int logopt, int facility); -void xp_vsyslog(int priority, const char *message, va_list va); -void xp_syslog(int priority, const char *message, ...); - -#endif diff --git a/xpdev/xpbeep.c b/xpdev/xpbeep.c deleted file mode 100644 index 4e8e6ce53cf8d15e1489e3cbcf86e55a4dd40c7d..0000000000000000000000000000000000000000 --- a/xpdev/xpbeep.c +++ /dev/null @@ -1,1235 +0,0 @@ -/* $Id: xpbeep.c,v 1.113 2020/05/15 01:12:10 deuce Exp $ */ - -/* TODO: USE PORTAUDIO! */ - -/* standard headers */ -#include <math.h> -#include <stdlib.h> -#include "xp_dl.h" - -#if defined(_WIN32) - #include <windows.h> - #include <mmsystem.h> -#elif defined(__unix__) - #include <fcntl.h> - #include <sys/ioctl.h> - #if SOUNDCARD_H_IN==1 - #include <sys/soundcard.h> - #elif SOUNDCARD_H_IN==2 - #include <soundcard.h> - #elif SOUNDCARD_H_IN==3 - #include <linux/soundcard.h> - #else - #ifndef USE_ALSA_SOUND - #warning Cannot find soundcard.h - #endif - #endif - #ifdef USE_ALSA_SOUND - #include <dlfcn.h> - #include <alsa/asoundlib.h> - #endif - /* KIOCSOUND */ - #if defined(__FreeBSD__) - #include <sys/kbio.h> - #elif defined(__linux__) - #include <sys/kd.h> - #elif defined(__solaris__) - #include <sys/kbio.h> - #include <sys/kbd.h> - #endif - #if (defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H) - #include <machine/spkr.h> - #elif defined(__FreeBSD__) - #if defined(HAS_DEV_SPEAKER_SPEAKER_H) - #include <dev/speaker/speaker.h> - #elif defined(HAS_MACHINE_SPEAKER_H) - #include <machine/speaker.h> - #endif - #endif -#endif - -/* xpdev headers */ -#ifdef WITH_PORTAUDIO -#include <portaudio.h> -#endif - -#ifdef WITH_PULSEAUDIO -#include <pulse/simple.h> -#endif - -#ifdef WITH_SDL_AUDIO -#include "sdlfuncs.h" -#endif - -#include "genwrap.h" -#include "xpbeep.h" - -#define S_RATE 22050 - -#ifdef XPDEV_THREAD_SAFE -#include "threadwrap.h" - -static BOOL sample_thread_running=FALSE; -static sem_t sample_pending_sem; -static sem_t sample_complete_sem; -static pthread_mutex_t sample_mutex; -static pthread_mutex_t handle_mutex; -static const unsigned char *sample_buffer; -static int samples_posted; -static size_t sample_size; - -#endif - -static BOOL sound_device_open_failed=FALSE; -#ifdef USE_ALSA_SOUND -static BOOL alsa_device_open_failed=FALSE; -#endif -#ifdef WITH_SDL_AUDIO -static BOOL sdl_device_open_failed=FALSE; -#endif -#ifdef WITH_PORTAUDIO -static BOOL portaudio_device_open_failed=FALSE; -#endif -#ifdef WITH_PULSEAUDIO -static BOOL pulseaudio_device_open_failed=FALSE; -#endif - -enum { - SOUND_DEVICE_CLOSED - ,SOUND_DEVICE_WIN32 - ,SOUND_DEVICE_ALSA - ,SOUND_DEVICE_OSS - ,SOUND_DEVICE_SDL - ,SOUND_DEVICE_PORTAUDIO - ,SOUND_DEVICE_PULSEAUDIO -}; - -static int handle_type=SOUND_DEVICE_CLOSED; -static int handle_rc; - -#ifdef WITH_PULSEAUDIO -struct pulseaudio_api_struct { - pa_simple* (*simple_new)(const char * server, const char * name, pa_stream_direction_t dir, const char * dev, const char * stream_name, const pa_sample_spec * ss, const pa_channel_map * map, const pa_buffer_attr * attr, int * error); - int (*simple_write)(pa_simple * s, const void * data, size_t bytes, int * error); - int (*simple_drain)(pa_simple * s, int * error); - void (*simple_free)(pa_simple * s); -}; -struct pulseaudio_api_struct *pu_api = NULL; -static pa_simple *pu_handle; -static int pulseaudio_initialized=FALSE; -#endif - -#ifdef WITH_PORTAUDIO -static PaStream *portaudio_stream; -static int portaudio_buf_len=0; -static int portaudio_buf_pos=0; -static const unsigned char *pawave=NULL; -static int portaudio_initialized=FALSE; -#ifndef PaStream // Detect version... defined for 1.8 and not for 1.9 -#define PortAudioCallback void -#define PaTimestamp PaTime -#endif -struct portaudio_api_struct { - PaError (*init)( void ); - PaError (*open)( PaStream** stream, - int numInputChannels, - int numOutputChannels, - PaSampleFormat sampleFormat, - double sampleRate, - unsigned long framesPerBuffer, - unsigned long numberOfBuffers, - PortAudioCallback *callback, - void *userData ); - PaError (*close)( PaStream* ); - PaError (*start)( PaStream *stream ); - PaError (*stop)( PaStream *stream ); - PaError (*active)( PaStream *stream ); - PaError (*write)( PaStream *stream, const void *buf, unsigned long frames ); - int (*version)( void ); - int ver; -}; -struct portaudio_api_struct *pa_api=NULL; -#endif - -#ifdef WITH_SDL_AUDIO -static SDL_AudioSpec spec; -static int sdl_audio_buf_len=0; -static int sdl_audio_buf_pos=0; -static const unsigned char *swave; -static SDL_sem *sdlToneDone; -#endif - -#ifdef _WIN32 -static HWAVEOUT waveOut; -static WAVEHDR wh[2]; -static int curr_wh; -#endif - -#ifdef USE_ALSA_SOUND -static snd_pcm_t *playback_handle; -static snd_pcm_hw_params_t *hw_params=NULL; -#endif - -#ifdef AFMT_U8 -static int dsp; -#endif - -#define WAVE_PI 3.14159265358979323846 -#define WAVE_TPI 6.28318530717958647692 - -#ifdef USE_ALSA_SOUND -struct alsa_api_struct { - int (*snd_pcm_open) - (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode); - int (*snd_pcm_hw_params_malloc) - (snd_pcm_hw_params_t **ptr); - int (*snd_pcm_hw_params_any) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params); - int (*snd_pcm_hw_params_set_access) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access); - int (*snd_pcm_hw_params_set_format) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val); - int (*snd_pcm_hw_params_set_rate_near) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir); - int (*snd_pcm_hw_params_set_channels) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val); - int (*snd_pcm_hw_params) - (snd_pcm_t *pcm, snd_pcm_hw_params_t *params); - int (*snd_pcm_prepare) - (snd_pcm_t *pcm); - void (*snd_pcm_hw_params_free) - (snd_pcm_hw_params_t *obj); - int (*snd_pcm_close) - (snd_pcm_t *pcm); - snd_pcm_sframes_t (*snd_pcm_writei) - (snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size); - int (*snd_pcm_drain) - (snd_pcm_t *pcm); -}; - -struct alsa_api_struct *alsa_api=NULL; -#endif - -#ifdef XPDEV_THREAD_SAFE -static void init_sample(void); -static BOOL xp_play_sample_locked(const unsigned char *sample, size_t size, BOOL background); -#endif - -/********************************************************************************/ -/* Calculate and generate a sound wave pattern (thanks to Deuce!) */ -/********************************************************************************/ -void xptone_makewave(double freq, unsigned char *wave, int samples, enum WAVE_SHAPE shape) -{ - int i; - int midpoint; - double inc; - double pos; - BOOL endhigh; - int crossings; - int numcross=0; - - if(freq==0) { - memset(wave, 128, samples); - } - else { - midpoint=samples/2; - inc=8.0*atan(1.0); - inc *= ((double)freq / (double)S_RATE); - - for(i=0;i<samples;i++) { - pos=(inc*(double)i); - pos -= (int)(pos/WAVE_TPI)*WAVE_TPI; - switch(shape) { - case WAVE_SHAPE_SINE: - wave[i]=(sin (pos))*127+128; - break; - case WAVE_SHAPE_SINE_HARM: - wave[i]=(sin (pos))*64+128; - wave[i]=(sin ((inc*2)*(double)i))*24; - wave[i]=(sin ((inc*3)*(double)i))*16; - break; - case WAVE_SHAPE_SAWTOOTH: - wave[i]=(WAVE_TPI-pos)*40.5; - break; - case WAVE_SHAPE_SQUARE: - wave[i]=(pos<WAVE_PI)?255:0; - break; - case WAVE_SHAPE_SINE_SAW: - wave[i]=(((sin (pos))*127+128)+((WAVE_TPI-pos)*40.5))/2; - break; - case WAVE_SHAPE_SINE_SAW_CHORD: - wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; - wave[i]+=(sin ((inc/2)*(double)i))*24; - wave[i]+=(sin ((inc/3)*(double)i))*16; - break; - case WAVE_SHAPE_SINE_SAW_HARM: - wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; - wave[i]+=(sin ((inc*2)*(double)i))*24; - wave[i]+=(sin ((inc*3)*(double)i))*16; - break; - } - } - - /* Now we have a "perfect" wave... - * we must clean it up now to avoid click/pop - */ - if(wave[samples-1]>128) - endhigh=TRUE; - else - endhigh=FALSE; - /* Completely remove the last wave fragment */ - i=samples-1; - if(wave[i]!=128) { - for(;i>midpoint;i--) { - if(endhigh && wave[i]<128) - break; - if(!endhigh && wave[i]>128) - break; - wave[i]=128; - } - } - - /* Number of crossings should be on the order of 5ms worth... according to the ARRL */ - /* We're ASSuming that a full wave crosses twice */ - numcross=freq/100; - if(numcross) { - /* Ramp up and down by one third for three corssings of 128 */ - crossings=0; - for(i=0; i<(samples-1); i++) { - if(((wave[i]<128 && wave[i+1]>=128) || (wave[i]>128 && wave[i+1]<=128)) && i>2) { - crossings++; - if(crossings>=numcross) - break; - } - wave[i]=128+((wave[i]-128)/((numcross-crossings)*(numcross-crossings))); - } - crossings=0; - for(i=samples-1; i>0; i--) { - if(((wave[i]<128 && wave[i-1]>=128) || (wave[i]>128 && wave[i-1]<=128)) && i>2) { - crossings++; - if(crossings>=numcross) - break; - } - wave[i]=128+((wave[i]-128)/((numcross-crossings)*(numcross-crossings))); - } - } - } -} - -#ifdef WITH_PORTAUDIO -/* - * Used by v18 library, not v19! - */ -static int portaudio_callback(void *inputBuffer - , void *outputBuffer - , unsigned long framesPerBuffer - , const PaTimestamp outTime - , void *userData ) -{ - int copylen=framesPerBuffer; - int maxlen=portaudio_buf_len-portaudio_buf_pos; - - if(copylen>maxlen) { - copylen=maxlen; - memset(((char *)outputBuffer)+copylen, 128, framesPerBuffer-copylen); - } - if(copylen) { - memcpy(outputBuffer, (*((unsigned char **)userData))+portaudio_buf_pos, copylen); - portaudio_buf_pos+=copylen; - } - if(portaudio_buf_pos >= portaudio_buf_len) - return(1); - return(0); -} -#endif - -#ifdef WITH_SDL_AUDIO -void sdl_fillbuf(void *userdata, Uint8 *stream, int len) -{ - int copylen=len; - int maxlen=sdl_audio_buf_len-sdl_audio_buf_pos; - - /* Copy in the current buffer */ - if(copylen>maxlen) - copylen=maxlen; - /* Fill with silence */ - if(len>copylen) - memset(stream+copylen, spec.silence, len-copylen); - if(copylen) { - memcpy(stream, swave+sdl_audio_buf_pos, copylen); - sdl_audio_buf_pos+=copylen; - /* If we're done, post the semaphore */ - if(sdl_audio_buf_pos>=sdl_audio_buf_len) { - xpbeep_sdl.SemPost(sdlToneDone); - sdl_audio_buf_len=0; - sdl_audio_buf_pos=0; - free((void *)swave); - } - } -} -#endif - -#ifdef XPDEV_THREAD_SAFE -pthread_once_t sample_initialized_pto = PTHREAD_ONCE_INIT; -#endif -static BOOL -xptone_open_locked(void) -{ -#ifdef _WIN32 - WAVEFORMATEX w; -#endif - -#ifdef AFMT_U8 - int format=AFMT_U8; - int channels=1; - int rate=S_RATE; - int fragsize=0x7fff0004; -#endif - - /* Already open */ - - if(handle_type!=SOUND_DEVICE_CLOSED) { - handle_rc++; - return(TRUE); - } - -#ifdef WITH_PULSEAUDIO - if(!pulseaudio_device_open_failed) { - if(pu_api==NULL) { - dll_handle dl=NULL; - const char *libnames[]={"pulse-simple",NULL}; - if(((pu_api=(struct pulseaudio_api_struct *)malloc(sizeof(struct pulseaudio_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) - || ((pu_api->simple_new=xp_dlsym(dl,pa_simple_new))==NULL) - || ((pu_api->simple_write=xp_dlsym(dl,pa_simple_write))==NULL) - || ((pu_api->simple_drain=xp_dlsym(dl,pa_simple_drain))==NULL) - || ((pu_api->simple_free=xp_dlsym(dl,pa_simple_free))==NULL) - ) { - if(dl) - xp_dlclose(dl); - free(pu_api); - pu_api=NULL; - } - if(pu_api==NULL) { - pulseaudio_device_open_failed=TRUE; - } - } - if(pu_api != NULL) { - handle_type=SOUND_DEVICE_PULSEAUDIO; - handle_rc++; -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); - pthread_mutex_lock(&sample_mutex); - if (samples_posted == 0) - xp_play_sample_locked((unsigned char *)"\x80", 1, FALSE); - pthread_mutex_unlock(&sample_mutex); -#else - xptone(0, 1, WAVE_SHAPE_SQUARE); -#endif - if (pulseaudio_device_open_failed) { - handle_type = SOUND_DEVICE_CLOSED; - } - else { - return(TRUE); - } - } - } -#endif - -#ifdef WITH_PORTAUDIO - if(!portaudio_device_open_failed) { - if(pa_api==NULL) { - dll_handle dl=NULL; - const char *libnames[]={"portaudio",NULL}; - if(((pa_api=(struct portaudio_api_struct *)malloc(sizeof(struct portaudio_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,0))==NULL) - || ((pa_api->init=xp_dlsym(dl,Pa_Initialize))==NULL) - || ((pa_api->open=xp_dlsym(dl,Pa_OpenDefaultStream))==NULL) - || ((pa_api->close=xp_dlsym(dl,Pa_CloseStream))==NULL) - || ((pa_api->start=xp_dlsym(dl,Pa_StartStream))==NULL) - || - ( - ((pa_api->active=xp_dlsym(dl,Pa_StreamActive))==NULL) - && ((pa_api->active=xp_dlsym(dl,Pa_IsStreamActive))==NULL) - ) - || ((pa_api->stop=xp_dlsym(dl,Pa_StopStream))==NULL) - ) { - if(dl) - xp_dlclose(dl); - free(pa_api); - pa_api=NULL; - } - else { - /* Get version and other optional pointers */ - pa_api->ver=1800; - if((pa_api->version=xp_dlsym(dl, Pa_GetVersion))!=NULL) { - pa_api->ver=pa_api->version(); - if(pa_api->ver >= 1899) { - if((pa_api->write=xp_dlsym(dl, Pa_WriteStream))==NULL) { - xp_dlclose(dl); - free(pa_api); - pa_api=NULL; - } - } - } - } - if(pa_api==NULL) { - portaudio_device_open_failed=TRUE; - } - } - if(pa_api != NULL) { - if(!portaudio_initialized) { - if(pa_api->init() != paNoError) - portaudio_device_open_failed=TRUE; - else - portaudio_initialized=TRUE; - } - if(portaudio_initialized) { - if(pa_api->open(&portaudio_stream - , 0 /* No input */ - , 1 /* Mono output */ - , paUInt8 - , S_RATE - , 256 - , 0 - , pa_api->ver >= 1899 ? NULL : portaudio_callback - , &pawave) != paNoError) - portaudio_device_open_failed=TRUE; - else { - handle_type=SOUND_DEVICE_PORTAUDIO; - handle_rc++; - return(TRUE); - } - } - } - } -#endif - -#ifdef WITH_SDL_AUDIO - if(!sdl_device_open_failed) { - if(init_sdl_audio()==-1) { - sdl_device_open_failed=TRUE; - } - else { - spec.freq=22050; - spec.format=AUDIO_U8; - spec.channels=1; - spec.samples=256; /* Size of audio buffer */ - spec.size=256; - spec.callback=sdl_fillbuf; - spec.userdata=NULL; - if(xpbeep_sdl.OpenAudio(&spec, NULL)==-1) { - sdl_device_open_failed=TRUE; - } - else { - sdlToneDone=xpbeep_sdl.SDL_CreateSemaphore(0); - sdl_audio_buf_len=0; - sdl_audio_buf_pos=0; - xpbeep_sdl.PauseAudio(FALSE); - handle_type=SOUND_DEVICE_SDL; - handle_rc++; - return(TRUE); - } - } - } -#endif - -#ifdef _WIN32 - if(!sound_device_open_failed) { - w.wFormatTag = WAVE_FORMAT_PCM; - w.nChannels = 1; - w.nSamplesPerSec = S_RATE; - w.wBitsPerSample = 8; - w.nBlockAlign = (w.wBitsPerSample * w.nChannels) / 8; - w.nAvgBytesPerSec = w.nSamplesPerSec * w.nBlockAlign; - - if(!sound_device_open_failed && waveOutOpen(&waveOut, WAVE_MAPPER, &w, 0, 0, 0)!=MMSYSERR_NOERROR) - sound_device_open_failed=TRUE; - if(sound_device_open_failed) - return(FALSE); - memset(&wh, 0, sizeof(wh)); - wh[0].dwBufferLength=S_RATE*15/2+1; - wh[1].dwBufferLength=S_RATE*15/2+1; - handle_type=SOUND_DEVICE_WIN32; - if(!sound_device_open_failed) { - handle_rc++; - return(TRUE); - } - } -#endif - -#ifdef USE_ALSA_SOUND - if(!alsa_device_open_failed) { - if(alsa_api==NULL) { - dll_handle dl=NULL; - const char *libnames[]={"asound", NULL}; - if(((alsa_api=(struct alsa_api_struct *)malloc(sizeof(struct alsa_api_struct)))==NULL) - || ((dl=xp_dlopen(libnames,RTLD_LAZY,2))==NULL) - || ((alsa_api->snd_pcm_open=xp_dlsym(dl,snd_pcm_open))==NULL) - || ((alsa_api->snd_pcm_hw_params_malloc=xp_dlsym(dl,snd_pcm_hw_params_malloc))==NULL) - || ((alsa_api->snd_pcm_hw_params_any=xp_dlsym(dl,snd_pcm_hw_params_any))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_access=xp_dlsym(dl,snd_pcm_hw_params_set_access))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_format=xp_dlsym(dl,snd_pcm_hw_params_set_format))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_rate_near=xp_dlsym(dl,snd_pcm_hw_params_set_rate_near))==NULL) - || ((alsa_api->snd_pcm_hw_params_set_channels=xp_dlsym(dl,snd_pcm_hw_params_set_channels))==NULL) - || ((alsa_api->snd_pcm_hw_params=xp_dlsym(dl,snd_pcm_hw_params))==NULL) - || ((alsa_api->snd_pcm_prepare=xp_dlsym(dl,snd_pcm_prepare))==NULL) - || ((alsa_api->snd_pcm_hw_params_free=xp_dlsym(dl,snd_pcm_hw_params_free))==NULL) - || ((alsa_api->snd_pcm_close=xp_dlsym(dl,snd_pcm_close))==NULL) - || ((alsa_api->snd_pcm_writei=xp_dlsym(dl,snd_pcm_writei))==NULL) - || ((alsa_api->snd_pcm_drain=xp_dlsym(dl,snd_pcm_drain))==NULL) - ) { - if(dl) - xp_dlclose(dl); - free(alsa_api); - alsa_api=NULL; - alsa_device_open_failed=TRUE; - } - if(alsa_api==NULL) - alsa_device_open_failed=TRUE; - } - if(alsa_api!=NULL) { - unsigned int rate=S_RATE; - if((alsa_api->snd_pcm_open(&playback_handle, "default", SND_PCM_STREAM_PLAYBACK, 0)<0) - || (alsa_api->snd_pcm_hw_params_malloc(&hw_params)<0) - || (alsa_api->snd_pcm_hw_params_any(playback_handle, hw_params)<0) - || (alsa_api->snd_pcm_hw_params_set_access(playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) - || (alsa_api->snd_pcm_hw_params_set_format(playback_handle, hw_params, SND_PCM_FORMAT_U8) < 0) - || (alsa_api->snd_pcm_hw_params_set_rate_near(playback_handle, hw_params, &rate, 0) < 0) - || (alsa_api->snd_pcm_hw_params_set_channels(playback_handle, hw_params, 1) < 0) - || (alsa_api->snd_pcm_hw_params(playback_handle, hw_params) < 0) - || (alsa_api->snd_pcm_prepare(playback_handle) < 0)) { - alsa_device_open_failed=TRUE; - if(hw_params!=NULL) - alsa_api->snd_pcm_hw_params_free(hw_params); - if(playback_handle!=NULL) { - alsa_api->snd_pcm_close(playback_handle); - playback_handle=NULL; - } - } - else { - alsa_api->snd_pcm_hw_params_free(hw_params); - handle_type=SOUND_DEVICE_ALSA; - handle_rc++; - return(TRUE); - } - } - } -#endif - -#ifdef AFMT_U8 - if(!sound_device_open_failed) { - if((dsp=open("/dev/dsp",O_WRONLY,0))<0) { - sound_device_open_failed=TRUE; - } - else { - ioctl(dsp, SNDCTL_DSP_SETFRAGMENT, &fragsize); - if((ioctl(dsp, SNDCTL_DSP_SETFMT, &format)==-1) || format!=AFMT_U8) { - sound_device_open_failed=TRUE; - close(dsp); - } - else if((ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels)==-1) || channels!=1) { - sound_device_open_failed=TRUE; - close(dsp); - } - else if((ioctl(dsp, SNDCTL_DSP_SPEED, &rate)==-1) || rate!=S_RATE) { - sound_device_open_failed=TRUE; - close(dsp); - } - } - } - if(sound_device_open_failed) { - return(FALSE); - } - handle_type=SOUND_DEVICE_OSS; - if(!sound_device_open_failed) { - handle_rc++; - return(TRUE); - } -#endif - - return(FALSE); -} - -BOOL -xptone_open(void) -{ - BOOL ret; -#ifdef XPDEV_THREAD_SAFE - pthread_once(&sample_initialized_pto, init_sample); - pthread_mutex_lock(&handle_mutex); -#endif - ret = xptone_open_locked(); -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); -#endif - return ret; -} - -static void -xptone_complete_locked(void) -{ - if(handle_type==SOUND_DEVICE_CLOSED) { - return; - } - -#ifdef WITH_PULSEAUDIO - else if (handle_type == SOUND_DEVICE_PULSEAUDIO) { - int err; - if (pu_handle) - pu_api->simple_drain(pu_handle, &err); - } -#endif - -#ifdef WITH_PORTAUDIO - else if(handle_type==SOUND_DEVICE_PORTAUDIO) { - pa_api->stop(portaudio_stream); - if (pawave) { - free((void *)pawave); - pawave = NULL; - } - } -#endif - -#ifdef WITH_SDL_AUDIO - else if(handle_type==SOUND_DEVICE_SDL) { - while(xpbeep_sdl.GetAudioStatus()==SDL_AUDIO_PLAYING) - SLEEP(1); - } -#endif - -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) { - if(wh[0].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[0], sizeof(wh))==WAVERR_STILLPLAYING) - SLEEP(1); - FREE_AND_NULL(wh[0].lpData); - } - if(wh[1].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[1], sizeof(wh))==WAVERR_STILLPLAYING) - SLEEP(1); - FREE_AND_NULL(wh[1].lpData); - } - } -#endif - -#ifdef USE_ALSA_SOUND - if(handle_type==SOUND_DEVICE_ALSA) { - if(!alsa_device_open_failed) - alsa_api->snd_pcm_drain(playback_handle); - } -#endif - -#ifdef AFMT_U8 - else if(handle_type==SOUND_DEVICE_OSS) { - ioctl(dsp, SNDCTL_DSP_SYNC, NULL); - } -#endif -} - -void -xptone_complete(void) -{ -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_lock(&handle_mutex); -#endif - xptone_complete_locked(); -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); -#endif -} - -BOOL xptone_close_locked(void) -{ - xptone_complete_locked(); - - if (handle_rc <= 0) - return FALSE; - if (--handle_rc) - return TRUE; - -#ifdef WITH_PORTAUDIO - if(handle_type==SOUND_DEVICE_PORTAUDIO) { - pa_api->close(portaudio_stream); - } -#endif - -#ifdef WITH_PULSEAUDIO - if(handle_type==SOUND_DEVICE_PULSEAUDIO) { - if (pu_handle) - pu_api->simple_free(pu_handle); - pu_handle = NULL; - } -#endif - -#ifdef WITH_SDL_AUDIO - if(handle_type==SOUND_DEVICE_SDL) { - xpbeep_sdl.CloseAudio(); - xpbeep_sdl.SDL_DestroySemaphore(sdlToneDone); - } -#endif - -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) { - waveOutClose(waveOut); - } -#endif - -#ifdef USE_ALSA_SOUND - if(handle_type==SOUND_DEVICE_ALSA) { - alsa_api->snd_pcm_close (playback_handle); - playback_handle=NULL; - } -#endif - -#ifdef AFMT_U8 - if(handle_type==SOUND_DEVICE_OSS) { - close(dsp); - } -#endif - handle_type=SOUND_DEVICE_CLOSED; - sound_device_open_failed=FALSE; -#ifdef USE_ALSA_SOUND - alsa_device_open_failed=FALSE; -#endif -#ifdef WITH_SDL_AUDIO - sdl_device_open_failed=FALSE; -#endif -#ifdef WITH_PORTAUDIO - portaudio_device_open_failed=FALSE; -#endif -#ifdef WITH_PULSEAUDIO - pulseaudio_device_open_failed = FALSE; -#endif - - return(TRUE); -} - -BOOL -xptone_close(void) -{ - BOOL ret; - -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_lock(&handle_mutex); -#endif - ret = xptone_close_locked(); -#ifdef XPDEV_THREAD_SAFE - pthread_mutex_unlock(&handle_mutex); -#endif - return ret; -} - -static BOOL -do_xp_play_sample(const unsigned char *sampo, size_t sz, int *freed) -{ - const unsigned char *samp; - int need_copy = 0; -#ifdef AFMT_U8 - int wr; - int i; -#endif - -#ifdef WITH_PORTAUDIO - if(handle_type==SOUND_DEVICE_PORTAUDIO) { - if(pa_api->ver < 1899) - need_copy = 1; - } -#endif -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) - need_copy = 1; -#endif -#ifdef WITH_SDL_AUDIO - if(handle_type==SOUND_DEVICE_SDL) - need_copy = 1; -#endif - - if (freed) - *freed = need_copy; - if (need_copy) { - if (freed) { - samp = sampo; - } - else { - samp = malloc(sz); - if (!samp) - return FALSE; - memcpy((void *)samp, sampo, sz); - } - } - else { - samp = sampo; - } - -#ifdef WITH_PULSEAUDIO - if(handle_type==SOUND_DEVICE_PULSEAUDIO) { - int err; - pa_sample_spec ss; - ss.format = PA_SAMPLE_U8; - ss.rate = 22050; - ss.channels = 1; - if (pu_handle == NULL) { - if((pu_handle = pu_api->simple_new(NULL, "XPBeep", PA_STREAM_PLAYBACK, NULL, "Beeps and Boops", &ss, NULL, NULL, NULL)) == NULL) { - pulseaudio_device_open_failed=TRUE; - pulseaudio_initialized=FALSE; - xptone_close_locked(); - xptone_open_locked(); - } - else - pulseaudio_initialized=TRUE; - } - if (pulseaudio_initialized) - pu_api->simple_write(pu_handle, sampo, sz, &err); - } -#endif - -#ifdef WITH_PORTAUDIO - if(handle_type==SOUND_DEVICE_PORTAUDIO) { - if(pa_api->ver >= 1899) { - pa_api->start(portaudio_stream); - pa_api->write(portaudio_stream, samp, sz); - } - else { - xptone_complete_locked(); - pawave=samp; - portaudio_buf_pos=0; - portaudio_buf_len=sz; - pa_api->start(portaudio_stream); - } - return TRUE; - } -#endif - -#ifdef WITH_SDL_AUDIO - if(handle_type==SOUND_DEVICE_SDL) { - xpbeep_sdl.LockAudio(); - swave=samp; - sdl_audio_buf_pos=0; - sdl_audio_buf_len=sz; - xpbeep_sdl.UnlockAudio(); - xpbeep_sdl.PauseAudio(FALSE); - xpbeep_sdl.SemWait(sdlToneDone); - xpbeep_sdl.PauseAudio(TRUE); - return TRUE; - } -#endif - -#ifdef _WIN32 - if(handle_type==SOUND_DEVICE_WIN32) { - if(wh[curr_wh].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==WAVERR_STILLPLAYING) - SLEEP(1); - } - free(wh[curr_wh].lpData); - wh[curr_wh].lpData=samp; - wh[curr_wh].dwBufferLength=sz; - if(waveOutPrepareHeader(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==MMSYSERR_NOERROR) { - if(waveOutWrite(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==MMSYSERR_NOERROR) { - curr_wh ^= 1; - } - } - return TRUE; - } -#endif - -#ifdef USE_ALSA_SOUND - if(handle_type==SOUND_DEVICE_ALSA) { - int ret; - int written=0; - - while (written < sz) { - ret = alsa_api->snd_pcm_writei(playback_handle, samp + written, sz - written); - if (ret < 0) { - if (alsa_api->snd_pcm_prepare(playback_handle) == 0) { - ret = 0; - } - else { - if (written == 0) { - /* Go back and try OSS */ - xptone_close_locked(); - alsa_device_open_failed = TRUE; - xptone_open_locked(); - } - break; - } - } - written += ret; - } - if (written == sz) - return TRUE; - } -#endif - -#ifdef AFMT_U8 - if(handle_type==SOUND_DEVICE_OSS) { - wr=0; - while(wr<sz) { - i=write(dsp, samp+wr, sz-wr); - if(i>=0) - wr+=i; - } - return TRUE; - } -#endif - - return FALSE; -} - -#ifdef XPDEV_THREAD_SAFE -void xp_play_sample_thread(void *data) -{ - BOOL must_close; - BOOL posted_last=TRUE; - BOOL waited=FALSE; - unsigned char *sample=NULL; - size_t this_sample_size; - int freed; - - SetThreadName("Sample Play"); - sample_thread_running=TRUE; - sem_post(&sample_complete_sem); - while(1) { - must_close = FALSE; - if(!waited) { - if(sem_wait(&sample_pending_sem)!=0) - goto error_return; - } - else - waited=FALSE; - posted_last=FALSE; - pthread_mutex_lock(&handle_mutex); - - if(handle_type==SOUND_DEVICE_CLOSED) { - must_close=TRUE; - if(!xptone_open_locked()) { - sem_post(&sample_complete_sem); - pthread_mutex_unlock(&handle_mutex); - continue; - } - } - - if(pthread_mutex_lock(&sample_mutex)!=0) { - pthread_mutex_unlock(&handle_mutex); - goto error_return; - } - this_sample_size=sample_size; - FREE_AND_NULL(sample); - sample=(unsigned char *)malloc(sample_size); - if(sample==NULL) { - sem_post(&sample_complete_sem); - pthread_mutex_unlock(&sample_mutex); - pthread_mutex_unlock(&handle_mutex); - continue; - } - memcpy(sample, sample_buffer, this_sample_size); - pthread_mutex_unlock(&sample_mutex); - - do_xp_play_sample(sample, this_sample_size, &freed); - if (freed) - sample = NULL; - sem_post(&sample_complete_sem); - posted_last=TRUE; - if(must_close) { - if(sem_trywait(&sample_pending_sem)==0) { - waited=TRUE; - } - else { - xptone_close_locked(); - } - } - pthread_mutex_unlock(&handle_mutex); - } - -error_return: -#ifdef _WIN32 - pthread_mutex_lock(&handle_mutex); - if(handle_type==SOUND_DEVICE_WIN32) { - if(wh[curr_wh].dwFlags & WHDR_PREPARED) { - while(waveOutUnprepareHeader(waveOut, &wh[curr_wh], sizeof(wh[curr_wh]))==WAVERR_STILLPLAYING) - SLEEP(1); - } - FREE_AND_NULL(wh[curr_wh].lpData); - } - pthread_mutex_unlock(&handle_mutex); -#endif - - FREE_AND_NULL(sample); - xptone_close(); - if(!posted_last) { - sem_post(&sample_complete_sem); - } - sample_thread_running=FALSE; -} - -static void -init_sample(void) -{ - pthread_mutex_init(&sample_mutex, NULL); - pthread_mutex_init(&handle_mutex, NULL); - sem_init(&sample_pending_sem, 0, 0); - sem_init(&sample_complete_sem, 0, 0); -} - -static BOOL xp_play_sample_locked(const unsigned char *sample, size_t size, BOOL background) -{ - if(!sample_thread_running) { - _beginthread(xp_play_sample_thread, 0,NULL); - sem_wait(&sample_complete_sem); - } - - while(samples_posted > 0) { - pthread_mutex_unlock(&sample_mutex); - sem_wait(&sample_complete_sem); - pthread_mutex_lock(&sample_mutex); - samples_posted--; - } - sample_buffer=sample; - sample_size=size; - samples_posted++; - sem_post(&sample_pending_sem); - if(!background) { - while(samples_posted > 0) { - pthread_mutex_unlock(&sample_mutex); - sem_wait(&sample_complete_sem); - pthread_mutex_lock(&sample_mutex); - samples_posted--; - } - } - return TRUE; -} - -/* - * This MUST not return false after sample goes into the sample buffer in the background. - * If it does, the caller won't be able to free() it. - */ -BOOL xp_play_sample(const unsigned char *sample, size_t size, BOOL background) -{ - BOOL ret; - pthread_once(&sample_initialized_pto, init_sample); - - pthread_mutex_lock(&sample_mutex); - ret = xp_play_sample_locked(sample, size, background); - pthread_mutex_unlock(&sample_mutex); - return(ret); -} -#else -BOOL xp_play_sample(const unsigned char *sample, size_t sample_size, BOOL background) -{ - BOOL must_close=FALSE; - BOOL ret; - - if(handle_type==SOUND_DEVICE_CLOSED) { - must_close=TRUE; - if(!xptone_open()) - return(FALSE); - } - - ret = do_xp_play_sample(sample, sample_size, NULL); - if(must_close) - xptone_close(); - return(ret); -} -#endif - -/********************************************************************************/ -/* Play a tone through the wave/DSP output device (sound card) - Deuce */ -/********************************************************************************/ - -BOOL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape) -{ - unsigned char *wave; - int samples; - BOOL ret; - - wave=(unsigned char *)malloc(S_RATE*15/2+1); - if(!wave) - return FALSE; - if(freq<17 && freq != 0) - freq=17; - samples=S_RATE*duration/1000; - if(freq) { - if(samples<=S_RATE/freq*2) - samples=S_RATE/freq*2; - } - if(freq==0 || samples > S_RATE/freq*2) { - int sample_len; - - xptone_makewave(freq,wave,S_RATE*15/2,shape); - for(sample_len=S_RATE*15/2-1; sample_len && wave[sample_len]==128; sample_len--) - ; - sample_len++; - while(samples > S_RATE*15/2) { - if(!xp_play_sample(wave, sample_len, TRUE)) { - free(wave); - return FALSE; - } - samples -= sample_len; - } - } - xptone_makewave(freq,wave,samples,shape); - ret = xp_play_sample(wave, samples, FALSE); - free(wave); - return ret; -} - -#ifdef __unix__ -/****************************************************************************/ -/* Generate a tone at specified frequency for specified milliseconds */ -/* Thanks to Casey Martin (and Deuce) for this code */ -/****************************************************************************/ -void unix_beep(int freq, int dur) -{ - static int console_fd=-1; - -#if (defined(__FreeBSD__) && defined(HAS_MACHINE_SPEAKER_H)) || ((defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H)) - int speaker_fd=-1; - tone_t tone; - - speaker_fd = open("/dev/speaker", O_WRONLY|O_APPEND); - if(speaker_fd != -1) { - tone.frequency=freq; - tone.duration=dur/10; - ioctl(speaker_fd,SPKRTONE,&tone); - close(speaker_fd); - return; - } -#endif - -#if !defined(__GNU__) && !defined(__QNX__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(__CYGWIN__) && !defined(__HAIKU__) - if(console_fd == -1) - console_fd = open("/dev/console", O_NOCTTY); - - if(console_fd != -1) { -#if defined(__solaris__) - ioctl(console_fd, KIOCCMD, KBD_CMD_BELL); -#else - if(freq != 0) /* Don't divide by zero */ - ioctl(console_fd, KIOCSOUND, (int) (1193180 / freq)); -#endif /* solaris */ - SLEEP(dur); -#if defined(__solaris__) - ioctl(console_fd, KIOCCMD, KBD_CMD_NOBELL); /* turn off tone */ -#else - ioctl(console_fd, KIOCSOUND, 0); /* turn off tone */ -#endif /* solaris */ - } -#endif -} - -#endif - -/********************************************************************************/ -/* Play sound through DSP/wave device, if unsuccessful, play through PC speaker */ -/********************************************************************************/ -void xpbeep(double freq, DWORD duration) -{ - if(xptone(freq,duration,WAVE_SHAPE_SINE_SAW_HARM)) - return; - -#if defined(_WIN32) - Beep((DWORD)(freq+.5), duration); -#elif defined(__unix__) - unix_beep((int)(freq+.5),duration); -#endif -} diff --git a/xpdev/xpbeep.h b/xpdev/xpbeep.h deleted file mode 100644 index 93bac7d7b8fbe69f16791d0251f7a6ec88574b73..0000000000000000000000000000000000000000 --- a/xpdev/xpbeep.h +++ /dev/null @@ -1,51 +0,0 @@ -/* $Id: xpbeep.h,v 1.16 2020/04/15 15:18:00 deuce Exp $ */ - -#ifndef _XPBEEP_H_ -#define _XPBEEP_H_ - -#include "gen_defs.h" -#include "wrapdll.h" - -#if defined(_WIN32) - #if 0 - #define BEEP(freq,dur) xpbeep((double)(freq),(DWORD)(dur)) - #else - #define BEEP(freq,dur) Beep((DWORD)(freq),(DWORD)(dur)) - #endif -#elif defined(__OS2__) - #define BEEP(freq,dur) DosBeep(freq,dur) -#elif defined(__unix__) || defined(__APPLE__) - #define BEEP(freq,dur) xpbeep((double)(freq),(DWORD)(dur)) -#else - #error "Unsupported Target: Need some macros and/or function prototypes here." -#endif - -enum WAVE_SHAPE { - WAVE_SHAPE_SINE - ,WAVE_SHAPE_SAWTOOTH - ,WAVE_SHAPE_SQUARE - ,WAVE_SHAPE_SINE_SAW - ,WAVE_SHAPE_SINE_HARM - ,WAVE_SHAPE_SINE_SAW_CHORD - ,WAVE_SHAPE_SINE_SAW_HARM -}; - - -#ifdef __cplusplus -extern "C" { -#endif -DLLEXPORT void xptone_makewave(double freq, unsigned char *wave, int samples, enum WAVE_SHAPE shape); -DLLEXPORT BOOL xptone_open(void); -DLLEXPORT BOOL xptone_close(void); -DLLEXPORT void xpbeep(double freq, DWORD duration); -DLLEXPORT BOOL xp_play_sample(const unsigned char *sample, size_t sample_size, BOOL background); -DLLEXPORT void xptone_complete(void); -DLLEXPORT BOOL xptone(double freq, DWORD duration, enum WAVE_SHAPE); -#ifdef __unix__ -DLLEXPORT void unix_beep(int freq, int dur); -#endif -#ifdef __cplusplus -} -#endif - -#endif diff --git a/xpdev/xpdatetime.c b/xpdev/xpdatetime.c deleted file mode 100644 index e27df4019f034d8cb8565666c0e2fc27d7062222..0000000000000000000000000000000000000000 --- a/xpdev/xpdatetime.c +++ /dev/null @@ -1,457 +0,0 @@ -/* xpdatetime.c */ - -/* Cross-platform (and eXtra Precision) date/time functions */ - -/* $Id: xpdatetime.c,v 1.13 2015/11/25 07:27:07 sbbs Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <string.h> /* memset */ -#include "datewrap.h" /* sane_mktime */ -#include "xpdatetime.h" /* xpDateTime_t */ - -/**************************************/ -/* Cross-platform date/time functions */ -/**************************************/ - -xpDateTime_t xpDateTime_create(unsigned year, unsigned month, unsigned day - ,unsigned hour, unsigned minute, float second - ,xpTimeZone_t zone) -{ - xpDateTime_t xpDateTime; - - xpDateTime.date.year = year; - xpDateTime.date.month = month; - xpDateTime.date.day = day; - xpDateTime.time.hour = hour; - xpDateTime.time.minute = minute; - xpDateTime.time.second = second; - xpDateTime.zone = zone; - - return xpDateTime; -} - -xpDateTime_t xpDateTime_now(void) -{ -#if defined(_WIN32) - SYSTEMTIME systime; - - GetLocalTime(&systime); - return(xpDateTime_create(systime.wYear,systime.wMonth,systime.wDay - ,systime.wHour,systime.wMinute,(float)systime.wSecond+(systime.wMilliseconds*0.001F) - ,xpTimeZone_local())); -#else /* !Win32 (e.g. Unix) */ - struct tm tm; - struct timeval tv; - time_t t; - - gettimeofday(&tv, NULL); - t=tv.tv_sec; - localtime_r(&t,&tm); - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec+(tv.tv_usec*0.00001) - ,xpTimeZone_local()); -#endif -} - -/* Return local timezone offset (in minutes) */ -xpTimeZone_t xpTimeZone_local(void) -{ -#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DARWIN__) || defined(__linux__) - struct tm tm; - time_t t=time(NULL); - - localtime_r(&t, &tm); - return(tm.tm_gmtoff/60); -#elif defined(_WIN32) - TIME_ZONE_INFORMATION tz; - DWORD tzRet; - - /*****************************/ - /* Get Time-zone information */ - /*****************************/ - memset(&tz,0,sizeof(tz)); - tzRet=GetTimeZoneInformation(&tz); - switch(tzRet) { - case TIME_ZONE_ID_DAYLIGHT: - tz.Bias += tz.DaylightBias; - break; - case TIME_ZONE_ID_STANDARD: - tz.Bias += tz.StandardBias; - break; - } - - return -tz.Bias; -#else - -#if defined(__BORLANDC__) || defined(__CYGWIN__) - #define timezone _timezone -#endif - - /* Converts (_)timezone from seconds west of UTC to minutes east of UTC */ - /* Adjust for DST, assuming adjustment is always 60 minutes <sigh> */ - return -((timezone/60) - (daylight*60)); -#endif -} - -/* TODO: Supports local timezone and UTC only, currently */ -time_t xpDateTime_to_time(xpDateTime_t xpDateTime) -{ - struct tm tm; - - ZERO_VAR(tm); - - if(xpDateTime.date.year==0) - return(INVALID_TIME); - - tm.tm_year = xpDateTime.date.year; - tm.tm_mon = xpDateTime.date.month; - tm.tm_mday = xpDateTime.date.day; - - tm.tm_hour = xpDateTime.time.hour; - tm.tm_min = xpDateTime.time.minute; - tm.tm_sec = (int)xpDateTime.time.second; - - if(xpDateTime.zone == xpTimeZone_UTC) - return sane_timegm(&tm); - if(xpDateTime.zone == xpTimeZone_LOCAL || xpDateTime.zone == xpTimeZone_local()) - return sane_mktime(&tm); - return INVALID_TIME; -} - -/* This version ignores the timezone in xpDateTime and always uses mktime() */ -time_t xpDateTime_to_localtime(xpDateTime_t xpDateTime) -{ - xpDateTime.zone = xpTimeZone_LOCAL; - return xpDateTime_to_time(xpDateTime); -} - -xpDateTime_t time_to_xpDateTime(time_t ti, xpTimeZone_t zone) -{ - xpDateTime_t never; - struct tm tm; - - ZERO_VAR(never); - ZERO_VAR(tm); - if(localtime_r(&ti,&tm)==NULL) - return(never); - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec - ,zone==xpTimeZone_LOCAL ? xpTimeZone_local() : zone); -} - -xpDate_t time_to_xpDate(time_t ti) -{ - xpDate_t never; - struct tm tm; - - ZERO_VAR(never); - ZERO_VAR(tm); - if(localtime_r(&ti,&tm)==NULL) - return never; - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec, /* zone: */0).date; -} - -xpDateTime_t gmtime_to_xpDateTime(time_t ti) -{ - xpDateTime_t never; - struct tm tm; - - ZERO_VAR(never); - ZERO_VAR(tm); - if(gmtime_r(&ti,&tm)==NULL) - return(never); - - return xpDateTime_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday - ,tm.tm_hour,tm.tm_min,(float)tm.tm_sec - ,xpTimeZone_UTC); -} - -/**********************************************/ -/* Decimal-coded ISO-8601 date/time functions */ -/**********************************************/ - -isoDate_t xpDateTime_to_isoDateTime(xpDateTime_t xpDateTime, isoTime_t* isoTime) -{ - if(isoTime!=NULL) - *isoTime=0; - - if(xpDateTime.date.year==0) - return(0); - - if(isoTime!=NULL) - *isoTime=isoTime_create(xpDateTime.time.hour,xpDateTime.time.minute,xpDateTime.time.second); - - return isoDate_create(xpDateTime.date.year,xpDateTime.date.month,xpDateTime.date.day); -} - -xpDateTime_t isoDateTime_to_xpDateTime(isoDate_t date, isoTime_t ti) -{ - return xpDateTime_create(isoDate_year(date),isoDate_month(date),isoDate_day(date) - ,isoTime_hour(ti),isoTime_minute(ti),(float)isoTime_second(ti),xpTimeZone_local()); -} - -isoDate_t time_to_isoDateTime(time_t ti, isoTime_t* isoTime) -{ - struct tm tm; - - if(isoTime!=NULL) - *isoTime=0; - - ZERO_VAR(tm); - if(localtime_r(&ti,&tm)==NULL) - return(0); - - if(isoTime!=NULL) - *isoTime=isoTime_create(tm.tm_hour,tm.tm_min,tm.tm_sec); - - return isoDate_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday); -} - -isoTime_t time_to_isoTime(time_t ti) -{ - isoTime_t isoTime; - - time_to_isoDateTime(ti,&isoTime); - - return isoTime; -} - -isoDate_t gmtime_to_isoDateTime(time_t ti, isoTime_t* isoTime) -{ - struct tm tm; - - if(isoTime!=NULL) - *isoTime=0; - - ZERO_VAR(tm); - if(gmtime_r(&ti,&tm)==NULL) - return(0); - - if(isoTime!=NULL) - *isoTime=isoTime_create(tm.tm_hour,tm.tm_min,tm.tm_sec); - - return isoDate_create(1900+tm.tm_year,1+tm.tm_mon,tm.tm_mday); -} - -isoTime_t gmtime_to_isoTime(time_t ti) -{ - isoTime_t isoTime; - - gmtime_to_isoDateTime(ti,&isoTime); - - return isoTime; -} - -time_t isoDateTime_to_time(isoDate_t date, isoTime_t ti) -{ - struct tm tm; - - ZERO_VAR(tm); - - if(date==0) - return(INVALID_TIME); - - tm.tm_year = isoDate_year(date); - tm.tm_mon = isoDate_month(date); - tm.tm_mday = isoDate_day(date); - - tm.tm_hour = isoTime_hour(ti); - tm.tm_min = isoTime_minute(ti); - tm.tm_sec = isoTime_second(ti); - - return sane_mktime(&tm); -} - -/****************************************************************************/ -/* Conversion from xpDate/Time/Zone to isoDate/Time/Zone Strings */ -/****************************************************************************/ - -char* xpDate_to_isoDateStr(xpDate_t date, const char* sep, char* str, size_t maxlen) -{ - if(sep==NULL) - sep="-"; - - snprintf(str,maxlen,"%04u%s%02u%s%02u" - ,date.year ,sep - ,date.month ,sep - ,date.day); - - return str; -} - -/* precision example output - * -2 "14" - * -1 "14:02" - * 0 "14:02:39" - * 1 "14:02:39.8" - * 2 "14:02:39.82" - * 3 "14:02:39.829" - */ -char* xpTime_to_isoTimeStr(xpTime_t ti, const char* sep, int precision - ,char* str, size_t maxlen) -{ - if(sep==NULL) - sep=":"; - - if(precision < -1) /* HH */ - snprintf(str, maxlen, "%02u", ti.hour); - else if(precision < 0) /* HH:MM */ - snprintf(str, maxlen, "%02u%s%02u" - ,ti.hour ,sep - ,ti.minute - ); - else /* HH:MM:SS[.fract] */ - snprintf(str, maxlen, "%02u%s%02u%s%0*.*f" - ,ti.hour ,sep - ,ti.minute ,sep - ,precision ? (precision+3) : 2 - ,precision - ,ti.second - ); - - return str; -} - -char* xpTimeZone_to_isoTimeZoneStr(xpTimeZone_t zone, const char* sep - ,char *str, size_t maxlen) -{ - xpTimeZone_t tz=zone; - - if(tz==xpTimeZone_UTC) - return "Z"; - - if(sep==NULL) - sep=":"; - - if(tz<0) - tz=-tz; - - snprintf(str,maxlen,"%c%02u%s%02u" - ,zone < 0 ? '-':'+' - ,tz/60 - ,sep - ,tz%60); - - return str; -} - -char* xpDateTime_to_isoDateTimeStr(xpDateTime_t dt - ,const char* date_sep, const char* datetime_sep, const char* time_sep - ,int precision - ,char* str, size_t maxlen) -{ - char tz_str[16]; - char date_str[16]; - char time_str[16]; - - if(datetime_sep==NULL) datetime_sep="T"; - - snprintf(str,maxlen,"%s%s%s%s" - ,xpDate_to_isoDateStr(dt.date, date_sep, date_str, sizeof(date_str)) - ,datetime_sep - ,xpTime_to_isoTimeStr(dt.time, time_sep, precision, time_str, sizeof(time_str)) - ,xpTimeZone_to_isoTimeZoneStr(dt.zone,time_sep,tz_str,sizeof(tz_str))); - - return str; -} - -/****************************************************************************/ -/* isoDate/Time/Zone String parsing functions */ -/****************************************************************************/ - -BOOL isoTimeZoneStr_parse(const char* str, xpTimeZone_t* zone) -{ - unsigned hour=0,minute=0; - - switch(*str) { - case 0: /* local time-zone */ - *zone = xpTimeZone_local(); - return TRUE; - case 'Z': /* UTC */ - *zone = xpTimeZone_UTC; - return TRUE; - case '+': - case '-': /* "+/- HH[:]MM" */ - if(sscanf(str+1,"%2u%*s%2u",&hour,&minute)>=1) { - *zone = (hour*60) + minute; - if(*str=='-') - *zone = -(*zone); - return TRUE; - } - break; - } - return FALSE; -} - -/* TODO: adjust times in 24:xx:xx format */ -xpDateTime_t isoDateTimeStr_parse(const char* str) -{ - char zone[16]; - xpDateTime_t xpDateTime; - - zone[0]=0; - ZERO_VAR(xpDateTime); - - if((sscanf(str,"%4u-%2u-%2uT%2u:%2u:%f%6s" /* CCYY-MM-DDThh:MM:ss�hhmm */ - ,&xpDateTime.date.year - ,&xpDateTime.date.month - ,&xpDateTime.date.day - ,&xpDateTime.time.hour - ,&xpDateTime.time.minute - ,&xpDateTime.time.second - ,zone)>=2 - || sscanf(str,"%4u%2u%2uT%2u%2u%f%6s" /* CCYYMMDDThhmmss�hhmm */ - ,&xpDateTime.date.year - ,&xpDateTime.date.month - ,&xpDateTime.date.day - ,&xpDateTime.time.hour - ,&xpDateTime.time.minute - ,&xpDateTime.time.second - ,zone)>=4 - || sscanf(str,"%4u%2u%2u%2u%2u%f%6s" /* CCYYMMDDhhmmss�hhmm */ - ,&xpDateTime.date.year - ,&xpDateTime.date.month - ,&xpDateTime.date.day - ,&xpDateTime.time.hour - ,&xpDateTime.time.minute - ,&xpDateTime.time.second - ,zone)>=1 - ) && isoTimeZoneStr_parse(zone,&xpDateTime.zone)) - return xpDateTime; - - return xpDateTime; -} diff --git a/xpdev/xpdatetime.h b/xpdev/xpdatetime.h deleted file mode 100644 index 74f91c2a76d1f34e0f483c66d197f7d9c1172ae3..0000000000000000000000000000000000000000 --- a/xpdev/xpdatetime.h +++ /dev/null @@ -1,146 +0,0 @@ -/* Cross-platform (and eXtra Precision) date/time functions */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPDATETIME_H_ -#define _XPDATETIME_H_ - -#include "gen_defs.h" /* uint32_t and time_t */ -#include "wrapdll.h" - -#if defined(__cplusplus) -extern "C" { -#endif - -/**************************************/ -/* Cross-platform date/time functions */ -/**************************************/ - -#define INVALID_TIME (time_t)-1 /* time_t representation of an invalid date/time */ - -typedef struct { - unsigned year; /* 0-9999 */ - unsigned month; /* 1-12 */ - unsigned day; /* 1-31 */ -} xpDate_t; - -typedef struct { - unsigned hour; /* 0-23 */ - unsigned minute; /* 0-59 */ - float second; /* 0.0-59.999, supports fractional seconds */ -} xpTime_t; - -typedef int xpTimeZone_t; -#define xpTimeZone_UTC 0 -#define xpTimeZone_LOCAL 1 - -typedef struct { - xpDate_t date; - xpTime_t time; - xpTimeZone_t zone; /* minutes +/- UTC */ -} xpDateTime_t; - -DLLEXPORT xpDateTime_t xpDateTime_create(unsigned year, unsigned month, unsigned day - ,unsigned hour, unsigned minute, float second - ,xpTimeZone_t); -DLLEXPORT xpDateTime_t xpDateTime_now(void); -DLLEXPORT time_t xpDateTime_to_time(xpDateTime_t); -DLLEXPORT time_t xpDateTime_to_localtime(xpDateTime_t); -DLLEXPORT xpDate_t time_to_xpDate(time_t); -DLLEXPORT xpDateTime_t time_to_xpDateTime(time_t, xpTimeZone_t); -DLLEXPORT xpDateTime_t gmtime_to_xpDateTime(time_t); -DLLEXPORT xpTimeZone_t xpTimeZone_local(void); - -/**********************************************/ -/* Decimal-coded ISO-8601 date/time functions */ -/**********************************************/ - -typedef uint32_t isoDate_t; /* CCYYMMDD (decimal) */ -typedef uint32_t isoTime_t; /* HHMMSS (decimal) */ - -#define isoDate_create(year,mon,day) (((year)*10000)+((mon)*100)+(day)) -#define isoTime_create(hour,min,sec) (((hour)*10000)+((min)*100)+((unsigned)sec)) - -#define isoDate_year(date) ((date)/10000) -#define isoDate_month(date) (((date)/100)%100) -#define isoDate_day(date) ((date)%100) - -#define isoTime_hour(time) ((time)/10000) -#define isoTime_minute(time) (((time)/100)%100) -#define isoTime_second(time) ((time)%100) - -DLLEXPORT BOOL isoTimeZoneStr_parse(const char* str, xpTimeZone_t*); -DLLEXPORT xpDateTime_t isoDateTimeStr_parse(const char* str); - -/**************************************************************/ -/* Conversion between time_t (local and GMT) and isoDate/Time */ -/**************************************************************/ -DLLEXPORT isoTime_t time_to_isoTime(time_t); -DLLEXPORT isoTime_t gmtime_to_isoTime(time_t); -DLLEXPORT isoDate_t time_to_isoDateTime(time_t, isoTime_t*); -DLLEXPORT isoDate_t gmtime_to_isoDateTime(time_t, isoTime_t*); -DLLEXPORT time_t isoDateTime_to_time(isoDate_t, isoTime_t); -#define time_to_isoDate(t) time_to_isoDateTime(t,NULL) -#define gmtime_to_isoDate(t) gmtime_to_isoDateTime(t,NULL) - -/***************************************************/ -/* Conversion between xpDate/Time and isoDate/Time */ -/***************************************************/ - -#define xpDate_to_isoDate(date) isoDate_create((date).year,(date).month,(date).day) -#define xpTime_to_isoTime(time) isoTime_create((time).hour,(time).minute,(unsigned)((time).second)) - -DLLEXPORT xpDateTime_t isoDateTime_to_xpDateTime(isoDate_t, isoTime_t); -DLLEXPORT isoDate_t xpDateTime_to_isoDateTime(xpDateTime_t, isoTime_t*); - -/*****************************************************************/ -/* Conversion from xpDate/Time/Zone to isoDate/Time/Zone Strings */ -/*****************************************************************/ - -/* NULL sep (separator) values are automatically replaced with ISO-standard separators */ - -/* precision example output - * -2 "14" - * -1 "14:02" - * 0 "14:02:39" - * 1 "14.02:39.8" - * 2 "14.02:39.82" - * 3 "14.02:39.829" - */ -DLLEXPORT char* xpDate_to_isoDateStr(xpDate_t - ,const char* sep - ,char* str, size_t maxlen); -DLLEXPORT char* xpTime_to_isoTimeStr(xpTime_t - ,const char* sep - ,int precision - ,char* str, size_t maxlen); -DLLEXPORT char* xpTimeZone_to_isoTimeZoneStr(xpTimeZone_t - ,const char* sep - ,char *str, size_t maxlen); -DLLEXPORT char* xpDateTime_to_isoDateTimeStr(xpDateTime_t - ,const char* date_sep, const char* datetime_sep, const char* time_sep - ,int precision - ,char* str, size_t maxlen); - -#if defined(__cplusplus) -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/xpendian.h b/xpdev/xpendian.h deleted file mode 100644 index fedf80c2508a502233746d7e2e93d698c15f39ad..0000000000000000000000000000000000000000 --- a/xpdev/xpendian.h +++ /dev/null @@ -1,85 +0,0 @@ -/* xpendian.h */ - -/* Macros to convert integer "endianness" */ - -/* $Id: xpendian.h,v 1.6 2018/07/24 01:13:10 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPENDIAN_H -#define _XPENDIAN_H - -/************************/ -/* byte-swapping macros */ -/************************/ -#define BYTE_SWAP_16(x) ((((short)(x)&0xff00)>>8) | (((short)(x)&0x00ff)<<8)) -#define BYTE_SWAP_32(x) ((((long)(x)&0xff000000)>>24) | (((long)(x)&0x00ff0000)>>8) | (((long)(x)&0x0000ff00)<<8) | (((long)(x)&0x000000ff)<<24)) - -/* these may need to be updated for > 32-bit platforms */ -#define BYTE_SWAP_SHORT(x) BYTE_SWAP_16(x) -#define BYTE_SWAP_LONG(x) BYTE_SWAP_32(x) - -/* auto-detect integer size */ -#define BYTE_SWAP_INT(x) (sizeof(x)==sizeof(short) ? BYTE_SWAP_SHORT(x) : sizeof(x)==sizeof(long) ? BYTE_SWAP_LONG(x) : (x)) - -/********************************/ -/* Architecture-specific macros */ -/********************************/ -#ifdef __BIG_ENDIAN__ /* e.g. Motorola */ - - #define BE_SHORT(x) (x) - #define BE_LONG(x) (x) - #define BE_INT16(x) (x) - #define BE_INT32(x) (x) - #define BE_INT(x) (x) - #define LE_SHORT(x) BYTE_SWAP_SHORT(x) - #define LE_LONG(x) BYTE_SWAP_LONG(x) - #define LE_INT16(x) BYTE_SWAP_16(x) - #define LE_INT32(x) BYTE_SWAP_32(x) - #define LE_INT(x) BYTE_SWAP_INT(x) - -#else /* Little Endian (e.g. Intel) */ - - #define LE_SHORT(x) (x) - #define LE_LONG(x) (x) - #define LE_INT16(x) (x) - #define LE_INT32(x) (x) - #define LE_INT(x) (x) - #define BE_SHORT(x) BYTE_SWAP_SHORT(x) - #define BE_LONG(x) BYTE_SWAP_LONG(x) - #define BE_INT16(x) BYTE_SWAP_16(x) - #define BE_INT32(x) BYTE_SWAP_32(x) - #define BE_INT(x) BYTE_SWAP_INT(x) - -#endif - -#endif /* Don't add anything after this line */ diff --git a/xpdev/xpevent.c b/xpdev/xpevent.c deleted file mode 100644 index 35e5f42ce9ca1edcb6eeef30d39c9ba871f7d953..0000000000000000000000000000000000000000 --- a/xpdev/xpevent.c +++ /dev/null @@ -1,221 +0,0 @@ -/* xpevent.c */ - -/* *nix emulation of Win32 *Event API */ - -/* $Id: xpevent.c,v 1.17 2018/07/24 01:13:10 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <stdio.h> /* NULL */ -#include <stdlib.h> /* malloc() */ -#include "xpevent.h" -#include "genwrap.h" - -xpevent_t -CreateEvent(void *sec, BOOL bManualReset, BOOL bInitialState, void *name) -{ - xpevent_t event; - - event = (xpevent_t)malloc(sizeof(struct xpevent)); - if (event == NULL) { - errno = ENOSPC; - return(NULL); - } - memset(event,0,sizeof(struct xpevent)); - - /* - * Initialize - */ - if (pthread_mutex_init(&event->lock, NULL) != 0) { - free(event); - errno = ENOSPC; - return(NULL); - } - - if (pthread_cond_init(&event->gtzero, NULL) != 0) { - while(pthread_mutex_destroy(&event->lock)==EBUSY) - SLEEP(1); - free(event); - errno = ENOSPC; - return(NULL); - } - - event->mreset=bManualReset; - event->value=bInitialState; - event->nwaiters = 0; - event->magic=EVENT_MAGIC; - - return(event); -} - -BOOL -SetEvent(xpevent_t event) -{ - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(FALSE); - } - - pthread_mutex_lock(&event->lock); - - event->value=TRUE; - if (event->nwaiters > 0) { - /* - * We must use pthread_cond_broadcast() rather than - * pthread_cond_signal() in order to assure that the highest - * priority thread is run by the scheduler, since - * pthread_cond_signal() signals waiting threads in FIFO order. - */ - pthread_cond_broadcast(&event->gtzero); - } - - pthread_mutex_unlock(&event->lock); - - return(TRUE); -} - -BOOL -ResetEvent(xpevent_t event) -{ - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(FALSE); - } - - pthread_mutex_lock(&event->lock); - - event->value=FALSE; - - pthread_mutex_unlock(&event->lock); - - return(TRUE); -} - -BOOL -CloseEvent(xpevent_t event) -{ - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(FALSE); - } - - /* Make sure there are no waiters. */ - pthread_mutex_lock(&event->lock); - if (event->nwaiters > 0) { - pthread_mutex_unlock(&event->lock); - errno = EBUSY; - return(FALSE); - } - - pthread_mutex_unlock(&event->lock); - - while(pthread_mutex_destroy(&event->lock)==EBUSY) - SLEEP(1); - while(pthread_cond_destroy(&event->gtzero)==EBUSY) - SLEEP(1); - event->magic = 0; - - free(event); - - return(TRUE); -} - -DWORD -WaitForEvent(xpevent_t event, DWORD ms) -{ - DWORD retval=WAIT_FAILED; - struct timespec abstime; - struct timeval currtime; - - if (event==NULL || (event->magic != EVENT_MAGIC)) { - errno = EINVAL; - return(WAIT_FAILED); - } - - if(ms && ms!=INFINITE) { - gettimeofday(&currtime,NULL); - abstime.tv_sec=currtime.tv_sec + ((currtime.tv_usec/1000 + ms)/1000); - abstime.tv_nsec=(currtime.tv_usec*1000 + ms*1000000)%1000000000; - } - - pthread_mutex_lock(&event->lock); - - if(event->value) - retval=WAIT_OBJECT_0; - - while ((!(event->value)) || (event->verify!=NULL && !event->verify(event->cbdata))) { - event->nwaiters++; - switch(ms) { - case 0: - if(event->value) - retval=WAIT_OBJECT_0; - else - retval=WAIT_TIMEOUT; - event->nwaiters--; - goto DONE; - break; - case INFINITE: - retval=pthread_cond_wait(&event->gtzero, &event->lock); - if(retval) { - errno=retval; - retval=WAIT_FAILED; - event->nwaiters--; - goto DONE; - } - break; - default: - retval=pthread_cond_timedwait(&event->gtzero, &event->lock, &abstime); - if(retval) { - if(retval==ETIMEDOUT) - retval=WAIT_TIMEOUT; - else { - errno=retval; - retval=WAIT_FAILED; - } - event->nwaiters--; - goto DONE; - } - } - event->nwaiters--; - } - - DONE: - - if(retval==WAIT_OBJECT_0) { - if(!event->mreset) - event->value=FALSE; - } - - pthread_mutex_unlock(&event->lock); - - return retval; -} diff --git a/xpdev/xpevent.h b/xpdev/xpevent.h deleted file mode 100644 index 01972b9e6dff9dc0d9f696635de78caaced13efb..0000000000000000000000000000000000000000 --- a/xpdev/xpevent.h +++ /dev/null @@ -1,83 +0,0 @@ -/* xpevent.h */ - -/* *nix emulation of Win32 *Event API */ - -/* $Id: xpevent.h,v 1.6 2018/07/24 01:13:10 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPEVENT_H_ -#define _XPEVENT_H_ - -#include <pthread.h> -#include "gen_defs.h" - -#if defined(__solaris__) -#include <xpsem.h> /* u_int32_t */ -#endif - -/* Opaque type definition. */ -struct xpevent; -typedef struct xpevent *xpevent_t; - -#if defined(__cplusplus) -extern "C" { -#endif -xpevent_t CreateEvent(void *sec, BOOL bManualReset, BOOL bInitialState, void *name); -BOOL SetEvent(xpevent_t event); -BOOL ResetEvent(xpevent_t event); -BOOL CloseEvent(xpevent_t event); -DWORD WaitForEvent(xpevent_t event, DWORD ms); -#if defined(__cplusplus) -} -#endif - -struct xpevent { -#define EVENT_MAGIC ((u_int32_t) 0x09fa4014) - u_int32_t magic; - pthread_mutex_t lock; - pthread_cond_t gtzero; - BOOL value; - BOOL mreset; - DWORD nwaiters; - void *cbdata; - BOOL (*verify)(void *); -}; - -#define INFINITE ((DWORD)(-1)) -enum { - WAIT_OBJECT_0 - ,WAIT_TIMEOUT - ,WAIT_FAILED -}; - -#endif diff --git a/xpdev/xpmap.c b/xpdev/xpmap.c deleted file mode 100644 index eaf002fbfaaf1e9d325b89c42364c7ea8d2c5f10..0000000000000000000000000000000000000000 --- a/xpdev/xpmap.c +++ /dev/null @@ -1,158 +0,0 @@ -/* mmap() style cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "xpmap.h" -#include <stdlib.h> // malloc() - -#if defined(__unix__) - -#include <unistd.h> // close() -#include <fcntl.h> -#include <sys/mman.h> -#include <sys/types.h> -#include <sys/stat.h> - -struct xpmapping* xpmap(const char *filename, enum xpmap_type type) -{ - int fd; - void *addr=NULL; - int oflags; - int mflags; - int mprot; - struct stat sb; - struct xpmapping *ret; - - switch(type) { - case XPMAP_READ: - oflags=O_RDONLY; - mflags=0; - mprot=PROT_READ; - break; - case XPMAP_WRITE: - oflags=O_RDWR; - mflags=MAP_SHARED; - mprot=PROT_READ|PROT_WRITE; - break; - case XPMAP_COPY: - oflags=O_RDWR; - mflags=MAP_PRIVATE; - mprot=PROT_READ|PROT_WRITE; - break; - } - - fd=open(filename, oflags); - if(fd == -1) - return NULL; - if(fstat(fd, &sb)==-1) { - close(fd); - return NULL; - } - addr=mmap(NULL, sb.st_size, mprot, mflags, fd, 0); - if(addr==MAP_FAILED) { - close(fd); - return NULL; - } - ret=(struct xpmapping *)malloc(sizeof(struct xpmapping)); - if(ret==NULL) { - munmap(addr, sb.st_size); - close(fd); - return NULL; - } - ret->addr=addr; - ret->fd=fd; - ret->size=sb.st_size; - return ret; -} - -void xpunmap(struct xpmapping *map) -{ - munmap(map->addr, map->size); - close(map->fd); - free(map); -} - -#elif defined(_WIN32) - -struct xpmapping* xpmap(const char *filename, enum xpmap_type type) -{ - HFILE fd; - HANDLE md; - OFSTRUCT of; - UINT oflags; - DWORD mprot; - DWORD maccess; - DWORD size; - void *addr; - struct xpmapping *ret; - - switch(type) { - case XPMAP_READ: - oflags=OF_READ|OF_SHARE_DENY_NONE; - mprot=PAGE_READONLY; - maccess=FILE_MAP_READ; - break; - case XPMAP_WRITE: - oflags=OF_READWRITE|OF_SHARE_DENY_NONE; - mprot=PAGE_READWRITE; - maccess=FILE_MAP_WRITE; - break; - case XPMAP_COPY: - oflags=OF_READ|OF_SHARE_DENY_NONE; - mprot=PAGE_WRITECOPY; - maccess=FILE_MAP_COPY; - break; - } - - fd=OpenFile(filename, &of, oflags); - if(fd == HFILE_ERROR) - return NULL; - if((size=GetFileSize((HANDLE)fd, NULL))==INVALID_FILE_SIZE) - return NULL; - md=CreateFileMapping((HANDLE)fd, NULL, mprot, 0, size, NULL); - if(md==NULL) - return NULL; - addr=MapViewOfFile(md, maccess, 0, 0, size); - ret=(struct xpmapping *)malloc(sizeof(struct xpmapping)); - if(ret==NULL) { - CloseHandle(md); - UnmapViewOfFile(addr); - return NULL; - } - ret->addr=addr; - ret->fd=(HANDLE)fd; - ret->md=md; - ret->size=size; - return ret; -} - -void xpunmap(struct xpmapping *map) -{ - UnmapViewOfFile(map->addr); - CloseHandle(map->md); - CloseHandle(map->fd); - free(map); -} - -#else - - #error "Need mmap wrappers." - -#endif diff --git a/xpdev/xpmap.h b/xpdev/xpmap.h deleted file mode 100644 index 5f1ffd664c8ba3e16cd09b14b1d394c15da8c148..0000000000000000000000000000000000000000 --- a/xpdev/xpmap.h +++ /dev/null @@ -1,61 +0,0 @@ -/* mmap() style cross-platform development wrappers */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPMAP_H -#define _XPMAP_H - -#include "gen_defs.h" -#include "wrapdll.h" - -enum xpmap_type { - XPMAP_READ, - XPMAP_WRITE, - XPMAP_COPY -}; - -#if defined(__unix__) - -#include <sys/mman.h> -struct xpmapping { - void *addr; - int fd; - size_t size; -}; - -#elif defined(_WIN32) - -struct xpmapping { - void *addr; - HANDLE fd; - HANDLE md; - uint64_t size; -}; - -#else - - #error "Need mmap wrappers." - -#endif - -DLLEXPORT struct xpmapping* xpmap(const char *filename, enum xpmap_type type); -DLLEXPORT void xpunmap(struct xpmapping *map); - -#endif diff --git a/xpdev/xpprintf.c b/xpdev/xpprintf.c deleted file mode 100644 index 7f481e9cfee61fe4f56e83174515b03b832cce27..0000000000000000000000000000000000000000 --- a/xpdev/xpprintf.c +++ /dev/null @@ -1,1483 +0,0 @@ -/* xpprintf.c */ -// vi: tabstop=4 - -/* Deuce's vs[n]printf() replacement */ - -/* $Id: xpprintf.c,v 1.62 2018/04/07 07:21:46 rswindell Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#if defined(__linux__) && !defined(_GNU_SOURCE) - #define _GNU_SOURCE // asprintf() on Linux -#endif -#include <stdarg.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include "genwrap.h" /* alloca() */ - -#include "xpprintf.h" -#include "gen_defs.h" - -#if defined(_MSC_VER) || defined(__MSVCRT__) -int vasprintf(char **strptr, const char *format, va_list va) -{ - va_list va2; - int ret; - - if (strptr == NULL) - return -1; - va_copy(va2, va); - ret = _vscprintf(format, va); - *strptr = (char *)malloc(ret+1); - if (*strptr == NULL) { - va_end(va2); - return -1; - } - ret = vsprintf(*strptr, format, va2); - va_end(va2); - return ret; -} - -int asprintf(char **strptr, const char *format, ...) -{ - va_list va; - int ret; - - if (strptr == NULL) - return -1; - va_start(va, format); - ret=vasprintf(strptr, format, va); - va_end(va); - return ret; -} -#endif - -/* Maximum length of a format specifier including the % */ -#define MAX_FORMAT_LEN 256 - -void xp_asprintf_free(char *format) -{ - free(format); -} - -int xp_printf_get_type(const char *format) -{ - const char *p; - int modifier=0; - int j; - int correct_type=0; - - if(!*(size_t *)format) - return(0); - p=format+*(size_t *)format; - if(*p!='%') - return(0); - p++; - - /* - * Skip flags (zero or more) - */ - j=1; - while(j) { - switch(*p) { - case '#': - p++; - break; - case '-': - p++; - break; - case '+': - p++; - break; - case ' ': - p++; - break; - case '0': - p++; - break; - case '\'': - p++; - break; - default: - j=0; - break; - } - } - if(*p=='*') - return(XP_PRINTF_TYPE_INT); - while(*p>= '0' && *p <= '9') - p++; - if(*p=='.') { - p++; - if(*p=='*') - return(XP_PRINTF_TYPE_INT); - } - while(*p>= '0' && *p <= '9') - p++; - switch(*p) { - case 'h': - modifier='h'; - p++; - if(*p=='h') { - p++; - modifier+='h'<<8; - } - break; - case 'l': - modifier='l'; - p++; - if(*p=='l') { - p++; - modifier+='l'<<8; - } - break; - case 'j': - modifier='j'; - p++; - break; - case 't': - modifier='t'; - p++; - break; - case 'z': - modifier='z'; - p++; - break; - case 'L': - modifier='L'; - p++; - break; - } - /* - * The next char is now the type... if type is auto, - * set type to what it SHOULD be - */ - switch(*p) { - /* INT types */ - case 'd': - case 'i': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_SCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_SHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_LONG; - break; -#if defined(XP_PRINTF_TYPE_ULONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_LONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_INTMAX; - break; - case 't': - correct_type=XP_PRINTF_TYPE_PTRDIFF; - break; - case 'z': - /* - * ToDo this is a signed type of same size - * as size_t - */ - correct_type=XP_PRINTF_TYPE_LONG; - break; - default: - correct_type=XP_PRINTF_TYPE_INT; - break; - } - break; - case 'o': - case 'u': - case 'x': - case 'X': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_UCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_USHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_ULONG; - break; -#if defined(XP_PRINTF_TYPE_ULONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_ULONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_UINTMAX; - break; - case 't': - /* - * ToDo this is an unsigned type of same size - * as ptrdiff_t - */ - correct_type=XP_PRINTF_TYPE_ULONG; - break; - case 'z': - correct_type=XP_PRINTF_TYPE_SIZET; - break; - default: - correct_type=XP_PRINTF_TYPE_UINT; - break; - } - break; - case 'a': - case 'A': - case 'e': - case 'E': - case 'f': - case 'F': - case 'g': - case 'G': - switch(modifier) { - case 'L': - correct_type=XP_PRINTF_TYPE_LONGDOUBLE; - break; - case 'l': - default: - correct_type=XP_PRINTF_TYPE_DOUBLE; - break; - } - break; - case 'C': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHAR; - break; - case 'c': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHAR; - } - break; - case 'S': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHARP; - break; - case 's': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHARP; - } - break; - case 'p': - correct_type=XP_PRINTF_TYPE_VOIDP; - break; - } - return(correct_type); -} - -/* - * Performs the next replacement in format using the variable - * specified as the only vararg which is currently the type - * specified in type (defined in xpprintf.h). - * - * Does not currently support the $ argument selector. - * - * Currently, the type is not overly useful, but this could be used for - * automatic type conversions (ie: int to char *). Right now it just assures - * that the type passed to sprintf() is the type passed to - * xp_asprintf_next(). - */ -char* xp_asprintf_next(char *format, int type, ...) -{ - va_list vars; - char *p; - char *newbuf; - int i=0,j; - unsigned int ui=0; - long int l=0; - unsigned long int ul=0; -#if defined(XP_PRINTF_TYPE_LONGLONG) - long long int ll=0; - unsigned long long int ull=0; -#endif - double d=0; - long double ld=0; - char* cp=NULL; - void* pntr=NULL; - size_t s=0; - unsigned long offset=0; - unsigned long offset2=0; - size_t format_len; - size_t this_format_len; - char int_buf[MAX_FORMAT_LEN]; - char *entry; - char this_format[MAX_FORMAT_LEN]; - char *fmt; - int modifier=0; - int correct_type=0; - char num_str[128]; /* More than enough room for a 256-bit int */ - - /* - * Check if we're already done... - */ - if(!*(size_t *) format) - return(format); - - p=format+*(size_t *)format; - offset=p-format; - format_len=*(size_t *)(format+sizeof(size_t))+sizeof(size_t)*2+1; - this_format[0]=0; - fmt=this_format; - *(fmt++)=*(p++); - - /* - * Skip flags (zero or more) - */ - j=1; - while(j) { - switch(*p) { - case '#': - *(fmt++)=*(p++); - break; - case '-': - *(fmt++)=*(p++); - break; - case '+': - *(fmt++)=*(p++); - break; - case ' ': - *(fmt++)=*(p++); - break; - case '0': - *(fmt++)=*(p++); - break; - case '\'': - *(fmt++)=*(p++); - break; - default: - j=0; - break; - } - } - - /* - * If width is '*' then the argument is an int - * which specifies the width. - */ - if(*p=='*') { /* The argument is this width */ - va_start(vars, type); - i=sprintf(int_buf,"%d", va_arg(vars, int)); - va_end(vars); - if(i > 1) { - /* - * We must calculate this before we go mucking about - * with format and p - */ - offset2=p-format; - newbuf=(char *)realloc(format, format_len+i-1 /* -1 for the '*' that's already there */); - if(newbuf==NULL) - return(NULL); - format=newbuf; - p=format+offset2; - /* - * Move trailing end to make space... leaving the * where it - * is so it can be overwritten - */ - memmove(p+i, p+1, format-p+format_len-1); - memcpy(p, int_buf, i); - *(size_t *)(format+sizeof(size_t))+=i-1; - } - else - *p=int_buf[0]; - p=format+offset; - *(size_t *)format=p-format; - return(format); - } - /* Skip width */ - while(*p >= '0' && *p <= '9') - *(fmt++)=*(p++); - /* Check for precision */ - if(*p=='.') { - *(fmt++)=*(p++); - /* - * If the precision is '*' then the argument is an int which - * specifies the precision. - */ - if(*p=='*') { - va_start(vars, type); - i=sprintf(int_buf,"%d", va_arg(vars, int)); - va_end(vars); - if(i > 1) { - /* - * We must calculate this before we go mucking about - * with format and p - */ - offset2=p-format; - newbuf=(char *)realloc(format, format_len+i-1 /* -1 for the '*' that's already there */); - if(newbuf==NULL) - return(NULL); - format=newbuf; - p=format+offset2; - /* - * Move trailing end to make space... leaving the * where it - * is so it can be overwritten - */ - memmove(p+i, p+1, format-p+format_len-1); - memcpy(p, int_buf, i); - *(size_t *)(format+sizeof(size_t))+=i-1; - } - else - *p=int_buf[0]; - p=format+offset; - *(size_t *)format=p-format; - return(format); - } - /* Skip precision */ - while(*p >= '0' && *p <= '9') - *(fmt++)=*(p++); - } - - /* Skip/Translate length modifiers */ - /* - * ToDo: This could (should?) convert the standard ll modifier - * to the MSVC equivilant (I64 or something?) - * if you do this, the calculations using this_format_len will need - * rewriting. - */ - switch(*p) { - case 'h': - modifier='h'; - *(fmt++)=*(p++); - if(*p=='h') { - *(fmt++)=*(p++); - modifier+='h'<<8; - } - break; - case 'l': - modifier='l'; - *(fmt++)=*(p++); - if(*p=='l') { - *(fmt++)=*(p++); - modifier+='l'<<8; - } - break; - case 'j': - modifier='j'; - *(fmt++)=*(p++); - break; - case 't': - modifier='t'; - *(fmt++)=*(p++); - break; - case 'z': - modifier='z'; - *(fmt++)=*(p++); - break; - case 'L': - modifier='L'; - *(fmt++)=*(p++); - break; - } - - /* - * The next char is now the type... if type is auto, - * set type to what it SHOULD be - */ - if(type==XP_PRINTF_TYPE_AUTO || type & XP_PRINTF_CONVERT) { - switch(*p) { - /* INT types */ - case 'd': - case 'i': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_SCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_SHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_LONG; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_LONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_INTMAX; - break; - case 't': - correct_type=XP_PRINTF_TYPE_PTRDIFF; - break; - case 'z': - /* - * ToDo this is a signed type of same size - * as size_t - */ - correct_type=XP_PRINTF_TYPE_LONG; - break; - default: - correct_type=XP_PRINTF_TYPE_INT; - break; - } - break; - case 'o': - case 'u': - case 'x': - case 'X': - switch(modifier) { - case 'h'|'h'<<8: - correct_type=XP_PRINTF_TYPE_UCHAR; - break; - case 'h': - correct_type=XP_PRINTF_TYPE_USHORT; - break; - case 'l': - correct_type=XP_PRINTF_TYPE_ULONG; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case 'l'|'l'<<8: - correct_type=XP_PRINTF_TYPE_ULONGLONG; - break; -#endif - case 'j': - correct_type=XP_PRINTF_TYPE_UINTMAX; - break; - case 't': - /* - * ToDo this is an unsigned type of same size - * as ptrdiff_t - */ - correct_type=XP_PRINTF_TYPE_ULONG; - break; - case 'z': - correct_type=XP_PRINTF_TYPE_SIZET; - break; - default: - correct_type=XP_PRINTF_TYPE_UINT; - break; - } - break; - case 'a': - case 'A': - case 'e': - case 'E': - case 'f': - case 'F': - case 'g': - case 'G': - switch(modifier) { - case 'L': - correct_type=XP_PRINTF_TYPE_LONGDOUBLE; - break; - case 'l': - default: - correct_type=XP_PRINTF_TYPE_DOUBLE; - break; - } - break; - case 'C': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHAR; - break; - case 'c': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHAR; - } - break; - case 'S': - /* ToDo wide chars... not yet supported */ - correct_type=XP_PRINTF_TYPE_CHARP; - break; - case 's': - switch(modifier) { - case 'l': - /* ToDo wide chars... not yet supported */ - default: - correct_type=XP_PRINTF_TYPE_CHARP; - } - break; - case 'p': - correct_type=XP_PRINTF_TYPE_VOIDP; - break; - } - } - if(type==XP_PRINTF_TYPE_AUTO) - type=correct_type; - - /* - * Copy the arg to the passed type. - */ - va_start(vars, type); - switch(type & ~XP_PRINTF_CONVERT) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: /* Also includes char and short */ - i=va_arg(vars, int); - break; - case XP_PRINTF_TYPE_UINT: /* Also includes char and short */ - /* - * ToDo: If it's a %c, and the value is 0, should it output [null] - * or should it terminate the string? - */ - ui=va_arg(vars, unsigned int); - break; - case XP_PRINTF_TYPE_LONG: - l=va_arg(vars, long); - break; - case XP_PRINTF_TYPE_ULONG: - ul=va_arg(vars, unsigned long int); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ll=va_arg(vars, long long int); - break; - case XP_PRINTF_TYPE_ULONGLONG: - ull=va_arg(vars, unsigned long long int); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - cp=va_arg(vars, char*); - break; - case XP_PRINTF_TYPE_DOUBLE: - d=va_arg(vars, double); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ld=va_arg(vars, long double); - break; - case XP_PRINTF_TYPE_VOIDP: - pntr=va_arg(vars, void*); - break; - case XP_PRINTF_TYPE_SIZET: - s=va_arg(vars, size_t); - break; - } - va_end(vars); - - if(type & XP_PRINTF_CONVERT) { - type=type & ~XP_PRINTF_CONVERT; - if(type != correct_type) { - switch(correct_type) { - case XP_PRINTF_TYPE_CHAR: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - break; - case XP_PRINTF_TYPE_UINT: - i=ui; - break; - case XP_PRINTF_TYPE_LONG: - i=l; - break; - case XP_PRINTF_TYPE_ULONG: - i=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - i=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - i=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - if(cp) - i=*cp; - else - i=0; - break; - case XP_PRINTF_TYPE_DOUBLE: - i=(int)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - i=(int)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - i=(long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - i=s; - break; - } - break; - case XP_PRINTF_TYPE_INT: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - break; - case XP_PRINTF_TYPE_UINT: - i=ui; - break; - case XP_PRINTF_TYPE_LONG: - i=l; - break; - case XP_PRINTF_TYPE_ULONG: - i=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - i=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - i=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - i=strtol(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - i=(int)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - i=(int)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - i=(long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - i=s; - break; - } - break; - case XP_PRINTF_TYPE_UINT: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ui=i; - break; - case XP_PRINTF_TYPE_UINT: - break; - case XP_PRINTF_TYPE_LONG: - ui=l; - break; - case XP_PRINTF_TYPE_ULONG: - ui=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ui=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - ui=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - ui=strtoul(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ui=(unsigned)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ui=(unsigned)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ui=(unsigned long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - ui=s; - break; - } - break; - case XP_PRINTF_TYPE_LONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - l=i; - break; - case XP_PRINTF_TYPE_UINT: - l=ui; - break; - case XP_PRINTF_TYPE_LONG: - break; - case XP_PRINTF_TYPE_ULONG: - l=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - l=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - l=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - l=strtol(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - l=(long)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - l=(long)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - l=(long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - l=s; - break; - } - break; - case XP_PRINTF_TYPE_ULONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ul=i; - break; - case XP_PRINTF_TYPE_UINT: - ul=ui; - break; - case XP_PRINTF_TYPE_LONG: - ul=l; - break; - case XP_PRINTF_TYPE_ULONG: - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ul=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - ul=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - ul=strtoul(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ul=(unsigned long)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ul=(unsigned long)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ul=(unsigned long)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - ul=s; - break; - } - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ll=i; - break; - case XP_PRINTF_TYPE_UINT: - ll=ui; - break; - case XP_PRINTF_TYPE_LONG: - ll=l; - break; - case XP_PRINTF_TYPE_ULONG: - ll=ul; - break; - case XP_PRINTF_TYPE_LONGLONG: - break; - case XP_PRINTF_TYPE_ULONGLONG: - ll=ull; - break; - case XP_PRINTF_TYPE_CHARP: - ll=strtoll(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ll=d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ll=ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ll=(long long)((intptr_t)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - ll=s; - break; - } - break; - case XP_PRINTF_TYPE_ULONGLONG: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ull=i; - break; - case XP_PRINTF_TYPE_UINT: - ull=ui; - break; - case XP_PRINTF_TYPE_LONG: - ull=l; - break; - case XP_PRINTF_TYPE_ULONG: - ull=ul; - break; - case XP_PRINTF_TYPE_LONGLONG: - ull=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - break; - case XP_PRINTF_TYPE_CHARP: - ull=strtoull(cp, NULL, 0); - break; - case XP_PRINTF_TYPE_DOUBLE: - ull=d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - ull=ld; - break; - case XP_PRINTF_TYPE_VOIDP: - ull=(unsigned long long int)((uintptr_t)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - ull=s; - break; - } - break; -#endif - case XP_PRINTF_TYPE_CHARP: - num_str[0]=0; - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - sprintf(num_str, "%d", i); - cp=num_str; - break; - case XP_PRINTF_TYPE_UINT: - sprintf(num_str, "%u", i); - cp=num_str; - break; - case XP_PRINTF_TYPE_LONG: - sprintf(num_str, "%ld", l); - cp=num_str; - break; - case XP_PRINTF_TYPE_ULONG: - sprintf(num_str, "%lu", ul); - cp=num_str; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - /* ToDo MSVC doesn't like this */ - sprintf(num_str, "%lld", ll); - cp=num_str; - break; - case XP_PRINTF_TYPE_ULONGLONG: - /* ToDo MSVC doesn't like this */ - sprintf(num_str, "%llu", ull); - cp=num_str; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - break; - case XP_PRINTF_TYPE_DOUBLE: - sprintf(num_str, "%f", d); - cp=num_str; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - sprintf(num_str, "%Lf", ld); - cp=num_str; - break; - case XP_PRINTF_TYPE_VOIDP: - /* ToDo: Or should this pretend it's a char *? */ - sprintf(num_str, "%p", pntr); - cp=num_str; - break; - case XP_PRINTF_TYPE_SIZET: - sprintf(num_str, "%zu", s); - cp=num_str; - break; - } - break; - case XP_PRINTF_TYPE_DOUBLE: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - d=i; - break; - case XP_PRINTF_TYPE_UINT: - d=ui; - break; - case XP_PRINTF_TYPE_LONG: - d=l; - break; - case XP_PRINTF_TYPE_ULONG: - d=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - d=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - d=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - d=strtod(cp, NULL); - break; - case XP_PRINTF_TYPE_DOUBLE: - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - d=ld; - break; - case XP_PRINTF_TYPE_VOIDP: - d=(double)((long int)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - d=s; - break; - } - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - ld=i; - break; - case XP_PRINTF_TYPE_UINT: - ld=ui; - break; - case XP_PRINTF_TYPE_LONG: - ld=l; - break; - case XP_PRINTF_TYPE_ULONG: - ld=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - ld=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - ld=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - /* strtold() isn't ubiquitous yet */ - ld=strtod(cp, NULL); - break; - case XP_PRINTF_TYPE_DOUBLE: - ld=d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - break; - case XP_PRINTF_TYPE_VOIDP: - ld=(long double)((long int)pntr); - break; - case XP_PRINTF_TYPE_SIZET: - ld=s; - break; - } - break; - case XP_PRINTF_TYPE_VOIDP: - /* ToDo: this is nasty... */ - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - pntr=(void *)((intptr_t)i); - break; - case XP_PRINTF_TYPE_UINT: - pntr=(void *)((uintptr_t)ui); - break; - case XP_PRINTF_TYPE_LONG: - pntr=(void *)((intptr_t)l); - break; - case XP_PRINTF_TYPE_ULONG: - pntr=(void *)((uintptr_t)ul); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - pntr=(void *)((intptr_t)ll); - break; - case XP_PRINTF_TYPE_ULONGLONG: - pntr=(void *)((uintptr_t)ull); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - pntr=(void *)(cp); - break; - case XP_PRINTF_TYPE_DOUBLE: - pntr=(void *)((intptr_t)d); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - pntr=(void *)((intptr_t)ld); - break; - case XP_PRINTF_TYPE_VOIDP: - break; - case XP_PRINTF_TYPE_SIZET: - pntr=(void *)((intptr_t)s); - break; - } - break; - case XP_PRINTF_TYPE_SIZET: - switch(type) { - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: - s=i; - break; - case XP_PRINTF_TYPE_UINT: - s=ui; - break; - case XP_PRINTF_TYPE_LONG: - s=l; - break; - case XP_PRINTF_TYPE_ULONG: - s=ul; - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - s=ll; - break; - case XP_PRINTF_TYPE_ULONGLONG: - s=ull; - break; -#endif - case XP_PRINTF_TYPE_CHARP: - s=strtol(cp, NULL, 0); /* was strtoll */ - break; - case XP_PRINTF_TYPE_DOUBLE: - s=(size_t)d; - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - s=(size_t)ld; - break; - case XP_PRINTF_TYPE_VOIDP: - s=(size_t)pntr; - break; - case XP_PRINTF_TYPE_SIZET: - break; - } - break; - } - type=correct_type; - } - } - - /* The next char is now the type... check the length required to spore the printf()ed string */ - *(fmt++)=*p; - *fmt=0; - entry=NULL; - switch(type) { - case XP_PRINTF_TYPE_CHAR: /* Also includes char and short */ - case XP_PRINTF_TYPE_INT: /* Also includes char and short */ - j=asprintf(&entry, this_format, i); - break; - case XP_PRINTF_TYPE_UINT: /* Also includes char and short */ - j=asprintf(&entry, this_format, ui); - break; - case XP_PRINTF_TYPE_LONG: - j=asprintf(&entry, this_format, l); - break; - case XP_PRINTF_TYPE_ULONG: - j=asprintf(&entry, this_format, ul); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - j=asprintf(&entry, this_format, ll); - break; - case XP_PRINTF_TYPE_ULONGLONG: - j=asprintf(&entry, this_format, ull); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - if(cp==NULL) - j=asprintf(&entry, this_format, "<null>"); - else - j=asprintf(&entry, this_format, cp); - break; - case XP_PRINTF_TYPE_DOUBLE: - j=asprintf(&entry, this_format, d); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - j=asprintf(&entry, this_format, ld); - break; - case XP_PRINTF_TYPE_VOIDP: - j=asprintf(&entry, this_format, pntr); - break; - case XP_PRINTF_TYPE_SIZET: - j=asprintf(&entry, this_format, s); - break; - default: - j = -1; - entry = NULL; - break; - } - - if (j<0) { - FREE_AND_NULL(entry); - entry = strdup("<error>"); - j=strlen(entry); - } - - this_format_len=strlen(this_format); - if(j>=0) { - /* - * This isn't necessary if it's already the right size, - * or it's too large... this realloc() should only need to grow - * the string. - */ - if(format_len < (format_len-this_format_len+j)) { - newbuf=(char *)realloc(format, format_len-this_format_len+j); - if(newbuf==NULL) { - FREE_AND_NULL(entry); - return(NULL); - } - format=newbuf; - } - /* Move trailing end to make space */ - memmove(format+offset+j, format+offset+this_format_len, format_len-offset-this_format_len); - memcpy(format+offset, entry, j); - p=format+offset+j; - } - else - p=format+offset+this_format_len; - FREE_AND_NULL(entry); - - *(size_t *)(format+sizeof(size_t))=format_len-this_format_len+j-sizeof(size_t)*2-1; - - /* - * Search for next non-%% separateor and set offset - * to zero if none found for wrappers to know when - * they're done. - */ - for(; *p; p++) { - if(*p=='%') { - if(*(p+1) == '%') - p++; - else - break; - } - } - if(!*p) - *(size_t *)format=0; - else - *(size_t *)format=p-format; - return(format); -} - -char* xp_asprintf_start(const char *format) -{ - char *ret; - char *p; - - ret=(char *)malloc(strlen(format)+1+((sizeof(size_t)*2))); - if(ret==NULL) - return(NULL); - /* Place current offset at the start of the buffer */ - strcpy(ret+sizeof(size_t)*2,format); - /* Place the current length after the offset */ - *(size_t *)(ret+sizeof(size_t))=strlen(format); - - /* - * Find the next non %% format, leaving %% as it is - */ - for(p=ret+sizeof(size_t)*2; *p; p++) { - if(*p=='%') { - if(*(p+1) == '%') - p++; - else - break; - } - } - if(!*p) - *(size_t *)ret=0; - else - *(size_t *)ret=p-ret; - return(ret); -} - -char* xp_asprintf_end(char *format, size_t *lenret) -{ - char *p; - size_t len; - size_t end_len; - - len=*(size_t *)(format+sizeof(size_t)); - end_len=len; - for(p=format+sizeof(size_t)*2; len; p++, len--) { - if(*p=='%' && *(p+1)=='%') { - memmove(p, p+1, len--); - end_len--; - } - } - memmove(format, format+sizeof(size_t)*2, end_len+1); - if(lenret) - *lenret=end_len; - return(format); -} - -char* xp_vasprintf(const char *format, va_list va) -{ - char *working; - char *next; - int type; - - next=xp_asprintf_start(format); - if(next==NULL) - return(NULL); - working=next; - while(*(size_t *)working) { - type=xp_printf_get_type(working); - switch(type) { - case 0: - free(working); - return(NULL); - case XP_PRINTF_TYPE_CHAR: - case XP_PRINTF_TYPE_INT: /* Also includes char and short */ - next=xp_asprintf_next(working, type, va_arg(va, int)); - break; - case XP_PRINTF_TYPE_UINT: /* Also includes char and short */ - next=xp_asprintf_next(working, type, va_arg(va, unsigned int)); - break; - case XP_PRINTF_TYPE_LONG: - next=xp_asprintf_next(working, type, va_arg(va, long)); - break; - case XP_PRINTF_TYPE_ULONG: - next=xp_asprintf_next(working, type, va_arg(va, unsigned long)); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case XP_PRINTF_TYPE_LONGLONG: - next=xp_asprintf_next(working, type, va_arg(va, long long)); - break; - case XP_PRINTF_TYPE_ULONGLONG: - next=xp_asprintf_next(working, type, va_arg(va, unsigned long long)); - break; -#endif - case XP_PRINTF_TYPE_CHARP: - next=xp_asprintf_next(working, type, va_arg(va, char *)); - break; - case XP_PRINTF_TYPE_DOUBLE: - next=xp_asprintf_next(working, type, va_arg(va, double)); - break; - case XP_PRINTF_TYPE_LONGDOUBLE: - next=xp_asprintf_next(working, type, va_arg(va, long double)); - break; - case XP_PRINTF_TYPE_VOIDP: - next=xp_asprintf_next(working, type, va_arg(va, void *)); - break; - case XP_PRINTF_TYPE_SIZET: - next=xp_asprintf_next(working, type, va_arg(va, size_t)); - break; - } - if(next==NULL) { - free(working); - return(NULL); - } - working=next; - } - next=xp_asprintf_end(working, NULL); - if(next==NULL) { - free(working); - return(NULL); - } - return(next); -} - -char* xp_asprintf(const char *format, ...) -{ - char *ret; - va_list va; - - va_start(va, format); - ret=xp_vasprintf(format, va); - va_end(va); - return(ret); -} - -#if defined(XP_PRINTF_TEST) - -int main(int argc, char *argv[]) -{ - char *format; - char *p; - int i,j; -#if defined(XP_PRINTF_TYPE_LONGLONG) - long long L; -#endif - long l; - char *cp; - double d; - float f; - long double D; - - p=xp_asprintf("%%%%%*.*f %% %%%ss %cs %*.*lu",3,3,123.123456789,"%llutesting%",32,3,3,123); - printf("%s\n",p); - free(p); - if(argc < 2) - return(1); - - format=argv[1]; - format=xp_asprintf_start(format); - for(j=2; j<argc; j++) { - switch(argv[j][0]) { - case 'f': - f=(float)atof(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_FLOAT,f); - break; - case 'd': - d=atof(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,d); - break; - case 'D': - /* Don't know of a thing that converts a string to a long double */ - D=atof(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONGDOUBLE,D); - break; - case 'i': - i=atoi(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,i); - break; - case 'l': - l=atol(argv[j]+1); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONG,l); - break; -#if defined(XP_PRINTF_TYPE_LONGLONG) - case 'L': - L=strtoll(argv[j]+1, NULL, 10); - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONGLONG,L); - break; -#endif - case 's': - cp=argv[j]+1; - p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_CHARP,cp); - break; - } - if(p==NULL) { - printf("Failed converting on item after %s\n",format); - return(1); - } - format=p; - } - p=xp_asprintf_end(format, NULL); - printf("At end, value is: '%s'\n",p); - free(p); -} - -#endif diff --git a/xpdev/xpprintf.h b/xpdev/xpprintf.h deleted file mode 100644 index 940c68ec4136b3220aba817e606914e1390e382b..0000000000000000000000000000000000000000 --- a/xpdev/xpprintf.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Deuce's vs[n]printf() replacement */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XPPRINTF_H_ -#define _XPPRINTF_H_ - -#include <stdarg.h> -#include "wrapdll.h" - -/* Supported printf argument types */ -#define XP_PRINTF_TYPE_AUTO 0 -#define XP_PRINTF_TYPE_INT 1 -#define XP_PRINTF_TYPE_UINT 2 -#define XP_PRINTF_TYPE_CHAR 3 /* Assumes a signed char */ -#define XP_PRINTF_TYPE_SCHAR XP_PRINTF_TYPE_INT -#define XP_PRINTF_TYPE_UCHAR XP_PRINTF_TYPE_UINT -#define XP_PRINTF_TYPE_SHORT XP_PRINTF_TYPE_INT -#define XP_PRINTF_TYPE_USHORT XP_PRINTF_TYPE_UINT -#define XP_PRINTF_TYPE_LONG 4 -#define XP_PRINTF_TYPE_ULONG 5 -#if !defined(_MSC_VER) && !defined(__BORLANDC__) - #define XP_PRINTF_TYPE_LONGLONG 6 - #define XP_PRINTF_TYPE_ULONGLONG 7 -#endif -#define XP_PRINTF_TYPE_CHARP 8 -#define XP_PRINTF_TYPE_DOUBLE 9 -#define XP_PRINTF_TYPE_FLOAT XP_PRINTF_TYPE_DOUBLE /* Floats are promoted to doubles */ -#define XP_PRINTF_TYPE_LONGDOUBLE 10 -#define XP_PRINTF_TYPE_VOIDP 11 -#define XP_PRINTF_TYPE_INTMAX 12 /* Not currently implemented */ -#define XP_PRINTF_TYPE_UINTMAX 13 /* Not currently implemented */ -#define XP_PRINTF_TYPE_PTRDIFF 14 /* Not currently implemented */ -#define XP_PRINTF_TYPE_SIZET 15 - -#define XP_PRINTF_CONVERT (1<<31) /* OR with type to request a conversion - Not implemented */ - -#if defined(__cplusplus) -extern "C" { -#endif -DLLEXPORT void xp_asprintf_free(char *format); -DLLEXPORT char* xp_asprintf_start(const char *format); -DLLEXPORT char* xp_asprintf_next(char *format, int type, ...); -DLLEXPORT char* xp_asprintf_end(char *format, size_t *endlen); -DLLEXPORT char* xp_asprintf(const char *format, ...); -DLLEXPORT char* xp_vasprintf(const char *format, va_list va); -DLLEXPORT int xp_printf_get_type(const char *format); -#if defined(_MSC_VER) || defined(__MSVCRT__) || defined(__BORLANDC__) -DLLEXPORT int vasprintf(char **strptr, const char *format, va_list va); -DLLEXPORT int asprintf(char **strptr, const char *format, ...); -#endif - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/xpdev/xpsem.c b/xpdev/xpsem.c deleted file mode 100644 index 2c63ce7a683155a922f73e2b7b60a40e79639ddd..0000000000000000000000000000000000000000 --- a/xpdev/xpsem.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * $Id: xpsem.c,v 1.13 2012/01/26 01:44:02 deuce Exp $ - * - * Copyright (C) 2000 Jason Evans <jasone@freebsd.org>. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice(s), this list of conditions and the following disclaimer as - * the first lines of this file unmodified other than the possible - * addition of one or more copyright notices. - * 2. Redistributions in binary form must reproduce the above copyright - * notice(s), this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/lib/libc_r/uthread/uthread_sem.c,v 1.3.2.1 2000/07/18 02:05:57 jasone Exp $ - */ - -#include <errno.h> -#include "xpsem.h" -#include <pthread.h> -#include <sys/time.h> -#include <stdlib.h> -#include "gen_defs.h" -#include "genwrap.h" - -int -xp_sem_init(xp_sem_t *sem, int pshared, unsigned int value) -{ - int retval; - - /* - * Range check the arguments. - */ - if (pshared != 0) { - /* - * The user wants a semaphore that can be shared among - * processes, which this implementation can't do. Sounds like a - * permissions problem to me (yeah right). - */ - errno = EPERM; - retval = -1; - goto RETURN; - } - - if (value > XP_SEM_VALUE_MAX) { - errno = EINVAL; - retval = -1; - goto RETURN; - } - - *sem = (xp_sem_t)malloc(sizeof(struct xp_sem)); - if (*sem == NULL) { - errno = ENOSPC; - retval = -1; - goto RETURN; - } - - /* - * Initialize the semaphore. - */ - if (pthread_mutex_init(&(*sem)->lock, NULL) != 0) { - free(*sem); - errno = ENOSPC; - retval = -1; - goto RETURN; - } - - if (pthread_cond_init(&(*sem)->gtzero, NULL) != 0) { - while(pthread_mutex_destroy(&(*sem)->lock)==EBUSY) - SLEEP(1); - free(*sem); - errno = ENOSPC; - retval = -1; - goto RETURN; - } - - (*sem)->count = (uint32_t)value; - (*sem)->nwaiters = 0; - (*sem)->magic = XP_SEM_MAGIC; - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_destroy(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - /* Make sure there are no waiters. */ - pthread_mutex_lock(&(*sem)->lock); - if ((*sem)->nwaiters > 0) { - pthread_mutex_unlock(&(*sem)->lock); - errno = EBUSY; - retval = -1; - goto RETURN; - } - pthread_mutex_unlock(&(*sem)->lock); - - while(pthread_mutex_destroy(&(*sem)->lock)==EBUSY) - SLEEP(1); - while(pthread_cond_destroy(&(*sem)->gtzero)==EBUSY) - SLEEP(1); - (*sem)->magic = 0; - - free(*sem); - - retval = 0; - RETURN: - return retval; -} - -xp_sem_t * -xp_sem_open(const char *name, int oflag, ...) -{ - errno = ENOSYS; - return XP_SEM_FAILED; -} - -int -xp_sem_close(xp_sem_t *sem) -{ - errno = ENOSYS; - return -1; -} - -int -xp_sem_unlink(const char *name) -{ - errno = ENOSYS; - return -1; -} - -int -xp_sem_wait(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - while ((*sem)->count == 0) { - (*sem)->nwaiters++; - pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock); - (*sem)->nwaiters--; - } - (*sem)->count--; - - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - - return retval; -} - -int -xp_sem_trywait(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - if ((*sem)->count > 0) { - (*sem)->count--; - retval = 0; - } else { - errno = EAGAIN; - retval = -1; - } - - pthread_mutex_unlock(&(*sem)->lock); - - RETURN: - return retval; -} - -int -xp_sem_post(xp_sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - (*sem)->count++; - if ((*sem)->nwaiters > 0) { - /* - * We must use pthread_cond_broadcast() rather than - * pthread_cond_signal() in order to assure that the highest - * priority thread is run by the scheduler, since - * pthread_cond_signal() signals waiting threads in FIFO order. - */ - pthread_cond_broadcast(&(*sem)->gtzero); - } - - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_getvalue(xp_sem_t *sem, int *sval) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - *sval = (int)(*sem)->count; - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_setvalue(xp_sem_t *sem, int sval) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - (*sem)->count=(uint32_t)sval; - if (((*sem)->nwaiters > 0) && sval) { - /* - * We must use pthread_cond_broadcast() rather than - * pthread_cond_signal() in order to assure that the highest - * priority thread is run by the scheduler, since - * pthread_cond_signal() signals waiting threads in FIFO order. - */ - pthread_cond_broadcast(&(*sem)->gtzero); - } - pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -xp_sem_timedwait(xp_sem_t *sem, const struct timespec *abs_timeout) -{ - int retval=0; - - _SEM_CHECK_VALIDITY(sem); - - pthread_mutex_lock(&(*sem)->lock); - - while ((*sem)->count == 0) { - (*sem)->nwaiters++; - retval=pthread_cond_timedwait(&(*sem)->gtzero, &(*sem)->lock, abs_timeout); - (*sem)->nwaiters--; - if(retval) { - errno=retval; - retval=-1; - break; - } - } - if(retval==0) - (*sem)->count--; - - pthread_mutex_unlock(&(*sem)->lock); - - RETURN: - - return retval; -} diff --git a/xpdev/xpsem.h b/xpdev/xpsem.h deleted file mode 100644 index 1caa83c011577916a3026dd64b8c1b369b210f61..0000000000000000000000000000000000000000 --- a/xpdev/xpsem.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef _XPSEM_H_ -#define _XPSEM_H_ - -/* - * $Id: xpsem.h,v 1.10 2012/01/26 01:44:02 deuce Exp $ - * - * semaphore.h: POSIX 1003.1b semaphores -*/ - -/*- - * Copyright (c) 1996, 1997 - * HD Associates, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by HD Associates, Inc - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/sys/posix4/semaphore.h,v 1.6 2000/01/20 07:55:42 jasone Exp $ - */ - -#include <limits.h> - -#include <sys/types.h> -#include <fcntl.h> -#include <pthread.h> -#include <inttypes.h> - -/* Opaque type definition. */ -struct xp_sem; -typedef struct xp_sem *xp_sem_t; - -#define XP_SEM_FAILED ((xp_sem_t *)0) -#define XP_SEM_VALUE_MAX UINT_MAX - -#if defined(__solaris__) -typedef unsigned int uint32_t; -#endif - -#if defined(__cplusplus) -extern "C" { -#endif -int xp_sem_init (xp_sem_t *, int, unsigned int); -int xp_sem_destroy (xp_sem_t *); -xp_sem_t *xp_sem_open (const char *, int, ...); -int xp_sem_close (xp_sem_t *); -int xp_sem_unlink (const char *); -int xp_sem_wait (xp_sem_t *); -int xp_sem_trywait (xp_sem_t *); -int xp_sem_post (xp_sem_t *); -int xp_sem_getvalue (xp_sem_t *, int *); -int xp_sem_setvalue (xp_sem_t *, int); -int xp_sem_timedwait (xp_sem_t *sem, const struct timespec *abs_timeout); -#if defined(__cplusplus) -} -#endif - -/* -* $Id: xpsem.h,v 1.10 2012/01/26 01:44:02 deuce Exp $ -*/ - -/* Begin thread_private.h kluge */ -/* - * These come out of (or should go into) thread_private.h - rather than have - * to copy (or symlink) the files from the source tree these definitions are - * inlined here. Obviously these go away when this module is part of libc. -*/ - -struct xp_sem { -#define XP_SEM_MAGIC ((uint32_t) 0x09fa4012) - uint32_t magic; - pthread_mutex_t lock; - pthread_cond_t gtzero; - uint32_t count; - uint32_t nwaiters; -}; - -extern pthread_once_t _thread_init_once; -extern int _threads_initialized; -extern void _thread_init (void); -#define THREAD_INIT() \ - (void) pthread_once(&_thread_init_once, _thread_init) -#define THREAD_SAFE() \ - (_threads_initialized != 0) - -#define _SEM_CHECK_VALIDITY(sem) \ - if (sem==NULL || (*(sem))->magic != XP_SEM_MAGIC) { \ - errno = EINVAL; \ - retval = -1; \ - goto RETURN; \ - } - -struct pthread_rwlockattr { - int pshared; - }; - -/* End thread_private.h kluge */ - -#endif /* _XPSEM_H_ */ diff --git a/xpdev/xptime.c b/xpdev/xptime.c deleted file mode 100644 index faa51a666aa233b0aed2887d3fe50948bacf68fc..0000000000000000000000000000000000000000 --- a/xpdev/xptime.c +++ /dev/null @@ -1,98 +0,0 @@ -/* $Id: xptime.c,v 1.4 2018/02/14 20:44:00 deuce Exp $ */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#ifndef __unix__ -#include <dos.h> -#endif -#include <ctype.h> -#define USE_SNPRINTF /* we don't need safe_snprintf for this project */ -#include "genwrap.h" -#include "datewrap.h" -#include "xpdatetime.h" - -int main(int argc, char **argv) -{ - char str[256]; - char revision[16]; - time_t t; - struct tm* tp; - struct tm tm; - int argn=1; - xpDateTime_t xpDateTime; - - printf("\n"); - DESCRIBE_COMPILER(str); - sscanf("$Revision: 1.4 $", "%*s %s", revision); - - printf("Rev %s Built " __DATE__ " " __TIME__ " with %s\n\n", revision, str); - - if(argc<2) - printf("usage: xptime [-z] <date_str || time_t>\n\n"); - - if(argc>1 && stricmp(argv[1],"-z")==0) { /* zulu/GMT/UTC timezone */ - printf("Setting timezone to Zulu/GMT/UTC\n\n"); - putenv("TZ=UTC0"); - argn++; - } - tzset(); - - if((t=checktime())!=0L) - printf("!time() result diverges from standard by: %ld seconds\n\n",t); - - printf("Current timezone: %d\n", xpTimeZone_local()); - printf("\n"); - - if(argc>argn && strlen(argv[argn]) > 10) { - xpDateTime=isoDateTimeStr_parse(argv[argn]); - t=xpDateTime_to_time(xpDateTime); - printf("Using specified date and time:\n"); - } else if(argc>argn) { - printf("Using specified time_t value:\n"); - t=strtoul(argv[argn],NULL,0); - xpDateTime=time_to_xpDateTime(t,xpTimeZone_LOCAL); - } else { - printf("Using current time:\n"); - xpDateTime=xpDateTime_now(); - t=time(NULL); - } - printf("%-8s %-10ld (0x%08lX) ISO %s\n" - ,"time_t" - ,(long)t, (long)t - ,xpDateTime_to_isoDateTimeStr(xpDateTime - ,NULL, " ", NULL - ,/* precision: */3 - , str, sizeof(str))); - { - const char* fmt="%-8s %.24s ISO %s\n"; - - if((tp=localtime_r(&t, &tm))==NULL) - printf("localtime() failure\n"); - else - printf(fmt - ,"local" - ,asctime(tp) - ,xpDateTime_to_isoDateTimeStr( - time_to_xpDateTime(t, xpTimeZone_LOCAL) - ,NULL, " ", NULL - ,/*precision: */0 - ,str, sizeof(str)) - ); - if((tp=gmtime_r(&t, &tm))==NULL) - printf("gmtime() failure\n"); - else - printf(fmt - ,"GMT" - ,asctime(tp) - ,xpDateTime_to_isoDateTimeStr( - gmtime_to_xpDateTime(t) - ,NULL, " ", NULL - ,/*precision: */0 - ,str, sizeof(str)) - ); - } - - return(0); -}