diff --git a/art/Blaec-gw22P.ttf b/art/Blaec-gw22P.ttf new file mode 100644 index 000000000..f2222e1c5 Binary files /dev/null and b/art/Blaec-gw22P.ttf differ diff --git a/art/ending.svg b/art/ending.svg new file mode 100644 index 000000000..784873f21 --- /dev/null +++ b/art/ending.svg @@ -0,0 +1,160 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/art/logo.svg b/art/logo.svg new file mode 100644 index 000000000..b023d27f2 --- /dev/null +++ b/art/logo.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + diff --git a/common/include/Common.h b/common/include/Common.h index 3979930ac..97f6eb835 100644 --- a/common/include/Common.h +++ b/common/include/Common.h @@ -43,20 +43,25 @@ struct StaticBuffer { size_t size; }; +#ifndef USE_CUSTOM_MEMORY_HANDLER +#ifndef NO_DYNAMIC_MEMORY_ALLOC void *allocMem(size_t sizeInBytes, enum MemoryType type, uint8_t clearAfterAlloc); void disposeMem(void* ptr); +#endif void memCopyToFrom(void* dst, void* src, size_t sizeInBytes); void memFill(void* dst, uint8_t val, size_t sizeInBytes); +#endif +#ifdef ENDIANESS_AWARE uint8_t isBigEndian(void); -void initFileReader(const char * dataFilePath); - uint32_t toNativeEndianess(const uint32_t val); +#endif +int countLines(const char* text); extern const char *mainText; extern char *textBuffer; @@ -70,6 +75,9 @@ extern size_t biggestOption; #define TEXT_BUFFER_SIZE (40 * 25) + +#ifndef USE_OWN_MIN_MAX + #ifndef SMD #ifndef WIN32 #ifndef LEAN_BUILD @@ -80,3 +88,5 @@ extern size_t biggestOption; #endif #endif + +#endif diff --git a/common/include/Dungeon.h b/common/include/Dungeon.h index 840237d67..c184b7ca4 100644 --- a/common/include/Dungeon.h +++ b/common/include/Dungeon.h @@ -10,7 +10,7 @@ struct GameSnapshot { struct Vec2i playerTarget; }; -struct GameSnapshot dungeon_tick(const enum ECommand cmd); +struct GameSnapshot dungeonTick(const enum ECommand command); void dungeon_loadMap( const uint8_t *__restrict__ mapData, diff --git a/common/include/Engine.h b/common/include/Engine.h index c3ee8c52e..b870bbeb8 100644 --- a/common/include/Engine.h +++ b/common/include/Engine.h @@ -63,8 +63,6 @@ enum EGameMenuState HackingScreen_tickCallback(enum ECommand, void* data); void HackingScreen_unloadStateCallback(enum EGameMenuState newState); -int countLines(void); - void enterState(enum EGameMenuState State); int loopTick(enum ECommand cmd); diff --git a/common/include/Enums.h b/common/include/Enums.h index 49c2e81e3..bc33a8e70 100644 --- a/common/include/Enums.h +++ b/common/include/Enums.h @@ -12,7 +12,8 @@ enum EDirection { enum CrawlerState { kCrawlerGameOver = -1, kCrawlerQuit = 0, - kCrawlerGameInProgress = 1 + kCrawlerGameInProgress = 1, + kCrawlerGameFinished = 2 }; enum ECommand { diff --git a/common/include/UI.h b/common/include/UI.h index b7f6568a4..542634cba 100644 --- a/common/include/UI.h +++ b/common/include/UI.h @@ -37,7 +37,7 @@ enum EGameMenuState handleCursor(const enum EGameMenuState* options, const enum ECommand cmd, enum EGameMenuState backState); -void drawGraphic(const uint8_t *shapes); +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *shapes); extern int8_t cursorPosition; diff --git a/common/src/CTile3DProperties.c b/common/src/CTile3DProperties.c index 3fb6fafef..a9701c206 100644 --- a/common/src/CTile3DProperties.c +++ b/common/src/CTile3DProperties.c @@ -97,7 +97,7 @@ void loadPropertyList(const char *propertyFile, struct MapWithCharKey *map, stru uint8_t len = *(bufferHead++); char* meshName = (char*)allocMem(len + 1, GENERAL_MEMORY, 1); - memcpy(meshName, bufferHead, len); + memCopyToFrom(meshName, (char*)bufferHead, len); mesh = (struct Mesh*)allocMem(sizeof(struct Mesh), GENERAL_MEMORY, 1); sprintf(&meshNameWithExtension[0], "%s.mdl", meshName); loadMesh(mesh, &meshNameWithExtension[0]); diff --git a/common/src/Common.c b/common/src/Common.c index f98618489..11b2a14a2 100644 --- a/common/src/Common.c +++ b/common/src/Common.c @@ -43,7 +43,7 @@ #ifndef USE_CUSTOM_MEMORY_HANDLER - +#ifndef NO_DYNAMIC_MEMORY_ALLOC void *allocMem(size_t sizeInBytes, enum MemoryType type, uint8_t clearAfterAlloc) { /* For the general allocator, we're not worried about the type of memory. It all comes from the @@ -60,7 +60,7 @@ void *allocMem(size_t sizeInBytes, enum MemoryType type, uint8_t clearAfterAlloc if (clearAfterAlloc) { memset(ptr, 0, sizeInBytes); } - + (void)type; return ptr; @@ -74,7 +74,7 @@ void disposeMem(void *ptr) { #endif } - +#endif void memCopyToFrom(void *dst, void *src, size_t sizeInBytes) { memcpy(dst, src, sizeInBytes); } @@ -112,3 +112,27 @@ uint32_t toNativeEndianess(const uint32_t val) { return val2; } #endif + + +int countLines(const char* text) { + int lines = 1; + int chars = 0; + + while(*text) { + ++chars; + + if ( +#ifdef XRES_FRAMEBUFFER + (chars >= (XRES_FRAMEBUFFER / 8)) || +#endif + *text == '\n') { + ++lines; + chars = 0; + } + + ++text; + } + + + return lines; +} diff --git a/common/src/Crawler.c b/common/src/Crawler.c index a94162814..e526e70e7 100644 --- a/common/src/Crawler.c +++ b/common/src/Crawler.c @@ -131,8 +131,8 @@ void Crawler_repaintCallback(void) { /* The dithered filter on top of the 3D rendering*/ fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF000000), TRUE); - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 3, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 4, biggestOption + 2, (optionsHeight / 8) + 2, AbandonMission_Title, diff --git a/common/src/CreditsScreen.c b/common/src/CreditsScreen.c index 7bb58279b..b62fe36b9 100644 --- a/common/src/CreditsScreen.c +++ b/common/src/CreditsScreen.c @@ -11,6 +11,14 @@ #include "UI.h" #include "Engine.h" +#ifndef MONOCHROME_VECTORS +#include "FixP.h" +#include "Vec.h" +#include "Mesh.h" +#include "CActor.h" +#include "Renderer.h" +#endif + extern int8_t cursorPosition; extern const char *mainText; const char *CreditsScreen_options[1] = {"Back"}; @@ -21,22 +29,25 @@ enum EGameMenuState CreditsScreen_nextStateNavigation[1] = { void CreditsScreen_initStateCallback(enum EGameMenuState tag) { (void)tag; - mainText = "Made by Daniel \n\"MontyOnTheRun\" Monteiro, with the help of many\npeople. Please check\nCREDITS.TXT" - " on the source code tree for further\nacknowledgements."; + mainText = "Made by Daniel \"MontyOnTheRun\" Monteiro, with the help of many people. Please check CREDITS.TXT" + " on the source code tree for further acknowledgements."; } void CreditsScreen_repaintCallback(void) { if (firstFrameOnCurrentState) { clearScreen(); + +#ifndef MONOCHROME_VECTORS + fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); +#endif + if (mainText != NULL) { drawTextWindow(1, 1, (XRES_FRAMEBUFFER / 8) - 4, 10, "Credits", mainText); } } - - - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 7 - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - (1) - 4, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 7 - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - (1) - 5, 7 + 2, 3, "Credits", CreditsScreen_options, 1, cursorPosition); } diff --git a/common/src/Dungeon.c b/common/src/Dungeon.c index 63f486a64..6d58e4869 100644 --- a/common/src/Dungeon.c +++ b/common/src/Dungeon.c @@ -46,7 +46,7 @@ uint8_t isPositionAllowed(int8_t x, int8_t y) { && collisionMap[LEVEL_MAP(x, y)] != '1'; } -struct GameSnapshot dungeon_tick(const enum ECommand command) { +struct GameSnapshot dungeonTick(const enum ECommand command) { int currentPlayerRoom; int cell; struct WorldPosition worldPos; @@ -295,18 +295,22 @@ struct GameSnapshot dungeon_tick(const enum ECommand command) { switch (getGameStatus()) { case kBadVictory: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kBadVictoryEpilogue); return gameSnapshot; case kBadGameOver: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kBadGameOverEpilogue); return gameSnapshot; case kGoodVictory: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kGoodVictoryEpilogue); return gameSnapshot; case kGoodGameOver: + gameSnapshot.should_continue = kCrawlerGameFinished; enterState(kGoodGameOverEpilogue); return gameSnapshot; default: diff --git a/common/src/Engine.c b/common/src/Engine.c index 69bc1b4b5..53fda09fb 100644 --- a/common/src/Engine.c +++ b/common/src/Engine.c @@ -97,8 +97,14 @@ void enterState(enum EGameMenuState newState) { #endif } - currentGameMenuState = newState; initStateCallback(newState); + + if (newState == kBackToGame) { + newState = kPlayGame; + } + + currentGameMenuState = newState; + firstFrameOnCurrentState = 1; } diff --git a/common/src/Events.c b/common/src/Events.c index 768f2dbcd..c78d2682b 100644 --- a/common/src/Events.c +++ b/common/src/Events.c @@ -66,7 +66,7 @@ void onLevelLoaded(int index) { void tickMission(enum ECommand cmd) { - struct GameSnapshot snapshot = dungeon_tick(cmd); + struct GameSnapshot snapshot = dungeonTick(cmd); x = snapshot.camera_x; z = snapshot.camera_z; @@ -147,6 +147,10 @@ int loopTick(enum ECommand command) { tickMission(command); + if (crawlerGameState == kCrawlerGameFinished) { + return kCrawlerGameFinished; + } + if (gameTicks != 0) { yCameraOffset = ((struct CTile3DProperties *) getFromMap(&tileProperties, LEVEL_MAP(x, z)))->mFloorHeight - diff --git a/common/src/GameMenu.c b/common/src/GameMenu.c index 01a23de49..d28a4c5af 100644 --- a/common/src/GameMenu.c +++ b/common/src/GameMenu.c @@ -137,8 +137,8 @@ void GameMenu_repaintCallback(void) { drawTextWindow(1, 1, (XRES_FRAMEBUFFER / 8) - 2, (YRES_FRAMEBUFFER / 8) - 5, GameMenu_StateTitle, textBuffer); } - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 3, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - biggestOption - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - (optionsHeight / 8) - 4, biggestOption + 2, (optionsHeight / 8) + 2, GameMenu_StateTitle, diff --git a/common/src/HackingMinigameRules.c b/common/src/HackingMinigameRules.c index d00eeb90a..998f084ca 100644 --- a/common/src/HackingMinigameRules.c +++ b/common/src/HackingMinigameRules.c @@ -1,13 +1,17 @@ /* Created by Daniel Monteiro on 2023-11-04. */ -#ifdef WIN32 -#include "Win32Int.h" -#else - -#include - +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; #endif +#endif + #include #include "Common.h" @@ -19,7 +23,7 @@ uint8_t pinTop[3]; void initHackingMinigame(void) { - memset(&pins[0][0], 0xFF, sizeof(pins)); + memFill(&pins[0][0], 0xFF, sizeof(pins)); pins[0][0] = 4; pins[0][1] = 2; pins[0][2] = 1; diff --git a/common/src/HackingScreen.c b/common/src/HackingScreen.c index ec6fc619d..c840064d0 100644 --- a/common/src/HackingScreen.c +++ b/common/src/HackingScreen.c @@ -37,6 +37,9 @@ void HackingScreen_initStateCallback(enum EGameMenuState tag) { (void)tag; cursorPosition = 1; needsToRedrawVisibleMeshes = 0; +#ifdef PAGE_FLIP_ANIMATION + wasSmoothMovementPreviouslyEnabled = enableSmoothMovement; +#endif initHackingMinigame(); } diff --git a/common/src/HelpScreen.c b/common/src/HelpScreen.c index d1a7ecda8..25afe8001 100644 --- a/common/src/HelpScreen.c +++ b/common/src/HelpScreen.c @@ -11,6 +11,14 @@ #include "UI.h" #include "Engine.h" +#ifndef MONOCHROME_VECTORS +#include "FixP.h" +#include "Vec.h" +#include "Mesh.h" +#include "CActor.h" +#include "Renderer.h" +#endif + extern const char *mainText; extern int8_t cursorPosition; @@ -22,20 +30,24 @@ const enum EGameMenuState HelpScreen_nextStateNavigation[1] = { void HelpScreen_initStateCallback(enum EGameMenuState tag) { (void)tag; - mainText = "You must gain access to the reactor, place the EMP\ndevice and, from a safe\ndistance, activate it."; + mainText = "You must gain access to the reactor, place the EMP device and, from a safe distance, activate it."; } void HelpScreen_repaintCallback(void) { if (firstFrameOnCurrentState) { clearScreen(); +#ifndef MONOCHROME_VECTORS + fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); +#endif + if (mainText != NULL) { drawTextWindow(1, 1, (XRES_FRAMEBUFFER / 8) - 2, 1 + 6, "Help", mainText); } } - drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 4 - 3, - ((YRES_FRAMEBUFFER / 8) + 1) - 1 - 4, + drawWindowWithOptions((XRES_FRAMEBUFFER / 8) - 4 - 4, + ((YRES_FRAMEBUFFER / 8) + 1) - 1 - 5, 4 + 2, 1 + 2, "Help", HelpScreen_options, 1, cursorPosition); } diff --git a/common/src/MainMenu.c b/common/src/MainMenu.c index 308374960..02ce80afd 100644 --- a/common/src/MainMenu.c +++ b/common/src/MainMenu.c @@ -1,7 +1,12 @@ #ifdef WIN32 #include "Win32Int.h" #else +#ifndef SMD #include +#else +#include +typedef unsigned long size_t; +#endif #endif #include "Common.h" @@ -19,2098 +24,3384 @@ #endif #ifdef EMIT_QUIT_OPTION -const char *MainMenu_options[4] = { + +#define kMainMenuOptionsCount 4 + +const char *MainMenu_options[kMainMenuOptionsCount] = { "Play game", "Credits", "Help", "Quit"}; -const enum EGameMenuState MainMenu_nextStateNavigation[4] = { +const enum EGameMenuState MainMenu_nextStateNavigation[kMainMenuOptionsCount] = { kPlayGame, kCredits, kHelp, kQuit}; -const uint8_t kMainMenuOptionsCount = 4; #else -const char *MainMenu_options[3] = { + +#define kMainMenuOptionsCount 3 + +const char *MainMenu_options[kMainMenuOptionsCount] = { "Play game", "Credits", "Help"}; -const enum EGameMenuState MainMenu_nextStateNavigation[3] = { +const enum EGameMenuState MainMenu_nextStateNavigation[kMainMenuOptionsCount] = { kPlayGame, kCredits, kHelp}; -const uint8_t kMainMenuOptionsCount = 3; #endif -static const uint8_t splashGraphics[] = { -#ifdef MONOCHROME_VECTORS - 5, #ifndef MONOCHROME_VECTORS -68, 85, 0, -#endif -40, 50, -41, 60, -70, 59, -69, 52, -40, 50, -5, +static const uint8_t logoGraphics[] = { +3, #ifndef MONOCHROME_VECTORS -80, 68, 22, +128, 128, 0, #endif -54, 33, -54, 51, -66, 55, -72, 31, -54, 33, -6, +2, 11, +0, 11, +0, 9, +3, #ifndef MONOCHROME_VECTORS -136, 170, 0, +128, 128, 0, #endif -54, 57, -81, 58, -81, 124, -32, 123, -42, 57, -42, 57, -4, +2, 11, +0, 9, +2, 9, +3, #ifndef MONOCHROME_VECTORS -0, 0, 0, +128, 128, 0, #endif -42, 57, -39, 75, -71, 58, -42, 57, -7, +2, 7, +0, 7, +0, 3, +3, #ifndef MONOCHROME_VECTORS -85, 34, 0, +128, 128, 0, #endif -45, 53, -61, 53, -59, 47, -59, 36, -43, 32, -42, 54, -45, 53, -7, +2, 7, +0, 3, +2, 0, +3, #ifndef MONOCHROME_VECTORS -183, 200, 183, +128, 128, 0, #endif -46, 35, -63, 37, -81, 38, -88, 35, -88, 21, -49, 18, -46, 35, -5, +6, 11, +2, 11, +2, 0, +3, #ifndef MONOCHROME_VECTORS -0, 0, 0, +128, 128, 0, #endif -49, 18, -46, 35, -72, 38, -73, 22, -49, 18, -6, +6, 11, +2, 0, +6, 0, +3, #ifndef MONOCHROME_VECTORS -138, 145, 111, +128, 128, 0, #endif -48, 18, -73, 22, -88, 21, -88, 1, -77, 1, -52, 15, -7, +9, 11, +6, 11, +6, 0, +3, #ifndef MONOCHROME_VECTORS -196, 200, 183, +128, 128, 0, #endif -27, 98, -27, 108, -25, 106, -1, 108, -1, 1, -68, 1, -43, 15, -6, +9, 11, +6, 0, +9, 0, +3, #ifndef MONOCHROME_VECTORS -108, 103, 83, +128, 128, 0, #endif -60, 57, -63, 37, -81, 36, -81, 59, -63, 60, -60, 57, -5, +9, 3, +6, 3, +6, 5, +3, #ifndef MONOCHROME_VECTORS -145, 124, 111, +128, 128, 0, #endif -26, 108, -36, 125, -43, 123, -27, 98, -25, 105, -5, +9, 3, +6, 5, +9, 5, +3, #ifndef MONOCHROME_VECTORS -188, 211, 95, +128, 128, 0, #endif -27, 98, -43, 98, -56, 124, -42, 123, -27, 98, -5, +11, 10, +9, 11, +9, 9, +3, #ifndef MONOCHROME_VECTORS -205, 222, 135, +128, 128, 0, #endif -1, 108, -25, 106, -36, 125, -1, 125, -1, 108, -5, +11, 10, +9, 9, +11, 9, +3, #ifndef MONOCHROME_VECTORS -85, 68, 0, -#endif -46, 47, -59, 47, -61, 53, -45, 53, -46, 47, -8, -#ifndef MONOCHROME_VECTORS -147, 172, 147, -#endif -59, 39, -59, 39, -88, 42, -88, 42, -88, 36, -88, 36, -59, 39, -59, 39, -8, -#ifndef MONOCHROME_VECTORS -170, 212, 0, -#endif -59, 94, -56, 90, -56, 90, -40, 104, -40, 104, -40, 104, -59, 94, -59, 94, -7, -#ifndef MONOCHROME_VECTORS -0, 0, 218639482, +128, 128, 0, #endif -27, 98, -36, 98, -49, 18, -78, 1, -68, 1, -43, 15, -27, 98, -5, +13, 10, +11, 10, +11, 0, +3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +128, 128, 0, #endif -1, 1, -1, 7, -1, 21, -43, 17, -68, 1, +13, 10, +11, 0, +13, 0, 3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +128, 128, 0, #endif -43, 17, -46, 1, -68, 1, -4, +15, 10, +13, 10, +13, 0, +3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +128, 128, 0, #endif -49, 18, -43, 17, -68, 1, -78, 1, -4, +15, 10, +13, 0, +15, 0, +3, #ifndef MONOCHROME_VECTORS -36, 34, 28, +128, 128, 0, #endif -43, 17, -1, 9, -0, 1, -46, 1, -6, +15, 11, +13, 11, +13, 11, +3, #ifndef MONOCHROME_VECTORS -85, 0, 0, +128, 128, 0, #endif -46, 91, -34, 108, -29, 125, -87, 125, -87, 86, -60, 84, -5, +15, 11, +13, 11, +15, 11, +3, #ifndef MONOCHROME_VECTORS -43, 0, 0, +128, 128, 0, #endif -50, 103, -74, 107, -87, 107, -87, 125, -46, 125, -8, +17, 10, +15, 10, +15, 3, +3, #ifndef MONOCHROME_VECTORS -170, 0, 0, +128, 128, 0, #endif -87, 32, -71, 33, -55, 36, -51, 57, -51, 86, -62, 98, -88, 92, -87, 32, -6, +17, 10, +15, 3, +17, 3, +3, #ifndef MONOCHROME_VECTORS -180, 0, 0, +128, 128, 0, #endif -56, 37, -69, 40, -87, 38, -87, 33, -71, 33, -56, 37, -5, +17, 11, +15, 11, +15, 11, +3, #ifndef MONOCHROME_VECTORS -190, 0, 0, +128, 128, 0, #endif -52, 56, -59, 67, -60, 47, -56, 37, -52, 56, -5, +17, 11, +15, 11, +17, 11, +3, #ifndef MONOCHROME_VECTORS -150, 0, 0, +128, 128, 0, #endif -74, 69, -78, 49, -87, 41, -86, 64, -74, 69, -4, +19, 10, +17, 10, +17, 0, +3, #ifndef MONOCHROME_VECTORS -170, 0, 0, +128, 128, 0, #endif -57, 93, -54, 89, -46, 92, -38, 104, -5, +19, 10, +17, 0, +19, 0, +3, #ifndef MONOCHROME_VECTORS -0, 0, 0, +128, 128, 0, #endif -54, 106, -54, 106, -52, 125, -52, 125, -87, 125, -5, +19, 11, +17, 11, +17, 11, +3, #ifndef MONOCHROME_VECTORS 128, 128, 0, #endif -60, 125, -60, 125, -84, 125, -84, 125, -61, 125, -4, +19, 11, +17, 11, +19, 11, +3, #ifndef MONOCHROME_VECTORS -0, 0, 255, +128, 128, 0, #endif -64, 125, -64, 125, -70, 125, -70, 125, +21, 10, +19, 10, +19, 0, 3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +128, 128, 0, #endif -62, 95, -58, 67, -53, 84, +21, 10, +19, 0, +21, 0, 3, #ifndef MONOCHROME_VECTORS -0, 0, 218639482, +128, 128, 0, #endif -53, 84, -58, 67, -53, 59, -5, +21, 9, +19, 11, +19, 11, +3, #ifndef MONOCHROME_VECTORS -43, 0, 0, +128, 128, 0, #endif -49, 99, -49, 99, -87, 101, -87, 101, -87, 98, +21, 9, +19, 11, +21, 11, 3, #ifndef MONOCHROME_VECTORS -92, 92, 0, +128, 128, 0, #endif -62, 95, -74, 69, -86, 88, +23, 9, +21, 10, +21, 11, 3, #ifndef MONOCHROME_VECTORS -100, 100, 0, +128, 128, 0, #endif -58, 67, -62, 96, -74, 69, +23, 9, +21, 11, +23, 11, 3, #ifndef MONOCHROME_VECTORS -85, 68, 0, +128, 128, 0, #endif -74, 69, -85, 61, -85, 88, -0}; -#else - 3, +29, 9, +23, 9, +23, 11, +3, #ifndef MONOCHROME_VECTORS - 68, 85, 0, +128, 128, 0, #endif - 40, 50, - 41, 60, - 41, 51, - 3, +29, 9, +23, 11, +29, 11, +3, #ifndef MONOCHROME_VECTORS - 68, 85, 0, +128, 128, 0, #endif - 40, 50, - 41, 51, - 40, 50, - 3, +29, 11, +23, 11, +23, 0, +3, #ifndef MONOCHROME_VECTORS - 68, 85, 0, +128, 128, 0, #endif - 41, 60, - 69, 59, - 69, 52, - 3, +29, 11, +23, 0, +29, 0, +3, #ifndef MONOCHROME_VECTORS - 68, 85, 0, +128, 128, 0, #endif - 41, 60, - 69, 52, - 41, 51, - 3, +31, 9, +29, 9, +29, 0, +3, #ifndef MONOCHROME_VECTORS - 68, 85, 0, +128, 128, 0, #endif - 69, 59, - 70, 59, - 70, 59, - 3, +31, 9, +29, 0, +31, 3, +3, #ifndef MONOCHROME_VECTORS - 68, 85, 0, +128, 128, 0, #endif - 69, 59, - 70, 59, - 69, 52, - 3, +31, 4, +29, 6, +29, 6, +3, #ifndef MONOCHROME_VECTORS - 80, 68, 22, +128, 128, 0, #endif - 54, 51, - 66, 55, - 66, 32, - 3, +31, 4, +29, 6, +31, 8, +3, #ifndef MONOCHROME_VECTORS - 80, 68, 22, +128, 128, 0, #endif - 54, 51, - 66, 32, - 54, 33, - 3, +3, 29, +0, 29, +0, 19, +3, #ifndef MONOCHROME_VECTORS - 80, 68, 22, +128, 128, 0, #endif - 66, 55, - 72, 31, - 72, 31, - 3, +3, 29, +0, 19, +3, 19, +3, #ifndef MONOCHROME_VECTORS - 80, 68, 22, +128, 128, 0, #endif - 66, 55, - 72, 31, - 66, 32, - 3, +4, 29, +3, 29, +3, 19, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 42, 124, - 32, 123, - 32, 123, - 3, +4, 29, +3, 19, +4, 20, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 42, 124, - 32, 123, - 42, 57, - 3, +5, 27, +4, 27, +4, 20, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 42, 124, - 42, 124, - 42, 57, - 3, +5, 27, +4, 20, +5, 21, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 42, 124, - 42, 57, - 42, 57, - 3, +6, 27, +5, 27, +5, 21, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 42, 57, - 54, 57, - 54, 124, - 3, +6, 27, +5, 21, +6, 20, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 42, 57, - 54, 124, - 42, 124, - 3, +7, 29, +6, 29, +6, 20, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 54, 57, - 81, 58, - 81, 124, - 3, +7, 29, +6, 20, +7, 19, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 54, 57, - 81, 124, - 54, 124, - 3, +11, 29, +7, 29, +7, 19, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 81, 58, - 81, 124, - 81, 124, - 3, +11, 29, +7, 19, +11, 19, +3, #ifndef MONOCHROME_VECTORS - 136, 170, 0, +128, 128, 0, #endif - 81, 58, - 81, 124, - 81, 124, - 3, +13, 29, +11, 29, +11, 29, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 42, 57, - 39, 75, - 39, 75, - 3, +13, 29, +11, 29, +13, 29, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 42, 57, - 39, 75, - 42, 73, - 3, +15, 29, +13, 29, +13, 29, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 42, 73, - 71, 58, - 71, 58, - 3, +15, 29, +13, 29, +15, 29, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 42, 73, - 71, 58, - 42, 57, - 3, +15, 29, +13, 29, +13, 21, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 43, 32, - 42, 54, - 42, 54, - 3, +15, 29, +13, 21, +15, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 43, 32, - 42, 54, - 43, 54, - 3, +17, 28, +15, 29, +15, 29, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 45, 32, - 43, 32, - 43, 54, - 3, +17, 28, +15, 29, +17, 29, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 45, 32, - 43, 54, - 45, 53, - 3, +17, 29, +15, 29, +15, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 45, 53, - 59, 53, - 59, 36, - 3, +17, 29, +15, 19, +17, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 45, 53, - 59, 36, - 45, 32, - 3, +19, 28, +17, 28, +17, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 59, 53, - 59, 53, - 59, 48, - 3, +19, 28, +17, 19, +19, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 59, 53, - 59, 48, - 59, 47, - 3, +19, 27, +17, 27, +17, 27, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 59, 47, - 59, 36, - 59, 36, - 3, +19, 27, +17, 27, +19, 27, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 59, 47, - 59, 36, - 59, 36, - 3, +21, 28, +19, 28, +19, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 59, 53, - 61, 53, - 61, 53, - 3, +21, 28, +19, 19, +21, 19, +3, #ifndef MONOCHROME_VECTORS - 85, 34, 0, +128, 128, 0, #endif - 59, 53, - 61, 53, - 59, 48, - 3, +21, 29, +19, 29, +19, 27, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 46, 35, - 46, 35, - 46, 33, - 3, +21, 29, +19, 27, +21, 28, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 46, 35, - 46, 33, - 46, 35, - 3, +23, 28, +21, 28, +21, 19, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 46, 35, - 49, 35, - 49, 18, - 3, +23, 28, +21, 19, +23, 21, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 46, 35, - 49, 18, - 46, 33, - 3, +23, 29, +21, 29, +21, 28, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 49, 35, - 63, 37, - 63, 19, - 3, +23, 29, +21, 28, +23, 28, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 49, 35, - 63, 19, - 49, 18, - 3, +25, 28, +23, 28, +23, 28, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 63, 37, - 81, 38, - 81, 21, - 3, +25, 28, +23, 28, +25, 28, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 63, 37, - 81, 21, - 63, 19, - 3, +29, 28, +25, 28, +25, 28, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 81, 38, - 88, 35, - 88, 21, - 3, +29, 28, +25, 28, +29, 29, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 81, 38, - 88, 21, - 81, 21, - 3, +29, 29, +25, 29, +25, 19, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 88, 35, - 88, 21, - 88, 21, - 3, +29, 29, +25, 19, +29, 19, +3, #ifndef MONOCHROME_VECTORS - 183, 200, 183, +128, 128, 0, #endif - 88, 35, - 88, 21, - 88, 21, - 3, +31, 28, +29, 28, +29, 19, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 49, 18, - 46, 35, - 46, 35, - 3, +31, 28, +29, 19, +31, 19, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 49, 18, - 46, 35, - 49, 35, - 3, +31, 27, +29, 27, +29, 27, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 49, 35, - 72, 38, - 72, 22, - 3, +31, 27, +29, 27, +31, 27, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 49, 35, - 72, 22, - 49, 18, - 3, +33, 28, +31, 28, +31, 19, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 72, 38, - 73, 22, - 73, 22, - 3, +33, 28, +31, 19, +33, 19, +3, #ifndef MONOCHROME_VECTORS - 0, 0, 0, +128, 128, 0, #endif - 72, 38, - 73, 22, - 72, 22, - 3, +33, 29, +31, 29, +31, 27, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 52, 15, - 48, 18, - 48, 18, - 3, +33, 29, +31, 27, +33, 27, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 52, 15, - 48, 18, - 52, 19, - 3, +35, 27, +33, 28, +33, 19, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 52, 19, - 73, 22, - 73, 4, - 3, +35, 27, +33, 19, +35, 21, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 52, 19, - 73, 4, - 52, 15, - 3, +35, 23, +33, 25, +33, 25, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 73, 22, - 77, 22, - 77, 1, - 3, +35, 23, +33, 25, +35, 27, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 73, 22, - 77, 1, - 73, 4, - 3, +35, 29, +33, 29, +33, 27, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 77, 22, - 88, 21, - 88, 1, - 3, +35, 29, +33, 27, +35, 28, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 77, 22, - 88, 1, - 77, 1, - 3, +37, 27, +35, 27, +35, 28, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 88, 21, - 88, 21, - 88, 21, - 3, +37, 27, +35, 28, +37, 28, +3, #ifndef MONOCHROME_VECTORS - 138, 145, 111, +128, 128, 0, #endif - 88, 21, - 88, 21, - 88, 1, - 3, +44, 27, +37, 27, +37, 28, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 1, 108, - 1, 108, - 1, 108, - 3, +44, 27, +37, 28, +44, 29, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 1, 108, - 1, 108, - 1, 1, - 3, +44, 29, +37, 29, +37, 19, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 25, 106, - 1, 108, - 1, 1, - 3, +44, 29, +37, 19, +44, 19, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 25, 106, - 1, 1, - 25, 1, - 3, +46, 27, +44, 27, +44, 29, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 27, 108, - 25, 106, - 25, 1, - 3, +46, 27, +44, 29, +46, 29, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 27, 108, - 25, 1, - 27, 1, - 3, +46, 29, +44, 29, +44, 19, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 27, 98, - 27, 108, - 27, 1, - 3, +46, 29, +44, 19, +46, 19, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 27, 98, - 27, 1, - 27, 1, - 3, +46, 21, +44, 21, +44, 23, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 43, 15, - 27, 98, - 27, 1, - 3, +46, 21, +44, 23, +46, 23, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 43, 15, - 27, 1, - 43, 1, - 3, +46, 25, +44, 25, +44, 27, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 43, 1, - 68, 1, - 68, 1, - 3, +46, 25, +44, 27, +46, 27, +3, #ifndef MONOCHROME_VECTORS - 196, 200, 183, +128, 128, 0, #endif - 43, 1, - 68, 1, - 43, 15, - 3, +4, 47, +0, 47, +0, 37, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 60, 57, - 63, 39, - 63, 60, - 3, +4, 47, +0, 37, +4, 37, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 60, 57, - 63, 60, - 60, 57, - 3, +6, 47, +4, 47, +4, 37, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 63, 39, - 63, 37, - 63, 60, - 3, +6, 47, +4, 37, +6, 39, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 63, 39, - 63, 60, - 63, 60, - 3, +10, 47, +6, 47, +6, 39, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 63, 37, - 81, 36, - 81, 59, - 3, +10, 47, +6, 39, +10, 43, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 63, 37, - 81, 59, - 63, 60, - 3, +10, 47, +6, 47, +6, 37, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 81, 36, - 81, 36, - 81, 36, - 3, +10, 47, +6, 37, +10, 37, +3, #ifndef MONOCHROME_VECTORS - 108, 103, 83, +128, 128, 0, #endif - 81, 36, - 81, 36, - 81, 59, - 3, +11, 47, +10, 47, +10, 43, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 25, 105, - 26, 108, - 26, 99, - 3, +11, 47, +10, 43, +11, 45, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 25, 105, - 26, 99, - 25, 105, - 3, +11, 47, +10, 47, +10, 37, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 26, 108, - 27, 109, - 27, 98, - 3, +11, 47, +10, 37, +11, 38, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 26, 108, - 27, 98, - 26, 99, - 3, +12, 47, +11, 47, +11, 45, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 27, 109, - 36, 125, - 36, 112, - 3, +12, 47, +11, 45, +12, 46, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 27, 109, - 36, 112, - 27, 98, - 3, +12, 45, +11, 45, +11, 38, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 36, 125, - 43, 123, - 43, 123, - 3, +12, 45, +11, 38, +12, 39, +3, #ifndef MONOCHROME_VECTORS - 145, 124, 111, +128, 128, 0, #endif - 36, 125, - 43, 123, - 36, 112, - 3, +13, 47, +12, 47, +12, 46, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +128, 128, 0, #endif - 27, 98, - 42, 98, - 42, 123, - 3, +13, 47, +12, 46, +13, 47, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +128, 128, 0, #endif - 27, 98, - 42, 123, - 27, 98, - 3, +13, 45, +12, 45, +12, 39, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +128, 128, 0, #endif - 42, 98, - 43, 98, - 43, 123, - 3, +13, 45, +12, 39, +13, 38, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +128, 128, 0, #endif - 42, 98, - 43, 123, - 42, 123, - 3, +14, 47, +13, 47, +13, 38, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +128, 128, 0, #endif - 43, 98, - 56, 124, - 56, 124, - 3, +14, 47, +13, 38, +14, 37, +3, #ifndef MONOCHROME_VECTORS - 188, 211, 95, +128, 128, 0, #endif - 43, 98, - 56, 124, - 43, 123, - 3, +17, 47, +14, 47, +14, 37, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 1, 125, - 1, 125, - 1, 125, - 3, +17, 47, +14, 37, +17, 37, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 1, 125, - 1, 125, - 1, 108, - 3, +19, 47, +17, 47, +17, 47, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 1, 108, - 1, 108, - 1, 125, - 3, +19, 47, +17, 47, +19, 47, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 1, 108, - 1, 125, - 1, 125, - 3, +23, 47, +19, 47, +19, 47, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 1, 108, - 25, 106, - 25, 125, - 3, +23, 47, +19, 47, +23, 47, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 1, 108, - 25, 125, - 1, 125, - 3, +23, 47, +19, 47, +19, 37, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 25, 106, - 36, 125, - 36, 125, - 3, +23, 47, +19, 37, +23, 37, +3, #ifndef MONOCHROME_VECTORS - 205, 222, 135, +128, 128, 0, #endif - 25, 106, - 36, 125, - 25, 125, - 3, +25, 47, +23, 47, +23, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +128, 128, 0, #endif - 46, 53, - 45, 53, - 45, 53, - 3, +25, 47, +23, 37, +25, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +128, 128, 0, #endif - 46, 53, - 45, 53, - 46, 47, - 3, +25, 45, +23, 45, +23, 45, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +128, 128, 0, #endif - 46, 47, - 59, 47, - 59, 53, - 3, +25, 45, +23, 45, +25, 45, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +128, 128, 0, #endif - 46, 47, - 59, 53, - 46, 53, - 3, +27, 47, +25, 47, +25, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +128, 128, 0, #endif - 59, 47, - 61, 53, - 61, 53, - 3, +27, 47, +25, 37, +27, 39, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +128, 128, 0, #endif - 59, 47, - 61, 53, - 59, 53, - 3, +27, 43, +25, 45, +25, 45, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +128, 128, 0, #endif - 59, 39, - 88, 42, - 88, 36, - 3, +27, 43, +25, 45, +27, 46, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +128, 128, 0, #endif - 59, 39, - 88, 36, - 59, 39, - 3, +29, 47, +27, 47, +27, 46, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +128, 128, 0, #endif - 88, 42, - 88, 36, - 88, 36, - 3, +29, 47, +27, 46, +29, 46, +3, #ifndef MONOCHROME_VECTORS - 147, 172, 147, +128, 128, 0, #endif - 88, 42, - 88, 36, - 88, 36, - 3, +35, 47, +29, 47, +29, 46, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +128, 128, 0, #endif - 56, 90, - 40, 104, - 40, 104, - 3, +35, 47, +29, 46, +35, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +128, 128, 0, #endif - 56, 90, - 40, 104, - 56, 96, - 3, +35, 47, +29, 47, +29, 37, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +128, 128, 0, #endif - 59, 94, - 56, 90, - 56, 96, - 3, +35, 47, +29, 37, +35, 37, +3, #ifndef MONOCHROME_VECTORS - 170, 212, 0, +128, 128, 0, #endif - 59, 94, - 56, 96, - 59, 94, - 3, +37, 47, +35, 47, +35, 47, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 27, 98, - 36, 98, - 36, 53, - 3, +37, 47, +35, 47, +37, 47, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 27, 98, - 36, 53, - 27, 98, - 3, +37, 47, +35, 47, +35, 37, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 36, 98, - 43, 55, - 43, 15, - 3, +37, 47, +35, 37, +37, 37, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 36, 98, - 43, 15, - 36, 53, - 3, +37, 39, +35, 39, +35, 41, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 43, 55, - 49, 18, - 49, 12, - 3, +37, 39, +35, 41, +37, 41, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 43, 55, - 49, 12, - 43, 15, - 3, +37, 43, +35, 43, +35, 45, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 49, 18, - 68, 7, - 68, 1, - 3, +37, 43, +35, 45, +37, 45, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 49, 18, - 68, 1, - 49, 12, - 3, +40, 47, +37, 47, +37, 45, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 68, 7, - 78, 1, - 78, 1, - 3, +40, 47, +37, 45, +40, 46, +3, #ifndef MONOCHROME_VECTORS - 227, 226, 219, +128, 128, 0, #endif - 68, 7, - 78, 1, - 68, 1, - 3, +44, 47, +40, 47, +40, 46, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 1, 1, - 1, 7, - 1, 7, - 3, +44, 47, +40, 46, +44, 47, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 1, 1, - 1, 7, - 1, 21, - 3, +44, 47, +40, 47, +40, 37, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 1, 1, - 1, 1, - 1, 21, - 3, +44, 47, +40, 37, +44, 37, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 1, 1, - 1, 21, - 1, 21, - 3, +46, 47, +44, 47, +44, 37, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 43, 1, - 1, 1, - 1, 21, - 3, +46, 47, +44, 37, +46, 37, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 43, 1, - 1, 21, - 43, 17, - 3, +46, 45, +44, 45, +44, 45, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 68, 1, - 43, 1, - 43, 17, - 3, +46, 45, +44, 45, +46, 45, +3, #ifndef MONOCHROME_VECTORS - 145, 138, 111, +128, 128, 0, #endif - 68, 1, - 43, 17, - 68, 1, - 3, +48, 47, +46, 47, +46, 37, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +128, 128, 0, #endif - 46, 15, - 43, 17, - 43, 17, - 3, +48, 47, +46, 37, +48, 37, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +128, 128, 0, #endif - 46, 15, - 43, 17, - 46, 1, - 3, +48, 47, +46, 47, +46, 45, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +128, 128, 0, #endif - 68, 1, - 46, 15, - 46, 1, - 3, +48, 47, +46, 45, +48, 46, +3, #ifndef MONOCHROME_VECTORS - 72, 62, 55, +128, 128, 0, #endif - 68, 1, - 46, 1, - 68, 1, - 3, +50, 47, +48, 47, +48, 37, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +128, 128, 0, #endif - 49, 18, - 43, 17, - 43, 17, - 3, +50, 47, +48, 37, +50, 39, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +128, 128, 0, #endif - 49, 18, - 43, 17, - 49, 13, - 3, +50, 41, +48, 43, +48, 43, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +128, 128, 0, #endif - 68, 7, - 49, 18, - 49, 13, - 3, +50, 41, +48, 43, +50, 45, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +128, 128, 0, #endif - 68, 7, - 49, 13, - 68, 1, - 3, +50, 47, +48, 47, +48, 46, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +128, 128, 0, #endif - 78, 1, - 68, 7, - 68, 1, - 3, +50, 47, +48, 46, +50, 46, +3, #ifndef MONOCHROME_VECTORS - 172, 157, 147, +128, 128, 0, #endif - 78, 1, - 68, 1, - 78, 1, - 3, +52, 47, +50, 47, +50, 46, +3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, +128, 128, 0, #endif - 1, 9, - 0, 1, - 0, 1, - 3, +52, 47, +50, 46, +52, 46, +3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, +128, 128, 0, #endif - 1, 9, - 0, 1, - 1, 1, - 3, +56, 47, +52, 47, +52, 46, +3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, +128, 128, 0, #endif - 43, 17, - 1, 9, - 1, 1, - 3, +56, 47, +52, 46, +56, 47, +3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, +128, 128, 0, #endif - 43, 17, - 1, 1, - 43, 1, - 3, +56, 47, +52, 47, +52, 37, +3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, +128, 128, 0, #endif - 46, 1, - 43, 17, - 43, 1, - 3, +56, 47, +52, 37, +56, 37, +3, #ifndef MONOCHROME_VECTORS - 36, 34, 28, +128, 128, 0, #endif - 46, 1, - 43, 1, - 46, 1, - 3, +58, 47, +56, 47, +56, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 34, 108, - 29, 125, - 29, 125, - 3, +58, 47, +56, 37, +58, 45, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 34, 108, - 29, 125, - 34, 125, - 3, +60, 47, +58, 47, +58, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 46, 91, - 34, 108, - 34, 125, - 3, +60, 47, +58, 37, +60, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 46, 91, - 34, 125, - 46, 125, - 3, +62, 47, +60, 47, +60, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 60, 84, - 46, 91, - 46, 125, - 3, +62, 47, +60, 37, +62, 37, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 60, 84, - 46, 125, - 60, 125, - 3, +62, 47, +60, 47, +60, 47, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 60, 125, - 87, 125, - 87, 86, - 3, +62, 47, +60, 47, +62, 47, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 60, 125, - 87, 86, - 60, 84, - 3, +64, 47, +62, 47, +62, 39, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 87, 125, - 87, 125, - 87, 125, - 3, +64, 47, +62, 39, +64, 39, +3, #ifndef MONOCHROME_VECTORS - 85, 0, 0, +128, 128, 0, #endif - 87, 125, - 87, 125, - 87, 86, - 3, +64, 47, +62, 47, +62, 47, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 46, 125, - 50, 103, - 50, 125, - 3, +64, 47, +62, 47, +64, 47, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 46, 125, - 50, 125, - 46, 125, - 3, +66, 47, +64, 47, +64, 37, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 50, 103, - 74, 107, - 74, 125, - 3, +66, 47, +64, 37, +66, 37, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 50, 103, - 74, 125, - 50, 125, - 3, +66, 47, +64, 47, +64, 47, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 74, 107, - 87, 107, - 87, 125, - 3, +66, 47, +64, 47, +66, 47, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 74, 107, - 87, 125, - 74, 125, - 3, +68, 47, +66, 47, +66, 37, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 87, 107, - 87, 125, - 87, 125, - 3, +68, 47, +66, 37, +68, 37, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +128, 128, 0, #endif - 87, 107, - 87, 125, - 87, 125, - 3, +68, 45, +66, 47, +66, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 51, 57, - 51, 57, - 51, 57, - 3, +68, 45, +66, 47, +68, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 51, 57, - 51, 57, - 51, 86, - 3, +71, 47, +68, 47, +68, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 55, 36, - 51, 57, - 51, 86, - 3, +71, 47, +68, 47, +71, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 55, 36, - 51, 86, - 55, 91, - 3, +74, 47, +71, 47, +71, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 62, 35, - 55, 36, - 55, 91, - 3, +74, 47, +71, 47, +74, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 62, 35, - 55, 91, - 62, 98, - 3, +74, 47, +71, 47, +71, 37, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 71, 33, - 62, 35, - 62, 98, - 3, +74, 47, +71, 37, +74, 37, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 71, 33, - 62, 98, - 71, 96, - 3, +75, 47, +74, 47, +74, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 87, 32, - 71, 33, - 71, 96, - 3, +75, 47, +74, 47, +75, 47, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 87, 32, - 71, 96, - 87, 92, - 3, +75, 47, +74, 47, +74, 37, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 87, 92, - 88, 92, - 88, 92, - 3, +75, 47, +74, 37, +75, 38, +3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, +128, 128, 0, #endif - 87, 92, - 88, 92, - 87, 32, - 3, +76, 47, +75, 47, +75, 47, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 56, 37, - 69, 40, - 69, 34, - 3, +76, 47, +75, 47, +76, 47, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 56, 37, - 69, 34, - 56, 37, - 3, +76, 45, +75, 45, +75, 38, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 69, 40, - 71, 40, - 71, 33, - 3, +76, 45, +75, 38, +76, 39, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 69, 40, - 71, 33, - 69, 34, - 3, +77, 47, +76, 47, +76, 47, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 71, 40, - 87, 38, - 87, 33, - 3, +77, 47, +76, 47, +77, 47, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 71, 40, - 87, 33, - 71, 33, - 3, +77, 45, +76, 45, +76, 39, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 87, 38, - 87, 33, - 87, 33, - 3, +77, 45, +76, 39, +77, 38, +3, #ifndef MONOCHROME_VECTORS - 180, 0, 0, +128, 128, 0, #endif - 87, 38, - 87, 33, - 87, 33, - 3, +78, 47, +77, 47, +77, 38, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +128, 128, 0, #endif - 52, 56, - 56, 63, - 56, 37, - 3, +78, 47, +77, 38, +78, 37, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +128, 128, 0, #endif - 52, 56, - 56, 37, - 52, 56, - 3, +81, 47, +78, 47, +78, 37, +3, #ifndef MONOCHROME_VECTORS - 190, 0, 0, +128, 128, 0, #endif - 56, 63, - 59, 67, - 59, 43, - 3, +81, 47, +78, 37, +81, 37, +0}; + +#else +static const uint8_t logoGraphics[] = { + 33, #ifndef MONOCHROME_VECTORS - 190, 0, 0, + 128, 128, 0, #endif - 56, 63, - 59, 43, - 56, 37, - 3, + 6, 11, + 0, 11, + 0, 9, + 2, 9, + 2, 7, + 0, 7, + 0, 3, + 2, 0, + 9, 0, + 9, 3, + 6, 3, + 6, 5, + 9, 5, + 9, 9, + 11, 9, + 11, 0, + 15, 0, + 15, 3, + 17, 3, + 17, 0, + 21, 0, + 21, 9, + 19, 11, + 13, 11, + 29, 11, + 23, 11, + 23, 0, + 29, 0, + 31, 3, + 31, 4, + 29, 6, + 31, 8, + 31, 9, + 45, #ifndef MONOCHROME_VECTORS - 190, 0, 0, + 128, 128, 0, #endif - 59, 67, - 60, 47, - 60, 47, - 3, + 6, 29, + 6, 27, + 4, 27, + 4, 29, + 0, 29, + 0, 19, + 3, 19, + 5, 21, + 7, 19, + 11, 19, + 11, 29, + 17, 29, + 13, 29, + 13, 21, + 15, 19, + 21, 19, + 23, 21, + 23, 29, + 19, 29, + 19, 27, + 17, 27, + 29, 29, + 25, 29, + 25, 19, + 33, 19, + 35, 21, + 35, 23, + 33, 25, + 35, 27, + 35, 29, + 31, 29, + 31, 27, + 29, 27, + 46, 29, + 37, 29, + 37, 19, + 46, 19, + 46, 21, + 44, 21, + 44, 23, + 46, 23, + 46, 25, + 44, 25, + 44, 27, + 46, 27, + 72, #ifndef MONOCHROME_VECTORS - 190, 0, 0, + 128, 128, 0, #endif - 59, 67, + 4, 47, + 0, 47, + 0, 37, + 4, 37, + 13, 47, + 13, 45, + 11, 45, + 11, 47, + 6, 47, + 6, 37, + 10, 37, + 12, 39, + 14, 37, + 17, 37, + 17, 47, + 23, 47, + 19, 47, + 19, 37, + 25, 37, + 27, 39, + 27, 43, + 25, 45, + 23, 45, + 37, 47, + 29, 47, + 29, 37, + 37, 37, + 37, 39, + 35, 39, + 35, 41, + 37, 41, + 37, 43, + 35, 43, + 35, 45, + 37, 45, + 44, 47, + 40, 47, + 40, 37, + 48, 37, + 50, 39, + 50, 41, + 48, 43, + 50, 45, + 50, 47, + 46, 47, + 46, 45, + 44, 45, + 56, 47, + 52, 47, + 52, 37, + 56, 37, + 58, 45, + 58, 37, + 62, 37, + 62, 39, + 64, 39, + 64, 37, + 68, 37, + 68, 45, + 66, 47, 60, 47, - 59, 43, - 3, -#ifndef MONOCHROME_VECTORS - 150, 0, 0, + 77, 47, + 77, 45, + 75, 45, + 75, 47, + 71, 47, + 71, 37, + 74, 37, + 76, 39, + 78, 37, + 81, 37, + 81, 47, + 0}; + + + #endif - 74, 69, - 78, 49, - 78, 68, - 3, + + + +static const uint8_t splashGraphics[] = { +#ifdef MONOCHROME_VECTORS + 4, #ifndef MONOCHROME_VECTORS - 150, 0, 0, + 136, 170, 0, #endif - 74, 69, - 78, 68, - 74, 69, - 3, + 51, 77, + 54, 99, + 36, 98, + 38, 80, + 5, #ifndef MONOCHROME_VECTORS - 150, 0, 0, + 108, 103, 83, #endif - 78, 49, - 86, 41, - 86, 64, - 3, + 49, 18, + 40, 72, + 52, 74, + 71, 33, + 84, 18, + 5, #ifndef MONOCHROME_VECTORS - 150, 0, 0, + 138, 145, 111, #endif - 78, 49, - 86, 64, - 78, 68, - 3, + 49, 18, + 73, 22, + 87, 21, + 87, 1, + 77, 1, + 6, #ifndef MONOCHROME_VECTORS - 150, 0, 0, + 196, 200, 183, #endif - 86, 41, - 87, 41, - 87, 41, - 3, + 27, 98, + 26, 106, + 1, 108, + 1, 1, + 68, 1, + 43, 17, + 4, #ifndef MONOCHROME_VECTORS - 150, 0, 0, + 145, 124, 111, #endif - 86, 41, - 87, 41, - 86, 64, - 3, + 36, 125, + 43, 123, + 27, 98, + 26, 106, + 5, #ifndef MONOCHROME_VECTORS - 170, 0, 0, + 188, 211, 95, #endif - 38, 104, - 46, 99, - 46, 92, - 3, + 27, 98, + 43, 98, + 56, 124, + 42, 123, + 27, 98, + 4, #ifndef MONOCHROME_VECTORS - 170, 0, 0, + 205, 222, 135, #endif - 38, 104, - 46, 92, - 38, 104, - 3, + 26, 106, + 36, 125, + 1, 125, + 1, 108, + 7, #ifndef MONOCHROME_VECTORS - 170, 0, 0, + 0, 0, 188169338, #endif - 46, 99, - 54, 95, - 54, 89, + 27, 98, + 36, 98, + 49, 18, + 77, 1, + 68, 1, + 43, 15, + 27, 98, 3, #ifndef MONOCHROME_VECTORS - 170, 0, 0, + 0, 0, 188169338, #endif - 46, 99, - 54, 89, - 46, 92, - 3, + 1, 9, + 1, 21, + 43, 17, + 4, #ifndef MONOCHROME_VECTORS - 170, 0, 0, + 108, 93, 83, #endif - 54, 95, - 57, 93, - 57, 93, - 3, + 43, 17, + 1, 9, + 1, 1, + 46, 1, + 6, #ifndef MONOCHROME_VECTORS - 170, 0, 0, + 85, 0, 0, #endif - 54, 95, - 57, 93, - 54, 89, - 3, + 46, 91, + 34, 108, + 29, 125, + 87, 125, + 87, 86, + 60, 84, + 5, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 43, 0, 0, #endif - 54, 106, - 52, 125, - 52, 125, - 3, + 50, 103, + 74, 107, + 87, 105, + 87, 125, + 46, 125, + 6, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 180, 0, 0, #endif - 54, 106, - 52, 125, - 54, 125, - 3, + 56, 37, + 69, 40, + 87, 38, + 87, 33, + 71, 33, + 56, 37, + 7, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 170, 0, 0, #endif - 87, 125, - 54, 106, - 54, 125, - 3, + 71, 33, + 55, 36, + 51, 57, + 51, 86, + 62, 98, + 87, 92, + 87, 32, + 5, #ifndef MONOCHROME_VECTORS - 0, 0, 0, + 190, 0, 0, #endif - 87, 125, - 54, 125, - 87, 125, - 3, + 52, 56, + 59, 67, + 60, 47, + 56, 37, + 52, 56, + 5, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 150, 0, 0, #endif - 61, 125, - 60, 125, - 60, 125, - 3, + 74, 69, + 78, 49, + 87, 41, + 86, 64, + 74, 69, + 6, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 128, 0, 0, #endif - 61, 125, - 60, 125, - 61, 125, - 3, + 52, 93, + 53, 89, + 46, 92, + 38, 104, + 50, 99, + 61, 101, + 4, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 0, 0, 0, #endif - 61, 125, - 84, 125, - 84, 125, - 3, + 54, 106, + 52, 125, + 87, 125, + 58, 124, + 5, #ifndef MONOCHROME_VECTORS 128, 128, 0, #endif - 61, 125, + 60, 125, + 60, 125, + 84, 125, 84, 125, 61, 125, - 3, + 4, #ifndef MONOCHROME_VECTORS 0, 0, 255, #endif - 70, 125, 64, 125, 64, 125, - 3, -#ifndef MONOCHROME_VECTORS - 0, 0, 255, -#endif 70, 125, - 64, 125, 70, 125, 3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 0, 0, 188169338, #endif - 53, 84, - 58, 90, + 62, 95, 58, 67, + 53, 84, 3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 0, 0, 188169338, #endif 53, 84, 58, 67, - 53, 84, + 53, 59, 3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 92, 92, 0, #endif - 58, 90, - 62, 95, 62, 95, + 74, 69, + 86, 88, 3, #ifndef MONOCHROME_VECTORS - 128, 128, 0, + 100, 100, 0, #endif - 58, 90, - 62, 95, 58, 67, + 62, 95, + 74, 69, 3, #ifndef MONOCHROME_VECTORS - 150, 150, 0, + 85, 68, 0, #endif - 53, 59, - 53, 84, - 53, 84, - 3, + 74, 69, + 86, 64, + 86, 88, + 4, #ifndef MONOCHROME_VECTORS - 150, 150, 0, + 68, 120, 33, #endif - 53, 59, - 53, 84, - 53, 84, - 3, + 39, 80, + 51, 77, + 51, 73, + 40, 72, + 4, #ifndef MONOCHROME_VECTORS - 150, 150, 0, + 183, 200, 183, #endif - 53, 84, - 58, 67, - 58, 67, - 3, + 70, 33, + 87, 33, + 87, 21, + 73, 22, + 4, #ifndef MONOCHROME_VECTORS - 150, 150, 0, + 0, 0, 188169338, #endif - 53, 84, - 58, 67, - 53, 59, + 49, 18, + 43, 17, + 68, 1, + 78, 1, 3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, + 0, 0, 188169338, #endif - 87, 98, - 49, 99, - 49, 99, - 3, + 43, 17, + 45, 1, + 68, 1, + 0}; + + + + +#else +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +136, 170, 0, #endif - 87, 98, - 49, 99, - 87, 101, - 3, +38, 98, +36, 98, +36, 98, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +136, 170, 0, #endif - 87, 98, - 87, 98, - 87, 101, - 3, +38, 98, +36, 98, +38, 80, +3, #ifndef MONOCHROME_VECTORS - 43, 0, 0, +136, 170, 0, #endif - 87, 98, - 87, 101, - 87, 98, - 3, +38, 80, +51, 77, +51, 99, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +136, 170, 0, #endif - 74, 92, - 62, 95, - 62, 95, - 3, +38, 80, +51, 99, +38, 98, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +136, 170, 0, #endif - 74, 92, - 62, 95, - 74, 69, - 3, +51, 77, +54, 99, +54, 99, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +136, 170, 0, #endif - 86, 88, - 74, 92, - 74, 69, - 3, +51, 77, +54, 99, +51, 99, +3, #ifndef MONOCHROME_VECTORS - 92, 92, 0, +108, 103, 83, #endif - 86, 88, - 74, 69, - 86, 88, - 3, +49, 18, +40, 72, +40, 72, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +108, 103, 83, #endif - 62, 67, - 58, 67, - 58, 67, - 3, +49, 18, +40, 72, +49, 74, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +108, 103, 83, #endif - 62, 67, - 58, 67, - 62, 96, - 3, +52, 18, +49, 18, +49, 74, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +108, 103, 83, #endif - 74, 69, - 62, 67, - 62, 96, - 3, +52, 18, +49, 74, +52, 74, +3, #ifndef MONOCHROME_VECTORS - 100, 100, 0, +108, 103, 83, #endif - 74, 69, - 62, 96, - 74, 69, - 3, +71, 18, +52, 18, +52, 74, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +108, 103, 83, #endif - 85, 88, - 74, 69, - 74, 69, - 3, +71, 18, +52, 74, +71, 33, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +108, 103, 83, #endif - 85, 88, - 74, 69, - 85, 61, - 3, +84, 18, +71, 18, +71, 33, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +108, 103, 83, #endif - 85, 88, - 85, 88, - 85, 61, - 3, +84, 18, +71, 33, +84, 18, +3, #ifndef MONOCHROME_VECTORS - 85, 68, 0, +138, 145, 111, #endif - 85, 88, - 85, 61, - 85, 88, - 0}; +73, 4, +49, 18, +49, 18, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +73, 4, +49, 18, +73, 22, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +77, 1, +73, 4, +73, 22, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +77, 1, +73, 22, +77, 22, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +77, 22, +87, 21, +87, 1, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +77, 22, +87, 1, +77, 1, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +87, 21, +87, 1, +87, 1, +3, +#ifndef MONOCHROME_VECTORS +138, 145, 111, +#endif +87, 21, +87, 1, +87, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +1, 108, +1, 108, +1, 108, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +1, 108, +1, 108, +1, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +26, 106, +1, 108, +1, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +26, 106, +1, 1, +26, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +27, 98, +26, 106, +26, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +27, 98, +26, 1, +27, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +43, 17, +27, 98, +27, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +43, 17, +27, 1, +43, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +43, 1, +68, 1, +68, 1, +3, +#ifndef MONOCHROME_VECTORS +196, 200, 183, +#endif +43, 1, +68, 1, +43, 17, +3, +#ifndef MONOCHROME_VECTORS +145, 124, 111, +#endif +26, 106, +27, 108, +27, 98, +3, +#ifndef MONOCHROME_VECTORS +145, 124, 111, +#endif +26, 106, +27, 98, +26, 106, +3, +#ifndef MONOCHROME_VECTORS +145, 124, 111, +#endif +27, 108, +36, 125, +36, 112, +3, +#ifndef MONOCHROME_VECTORS +145, 124, 111, +#endif +27, 108, +36, 112, +27, 98, +3, +#ifndef MONOCHROME_VECTORS +145, 124, 111, +#endif +36, 125, +43, 123, +43, 123, +3, +#ifndef MONOCHROME_VECTORS +145, 124, 111, +#endif +36, 125, +43, 123, +36, 112, +3, +#ifndef MONOCHROME_VECTORS +188, 211, 95, +#endif +27, 98, +42, 98, +42, 123, +3, +#ifndef MONOCHROME_VECTORS +188, 211, 95, +#endif +27, 98, +42, 123, +27, 98, +3, +#ifndef MONOCHROME_VECTORS +188, 211, 95, +#endif +42, 98, +43, 98, +43, 123, +3, +#ifndef MONOCHROME_VECTORS +188, 211, 95, +#endif +42, 98, +43, 123, +42, 123, +3, +#ifndef MONOCHROME_VECTORS +188, 211, 95, +#endif +43, 98, +56, 124, +56, 124, +3, +#ifndef MONOCHROME_VECTORS +188, 211, 95, +#endif +43, 98, +56, 124, +43, 123, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +1, 125, +1, 125, +1, 125, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +1, 125, +1, 125, +1, 108, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +1, 108, +26, 106, +26, 125, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +1, 108, +26, 125, +1, 125, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +26, 106, +36, 125, +36, 125, +3, +#ifndef MONOCHROME_VECTORS +205, 222, 135, +#endif +26, 106, +36, 125, +26, 125, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +27, 98, +36, 98, +36, 53, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +27, 98, +36, 53, +27, 98, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +36, 98, +43, 55, +43, 15, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +36, 98, +43, 15, +36, 53, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +43, 55, +49, 18, +49, 12, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +43, 55, +49, 12, +43, 15, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +49, 18, +68, 7, +68, 1, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +49, 18, +68, 1, +49, 12, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +68, 7, +77, 1, +77, 1, +3, +#ifndef MONOCHROME_VECTORS +227, 226, 219, +#endif +68, 7, +77, 1, +68, 1, +3, +#ifndef MONOCHROME_VECTORS +145, 138, 111, +#endif +1, 9, +1, 9, +1, 9, +3, +#ifndef MONOCHROME_VECTORS +145, 138, 111, +#endif +1, 9, +1, 9, +1, 21, +3, +#ifndef MONOCHROME_VECTORS +145, 138, 111, +#endif +43, 17, +1, 9, +1, 21, +3, +#ifndef MONOCHROME_VECTORS +145, 138, 111, +#endif +43, 17, +1, 21, +43, 17, +3, +#ifndef MONOCHROME_VECTORS +108, 93, 83, +#endif +1, 9, +1, 9, +1, 9, +3, +#ifndef MONOCHROME_VECTORS +108, 93, 83, +#endif +1, 9, +1, 9, +1, 1, +3, +#ifndef MONOCHROME_VECTORS +108, 93, 83, +#endif +43, 17, +1, 9, +1, 1, +3, +#ifndef MONOCHROME_VECTORS +108, 93, 83, +#endif +43, 17, +1, 1, +43, 1, +3, +#ifndef MONOCHROME_VECTORS +108, 93, 83, +#endif +46, 1, +43, 17, +43, 1, +3, +#ifndef MONOCHROME_VECTORS +108, 93, 83, +#endif +46, 1, +43, 1, +46, 1, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +34, 108, +29, 125, +29, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +34, 108, +29, 125, +34, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +46, 91, +34, 108, +34, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +46, 91, +34, 125, +46, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +60, 84, +46, 91, +46, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +60, 84, +46, 125, +60, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +60, 125, +87, 125, +87, 86, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +60, 125, +87, 86, +60, 84, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +87, 125, +87, 125, +87, 125, +3, +#ifndef MONOCHROME_VECTORS +85, 0, 0, +#endif +87, 125, +87, 125, +87, 86, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +46, 125, +50, 103, +50, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +46, 125, +50, 125, +46, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +50, 103, +74, 107, +74, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +50, 103, +74, 125, +50, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +74, 107, +87, 105, +87, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +74, 107, +87, 125, +74, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +87, 105, +87, 125, +87, 125, +3, +#ifndef MONOCHROME_VECTORS +43, 0, 0, +#endif +87, 105, +87, 125, +87, 125, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +56, 37, +69, 40, +69, 34, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +56, 37, +69, 34, +56, 37, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +69, 40, +71, 40, +71, 33, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +69, 40, +71, 33, +69, 34, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +71, 40, +87, 38, +87, 33, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +71, 40, +87, 33, +71, 33, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +87, 38, +87, 33, +87, 33, +3, +#ifndef MONOCHROME_VECTORS +180, 0, 0, +#endif +87, 38, +87, 33, +87, 33, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +51, 57, +51, 57, +51, 57, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +51, 57, +51, 57, +51, 86, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +55, 36, +51, 57, +51, 86, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +55, 36, +51, 86, +55, 91, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +62, 35, +55, 36, +55, 91, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +62, 35, +55, 91, +62, 98, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +71, 33, +62, 35, +62, 98, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +71, 33, +62, 98, +71, 96, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +87, 32, +71, 33, +71, 96, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +87, 32, +71, 96, +87, 92, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +87, 92, +87, 92, +87, 92, +3, +#ifndef MONOCHROME_VECTORS +170, 0, 0, +#endif +87, 92, +87, 92, +87, 32, +3, +#ifndef MONOCHROME_VECTORS +190, 0, 0, +#endif +52, 56, +56, 63, +56, 37, +3, +#ifndef MONOCHROME_VECTORS +190, 0, 0, +#endif +52, 56, +56, 37, +52, 56, +3, +#ifndef MONOCHROME_VECTORS +190, 0, 0, +#endif +56, 63, +59, 67, +59, 43, +3, +#ifndef MONOCHROME_VECTORS +190, 0, 0, +#endif +56, 63, +59, 43, +56, 37, +3, +#ifndef MONOCHROME_VECTORS +190, 0, 0, +#endif +59, 67, +60, 47, +60, 47, +3, +#ifndef MONOCHROME_VECTORS +190, 0, 0, +#endif +59, 67, +60, 47, +59, 43, +3, +#ifndef MONOCHROME_VECTORS +150, 0, 0, +#endif +74, 69, +78, 49, +78, 68, +3, +#ifndef MONOCHROME_VECTORS +150, 0, 0, +#endif +74, 69, +78, 68, +74, 69, +3, +#ifndef MONOCHROME_VECTORS +150, 0, 0, +#endif +78, 49, +86, 41, +86, 64, +3, +#ifndef MONOCHROME_VECTORS +150, 0, 0, +#endif +78, 49, +86, 64, +78, 68, +3, +#ifndef MONOCHROME_VECTORS +150, 0, 0, +#endif +86, 41, +87, 41, +87, 41, +3, +#ifndef MONOCHROME_VECTORS +150, 0, 0, +#endif +86, 41, +87, 41, +86, 64, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +46, 92, +38, 104, +38, 104, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +46, 92, +38, 104, +46, 100, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +50, 91, +46, 92, +46, 100, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +50, 91, +46, 100, +50, 99, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +52, 89, +50, 91, +50, 99, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +52, 89, +50, 99, +52, 99, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +53, 93, +52, 93, +52, 93, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +53, 93, +52, 93, +53, 89, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +53, 89, +52, 89, +52, 99, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +53, 89, +52, 99, +53, 99, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +61, 101, +53, 93, +53, 99, +3, +#ifndef MONOCHROME_VECTORS +128, 0, 0, +#endif +61, 101, +53, 99, +61, 101, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 0, +#endif +54, 106, +52, 125, +52, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 0, +#endif +54, 106, +52, 125, +54, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 0, +#endif +58, 124, +54, 106, +54, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 0, +#endif +58, 124, +54, 125, +58, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 0, +#endif +58, 125, +87, 125, +87, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 0, +#endif +58, 125, +87, 125, +58, 124, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +61, 125, +60, 125, +60, 125, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +61, 125, +60, 125, +61, 125, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +61, 125, +84, 125, +84, 125, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +61, 125, +84, 125, +61, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 255, +#endif +70, 125, +64, 125, +64, 125, +3, +#ifndef MONOCHROME_VECTORS +0, 0, 255, +#endif +70, 125, +64, 125, +70, 125, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +53, 84, +58, 90, +58, 67, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +53, 84, +58, 67, +53, 84, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +58, 90, +62, 95, +62, 95, +3, +#ifndef MONOCHROME_VECTORS +128, 128, 0, +#endif +58, 90, +62, 95, +58, 67, +3, +#ifndef MONOCHROME_VECTORS +150, 150, 0, +#endif +53, 59, +53, 84, +53, 59, +3, +#ifndef MONOCHROME_VECTORS +150, 150, 0, +#endif +53, 59, +53, 59, +53, 59, +3, +#ifndef MONOCHROME_VECTORS +150, 150, 0, +#endif +53, 84, +58, 67, +58, 67, +3, +#ifndef MONOCHROME_VECTORS +150, 150, 0, +#endif +53, 84, +58, 67, +53, 59, +3, +#ifndef MONOCHROME_VECTORS +92, 92, 0, +#endif +74, 92, +62, 95, +62, 95, +3, +#ifndef MONOCHROME_VECTORS +92, 92, 0, +#endif +74, 92, +62, 95, +74, 69, +3, +#ifndef MONOCHROME_VECTORS +92, 92, 0, +#endif +86, 88, +74, 92, +74, 69, +3, +#ifndef MONOCHROME_VECTORS +92, 92, 0, +#endif +86, 88, +74, 69, +86, 88, +3, +#ifndef MONOCHROME_VECTORS +100, 100, 0, +#endif +62, 67, +58, 67, +58, 67, +3, +#ifndef MONOCHROME_VECTORS +100, 100, 0, +#endif +62, 67, +58, 67, +62, 95, +3, +#ifndef MONOCHROME_VECTORS +100, 100, 0, +#endif +74, 69, +62, 67, +62, 95, +3, +#ifndef MONOCHROME_VECTORS +100, 100, 0, +#endif +74, 69, +62, 95, +74, 69, +3, +#ifndef MONOCHROME_VECTORS +85, 68, 0, +#endif +86, 88, +74, 69, +74, 69, +3, +#ifndef MONOCHROME_VECTORS +85, 68, 0, +#endif +86, 88, +74, 69, +86, 64, +3, +#ifndef MONOCHROME_VECTORS +85, 68, 0, +#endif +86, 64, +86, 64, +86, 64, +3, +#ifndef MONOCHROME_VECTORS +85, 68, 0, +#endif +86, 64, +86, 64, +86, 88, +3, +#ifndef MONOCHROME_VECTORS +68, 120, 33, +#endif +40, 72, +39, 80, +39, 80, +3, +#ifndef MONOCHROME_VECTORS +68, 120, 33, +#endif +40, 72, +39, 80, +40, 80, +3, +#ifndef MONOCHROME_VECTORS +68, 120, 33, +#endif +40, 80, +51, 77, +51, 73, +3, +#ifndef MONOCHROME_VECTORS +68, 120, 33, +#endif +40, 80, +51, 73, +40, 72, +3, +#ifndef MONOCHROME_VECTORS +68, 120, 33, +#endif +51, 77, +51, 77, +51, 77, +3, +#ifndef MONOCHROME_VECTORS +68, 120, 33, +#endif +51, 77, +51, 77, +51, 73, +3, +#ifndef MONOCHROME_VECTORS +183, 200, 183, +#endif +73, 22, +70, 33, +70, 33, +3, +#ifndef MONOCHROME_VECTORS +183, 200, 183, +#endif +73, 22, +70, 33, +73, 33, +3, +#ifndef MONOCHROME_VECTORS +183, 200, 183, +#endif +73, 33, +87, 33, +87, 21, +3, +#ifndef MONOCHROME_VECTORS +183, 200, 183, +#endif +73, 33, +87, 21, +73, 22, +3, +#ifndef MONOCHROME_VECTORS +183, 200, 183, +#endif +87, 33, +87, 33, +87, 33, +3, +#ifndef MONOCHROME_VECTORS +183, 200, 183, +#endif +87, 33, +87, 33, +87, 21, +3, +#ifndef MONOCHROME_VECTORS +172, 157, 147, +#endif +49, 18, +43, 17, +43, 17, +3, +#ifndef MONOCHROME_VECTORS +172, 157, 147, +#endif +49, 18, +43, 17, +49, 13, +3, +#ifndef MONOCHROME_VECTORS +172, 157, 147, +#endif +68, 7, +49, 18, +49, 13, +3, +#ifndef MONOCHROME_VECTORS +172, 157, 147, +#endif +68, 7, +49, 13, +68, 1, +3, +#ifndef MONOCHROME_VECTORS +172, 157, 147, +#endif +78, 1, +68, 7, +68, 1, +3, +#ifndef MONOCHROME_VECTORS +172, 157, 147, +#endif +78, 1, +68, 1, +78, 1, +3, +#ifndef MONOCHROME_VECTORS +72, 62, 55, +#endif +45, 15, +43, 17, +43, 17, +3, +#ifndef MONOCHROME_VECTORS +72, 62, 55, +#endif +45, 15, +43, 17, +45, 1, +3, +#ifndef MONOCHROME_VECTORS +72, 62, 55, +#endif +68, 1, +45, 15, +45, 1, +3, +#ifndef MONOCHROME_VECTORS +72, 62, 55, +#endif +68, 1, +45, 1, +68, 1, +0}; + + + + #endif void MainMenu_initStateCallback(enum EGameMenuState tag) { (void)tag; - cursorPosition = 0; } void MainMenu_repaintCallback(void) { if (firstFrameOnCurrentState) { clearScreen(); #ifndef MONOCHROME_VECTORS - fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF00FF00), 0); + fillRect(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, getPaletteEntry(0xFF73ADA6), 0); #endif - drawGraphic(splashGraphics); + drawGraphic(0, 0, YRES_FRAMEBUFFER, YRES_FRAMEBUFFER, splashGraphics); + drawGraphic((XRES_FRAMEBUFFER / 2) + 8, 8, (XRES_FRAMEBUFFER / 2) - 16, (XRES_FRAMEBUFFER / 2) - 16, logoGraphics); playSound(MAIN_MENU_THEME); } drawWindowWithOptions( - (XRES_FRAMEBUFFER / 8) - (int) 9 - 3, - (YRES_FRAMEBUFFER / 8) - 3 - kMainMenuOptionsCount, + (XRES_FRAMEBUFFER / 8) - (int) 9 - 4, + (YRES_FRAMEBUFFER / 8) - 4 - kMainMenuOptionsCount, 9 + 2, kMainMenuOptionsCount + 2, - "Episode 0", + "Derelict", MainMenu_options, kMainMenuOptionsCount, cursorPosition); diff --git a/common/src/MusicAGA.c b/common/src/MusicAGA.c index 7591d1f1c..1b85c0fd4 100644 --- a/common/src/MusicAGA.c +++ b/common/src/MusicAGA.c @@ -122,8 +122,8 @@ void setupOPL2(int unused) { goto killaudio; } - memcpy(waveptr[c], audio.data, samples[c]); - free(audio.data); + memCopyToFrom(waveptr[c], audio.data, samples[c]); + disposeMem(audio.data); } return; diff --git a/common/src/UI.c b/common/src/UI.c index 4ed32a59a..4a66d00c6 100644 --- a/common/src/UI.c +++ b/common/src/UI.c @@ -51,16 +51,16 @@ drawWindowWithOptions(const int x, int isCursor = (selectedOption == c); if (isCursor) { - fillRect(x * 8 - 8, - (y + 2 + c) * 8 - 8, + fillRect((x) * 8, + (y + 2 + c) * 8, dx * 8, 8, getPaletteEntry(0xFF000000), FALSE); } - drawTextAt(x, - y + 1 + c, + drawTextAt(x + 1, + y + 2 + c, &options[c][0], isCursor ? getPaletteEntry(0xFFFFFFFF) : getPaletteEntry(0xFF000000)); } @@ -69,13 +69,19 @@ drawWindowWithOptions(const int x, void drawWindow(const int x, const int y, const unsigned int dx, const unsigned int dy, const char *title) { - fillRect((x) * 8, (y) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000), TRUE); - fillRect((x - 1) * 8, (y - 1) * 8, dx * 8, dy * 8, getPaletteEntry(0xFFFFFFFF), FALSE); - drawRect((x - 1) * 8, (y - 1) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000)); - fillRect((x - 1) * 8, (y - 1) * 8, dx * 8, 8, getPaletteEntry(0xFF000000), FALSE); + /* shadow */ + fillRect((x + 1) * 8, (y + 1) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000), TRUE); + + /* background */ + fillRect((x) * 8, (y) * 8, dx * 8, dy * 8, getPaletteEntry(0xFFFFFFFF), FALSE); + /* frame */ + drawRect((x) * 8, (y) * 8, dx * 8, dy * 8, getPaletteEntry(0xFF000000)); + /* title tab */ + fillRect((x) * 8, (y) * 8, dx * 8, 8, getPaletteEntry(0xFF000000), FALSE); + /* title text */ if (title != NULL) { - drawTextAt(x, y - 1, title, getPaletteEntry(0xFFFFFFFF)); + drawTextAt(x + 1, y, title, getPaletteEntry(0xFFFFFFFF)); } } @@ -157,9 +163,8 @@ void redrawHUD(void) { struct ObjectNode *head; int c; struct Item *itemPtr; - drawTextAtWithMargin(1, 1, XRES, thisMissionName, getPaletteEntry(0xFFFFFFFF)); - drawTextAt(1 + (XRES / 8), 1, " Map:", getPaletteEntry(0xFFFFFFFF)); + drawTextAt((XRES / 8), 0, thisMissionName, getPaletteEntry(0xFFFFFFFF)); #ifndef TILED_BITMAPS if (mapTopLevel != NULL) { @@ -168,7 +173,7 @@ void redrawHUD(void) { #else if (mapTopLevel[0] != NULL) { for (c = 0; c < 8; ++c) { - drawBitmap(((c & 3) * 32), 8 + (c >> 2) * 32, mapTopLevel[c], 1); + drawBitmap(XRES + ((c & 3) * 32), 72 + (c >> 2) * 32, mapTopLevel[c], 1); } } #endif @@ -188,9 +193,8 @@ void redrawHUD(void) { drawBitmapRaw(XRES + 8, 199 - 32 - 16 - 16, 32, 32, itemSprites[itemPtr->index]->rotations[0], 1); */ - drawTextAtWithMarginWithFiltering(2 + ((XRES) / 8), 23, XRES_FRAMEBUFFER, itemPtr->name, - itemPtr->active ? getPaletteEntry(0xFFAAAAAA) : getPaletteEntry( - 0xFFFFFFFF), '\n'); + drawTextAtWithMarginWithFiltering(((XRES) / 8), 22, XRES_FRAMEBUFFER, itemPtr->name, + itemPtr->active ? getPaletteEntry(0xFFAAAAAA) : getPaletteEntry(0xFFFFFFFF), '\n'); } ++line; } @@ -228,7 +232,7 @@ enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t opt return kResumeCurrentState; } -void drawGraphic(const uint8_t *graphic) { +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; int buffer[6]; @@ -244,43 +248,32 @@ void drawGraphic(const uint8_t *graphic) { int centerY = 0; if (npoints > 3) { - for (c = 0; c < npoints; ++c) { - centerX += shape[2 * c]; - centerY += shape[(2 * c) + 1]; - } - - centerX /= npoints; - centerY /= npoints; - - buffer[4] = centerX; - buffer[5] = centerY; - - for (c = 0; c < npoints - 1; ++c) { - - buffer[0] = shape[(2 * c) + 0]; - buffer[1] = shape[(2 * c) + 1]; - buffer[2] = shape[(2 * c) + 2]; - buffer[3] = shape[(2 * c) + 3]; - - fillTriangle(&buffer[0], colour); - } ptr += 2 * npoints; } else if (npoints == 3) { - buffer[0] = shape[0]; - buffer[1] = shape[1]; - buffer[2] = shape[2]; - buffer[3] = shape[3]; - buffer[4] = shape[4]; - buffer[5] = shape[5]; + buffer[0] = x + ((dx * shape[0]) / 128); + buffer[1] = y + ((dy * shape[1]) / 128); + buffer[2] = x + ((dx * shape[2]) / 128); + buffer[3] = y + ((dy * shape[3]) / 128); + buffer[4] = x + ((dx * shape[4]) / 128); + buffer[5] = y + ((dy * shape[5]) / 128); fillTriangle(&buffer[0], colour); ptr += 2 * npoints; } else if (npoints == 2) { - drawLine(shape[0], shape[1], shape[2], shape[3], colour); + drawLine(x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + x + ((dx * shape[2]) / 128), + y + ((dy * shape[3]) / 128), + colour); ptr += 2 * npoints; } else if (npoints == 1) { - fillRect(shape[0], shape[1], 1, 1, colour, FALSE); + fillRect(x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + 1, + 1, + colour, + FALSE); ptr += 2 * npoints; } } diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index d37cdc96e..d0ec27c83 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -9,7 +9,7 @@ SET(CMAKE_C_STANDARD_REQUIRED ON) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) -set(DERELICT_CORE_FEATURE_FLAGS "-DCLI_BUILD -DHAS_STDIO -DMOVE_TO_OBJECT_POSITION_WHEN_PICKING -DMORE_OBJECTS ") +set(DERELICT_CORE_FEATURE_FLAGS "-D_FORTIFY_SOURCE=3 -DCLI_BUILD -DHAS_STDIO -DMOVE_TO_OBJECT_POSITION_WHEN_PICKING -DMORE_OBJECTS ") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DERELICT_CORE_FEATURE_FLAGS} -W -Wall -Wextra -Wno-unused-parameter") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DERELICT_CORE_FEATURE_FLAGS} -Wno-writable-strings ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_LANG_CXX11=0") diff --git a/core/src/Core.c b/core/src/Core.c index f94b0dd1d..5f88c23d6 100644 --- a/core/src/Core.c +++ b/core/src/Core.c @@ -356,10 +356,14 @@ void moveBy(uint8_t direction) { playerLocation = room->connections[direction]; room = &rooms[playerLocation]; - for (c = 0; c < 6; ++c) { - if (room->connections[c] == previousLocation) { - direction = c; + if (direction < 4) { + for (c = 0; c < 6; ++c) { + if (room->connections[c] == previousLocation) { + direction = c; + } } + } else { + return; } switch (direction) { diff --git a/core/src/Derelict.c b/core/src/Derelict.c index 4c0608110..34c3ccaf6 100644 --- a/core/src/Derelict.c +++ b/core/src/Derelict.c @@ -193,7 +193,7 @@ void useCloggedFlush(struct Item *item) { struct Item *highRankKeycard = getItemNamed("high-rank-keycard"); (void)item; - if (highRankKeycard->roomId == 0) { + if (highRankKeycard->roomId == 0 && !playerHasObject("high-rank-keycard")) { defaultLogger("Found something among the\n...stuff..."); addToRoom("wc", highRankKeycard); } diff --git a/core/tests/TestDerelict.cpp b/core/tests/TestDerelict.cpp index 1d860e53c..f91743362 100644 --- a/core/tests/TestDerelict.cpp +++ b/core/tests/TestDerelict.cpp @@ -357,3 +357,25 @@ TEST_F(TestDerelict, cantUseKeyCard) { parseCommand("use", "hacked-keycard"); ASSERT_FALSE(getItemNamed("hacked-keycard")->active); } + +/* regression for https://github.com/TheFakeMontyOnTheRun/space-trashman-blues/issues/153 */ +TEST_F(TestDerelict, cantUseCloggedFlushTwice) { + setPlayerLocation(getRoomIdByName("wc")); + + ASSERT_FALSE(playerHasObject("high-rank-keycard")); + ASSERT_EQ(0, getItemNamed("high-rank-keycard")->roomId); + + parseCommand("use", "clogged-flush"); + ASSERT_NE(0, getItemNamed("high-rank-keycard")->roomId); + ASSERT_FALSE(playerHasObject("high-rank-keycard")); + + parseCommand("pick", "high-rank-keycard"); + + parseCommand("use", "clogged-flush"); + ASSERT_TRUE(playerHasObject("high-rank-keycard")); + ASSERT_EQ(0, getItemNamed("high-rank-keycard")->roomId); + + parseCommand("use", "clogged-flush"); + ASSERT_TRUE(playerHasObject("high-rank-keycard")); + ASSERT_EQ(0, getItemNamed("high-rank-keycard")->roomId); +} diff --git a/ee_frontend/CMakeLists.txt b/ee_frontend/CMakeLists.txt index 53509ddb7..fd0b1a717 100644 --- a/ee_frontend/CMakeLists.txt +++ b/ee_frontend/CMakeLists.txt @@ -16,7 +16,7 @@ include_directories(common/include) include_directories(menu/include) include_directories(SoundSystem) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DINCLUDE_ITEM_DESCRIPTIONS -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DTILED_BITMAPS -DSDLGL -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200" ) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DINCLUDE_ITEM_DESCRIPTIONS -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DTILED_BITMAPS -DSDLGL -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200" ) find_package(SDL2 REQUIRED) find_package(OpenGL REQUIRED) diff --git a/ee_frontend/base3d/src/Renderer.c b/ee_frontend/base3d/src/Renderer.c index 4ba3ab95c..b5d3d8cbc 100644 --- a/ee_frontend/base3d/src/Renderer.c +++ b/ee_frontend/base3d/src/Renderer.c @@ -190,9 +190,6 @@ void renderRoomTransition(void) { enter2D(); - drawTextAtWithMargin(((XRES / 8) / 2) - (thisMissionNameLen / 2), 1, XRES, thisMissionName, - getPaletteEntry(0xFFFFFFFF)); - zCameraOffset -= Div(intToFix(1), intToFix(32)); if (zCameraOffset == 0) { @@ -922,7 +919,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, 0, 1); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, 255, ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, 255, ' '); } diff --git a/ee_frontend/base3d/src/ee/LoadBitmap.c b/ee_frontend/base3d/src/ee/LoadBitmap.c index 619ddcaca..7a9730589 100644 --- a/ee_frontend/base3d/src/ee/LoadBitmap.c +++ b/ee_frontend/base3d/src/ee/LoadBitmap.c @@ -84,7 +84,7 @@ void bindTexture(struct Bitmap *bitmap) { int submitBitmapToGPU(struct Bitmap *bitmap) { - bitmap->nativeBuffer = (texbuffer_t *) calloc(1, sizeof(texbuffer_t)); + bitmap->nativeBuffer = (texbuffer_t *) allocMem(sizeof(texbuffer_t), BITMAP_MEMORY, TRUE); ((texbuffer_t *) bitmap->nativeBuffer)->width = bitmap->width; ((texbuffer_t *) bitmap->nativeBuffer)->psm = GS_PSM_32; ((texbuffer_t *) bitmap->nativeBuffer)->address = graph_vram_allocate(bitmap->width, bitmap->height, GS_PSM_32, @@ -119,7 +119,7 @@ struct Bitmap *loadBitmap(const char *filename) { struct StaticBuffer src = loadBinaryFileFromPath(filename); struct Bitmap *toReturn = - (struct Bitmap *) calloc(1, sizeof(struct Bitmap)); + (struct Bitmap *) allocMem(sizeof(struct Bitmap), BITMAP_MEMORY, TRUE); size_t sizeInDisk = src.size - 4; //total size minus the header @@ -138,11 +138,11 @@ struct Bitmap *loadBitmap(const char *filename) { size_t size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - uint8_t *buffer = (uint8_t *) calloc(1, sizeInDisk); + uint8_t *buffer = (uint8_t *) allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom(buffer, ptr, sizeInDisk); - toReturn->data = (TexturePixelFormat *) calloc(1, size); + toReturn->data = (TexturePixelFormat *) allocMem(size, BITMAP_MEMORY, TRUE); uint8_t repetitions; int pixelIndex = 0; diff --git a/ee_frontend/base3d/src/ee/Renderer.c b/ee_frontend/base3d/src/ee/Renderer.c index 107ace434..9f96b5e29 100644 --- a/ee_frontend/base3d/src/ee/Renderer.c +++ b/ee_frontend/base3d/src/ee/Renderer.c @@ -1045,7 +1045,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, 0, 1); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, 255, ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, 255, ' '); } diff --git a/ee_frontend/base3d/src/ee/RendererRasterization.c b/ee_frontend/base3d/src/ee/RendererRasterization.c index 9174b73fe..399e4e1c9 100644 --- a/ee_frontend/base3d/src/ee/RendererRasterization.c +++ b/ee_frontend/base3d/src/ee/RendererRasterization.c @@ -347,7 +347,21 @@ void drawRepeatBitmap( } } -void drawTextAt(const int _x, const int _y, const char *text, const FramebufferPixelFormat colour) { +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + +void drawTextAt(const int x, const int y, const char *text, const FramebufferPixelFormat colour) { + + drawTextAtWithMargin(x, y, (XRES_FRAMEBUFFER - 1), text, colour); +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, + const uint8_t colour, char charToReplaceHifenWith) { if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); @@ -358,50 +372,62 @@ void drawTextAt(const int _x, const int _y, const char *text, const FramebufferP } size_t len = strlen(text); - int32_t dstX = (_x) * 8; - int32_t dstY = (_y) * 8; - size_t c; - uint32_t ascii; - float line; - float col; - + int32_t dstX = x * 8; + int32_t dstY = y * 8; float fontWidth = defaultFont->width; float fontHeight = defaultFont->height; float blockWidth = (8.0f / fontWidth) * 0.999f; float blockHeight = (8.0f / fontHeight) * 0.999f; + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + for (c = 0; c < len; ++c) { - if (text[c] == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x - 1) * 8; + uint8_t ascii; + float line; + float col; + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } - if (text[c] == ' ' || text[c] == '\r') { + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } - ascii = text[c] - ' '; + ascii = currentChar - ' '; line = (((float) ((ascii >> 5))) * blockHeight); col = (((ascii & 31)) * blockWidth); - drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, line + blockHeight); + drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, + line + blockHeight); dstX += 8; } } - -void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { - -} - -void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, - const uint8_t colour, char charToReplaceHifenWith) { - drawTextAt(x, y, text, colour); -} - -void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { - drawTextAt(x, y, text, colour); -} \ No newline at end of file diff --git a/ee_frontend/base3d/src/ee/RendererTesselation.c b/ee_frontend/base3d/src/ee/RendererTesselation.c index 15faa99b5..2534f9c1d 100644 --- a/ee_frontend/base3d/src/ee/RendererTesselation.c +++ b/ee_frontend/base3d/src/ee/RendererTesselation.c @@ -117,7 +117,7 @@ float clampf(float v0, float v1, float v) { struct Texture *makeTextureFrom(const char *filename) { struct Texture *toReturn = - (struct Texture *) calloc(1, sizeof(struct Texture)); + (struct Texture *) allocMem(sizeof(struct Texture), BITMAP_MEMORY, TRUE); toReturn->raw = loadBitmap(filename); submitBitmapToGPU(toReturn->raw); diff --git a/ee_frontend/base3d/src/es/GLESCommon.c b/ee_frontend/base3d/src/es/GLESCommon.c index f354a516f..ce61782eb 100644 --- a/ee_frontend/base3d/src/es/GLESCommon.c +++ b/ee_frontend/base3d/src/es/GLESCommon.c @@ -397,8 +397,7 @@ void initGL(void) { GLint maxLength = 0; glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &maxLength); - char *errorLog = (char *) malloc(maxLength); - memset(errorLog, 0, maxLength); + char *errorLog = (char *) allocMem(maxLength, GENERAL_MEMORY, TRUE); glGetShaderInfoLog(vs, maxLength, &maxLength, errorLog); @@ -417,7 +416,7 @@ void initGL(void) { glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &maxLength); char *errorLog = (char *) malloc(maxLength); - memset(errorLog, 0, maxLength); + memFill(errorLog, 0, maxLength); glGetShaderInfoLog(fs, maxLength, &maxLength, errorLog); diff --git a/ee_frontend/base3d/src/es/LoadBitmap.c b/ee_frontend/base3d/src/es/LoadBitmap.c index b8cc03f6c..ceb974763 100644 --- a/ee_frontend/base3d/src/es/LoadBitmap.c +++ b/ee_frontend/base3d/src/es/LoadBitmap.c @@ -28,7 +28,7 @@ struct Bitmap *loadBitmap(const char *filename) { struct StaticBuffer src = loadBinaryFileFromPath(filename); struct Bitmap *toReturn = - (struct Bitmap *) calloc(1, sizeof(struct Bitmap)); + (struct Bitmap *) allocMem(sizeof(struct Bitmap), BITMAP_MEMORY, TRUE); size_t sizeInDisk = src.size - 4; //total size minus the header @@ -47,11 +47,11 @@ struct Bitmap *loadBitmap(const char *filename) { size_t size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - uint8_t *buffer = (uint8_t *) calloc(1, sizeInDisk); + uint8_t *buffer = (uint8_t *) allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom(buffer, ptr, sizeInDisk); - toReturn->data = (TexturePixelFormat *) calloc(1, size); + toReturn->data = (TexturePixelFormat *) allocMem(size, BITMAP_MEMORY, TRUE); uint8_t repetitions; int pixelIndex = 0; diff --git a/ee_frontend/base3d/src/es/RendererRasterization.c b/ee_frontend/base3d/src/es/RendererRasterization.c index 8cf184b10..a5ba1e5bf 100644 --- a/ee_frontend/base3d/src/es/RendererRasterization.c +++ b/ee_frontend/base3d/src/es/RendererRasterization.c @@ -125,48 +125,74 @@ void drawRepeatBitmap( } } +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + void drawTextAt(const int x, const int y, const char *text, const FramebufferPixelFormat colour) { - drawTextAtWithMargin(x, y, XRES_FRAMEBUFFER / 8, text, colour); + + drawTextAtWithMargin(x, y, (XRES_FRAMEBUFFER - 1), text, colour); } -void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int margin, +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, const uint8_t colour, char charToReplaceHifenWith) { - - if (defaultFont == NULL) { + if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); } - size_t len = strlen(text); - int32_t dstX = (_x) * 8; - int32_t dstY = (_y) * 8; - size_t c; - uint32_t ascii; - float line; - float col; + if (defaultFont->uploadId == -1) { + submitBitmapToGPU(defaultFont); + } + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; float fontWidth = defaultFont->width; float fontHeight = defaultFont->height; float blockWidth = (8.0f / fontWidth) * 0.999f; float blockHeight = (8.0f / fontHeight) * 0.999f; + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + for (c = 0; c < len; ++c) { + uint8_t ascii; + float line; + float col; + char currentChar = text[c]; - if (currentChar == '-') { - currentChar = charToReplaceHifenWith; - } + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } - if (currentChar == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x - 1) * 8; + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } - if (currentChar == ' ' || currentChar == '\r') { + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } ascii = currentChar - ' '; @@ -184,8 +210,3 @@ void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int margin, void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { } - -void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, - const FramebufferPixelFormat colour) { - drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); -} diff --git a/ee_frontend/base3d/src/es/RendererTesselation.c b/ee_frontend/base3d/src/es/RendererTesselation.c index 2616a1c61..20887f1ea 100644 --- a/ee_frontend/base3d/src/es/RendererTesselation.c +++ b/ee_frontend/base3d/src/es/RendererTesselation.c @@ -423,7 +423,7 @@ float clampf(float v0, float v1, float v) { struct Texture *makeTextureFrom(const char *filename) { struct Texture *toReturn = - (struct Texture *) calloc(1, sizeof(struct Texture)); + (struct Texture *) allocMem(sizeof(struct Texture), BITMAP_MEMORY, TRUE); toReturn->raw = loadBitmap(filename); @@ -929,9 +929,9 @@ void drawMesh(struct Mesh *mesh, const struct Vec3 center, enum EDirection rotat if (mesh->nativeBuffer == NULL) { - mesh->nativeVertexBuffer = calloc( 3 * 3 * count, sizeof(float)); - mesh->nativeTexCoordBuffer = calloc( 2 * 3 * count, sizeof(float)); - mesh->nativeIndicesBuffer = calloc( 3 * count, sizeof(unsigned short)); + mesh->nativeVertexBuffer = allocMem( 3 * 3 * count * sizeof(float), GENERAL_MEMORY, TRUE); + mesh->nativeTexCoordBuffer = allocMem( 2 * 3 * count * sizeof(float), GENERAL_MEMORY, TRUE); + mesh->nativeIndicesBuffer = allocMem( 3 * count * sizeof(unsigned short), GENERAL_MEMORY, TRUE); float* vP = mesh->nativeVertexBuffer; float* tP = mesh->nativeTexCoordBuffer; @@ -985,7 +985,7 @@ void drawMesh(struct Mesh *mesh, const struct Vec3 center, enum EDirection rotat vertexData += 9; } - mesh->nativeBuffer = calloc(1, sizeof(struct VBORegister)); + mesh->nativeBuffer = allocMem(sizeof(struct VBORegister), GENERAL_MEMORY, TRUE); *((struct VBORegister*)mesh->nativeBuffer) = submitVBO((float *) mesh->nativeVertexBuffer, mesh->nativeTexCoordBuffer, count * 3, (unsigned short *) mesh->nativeIndicesBuffer, count * 3); diff --git a/ee_frontend/base3d/src/es/SDL2GL2Version.c b/ee_frontend/base3d/src/es/SDL2GL2Version.c index 0e364b8ed..e70ca0598 100644 --- a/ee_frontend/base3d/src/es/SDL2GL2Version.c +++ b/ee_frontend/base3d/src/es/SDL2GL2Version.c @@ -33,7 +33,7 @@ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/ee_frontend/base3d/src/gx/GXRenderer.c b/ee_frontend/base3d/src/gx/GXRenderer.c index 27d6df8c2..3aa1048ca 100644 --- a/ee_frontend/base3d/src/gx/GXRenderer.c +++ b/ee_frontend/base3d/src/gx/GXRenderer.c @@ -72,7 +72,7 @@ void graphicsInit(void) { rmode = VIDEO_GetPreferredMode(NULL); gpfifo = memalign(32, DEFAULT_FIFO_SIZE); - memset(gpfifo, 0, DEFAULT_FIFO_SIZE); + memFill(gpfifo, 0, DEFAULT_FIFO_SIZE); frameBuffer[0] = SYS_AllocateFramebuffer(rmode); frameBuffer[1] = SYS_AllocateFramebuffer(rmode); @@ -131,7 +131,7 @@ void graphicsInit(void) { GX_SetAlphaCompare(GX_GREATER, 0, GX_AOP_AND, GX_ALWAYS, 0); GX_SetZCompLoc(GX_FALSE); - memset(&whiteTextureData[0], 0xFF, 32 * 32 * 4); + memFill(&whiteTextureData[0], 0xFF, 32 * 32 * 4); GX_InitTexObj(&whiteTextureObj, &whiteTextureData[0], 32, 32, GX_TF_RGBA8, GX_REPEAT, GX_REPEAT, GX_FALSE); } diff --git a/ee_frontend/base3d/src/gx/LoadBitmap.c b/ee_frontend/base3d/src/gx/LoadBitmap.c index 5d37dd4a7..9ece35e79 100644 --- a/ee_frontend/base3d/src/gx/LoadBitmap.c +++ b/ee_frontend/base3d/src/gx/LoadBitmap.c @@ -60,7 +60,7 @@ struct Bitmap *loadBitmap(const char *filename) { struct StaticBuffer src = loadBinaryFileFromPath(filename); struct Bitmap *toReturn = - (struct Bitmap *) calloc(1, sizeof(struct Bitmap)); + (struct Bitmap *) allocMem(sizeof(struct Bitmap), BITMAP_MEMORY, TRUE); size_t sizeInDisk = src.size - 4; //total size minus the header @@ -79,7 +79,7 @@ struct Bitmap *loadBitmap(const char *filename) { size_t size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - uint8_t *buffer = (uint8_t *) calloc(1, sizeInDisk); + uint8_t *buffer = (uint8_t *) allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom(buffer, ptr, sizeInDisk); diff --git a/ee_frontend/base3d/src/gx/RendererRasterization.c b/ee_frontend/base3d/src/gx/RendererRasterization.c index 2339574b8..81ceac826 100644 --- a/ee_frontend/base3d/src/gx/RendererRasterization.c +++ b/ee_frontend/base3d/src/gx/RendererRasterization.c @@ -161,62 +161,87 @@ void drawRepeatBitmap( } } -void drawTextAt(const int _x, const int _y, const char *text, const FramebufferPixelFormat colour) { +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + +void drawTextAt(const int x, const int y, const char *text, const FramebufferPixelFormat colour) { + + drawTextAtWithMargin(x, y, (XRES_FRAMEBUFFER - 1), text, colour); +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, + const uint8_t colour, char charToReplaceHifenWith) { if (defaultFont == NULL) { defaultFont = loadBitmap("font.img"); } - if (defaultFont->nativeBuffer == NULL || defaultFont->uploadId == -1) { + if (defaultFont->uploadId == -1) { submitBitmapToGPU(defaultFont); } - bindTexture(defaultFont); size_t len = strlen(text); - int32_t dstX = (_x) * 8; - int32_t dstY = (_y) * 8; - size_t c; - uint32_t ascii; - float line; - float col; - + int32_t dstX = x * 8; + int32_t dstY = y * 8; float fontWidth = defaultFont->width; - float fontHeight = 32.0f; //defaultFont->height; + float fontHeight = defaultFont->height; float blockWidth = (8.0f / fontWidth) * 0.999f; float blockHeight = (8.0f / fontHeight) * 0.999f; + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + for (c = 0; c < len; ++c) { - if (text[c] == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (_x - 1) * 8; + uint8_t ascii; + float line; + float col; + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } - if (text[c] == ' ' || text[c] == '\r') { + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } - ascii = text[c] - ' '; + ascii = currentChar - ' '; line = (((float) ((ascii >> 5))) * blockHeight); col = (((ascii & 31)) * blockWidth); - drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, line + blockHeight); + drawBitmapRegion(dstX, dstY, 8, 8, colour, defaultFont, 1, col, col + blockWidth, line, + line + blockHeight); dstX += 8; } -} - -void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { - -} - -void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *__restrict__ text, - const uint8_t colour, char charToReplaceHifenWith) { - drawTextAt(x, y, text, colour); -} - -void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const FramebufferPixelFormat colour) { - drawTextAt(x, y, text, colour); } \ No newline at end of file diff --git a/ee_frontend/base3d/src/gx/RendererTesselation.c b/ee_frontend/base3d/src/gx/RendererTesselation.c index b5e44dfe7..5dc9c35bc 100644 --- a/ee_frontend/base3d/src/gx/RendererTesselation.c +++ b/ee_frontend/base3d/src/gx/RendererTesselation.c @@ -103,7 +103,7 @@ float clampf(float v0, float v1, float v) { struct Texture *makeTextureFrom(const char *filename) { struct Texture *toReturn = - (struct Texture *) calloc(1, sizeof(struct Texture)); + (struct Texture *) allocMem(sizeof(struct Texture), BITMAP_MEMORY, TRUE); toReturn->raw = loadBitmap(filename); diff --git a/gl_frontend/CMakeLists.txt b/gl_frontend/CMakeLists.txt index a9e3de780..0f399782b 100644 --- a/gl_frontend/CMakeLists.txt +++ b/gl_frontend/CMakeLists.txt @@ -16,7 +16,7 @@ include_directories(../common/include) include_directories(base3d/include) include_directories(menu/include) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DTILED_BITMAPS -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -Wno-unused-parameter -Wno-switch -Wno-unused-variable -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200 -DXRES_SCREEN=320 -DYRES_SCREEN=240") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DTILED_BITMAPS -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -Wno-unused-parameter -Wno-switch -Wno-unused-variable -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200 -DXRES_SCREEN=320 -DYRES_SCREEN=240") find_package(SDL2 REQUIRED) find_package(OpenGL REQUIRED) diff --git a/gl_frontend/GL1Common/Renderer.c b/gl_frontend/GL1Common/Renderer.c index 2e2f13a83..e300555fa 100644 --- a/gl_frontend/GL1Common/Renderer.c +++ b/gl_frontend/GL1Common/Renderer.c @@ -398,9 +398,6 @@ void renderRoomTransition(void) { #endif enter2D(); - drawTextAtWithMargin(((XRES / 8) / 2) - (thisMissionNameLen / 2), 1, XRES, thisMissionName, - getPaletteEntry(0xFFFFFFFF)); - zCameraOffset -= Div(intToFix(1), intToFix(32)); if (zCameraOffset == 0) { @@ -1006,7 +1003,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, getPaletteEntry(0xFF000000), TRUE); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, getPaletteEntry(0xFFFFFFFF), ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, getPaletteEntry(0xFFFFFFFF), ' '); } diff --git a/gl_frontend/GL1Common/RendererRasterization.c b/gl_frontend/GL1Common/RendererRasterization.c index 1cd435637..319747f67 100644 --- a/gl_frontend/GL1Common/RendererRasterization.c +++ b/gl_frontend/GL1Common/RendererRasterization.c @@ -414,9 +414,13 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con if (currentChar == '-') { currentChar = charToReplaceHifenWith; } - if (currentChar == '\n' || dstX >= XRES_FRAMEBUFFER) { - dstX = (x - 1) * 8; + if (currentChar == '\n' || (dstX >= XRES_FRAMEBUFFER) || (dstX >= ((margin - 1) * 8)) ) { + dstX = (x) * 8; +#ifndef N64 dstY += 8; +#else + dstY += 9; +#endif continue; } diff --git a/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c b/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c index 3099986a0..87b79e65b 100644 --- a/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c +++ b/gl_frontend/base3d/src/SDLVersion/CSDL2Renderer.c @@ -27,7 +27,7 @@ #ifdef __EMSCRIPTEN__ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/mx_frontend/CMakeLists.txt b/mx_frontend/CMakeLists.txt index 88df8afb2..c1080969d 100644 --- a/mx_frontend/CMakeLists.txt +++ b/mx_frontend/CMakeLists.txt @@ -15,7 +15,7 @@ include_directories(base3d/include) include_directories(common/include) include_directories(menu/include) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLSW -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DPAGE_FLIP_ANIMATION -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DSDLSW -DCLI_BUILD -DSUPPORTS_HACKING_MINIGAME -DPAGE_FLIP_ANIMATION -DINCLUDE_ITEM_DESCRIPTIONS -Wall -Wextra -pedantic -g -DENDIANESS_AWARE -DEMIT_QUIT_OPTION -DSDL_DISABLE_IMMINTRIN_H -DXRES_FRAMEBUFFER=320 -DYRES_FRAMEBUFFER=200") find_package(SDL2 REQUIRED) diff --git a/mx_frontend/DerelictMacOSClassic/Derelict.xSYM b/mx_frontend/DerelictMacOSClassic/Derelict.xSYM index 2c3b9c3a0..f094bd572 100644 Binary files a/mx_frontend/DerelictMacOSClassic/Derelict.xSYM and b/mx_frontend/DerelictMacOSClassic/Derelict.xSYM differ diff --git a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic index db05bc95d..c493b961a 100644 Binary files a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic and b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic differ diff --git a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict Debug/TargetDataMacOS.tdt b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict Debug/TargetDataMacOS.tdt index 6efc93602..a8f567f06 100644 Binary files a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict Debug/TargetDataMacOS.tdt and b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict Debug/TargetDataMacOS.tdt differ diff --git a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict/TargetDataMacOS.tdt b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict/TargetDataMacOS.tdt index 7857b17a2..00df42ec9 100644 Binary files a/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict/TargetDataMacOS.tdt and b/mx_frontend/DerelictMacOSClassic/DerelictMacOSClassic Data/Derelict/TargetDataMacOS.tdt differ diff --git a/mx_frontend/DerelictMacOSClassic/MacFileReader.c b/mx_frontend/DerelictMacOSClassic/MacFileReader.c index 236de48b6..9f4e514b8 100644 --- a/mx_frontend/DerelictMacOSClassic/MacFileReader.c +++ b/mx_frontend/DerelictMacOSClassic/MacFileReader.c @@ -99,7 +99,7 @@ uint8_t* readFully(char *filename) { assert(size); - resultBuffer = (uint8_t*)calloc(1, size); + resultBuffer = (uint8_t*)allocMem(size, BITMAP_MEMORY, TRUE); assert(resultBuffer); rewind( filePtr ); @@ -200,7 +200,7 @@ struct StaticBuffer loadBinaryFileFromPath(const char * __restrict__ path) { assert (fread(&size, 4, 1, mDataPack)); size = toNativeEndianess(size); toReturn.size = size; - toReturn.data = (uint8_t *) malloc(size); + toReturn.data = (uint8_t *) allocMem(size, GENERAL_MEMORY, 0); assert (fread((void*)toReturn.data, sizeof(uint8_t), size, mDataPack)); fclose(mDataPack); @@ -257,5 +257,5 @@ FILE *openBinaryFileFromPath(const char * __restrict__ path) { } void disposeDiskBuffer(struct StaticBuffer buffer) { - free((void*)buffer.data); -} \ No newline at end of file + disposeMem((void*)buffer.data); +} diff --git a/mx_frontend/DerelictMacOSClassic/MacRenderer.c b/mx_frontend/DerelictMacOSClassic/MacRenderer.c index 67338b9fe..221db4014 100644 --- a/mx_frontend/DerelictMacOSClassic/MacRenderer.c +++ b/mx_frontend/DerelictMacOSClassic/MacRenderer.c @@ -420,7 +420,7 @@ void flipRenderer(void) { rowBytes = ((*pixmap)->rowBytes & 0x3FFF); for (c = 0; c < YRES_FRAMEBUFFER; ++c ) { - memcpy( baseAddr + offset, &stretchedBuffer[XRES_FRAMEBUFFER * c], XRES_FRAMEBUFFER); + memCopyToFrom( baseAddr + offset, &stretchedBuffer[XRES_FRAMEBUFFER * c], XRES_FRAMEBUFFER); offset = offset + rowBytes; } diff --git a/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c b/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c index 350d034ab..7e6fea0f9 100644 --- a/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c +++ b/mx_frontend/NDK-version/app/src/main/cpp/native-lib.c @@ -152,7 +152,7 @@ Java_pt_b13h_spacetrashmanblues_DerelictJNI_getPixelsFromNative(JNIEnv *env, jcl menuTick(33); flipRenderer(); jbyte *narr = (*env)->GetByteArrayElements(env, array, NULL); - memcpy(narr, &framebufferFinal[0], 320 * 240 * 4); + memCopyToFrom(narr, &framebufferFinal[0], 320 * 240 * 4); } int soundToPlay = -1; diff --git a/mx_frontend/Xcode2/GameView.m b/mx_frontend/Xcode2/GameView.m index 372fca1ab..2c277ae87 100644 --- a/mx_frontend/Xcode2/GameView.m +++ b/mx_frontend/Xcode2/GameView.m @@ -198,15 +198,15 @@ -(void) stopTimer { void shutdownHW(void) { CGColorSpaceRelease(rgb); - - free(textBuffer); - free(messageLogBuffer); - free(collisionMap); - free(visMap); - free(distances); - free(textures); - free(itemsInMap); - free(map); + + disposeMem(textBuffer); + disposeMem(messageLogBuffer); + disposeMem(collisionMap); + disposeMem(visMap); + disposeMem(distances); + disposeMem(textures); + disposeMem(itemsInMap); + disposeMem(map); } @@ -240,8 +240,8 @@ - (void)drawRect:(NSRect)rect { ++bufferPtr; } } - - memcpy( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + + memCopyToFrom( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); /* MAC_OS_X_VERSION_10_10*/ #if MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 diff --git a/mx_frontend/Xcode2/OSXRenderer.m b/mx_frontend/Xcode2/OSXRenderer.m index 991fa3cb4..042bc3227 100644 --- a/mx_frontend/Xcode2/OSXRenderer.m +++ b/mx_frontend/Xcode2/OSXRenderer.m @@ -39,14 +39,14 @@ extern struct Texture* textures; void initHW(int argc, char** argv) { - textBuffer = (char*)calloc(TEXT_BUFFER_SIZE, 1); - messageLogBuffer = (char*)calloc(256, 1); - collisionMap = (uint8_t*)calloc(256, 1); - visMap = (enum EVisibility*)calloc(MAP_SIZE * MAP_SIZE, sizeof(enum EVisibility)); - distances = (struct Vec2i*)calloc(2 * MAP_SIZE * MAP_SIZE, sizeof(struct Vec2i)); - textures = (struct Texture*)calloc(TOTAL_TEXTURES, sizeof(struct Texture)); - itemsInMap = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); - map = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); + textBuffer = (char*)allocMem(TEXT_BUFFER_SIZE, GENERAL_MEMORY, TRUE); + messageLogBuffer = (char*)allocMem(256, GENERAL_MEMORY, TRUE); + collisionMap = (uint8_t*)allocMem(256, GENERAL_MEMORY, TRUE); + visMap = (enum EVisibility*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(enum EVisibility), GENERAL_MEMORY, TRUE); + distances = (struct Vec2i*)allocMem(2 * MAP_SIZE * MAP_SIZE * sizeof(struct Vec2i), GENERAL_MEMORY, TRUE); + textures = (struct Texture*)allocMem(TOTAL_TEXTURES * sizeof(struct Texture), GENERAL_MEMORY, TRUE); + itemsInMap = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); + map = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"base.pfs"]; initFileReader([path UTF8String]); diff --git a/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m b/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m index ff6e0790c..101d4bfe8 100644 --- a/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m +++ b/mx_frontend/Xcode4-ios/Derelict32-ios/Derelict32-ios/ViewController.m @@ -60,14 +60,14 @@ uint8_t getPaletteEntry(const uint32_t origin) { void initHW(int argc, char** argv) { - textBuffer = (char*)calloc(TEXT_BUFFER_SIZE, 1); - messageLogBuffer = (char*)calloc(256, 1); - collisionMap = (uint8_t*)calloc(256, 1); - visMap = (enum EVisibility*)calloc(MAP_SIZE * MAP_SIZE, sizeof(enum EVisibility)); - distances = (struct Vec2i*)calloc(2 * MAP_SIZE * MAP_SIZE, sizeof(struct Vec2i)); - textures = (struct Texture*)calloc(TOTAL_TEXTURES, sizeof(struct Texture)); - itemsInMap = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); - map = (uint8_t*)calloc(MAP_SIZE * MAP_SIZE, sizeof(uint8_t*)); + textBuffer = (char*)allocMem(TEXT_BUFFER_SIZE, GENERAL_MEMORY, TRUE); + messageLogBuffer = (char*)allocMem(256, GENERAL_MEMORY, TRUE); + collisionMap = (uint8_t*)allocMem(256, GENERAL_MEMORY, TRUE); + visMap = (enum EVisibility*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(enum EVisibility), GENERAL_MEMORY, TRUE); + distances = (struct Vec2i*)allocMem(2 * MAP_SIZE * MAP_SIZE * sizeof(struct Vec2i), GENERAL_MEMORY, TRUE); + textures = (struct Texture*)allocMem(TOTAL_TEXTURES * sizeof(struct Texture), GENERAL_MEMORY, TRUE); + itemsInMap = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); + map = (uint8_t*)allocMem(MAP_SIZE * MAP_SIZE * sizeof(uint8_t*), GENERAL_MEMORY, TRUE); NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"base.pfs"]; initFileReader([path UTF8String]); @@ -160,14 +160,14 @@ -(void) stopTimer { } void shutdownHW(void) { - free(textBuffer); - free(messageLogBuffer); - free(collisionMap); - free(visMap); - free(distances); - free(textures); - free(itemsInMap); - free(map); + disposeMem(textBuffer); + disposeMem(messageLogBuffer); + disposeMem(collisionMap); + disposeMem(visMap); + disposeMem(distances); + disposeMem(textures); + disposeMem(itemsInMap); + disposeMem(map); CGColorSpaceRelease(rgb); } @@ -205,8 +205,8 @@ - ( void ) draw { ++bufferPtr; } } - - memcpy( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + + memCopyToFrom( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); CGContextRef context = UIGraphicsGetCurrentContext(); diff --git a/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c b/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c index f0ac28f5a..a5d6c3bdd 100644 --- a/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c +++ b/mx_frontend/base3d/src/AGSVersion/AGSRenderer.c @@ -70,8 +70,8 @@ void graphicsInit(void) { SetMode( MODE_4 | BG2_ON ); // screen mode & background to display - framebuffer = (uint8_t*)malloc(XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); - memset(palette, 0, sizeof(uint16_t) * 256); + framebuffer = (uint8_t*)allocMem(XRES_FRAMEBUFFER * YRES_FRAMEBUFFER, GENERAL_MEMORY, FALSE); + memFill(palette, 0, sizeof(uint16_t) * 256); for (b = 0; b < 256; b += 16) { for (g = 0; g < 256; g += 8) { diff --git a/mx_frontend/base3d/src/LoadBitmap.c b/mx_frontend/base3d/src/LoadBitmap.c index ef2463ea0..8f362584e 100644 --- a/mx_frontend/base3d/src/LoadBitmap.c +++ b/mx_frontend/base3d/src/LoadBitmap.c @@ -201,13 +201,13 @@ struct Bitmap *loadBitmap(const char *__restrict__ filename) { tmp = *ptr++; toReturn->height += tmp & 0xFF; - uint8_t* buffer = (uint8_t*)calloc(1, sizeInDisk); + uint8_t* buffer = (uint8_t*)allocMem(sizeInDisk, BITMAP_MEMORY, TRUE); memCopyToFrom((void*)buffer, (void*)ptr, sizeInDisk); size = toReturn->width * toReturn->height * sizeof(BitmapPixelFormat); - toReturn->data = (TexturePixelFormat*)calloc(1, size); + toReturn->data = (TexturePixelFormat*)allocMem(size, BITMAP_MEMORY, TRUE); int pixelIndex = 0; diff --git a/mx_frontend/base3d/src/Renderer.c b/mx_frontend/base3d/src/Renderer.c index 4c5893801..4b4fb0567 100644 --- a/mx_frontend/base3d/src/Renderer.c +++ b/mx_frontend/base3d/src/Renderer.c @@ -230,8 +230,6 @@ void renderRoomTransition(void) { center.mZ = intToFix(3); drawCeilingAt(center, nativeTextures[0], kNorth); - drawTextAtWithMargin(((XRES / 8) / 2) - (thisMissionNameLen / 2), 1, XRES, thisMissionName, getPaletteEntry(0xFFFFFFFF)); - zCameraOffset -= Div(intToFix(1), intToFix(4)); if (zCameraOffset == 0) { @@ -855,7 +853,7 @@ void render(const long ms) { size_t len = strlen(focusItemName); int lines = 1 + (len / 27); fillRect(0, YRES - (8 * lines), XRES, lines * 8, 0, 1); - drawTextAtWithMarginWithFiltering(1, 26 - lines, XRES, focusItemName, 255, ' '); + drawTextAtWithMarginWithFiltering(1, (YRES / 8) - lines, XRES, focusItemName, 255, ' '); } diff --git a/mx_frontend/base3d/src/RendererRasterization.c b/mx_frontend/base3d/src/RendererRasterization.c index 1e214c7a5..c09a4e493 100644 --- a/mx_frontend/base3d/src/RendererRasterization.c +++ b/mx_frontend/base3d/src/RendererRasterization.c @@ -35,7 +35,7 @@ #define FIXP_YRES intToFix(YRES) enum ECommand mTurnBuffer; -uint16_t clippingY1 = YRES_FRAMEBUFFER; +uint16_t clippingY1 = YRES_FRAMEBUFFER - 1; /* * /|x1y0 @@ -149,8 +149,8 @@ void maskWall( ix = 0; } - if (limit > XRES) { - limit = XRES; + if (limit >= XRES) { + limit = XRES - 1; } for (; ix < limit; ++ix) { @@ -172,7 +172,7 @@ void maskWall( } if (iY1 >= YRES) { - iY1 = YRES; + iY1 = YRES - 1; continue; } @@ -316,8 +316,8 @@ void drawWall(FixP_t x0, ix = 0; } - if (limit > XRES) { - limit = XRES; + if (limit >= XRES) { + limit = XRES - 1; } for (; ix < limit; ++ix) { @@ -352,7 +352,7 @@ void drawWall(FixP_t x0, iy = iY0; if (iY1 >= YRES) { - iY1 = YRES; + iY1 = YRES - 1; } if (iy < 0) { @@ -530,7 +530,7 @@ void drawFrontWall(FixP_t x0, } if (limit > YRES) { - limit = YRES; + limit = YRES - 1; } for (; iy < limit; ++iy) { @@ -570,7 +570,7 @@ void drawFrontWall(FixP_t x0, } if (iX1 >= XRES) { - iX1 = XRES; + iX1 = XRES - 1; } stipple = (((ix + iy) & 1)) ? 0xFFFFFFFF : 0; @@ -690,8 +690,8 @@ void maskFloor(FixP_t y0, FixP_t y1, FixP_t x0y0, FixP_t x1y0, FixP_t x0y1, FixP x1 = upperX1; iy = y; - if (limit > YRES) { - limit = YRES; + if (limit >= YRES) { + limit = YRES - 1; } if (iy < 0) { @@ -876,8 +876,8 @@ void drawFloor(FixP_t y0, iy = 0; } - if (limit > YRES) { - limit = YRES; + if (limit >= YRES) { + limit = YRES - 1; } for (; iy < limit; ++iy) { @@ -922,7 +922,7 @@ void drawFloor(FixP_t y0, stipple = ((iX0 + iy) & 1) ? 0xFFFFFFFF : 0; if (iX1 >= XRES) { - iX1 = XRES; + iX1 = XRES - 1; } if (farEnoughForStipple == 2 || ( farEnoughForStipple == 1 && iy & 1) || (farEnoughForStipple == 3) ) { @@ -1035,11 +1035,11 @@ void fillBottomFlat(const int *coords, FramebufferPixelFormat colour) { fX1 = x0; for (; y < yFinal; ++y) { - if (y >= YRES) { + if (y >= YRES_FRAMEBUFFER) { return; } else if (y >= 0) { - int iFX1 = max(min((XRES - 1), fixToInt(fX1)), 0); - int iFX0 = max(min((XRES - 1), fixToInt(fX0)), 0); + int iFX1 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX1)), 0); + int iFX0 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX0)), 0); FramebufferPixelFormat *destination = &framebuffer[(XRES_FRAMEBUFFER * y) + min(iFX0, iFX1)]; #ifdef RGBA32_FRAMEBUFFER @@ -1096,9 +1096,9 @@ void fillTopFlat(int *coords, FramebufferPixelFormat colour) { for (; y >= yFinal; --y) { if (y < 0) { return; - } else if (y < YRES) { - int iFX1 = max(min((XRES - 1), fixToInt(fX1)), 0); - int iFX0 = max(min((XRES - 1), fixToInt(fX0)), 0); + } else if (y < YRES_FRAMEBUFFER) { + int iFX1 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX1)), 0); + int iFX0 = max(min((XRES_FRAMEBUFFER - 1), fixToInt(fX0)), 0); FramebufferPixelFormat *destination = &framebuffer[(XRES_FRAMEBUFFER * y) + min(iFX0, iFX1)]; #ifdef RGBA32_FRAMEBUFFER @@ -1306,7 +1306,7 @@ void drawTexturedBottomFlatTriangle(int *coords, uint8_t *uvCoords, struct Textu texelLineY = fV1; } - if (y >= 0 && y <= YRES) { + if (y >= 0 && y < YRES) { int xPos = iFX0; const int shouldStippleLine = (farEnoughForStipple == 2) || (farEnoughForStipple == 1 && y & 1) || (farEnoughForStipple == 3); stipple = ((xPos + y) & 1) ? 0xFFFFFFFF : 0; @@ -1317,7 +1317,7 @@ void drawTexturedBottomFlatTriangle(int *coords, uint8_t *uvCoords, struct Textu u = abs(fixToInt(texelLineX)) % NATIVE_TEXTURE_SIZE; v = abs(fixToInt(texelLineY)) % NATIVE_TEXTURE_SIZE; - if (xPos >= 0 && xPos <= XRES) { + if (xPos >= 0 && xPos < XRES) { if ((shouldStippleLine && stipple) || (farEnoughForStipple == 3 && (y & 1))) { *destination = 0; } else { @@ -1474,7 +1474,7 @@ void drawTexturedTopFlatTriangle(int *coords, uint8_t *uvCoords, struct Texture texelLineY = fV1; } - if (y >= 0 && y <= YRES) { + if (y >= 0 && y < YRES) { int xPos = iFX0; @@ -1484,7 +1484,7 @@ void drawTexturedTopFlatTriangle(int *coords, uint8_t *uvCoords, struct Texture u = abs(fixToInt(texelLineX)) % NATIVE_TEXTURE_SIZE; v = abs(fixToInt(texelLineY)) % NATIVE_TEXTURE_SIZE; - if (xPos >= 0 && xPos <= XRES) { + if (xPos >= 0 && xPos < XRES) { if ((shouldStippleLine && stipple) || (farEnoughForStipple == 3 && (y & 1))) { *destination = 0; } else { @@ -1676,7 +1676,9 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con size_t fontWidth = defaultFont->width; BitmapPixelFormat *fontPixelData = defaultFont->data; size_t c; + size_t d; int32_t srcX, srcY; + uint8_t lastSpacePos = 0xFF; for (c = 0; c < len; ++c) { uint8_t ascii; @@ -1695,9 +1697,8 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con col = ascii & 31; letter = fontPixelData + (col * 8) + (fontWidth * (line * 8)); - - if (currentChar == '\n' || dstX >= margin) { - dstX = (x - 1) * 8; + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; dstY += 8; continue; } @@ -1707,8 +1708,19 @@ void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, con } if (currentChar == ' ') { + lastSpacePos = c; dstX += 8; continue; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } for (srcY = 0; srcY < 8; ++srcY) { diff --git a/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c b/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c index aa6bace02..ba9588145 100644 --- a/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c +++ b/mx_frontend/base3d/src/SDLVersion/CSDL2Renderer.c @@ -26,7 +26,7 @@ #ifdef __EMSCRIPTEN__ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c b/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c index 313ca353b..aaef0c972 100644 --- a/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c +++ b/mx_frontend/base3d/src/SDLVersion/SDL1Renderer.c @@ -23,7 +23,7 @@ void enterFullScreenMode(void) { EmscriptenFullscreenStrategy s; - memset(&s, 0, sizeof(s)); + memFill(&s, 0, sizeof(s)); s.scaleMode = EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT; s.canvasResolutionScaleMode = EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE; s.filteringMode = EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT; diff --git a/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c b/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c index 40aae7c58..cb6f78f73 100644 --- a/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c +++ b/mx_frontend/base3d/src/Win32Version/CGDIRenderer.c @@ -42,7 +42,7 @@ COLORREF transparencyRef; extern HWND HWnd; extern HINSTANCE hInst; float multiplier; -enum ESoundDriver soundDriver; +enum ESoundDriver soundDriver; void setupOPL2(int port) {} @@ -90,7 +90,7 @@ static HBITMAP Create8bppBitmap(HDC hdc, int width, int height, LPVOID pBits) uint32_t pixel; void *Pixels; HBITMAP hbmp; - BITMAPINFO *bmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); + BITMAPINFO *bmi = (BITMAPINFO *)allocMem(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256, GENERAL_MEMORY, 0); PBITMAPINFOHEADER bih; @@ -110,7 +110,7 @@ static HBITMAP Create8bppBitmap(HDC hdc, int width, int height, LPVOID pBits) - memcpy( &bmi->bmiColors[0], &paletteRef[0], 256 * sizeof(RGBQUAD)); + memCopyToFrom( &bmi->bmiColors[0], &paletteRef[0], 256 * sizeof(RGBQUAD)); Pixels = NULL; @@ -120,10 +120,10 @@ static HBITMAP Create8bppBitmap(HDC hdc, int width, int height, LPVOID pBits) { BYTE* pbBits = (BYTE*)pBits; BYTE *Pix = (BYTE *)Pixels; - memcpy(Pix, pbBits, width * height); + memCopyToFrom(Pix, pbBits, width * height); } - free(bmi); + disposeMem(bmi); return hbmp; } @@ -157,7 +157,7 @@ static HBITMAP CreateBitmapFromPixels( HDC hDC, UINT uWidth, UINT uHeight, UINT if ( !uWidth || !uHeight || !uBitsPerPixel ) return hBitmap; lBmpSize = uWidth * uHeight * (uBitsPerPixel/8) ; - memset(&bmpInfo, 0, sizeof(bmpInfo)); + memFill(&bmpInfo, 0, sizeof(bmpInfo)); bmpInfo.bmiHeader.biBitCount = uBitsPerPixel; bmpInfo.bmiHeader.biHeight = uHeight; bmpInfo.bmiHeader.biWidth = uWidth; @@ -172,7 +172,7 @@ static HBITMAP CreateBitmapFromPixels( HDC hDC, UINT uWidth, UINT uHeight, UINT if ( !hBitmap ) return hBitmap; - memcpy(pPixels, pBits, lBmpSize ); + memCopyToFrom(pPixels, pBits, lBmpSize ); return hBitmap; } @@ -356,8 +356,8 @@ WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if ( !enableSmoothMovement || turnTarget == turnStep ) { - memcpy( slideBitmap, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); - memcpy( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + memCopyToFrom( slideBitmap, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); + memCopyToFrom( previousFrame, framebuffer, XRES_FRAMEBUFFER * YRES_FRAMEBUFFER); } else if ( turnStep < turnTarget ) { for ( y = dirtyLineY0; y < dirtyLineY1; ++y ) { diff --git a/mx_frontend/base3d/src/X11Version/X11Renderer.c b/mx_frontend/base3d/src/X11Version/X11Renderer.c index b8924457b..bbb614c6a 100644 --- a/mx_frontend/base3d/src/X11Version/X11Renderer.c +++ b/mx_frontend/base3d/src/X11Version/X11Renderer.c @@ -38,7 +38,7 @@ void graphicsInit(void) { root = RootWindow(display, screen_num); visual = DefaultVisual(display, screen_num); - data = (char *) malloc(320 * 240 * 4); + data = (char *) allocMem(320 * 240 * 4, GENERAL_MEMORY, FALSE); img = XCreateImage(display, visual, DefaultDepth(display, screen_num), ZPixmap, 0, data, 320, 240, 32, 0); diff --git a/mx_frontend/menu/src/Main.c b/mx_frontend/menu/src/Main.c index 7accf9791..84ab4c0b5 100644 --- a/mx_frontend/menu/src/Main.c +++ b/mx_frontend/menu/src/Main.c @@ -135,7 +135,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - int argc = 0; + int argc = 0; char **argv = NULL; WNDCLASSEX WndCls; diff --git a/my_frontend/CMakeLists.txt b/my_frontend/CMakeLists.txt index 78e75e35c..b810ca2e1 100644 --- a/my_frontend/CMakeLists.txt +++ b/my_frontend/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(src ../core/src ../core/include include ../common/include ${SDL2_INCLUDE_DIR} ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FORTIFY_SOURCE=3 -DUSE_OWN_MIN_MAX -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=192 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) diff --git a/my_frontend/Makefile.464 b/my_frontend/Makefile.464 index 6dac9f6d1..f6ac56ff3 100644 --- a/my_frontend/Makefile.464 +++ b/my_frontend/Makefile.464 @@ -18,6 +18,8 @@ CFLAGS = \ -pragma-export:CLIB_GENCON_CAPS=0 \ -pragma-define:CLIB_FIRMWARE_KEYBOARD_CLICK=0 \ -pragma-define:CRT_DISABLELOADER=1 \ + -pragma-define:CLIB_DISABLE_MODE0=1 \ + -pragma-define:CLIB_DISABLE_MODE2=1 \ -Iinclude \ -I../core/include \ -I../common/include \ @@ -29,7 +31,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DRLE_COMPRESSED_MAPS \ -DEMBEDDED_DATA \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX TARGET = derelict.dsk diff --git a/my_frontend/Makefile.ia16 b/my_frontend/Makefile.ia16 index 50c7f0ffc..1b3feae24 100644 --- a/my_frontend/Makefile.ia16 +++ b/my_frontend/Makefile.ia16 @@ -18,7 +18,8 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DSUPPORTS_HACKING_MINIGAME \ -DENDIANESS_AWARE \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DUSE_OWN_MIN_MAX CC = ia16-elf-gcc STRIP = ia16-elf-strip diff --git a/my_frontend/Makefile.msx b/my_frontend/Makefile.msx index 8b1f2744c..6dbb62291 100644 --- a/my_frontend/Makefile.msx +++ b/my_frontend/Makefile.msx @@ -35,7 +35,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DRLE_COMPRESSED_MAPS \ -DEMBEDDED_DATA \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX TARGET = derelict.rom diff --git a/my_frontend/Makefile.sm3 b/my_frontend/Makefile.sm3 index 72929b847..2571e7647 100644 --- a/my_frontend/Makefile.sm3 +++ b/my_frontend/Makefile.sm3 @@ -34,7 +34,9 @@ CFLAGS = \ -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ -DRLE_COMPRESSED_MAPS \ -DEMBEDDED_DATA \ - -DMONOCHROME_VECTORS + -DMONOCHROME_VECTORS \ + -DNO_DYNAMIC_MEMORY_ALLOC \ + -DUSE_OWN_MIN_MAX TARGET = derelict.sms diff --git a/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj b/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj index 86c313880..684c03724 100644 --- a/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj +++ b/my_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj @@ -383,6 +383,7 @@ "YRES_FRAMEBUFFER=192", "XRES_FRAMEBUFFER=256", MONOCHROME_VECTORS, + USE_OWN_MIN_MAX, ); INFOPLIST_FILE = "Derelict-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; @@ -405,6 +406,7 @@ "YRES_FRAMEBUFFER=192", "XRES_FRAMEBUFFER=256", MONOCHROME_VECTORS, + USE_OWN_MIN_MAX, ); INFOPLIST_FILE = "Derelict-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; diff --git a/my_frontend/Xcode2/GameView.m b/my_frontend/Xcode2/GameView.m index 8a39aa8b0..f945bdded 100644 --- a/my_frontend/Xcode2/GameView.m +++ b/my_frontend/Xcode2/GameView.m @@ -13,6 +13,7 @@ #include #include +#include "Common.h" #include "Enums.h" #include "UI.h" #include "Engine.h" @@ -88,7 +89,7 @@ void initHW(int argc, char** argv) { updateDirection = 0; mBufferedCommand = '.'; - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } diff --git a/my_frontend/Xcode2/OSXRenderer.m b/my_frontend/Xcode2/OSXRenderer.m index 227851c9f..a965619ee 100644 --- a/my_frontend/Xcode2/OSXRenderer.m +++ b/my_frontend/Xcode2/OSXRenderer.m @@ -13,6 +13,7 @@ #include #include +#include "Common.h" #include "Enums.h" #include "OSXRenderer.h" #include "GameView.h" @@ -125,10 +126,6 @@ void graphicsPutPointArray(uint8_t *y128Values) { } } -void clearTextScreen(void) { - fillRect(0, 129, 256, 192, 0, 0); -} - void enterTextMode(void) { } @@ -154,7 +151,7 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { @@ -197,57 +194,76 @@ void clearScreen(void) { fillRect(0, 0, 255, 192, 0, 0); } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { - uint8_t len = strlen(text); - char *ptr = text; - uint8_t c = 0; - uint8_t x = _x; - int d; - - for (; c < len && y < 64; ++c) { - - char cha = *ptr; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++ptr; +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; continue; } - - if (cha >= 'a') { - if (cha <= 'z') { - cha = (cha - 'a') + 'A'; + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; } else { - cha -= ('z' - 'a'); + currentChar -= ('z' - 'a'); } } - - uint8_t *fontTop = &font[((cha - 32) << 3)]; - - - for (d = 0; d < 8; ++d) { + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { int e; uint8_t chunk = *fontTop; - + for (e = 0; e < 8; ++e) { if (chunk & 1) { - realPut(8 * x + (7 - e), 8 * y + (d), 1, NULL); + realPut(dstX + (7 - e), dstY + (f), 1, NULL); } else { - realPut(8 * x + (7 - e), 8 * y + (d), 0, NULL); + realPut(dstX + (7 - e), dstY + (f), 0, NULL); } chunk = chunk >> 1; } - - + fontTop++; } - - ++x; - ++ptr; + dstX += 8; } } @@ -267,25 +283,7 @@ void flipRenderer(void) { } } -void graphicsFlush(void) { - if (updateDirection) { - updateDirection = 0; - switch (getPlayerDirection()) { - case 0: - writeStrWithLimit(12, 17, "N", 31, 2, 0); - break; - case 1: - writeStrWithLimit(12, 17, "E", 31, 2, 0); - break; - case 2: - writeStrWithLimit(12, 17, "S", 31, 2, 0); - break; - case 3: - writeStrWithLimit(12, 17, "W", 31, 2, 0); - break; - } - } - +void graphicsFlush(void) { if (needsToRedrawVisibleMeshes) { flipRenderer(); clearGraphics(); diff --git a/my_frontend/include/Renderer.h b/my_frontend/include/Renderer.h index f19a15252..326e8ffab 100644 --- a/my_frontend/include/Renderer.h +++ b/my_frontend/include/Renderer.h @@ -59,8 +59,6 @@ struct CellPattern { void clearGraphics(void); -void clearTextScreen(void); - void dropItem(void); void initMap(void); @@ -111,7 +109,10 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple); void flush3DBuffer(void); -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg); +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour); + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t colour, + char charToReplaceHifenWith); uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr); diff --git a/my_frontend/include/UI.h b/my_frontend/include/UI.h index 8dac7f916..c0f6a0a99 100644 --- a/my_frontend/include/UI.h +++ b/my_frontend/include/UI.h @@ -25,7 +25,7 @@ drawWindowWithOptions(const uint8_t x, const uint8_t optionsCount, const uint8_t selectedOption); -void drawGraphic(const uint8_t *graphic); +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic); void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, const char *content); diff --git a/my_frontend/src/Crawler.c b/my_frontend/src/Crawler.c index 1ec6882de..ca32dd93c 100644 --- a/my_frontend/src/Crawler.c +++ b/my_frontend/src/Crawler.c @@ -3,6 +3,7 @@ */ #include #include +#include #include "Common.h" #include "Enums.h" @@ -44,20 +45,29 @@ void HUD_refresh(void) { (YRES_FRAMEBUFFER / 8) - 17, "Status"); - writeStrWithLimit(1, YRES_TEXT - 7, "In room:", 16, 2, 0); - writeStrWithLimit(1, YRES_TEXT - 4, "In hand:", 16, 2, 0); + drawTextAt(1, YRES_TEXT - 7, "In room:", 2); + drawTextAt(1, YRES_TEXT - 4, "In hand:", 2); struct Item *item; /* Display "In room" item */ if (roomItem != NULL) { item = getItem(roomItem->item); - if (item->active) { - writeStrWithLimit(1, YRES_TEXT - 6, "*", 16, 2, 0); + + if (strstr(item->name, "go-down")) { + drawTextAtWithMargin(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go down", 2); + } else { + if (strstr(item->name, "go-up")) { + drawTextAtWithMargin(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, "go up", 2); + } else { + if (item->active) { + drawTextAt(1, YRES_TEXT - 6, "*", 2); + } + drawTextAtWithMargin(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2); + } } - writeStrWithLimit(2, YRES_TEXT - 6, item->name, 16, 2, 0); } else { - writeStrWithLimit(2, YRES_TEXT - 6, "Nothing", 16, 2, 0); + drawTextAt(2, YRES_TEXT - 6, "Nothing", 2); } /* Display "In hand" item */ @@ -66,9 +76,9 @@ void HUD_refresh(void) { if (item->active) { drawTextAt(1, YRES_TEXT - 3, "*", 1); } - writeStrWithLimit(2, YRES_TEXT - 3, item->name, 16, 2, 0); + drawTextAtWithMargin(2, YRES_TEXT - 3, (XRES_FRAMEBUFFER) / 2, item->name, 2); } else { - writeStrWithLimit(2, YRES_TEXT - 3, "Nothing", 16, 2, 0); + drawTextAt(2, YRES_TEXT - 3, "Nothing", 2); } } @@ -91,14 +101,6 @@ enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { prevZ = cameraZ; switch (cmd) { - case kCommandFire5: - nextItemInHand(); - break; - - case kCommandFire6: - nextItemInRoom(); - break; - case kCommandFire1: useItemInHand(); break; @@ -109,11 +111,25 @@ enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { case kCommandFire3: pickItem(); + + if (playerLocation != previousLocation) { + redrawMap = needsToRedrawHUD = needsToRedrawVisibleMeshes = 1; + initMap(); + } break; case kCommandFire4: dropItem(); break; + + case kCommandFire5: + nextItemInHand(); + break; + + case kCommandFire6: + nextItemInRoom(); + break; + default: goto handle_directions; } @@ -254,7 +270,11 @@ void Crawler_initStateCallback(enum EGameMenuState tag) { (void)tag; enteredFrom = 0; cameraRotation = 0; - initStation(); + + if (tag != kBackToGame) { + initStation(); + } + focusedItem = getPlayerItems(); setErrorHandlerCallback(showMessage); setLoggerDelegate(showMessage); diff --git a/my_frontend/src/Events.c b/my_frontend/src/Events.c index 81d9d823f..169792d2e 100755 --- a/my_frontend/src/Events.c +++ b/my_frontend/src/Events.c @@ -16,7 +16,7 @@ #ifndef EMBEDDED_DATA #include "PackedFileReader.h" #endif -extern int8_t map[32][32]; +extern int8_t map[MAP_SIZE][MAP_SIZE]; extern int8_t stencilHigh[XRES]; @@ -40,7 +40,7 @@ void pickItem(void) { struct Item *itemToPick = getItem(roomItem->item); if (itemToPick != NULL) { - if (!strcmp(itemToPick->name, "digital-safe")) { + if (!strcmp(itemToPick->name, "computer-terminal")) { #ifdef SUPPORTS_HACKING_MINIGAME enterState(kHackingGame); @@ -134,6 +134,10 @@ void interactWithItemInRoom(void) { struct Item *item = getItem(focusedItem->item); if (itemToPick && item && item->useWithCallback) { item->useWithCallback(item, itemToPick); + + if (!playerHasObject(item->name)) { + focusedItem = getPlayerItems(); + } } } } @@ -182,9 +186,9 @@ void initMap(void) { roomItem = getRoom(playerLocation)->itemsPresent->next; #ifdef OPTIMIZATION_BLOCK_CELL - memset(map, BLOCK_CELL, MAP_SIZE_X * MAP_SIZE_Y); + memFill(map, BLOCK_CELL, MAP_SIZE_X * MAP_SIZE_Y); #else - memset(map, NEUTRAL_CELL, MAP_SIZE_X * MAP_SIZE_Y); + memFill(map, NEUTRAL_CELL, MAP_SIZE_X * MAP_SIZE_Y); #endif for (y = 0; y < MAP_SIZE_Y; ++y) { for (x = 0; x < MAP_SIZE_X; ++x) { diff --git a/my_frontend/src/GamepadUI.c b/my_frontend/src/GamepadUI.c index 3afc9545c..7422ce524 100644 --- a/my_frontend/src/GamepadUI.c +++ b/my_frontend/src/GamepadUI.c @@ -20,7 +20,6 @@ const char *menuItems[] = { }; void initGamepadUI(void) { - cursorPosition = 0; } enum ECommand performActionJoypad(void) { diff --git a/my_frontend/src/HackingMinigame.c b/my_frontend/src/HackingMinigame.c index 98085c64c..f9aa7f8c9 100644 --- a/my_frontend/src/HackingMinigame.c +++ b/my_frontend/src/HackingMinigame.c @@ -46,47 +46,46 @@ void HackingScreen_repaintCallback(void) { clearScreen(); needsToRedrawVisibleMeshes = 0; drawTextAt(1, 1, "Stack trace:", getPaletteEntry(0xFF999999)); - drawTextAt((12 * 0), 11, " CPU0 ", getPaletteEntry(0xFF999999)); - drawTextAt((12 * 1), 11, " CPU1 ", getPaletteEntry(0xFF999999)); - drawTextAt((12 * 2), 11, " CPU2 ", getPaletteEntry(0xFF999999)); - } - drawTextAt((12 * cursorPosition), 11, ">", getPaletteEntry(0xFF999999)); - drawTextAt((12 * cursorPosition) + 5, 11, "<", getPaletteEntry(0xFF999999)); + drawTextAt((12 * cursorPosition), 11, "> <", getPaletteEntry(0xFF999999)); - drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); + drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); - for (pin = 0; pin < 3; ++pin) { - uint8_t disk; + for (pin = 0; pin < 3; ++pin) { + uint8_t disk; - if (pin != 0) { - uint8_t pinX = (10 * (pin) ) * 8; - drawLine(pinX, 40, pinX, 80, 2); - } + /* hack to save on some 30 bytes in the ROM size*/ + drawTextAtWithMarginWithFiltering((12 * pin) + 1, 11, XRES_FRAMEBUFFER, "CPU-", getPaletteEntry(0xFF999999), '0' + pin); + + if (pin != 0) { + uint8_t pinX = (10 * (pin) ) * 8; + drawLine(pinX, 40, pinX, 80, 2); + } - for (disk = 0; disk < 5; ++disk) { + for (disk = 0; disk < 5; ++disk) { - uint8_t diskIndex = getPositionForPin(pin, disk); + uint8_t diskIndex = getPositionForPin(pin, disk); - const char *funcName = (disk >= getDisksForPin(pin)) ? NULL - : functionNames[diskIndex]; + const char *funcName = (disk >= getDisksForPin(pin)) ? NULL + : functionNames[diskIndex]; - if (funcName) { - drawTextAt( - 10 * (pin) + (pin == 0 ? 0 : 1), 4 + (4 - disk), - funcName, getPaletteEntry(0xFF999999)); + if (funcName) { + drawTextAt( + 10 * (pin) + (pin == 0 ? 0 : 1), 4 + (4 - disk), + funcName, getPaletteEntry(0xFF999999)); + } } } - } - drawTextAt(1, 2, "Pointer:", getPaletteEntry(0xFF999999)); + drawTextAt(1, 2, "Pointer:", getPaletteEntry(0xFF999999)); - holdingDisk = getHoldingDisk(); + holdingDisk = getHoldingDisk(); - if (holdingDisk != 0xFF) { - drawTextAt(19, 2, functionNames[holdingDisk], getPaletteEntry(0xFF999999)); - } else { - drawTextAt(19, 2, "NULL", getPaletteEntry(0xFF999999)); + if (holdingDisk != 0xFF) { + drawTextAt(19, 2, functionNames[holdingDisk], getPaletteEntry(0xFF999999)); + } else { + drawTextAt(19, 2, "NULL", getPaletteEntry(0xFF999999)); + } } } diff --git a/my_frontend/src/KeyboardUI.c b/my_frontend/src/KeyboardUI.c index 492d4d948..46382ad19 100644 --- a/my_frontend/src/KeyboardUI.c +++ b/my_frontend/src/KeyboardUI.c @@ -19,12 +19,12 @@ extern struct ObjectNode *roomItem; extern uint8_t firstFrameOnCurrentState; const char *menuItems[] = { - "1) Use", - "2) Use with", - "3) Pick", - "4) Drop", - "5) Next(hand)", - "6) Next(room)", + "1)Use/Toggle", + "2)Use with", + "3)Pick/Use", + "4)Drop", + "5)Next(hand)", + "6)Next(room)", }; void initKeyboardUI(void) { diff --git a/my_frontend/src/RendererRasterizer.c b/my_frontend/src/RendererRasterizer.c index 04922acd7..330257181 100755 --- a/my_frontend/src/RendererRasterizer.c +++ b/my_frontend/src/RendererRasterizer.c @@ -4,6 +4,7 @@ #include "Core.h" #include "Derelict.h" #include "Renderer.h" +#include "Common.h" #ifdef MSDOS #include "Common.h" diff --git a/my_frontend/src/RendererScene.c b/my_frontend/src/RendererScene.c index cd4cf74e8..5222f6d68 100755 --- a/my_frontend/src/RendererScene.c +++ b/my_frontend/src/RendererScene.c @@ -1,8 +1,8 @@ #include -#include #include "Renderer.h" #include "map.h" +#include "Common.h" #ifdef MSDOS #include "Common.h" @@ -30,7 +30,7 @@ int8_t min(int8_t x1, int8_t x2) { /* all those refactors are due to a SDCC bug with very long functions */ void renderScene(void) { - memset(stencilHigh, 0, XRES); + memFill(stencilHigh, 0, XRES); switch (cameraRotation) { case DIRECTION_N: diff --git a/my_frontend/src/TMS9918.c b/my_frontend/src/TMS9918.c index 8d9e4a2a6..045643dd5 100644 --- a/my_frontend/src/TMS9918.c +++ b/my_frontend/src/TMS9918.c @@ -6,6 +6,7 @@ #include +#include "Common.h" #include "font.h" #include "Enums.h" @@ -73,7 +74,7 @@ void setColour(uint8_t colour) { } void clearGraphics(void) { - memset(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); + memFill(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); } void flush3DBuffer(void) { @@ -211,46 +212,63 @@ void shutdownGraphics(void) { } #endif -void writeStrWithLimit(uint8_t _x, uint8_t y, char *text, uint8_t limitX) { - uint8_t x = _x; - char *ptr = text; - char lastChar = 0xFF; - uint8_t *fontTop; - - while (*ptr && y < (YRES_FRAMEBUFFER / 8)) { - char cha = *ptr; - - if (x == limitX || cha == '\n') { - ++y; - x = _x; - if (cha == '\n') { - ++ptr; - continue; - } + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; } - if (cha >= 'a' && cha <= 'z') { - cha -= ('a' - 'A'); - } else if (cha > 'z') { - cha -= ('z' - 'a'); + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; } - if (cha != lastChar) { - fontTop = &font[((cha - 32) << 3)]; - lastChar = cha; + if (dstY >= YRES_FRAMEBUFFER) { + return; } - vwrite(fontTop, map_pixel(x << 3, y << 3), 8); - ++x; - ++ptr; - } -} -void clearTextScreen(void) { - uint8_t c, d; - for (c = 16; c < 24; ++c) { - for (d = 0; d < 32; ++d) { - writeStrWithLimit(d, c, " ", 256 / 8); + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + vwrite(fontTop, map_pixel(dstX, dstY), 8); + dstX += 8; } } diff --git a/my_frontend/src/UI.c b/my_frontend/src/UI.c index 124082094..d25b239d9 100644 --- a/my_frontend/src/UI.c +++ b/my_frontend/src/UI.c @@ -9,6 +9,7 @@ #include "Renderer.h" #include "Engine.h" #include "SoundSystem.h" +#include "Common.h" extern uint8_t playerLocation; @@ -24,7 +25,11 @@ uint8_t redrawMap; uint8_t needsToRedrawHUD; -void drawGraphic(const uint8_t *graphic) { +uint16_t scale2DVertex( uint16_t offset, uint16_t scale, const uint8_t *shape, uint16_t index) { + return offset + ((scale * shape[index]) / 128); +} + +void drawGraphic(uint16_t x, uint8_t y, uint16_t dx, uint8_t dy, const uint8_t *graphic) { const uint8_t *ptr = graphic; while (*ptr) { @@ -36,20 +41,34 @@ void drawGraphic(const uint8_t *graphic) { const uint8_t *shape = ptr; for (c = 0; c < npoints - 1; ++c) { - drawLine(shape[2 * c], shape[(2 * c) + 1], shape[(2 * c) + 2], shape[(2 * c) + 3], 2); + drawLine(scale2DVertex( x, dx, shape, (2 * c) + 0), + scale2DVertex( y, dy, shape, (2 * c) + 1), + scale2DVertex( x, dx, shape, (2 * c) + 2), + scale2DVertex( y, dy, shape, (2 * c) + 3), + 2); } - drawLine(shape[2 * npoints - 2], shape[2 * npoints - 1], shape[0], shape[1], 2); + + drawLine(scale2DVertex( x, dx, shape, 2 * npoints - 2), + scale2DVertex( y, dy, shape, 2 * npoints - 1), + scale2DVertex( x, dx, shape, 0), + scale2DVertex( y, dy, shape, 1), + 2); + ptr += 2 * npoints; } } void drawTextAt(uint8_t _x, uint8_t y, const char *text, uint8_t colour) { - writeStrWithLimit(_x, y, text, (XRES_FRAMEBUFFER / 8), colour, 0); + drawTextAtWithMargin(_x, y, (XRES_FRAMEBUFFER), text, colour); +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); } void showMessage(const char *message) { - clearTextScreen(); - drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "", message); + uint8_t lines = countLines(message) + 3; + drawTextWindow( 0, (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) - 1, lines + 1, "Press 2 to continue", message); waitForKey = 1; } @@ -72,12 +91,6 @@ void drawMap(void) { (YRES_FRAMEBUFFER / 8) / 2 + 1, "Map"); - for (y = 0; y < 12; ++y) { - for (x = 0; x < 12; ++x) { - drawTextAt(((XRES_FRAMEBUFFER / 8) / 2) + x + 2, 1 + y, " ", 0); - } - } - for (y = 0; y < 32; ++y) { for (x = 0; x < 32; ++x) { @@ -94,27 +107,41 @@ void drawMap(void) { } void performAction(void) { + const char *msg = NULL; switch (getGameStatus()) { case kBadVictory: - showMessage("Victory! Too bad you didn't survive"); - while (1); + msg = "Victory! Too bad you didn't survive"; + break; + case kBadGameOver: - showMessage("You're dead! And so are the\n" - "other people on the path of\n" - "destruction faulty reactor"); - while (1); + msg = "You're dead! And so are the " + "other people on the path of " + "destruction faulty reactor"; + break; case kGoodVictory: - showMessage("Victory! You managed to destroy the\nship and get out alive"); - while (1); + msg = "Victory! You managed to destroy the ship and get out alive"; + break; case kGoodGameOver: - showMessage("You failed! While you're alive\n" - "you failed to prevent the worst\n" - "scenario and now EVERYBODY is\n" - "dead!)"); - while (1); + msg = "You failed! While you're alive " + "you failed to prevent the worst " + "scenario and now EVERYBODY is " + "dead!)"; + break; + } + + if (msg) { + uint8_t lines = countLines(msg) + 3; + clearScreen(); + drawTextWindow( 0, (YRES / 8) + 1, (XRES_FRAMEBUFFER / 8) - 1, lines + 1, "", msg); + + while (1) { + if (soundDriver != kNoSound) { + soundTick(); + } + } } } @@ -127,7 +154,7 @@ void drawWindow(uint8_t tx, uint8_t ty, uint8_t tw, uint8_t th, const char *titl for (c = 0; c < th; ++c) { for (d = 0; d < tw; ++d) { - writeStrWithLimit( tx + d, ty + c, " ", 320 / 8, 2, 0); + drawTextAtWithMarginWithFiltering( tx + d, ty + c, XRES_FRAMEBUFFER, " ", 2, ' '); } } @@ -181,7 +208,7 @@ void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, const char *content) { drawWindow(x, y, dx, dy, title); - writeStrWithLimit(x + 1, y + 2, content, x + dx - 1, 1, 0); + drawTextAtWithMargin(x + 1, y + 2, (x + dx - 1) * 8, content, 1); } enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t optionsCount, const enum ECommand cmd, enum EGameMenuState backState) { diff --git a/my_frontend/src/cpc.c b/my_frontend/src/cpc.c index 96b68799e..80ac4c8ec 100644 --- a/my_frontend/src/cpc.c +++ b/my_frontend/src/cpc.c @@ -3,6 +3,7 @@ #include #include +#include "Common.h" #include "Enums.h" #include "Core.h" #include "Renderer.h" @@ -88,6 +89,7 @@ void initHW(int argc, char **argv) { initAY38910(); initKeyboardUI(); needsToRedrawVisibleMeshes = 0; + waitForKey = 0; } void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { @@ -104,75 +106,72 @@ void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { } } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { - (void)fg; - (void)bg; - uint8_t len = strlen(text); - const char *ptr = text; - uint8_t c = 0; - uint8_t x = _x; - - uint8_t *lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); - - for (; c < len && y < 64; ++c) { - - char cha = *ptr; - - if (x == limitX) { - ++y; - lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); - x = _x; - } else if (cha == '\n') { - ++y; - lineBase = (unsigned char *) 0xC000 + ((((y * 8)) / 8) * 80) + ((((y * 8)) & 7) * 2048); - x = _x; - ++ptr; - continue; +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + size_t len = strlen(text); + uint16_t dstX = x * 8; + int8_t dstY = y * 8; + + uint8_t c; + uint8_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; } - if (cha >= 'a') { - if (cha <= 'z') { - cha = (cha - 'a') + 'A'; - } else { - cha -= ('z' - 'a'); - } + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; } - uint8_t *fontTop = &font[((cha - 32) << 3)]; + if (dstY >= YRES_FRAMEBUFFER) { + return; + } - uint8_t *line = lineBase + 2 * x + 1; + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; - for (uint8_t d = 0; d < 8; ++d) { - uint8_t e; - uint8_t chunk = *fontTop; - uint8_t *pixel = line; + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } - *pixel = 0; - for (e = 0; e < 4; ++e) { - if (chunk & 1) { - *pixel |= (16 << e); - } - chunk = chunk >> 1; + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); } + } - --pixel; + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; - *pixel = 0; + for (uint8_t f = 0; f < 8; ++f) { + uint8_t e; + uint8_t chunk = *fontTop; - for (e = 0; e < 4; ++e) { - if (chunk & 1) { - *pixel |= (16 << e); - } + for (e = 0; e < 8; ++e) { + realPut(dstX + (7 - e), dstY + (f), (chunk & 1), NULL); chunk = chunk >> 1; } fontTop++; - line += 2048; } - ++x; - ++ptr; + dstX += 8; } } @@ -191,15 +190,6 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { return ptr; } -void clearTextScreen(void) { - uint8_t c, d; - for (c = 16; c < 24; ++c) { - for (d = 0; d < 40; ++d) { - writeStrWithLimit(d, c, " ", 320 / 8, 2, 0); - } - } -} - void handleSystemEvents(void) {} enum ECommand getInput(void) { @@ -220,7 +210,20 @@ enum ECommand getInput(void) { performAction(); - switch (getch()) { + uint8_t toReturn = getch(); + + if (waitForKey) { + if (toReturn == '2') { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandNone; + } + + switch (toReturn) { case 30: case 'w': return kCommandUp; @@ -237,17 +240,7 @@ enum ECommand getInput(void) { return kCommandStrafeLeft; case 'x': return kCommandStrafeRight; - case 'm': - drawMap(); - return '.'; case '1': - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } - return kCommandFire1; case '2': return kCommandFire2; @@ -264,11 +257,11 @@ enum ECommand getInput(void) { } void clearScreen(void) { - memset((unsigned char *) 0xC000, 0, (320 / 4) * 200); + memFill((unsigned char *) 0xC000, 0, (320 / 4) * 200); } void clearGraphics(void) { - memset(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); + memFill(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); } void startFrame(int x, int y, int width, int height) { @@ -282,9 +275,9 @@ void endFrame(void) { if (needsToRedrawVisibleMeshes) { for (uint8_t y = 0; y < BUFFER_SIZEY; ++y) { uint8_t *line = (unsigned char *) 0xC000 + ((y >> 3) * 80) + ((y & 7) * 2048); - memcpy(line, buffer + (y * BUFFER_SIZEX), BUFFER_SIZEX); + memCopyToFrom(line, buffer + (y * BUFFER_SIZEX), BUFFER_SIZEX); } - memset(&buffer[0], 0, BUFFER_SIZEX * BUFFER_SIZEY); + clearGraphics(); #ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION if (roomTransitionAnimationStep) { @@ -332,17 +325,6 @@ void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { } } -uint8_t *graphicsPutAddr(uint8_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { - (void)colour; - if (ptr == NULL) { - ptr = &buffer[(y * (BUFFER_SIZEX)) + (x / 4)]; /* skip to the line in pattern */ - } - - *ptr |= (8 >> (x & 3)); - - return ptr; -} - void graphicsPutPointArray(uint8_t *y128Values) { uint8_t *stencilPtr = y128Values; uint16_t x; diff --git a/my_frontend/src/msdos.c b/my_frontend/src/msdos.c index b91a8ac94..e1d9cdbb6 100644 --- a/my_frontend/src/msdos.c +++ b/my_frontend/src/msdos.c @@ -347,7 +347,7 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t value, uint8_t *ptr) { } void clearGraphics(void) { - memset(imageBuffer, 0, 128 * 32); + memFill(imageBuffer, 0, 128 * 32); } void initHW(int argc, char **argv) { @@ -405,6 +405,19 @@ enum ECommand getInput(void) { ); } + if (waitForKey) { + if (toReturn == '2') { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandNone; + } + + performAction(); + switch(toReturn) { case 'q': return kCommandLeft; @@ -414,21 +427,13 @@ enum ECommand getInput(void) { return kCommandDown; case 'e': return kCommandRight; - case 'a': + case 'z': return kCommandStrafeLeft; - case 'd': + case 'x': return kCommandStrafeRight; case 'l': return kCommandBack; - case '1': - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } - return kCommandFire1; case '2': return kCommandFire2; @@ -447,22 +452,28 @@ enum ECommand getInput(void) { return kCommandNone; } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { +void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int limitX, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { const char *ptr = text; uint16_t c = 0; uint16_t chary = 0; - uint16_t x = _x - 1; + uint16_t x = _x; + uint8_t y = _y; char cha = *ptr; for (; cha && y < 25; ++c) { - if (x == limitX) { + if (cha == '-') { + cha = charToReplaceHifenWith; + } + + if (x >= (limitX / 8) || x >= (XRES_TEXT)) { ++y; - x = _x - 1; + x = _x + 1; } else if (cha == '\n') { ++y; - x = _x - 1; + x = _x + 1; ++ptr; cha = *ptr; continue; @@ -470,6 +481,8 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, ++x; } + uint8_t biosX = x - 1; + asm volatile ( "movb $0x02, %%ah\n\t" "movb %0, %%dl\n\t" @@ -483,7 +496,7 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, "movb $0x03, %%bl\n" "int $0x10\n\t" : - : "rm" (x), "rm" (y), "rm"(cha) + : "rm" (biosX), "rm" (y), "rm"(cha) : "ax", "bx", "cx", "dx" ); @@ -492,7 +505,6 @@ void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, } } - void startFrame(int x, int y, int width, int height) { } @@ -570,19 +582,10 @@ void endFrame(void) { ); } - memset(imageBuffer, 0, 128 * 32); + memFill(imageBuffer, 0, 128 * 32); } -void clearTextScreen(void) { - int c, d; - for (c = 16; c < 24; ++c) { - for (d = 0; d < 40; ++d) { - writeStrWithLimit(d, c, " ", 320 / 8, 2, 0); - } - } -} - void enterTextMode(void) {} void exitTextMode(void) { diff --git a/my_frontend/src/msx.c b/my_frontend/src/msx.c index ca9dbceb0..dc64de43c 100644 --- a/my_frontend/src/msx.c +++ b/my_frontend/src/msx.c @@ -39,6 +39,16 @@ enum ECommand getInput(void) { performAction(); + if (waitForKey) { + if (input == '2') { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + return kCommandNone; + } + switch (input) { case 30: return kCommandUp; @@ -48,17 +58,11 @@ enum ECommand getInput(void) { return kCommandLeft; case 28: return kCommandRight; - case 'c': + case 'z': return kCommandStrafeLeft; - case 'v': + case 'x': return kCommandStrafeRight; case '1': - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } return kCommandFire1; case '2': return kCommandFire2; @@ -70,7 +74,6 @@ enum ECommand getInput(void) { return kCommandFire5; case '6': return kCommandFire6; - } return input; } diff --git a/my_frontend/src/sdl2.c b/my_frontend/src/sdl2.c index f9f2c599a..c39d85a20 100644 --- a/my_frontend/src/sdl2.c +++ b/my_frontend/src/sdl2.c @@ -13,6 +13,7 @@ #include "font.h" #include "SDL.h" +#include "Common.h" extern uint8_t firstFrameOnCurrentState; extern struct ObjectNode *focusedItem; @@ -108,10 +109,6 @@ void graphicsPutPointArray(uint8_t *y128Values) { } } -void clearTextScreen(void) { - fillRect(0, 129, 256, 192, 0, 0); -} - void enterTextMode(void) { } @@ -143,7 +140,7 @@ void shutdownGraphics(void) { } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 128 * 128); } void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { @@ -209,12 +206,6 @@ enum ECommand getInput(void) { switch (event.key.keysym.sym) { case SDLK_RETURN: case SDLK_1: - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } return kCommandFire1; case SDLK_ESCAPE: @@ -225,6 +216,12 @@ enum ECommand getInput(void) { case SDLK_KP_7: case SDLK_2: + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } return kCommandFire2; case SDLK_KP_8: @@ -240,13 +237,9 @@ enum ECommand getInput(void) { return kCommandFire5; case SDLK_KP_9: - case SDLK_9: + case SDLK_6: return kCommandFire6; - case SDLK_s: - clearTextScreen(); - break; - case SDLK_LEFT: return kCommandLeft; @@ -276,60 +269,81 @@ enum ECommand getInput(void) { return kCommandNone; } -void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { - uint8_t len = strlen(text); - char *ptr = text; - uint8_t c = 0; - uint8_t x = _x; - for (; c < len && y < 64; ++c) { +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; - char cha = *ptr; + for (c = 0; c < len; ++c) { - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++ptr; + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; continue; } - if (cha >= 'a') { - if (cha <= 'z') { - cha = (cha - 'a') + 'A'; - } else { - cha -= ('z' - 'a'); + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } } } - uint8_t *fontTop = &font[((cha - 32) << 3)]; + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; - for (int d = 0; d < 8; ++d) { + for (int f = 0; f < 8; ++f) { int e; uint8_t chunk = *fontTop; for (e = 0; e < 8; ++e) { if (chunk & 1) { - realPut(8 * x + (7 - e), 8 * y + (d), 1, NULL); + realPut(dstX + (7 - e), dstY + (f), 1, NULL); } else { - realPut(8 * x + (7 - e), 8 * y + (d), 0, NULL); + realPut(dstX + (7 - e), dstY + (f), 0, NULL); } chunk = chunk >> 1; } - fontTop++; } - - ++x; - ++ptr; + dstX += 8; } } -void initHW(int, char **pString) { +void initHW(int argc, char **pString) { initKeyboardUI(); SDL_Init(SDL_INIT_EVERYTHING); diff --git a/my_frontend/src/sms.c b/my_frontend/src/sms.c index fd2477d60..25afec712 100755 --- a/my_frontend/src/sms.c +++ b/my_frontend/src/sms.c @@ -39,6 +39,7 @@ void initHW(int argc, char **argv) { initSN76489(); cooldown = COOLDOWN_MAX; needsToRedrawVisibleMeshes = 0; + waitForKey = 0; } void handleSystemEvents(void) {} @@ -46,16 +47,26 @@ void handleSystemEvents(void) {} enum ECommand getInput(void) { int key = read_joypad1(); + performAction(); + if (cooldown) { cooldown--; } if (key & JOY_UP && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; return kCommandUp; } if (key & JOY_LEFT && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; if (key & JOY_FIREB) { return kCommandStrafeLeft; @@ -65,6 +76,10 @@ enum ECommand getInput(void) { } if (key & JOY_RIGHT && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; if (key & JOY_FIREB) { return kCommandStrafeRight; @@ -74,20 +89,24 @@ enum ECommand getInput(void) { } if (key & JOY_DOWN && !cooldown) { + if (waitForKey) { + return kCommandNone; + } + cooldown = COOLDOWN_MAX; return kCommandDown; } if ((key & JOY_FIREA) && !cooldown ) { + + if (waitForKey) { + return kCommandNone; + } + if (currentGameMenuState == kPlayGame) { playSound(3); cooldown = COOLDOWN_MAX; - if (waitForKey) { - waitForKey = 0; - return kCommandNone; - } - return performActionJoypad(); } else { return kCommandFire1; @@ -95,14 +114,15 @@ enum ECommand getInput(void) { } if ((key & JOY_FIREB) && !cooldown ) { - if (currentGameMenuState == kPlayGame) { - if (waitForKey) { - waitForKey = 0; - firstFrameOnCurrentState = 1; - needsToRedrawVisibleMeshes = 1; - return kCommandNone; - } + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + if (currentGameMenuState == kPlayGame) { cursorPosition = (cursorPosition + 1); playSound(2); diff --git a/my_frontend/src/speccy.c b/my_frontend/src/speccy.c index 0d020fd7a..058305682 100644 --- a/my_frontend/src/speccy.c +++ b/my_frontend/src/speccy.c @@ -92,10 +92,6 @@ uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { return NULL; } -void clearTextScreen(void) { - clga(0, 128, 256, 192); -} - void handleSystemEvents(void) {} uint8_t inputCounter = 0; diff --git a/mz_frontend/AtariVersion/AtariRenderer.c b/mz_frontend/AtariVersion/AtariRenderer.c deleted file mode 100644 index 84cf13825..000000000 --- a/mz_frontend/AtariVersion/AtariRenderer.c +++ /dev/null @@ -1,255 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "AtariInt.h" -#include "Core.h" -#include "Derelict.h" -#include "Engine3D.h" - -#include -#include -#include -#include - -#include -#include -#include - -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; - -char *menuItems[] = { - "8) Use/Toggle", - "5) Use with...", - "9) Use/pick...", - "6) Drop", - "7) Next item", - "4) Next in room", -}; - -void graphicsFlush(void); - -void nextItemInHand(void); - -void useItemInHand(void); - -void nextItemInRoom(void); - -void interactWithItemInRoom(void); - -void pickOrDrop(void); - -void dropItem(void); - -void pickItem(void); - -void clearGraphics(void); - -uint16_t *physBase; -uint16_t *logBase; - -uint8_t *framebuffer; -uint8_t bufferInput = '.'; - -#define NORMALIZE(x) (((x * 8) / 256)) - -void framebuffer_set_palette_entry(int index, int red, int green, int blue) { - *(uint16_t *) (0xffff8240 + (index * 2)) = blue | (green << 4) | (red << 8); -} - -void init(void) { - framebuffer = (uint8_t *) calloc(1, 128 * 128); - - physBase = Physbase(); - logBase = Logbase(); - memset(logBase, 0, 32000); - memset(physBase, 0, 32000); - Setscreen(-1, -1, 0); - - framebuffer_set_palette_entry(0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); - framebuffer_set_palette_entry(1, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0xAA)); - framebuffer_set_palette_entry(2, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0x00)); - framebuffer_set_palette_entry(3, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0xAA)); - framebuffer_set_palette_entry(4, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0x00)); - framebuffer_set_palette_entry(5, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0xAA)); - framebuffer_set_palette_entry(6, NORMALIZE(0xAA), NORMALIZE(0x55), NORMALIZE(0x00)); - framebuffer_set_palette_entry(7, NORMALIZE(0xAA), NORMALIZE(0xAA), NORMALIZE(0xAA)); - framebuffer_set_palette_entry(8, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0x55)); - framebuffer_set_palette_entry(9, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0xFF)); - framebuffer_set_palette_entry(10, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0x55)); - framebuffer_set_palette_entry(11, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0xFF)); - framebuffer_set_palette_entry(12, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0x55)); - framebuffer_set_palette_entry(13, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0xFF)); - framebuffer_set_palette_entry(14, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0x55)); - framebuffer_set_palette_entry(15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); -} - -/*Same as above*/ -void handleSystemEvents(void) { - bufferInput = Cnecin(); -} - -uint8_t getKey(void) { - handleSystemEvents(); - uint8_t toReturn = bufferInput; - bufferInput = '.'; - return toReturn; -} - -void clear(void) {} - -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - framebuffer[(128 * y) + x] = colour; -} - -void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t pixel) { - uint8_t *ptr; - int16_t _y0 = y0; - int16_t _y1 = y1; - - if (x0 < 0 || x0 >= 128) { - return; - } - - if (y0 > y1) { - _y0 = y1; - _y1 = y0; - } - - if (_y0 >= 128 || _y1 < 0) { - return; - } - - if (_y0 < 0) { - _y0 = 0; - } - - if (_y1 >= 128) { - _y1 = 127; - } - - ptr = &framebuffer[(128 * _y0) + (x0)]; - - for (int16_t y = _y0; y <= _y1; ++y) { - *ptr = pixel; - ptr += 128; - } -} - -void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { - if (y < 0 || y >= 128) { - return; - } - - int16_t _x0 = x0; - int16_t _x1 = x1; - - if (x0 > x1) { - _x0 = x1; - _x1 = x0; - } - - if (_x0 < 0) { - _x0 = 0; - } - - if (_x1 >= 128) { - _x1 = 127; - } - - uint8_t *ptr = &framebuffer[(128 * y) + _x0]; - for (int16_t x = _x0; x <= _x1; ++x) { - *ptr++ = colour; - } -} - -void shutdownGraphics(void) { -} - -void realPut(int x, int y, uint8_t value) { -} - -void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); -} - -void clearScreen(void) { -} - -void writeStrWithLimit(int _x, int y, const char *text, int limitX) { -} - -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 40); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -void graphicsFlush(void) { - - uint8_t *index = &framebuffer[0]; - uint16_t lineOffset = 0; - uint16_t *words = (uint16_t *) logBase; - - for (uint16_t y = 127; y; y--) { - memset(logBase + lineOffset, 0, 80); - for (uint16_t x = 0; x < 128; ++x) { - - uint8_t value = *index++; - uint16_t offset = lineOffset + ((x >> 4) << 2); - uint16_t bitPattern = (1 << (15 - (x & 15))); - uint16_t *ptr = &words[offset]; - - if (value & 1) { - *ptr |= bitPattern; - } - - ptr++; - - if (value & 2) { - *ptr |= bitPattern; - } - - ptr++; - - if (value & 4) { - *ptr |= bitPattern; - } - - ptr++; - - if (value & 8) { - *ptr |= bitPattern; - } - } - lineOffset += 80; - } - - uint16_t *tmp; - tmp = physBase; - physBase = logBase; - logBase = tmp; - Setscreen(logBase, physBase, -1); -} - -void showMessage(const char *message) { -} - -void titleScreen(void) { -} - -void HUD_initialPaint(void) { -} - -void sleepForMS(uint32_t ms) { -} - -void HUD_refresh(void) { -} diff --git a/mz_frontend/CMakeLists.txt b/mz_frontend/CMakeLists.txt index ac0998286..b8e36228f 100644 --- a/mz_frontend/CMakeLists.txt +++ b/mz_frontend/CMakeLists.txt @@ -1,31 +1,46 @@ cmake_minimum_required(VERSION 3.11) project(derelict16) -set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD 99) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake-sdl2") -include_directories( src ../core/src ../core/include ../common/include Engine3D - ${SDL2_INCLUDE_DIR} -) +include_directories(src ../core/src ../core/include include ../common/include + ${SDL2_INCLUDE_DIR} + ) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLSW -DRES128X128 -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DUSE_OWN_MIN_MAX -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -ggdb3 -DEMIT_QUIT_OPTION -DENDIANESS_AWARE -DSDL_DISABLE_IMMINTRIN_H") find_package(SDL2 REQUIRED) add_executable(derelict16 - Engine3D/Engine3D.c - Engine3D/HackingMinigame.c - SDLVersion/sdl2.c - ../core/src/Derelict.c - ../core/src/Core.c - ../common/src/Common.c - ../common/src/FixP.c - ../common/src/Globals.c - ../common/src/MapWithCharKey.c - ../common/src/CTile3DProperties.c - ../common/src/PackedFileReader.c - ) + src/RendererTesselation.c + src/Main.c + ../core/src/Derelict.c + ../core/src/Core.c + ../common/src/PackedFileReader.c + ../common/src/NullMusic.c + ../common/src/Common.c + ../common/src/Engine.c + ../common/src/CTile3DProperties.c + ../common/src/MapWithCharKey.c + src/HackingMinigame.c + include/HackingMinigame.h + src/SDLVersion/sdl2.c + src/UI.c + src/Events.c + src/RendererRasterizer.c + src/RendererTesselation.c + src/RendererScene.c + src/KeyboardUI.c + src/Crawler.c + src/GameMenu.c + ../common/src/HelpScreen.c + ../common/src/MainMenu.c + ../common/src/CreditsScreen.c + ../common/src/HackingMinigameRules.c + ../common/include/HackingMinigameRules.h + ) include(FindPkgConfig) diff --git a/mz_frontend/MSDOSVersion/msdos.c b/mz_frontend/MSDOSVersion/msdos.c deleted file mode 100644 index 0ad728cee..000000000 --- a/mz_frontend/MSDOSVersion/msdos.c +++ /dev/null @@ -1,251 +0,0 @@ -#include -#include -#include - -#include "Core.h" -#include "Derelict.h" -#include "Engine3D.h" - -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; - -void graphicsFlush(); - -void nextItemInHand(); - -void useItemInHand(); - -void nextItemInRoom(); - -void interactWithItemInRoom(); - -void pickOrDrop(); - -void dropItem(); - -void pickItem(); - -void clearGraphics(); - -unsigned char imageBuffer[128 * 128]; - -void shutdownGraphics(void) { -} - -void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { - - if (x0 < 0) { - return; - } - - int16_t y; - int16_t _y0 = y0; - int16_t _y1 = y1; - - if (y0 > y1) { - _y0 = y1; - _y1 = y0; - } - - if (_y0 < 0) { - _y0 = 0; - } - - if (_y1 >= 128) { - _y1 = 127; - } - - for (y = _y0; y <= _y1; ++y) { - imageBuffer[(128 * y) + x0] = colour; - } -} - - -void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { - if (y < 0) { - return; - } - - int16_t _x0 = x0; - int16_t _x1 = x1; - - if (x0 > x1) { - _x0 = x1; - _x1 = x0; - } - - if (_x0 < 0) { - _x0 = 0; - } - - if (_x1 >= 128) { - _x1 = 127; - } - - for (int x = _x0; x <= _x1; ++x) { - imageBuffer[(128 * y) + x] = colour; - } -} - -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - if (x < 0) { - x = 0; - } - - if (x >= 128) { - x = 127; - } - - if (y < 0) { - y = 0; - } - - if (y >= 128) { - y = 127; - } - - imageBuffer[(128 * y) + x] = colour; -} - -void realPut(int x, int y, uint16_t value) { - - int pixel = value; - int px = x; - int py = y; - - asm volatile ("movb $0x0C, %%ah\n\t" - "movb %0, %%al\n\t" - "movb $0x0, %%bh\n\t" - "movw %1, %%cx\n\t" - "movw %2, %%dx\n\t" - "int $0x10\n\t" - : - :"rm" (pixel), "rm" (px), "rm" (py) - : "ax", "bx", "cx", "dx" - ); -} - -void clearGraphics(void) { - memset(imageBuffer, 0, 128 * 128); -} - -void init(void) { - - asm volatile("movb $0x0, %%ah\n\t" - "movb $0x0D, %%al\n\t" - "int $0x10\n\t" - : - : - : "ax" - ); -} - -void clearScreen(void) { - init(); -} - -uint8_t getKey(void) { - unsigned char toReturn = 255; - - - asm volatile ("movb $0x00, %%ah\n\t" - "movb $0x00, %%al\n\t" - "int $0x16 \n\t" - "movb %%al, %0\n\t" - : "=rm"(toReturn) - : - : "ax" - ); - - asm volatile("movb $0x0C, %%ah\n\t" - "movb $0x00, %%al\n\t" - "int $0x21\n\t" - : - : - : "ax" - ); - - return toReturn; -} - -void writeStrWithLimit(int _x, int y, const char *text, int limitX) { - - uint16_t len = strlen(text); - const char *ptr = text; - uint16_t c = 0; - uint16_t chary = 0; - uint16_t x = _x; - - for (; c < len && y < 25; ++c) { - - char cha = *ptr; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++ptr; - continue; - } else { - ++x; - } - - asm volatile ( - "movb $0x02, %%ah\n\t" - "movb %0, %%dl\n\t" - "movb %1, %%dh\n\t" - "movb $0x0, %%bh\n\t" - "int $0x10\n\t" - "movb $0x09, %%ah\n" - "movb %2, %%al\n" - "movw $0x01, %%cx\n" - "movb $0x0, %%bh\n" - "movb $0x03, %%bl\n" - "int $0x10\n\t" - : - : "rm" (x), "rm" (y), "rm"(cha) - : "ax", "bx", "cx", "dx" - ); - - ++ptr; - } -} - -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 40); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -void graphicsFlush(void) { - uint8_t *bufferPtr = &imageBuffer[0]; - - for (int y = 0; y < 128; ++y) { - for (int x = 0; x < 128; ++x) { - uint16_t index = *bufferPtr; - - realPut(16 + x, 36 + y, index); - bufferPtr++; - } - } -} - -void showMessage(const char *message) { - writeStr(1, 1, message, 2, 0); -} - -void titleScreen(void) { -} - -void HUD_initialPaint(void) { -} - -void sleepForMS(uint32_t ms) { - usleep(ms); -} - -void HUD_refresh(void) { -} diff --git a/mz_frontend/Makefile.286 b/mz_frontend/Makefile.286 index b53379aaf..46e7dac83 100644 --- a/mz_frontend/Makefile.286 +++ b/mz_frontend/Makefile.286 @@ -1,19 +1,37 @@ CFLAGS = -fomit-frame-pointer -fno-exceptions -ffast-math \ - -I../core/include -I../common/include -IEngine3D \ - -DMSDOS -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DUSE_FILLED_POLYS \ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE + -Iinclude -I../core/include -I../common/include -IEngine3D \ + -DMSDOS -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE -DUSE_OWN_MIN_MAX \ + -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ + -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D CC = i386-pc-msdosdjgpp-gcc -OBJS = Engine3D/Engine3D.o MSDOSVersion/msdos.o \ - ../core/src/Core.o \ +OBJS = \ + src/MSDOSVersion/msdos.o \ + src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/Main.o \ ../core/src/Derelict.o \ + ../core/src/Core.o \ ../common/src/PackedFileReader.o \ + ../common/src/NullMusic.o \ + ../common/src/Common.o \ + ../common/src/Engine.o \ ../common/src/CTile3DProperties.o \ ../common/src/MapWithCharKey.o \ - ../common/src/FixP.o \ - ../common/src/Globals.o \ - ../common/src/Common.o + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/KeyboardUI.o \ + src/Crawler.o \ + src/GameMenu.o TARGET = derelict.exe @@ -23,7 +41,7 @@ $(TARGET): $(OBJS) all: $(TARGET) clean: - rm -f Engine3D/*.o - rm -f MSDOSVersion/*.o + rm -f src/*.o + rm -f src/MSDOSVersion/*.o rm -f ../core/src/*.o rm -f ../common/src/*.o diff --git a/mz_frontend/Makefile.atari b/mz_frontend/Makefile.atari index 5d3c8c500..64863bdfd 100644 --- a/mz_frontend/Makefile.atari +++ b/mz_frontend/Makefile.atari @@ -2,24 +2,38 @@ CXX = m68k-atari-mint-g++ CC = m68k-atari-mint-gcc STRIP=m68k-atari-mint-strip CFLAGS = -std=c99 -c -m68000 -s -fexpensive-optimizations -fomit-frame-pointer -Ofast \ - -DATARIST -DCLI_BUILD -DAGA5BPP -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE \ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION \ - -I../common/include -I../core/include -Imenu/include -ISoundSystem -IAtariVersion -I../core/include -IEngine3D \ - -I../common/include + -DATARIST -DCLI_BUILD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DUSE_OWN_MIN_MAX \ + -Iinclude -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AtariVersion \ + -I../common/include -I../core/include -Imenu/include -ISoundSystem -IAtariVersion -I../core/include -IEngine3D MENU_TARGET=game.prg MENU_OBJ= \ - Engine3D/Engine3D.o \ - AtariVersion/AtariRenderer.o \ - ../core/src/Core.o \ + src/AtariVersion/AtariRenderer.o \ + src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/Main.o \ ../core/src/Derelict.o \ - ../common/src/FixP.o \ - ../common/src/Globals.o \ + ../core/src/Core.o \ + ../common/src/PackedFileReader.o \ + ../common/src/NullMusic.o \ + ../common/src/Common.o \ + ../common/src/Engine.o \ ../common/src/CTile3DProperties.o \ ../common/src/MapWithCharKey.o \ - ../common/src/PackedFileReader.o \ - ../common/src/Common.o + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/KeyboardUI.o \ + src/Crawler.o \ + src/GameMenu.o $(MENU_TARGET): $(MENU_OBJ) $(CC) -o$(MENU_TARGET) $(MENU_OBJ) $(LDFLAGS) @@ -28,7 +42,7 @@ $(MENU_TARGET): $(MENU_OBJ) all: $(MENU_TARGET) clean: - rm -f Engine3D/*.o - rm -f AtariVersion/*.o + rm -f src/*.o + rm -f src/AtariVersion/*.o rm -f ../core/src/*.o rm -f ../common/src/*.o diff --git a/mz_frontend/Makefile.ocs b/mz_frontend/Makefile.ocs index a6686cd6a..0de71b4c5 100644 --- a/mz_frontend/Makefile.ocs +++ b/mz_frontend/Makefile.ocs @@ -4,9 +4,11 @@ STRIP=m68k-amigaos-strip AS = vasmm68k_mot CFLAGS = \ -c -m68000 -s -fexpensive-optimizations -fomit-frame-pointer -ffast-math -Ofast \ - -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include \ + -Isrc -I../core/src -I../core/include -Iinclude -I../common/include \ + -I../common/include -IAmigaVersion -I../core/include -I../common/include -IEngine3D -I../core/include -Isrc/AmigaVersion \ -Imenu/include -ISoundSystem \ - -DCLI_BUILD -DINCLUDE_ITEM_DESCRIPTIONS -DAGA5BPP -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR \ + -DSDLW -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ + -DCLI_BUILD -DINCLUDE_ITEM_DESCRIPTIONS -DAGA5BPP -DRES128X128 -DTRACE_OBJECTS_OVER_FLOOR -DUSE_OWN_MIN_MAX \ -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DUSE_FILLED_POLYS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE @@ -16,15 +18,29 @@ ASFLAGS = -phxass -Fhunk -m68000 -chklabels -no-fpu -wfail -I/opt/amiga/m68k-ami MENU_TARGET=gameocs MENU_OBJ= \ - Engine3D/Engine3D.o \ - AmigaVersion/AmigaRenderer.o \ - ../core/src/Core.o \ + src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/AmigaVersion/AmigaRenderer.o \ + src/Main.o \ ../core/src/Derelict.o \ - ../common/src/MapWithCharKey.o \ + ../core/src/Core.o \ ../common/src/PackedFileReader.o \ - ../common/src/CTile3DProperties.o \ + ../common/src/NullMusic.o \ ../common/src/Common.o \ - ../common/src/Globals.o \ + ../common/src/Engine.o \ + ../common/src/CTile3DProperties.o \ + ../common/src/MapWithCharKey.o \ + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/KeyboardUI.o \ + src/Crawler.o \ + src/GameMenu.o \ ../common/src/c2p1x1_4_c5_bm.o $(MENU_TARGET): $(MENU_OBJ) @@ -39,7 +55,7 @@ adf: $(MENU_TARGET) xdftool Derelict3D_ocs.adf list clean: - rm -f Engine3D/*.o - rm -f AmigaVersion/*.o + rm -f src/*.o + rm -f src/AmigaVersion/*.o rm -f ../core/src/*.o rm -f ../common/src/*.o diff --git a/mz_frontend/Makefile.sm4 b/mz_frontend/Makefile.sm4 index 83fd8bb2f..39b7b803f 100644 --- a/mz_frontend/Makefile.sm4 +++ b/mz_frontend/Makefile.sm4 @@ -46,8 +46,13 @@ LIBS += -u __modsi3 -u __divsi3 -u __mulsi3 -u __umodsi3 -u __udivsi3 -u __um # Any C or C++ standard should be fine here as long as GCC support it CCFLAGS = -m68000 -Wall -Wextra -std=c99 -ffreestanding -fcommon -Ofast -Wno-unused-parameter -Wno-char-subscripts \ - -DSMD -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR\ - -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE -DGAMEPAD -DUSE_FILLED_POLYS -DRLE_COMPRESSED_MAPS + -DSMD -fomit-frame-pointer -fno-exceptions -ffast-math \ + -Iinclude -I../core/include -I../common/include -IEngine3D \ + -DRES128X128 -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DENDIANESS_AWARE -DXRES=128 -DYRES=128\ + -DENDIANESS_AWARE -DMONOCHROME_VECTORS -DEMBEDDED_DATA -DRLE_COMPRESSED_MAPS -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_HACKING_MINIGAME -DTRACE_OBJECTS_OVER_FLOOR -DCAN_PICK_OBJECT_AT_ANY_DISTANCE -DRES128X128 -Wall -Wextra -pedantic -Wunused-parameter -DXRES_FRAMEBUFFER=256 -DYRES_FRAMEBUFFER=160 -DENDIANESS_AWARE \ + -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DSUPPORTS_ROOM_TRANSITION_ANIMATION -DENDIANESS_AWARE \ + -Iinclude -I../common/include -I../core/include -I../common/include -IEngine3D -I../core/include \ + -I../common/include -I../core/include -Imenu/include -ISoundSystem -I../core/include -IEngine3D # Extra options set by debug or release target ASFLAGS = -m68000 --register-prefix-optional @@ -59,7 +64,28 @@ RESS = $(wildcard res/*.res) SS = $(wildcard src/*.s) OBJS = $(RESS:.res=.o) -OBJS += Engine3D/Engine3D.o ../common/src/FixP.o ../common/src/Globals.o ../common/src/CTile3DProperties.o ../common/src/MapWithCharKey.o MegaDriveVersion/megadrive.o Engine3D/HackingMinigame.o ../core/src/Core.o ../core/src/Derelict.o ../common/src/Common.o ../common/src/ArrayPackedFileReader.o +OBJS += src/MegaDriveVersion/megadrive.o src/RendererTesselation.o \ + src/RendererRasterizer.o \ + src/RendererScene.o \ + ../common/src/HelpScreen.o \ + ../common/src/MainMenu.o \ + ../common/src/CreditsScreen.o \ + ../common/src/HackingMinigameRules.o \ + src/Main.o \ + ../core/src/Derelict.o \ + ../core/src/Core.o \ + ../common/src/ArrayPackedFileReader.o \ + ../common/src/NullMusic.o \ + ../common/src/Common.o \ + ../common/src/Engine.o \ + ../common/src/CTile3DProperties.o \ + ../common/src/MapWithCharKey.o \ + src/HackingMinigame.o \ + src/UI.o \ + src/Events.o \ + src/GamepadUI.o \ + src/Crawler.o \ + src/GameMenu.o OBJS += $(SS:.s=.o) ASMO = $(RESS:.res=.o) diff --git a/mz_frontend/SDLVersion/sdl2.c b/mz_frontend/SDLVersion/sdl2.c deleted file mode 100644 index ba551038e..000000000 --- a/mz_frontend/SDLVersion/sdl2.c +++ /dev/null @@ -1,401 +0,0 @@ -#include -#include -#include -#include -#include - - -#include "SDL.h" -#include "Engine3D.h" -#include "Common.h" -#include "Engine.h" - -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; -SDL_Window *window; -SDL_Renderer *renderer; - -#define TRANSPARENCY_COLOR 17 - -uint8_t mBufferedCommand; -uint32_t palette[16]; -uint8_t framebuffer[256 * 160]; - -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - if (x < 0) { - x = 0; - } - - if (x >= 128) { - x = 127; - } - - if (y < 0) { - y = 0; - } - - if (y >= 128) { - y = 127; - } - - - framebuffer[(256 * y) + x] = colour; -#ifdef PUTAFLIP - graphicsFlush(); - SDL_Delay(100); -#endif -} - -void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { - if (y < 0) { - return; - } - - int16_t _x0 = x0; - int16_t _x1 = x1; - - if (x0 > x1) { - _x0 = x1; - _x1 = x0; - } - - if (_x0 < 0) { - _x0 = 0; - } - - if (_x1 >= 128) { - _x1 = 127; - } - - for (int x = _x0; x <= _x1; ++x) { - framebuffer[(256 * y) + x] = colour; - } -} - -void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { - - if (x0 < 0 || x0 > XRESMINUSONE) { - return; - } - - int16_t y; - int16_t _y0 = y0; - int16_t _y1 = y1; - - if (y0 > y1) { - _y0 = y1; - _y1 = y0; - } - - if (_y0 < 0) { - _y0 = 0; - } - - if (_y1 >= 128) { - _y1 = 127; - } - - for (y = _y0; y <= _y1; ++y) { - framebuffer[(256 * y) + x0] = colour; - } -} - -void shutdownGraphics(void) { - SDL_Quit(); -} - -void showMessage(const char *mesg) { - puts(mesg); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -void clearGraphics(void) { - memset(framebuffer, 0, 256 * 160); -} - -void writeStr(int16_t nColumn, int16_t nLine, const char *str, uint16_t fg, uint16_t bg) { - puts(str); -} - -void printSituation(void) { - struct ObjectNode *playerObjects = getPlayerItems(); - puts("---------------"); - puts("\nPlayer items:"); - - while (playerObjects != NULL) { - struct Item *item = getItem(playerObjects->item); - - printf("%c%c%s\n", (playerObjects == focusedItem) ? '>' : ' ', item->active ? '*' : '-', item->name); - - playerObjects = playerObjects->next; - } - - puts("\nItems in room:"); - - struct ObjectNode *roomItems = getRoom(getPlayerRoom())->itemsPresent->next; - - while (roomItems != NULL) { - struct Item *item = getItem(roomItems->item); - - printf("%c%c%s\n", (roomItems == roomItem) ? '>' : ' ', item->active ? '*' : '-', item->name); - - roomItems = roomItems->next; - } -} - -void dropItem(); - -void pickItem(); - -void clearScreen(void) {} - - -uint8_t getKey(void) { - SDL_Event event; - - mBufferedCommand = '.'; - - while (SDL_PollEvent(&event)) { - - if (event.type == SDL_QUIT) { - - mBufferedCommand = 'q'; - } - - if (event.type == SDL_KEYUP) { - - switch (event.key.keysym.sym) { - case SDLK_RETURN: - case SDLK_z: - mBufferedCommand = 'a'; - break; - - case SDLK_ESCAPE: - case SDLK_q: - mBufferedCommand = 'l'; - break; - - case SDLK_SPACE: - printSituation(); - break; - - case SDLK_KP_7: - case SDLK_7: - mBufferedCommand = '7'; - break; - - case SDLK_KP_8: - case SDLK_8: - mBufferedCommand = '8'; - break; - - case SDLK_KP_4: - case SDLK_4: - mBufferedCommand = '4'; - break; - - case SDLK_KP_5: - case SDLK_5: - mBufferedCommand = '5'; - break; - - case SDLK_KP_9: - case SDLK_9: - mBufferedCommand = '9'; - break; - - case SDLK_KP_6: - case SDLK_6: - mBufferedCommand = '6'; - break; - - case SDLK_s: - break; - case SDLK_d: - break; - case SDLK_v: - break; - case SDLK_b: - break; - case SDLK_j: - break; - case SDLK_k: - break; - case SDLK_x: - mBufferedCommand = 'd'; - break; - case SDLK_c: - break; - case SDLK_e: - break; - - case SDLK_LEFT: - mBufferedCommand = 'q'; - break; - case SDLK_RIGHT: - mBufferedCommand = 'e'; - break; - case SDLK_UP: - mBufferedCommand = 'w'; - break; - case SDLK_DOWN: - mBufferedCommand = 's'; - break; - - default: - return '.'; - } - } - } - - return mBufferedCommand; -} - -void sleepForMS(uint32_t unused) { -} - -void init(void) { - int r, g, b; - mBufferedCommand = '.'; - SDL_Init(SDL_INIT_EVERYTHING); - SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); - memset(framebuffer, 0, 256 * 160); - window = - SDL_CreateWindow("Derelict 16-bits SDL2 test", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 512, 320, SDL_WINDOW_SHOWN); - - renderer = SDL_CreateRenderer(window, -1, 0); - - palette[0] = 0x000000; - palette[1] = 0x0000AA; - palette[2] = 0x00AA00; - palette[3] = 0x00AAAA; - palette[4] = 0xAA0000; - palette[5] = 0xAA00AA; - palette[6] = 0xAA5500; - palette[7] = 0xAAAAAA; - palette[8] = 0x555555; - palette[9] = 0x5555FF; - palette[10] = 0x55FF55; - palette[11] = 0x55FFFF; - palette[12] = 0xFF5555; - palette[13] = 0xFF55FF; - palette[14] = 0xFFFF55; - palette[15] = 0xFFFFFF; - -#ifdef __EMSCRIPTEN__ - enterFullScreenMode (); -#endif -} - - -void titleScreen(void) { - int keepGoing = 1; - clearGraphics(); - - writeStr(1, 1, "Space Mare Imperium:", 2, 0); - writeStr(1, 2, " Derelict", 2, 0); - writeStr(1, 4, "by Daniel Monteiro", 2, 0); - writeStr(1, 6, " Press B button ", 2, 0); - writeStr(1, 7, " to start", 2, 0); - - while (keepGoing) { - if (getKey() != '.') { - keepGoing = 0; - } - } - - clearScreen(); -} - -void flipRenderer(void) { - SDL_Rect rect; - uint32_t pixel; - int x, y; - - rect.x = 0; - rect.y = 0; - rect.w = 512; - rect.h = 320; - - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); - SDL_RenderFillRect(renderer, &rect); - - for (y = 0; y < 128; ++y) { - for (x = 0; x < 128; ++x) { - rect.x = 2 * x; - rect.y = 2 * y; - rect.w = 2; - rect.h = 2; - int index = framebuffer[(256 * y) + x]; - assert( !(index < 0 || index >= 16)); - - pixel = palette[index]; - - int r = (pixel & 0x00FF0000) >> 16; - int g = ((pixel & 0x0000FF00) >> 8); - int b = ((pixel & 0x000000FF)); - - SDL_SetRenderDrawColor(renderer, r, - g, - b, 255); - SDL_RenderFillRect(renderer, &rect); - } - } - - SDL_RenderPresent(renderer); - -#ifndef __EMSCRIPTEN__ - SDL_Delay(1000 / 60); -#endif -} - -void graphicsFlush(void) { - flipRenderer(); -} - - -void HUD_initialPaint(void) { -} - -void HUD_refresh(void) { - - - for (uint16_t i = 0; i < 6; ++i) { - writeStr(16, 13 + i, (i == cursorPosition) ? ">" : " ", 2, 0); - } - - - writeStr(16, 5, "Object in hand:", 2, 0); - if (focusedItem != NULL) { - struct Item *item = getItem(focusedItem->item); - - - if (item->active) { - writeStr(16, 6, "*", 2, 0); - } - - writeStr(17, 6, item->name, 2, 0); - } else { - writeStr(16, 6, "Nothing", 2, 0); - } - - writeStr(16, 8, "Object in room:", 2, 0); - - if (roomItem != NULL) { - struct Item *item = getItem(roomItem->item); - - - if (item->active) { - writeStr(16, 9, "*", 2, 0); - } - - writeStr(17, 9, item->name, 2, 0); - } else { - writeStr(16, 9, "Nothing", 2, 0); - } -} - - diff --git a/mz_frontend/Xcode2/Derelict-Info.plist b/mz_frontend/Xcode2/Derelict-Info.plist new file mode 100644 index 000000000..d9a1182ed --- /dev/null +++ b/mz_frontend/Xcode2/Derelict-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + helmet + CFBundleIdentifier + pt.b13h.Derelict + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj new file mode 100644 index 000000000..86c313880 --- /dev/null +++ b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.pbxproj @@ -0,0 +1,440 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + F13B51A22AA5F241006BE693 /* HackingMinigame.c in Sources */ = {isa = PBXBuildFile; fileRef = F13B519E2AA5F241006BE693 /* HackingMinigame.c */; }; + F13B51A32AA5F241006BE693 /* KeyboardUI.c in Sources */ = {isa = PBXBuildFile; fileRef = F13B519F2AA5F241006BE693 /* KeyboardUI.c */; }; + F13B51AD2AA613D4006BE693 /* Common.c in Sources */ = {isa = PBXBuildFile; fileRef = F13B51AC2AA613D4006BE693 /* Common.c */; }; + F14601D92AC82536007A09B5 /* UI.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D42AC82536007A09B5 /* UI.c */; }; + F14601DA2AC82536007A09B5 /* RendererRasterizer.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D52AC82536007A09B5 /* RendererRasterizer.c */; }; + F14601DB2AC82536007A09B5 /* RendererScene.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D62AC82536007A09B5 /* RendererScene.c */; }; + F14601DC2AC82536007A09B5 /* RendererTesselation.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D72AC82536007A09B5 /* RendererTesselation.c */; }; + F14601DD2AC82536007A09B5 /* Events.c in Sources */ = {isa = PBXBuildFile; fileRef = F14601D82AC82536007A09B5 /* Events.c */; }; + F149B82A263CB11700A3F597 /* Core.c in Sources */ = {isa = PBXBuildFile; fileRef = F149B829263CB11700A3F597 /* Core.c */; }; + F17ABEC62BFBDEEB00B69054 /* CreditsScreen.c in Sources */ = {isa = PBXBuildFile; fileRef = F17ABEC32BFBDEEB00B69054 /* CreditsScreen.c */; }; + F17ABEC72BFBDEEB00B69054 /* HelpScreen.c in Sources */ = {isa = PBXBuildFile; fileRef = F17ABEC42BFBDEEB00B69054 /* HelpScreen.c */; }; + F17ABEC82BFBDEEB00B69054 /* MainMenu.c in Sources */ = {isa = PBXBuildFile; fileRef = F17ABEC52BFBDEEB00B69054 /* MainMenu.c */; }; + F194EAD62610B51400E292ED /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; + F1CA76BB2610A8E200FD1E04 /* GameView.m in Sources */ = {isa = PBXBuildFile; fileRef = F1277A26236DE6DD00478B2C /* GameView.m */; }; + F1CA76BC2610A8ED00FD1E04 /* OSXRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = F1277A28236DE6DD00478B2C /* OSXRenderer.m */; }; + F1CA76BD2610A8EE00FD1E04 /* GameWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = F1B679BD24E4AAE400FCEF8E /* GameWindow.m */; }; + F1CA76C22610A91800FD1E04 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; + F1CA76D02610A93600FD1E04 /* Derelict.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D5B5D22531D2BF0094ED78 /* Derelict.c */; }; + F1CA76D62610A93B00FD1E04 /* Parser.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D5B5D32531D2BF0094ED78 /* Parser.c */; }; + F1CA76DD2610A98800FD1E04 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D1107310486CEB800E47090 /* Info.plist */; }; + F1CA76F22610A99900FD1E04 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + F1CA774E2610AFA000FD1E04 /* Derelict-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F1CA76B52610A8BF00FD1E04 /* Derelict-Info.plist */; }; + F1D4FFCD2AF8D85900F8A437 /* Engine.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFCC2AF8D85900F8A437 /* Engine.c */; }; + F1D4FFD62AF8D8C000F8A437 /* Crawler.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFD02AF8D8C000F8A437 /* Crawler.c */; }; + F1D4FFD82AF8D8C000F8A437 /* GameMenu.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFD22AF8D8C000F8A437 /* GameMenu.c */; }; + F1D4FFDD2AF8D8E000F8A437 /* HackingMinigameRules.c in Sources */ = {isa = PBXBuildFile; fileRef = F1D4FFDC2AF8D8E000F8A437 /* HackingMinigameRules.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + F1277A25236DE6DD00478B2C /* GameView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GameView.h; sourceTree = ""; }; + F1277A26236DE6DD00478B2C /* GameView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = GameView.m; sourceTree = ""; }; + F1277A27236DE6DD00478B2C /* OSXRenderer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OSXRenderer.h; sourceTree = ""; }; + F1277A28236DE6DD00478B2C /* OSXRenderer.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OSXRenderer.m; sourceTree = ""; }; + F13B519E2AA5F241006BE693 /* HackingMinigame.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HackingMinigame.c; path = ../src/HackingMinigame.c; sourceTree = ""; }; + F13B519F2AA5F241006BE693 /* KeyboardUI.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = KeyboardUI.c; path = ../src/KeyboardUI.c; sourceTree = ""; }; + F13B51A62AA5F255006BE693 /* font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = font.h; path = ../include/font.h; sourceTree = ""; }; + F13B51A72AA5F255006BE693 /* HackingMinigame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HackingMinigame.h; path = ../include/HackingMinigame.h; sourceTree = ""; }; + F13B51A82AA5F255006BE693 /* KeyboardUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = KeyboardUI.h; path = ../include/KeyboardUI.h; sourceTree = ""; }; + F13B51A92AA5F255006BE693 /* map-data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "map-data.h"; path = "../include/map-data.h"; sourceTree = ""; }; + F13B51AA2AA5F255006BE693 /* map.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = map.h; path = ../include/map.h; sourceTree = ""; }; + F13B51AC2AA613D4006BE693 /* Common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Common.c; path = ../../common/src/Common.c; sourceTree = ""; }; + F14601D42AC82536007A09B5 /* UI.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = UI.c; path = ../src/UI.c; sourceTree = SOURCE_ROOT; }; + F14601D52AC82536007A09B5 /* RendererRasterizer.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = RendererRasterizer.c; path = ../src/RendererRasterizer.c; sourceTree = SOURCE_ROOT; }; + F14601D62AC82536007A09B5 /* RendererScene.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = RendererScene.c; path = ../src/RendererScene.c; sourceTree = SOURCE_ROOT; }; + F14601D72AC82536007A09B5 /* RendererTesselation.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = RendererTesselation.c; path = ../src/RendererTesselation.c; sourceTree = SOURCE_ROOT; }; + F14601D82AC82536007A09B5 /* Events.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = Events.c; path = ../src/Events.c; sourceTree = SOURCE_ROOT; }; + F14601E72AC82B5E007A09B5 /* Renderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Renderer.h; path = ../include/Renderer.h; sourceTree = SOURCE_ROOT; }; + F14601E82AC82B69007A09B5 /* UI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UI.h; path = ../include/UI.h; sourceTree = SOURCE_ROOT; }; + F149B829263CB11700A3F597 /* Core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Core.c; path = ../../core/src/Core.c; sourceTree = ""; }; + F149B82B263CB12B00A3F597 /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Core.h; path = ../../core/include/Core.h; sourceTree = ""; }; + F17ABEC32BFBDEEB00B69054 /* CreditsScreen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = CreditsScreen.c; path = ../../common/src/CreditsScreen.c; sourceTree = ""; }; + F17ABEC42BFBDEEB00B69054 /* HelpScreen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HelpScreen.c; path = ../../common/src/HelpScreen.c; sourceTree = ""; }; + F17ABEC52BFBDEEB00B69054 /* MainMenu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = MainMenu.c; path = ../../common/src/MainMenu.c; sourceTree = ""; }; + F1B679BC24E4AAE400FCEF8E /* GameWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameWindow.h; sourceTree = ""; }; + F1B679BD24E4AAE400FCEF8E /* GameWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GameWindow.m; sourceTree = ""; }; + F1B8CB2F27CFCFE700C06E6F /* Common.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Common.h; path = ../../common/include/Common.h; sourceTree = SOURCE_ROOT; }; + F1BD0D30236EF697002329C6 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; + F1BD0D31236EF697002329C6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; + F1CA76B32610A8BF00FD1E04 /* Derelict.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Derelict.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F1CA76B52610A8BF00FD1E04 /* Derelict-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Derelict-Info.plist"; sourceTree = ""; }; + F1CD08C62450E41C00D4794D /* base.pfs */ = {isa = PBXFileReference; lastKnownFileType = file; name = base.pfs; path = ../base.pfs; sourceTree = SOURCE_ROOT; }; + F1D4FFCA2AF8D82800F8A437 /* Engine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Engine.h; path = ../../common/include/Engine.h; sourceTree = ""; }; + F1D4FFCB2AF8D83600F8A437 /* HackingMinigameRules.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HackingMinigameRules.h; path = ../../common/include/HackingMinigameRules.h; sourceTree = ""; }; + F1D4FFCC2AF8D85900F8A437 /* Engine.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Engine.c; path = ../../common/src/Engine.c; sourceTree = ""; }; + F1D4FFCE2AF8D87600F8A437 /* Enums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Enums.h; path = ../../common/include/Enums.h; sourceTree = ""; }; + F1D4FFCF2AF8D88800F8A437 /* SoundSystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SoundSystem.h; path = ../../common/include/SoundSystem.h; sourceTree = ""; }; + F1D4FFD02AF8D8C000F8A437 /* Crawler.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Crawler.c; path = ../src/Crawler.c; sourceTree = ""; }; + F1D4FFD22AF8D8C000F8A437 /* GameMenu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = GameMenu.c; path = ../src/GameMenu.c; sourceTree = ""; }; + F1D4FFDC2AF8D8E000F8A437 /* HackingMinigameRules.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = HackingMinigameRules.c; path = ../../common/src/HackingMinigameRules.c; sourceTree = ""; }; + F1D5B5D22531D2BF0094ED78 /* Derelict.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Derelict.c; path = ../../core/src/Derelict.c; sourceTree = ""; }; + F1D5B5D32531D2BF0094ED78 /* Parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Parser.c; path = ../../core/src/Parser.c; sourceTree = ""; }; + F1D5B5D62531D2C90094ED78 /* Parser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Parser.h; path = ../../core/include/Parser.h; sourceTree = ""; }; + F1D5B5D72531D2CA0094ED78 /* Derelict.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Derelict.h; path = ../../core/include/Derelict.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F1CA76B12610A8BF00FD1E04 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F1CA76F22610A99900FD1E04 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + F1277A25236DE6DD00478B2C /* GameView.h */, + F1277A26236DE6DD00478B2C /* GameView.m */, + F1B679BC24E4AAE400FCEF8E /* GameWindow.h */, + F1B679BD24E4AAE400FCEF8E /* GameWindow.m */, + F1277A27236DE6DD00478B2C /* OSXRenderer.h */, + F1277A28236DE6DD00478B2C /* OSXRenderer.m */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + F1BD0D30236EF697002329C6 /* Quartz.framework */, + F1BD0D31236EF697002329C6 /* QuartzCore.framework */, + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + F1CA76B32610A8BF00FD1E04 /* Derelict.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* The Mistral Report OSX */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + F1CA76B52610A8BF00FD1E04 /* Derelict-Info.plist */, + ); + name = "The Mistral Report OSX"; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + F14601D42AC82536007A09B5 /* UI.c */, + F14601D52AC82536007A09B5 /* RendererRasterizer.c */, + F14601D62AC82536007A09B5 /* RendererScene.c */, + F1D4FFCA2AF8D82800F8A437 /* Engine.h */, + F14601D72AC82536007A09B5 /* RendererTesselation.c */, + F14601D82AC82536007A09B5 /* Events.c */, + F1D4FFCB2AF8D83600F8A437 /* HackingMinigameRules.h */, + F13B519E2AA5F241006BE693 /* HackingMinigame.c */, + F17ABEC32BFBDEEB00B69054 /* CreditsScreen.c */, + F17ABEC42BFBDEEB00B69054 /* HelpScreen.c */, + F17ABEC52BFBDEEB00B69054 /* MainMenu.c */, + F14601E72AC82B5E007A09B5 /* Renderer.h */, + F1D4FFCE2AF8D87600F8A437 /* Enums.h */, + F1D4FFCF2AF8D88800F8A437 /* SoundSystem.h */, + F1D4FFD02AF8D8C000F8A437 /* Crawler.c */, + F1D4FFD22AF8D8C000F8A437 /* GameMenu.c */, + F1D4FFDC2AF8D8E000F8A437 /* HackingMinigameRules.c */, + F1D4FFCC2AF8D85900F8A437 /* Engine.c */, + F13B519F2AA5F241006BE693 /* KeyboardUI.c */, + F13B51A62AA5F255006BE693 /* font.h */, + F13B51A72AA5F255006BE693 /* HackingMinigame.h */, + F13B51A82AA5F255006BE693 /* KeyboardUI.h */, + F13B51A92AA5F255006BE693 /* map-data.h */, + F13B51AA2AA5F255006BE693 /* map.h */, + F14601E82AC82B69007A09B5 /* UI.h */, + F1B8CB2F27CFCFE700C06E6F /* Common.h */, + F13B51AC2AA613D4006BE693 /* Common.c */, + F149B82B263CB12B00A3F597 /* Core.h */, + F149B829263CB11700A3F597 /* Core.c */, + F1D5B5D22531D2BF0094ED78 /* Derelict.c */, + F1D5B5D72531D2CA0094ED78 /* Derelict.h */, + 29B97316FDCFA39411CA2CEA /* main.m */, + F1D5B5D32531D2BF0094ED78 /* Parser.c */, + F1D5B5D62531D2C90094ED78 /* Parser.h */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D1107310486CEB800E47090 /* Info.plist */, + F1CD08C62450E41C00D4794D /* base.pfs */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F1CA76B22610A8BF00FD1E04 /* Derelict8 */ = { + isa = PBXNativeTarget; + buildConfigurationList = F1CA76B62610A8C100FD1E04 /* Build configuration list for PBXNativeTarget "Derelict8" */; + buildPhases = ( + F1CA76AF2610A8BF00FD1E04 /* Resources */, + F1CA76B02610A8BF00FD1E04 /* Sources */, + F1CA76B12610A8BF00FD1E04 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Derelict8; + productName = Derelict; + productReference = F1CA76B32610A8BF00FD1E04 /* Derelict.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Derelict8" */; + compatibilityVersion = "Xcode 2.4"; + developmentRegion = en; + hasScannedForEncodings = 1; + knownRegions = ( + en, + Base, + English, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* The Mistral Report OSX */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F1CA76B22610A8BF00FD1E04 /* Derelict8 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F1CA76AF2610A8BF00FD1E04 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F1CA76DD2610A98800FD1E04 /* Info.plist in Resources */, + F1CA774E2610AFA000FD1E04 /* Derelict-Info.plist in Resources */, + F194EAD62610B51400E292ED /* MainMenu.nib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F1CA76B02610A8BF00FD1E04 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F149B82A263CB11700A3F597 /* Core.c in Sources */, + F1CA76BB2610A8E200FD1E04 /* GameView.m in Sources */, + F17ABEC72BFBDEEB00B69054 /* HelpScreen.c in Sources */, + F1CA76BC2610A8ED00FD1E04 /* OSXRenderer.m in Sources */, + F1CA76BD2610A8EE00FD1E04 /* GameWindow.m in Sources */, + F1CA76C22610A91800FD1E04 /* main.m in Sources */, + F1CA76D02610A93600FD1E04 /* Derelict.c in Sources */, + F1CA76D62610A93B00FD1E04 /* Parser.c in Sources */, + F13B51A22AA5F241006BE693 /* HackingMinigame.c in Sources */, + F13B51A32AA5F241006BE693 /* KeyboardUI.c in Sources */, + F13B51AD2AA613D4006BE693 /* Common.c in Sources */, + F14601D92AC82536007A09B5 /* UI.c in Sources */, + F14601DA2AC82536007A09B5 /* RendererRasterizer.c in Sources */, + F14601DB2AC82536007A09B5 /* RendererScene.c in Sources */, + F14601DC2AC82536007A09B5 /* RendererTesselation.c in Sources */, + F17ABEC62BFBDEEB00B69054 /* CreditsScreen.c in Sources */, + F14601DD2AC82536007A09B5 /* Events.c in Sources */, + F17ABEC82BFBDEEB00B69054 /* MainMenu.c in Sources */, + F1D4FFCD2AF8D85900F8A437 /* Engine.c in Sources */, + F1D4FFD62AF8D8C000F8A437 /* Crawler.c in Sources */, + F1D4FFD82AF8D8C000F8A437 /* GameMenu.c in Sources */, + F1D4FFDD2AF8D8E000F8A437 /* HackingMinigameRules.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { + isa = PBXVariantGroup; + children = ( + 29B97319FDCFA39411CA2CEA /* English */, + ); + name = MainMenu.nib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + "XRES_FRAMEBUFFER=256", + "YRES_FRAMEBUFFER=192", + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + SUPPORTS_HACKING_MINIGAME, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + RLE_COMPRESSED_MAPS, + DEMBEDDED_DATA, + ENDIANESS_AWARE, + EMIT_QUIT_OPTION, + MONOCHROME_VECTORS, + ); + MACOSX_DEPLOYMENT_TARGET = 10.4; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + "XRES_FRAMEBUFFER=256", + "YRES_FRAMEBUFFER=192", + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + SUPPORTS_HACKING_MINIGAME, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + RLE_COMPRESSED_MAPS, + DEMBEDDED_DATA, + ENDIANESS_AWARE, + EMIT_QUIT_OPTION, + MONOCHROME_VECTORS, + ); + MACOSX_DEPLOYMENT_TARGET = 10.4; + }; + name = Release; + }; + F1CA76B72610A8C100FD1E04 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + EMBEDDED_DATA, + RLE_COMPRESSED_MAPS, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + SUPPORTS_HACKING_MINIGAME, + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + "YRES_FRAMEBUFFER=192", + "XRES_FRAMEBUFFER=256", + MONOCHROME_VECTORS, + ); + INFOPLIST_FILE = "Derelict-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Derelict; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + F1CA76B82610A8C100FD1E04 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = ( + CLI_BUILD, + INCLUDE_ITEM_DESCRIPTIONS, + EMBEDDED_DATA, + RLE_COMPRESSED_MAPS, + SUPPORTS_ROOM_TRANSITION_ANIMATION, + SUPPORTS_HACKING_MINIGAME, + CAN_PICK_OBJECT_AT_ANY_DISTANCE, + "YRES_FRAMEBUFFER=192", + "XRES_FRAMEBUFFER=256", + MONOCHROME_VECTORS, + ); + INFOPLIST_FILE = "Derelict-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Derelict; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Derelict8" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + F1CA76B62610A8C100FD1E04 /* Build configuration list for PBXNativeTarget "Derelict8" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F1CA76B72610A8C100FD1E04 /* Debug */, + F1CA76B82610A8C100FD1E04 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..ca61a234e --- /dev/null +++ b/mz_frontend/Xcode2/Derelict8.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme b/mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme new file mode 100644 index 000000000..71af733ab --- /dev/null +++ b/mz_frontend/Xcode2/Derelict8.xcodeproj/xcshareddata/xcschemes/Derelict8.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mz_frontend/Xcode2/English.lproj/InfoPlist.strings b/mz_frontend/Xcode2/English.lproj/InfoPlist.strings new file mode 100644 index 000000000..79a393bb7 Binary files /dev/null and b/mz_frontend/Xcode2/English.lproj/InfoPlist.strings differ diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu.nib/classes.nib b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/classes.nib new file mode 100644 index 000000000..3dfe3f26e --- /dev/null +++ b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,8 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = GameView; LANGUAGE = ObjC; SUPERCLASS = NSView; }, + {CLASS = GameWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu.nib/info.nib b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 000000000..db2a93299 --- /dev/null +++ b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,24 @@ + + + + + IBDocumentLocation + 47 69 589 354 0 0 1280 1002 + IBEditorPositions + + 29 + 700 917 238 44 0 0 1280 1002 + + IBFramework Version + 489.0 + IBOldestOS + 5 + IBOpenObjects + + 21 + 29 + + IBSystem Version + 8S165 + + diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu.nib/keyedobjects.nib b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/keyedobjects.nib new file mode 100644 index 000000000..0e93d7015 Binary files /dev/null and b/mz_frontend/Xcode2/English.lproj/MainMenu.nib/keyedobjects.nib differ diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/classes.nib b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/classes.nib new file mode 100644 index 000000000..3dfe3f26e --- /dev/null +++ b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/classes.nib @@ -0,0 +1,8 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = GameView; LANGUAGE = ObjC; SUPERCLASS = NSView; }, + {CLASS = GameWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/info.nib b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/info.nib new file mode 100644 index 000000000..5f347eeeb --- /dev/null +++ b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/info.nib @@ -0,0 +1,24 @@ + + + + + IBDocumentLocation + 47 69 589 354 0 0 1280 1002 + IBEditorPositions + + 29 + 206 876 231 44 0 0 1280 1002 + + IBFramework Version + 489.0 + IBOldestOS + 5 + IBOpenObjects + + 21 + 29 + + IBSystem Version + 8S165 + + diff --git a/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/keyedobjects.nib b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/keyedobjects.nib new file mode 100644 index 000000000..65ad12926 Binary files /dev/null and b/mz_frontend/Xcode2/English.lproj/MainMenu~.nib/keyedobjects.nib differ diff --git a/mz_frontend/Xcode2/GameView.h b/mz_frontend/Xcode2/GameView.h new file mode 100644 index 000000000..688d45941 --- /dev/null +++ b/mz_frontend/Xcode2/GameView.h @@ -0,0 +1,23 @@ +// +// GameView.h +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import + +@interface GameView : NSView { + NSTimer* timer; + int bufferedInput; +} +-(void) initTimer; +-(void) stopTimer; +- (void)drawRect:(NSRect)rect; +- (int) getInput; + +-(void)keyUp:(NSEvent*)event; +-(void)keyDown:(NSEvent*)event; +- (BOOL)acceptsFirstResponder; +@end diff --git a/mz_frontend/Xcode2/GameView.m b/mz_frontend/Xcode2/GameView.m new file mode 100644 index 000000000..92bc679a0 --- /dev/null +++ b/mz_frontend/Xcode2/GameView.m @@ -0,0 +1,247 @@ +// +// GameView.m +// Sub Mare Imperium: Derelict +// +// Created by Daniel Monteiro on 2023-09-04. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import "GameView.h" + +#include +#include +#include +#include + +#include "Enums.h" +#include "UI.h" +#include "Engine.h" +#include "SoundSystem.h" +#include "Core.h" +#include "Derelict.h" +#include "KeyboardUI.h" +#include "Renderer.h" + +const char *mainText; + +long timeUntilNextState; +enum EPresentationState currentPresentationState; +enum EGameMenuState currentGameMenuState; +int8_t cameraRotation = 0; +int8_t cursorPosition; +enum EGameMenuState nextNavigationSelection; +enum EGameMenuState menuStateToReturn; +enum ESoundDriver soundDriver = kNoSound; + +extern GameView* osxview; + +@implementation GameView + +uint32_t palette[16]; +uint32_t stretchedBuffer[ 256 * 192 ]; +uint8_t framebuffer[128 * 128]; +uint8_t vfb[256 * 192]; + +CGColorSpaceRef rgb; +CGDataProviderRef provider; +CGImageRef ref; +extern uint8_t mBufferedCommand; +float multiplier = 1.0f; +extern uint8_t updateDirection; +id delegate; + + +void graphicsFlush(void); + +void stopSounds(void) { + +} + +void soundTick(void) { + +} + +void startFrame(int x, int y, int width, int height) { + (void)x; + (void)y; + (void)width; + (void)height; +} + +void endFrame(void) { + if (needsToRedrawVisibleMeshes) { + graphicsFlush(); + } + flushVirtualFramebuffer(); +} + +void playSound(uint8_t unused) { + +} + +void handleSystemEvents(void) { + +} + +void initHW(int argc, char** argv) { + initKeyboardUI(); + updateDirection = 0; + + mBufferedCommand = '.'; + memFill(framebuffer, 0, 128 * 128); +} + + +void shutdownGraphics(void) { +} + +- (void) repaintGame:(NSTimer *)timer +{ + startFrame(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER); + menuTick(10); + endFrame(); + + + [self setNeedsDisplay: YES ]; +} + +void setMultiplier(CGSize size) { + + if (((320.0f / 240.0f ) * size.height) < size.width ) { + multiplier = (((float)size.height) / 240.0f); + } else { + multiplier = (((float)size.width) / 320.0f); + } +} + +- (id)initWithFrame:(NSRect)frame +{ + int r, g, b; + + self = [super initWithFrame:frame]; + if (self) { + + bufferedInput = -1; + delegate = self; + rgb = CGColorSpaceCreateDeviceRGB(); + + + osxview = self; + palette[0] = 0xFF000099; + palette[1] = 0xFFFFFFBF; + palette[2] = 0xFFE0FFFF; + palette[3] = 0xFFFF0000; + palette[4] = 0xFFFFFFFF; + palette[5] = 0xFF000000; + palette[6] = 0xFF0000FF; + palette[7] = 0xFFFF00FF; + palette[8] = 0xFF00b7eb; + palette[9] = 0xFFFFFF00; + palette[10] = 0xFFAFEEEE; + palette[11] = 0xFFffc0cb; + palette[12] = 0xFF00FF00; + palette[13] = 0xFFAAFFAA; + palette[14] = 0xFF0000FF; + palette[15] = 0xFFAAAAFF; + + + initHW(0, NULL); + enterState(kMainMenu); + + + [self initTimer]; + } + + return self; +} + +-(void)keyDown:(NSEvent *)theEvent +{ +} + +-(void)keyUp:(NSEvent*)event +{ + + bufferedInput = [ event keyCode ]; +} + +- (BOOL)acceptsFirstResponder { + return YES; +} + +-(void) initTimer { + [NSTimer scheduledTimerWithTimeInterval:0.05f + target:self selector:@selector(repaintGame:) userInfo:nil repeats:YES]; + +} + +- (int) getInput { + int toReturn = bufferedInput; + + bufferedInput = -1; + + return toReturn; +} + +-(void) stopTimer { +} + +void shutdownHW(void) { + CGColorSpaceRelease(rgb); +} + +void flushVirtualFramebuffer() { + int x,y; + uint32_t pixel; + uint32_t *bufferPtr = &stretchedBuffer[0]; + for ( y = 0; y < 192; ++y ) { + for ( x = 0; x < 256; ++x ) { + int index = vfb[(256 * y) + x]; + + if (index < 0 || index >= 16) { + continue; + } + + pixel = palette[index]; + + *bufferPtr = pixel; + ++bufferPtr; + } + } +} + +- (void)drawRect:(NSRect)rect { + + CGRect bounds; + //NSRectToCGRect is not available on 10.4 + bounds.origin.x = rect.origin.x; + bounds.origin.y = rect.origin.y; + bounds.size.width = rect.size.width; + bounds.size.height = rect.size.height; + + float yMultiplier = ( (240.0f * multiplier) / 200.0f ); + + setMultiplier(bounds.size); + + /* MAC_OS_X_VERSION_10_10*/ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101000 + CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] CGContext]; +#else + CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; +#endif + + CGContextSaveGState(context); + + CGContextSetRGBFillColor(context, 0.0f, 0.0f, 0.0f, 1.0f); + CGContextFillRect(context, bounds); + + provider = CGDataProviderCreateWithData( NULL, &stretchedBuffer[0], 4 * XRES_FRAMEBUFFER * YRES_FRAMEBUFFER, NULL ); + ref = CGImageCreate( XRES_FRAMEBUFFER, YRES_FRAMEBUFFER, 8, 32, 4 * XRES_FRAMEBUFFER, rgb, kCGBitmapByteOrder32Host | kCGImageAlphaNoneSkipLast, provider, NULL, 0, kCGRenderingIntentDefault ); + CGContextScaleCTM(context, multiplier, yMultiplier); + CGContextDrawImage(context, CGRectMake( ((bounds.size.width / multiplier) - XRES_FRAMEBUFFER) / 2, ((bounds.size.height / yMultiplier) - YRES_FRAMEBUFFER) / 2, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER), ref); + CGImageRelease(ref); + CGDataProviderRelease(provider); + + CGContextRestoreGState(context); +} +@end diff --git a/mz_frontend/Xcode2/GameWindow.h b/mz_frontend/Xcode2/GameWindow.h new file mode 100644 index 000000000..6ad06f724 --- /dev/null +++ b/mz_frontend/Xcode2/GameWindow.h @@ -0,0 +1,16 @@ +// +// GameWindow.h +// The Mistral Report OSX +// +// Created by Daniel Monteiro on 6/15/20. +// Copyright 2020 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface GameWindow : NSWindow { + +} + +@end diff --git a/mz_frontend/Xcode2/GameWindow.m b/mz_frontend/Xcode2/GameWindow.m new file mode 100644 index 000000000..22333ce89 --- /dev/null +++ b/mz_frontend/Xcode2/GameWindow.m @@ -0,0 +1,39 @@ +// +// GameWindow.m +// The Mistral Report OSX +// +// Created by Daniel Monteiro on 6/15/20. +// Copyright 2020 __MyCompanyName__. All rights reserved. +// + +#import "GameWindow.h" +#import "GameView.h" + +@implementation GameWindow + +-(BOOL)makeFirstResponder:(NSResponder *)aResponder { + + /* UGLY HACK */ + if ([self respondsToSelector:@selector(setCollectionBehavior:) ]) { + + //NSWindowCollectionBehaviorFullScreenPrimary is not available on 10.4 SDK + [self setCollectionBehavior: (1 << 7)]; + } + + return [super makeFirstResponder: aResponder]; +} + +/* UGLY HACK */ +- (void)zoom:(id)sender { + [super zoom: sender ]; + + NSView *view = [[[self contentView] subviews ] objectAtIndex: 0 ]; + + if ( [ view isKindOfClass: [GameView class] ]) { + GameView *gv = (GameView*)view; + [gv viewDidEndLiveResize]; + } +} + + +@end diff --git a/mz_frontend/Xcode2/Info.plist b/mz_frontend/Xcode2/Info.plist new file mode 100644 index 000000000..aef04efe8 --- /dev/null +++ b/mz_frontend/Xcode2/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/mz_frontend/Xcode2/OSXRenderer.h b/mz_frontend/Xcode2/OSXRenderer.h new file mode 100644 index 000000000..241c9adb9 --- /dev/null +++ b/mz_frontend/Xcode2/OSXRenderer.h @@ -0,0 +1,13 @@ +// +// OSXRenderer.h +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#ifndef __The_Mistral_Report__OSXRenderer__ +#define __The_Mistral_Report__OSXRenderer__ + + +#endif /* defined(__The_Mistral_Report__OSXRenderer__) */ diff --git a/mz_frontend/Xcode2/OSXRenderer.m b/mz_frontend/Xcode2/OSXRenderer.m new file mode 100644 index 000000000..af47b9acf --- /dev/null +++ b/mz_frontend/Xcode2/OSXRenderer.m @@ -0,0 +1,307 @@ +// +// OSXRenderer.cpp +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import + +#include +#include +#include +#include + +#include "Enums.h" +#include "OSXRenderer.h" +#include "GameView.h" + +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "KeyboardUI.h" +#include "font.h" + + +GameView* osxview; +uint8_t mPalette[256]; +struct Bitmap *mFont; +uint8_t mBufferedCommand = '.'; + +void performAction(); + +void flushVirtualFramebuffer(void); + +void graphicsInit() { +} + +void graphicsShutdown() { +} + +enum ECommand getInput(void) { + int code = [ osxview getInput ]; + + mBufferedCommand = kCommandNone; + + switch (code) { + case 0: //a + case 6: //z + case 36: //enter + mBufferedCommand = kCommandFire1; + break; + + case 7: //x + mBufferedCommand = kCommandFire2; + break; + + case 8: //c + mBufferedCommand = kCommandFire3; + break; + + case 9: //v + mBufferedCommand = kCommandFire4; + break; + + case 1: //s + mBufferedCommand = kCommandStrafeLeft; + break; + case 2: //d + mBufferedCommand = kCommandStrafeRight; + break; + +#ifdef EMIT_QUIT_OPTION + case 53: //esc + mBufferedCommand = kCommandQuit; + break; +#endif + + case 126: + mBufferedCommand = kCommandUp; + break; + case 125: + mBufferedCommand = kCommandDown; + break; + + case 123: + mBufferedCommand = kCommandLeft; + break; + + case 124: + mBufferedCommand = kCommandRight; + break; + case -1: + break; + default: + break; + } + + performAction(); + + return mBufferedCommand; +} + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; +uint8_t updateDirection = 0; + +uint8_t mBufferedCommand; +uint32_t palette[16]; +uint8_t framebuffer[128 * 128]; +uint8_t vfb[256 * 192]; + +void graphicsPut(uint8_t x, uint8_t y) { + framebuffer[(128 * y) + x] = 1; +} + +void graphicsPutPointArray(uint8_t *y128Values) { + uint8_t *stencilPtr = y128Values; + int x; + + for (x = 0; x < XRES; ++x) { + graphicsPut(x, *stencilPtr); + ++stencilPtr; + } +} + +void clearTextScreen(void) { + fillRect(0, 129, 256, 192, 0, 0); +} + +void enterTextMode(void) { +} + +void exitTextMode(void) { +} + +void vLine(uint8_t x0, uint8_t y0, uint8_t y1, uint8_t shouldStipple) { + int16_t y; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + + for (y = _y0; y <= _y1; ++y) { + if (!shouldStipple || (y & 1)) { + graphicsPut(x0, y); + } + } +} + +void clearGraphics(void) { + memFill(framebuffer, 0, 128 * 128); +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour, NULL); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + +uint8_t *realPut(uint16_t x, uint8_t y, uint8_t colour, uint8_t *ptr) { + assert(y >= 0); + assert(x >= 0); + assert(x < 256); + assert(y < 192); + + vfb[(256 * y) + x] = colour; + + return NULL; +} + +void clearScreen(void) { + fillRect(0, 0, 255, 192, 0, 0); +} + +void writeStrWithLimit(uint8_t _x, uint8_t y, const char *text, uint8_t limitX, uint8_t fg, uint8_t bg) { + uint8_t len = strlen(text); + char *ptr = text; + uint8_t c = 0; + uint8_t x = _x; + int d; + + for (; c < len && y < 64; ++c) { + + char cha = *ptr; + + if (x == limitX) { + ++y; + x = _x; + } else if (cha == '\n') { + ++y; + x = _x; + ++ptr; + continue; + } + + if (cha >= 'a') { + if (cha <= 'z') { + cha = (cha - 'a') + 'A'; + } else { + cha -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((cha - 32) << 3)]; + + + for (d = 0; d < 8; ++d) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(8 * x + (7 - e), 8 * y + (d), 1, NULL); + } else { + realPut(8 * x + (7 - e), 8 * y + (d), 0, NULL); + } + chunk = chunk >> 1; + } + + + fontTop++; + } + + ++x; + ++ptr; + } +} + + +void flipRenderer(void) { + int x, y; + for (y = 0; y < 128; ++y) { + for (x = 0; x < 128; ++x) { + int index = framebuffer[(128 * y) + x]; + + if (index < 0 || index >= 16) { + continue; + } + + realPut(x, y, index, NULL); + } + } +} + +void graphicsFlush(void) { + if (updateDirection) { + updateDirection = 0; + switch (getPlayerDirection()) { + case 0: + writeStrWithLimit(12, 17, "N", 31, 2, 0); + break; + case 1: + writeStrWithLimit(12, 17, "E", 31, 2, 0); + break; + case 2: + writeStrWithLimit(12, 17, "S", 31, 2, 0); + break; + case 3: + writeStrWithLimit(12, 17, "W", 31, 2, 0); + break; + } + } + + if (needsToRedrawVisibleMeshes) { + flipRenderer(); + clearGraphics(); + } + flushVirtualFramebuffer(); +} + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + uint8_t x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + if (!stipple || ((x + y) & 1 )) { + realPut(x, y, colour, NULL); + } + } + } +} + + diff --git a/mz_frontend/Xcode2/main.m b/mz_frontend/Xcode2/main.m new file mode 100644 index 000000000..c470bd7a1 --- /dev/null +++ b/mz_frontend/Xcode2/main.m @@ -0,0 +1,20 @@ +// +// main.m +// The Mistral Report +// +// Created by Daniel Monteiro on 10/13/18. +// Copyright (c) 2018 Daniel Monteiro. All rights reserved. +// + +#import + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/mz_frontend/data/Makefile b/mz_frontend/data/Makefile index fd5e01329..bb73b6a32 100644 --- a/mz_frontend/data/Makefile +++ b/mz_frontend/data/Makefile @@ -3,21 +3,14 @@ CRUNCHER=wobj-compiler/dist/wobj-compiler-1.0-SNAPSHOT-jar-with-dependencies.jar PACKAGER=packer -#$(CRUNCHER): -# mvn -q -f wobj-compiler/pom.xml clean compile package install -# mkdir -p wobj-compiler/dist -# cp wobj-compiler/target/wobj-compiler-1.0-SNAPSHOT-jar-with-dependencies.jar wobj-compiler/dist - $(PACKAGER): rm -f $(PACKAGER) $(CXX) -std=c++14 -o$(PACKAGER) packer.cpp -#data: $(PACKAGER) $(CRUNCHER) data: $(PACKAGER) rm -f ./base.pfs -# ls -r src/*.obj | xargs java -jar wobj-compiler/dist/wobj-compiler-1.0-SNAPSHOT-jar-with-dependencies.jar ls -r assets/*.* | xargs ./packer - bin2c ../base.pfs ../Engine3D/basepfs.h basepfs + bin2c ../base.pfs ../include/basepfs.h basepfs mv ./data.pfs ../base.pfs images: diff --git a/mz_frontend/include/GamepadUI.h b/mz_frontend/include/GamepadUI.h new file mode 100644 index 000000000..c86a6e074 --- /dev/null +++ b/mz_frontend/include/GamepadUI.h @@ -0,0 +1,8 @@ +#ifndef GAMEPADUI_H +#define GAMEPADUI_H + +enum ECommand performActionJoypad(void); + +void initGamepadUI(void); + +#endif \ No newline at end of file diff --git a/mz_frontend/include/HackingMinigame.h b/mz_frontend/include/HackingMinigame.h new file mode 100644 index 000000000..ee54fbc3e --- /dev/null +++ b/mz_frontend/include/HackingMinigame.h @@ -0,0 +1,9 @@ +/* + Created by Daniel Monteiro on 2021-11-01. +*/ + +#ifndef DERELICT8_HACKINGMINIGAME_H +#define DERELICT8_HACKINGMINIGAME_H + + +#endif /* DERELICT8_HACKINGMINIGAME_H */ diff --git a/mz_frontend/include/KeyboardUI.h b/mz_frontend/include/KeyboardUI.h new file mode 100644 index 000000000..ef0538a84 --- /dev/null +++ b/mz_frontend/include/KeyboardUI.h @@ -0,0 +1,10 @@ +/* + Created by Daniel Monteiro on 12/07/2023. +*/ + +#ifndef DERELICT8_KEYBOARDUI_H +#define DERELICT8_KEYBOARDUI_H + +void initKeyboardUI(void); + +#endif //DERELICT8_KEYBOARDUI_H diff --git a/mz_frontend/include/Renderer.h b/mz_frontend/include/Renderer.h new file mode 100644 index 000000000..3de08007d --- /dev/null +++ b/mz_frontend/include/Renderer.h @@ -0,0 +1,128 @@ +/* + Created by Daniel Monteiro on 2021-10-22. +*/ + +#ifndef DERELICT8_RENDERER_H +#define DERELICT8_RENDERER_H + +#define XRES 127 +#define YRES 127 + +#define XRESMINUSONE (XRES - 1) +#define YRESMINUSONE (YRES - 1) + +#define CAMERA_HEIGHT 4 + +enum DIRECTION { + DIRECTION_N, + DIRECTION_E, + DIRECTION_S, + DIRECTION_W +}; + +#define IN_RANGE(V0, V1, V) ((V0) <= (V) && (V) <= (V1)) + +#define RLE_THRESHOLD 32 +#define MAP_SIZE_X 32 +#define MAP_SIZE_Y 32 +#define VISIBILITY_LIMIT_X (MAP_SIZE_X - 1) +#define VISIBILITY_LIMIT_Y (MAP_SIZE_Y - 1) +#define FAR_PLANE_Z 32 +#define NEAR_PLANE_Z 6 +#define RENDER_SCALE_X 1 +#define RENDER_SCALE_Z 1 + +/* Not rendered, but won't block visibility */ +#define NEUTRAL_CELL '.' + +#define STIPPLE_DISTANCE 13 + +#define STIPPLE_COLOUR_THRESHOLD 8 + +#define getPaletteEntry(c) (( (c) - 0xFF000000 ) % 3) + +void clearGraphics(void); + +void clearTextScreen(void); + +void dropItem(void); + +void initMap(void); + +#ifdef EMIT_QUIT_OPTION +void shutdownGraphics(void); +#endif + +enum ECommand getInput(void); + +void endFrame(void); + +void startFrame(int x, int y, int width, int height); + +void graphicsPut(int16_t x, int16_t y, uint16_t colour); + +void graphicsPutPointArray(uint8_t *y128Values); + +void HUD_initialPaint(void); + +void HUD_refresh(void); + +void initHW(int, char **pString); + +void interactWithItemInRoom(void); + +void nextItemInHand(void); + +void nextItemInRoom(void); + +void pickItem(void); + +void renderCameraNorth(void); + +void renderCameraEast(void); + +void renderCameraSouth(void); + +void renderCameraWest(void); + +void renderScene(void); + +void updateMapItems(void); + +void useItemInHand(void); + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour); + +void flush3DBuffer(void); + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour); + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t colour, + char charToReplaceHifenWith); + +void realPut(int x, int y, uint8_t value); + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour); + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple); + +void drawFloorAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dZ); + +void drawCubeAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ); + +void +drawWedge(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ, uint16_t elementMask, uint16_t type); + +void drawSquare(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, uint16_t elementMask); + +void drawObjectAt(int16_t x0, int16_t z0); + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour); + +void repaintMapItems(void); + +void drawPattern(uint16_t _pattern, int16_t x0, int16_t x1, int16_t z); + +extern uint8_t needsToRedrawVisibleMeshes; + +#endif /* DERELICT8_RENDERER_H */ diff --git a/mz_frontend/include/UI.h b/mz_frontend/include/UI.h new file mode 100644 index 000000000..e5719c557 --- /dev/null +++ b/mz_frontend/include/UI.h @@ -0,0 +1,48 @@ +/* + Created by Daniel Monteiro on 14/07/2023. +*/ + +#ifndef DERELICT8_MENU_H +#define DERELICT8_MENU_H + +void drawTextAt(uint8_t _x, uint8_t y, const char *text, uint8_t colour); + +void showMessage(const char *message); + +void drawMap(void); + +void performAction(void); + +void drawWindow(uint8_t tx, uint8_t ty, uint8_t tw, uint8_t th, const char *title); + +void +drawWindowWithOptions(const uint8_t x, + const uint8_t y, + const uint8_t dx, + const uint8_t dy, + const char *title, + const char **options, + const uint8_t optionsCount, + const uint8_t selectedOption); + +void drawGraphic(int x, int y, int dx, int dy, const uint8_t *graphic); + +void drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, + const char *content); + +enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t optionsCount, const enum ECommand cmd, enum EGameMenuState backState); + +void clearScreen(void); + +#define XRES_TEXT (XRES_FRAMEBUFFER / 8) +#define YRES_TEXT (YRES_FRAMEBUFFER / 8) + +extern uint8_t waitForKey; + +extern int8_t cursorPosition; + +extern uint8_t redrawMap; + +extern uint8_t needsToRedrawHUD; + +#endif //DERELICT8_MENU_H diff --git a/mz_frontend/include/basepfs.h b/mz_frontend/include/basepfs.h new file mode 100644 index 000000000..a225fd774 --- /dev/null +++ b/mz_frontend/include/basepfs.h @@ -0,0 +1,2482 @@ +#ifndef __basepfs__ +#define __basepfs__ + +unsigned int size_basepfs = 39577; +unsigned char basepfs[] __attribute__((aligned(16))) = { + 0x4d, 0x00, 0xcb, 0x04, 0x00, 0x00, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x2e, 0x74, + 0x78, 0x74, 0x00, 0x06, 0x05, 0x00, 0x00, 0x08, 0x48, 0x65, 0x6c, 0x70, 0x2e, 0x74, 0x78, 0x74, + 0x00, 0xb5, 0x06, 0x00, 0x00, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x2e, 0x74, + 0x78, 0x74, 0x00, 0xb7, 0x08, 0x00, 0x00, 0x09, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x2e, 0x74, 0x78, + 0x74, 0x00, 0xc4, 0x08, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x30, 0x2e, 0x74, 0x78, 0x74, 0x00, + 0xe8, 0x0c, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x0c, 0x11, + 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x30, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x30, 0x15, 0x00, + 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x54, 0x19, 0x00, 0x00, + 0x09, 0x6d, 0x61, 0x70, 0x31, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x78, 0x1d, 0x00, 0x00, 0x09, + 0x6d, 0x61, 0x70, 0x31, 0x33, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x9c, 0x21, 0x00, 0x00, 0x09, 0x6d, + 0x61, 0x70, 0x31, 0x34, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xc0, 0x25, 0x00, 0x00, 0x09, 0x6d, 0x61, + 0x70, 0x31, 0x35, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xe4, 0x29, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, + 0x31, 0x36, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x08, 0x2e, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, + 0x37, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2c, 0x32, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x38, + 0x2e, 0x74, 0x78, 0x74, 0x00, 0x50, 0x36, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x31, 0x39, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0x74, 0x3a, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x32, 0x2e, 0x74, 0x78, + 0x74, 0x00, 0x98, 0x3e, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x30, 0x2e, 0x74, 0x78, 0x74, + 0x00, 0xbc, 0x42, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x00, + 0xe0, 0x46, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x04, + 0x4b, 0x00, 0x00, 0x09, 0x6d, 0x61, 0x70, 0x32, 0x33, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x28, 0x4f, + 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x33, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x4c, 0x53, 0x00, 0x00, + 0x08, 0x6d, 0x61, 0x70, 0x34, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x70, 0x57, 0x00, 0x00, 0x08, 0x6d, + 0x61, 0x70, 0x35, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x94, 0x5b, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, + 0x36, 0x2e, 0x74, 0x78, 0x74, 0x00, 0xb8, 0x5f, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x37, 0x2e, + 0x74, 0x78, 0x74, 0x00, 0xdc, 0x63, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x38, 0x2e, 0x74, 0x78, + 0x74, 0x00, 0x00, 0x68, 0x00, 0x00, 0x08, 0x6d, 0x61, 0x70, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x00, + 0x24, 0x6c, 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x30, 0x2e, 0x62, 0x69, 0x6e, 0x00, + 0x72, 0x6d, 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, + 0xf4, 0x6f, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x30, 0x2e, 0x62, 0x69, 0x6e, + 0x00, 0xbe, 0x70, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x31, 0x2e, 0x62, 0x69, + 0x6e, 0x00, 0xb4, 0x71, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x32, 0x2e, 0x62, + 0x69, 0x6e, 0x00, 0xaa, 0x72, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x33, 0x2e, + 0x62, 0x69, 0x6e, 0x00, 0x74, 0x73, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, 0x34, + 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x30, 0x75, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x31, + 0x35, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x52, 0x76, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, + 0x31, 0x36, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xa0, 0x77, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x73, 0x31, 0x37, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x46, 0x79, 0x00, 0x00, 0x0b, 0x70, 0x72, 0x6f, + 0x70, 0x73, 0x31, 0x38, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x68, 0x7a, 0x00, 0x00, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x73, 0x31, 0x39, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x32, 0x7b, 0x00, 0x00, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x32, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x72, 0x7d, 0x00, 0x00, 0x0b, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x32, 0x30, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x18, 0x7f, 0x00, 0x00, 0x0b, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x32, 0x31, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xd4, 0x80, 0x00, 0x00, + 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x32, 0x32, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x38, 0x82, 0x00, + 0x00, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x32, 0x33, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xb2, 0x83, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x33, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x58, 0x85, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x34, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x22, 0x86, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x35, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x86, 0x87, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x36, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xea, 0x88, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x37, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xb4, 0x89, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x38, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0xaa, 0x8a, + 0x00, 0x00, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x39, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x0e, 0x8c, + 0x00, 0x00, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x4c, 0x8c, 0x00, + 0x00, 0x0a, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x30, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xd0, 0x8c, 0x00, + 0x00, 0x0a, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x53, 0x8d, 0x00, + 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x30, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xe7, 0x8d, + 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x31, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x7b, + 0x8e, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x32, 0x2e, 0x6c, 0x73, 0x74, 0x00, + 0x0f, 0x8f, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x33, 0x2e, 0x6c, 0x73, 0x74, + 0x00, 0xbc, 0x8f, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x34, 0x2e, 0x6c, 0x73, + 0x74, 0x00, 0x57, 0x90, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x35, 0x2e, 0x6c, + 0x73, 0x74, 0x00, 0xeb, 0x90, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x36, 0x2e, + 0x6c, 0x73, 0x74, 0x00, 0x7f, 0x91, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, 0x37, + 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x34, 0x92, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x31, + 0x38, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xd2, 0x92, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x31, 0x39, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x7f, 0x93, 0x00, 0x00, 0x0a, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x32, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xeb, 0x93, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x32, 0x30, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x86, 0x94, 0x00, 0x00, 0x0b, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x32, 0x31, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x25, 0x95, 0x00, 0x00, 0x0b, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x32, 0x32, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xc3, 0x95, 0x00, 0x00, 0x0b, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x32, 0x33, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x57, 0x96, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x33, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xf2, 0x96, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x34, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x9d, 0x97, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x35, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x38, 0x98, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x36, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xd6, 0x98, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x37, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x6a, 0x99, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x38, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0xfe, 0x99, 0x00, 0x00, 0x0a, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x39, 0x2e, 0x6c, 0x73, 0x74, 0x00, 0x37, 0x00, 0x00, 0x00, 0x44, + 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x20, 0x28, 0x4d, 0x6f, 0x6e, 0x74, 0x79, 0x4f, 0x6e, 0x54, 0x68, + 0x65, 0x52, 0x75, 0x6e, 0x29, 0x20, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x69, 0x72, 0x6f, 0x20, 0x2d, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0xab, 0x01, 0x00, 0x00, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x45, 0x4d, 0x50, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x0a, 0x76, + 0x61, 0x6c, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x66, 0x75, 0x65, 0x6c, 0x20, 0x72, 0x6f, + 0x64, 0x73, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x20, 0x28, 0x62, 0x65, + 0x73, 0x69, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x29, 0x3a, 0x0a, 0x0a, 0x5a, 0x3a, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, + 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x0a, 0x79, 0x6f, 0x75, + 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74, 0x27, 0x73, 0x20, 0x79, 0x6f, 0x75, + 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x74, 0x2e, 0x20, + 0x0a, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x77, 0x68, 0x61, + 0x74, 0x27, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x2e, 0x0a, 0x0a, 0x58, 0x3a, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, + 0x27, 0x74, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x0a, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x79, 0x6f, 0x75, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, + 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x2c, 0x20, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x61, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x27, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x0a, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x2e, 0x0a, + 0x0a, 0x43, 0x3a, 0x20, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x68, + 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x56, 0x3a, 0x20, 0x4e, 0x65, 0x78, 0x74, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x0a, 0xfe, 0x01, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2d, 0x20, 0x45, 0x70, 0x69, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x20, 0x2d, 0x20, 0x20, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x64, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x77, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x61, + 0x72, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x44, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x65, 0x65, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x72, 0x61, 0x67, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x61, 0x74, 0x65, 0x76, 0x65, 0x72, + 0x20, 0x73, 0x65, 0x74, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x2e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x61, 0x72, 0x6b, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x6f, 0x77, 0x2e, 0x0a, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x62, 0x6c, 0x61, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x45, 0x41, 0x42, 0x43, 0x44, 0x45, 0x5a, 0x57, 0x2e, 0x2e, 0x2e, 0x2e, 0x4a, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x49, + 0x49, 0x44, 0x44, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x3e, 0x49, 0x46, 0x46, 0x49, 0x3c, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x50, 0x5b, + 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x64, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x46, 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x64, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x46, 0x30, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x64, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x46, 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x50, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x5c, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x3c, 0x3e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x5c, + 0x2e, 0x2e, 0x2e, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x2e, 0x7b, 0x2e, 0x2e, 0x7d, 0x2e, 0x2e, 0x2e, + 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x7e, 0x54, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, + 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x5c, 0x53, 0x5a, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x2e, 0x54, 0x2e, 0x2e, 0x54, 0x2e, + 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x7c, 0x5a, 0x53, 0x2e, 0x28, 0x45, 0x45, 0x29, 0x2e, 0x54, 0x2e, 0x2e, 0x54, + 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x73, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x32, 0x32, 0x32, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x49, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x6e, 0x5f, + 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x52, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x54, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, + 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x5c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x54, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x44, 0x55, + 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, + 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x46, 0x46, 0x73, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x32, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, + 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x46, + 0x46, 0x46, 0x46, 0x50, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x5a, 0x4c, 0x53, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, + 0x46, 0x46, 0x46, 0x46, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x5c, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, + 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, + 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, + 0x2e, 0x65, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x0a, 0x49, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x49, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x54, 0x54, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x42, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x54, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x54, 0x43, 0x2e, 0x2e, 0x54, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, + 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2f, 0x58, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, 0x54, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, 0x4d, 0x2e, 0x2e, + 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, 0x4d, 0x2e, + 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x65, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, 0x4d, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x56, 0x56, 0x0a, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x58, 0x56, 0x56, + 0x0a, 0x49, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0a, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x0a, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x49, 0x42, 0x42, 0x42, 0x42, 0x42, 0x49, 0x0a, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5f, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x53, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, 0x2e, + 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x44, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, 0x2e, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x5c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x0a, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x54, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x0a, 0x49, 0x2e, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x43, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x50, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x0a, 0x49, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x0a, 0x2c, 0x49, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x0a, 0x2c, + 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x0a, + 0x2c, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x50, 0x50, 0x50, 0x49, 0x2c, + 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x50, + 0x50, 0x50, 0x50, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, + 0x49, 0x49, 0x53, 0x53, 0x53, 0x49, 0x54, 0x49, 0x49, 0x53, 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, + 0x49, 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x2f, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, + 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x0a, 0x42, 0x33, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x53, 0x53, 0x49, 0x53, 0x53, 0x49, 0x53, + 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x42, 0x33, 0x46, 0x46, 0x77, + 0x46, 0x46, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, 0x23, + 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x42, 0x33, 0x46, 0x46, + 0x73, 0x46, 0x46, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x53, 0x53, + 0x23, 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x5c, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x49, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x4c, 0x45, 0x49, 0x53, + 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, + 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x49, 0x53, 0x53, 0x23, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x6e, 0x73, 0x65, + 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x77, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x33, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x5c, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x44, 0x55, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x73, 0x46, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x32, 0x32, 0x32, 0x32, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x58, 0x58, 0x58, 0x58, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x2e, 0x49, + 0x53, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2f, 0x5c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x4d, 0x49, 0x2e, 0x2e, 0x2e, + 0x49, 0x30, 0x30, 0x30, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, 0x5c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x4d, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x3d, 0x3d, 0x3d, 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x7c, 0x2e, 0x2e, 0x7c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x3c, 0x4c, 0x52, 0x4c, 0x4c, + 0x4c, 0x49, 0x49, 0x46, 0x46, 0x46, 0x49, 0x50, 0x7c, 0x2c, 0x2c, 0x2f, 0x2e, 0x2e, 0x2e, 0x7c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, 0x4c, 0x5f, 0x5f, + 0x5f, 0x4c, 0x43, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, + 0x7c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, 0x4c, 0x5f, + 0x5f, 0x5f, 0x4c, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2d, 0x5c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, 0x4c, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x7c, + 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x5c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x7c, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7c, 0x2c, 0x2c, + 0x0a, 0x7c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x43, + 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x2e, 0x2e, 0x5c, 0x2c, + 0x2c, 0x0a, 0x49, 0x49, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x43, 0x2e, 0x2e, 0x31, + 0x58, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x65, 0x2e, + 0x31, 0x58, 0x2c, 0x0a, 0x58, 0x32, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, 0x2e, + 0x2e, 0x31, 0x58, 0x2c, 0x0a, 0x58, 0x32, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x43, + 0x2e, 0x2e, 0x2f, 0x2c, 0x2c, 0x0a, 0x58, 0x32, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, + 0x43, 0x43, 0x43, 0x7c, 0x2c, 0x2c, 0x0a, 0x2d, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x4c, 0x4c, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x43, 0x43, 0x43, 0x43, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x43, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, 0x43, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, 0x2e, + 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, 0x2e, + 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, 0x2e, + 0x2e, 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, 0x7c, + 0x2e, 0x2e, 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x5c, 0x2e, 0x2e, 0x2e, 0x43, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x43, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x7c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x5c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, + 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x46, 0x46, 0x46, 0x46, 0x50, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x49, 0x2e, 0x2e, 0x5a, 0x4c, 0x53, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, + 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x77, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, + 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x5c, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x2e, + 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, + 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x2c, 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x50, + 0x50, 0x50, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x5c, 0x49, 0x50, 0x50, 0x50, 0x50, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x4c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x4c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x49, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, 0x4d, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, 0x5c, 0x2e, 0x65, 0x2e, 0x31, 0x42, 0x0a, 0x2c, 0x2f, 0x50, + 0x50, 0x50, 0x50, 0x50, 0x50, 0x49, 0x58, 0x58, 0x58, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x0a, 0x42, 0x33, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x58, 0x58, 0x58, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x7d, 0x53, 0x53, 0x53, 0x7d, 0x53, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x42, + 0x33, 0x46, 0x46, 0x77, 0x46, 0x46, 0x46, 0x49, 0x58, 0x58, 0x58, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x7d, 0x53, 0x53, 0x53, 0x7d, 0x53, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x42, 0x33, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x53, 0x53, 0x53, 0x49, 0x23, 0x23, 0x23, + 0x49, 0x53, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x5c, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x53, 0x54, 0x53, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x53, 0x54, 0x53, 0x49, 0x53, 0x54, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x53, 0x52, 0x53, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x53, 0x52, 0x53, 0x49, 0x53, 0x52, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x53, 0x53, 0x53, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x53, 0x53, 0x53, 0x49, 0x53, 0x53, 0x53, 0x49, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x6e, 0x73, 0x65, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x5c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x0a, 0x58, 0x33, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x0a, 0x58, 0x33, 0x2e, + 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x5d, 0x5b, 0x49, 0x0a, 0x58, 0x33, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x5b, 0x5d, 0x49, 0x0a, 0x58, + 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x23, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x0a, + 0x49, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x0a, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x7d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x5b, 0x2e, 0x2e, 0x2e, 0x4c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x7b, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x5c, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x65, 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5d, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, 0x46, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x6e, 0x73, 0x77, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x50, 0x46, 0x46, 0x46, 0x46, 0x50, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x49, 0x2e, 0x2e, 0x5a, 0x4c, 0x53, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, + 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x33, 0x2e, 0x77, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, 0x46, + 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x58, 0x46, 0x33, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x31, + 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x2e, 0x2e, 0x2e, 0x65, 0x2e, 0x2e, 0x2e, + 0x31, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x73, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x31, 0x46, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x49, 0x49, 0x44, 0x55, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, 0x73, 0x46, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x32, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x30, 0x30, 0x30, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x6e, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x2f, 0x4c, 0x4c, 0x4c, 0x5c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x23, 0x33, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x46, 0x77, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x65, 0x46, 0x31, 0x23, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x4c, + 0x4c, 0x4c, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, + 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x49, 0x4c, 0x73, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x49, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x34, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2f, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x5c, 0x49, 0x49, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x7d, 0x7b, 0x2e, 0x28, 0x29, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x49, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, 0x49, + 0x5c, 0x2e, 0x2e, 0x77, 0x6e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, + 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x5c, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x33, 0x33, 0x33, 0x33, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x58, 0x58, 0x58, 0x58, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x0a, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, 0x49, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x73, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x32, 0x32, 0x32, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x20, 0x04, 0x00, 0x00, + 0x49, 0x2e, 0x2e, 0x2e, 0x4c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x30, 0x30, 0x30, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2e, + 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, + 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x6e, 0x5f, 0x5f, 0x5f, 0x5f, 0x4c, + 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x4c, 0x49, 0x52, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x46, 0x46, 0x46, 0x46, 0x46, 0x49, 0x2e, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x54, 0x2e, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x20, 0x04, 0x00, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x30, 0x30, 0x30, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x6e, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x2f, 0x4c, 0x4c, 0x4c, 0x5c, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x23, 0x33, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x46, 0x77, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x65, 0x46, 0x31, 0x23, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x58, 0x33, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x31, 0x58, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, 0x49, 0x49, 0x49, 0x5c, 0x4c, + 0x4c, 0x4c, 0x2f, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x49, + 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x49, 0x4c, 0x4c, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x49, 0x4c, 0x73, 0x4c, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x49, 0x32, 0x32, 0x32, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x49, 0x58, 0x58, 0x58, 0x49, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x0a, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x0a, 0x4a, 0x01, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x03, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0xff, 0x01, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x06, 0xff, 0x01, 0x03, 0x03, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0xff, 0x03, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x50, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x04, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x46, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0xff, 0x00, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x03, 0x02, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x04, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0x02, 0x03, 0x07, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0x02, 0x03, 0x05, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x07, 0x02, 0x07, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x03, 0x02, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x03, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x07, 0x03, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x07, 0xff, 0x07, 0x08, 0x03, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x28, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0xff, 0x07, 0x06, 0x03, 0x07, 0x01, 0x01, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0xff, 0x03, 0x00, + 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0xff, 0xff, 0x00, 0xff, 0x07, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x02, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x03, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x09, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x06, 0x03, 0x0a, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x03, 0x0b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0xff, 0x00, 0x02, 0x04, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf2, 0x00, + 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, + 0xff, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x08, + 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x07, 0xff, 0x00, + 0xff, 0x09, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0x00, 0x01, 0x05, 0x0b, + 0x0a, 0x06, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x0b, 0x0a, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, + 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xff, 0x00, 0x03, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x05, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x06, 0x01, 0x04, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x07, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0xb8, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x00, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, + 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x01, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x02, 0x05, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x01, 0x02, 0x00, 0x02, 0x08, 0x00, 0x01, + 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x01, + 0xff, 0x00, 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x43, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, + 0x99, 0x99, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0x0a, 0x06, 0x02, 0x07, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x0a, 0x01, 0x02, 0x07, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x07, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x07, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x01, 0xff, 0x00, + 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x43, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x02, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x99, 0x99, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa2, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x45, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0x04, 0x04, 0x01, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, + 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x09, 0xff, 0x00, 0x04, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x07, 0x09, 0x04, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0x09, 0x04, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x07, 0xff, 0xff, 0x00, 0xff, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x09, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x07, 0x09, 0xff, 0x00, 0x0a, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x04, 0x06, 0x02, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x01, 0x03, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x05, 0x03, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x05, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xff, 0x00, 0x05, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0x03, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x05, 0x07, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x02, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x02, 0x0a, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x02, 0x0b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x02, 0x02, 0x07, 0x01, 0x02, 0x02, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, + 0xcc, 0xcc, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0xff, 0x00, 0x02, 0x02, + 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x05, 0x06, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x06, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xff, 0x00, + 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x06, + 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0xff, 0x00, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0x06, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x06, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0xff, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x02, 0xff, 0x00, 0xff, 0x06, 0x00, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x05, 0x06, 0x04, 0x0a, 0x02, 0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x00, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x03, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb8, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, + 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x07, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0xff, 0xff, 0x00, 0xff, 0x08, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x0c, 0xff, 0x00, 0xff, 0x08, + 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x66, 0x66, 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0xff, 0xff, 0x00, 0xff, 0x08, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x08, 0x03, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0x08, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x0c, + 0xff, 0x00, 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x03, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x0b, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x0b, 0x02, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x02, 0x01, 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0x08, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x03, 0x05, 0x03, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x76, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x03, 0x03, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x05, 0x07, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7b, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x03, 0x02, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x01, 0x05, 0x07, 0x03, 0x03, + 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0x03, 0x01, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x00, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x06, 0x08, 0x03, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x01, 0x06, 0x08, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x03, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x04, 0x01, 0x06, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x05, 0x01, 0x06, 0x06, + 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x0a, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x01, + 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x07, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, + 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, + 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, + 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x05, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, + 0xff, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x06, 0x08, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x03, 0x02, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x09, + 0xff, 0x01, 0xff, 0x09, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x66, 0x66, 0x00, 0x00, 0x7d, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x06, 0x09, 0xff, 0x01, 0xff, 0x09, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x01, 0x01, 0x01, 0x09, 0x09, 0x05, 0x01, 0x03, 0x09, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x09, 0x0b, 0xff, 0x01, 0x03, 0x09, 0x02, 0x01, 0x00, 0x00, 0x03, 0x00, 0xcc, 0xcc, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x03, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, 0x01, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x02, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x05, 0x07, 0xff, 0x00, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x52, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x08, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x80, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, + 0xff, 0x00, 0xff, 0x07, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x05, 0x07, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x80, 0xff, 0xff, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x02, 0x04, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x01, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0xff, 0x00, 0x02, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x08, 0xff, 0x00, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x08, 0x02, 0x02, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, + 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0xff, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x01, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0x00, 0x05, 0x04, 0x03, 0x02, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, 0x00, 0x00, 0x01, 0x01, 0x01, 0xff, 0xff, + 0xff, 0x00, 0x02, 0x04, 0x03, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3a, 0x00, + 0x00, 0x00, 0x59, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x20, 0x6c, 0x75, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x73, + 0x74, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x27, 0x72, 0x65, 0x20, 0x6f, 0x62, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x6c, 0x79, 0x20, 0x66, 0x75, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x0a, 0x80, 0x00, 0x00, 0x00, + 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, + 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x7f, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, + 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, + 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, + 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, + 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0xa9, + 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x31, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x75, 0x70, 0x6e, 0x6f, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x64, 0x6f, 0x77, + 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, + 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, 0x00, + 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x31, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, + 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, + 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, + 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0xb1, + 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x65, 0x6c, 0x6c, + 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x73, 0x74, 0x64, 0x6d, 0x61, 0x74, 0x74, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, + 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, + 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, + 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x9a, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x6c, 0x61, 0x73, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0xa9, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x33, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x75, 0x70, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x6e, 0x6f, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x68, + 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, + 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, 0x00, 0x61, + 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x33, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, + 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, + 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x9b, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, + 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, + 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x9a, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x6c, 0x61, 0x73, + 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, + 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, + 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x6c, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0xa7, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x75, 0x70, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x6c, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, + 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, + 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, 0x00, + 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, + 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x70, 0x31, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, + 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, + 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x9a, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, + 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, + 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, + 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, + 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, + 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, + 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, + 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, + 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, + 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x90, 0x00, 0x00, 0x00, 0x61, 0x72, + 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, + 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x61, 0x73, 0x70, 0x68, 0x61, 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, + 0x69, 0x6d, 0x67, 0x0a, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x63, 0x68, 0x65, 0x76, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x97, 0x00, + 0x00, 0x00, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, + 0x62, 0x72, 0x69, 0x63, 0x6b, 0x73, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x70, 0x32, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x65, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x62, 0x61, 0x72, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x61, 0x73, 0x70, 0x68, 0x61, + 0x6c, 0x74, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, + 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x72, 0x79, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x69, 0x6d, 0x67, 0x0a, 0x63, 0x68, 0x65, 0x76, + 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x67, 0x0a, +}; + +#endif diff --git a/mz_frontend/include/font.h b/mz_frontend/include/font.h new file mode 100644 index 000000000..1d6c67427 --- /dev/null +++ b/mz_frontend/include/font.h @@ -0,0 +1,49 @@ +/* + Created by Daniel Monteiro on 11/07/2023. +*/ + +#ifndef DERELICT8_FONT_H +#define DERELICT8_FONT_H + +/* Adding const here actually doubles the ROM size! */ +static uint8_t font[] = { + /* ASCII table starting on SPACE. */ + /* Being on line 32 is no accident. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* space */ + , 0x10, 0x38, 0x38, 0x10, 0x10, 0x00, 0x10, 0x00, 0x6c, 0x6c, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x7c, 0x28, 0x28, 0x7c, 0x28, 0x00, 0x20, 0x38, 0x40, 0x30, 0x08, 0x70, 0x10, 0x00, 0x64, 0x64, 0x08, 0x10, + 0x20, 0x4c, 0x4c, 0x00, 0x20, 0x50, 0x50, 0x20, 0x54, 0x48, 0x34, 0x00, 0x30, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x00, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x00, + 0x00, 0x28, 0x38, 0x7c, 0x38, 0x28, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x30, 0x20, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x30, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00 /* space - 15 */ + , 0x38, 0x44, 0x4c, 0x54, 0x64, 0x44, 0x38, 0x00 /* 0 */ + , 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x38, 0x44, 0x04, 0x18, 0x20, 0x40, 0x7c, 0x00, 0x38, 0x44, + 0x04, 0x38, 0x04, 0x44, 0x38, 0x00, 0x08, 0x18, 0x28, 0x48, 0x7c, 0x08, 0x08, 0x00, 0x7c, 0x40, 0x40, 0x78, + 0x04, 0x44, 0x38, 0x00, 0x18, 0x20, 0x40, 0x78, 0x44, 0x44, 0x38, 0x00, 0x7c, 0x04, 0x08, 0x10, 0x20, 0x20, + 0x20, 0x00, 0x38, 0x44, 0x44, 0x38, 0x44, 0x44, 0x38, 0x00, 0x38, 0x44, 0x44, 0x3c, 0x04, 0x08, 0x30, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x20, 0x08, 0x10, + 0x20, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, + 0x08, 0x10, 0x20, 0x00, 0x38, 0x44, 0x04, 0x18, 0x10, 0x00, 0x10, 0x00, 0x38, 0x44, 0x5c, 0x54, 0x5c, 0x40, + 0x38, 0x00 /* 0 */ + , 0x38, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x00 /* a */ + , 0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x78, 0x00, 0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38, 0x00, 0x78, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x78, 0x00, 0x7c, 0x40, 0x40, 0x78, 0x40, 0x40, 0x7c, 0x00, 0x7c, 0x40, 0x40, 0x78, + 0x40, 0x40, 0x40, 0x00, 0x38, 0x44, 0x40, 0x5c, 0x44, 0x44, 0x3c, 0x00, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, + 0x44, 0x00, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x04, 0x04, 0x04, 0x04, 0x44, 0x44, 0x38, 0x00, + 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7c, 0x00, 0x44, 0x6c, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x00, 0x44, 0x64, 0x54, 0x4c, 0x44, 0x44, 0x44, 0x00, 0x38, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x38, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00, 0x38, 0x44, 0x44, 0x44, 0x54, 0x48, + 0x34, 0x00, 0x78, 0x44, 0x44, 0x78, 0x48, 0x44, 0x44, 0x00, 0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x38, 0x00, + 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x28, 0x10, 0x00, 0x44, 0x44, 0x54, 0x54, 0x54, 0x54, 0x28, 0x00, 0x44, 0x44, 0x28, 0x10, + 0x28, 0x44, 0x44, 0x00, 0x44, 0x44, 0x44, 0x28, 0x10, 0x10, 0x10, 0x00, 0x78, 0x08, 0x10, 0x20, 0x40, 0x40, + 0x78, 0x00, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, + 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x08, + 0x30, 0x40, 0x78, 0x00, 0x18, 0x20, 0x20, 0x60, 0x20, 0x20, 0x18, 0x00, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, + 0x10, 0x00, 0x30, 0x08, 0x08, 0x0c, 0x08, 0x08, 0x30, 0x00, 0x28, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x38, 0x6c, 0x44, 0x44, 0x7c, 0x00, 0x00 +}; + +#endif /* DERELICT8_FONT_H */ diff --git a/mz_frontend/include/map.h b/mz_frontend/include/map.h new file mode 100755 index 000000000..257426c87 --- /dev/null +++ b/mz_frontend/include/map.h @@ -0,0 +1,6 @@ +#ifndef MAP_H +#define MAP_H + +extern int8_t map[32][32]; + +#endif diff --git a/mz_frontend/AmigaVersion/AmigaInt.h b/mz_frontend/src/AmigaVersion/AmigaInt.h similarity index 100% rename from mz_frontend/AmigaVersion/AmigaInt.h rename to mz_frontend/src/AmigaVersion/AmigaInt.h diff --git a/mz_frontend/AmigaVersion/AmigaRenderer.c b/mz_frontend/src/AmigaVersion/AmigaRenderer.c similarity index 58% rename from mz_frontend/AmigaVersion/AmigaRenderer.c rename to mz_frontend/src/AmigaVersion/AmigaRenderer.c index 22e3226c7..9ba03f481 100644 --- a/mz_frontend/AmigaVersion/AmigaRenderer.c +++ b/mz_frontend/src/AmigaVersion/AmigaRenderer.c @@ -1,9 +1,10 @@ +#include +#include +#include #include #include #include -#include #include -#include #include #include @@ -14,47 +15,22 @@ #include #include +#include "Common.h" #include "AmigaInt.h" + +#include "Enums.h" #include "Core.h" #include "Derelict.h" -#include "Engine3D.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" +#include "font.h" #define REG(xn, parm) parm __asm(#xn) #define REGARGS __regargs #define NORMALIZE(x) (((x * 16) / 256)) -extern struct ObjectNode *focusedItem; -extern struct ObjectNode *roomItem; -extern int accessGrantedToSafe; - -char *menuItems[] = { - "8) Use/Toggle", - "5) Use with...", - "9) Use/pick...", - "6) Drop", - "7) Next item", - "4) Next in room", -}; - -void graphicsFlush(void); - -void nextItemInHand(void); - -void useItemInHand(void); - -void nextItemInRoom(void); - -void interactWithItemInRoom(void); - -void pickOrDrop(void); - -void dropItem(void); - -void pickItem(void); - -void clearGraphics(void); - extern void REGARGS c2p1x1_4_c5_bm( REG(d0, UWORD chunky_x), @@ -75,6 +51,17 @@ struct Screen *screen; uint8_t *framebuffer; uint8_t bufferInput = '.'; +extern uint8_t firstFrameOnCurrentState; +extern enum EGameMenuState currentGameMenuState; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION +extern uint8_t roomTransitionAnimationStep; +#endif + +extern enum EDirection playerDirection; +extern int8_t cameraX; +extern int8_t cameraZ; + struct NewScreen xnewscreen = { 0, /* LeftEdge*/ 0, /* TopEdge */ @@ -115,8 +102,6 @@ struct NewWindow my_new_window = { CUSTOMSCREEN /* Type */ }; -long frame = 0; - /* * Code lifted (and heavily modified) from the Strife AGA port by Lantus * https://github.com/lantus/Strife/blob/master/i_video.c @@ -128,52 +113,6 @@ static UWORD emptypointer[] = { 0x0000, 0x0000 /* reserved, must be NULL */ }; -void init(void) { - - framebuffer = (uint8_t *) calloc(1, 128 * 128); - - IntuitionBase = - (struct IntuitionBase *) OpenLibrary("intuition.library", 0); - - if (IntuitionBase == NULL) { - puts("nope 1!"); - exit(0); - } - - if ((screen = OpenScreen(&xnewscreen)) == NULL) { - } - - my_new_window.Screen = screen; - - my_window = (struct Window *) OpenWindow(&my_new_window); - - if (my_window == NULL) { - puts("nope 2!"); - CloseLibrary((struct Library *) IntuitionBase); - exit(0); - } - - SetRGB4(&screen->ViewPort, 0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 1, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 2, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 3, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 4, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 5, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 6, NORMALIZE(0xAA), NORMALIZE(0x55), NORMALIZE(0x00)); - SetRGB4(&screen->ViewPort, 7, NORMALIZE(0xAA), NORMALIZE(0xAA), NORMALIZE(0xAA)); - SetRGB4(&screen->ViewPort, 8, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 9, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0xFF)); - SetRGB4(&screen->ViewPort, 10, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 11, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0xFF)); - SetRGB4(&screen->ViewPort, 12, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 13, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0xFF)); - SetRGB4(&screen->ViewPort, 14, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0x55)); - SetRGB4(&screen->ViewPort, 15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); - - - SetPointer(my_window, emptypointer, 1, 16, 0, 0); -} - /* * Code lifted (and heavily modified) from the Strife AGA port by Lantus * https://github.com/lantus/Strife/blob/master/i_video.c @@ -264,6 +203,15 @@ void handleSystemEvents(void) { bufferInput = 'q'; break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + bufferInput = code; + break; + case '\n': case '\r': case 'i': @@ -316,18 +264,10 @@ void handleSystemEvents(void) { } } -uint8_t getKey(void) { - handleSystemEvents(); - uint8_t toReturn = bufferInput; - bufferInput = '.'; - return toReturn; -} - -void clear(void) {} void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - framebuffer[(128 * y) + x] = colour; + framebuffer[(256 * y) + x] = colour; } void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { @@ -356,11 +296,11 @@ void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { _y1 = 127; } - ptr = &framebuffer[(128 * _y0) + (x0)]; + ptr = &framebuffer[(256 * _y0) + (x0)]; for (int16_t y = _y0; y <= _y1; ++y) { *ptr = colour; - ptr += 128; + ptr += 256; } } @@ -385,7 +325,7 @@ void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { _x1 = 127; } - uint8_t *ptr = &framebuffer[(128 * y) + _x0]; + uint8_t *ptr = &framebuffer[(256 * y) + _x0]; for (int16_t x = _x0; x <= _x1; ++x) { *ptr++ = colour; } @@ -399,42 +339,334 @@ void shutdownGraphics(void) { } void realPut(int x, int y, uint8_t value) { + if (x < 0) { + x = 0; + } + + if (x >= 256) { + x = 255; + } + + if (y < 0) { + y = 0; + } + + if (y >= 160) { + y = 159; + } + framebuffer[(256 * y) + x] = value; } void clearGraphics(void) { - memset(framebuffer, 0, 128 * 128); + memFill(framebuffer, 0, 256 * 160); } void clearScreen(void) { } +void graphicsFlush(void) { + c2p1x1_4_c5_bm(256, 160, 0, 0, &framebuffer[0], my_window->RPort->BitMap); +} + +char playerPositionSprite[4][8]={ + { + 0b00011000, + 0b00111100, + 0b01111110, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00100000, + 0b01100000, + 0b11100000, + 0b11100000, + 0b01100000, + 0b00100000, + 0b00000000, + 0b00000000 + }, + { + 0b01111110, + 0b00111100, + 0b00011000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00000100, + 0b00000110, + 0b00000111, + 0b00000111, + 0b00000110, + 0b00000100, + 0b00000000, + 0b00000000 + }, +}; + +void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { -void writeStrWithLimit(int _x, int y, const char *text, int limitX) { + for(uint8_t c = 0; c < 8; ++c) { + uint8_t line = *sprite; + for (uint16_t d = 0; d < 8; ++d) { + if (line & 1) { + realPut( x + d, y + c, colour); + } + line = line >> 1; + } + ++sprite; + } } -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 40); +uint8_t *graphicsPutAddr(uint8_t x, uint8_t y, uint8_t colour, uint8_t *ptrToByte) { + } -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} +void graphicsPutPointArray(uint8_t *y128Values) { -void graphicsFlush(void) { - c2p1x1_4_c5_bm(128, 128, 0, 0, &framebuffer[0], my_window->RPort->BitMap); } -void showMessage(const char *message) { + +void initHW(int argc, char **argv) { + + framebuffer = (uint8_t *) allocMem(256 * 160, GENERAL_MEMORY, TRUE); + + IntuitionBase = + (struct IntuitionBase *) OpenLibrary("intuition.library", 0); + + if (IntuitionBase == NULL) { + puts("nope 1!"); + exit(0); + } + + if ((screen = OpenScreen(&xnewscreen)) == NULL) { + } + + my_new_window.Screen = screen; + + my_window = (struct Window *) OpenWindow(&my_new_window); + + if (my_window == NULL) { + puts("nope 2!"); + CloseLibrary((struct Library *) IntuitionBase); + exit(0); + } + + SetRGB4(&screen->ViewPort, 0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 1, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 2, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 3, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 4, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 5, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 6, NORMALIZE(0xAA), NORMALIZE(0x55), NORMALIZE(0x00)); + SetRGB4(&screen->ViewPort, 7, NORMALIZE(0xAA), NORMALIZE(0xAA), NORMALIZE(0xAA)); + SetRGB4(&screen->ViewPort, 8, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 9, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0xFF)); + SetRGB4(&screen->ViewPort, 10, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 11, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0xFF)); + SetRGB4(&screen->ViewPort, 12, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 13, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0xFF)); + SetRGB4(&screen->ViewPort, 14, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0x55)); + SetRGB4(&screen->ViewPort, 15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); + + + SetPointer(my_window, emptypointer, 1, 16, 0, 0); + + initKeyboardUI(); + clearGraphics(); +} + +enum ECommand getInput(void) { + + + switch(bufferInput) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} + + +void startFrame(int x, int y, int width, int height) { } -void titleScreen(void) { +void endFrame(void) { + + if (currentGameMenuState == kPlayGame) { + put_sprite_8( + (XRES_FRAMEBUFFER / 2) + ((cameraX + 6) * 3) - 1, + (cameraZ * 3) + 10, + &playerPositionSprite[playerDirection][0], + 1 + ); + } + graphicsFlush(); } -void HUD_initialPaint(void) { + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } } -void sleepForMS(uint32_t ms) { +void enterTextMode(void) {} + +void exitTextMode(void) { + clearScreen(); } -void HUD_refresh(void) { + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } } diff --git a/mz_frontend/AtariVersion/AtariInt.h b/mz_frontend/src/AtariVersion/AtariInt.h similarity index 100% rename from mz_frontend/AtariVersion/AtariInt.h rename to mz_frontend/src/AtariVersion/AtariInt.h diff --git a/mz_frontend/src/AtariVersion/AtariRenderer.c b/mz_frontend/src/AtariVersion/AtariRenderer.c new file mode 100644 index 000000000..d912be8d7 --- /dev/null +++ b/mz_frontend/src/AtariVersion/AtariRenderer.c @@ -0,0 +1,360 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "Common.h" +#include "AtariInt.h" +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" +#include "font.h" + +uint16_t *physBase; +uint16_t *logBase; + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; + +uint8_t *framebuffer; +uint8_t bufferInput = '.'; +extern uint8_t firstFrameOnCurrentState; + +#define NORMALIZE(x) (((x * 8) / 256)) + +void framebuffer_set_palette_entry(int index, int red, int green, int blue) { + *(uint16_t *) (0xffff8240 + (index * 2)) = blue | (green << 4) | (red << 8); +} + +void initHW(int argc, char** argv) { + framebuffer = (uint8_t *) allocMem(256 * 160, GENERAL_MEMORY, TRUE); + + physBase = Physbase(); + logBase = Logbase(); + memFill(logBase, 0, 32000); + memFill(physBase, 0, 32000); + Setscreen(-1, -1, 0); + + framebuffer_set_palette_entry(0, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0x00)); + framebuffer_set_palette_entry(1, NORMALIZE(0x00), NORMALIZE(0x00), NORMALIZE(0xAA)); + framebuffer_set_palette_entry(2, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0x00)); + framebuffer_set_palette_entry(3, NORMALIZE(0x00), NORMALIZE(0xAA), NORMALIZE(0xAA)); + framebuffer_set_palette_entry(4, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0x00)); + framebuffer_set_palette_entry(5, NORMALIZE(0xAA), NORMALIZE(0x00), NORMALIZE(0xAA)); + framebuffer_set_palette_entry(6, NORMALIZE(0xAA), NORMALIZE(0x55), NORMALIZE(0x00)); + framebuffer_set_palette_entry(7, NORMALIZE(0xAA), NORMALIZE(0xAA), NORMALIZE(0xAA)); + framebuffer_set_palette_entry(8, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0x55)); + framebuffer_set_palette_entry(9, NORMALIZE(0x55), NORMALIZE(0x55), NORMALIZE(0xFF)); + framebuffer_set_palette_entry(10, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0x55)); + framebuffer_set_palette_entry(11, NORMALIZE(0x55), NORMALIZE(0xFF), NORMALIZE(0xFF)); + framebuffer_set_palette_entry(12, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0x55)); + framebuffer_set_palette_entry(13, NORMALIZE(0xFF), NORMALIZE(0x55), NORMALIZE(0xFF)); + framebuffer_set_palette_entry(14, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0x55)); + framebuffer_set_palette_entry(15, NORMALIZE(0xFF), NORMALIZE(0xFF), NORMALIZE(0xFF)); +} + +void handleSystemEvents(void) { + bufferInput = Cnecin(); +} + +void endFrame(void) { + + uint8_t *index = &framebuffer[0]; + uint16_t lineOffset = 0; + uint16_t *words = (uint16_t *) logBase; + + for (uint16_t y = 160; y; y--) { + memFill(logBase + lineOffset, 0, 80); + for (uint16_t x = 0; x < 256; ++x) { + + uint8_t value = *index++; + uint16_t offset = lineOffset + ((x >> 4) << 2); + uint16_t bitPattern = (1 << (15 - (x & 15))); + uint16_t *ptr = &words[offset]; + + if (value & 1) { + *ptr |= bitPattern; + } + + ptr++; + + if (value & 2) { + *ptr |= bitPattern; + } + + ptr++; + + if (value & 4) { + *ptr |= bitPattern; + } + + ptr++; + + if (value & 8) { + *ptr |= bitPattern; + } + } + lineOffset += 80; + } + + uint16_t *tmp; + tmp = physBase; + physBase = logBase; + logBase = tmp; + Setscreen(logBase, physBase, -1); +} + +enum ECommand getInput(void) { + + switch(bufferInput) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + framebuffer[(256 * y) + x] = colour; +} + +void realPut(int x, int y, uint8_t colour) { + framebuffer[(256 * y) + x] = colour; +} + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } +} + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t pixel) { + uint8_t *ptr; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (x0 < 0 || x0 >= 128) { + return; + } + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + if (_y0 >= 128 || _y1 < 0) { + return; + } + + if (_y0 < 0) { + _y0 = 0; + } + + if (_y1 >= 128) { + _y1 = 127; + } + + ptr = &framebuffer[(256 * _y0) + (x0)]; + + for (int16_t y = _y0; y <= _y1; ++y) { + *ptr = pixel; + ptr += 256; + } +} + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { + if (y < 0 || y >= 128) { + return; + } + + int16_t _x0 = x0; + int16_t _x1 = x1; + + if (x0 > x1) { + _x0 = x1; + _x1 = x0; + } + + if (_x0 < 0) { + _x0 = 0; + } + + if (_x1 >= 128) { + _x1 = 127; + } + + uint8_t *ptr = &framebuffer[(256 * y) + _x0]; + for (int16_t x = _x0; x <= _x1; ++x) { + *ptr++ = colour; + } +} + +void clearScreen(void) { + memFill(framebuffer, 0, 256 * 160); +} + +void clearGraphics(void) { + memFill(framebuffer, 0, 256 * 160); +} + +void startFrame(int x, int y, int width, int height) { + +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} diff --git a/mz_frontend/src/Crawler.c b/mz_frontend/src/Crawler.c new file mode 100644 index 000000000..b96400479 --- /dev/null +++ b/mz_frontend/src/Crawler.c @@ -0,0 +1,270 @@ +/* + Created by monty on 01-10-2023. +*/ +#include +#include + +#include "Common.h" +#include "Enums.h" +#include "UI.h" +#include "Renderer.h" +#include "Core.h" +#include "Derelict.h" +#include "map.h" +#include "Engine.h" +#include "map.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" + + +int8_t map[32][32]; + +extern int8_t stencilHigh[XRES]; +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern uint8_t accessGrantedToSafe; +extern int8_t cameraX; +extern int8_t cameraZ; +extern int8_t cameraRotation; +extern uint8_t enteredFrom; +extern uint8_t playerLocation; +extern struct MapWithCharKey tileProperties; + +uint8_t needsToRedrawVisibleMeshes; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION +uint8_t roomTransitionAnimationStep = 0; +#endif + +void HUD_refresh(void) { + if (!needsToRedrawHUD) { + return; + } + + needsToRedrawHUD = 0; + + drawWindow(0, + (YRES / 8) + 1, + (XRES_FRAMEBUFFER / 8) / 2, + 5, + "In hand:"); + + struct Item *item; + + /* Display "In room" item */ + if (roomItem != NULL) { + item = getItem(roomItem->item); + if (item->active) { + drawTextAt(1, YRES_TEXT - 6, "*", 2); + } + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 6, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + } else { + drawTextAt(2, YRES_TEXT - 6, "Nothing", 2); + } + + /* Display "In hand" item */ + if (focusedItem != NULL) { + item = getItem(focusedItem->item); + if (item->active) { + drawTextAt(1, YRES_TEXT - 3, "*", 1); + } + drawTextAtWithMarginWithFiltering(2, YRES_TEXT - 3, (XRES_FRAMEBUFFER) / 2, item->name, 2, ' '); + } else { + drawTextAt(2, YRES_TEXT - 3, "Nothing", 2); + } +} + +enum EGameMenuState Crawler_tickCallback(enum ECommand cmd, void* data) { + (void)data; + uint8_t prevX; + uint8_t prevZ; + struct WorldPosition *pos; + uint8_t previousLocation = playerLocation; + uint8_t newCell = 0; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION + if (roomTransitionAnimationStep) { + needsToRedrawVisibleMeshes = 1; + return kResumeCurrentState; + } +#endif + + prevX = cameraX; + prevZ = cameraZ; + + switch (cmd) { + case kCommandFire5: + nextItemInHand(); + break; + + case kCommandFire6: + nextItemInRoom(); + break; + + case kCommandFire1: + useItemInHand(); + break; + + case kCommandFire2: + interactWithItemInRoom(); + break; + + case kCommandFire3: + pickItem(); + break; + + case kCommandFire4: + dropItem(); + break; + default: + goto handle_directions; + } + updateMapItems(); + needsToRedrawVisibleMeshes = 1; + + if (!waitForKey) { + needsToRedrawHUD = 1; + } + + return kResumeCurrentState; +handle_directions: + switch (cmd) { + case kCommandLeft: + turnLeft(); + break; + + case kCommandRight: + turnRight(); + break; + + case kCommandStrafeLeft: + walkBy(3); + break; + case kCommandStrafeRight: + walkBy(1); + break; + case kCommandDown: + walkBy(2); + break; + case kCommandUp: + walkBy(0); + break; + case kCommandNone: + return kResumeCurrentState; + } + needsToRedrawVisibleMeshes = 1; + cameraRotation = getPlayerDirection(); + pos = getPlayerPosition(); + + cameraX = pos->x; + cameraZ = pos->y; + + switch (cameraRotation) { + case 0: + newCell = map[cameraZ - 2][cameraX]; + break; + case 1: + newCell = map[cameraZ][cameraX + 2]; + break; + case 2: + newCell = map[cameraZ + 2][cameraX]; + break; + case 3: + newCell = map[cameraZ][cameraX - 2]; + break; + } + + newCell = newCell & 127; + + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, newCell); + + + if (prop->mBlockMovement) { + pos->x = cameraX = prevX; + pos->y = cameraZ = prevZ; + setPlayerPosition(pos); + } + + /* unlike MX, we are signaling from the origin into the new room. MX allows for the movement and then searches where + * did the player came from - hence the "opposite direction" there */ + + if (newCell > ('0' - 1) && newCell < ('3' + 1)) { + enteredFrom = newCell - '0'; + moveBy(enteredFrom); + } + + if (playerLocation != previousLocation) { + initMap(); + + if (newCell == NEUTRAL_CELL) { + newCell = '0'; +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION + } else { + roomTransitionAnimationStep = 30; +#endif + } + setPlayerDirection(cameraRotation = (newCell - '0')); + } else { + enteredFrom = 0xFF; + } + return kResumeCurrentState; +} + +void Crawler_repaintCallback(void) { + + if (firstFrameOnCurrentState) { + clearScreen(); + redrawMap = needsToRedrawHUD = 1; + HUD_initialPaint(); + } + + HUD_refresh(); + drawMap(); + + if (!needsToRedrawVisibleMeshes) { + return; + } +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION + if (roomTransitionAnimationStep) { + roomTransitionAnimationStep = 0; + for (uint16_t y = 32; y >= 2; --y) { + clearGraphics(); + + vLine(y, y, 95 + (32 - y), 1); + vLine(95 + (32 - y), y, 95 + (32 - y), 1); + + for (uint16_t x = y; x < (95 + (32 - y)); ++x) { + graphicsPut(x, y, 7); + graphicsPut(x, 95 + (32 - y), 7); + + //door opening + vLine(x, y, 95 - 3 * (32 - y), 7); + } + } + } else +#endif + { + renderScene(); + } +} + +void Crawler_initStateCallback(enum EGameMenuState tag) { + (void)tag; + + enteredFrom = 0; + cameraRotation = 0; + initStation(); + focusedItem = getPlayerItems(); + setErrorHandlerCallback(showMessage); + setLoggerDelegate(showMessage); + initMap(); + needsToRedrawVisibleMeshes = 1; +} + +void Crawler_unloadStateCallback(enum EGameMenuState newState) { + (void)newState; + needsToRedrawVisibleMeshes = 0; +} + diff --git a/mz_frontend/Engine3D/Engine3D.c b/mz_frontend/src/Engine3D/Engine3D.c similarity index 99% rename from mz_frontend/Engine3D/Engine3D.c rename to mz_frontend/src/Engine3D/Engine3D.c index 522cd051e..b813d4767 100644 --- a/mz_frontend/Engine3D/Engine3D.c +++ b/mz_frontend/src/Engine3D/Engine3D.c @@ -14,12 +14,10 @@ #endif #ifndef SMD - #include #include #include #include - #else #include int puts( const char* str ); @@ -1067,7 +1065,7 @@ void pickItem(void) { struct Item *itemToPick = getItem(roomItem->item); if (itemToPick != NULL) { - if (!strcmp(itemToPick->name, "digital-safe")) { + if (!strcmp(itemToPick->name, "computer-terminal")) { #ifdef SUPPORTS_HACKING_MINIGAME runHackingMinigame(); @@ -1470,7 +1468,7 @@ int main(int argc, char **argv) { initFileReader("base.pfs"); init(); - + Crawler_initStateCallback(0); diff --git a/mz_frontend/Engine3D/Engine3D.h b/mz_frontend/src/Engine3D/Engine3D.h similarity index 100% rename from mz_frontend/Engine3D/Engine3D.h rename to mz_frontend/src/Engine3D/Engine3D.h diff --git a/mz_frontend/Engine3D/HackingMinigame.c b/mz_frontend/src/Engine3D/HackingMinigame.c similarity index 98% rename from mz_frontend/Engine3D/HackingMinigame.c rename to mz_frontend/src/Engine3D/HackingMinigame.c index 1b853d7b4..b77db9bdc 100644 --- a/mz_frontend/Engine3D/HackingMinigame.c +++ b/mz_frontend/src/Engine3D/HackingMinigame.c @@ -33,7 +33,7 @@ uint8_t pinTop[3]; void HackingScreen_initStateCallback(void) { cursorPosition = 1; - memset(&pins[0][0], 0xFF, sizeof(pins)); + memFill(&pins[0][0], 0xFF, sizeof(pins)); pins[0][0] = 4; pins[0][1] = 2; diff --git a/mz_frontend/Engine3D/HackingMinigame.h b/mz_frontend/src/Engine3D/HackingMinigame.h similarity index 100% rename from mz_frontend/Engine3D/HackingMinigame.h rename to mz_frontend/src/Engine3D/HackingMinigame.h diff --git a/mz_frontend/Engine3D/basepfs.h b/mz_frontend/src/Engine3D/basepfs.h similarity index 100% rename from mz_frontend/Engine3D/basepfs.h rename to mz_frontend/src/Engine3D/basepfs.h diff --git a/mz_frontend/Engine3D/map.h b/mz_frontend/src/Engine3D/map.h similarity index 100% rename from mz_frontend/Engine3D/map.h rename to mz_frontend/src/Engine3D/map.h diff --git a/mz_frontend/src/Events.c b/mz_frontend/src/Events.c new file mode 100755 index 000000000..5f72d7306 --- /dev/null +++ b/mz_frontend/src/Events.c @@ -0,0 +1,210 @@ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include +#include + +#include "Common.h" +#include "FixP.h" +#include "Core.h" +#include "Enums.h" +#include "Renderer.h" +#include "Engine.h" +#include "PackedFileReader.h" +#include "CTile3DProperties.h" + +extern int8_t map[32][32]; + +extern int8_t stencilHigh[XRES]; + +struct ObjectNode *focusedItem = NULL; +struct ObjectNode *roomItem = NULL; + +extern uint8_t accessGrantedToSafe; + +extern struct MapWithCharKey tileProperties; +extern struct MapWithCharKey customMeshes; + + +int8_t cameraX = 33; +int8_t cameraZ = 22; +extern int8_t cameraRotation; + +uint8_t enteredFrom = 0xFF; + +extern uint8_t playerLocation; + +void pickItem(void) { + struct Room *room = getRoom(getPlayerRoom()); + + if (roomItem && roomItem->item) { + struct Item *itemToPick = getItem(roomItem->item); + if (itemToPick != NULL) { + + if (!strcmp(itemToPick->name, "computer-terminal")) { + +#ifdef SUPPORTS_HACKING_MINIGAME + enterState(kHackingGame); +#else + accessGrantedToSafe = TRUE; +#endif + return; + } + + if (itemToPick->pickable) { + + uint8_t pattern = map[itemToPick->position.y][itemToPick->position.x]; + map[itemToPick->position.y][itemToPick->position.x] = pattern & 127; + + pickObject(itemToPick); + focusedItem = roomItem; + roomItem = room->itemsPresent->next; + + } else { + useObjectNamed(itemToPick->name); + } + } + } +} + +void dropItem(void) { + + struct Item *item = NULL; + + if (focusedItem != NULL) { + item = getItem(focusedItem->item); + } + + if (item != NULL) { + uint8_t pattern; + struct WorldPosition *pos = getPlayerPosition(); + + dropObjectToRoom(getPlayerRoom(), item); + + focusedItem = getPlayerItems(); + + roomItem = &objectNodes[item->index]; + + switch (cameraRotation) { + case 0: + item->position.x = pos->x; + item->position.y = pos->y - 3; + break; + + case 1: + item->position.x = pos->x + 3; + item->position.y = pos->y; + break; + + case 2: + item->position.x = pos->x; + item->position.y = pos->y + 3; + break; + + case 3: + item->position.x = pos->x - 3; + item->position.y = pos->y; + break; + } + pattern = map[item->position.y][item->position.x]; + map[item->position.y][item->position.x] = pattern | 128; + } +} + +void nextItemInRoom(void) { + struct Room *room = getRoom(getPlayerRoom()); + + if (roomItem == NULL) { + return; + } + + roomItem = roomItem->next; + + if (!roomItem) { + roomItem = room->itemsPresent; + } + + if (roomItem->item == 0) { + roomItem = roomItem->next; + } +} + +void interactWithItemInRoom(void) { + if (roomItem && focusedItem) { + struct Item *itemToPick = getItem(roomItem->item); + struct Item *item = getItem(focusedItem->item); + if (itemToPick && item && item->useWithCallback) { + item->useWithCallback(item, itemToPick); + } + } +} + +void useItemInHand(void) { + useObjectNamed(getItem(focusedItem->item)->name); +} + +void nextItemInHand(void) { + focusedItem = focusedItem->next; + + if (!focusedItem) { + focusedItem = getPlayerItems(); + } +} + +void initMap(void) { + int x, y; + const uint8_t *head; + char buffer[32]; + uint16_t current; + + roomItem = getRoom(getPlayerRoom())->itemsPresent->next; + + sprintf(&buffer[0], "map%d.txt", getPlayerRoom()); + + struct StaticBuffer datafile = loadBinaryFileFromPath(&buffer[0]); + head = datafile.data; + + for (y = 0; y < 32; ++y) { + for (x = 0; x < 32; ++x) { + + current = *head; + + + if ((current == 's' && enteredFrom == 0) || + (current == 'w' && enteredFrom == 1) || + (current == 'n' && enteredFrom == 2) || + (current == 'e' && enteredFrom == 3)) { + + struct WorldPosition newPos; + cameraX = x; + cameraZ = y; + newPos.x = x; + newPos.y = y; + setPlayerPosition(&newPos); + enteredFrom = 0xFF; + current = '.'; + } + + map[y][x] = current; + ++head; + } + ++head; // line break + } + + disposeDiskBuffer(datafile); + + sprintf(&buffer[0], "props%d.bin", getPlayerRoom()); + loadPropertyList(&buffer[0], &tileProperties, &customMeshes); + + //updateMapItems(); + HUD_initialPaint(); +} diff --git a/mz_frontend/src/GameMenu.c b/mz_frontend/src/GameMenu.c new file mode 100644 index 000000000..d050bf62e --- /dev/null +++ b/mz_frontend/src/GameMenu.c @@ -0,0 +1,22 @@ +/* + Created by monty on 01-10-2023. +*/ + +#include "Enums.h" + +void GameMenu_initStateCallback(enum EGameMenuState tag) { + (void)tag; +} + +void GameMenu_repaintCallback(void) {} + +enum EGameMenuState GameMenu_tickCallback(enum ECommand cmd, void* data) { + (void)cmd; + (void)data; + /* This never gets executed, so not a problem for not having the return value */ +} + +void GameMenu_unloadStateCallback(enum EGameMenuState newState) { + (void)newState; +} + diff --git a/mz_frontend/src/GamepadUI.c b/mz_frontend/src/GamepadUI.c new file mode 100644 index 000000000..3afc9545c --- /dev/null +++ b/mz_frontend/src/GamepadUI.c @@ -0,0 +1,41 @@ +/* + Created by monty on 18-07-2023. +*/ +#include + +#include "Enums.h" +#include "Renderer.h" +#include "UI.h" +#include "GamepadUI.h" + +extern uint8_t firstFrameOnCurrentState; + +const char *menuItems[] = { + "Use/Toggle", + "Use with", + "Use/pick", + "Drop", + "Next(item)", + "Next(room)", +}; + +void initGamepadUI(void) { + cursorPosition = 0; +} + +enum ECommand performActionJoypad(void) { + return kCommandFire1 + cursorPosition; +} + +void HUD_initialPaint(void) { + + drawWindowWithOptions( + 1 + (XRES_FRAMEBUFFER / 2) / 8, + (YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6, + (XRES_FRAMEBUFFER / 8) - (1 + (XRES_FRAMEBUFFER / 2) / 8) - 1, + (YRES_FRAMEBUFFER / 8) - ((YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6 - 1) - 2, + "Actions", + menuItems, + 6, + cursorPosition); +} diff --git a/mz_frontend/src/HackingMinigame.c b/mz_frontend/src/HackingMinigame.c new file mode 100644 index 000000000..f9b5a939a --- /dev/null +++ b/mz_frontend/src/HackingMinigame.c @@ -0,0 +1,150 @@ +/* + Created by Daniel Monteiro on 2021-11-01. +*/ + +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include + +#include "Common.h" +#include "Enums.h" +#include "UI.h" +#include "Derelict.h" +#include "Renderer.h" +#include "HackingMinigame.h" +#include "HackingMinigameRules.h" +#include "Engine.h" + +#ifdef PAGE_FLIP_ANIMATION +int wasSmoothMovementPreviouslyEnabled; +#endif + +const char *functionNames[5] = { + "???", + "writeB", + "snprintf", + "hackLogin", + "LoadDBReg" +}; + +void HackingScreen_initStateCallback(enum EGameMenuState tag) { + (void)tag; + cursorPosition = 1; + needsToRedrawVisibleMeshes = 0; + + initHackingMinigame(); +} + +void HackingScreen_repaintCallback(void) { + uint8_t pin; + uint8_t holdingDisk; + + if (firstFrameOnCurrentState) { + clearScreen(); + needsToRedrawVisibleMeshes = 0; + drawTextAt(1, 1, "Stack trace:", getPaletteEntry(0xFF999999)); + drawTextAt((12 * 0), 11, " CPU0 ", getPaletteEntry(0xFF999999)); + drawTextAt((12 * 1), 11, " CPU1 ", getPaletteEntry(0xFF999999)); + drawTextAt((12 * 2), 11, " CPU2 ", getPaletteEntry(0xFF999999)); + } + + drawTextAt((12 * cursorPosition), 11, ">", getPaletteEntry(0xFF999999)); + drawTextAt((12 * cursorPosition) + 5, 11, "<", getPaletteEntry(0xFF999999)); + + drawLine(0, 80, XRES_FRAMEBUFFER - 1, 80, 2); + + for (pin = 0; pin < 3; ++pin) { + uint8_t disk; + + if (pin != 0) { + uint8_t pinX = (10 * (pin) ) * 8; + drawLine(pinX, 40, pinX, 80, 2); + } + + for (disk = 0; disk < 5; ++disk) { + + uint8_t diskIndex = getPositionForPin(pin, disk); + + const char *funcName = (disk >= getDisksForPin(pin)) ? NULL + : functionNames[diskIndex]; + + if (funcName) { + drawTextAt( + 10 * (pin) + (pin == 0 ? 0 : 1), 4 + (4 - disk), + funcName, getPaletteEntry(0xFF999999)); + } + } + } + + drawTextAt(1, 2, "Pointer:", getPaletteEntry(0xFF999999)); + + holdingDisk = getHoldingDisk(); + + if (holdingDisk != 0xFF) { + drawTextAt(19, 2, functionNames[holdingDisk], getPaletteEntry(0xFF999999)); + } else { + drawTextAt(19, 2, "NULL", getPaletteEntry(0xFF999999)); + } +} + +void HackingScreen_unloadStateCallback(enum EGameMenuState newState) { + (void)newState; +#ifdef PAGE_FLIP_ANIMATION + enableSmoothMovement = wasSmoothMovementPreviouslyEnabled; +#endif +} + +enum EGameMenuState HackingScreen_tickCallback(enum ECommand cmd, void* data) { + (void)data; + uint8_t holdingDisk = getHoldingDisk(); + + if (isHackingMinigameCompleted()) { + grantAccessToSafe(); + } + + switch (cmd) { + case kCommandLeft: + if (cursorPosition > 0) { + cursorPosition--; + firstFrameOnCurrentState = 1; + } +#ifdef PAGE_FLIP_ANIMATION + turnTarget = turnStep; +#endif + break; + case kCommandRight: + if (cursorPosition < 2) { + cursorPosition++; + firstFrameOnCurrentState = 1; + } +#ifdef PAGE_FLIP_ANIMATION + turnTarget = turnStep; +#endif + break; + case kCommandBack: + case kCommandDown: + return kBackToGame; + case kCommandFire1: + if (holdingDisk == 0xFF) { + pickDisk(cursorPosition); + } else { + dropDisk(cursorPosition); + } + firstFrameOnCurrentState = 1; + break; + + default: + break; + } + + return kResumeCurrentState; +} diff --git a/mz_frontend/src/KeyboardUI.c b/mz_frontend/src/KeyboardUI.c new file mode 100644 index 000000000..45164383a --- /dev/null +++ b/mz_frontend/src/KeyboardUI.c @@ -0,0 +1,46 @@ +/* + Created by Daniel Monteiro on 11/07/2023. +*/ +#include +#include + +#include "Common.h" +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" + +extern struct ObjectNode *focusedItem; + +extern struct ObjectNode *roomItem; + +extern uint8_t firstFrameOnCurrentState; + +const char *menuItems[] = { + "1) Use", + "2) Use with", + "3) Pick", + "4) Drop", + "5) Next(hand)", + "6) Next(room)", +}; + +void initKeyboardUI(void) { +} + + +void HUD_initialPaint(void) { + + drawWindowWithOptions( + 1 + (XRES_FRAMEBUFFER / 2) / 8, + (YRES_FRAMEBUFFER / 8) - 3 - 5, + (XRES_FRAMEBUFFER / 8) - (1 + (XRES_FRAMEBUFFER / 2) / 8) - 1, + (YRES_FRAMEBUFFER / 8) - ((YRES_FRAMEBUFFER / 8) - 3 - /*kMainMenuOptionsCount*/ 6 - 1) - 2, + "Actions", + menuItems, + 6, + 0xFF); +} + diff --git a/mz_frontend/src/MSDOSVersion/msdos.c b/mz_frontend/src/MSDOSVersion/msdos.c new file mode 100644 index 000000000..118d5121f --- /dev/null +++ b/mz_frontend/src/MSDOSVersion/msdos.c @@ -0,0 +1,360 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" +#include "font.h" + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; + +uint8_t *framebuffer; +uint8_t bufferInput = '.'; +extern uint8_t firstFrameOnCurrentState; + +unsigned char imageBuffer[XRES_FRAMEBUFFER * YRES_FRAMEBUFFER]; + +void shutdownGraphics(void) { +} + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { + + if (x0 < 0) { + return; + } + + int16_t y; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + if (_y0 < 0) { + _y0 = 0; + } + + if (_y1 >= 128) { + _y1 = 127; + } + + for (y = _y0; y <= _y1; ++y) { + imageBuffer[(256 * y) + x0] = colour; + } +} + + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { + if (y < 0) { + return; + } + + int16_t _x0 = x0; + int16_t _x1 = x1; + + if (x0 > x1) { + _x0 = x1; + _x1 = x0; + } + + if (_x0 < 0) { + _x0 = 0; + } + + if (_x1 >= 128) { + _x1 = 127; + } + + for (int x = _x0; x <= _x1; ++x) { + imageBuffer[(256 * y) + x] = colour; + } +} + +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + if (x < 0) { + x = 0; + } + + if (x >= 128) { + x = 127; + } + + if (y < 0) { + y = 0; + } + + if (y >= 128) { + y = 127; + } + + imageBuffer[(256 * y) + x] = colour; +} + +void realPut(int x, int y, uint8_t value) { + if (x < 0) { + x = 0; + } + + if (x >= 256) { + x = 255; + } + + if (y < 0) { + y = 0; + } + + if (y >= 160) { + y = 159; + } + + imageBuffer[(256 * y) + x] = value; + +} + +void clearGraphics(void) { + memFill(imageBuffer, 0, 256 * 160); +} + +void initHW(int argc, char** argv) { + clearScreen(); +} + +void clearScreen(void) { + asm volatile("movb $0x0, %%ah\n\t" + "movb $0x0D, %%al\n\t" + "int $0x10\n\t" + : + : + : "ax" + ); +} + +void handleSystemEvents(void) { + unsigned char toReturn = 255; + + + asm volatile ("movb $0x00, %%ah\n\t" + "movb $0x00, %%al\n\t" + "int $0x16 \n\t" + "movb %%al, %0\n\t" + : "=rm"(toReturn) + : + : "ax" + ); + + asm volatile("movb $0x0C, %%ah\n\t" + "movb $0x00, %%al\n\t" + "int $0x21\n\t" + : + : + : "ax" + ); + + bufferInput = toReturn; +} + +enum ECommand getInput(void) { + + switch(bufferInput) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } +} + +void startFrame(int x, int y, int width, int height) { + +} + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + + +void endFrame(void) { + + uint8_t *bufferPtr = &imageBuffer[0]; + + for (int y = 0; y < 160; ++y) { + for (int x = 0; x < 256; ++x) { + uint16_t index = *bufferPtr; + + int pixel = index; + int px = x; + int py = y; + + asm volatile ("movb $0x0C, %%ah\n\t" + "movb %0, %%al\n\t" + "movb $0x0, %%bh\n\t" + "movw %1, %%cx\n\t" + "movw %2, %%dx\n\t" + "int $0x10\n\t" + : + :"rm" (pixel), "rm" (px), "rm" (py) + : "ax", "bx", "cx", "dx" + ); + bufferPtr++; + } + } +} diff --git a/mz_frontend/src/Main.c b/mz_frontend/src/Main.c new file mode 100644 index 000000000..47ea47823 --- /dev/null +++ b/mz_frontend/src/Main.c @@ -0,0 +1,65 @@ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#ifdef ATARIST +#include +#include +#include +#include +#include +#include +#endif + +#include "Common.h" +#include "Enums.h" +#include "Renderer.h" +#include "Engine.h" +#include "Core.h" +#include "UI.h" +#include "PackedFileReader.h" + +int8_t cameraRotation = 0; + +#ifdef ATARIST +int doMain(void); + +int main(int argc, char **argv) { + Supexec(&doMain); + return 0; +} + +int doMain(void) { + int argc = 0; + char **argv = NULL; +#else +int main(int argc, char **argv) { +#endif + initFileReader("base.pfs"); + initHW(argc, argv); + + + enterState(kMainMenu); + +#ifdef EMIT_QUIT_OPTION + while (isRunning) { +#else + while (1) { +#endif + startFrame(0, 0, XRES_FRAMEBUFFER, YRES_FRAMEBUFFER); + menuTick(10); + endFrame(); + } + +#ifdef EMIT_QUIT_OPTION + unloadStateCallback(1); + return 0; +#endif +} diff --git a/mz_frontend/MegaDriveVersion/megadrive.c b/mz_frontend/src/MegaDriveVersion/megadrive.c similarity index 58% rename from mz_frontend/MegaDriveVersion/megadrive.c rename to mz_frontend/src/MegaDriveVersion/megadrive.c index be9c3d89e..91d92aeab 100644 --- a/mz_frontend/MegaDriveVersion/megadrive.c +++ b/mz_frontend/src/MegaDriveVersion/megadrive.c @@ -3,41 +3,16 @@ #include "Enums.h" #include "Core.h" #include "Derelict.h" -#include "Engine3D.h" -#include "Engine.h" - -void graphicsFlush(void); - -void nextItemInHand(void); - -void useItemInHand(void); - -void nextItemInRoom(void); - -void interactWithItemInRoom(void); - -void pickOrDrop(void); - -void dropItem(void); - -void pickItem(void); - -void clearGraphics(void); - -void renderScene(void); - -void enterTextMode(void); - -void exitTextMode(void); - - -extern int8_t map[32][32]; +#include "Renderer.h" +#include "UI.h" +#include "GamepadUI.h" +#include "font.h" extern struct ObjectNode *focusedItem; - extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; -extern uint8_t accessGrantedToSafe; +extern uint8_t firstFrameOnCurrentState; #define COOLDOWN_MAX 0x2EF @@ -45,24 +20,7 @@ int16_t buffered = '.'; uint16_t cooldown; uint16_t movementCooldown = 0; - -void refreshJustGraphics(void) { - renderScene(); - graphicsFlush(); -} - -void backToGraphics(void) { - clearScreen(); - HUD_initialPaint(); - refreshJustGraphics(); -} - -void performAction(void) { - -} - - -static void handleInput(void) { +void handleSystemEvents(void) { u16 value; buffered = '.'; @@ -74,7 +32,7 @@ static void handleInput(void) { movementCooldown--; } - // need to call it manually as we don't use SYS_doVBlankProcess() here + /* need to call it manually as we don't use SYS_doVBlankProcess() here */ JOY_update(); value = JOY_readJoypad(JOY_1); @@ -107,81 +65,49 @@ static void handleInput(void) { buffered = 'k'; } + if ((value & BUTTON_A) && !cooldown) { + cooldown = COOLDOWN_MAX; + buffered = '1'; + } + if ((value & BUTTON_B) && !cooldown) { - performAction(); - HUD_refresh(); cooldown = COOLDOWN_MAX; - buffered = 'p'; + buffered = '2'; } if ((value & BUTTON_C) && !cooldown) { - cursorPosition = (cursorPosition + 1); - - if (cursorPosition >= 6) { - cursorPosition = 0; - } - - HUD_refresh(); cooldown = COOLDOWN_MAX; - buffered = 'p'; + buffered = '3'; } } } -void shutdownGraphics(void) { +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + BMP_setPixelFast(x, y, colour); } +void realPut(int x, int y, uint8_t colour) { + BMP_setPixelFast(x, y, colour); +} -void writeStrWithLimit(int16_t _x, int16_t y, char *str, int16_t limitX) { - - char textBuffer[2]; - char *charPtr = &textBuffer[0]; - - int16_t len = strlen(str); - int16_t x = _x; - textBuffer[1] = 0; - - for (int16_t c = 0; c < len && y < 19; ++c) { - - char cha = *str; - - if (x == limitX) { - ++y; - x = _x; - } else if (cha == '\n') { - ++y; - x = _x; - ++str; - continue; +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); } - - *charPtr = ' '; - VDP_drawText(charPtr, x, y); - *charPtr = cha; - VDP_drawText(charPtr, x, y); - ++x; - ++str; } } -void writeStr(int16_t _x, int16_t y, const char *text, uint16_t fg, uint16_t bg) { - writeStrWithLimit(_x, y, text, 31); -} - -void graphicsPut(int16_t x, int16_t y, uint16_t colour) { - BMP_setPixelFast(x, 16 + y, colour); -} - void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { - if (y0 > y1) { int16_t tmp = y0; y0 = y1; y1 = tmp; } - colour += (colour << 4); //double the pixel + colour += (colour << 4); /* double the pixel */ for (int16_t y = y0; y < y1; ++y) { BMP_setPixelFast(x0, 16 + y, colour); } @@ -209,7 +135,7 @@ void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { _x1 = 127; } - colour += (colour << 4); //double the pixel + colour += (colour << 4); /* double the pixel */ for (int16_t x = _x0; x <= _x1; ++x) { BMP_setPixelFast(x, 16 + y, colour); @@ -220,40 +146,15 @@ static void joyEvent(u16 joy, u16 changed, u16 state) { } -void showMessage(const char *message) { - enterTextMode(); - int16_t keepGoing = 1; - - for (int16_t i = 0; i < 19; ++i) { - VDP_clearText(16, i, 16); - } - - writeStrWithLimit(1, 5, message, 31); - writeStrWithLimit(6, 17, "Press Start to continue", 31); - - while (keepGoing) { - if (getKey() == 'k') { - keepGoing = 0; - } - } - - clearScreen(); - - for (int16_t i = 0; i < 19; ++i) { - VDP_clearText(16, i, 16); - } - - exitTextMode(); - backToGraphics(); +void clearGraphics(void) { + BMP_clear(); } void clearScreen(void) { -} - -void clearGraphics(void) { BMP_clear(); } + void clearTextScreen(void) { for (int16_t c = 0; c < 23; ++c) { VDP_clearText(0, c, 256 / 8); @@ -262,40 +163,7 @@ void clearTextScreen(void) { movementCooldown = COOLDOWN_MAX; } -void enterTextMode(void) { - clearGraphics(); - BMP_flip(1); - clearTextScreen(); -} - -void exitTextMode(void) { - clearTextScreen(); -} - -void drawWindow(int tx, int ty, int tw, int th, const char *title) {} - -uint8_t getKey(void) { - handleInput(); - return buffered; -} - -void sleepForMS(uint32_t ms) { - //we cant afford to sleep -} - -void titleScreen(void) { - -} - -void puts(char *unused) { - -} - -void assert(int unused) { - -} - -void init(void) { +void initHW(int argc, char** argv) { JOY_setEventHandler(joyEvent); VDP_setScreenWidth256(); VDP_setHInterrupt(0); @@ -322,15 +190,119 @@ void init(void) { PAL_setColor(13, RGB24_TO_VDPCOLOR(0xFF55FF)); PAL_setColor(14, RGB24_TO_VDPCOLOR(0xFFFF55)); PAL_setColor(15, RGB24_TO_VDPCOLOR(0xFFFFFF)); + + firstFrameOnCurrentState = 1; + + initGamepadUI(); } -void graphicsFlush(void) { +void endFrame(void) { BMP_flip(1); } -void HUD_initialPaint(void) { +enum ECommand getInput(void) { + + switch(buffered) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + } + + return kCommandNone; +} + + +void startFrame(int x, int y, int width, int height) { + +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } } -void HUD_refresh(void) { +void drawTextAtWithMarginWithFiltering(const int _x, const int _y, int limitX, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + char textBuffer[2]; + char *charPtr = &textBuffer[0]; + + int16_t len = strlen(text); + int16_t x = _x; + int16_t y = _y; + textBuffer[1] = 0; + char* str= text; + + for (int16_t c = 0; c < len && y < 19; ++c) { + + char cha = *str; + + if (x == limitX) { + ++y; + x = _x; + } else if (cha == '\n') { + ++y; + x = _x; + ++str; + continue; + } + *charPtr = ' '; + VDP_drawText(charPtr, x, y); + *charPtr = cha; + VDP_drawText(charPtr, x, y); + ++x; + ++str; + } } diff --git a/mz_frontend/src/RendererRasterizer.c b/mz_frontend/src/RendererRasterizer.c new file mode 100755 index 000000000..62be469d5 --- /dev/null +++ b/mz_frontend/src/RendererRasterizer.c @@ -0,0 +1,726 @@ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "FixP.h" +#include "CTile3DProperties.h" + +#ifdef MSDOS +#include "Common.h" +#endif + +extern int16_t cameraHeight; + +struct Projection { + uint8_t px; + uint8_t py; + int8_t dx; +}; + +const struct Projection projections[32] = + { + {0, 128, -128}, // 1 + {0, 127, -64}, // 2 + {20, 105, -42}, // 3 + {31, 95, -32}, // 4 + {37, 88, -25}, // 5 + {41, 84, -21}, // 6 + {44, 81, -18}, // 7 + {47, 79, -16}, // 8 + {48, 77, -14}, // 9 + {50, 75, -12}, // 10 + {51, 74, -11}, // 11 + {52, 73, -10}, // 12 + {53, 72, -9}, // 13 + {53, 72, -9}, // 14 + {54, 71, -8}, // 15 + {55, 71, -8}, // 16 + {55, 70, -7}, // 17 + {55, 70, -7}, // 18 + {56, 69, -6}, // 19 + {56, 69, -6}, // 20 + {56, 69, -6}, // 21 + {57, 68, -5}, // 22 + {57, 68, -5}, // 23 + {57, 68, -5}, // 24 + {57, 68, -5}, // 25 + {58, 67, -4}, // 26 + {58, 67, -4}, // 27 + {58, 67, -4}, // 28 + {58, 67, -4}, // 29 + {58, 67, -4}, // 30 + {58, 67, -4}, // 31 + }; + +#ifdef USE_OWN_MIN_MAX +int8_t max(int8_t x1, int8_t x2); + +int8_t min(int8_t x1, int8_t x2); +#endif + +void +drawWedge(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ, uint16_t elementMask, uint16_t type) { + + int16_t z1; + + int16_t z0px; + int16_t z1px; + int16_t z0py; + int16_t z1py; + int16_t z0dx; + int16_t z1dx; + + int16_t px0z0; + int16_t py0z0; + int16_t py0z1; + int16_t py1z0; + int16_t py1z1; + int16_t px1z1; + + uint16_t shouldStippleFill = (z0 >= STIPPLE_DISTANCE) ? 6 : (6 + STIPPLE_COLOUR_THRESHOLD); + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + + if (z0 >= 32) { + return; + } + + z1 = z0 + dZ; + + if (z0 <= 2) { + return; + } + + if (z1 <= 2) { + return; + } + + if (z1 >= 32) { + return; + } + + + if (type == kRightNearWall) { + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + px0z0 = z0px - (x0 * z0dx); + px1z1 = z1px - ((dX + x0) * z1dx); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + + py1z0 = z0py + ((y0 + dY) * z0dx); + py1z1 = z1py + ((y0 + dY) * z1dx); + + } else { + z0px = (projections[z1].px); + z1px = (projections[z0].px); + z0dx = ((projections[z1].dx)); + z1dx = ((projections[z0].dx)); + + px0z0 = z0px - ((x0) * z0dx); + px1z1 = z1px - ((x0 + dX) * z1dx); //extra operations to avoid overflow + + z1py = (projections[z0].py); + z0py = (projections[z1].py); + + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + + py1z0 = z0py + ((y0 + dY) * z0dx); + py1z1 = z1py + ((y0 + dY) * z1dx); + } + + + int16_t lineX0, lineX1; + + if (py1z0 < 0) { + py1z0 = 0; + } + + if (py0z0 < 0) { + py0z0 = 0; + } + + if (py1z0 >= YRES) { + py1z0 = YRESMINUSONE; + } + + if (py0z0 >= YRES) { + py0z0 = YRESMINUSONE; + } + + + if (py1z1 < 0) { + py1z1 = 0; + } + + if (py0z1 < 0) { + py0z1 = 0; + } + + if (py1z1 >= YRES) { + py1z1 = YRESMINUSONE; + } + + if (py0z1 >= YRES) { + py0z1 = YRESMINUSONE; + } + + /* The upper segment */ + lineX0 = px0z0; + lineX1 = px1z1; + + if (lineX0 != lineX1) { + int16_t upperY0 = py1z0; + int16_t upperY1 = py1z1; + int16_t upperDx = abs(lineX1 - lineX0); + int16_t upperDy = -abs(upperY1 - upperY0); + int16_t upperSy = upperY0 < upperY1 ? 1 : -1; + int16_t upperErr = upperDx + upperDy; /* error value e_xy */ + int16_t upperErr2; + int16_t lowerY0 = py0z0; + int16_t lowerY1 = py0z1; + int16_t lowerDx = abs(lineX1 - lineX0); + int16_t lowerSx = lineX0 < lineX1 ? 1 : -1; + int16_t lowerDy = -abs(lowerY1 - lowerY0); + int16_t lowerSy = lowerY0 < lowerY1 ? 1 : -1; + int16_t lowerErr = lowerDx + lowerDy; /* error value e_xy */ + int16_t lowerErr2 = 0; + + while (lineX0 != lineX1) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + vLine(lineX0, upperY0, lowerY0, shouldStippleFill); + graphicsPut(lineX0, upperY0, shouldStippleBorder); + } + + /* loop */ + upperErr2 = upperErr * 2; + + if (upperErr2 >= upperDy || lowerErr2 >= lowerDy) { + upperErr += upperDy; /* e_xy+e_x > 0 */ + lowerErr += lowerDy; /* e_xy+e_x > 0 */ + lineX0 += lowerSx; + } + + if (lineX0 >= XRES) { + return; + } + + if (upperErr2 <= upperDx) { + /* e_xy+e_y < 0 */ + upperErr += upperDx; + upperY0 += upperSy; + } + + /* loop */ + lowerErr2 = lowerErr * 2; + + if (lowerErr2 <= lowerDx) { + /* e_xy+e_y < 0 */ + lowerErr += lowerDx; + lowerY0 += lowerSy; + } + } + } + + + if (elementMask & 2) { + if (IN_RANGE(0, XRESMINUSONE, px0z0)) { + vLine(px0z0, py0z0, py1z0, shouldStippleBorder); + } + } + + if (elementMask & 1) { + if (IN_RANGE(0, XRESMINUSONE, px1z1)) { + vLine(px1z1, py0z1, py1z1, shouldStippleBorder); + } + } +} + +void drawSquare(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, uint16_t elementMask) { + + int16_t z0px; + int16_t z0py; + int16_t z0dx; + + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t py1z0; + + int16_t x; + + uint16_t drawContour; + + if (z0 >= 32) { + return; + } + + z0px = (projections[z0].px); + z0dx = ((projections[z0].dx)); + + px0z0 = z0px - ((x0) * z0dx); + px1z0 = px0z0 - (dX * z0dx); + + z0py = (projections[z0].py); + + py0z0 = z0py + ((y0) * z0dx); + py1z0 = py0z0 + (dY * z0dx); + + if (px1z0 < 0 || px0z0 > XRESMINUSONE) { + return; + } + + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + uint16_t shouldStippleFill = (z0 >= STIPPLE_DISTANCE) ? 4: (4 + STIPPLE_COLOUR_THRESHOLD); + + drawContour = (dY); + + /* Draw the horizontal outlines of z0 and z1 */ + /* Ceiling is lower than camera */ + if (drawContour) { + if (elementMask & 2) { + if ((elementMask != 255) && IN_RANGE(0, XRESMINUSONE, px0z0)) { + vLine(px0z0, py0z0, py1z0, shouldStippleBorder); + } + + if ((elementMask != 127) && IN_RANGE(0, XRESMINUSONE, px1z0)) { + vLine(px1z0, py0z0, py1z0, shouldStippleBorder); + } + } + + for (x = px0z0; x < px1z0; ++x) { + if ( x < 0 ) { + continue; + } + + if (x >= XRES ) { + return; + } + + vLine(x, py0z0, py1z0, shouldStippleFill); + } + } +} + +void drawObjectAt(int16_t x0, int16_t z0) { + + int16_t z1; + uint16_t z0px; + uint16_t z0py; + uint16_t z1px; + uint16_t z1py; + int16_t z0dx; + int16_t z1dx; + + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t px0z1; + int16_t py0z1; + int16_t px1z1; + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + + if (z0 >= 32 || z0 <= 4) { + return; + } + + z1 = z0 + 1; + + if (z1 >= 32) { + return; + } + + + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + px0z0 = z0px - ((x0) * z0dx); + px0z1 = z1px - ((x0) * z1dx); + + px1z0 = px0z0 - (1 * z0dx); + px1z1 = px0z1 - (1 * z1dx); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + py0z0 = z0py + ((-cameraHeight) * z0dx); + py0z1 = z1py + ((-cameraHeight) * z1dx); + + + int16_t lineX0, lineX1; + + /* Draw the horizontal outlines of z0 and z1 */ + for (lineX0 = px0z0; lineX0 <= px1z0; ++lineX0) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, py0z0, shouldStippleBorder); + } + } + + for (lineX0 = px0z1; lineX0 <= px1z1; ++lineX0) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, py0z1, shouldStippleBorder); + } + } + + /* The left segment */ + lineX0 = px0z0; + lineX1 = px0z1; + + if (lineX0 != lineX1) { + int16_t y0 = py0z0; + int16_t y1 = py0z1; + int16_t dx = abs(lineX1 - lineX0); + int16_t sx = lineX0 < lineX1 ? 1 : -1; + int16_t dy = -abs(y1 - y0); + int16_t sy = y0 < y1 ? 1 : -1; + int16_t err = dx + dy; /* error value e_xy */ + int16_t e2; + + while ((lineX0 != lineX1 || y0 != y1)) { + + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, y0, shouldStippleBorder); + } + + /* loop */ + e2 = err << 2; + + if (e2 >= dy) { + err += dy; /* e_xy+e_x > 0 */ + lineX0 += sx; + } + + if (lineX0 >= XRES) { + goto right_stroke; + } + + if (e2 <= dx) { + /* e_xy+e_y < 0 */ + err += dx; + y0 += sy; + } + } + } + + right_stroke: + + lineX0 = px1z0; + lineX1 = px1z1; + + if (lineX0 != lineX1) { + int16_t y0 = py0z0; + int16_t y1 = py0z1; + int16_t dx = abs(lineX1 - lineX0); + int16_t sx = lineX0 < lineX1 ? 1 : -1; + int16_t dy = -abs(y1 - y0); + int16_t sy = y0 < y1 ? 1 : -1; + int16_t err = dx + dy; /* error value e_xy */ + int16_t e2; + + while ((lineX0 != lineX1 || y0 != y1)) { + + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + graphicsPut(lineX0, y0, shouldStippleBorder); + } + + e2 = err << 2; + + if (e2 >= dy) { + err += dy; /* e_xy+e_x > 0 */ + lineX0 += sx; + } + + if (lineX0 >= XRES) { + return; + } + + if (e2 <= dx) { + /* e_xy+e_y < 0 */ + err += dx; + y0 += sy; + } + } + } +} + + + +void drawCubeAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dY, int16_t dZ) { + + int16_t y1 = y0 + dY; + int16_t z1; + + int16_t z0px; + int16_t z0py; + int16_t z1px; + int16_t z1py; + int16_t z0dx; + int16_t z1dx; + int16_t py1z0; + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t px0z1; + int16_t py0z1; + int16_t px1z1; + + uint16_t shouldStippleFill = (z0 >= STIPPLE_DISTANCE) ? 7 : (7 + STIPPLE_COLOUR_THRESHOLD); + uint16_t shouldStippleBorder = (z0 >= STIPPLE_DISTANCE) ? 0 : (0 + STIPPLE_COLOUR_THRESHOLD); + + uint16_t drawContour; + + if (z0 >= 32 || z0 <= 4) { + return; + } + + z1 = z0 + dZ; + + if (z1 >= 32) { + return; + } + + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + px0z0 = z0px - ((x0) * z0dx); + px0z1 = z1px - ((x0) * z1dx); + px1z0 = px0z0 - (dX * z0dx); + px1z1 = px0z1 - (dX * z1dx); + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + py1z0 = z0py + ((y1) * z0dx); + drawContour = (dY); + + + int16_t x, lineX0, lineX1; + + lineX0 = px0z0; + lineX1 = px0z1; + + if (lineX0 != lineX1) { + int16_t lineY0 = py0z0; + int16_t lineY1 = py0z1; + int16_t lineDx = abs(lineX1 - lineX0); + int16_t lineSx = lineX0 < lineX1 ? 1 : -1; + int16_t lineDy = -abs(lineY1 - lineY0); + int16_t lineSy = lineY0 < lineY1 ? 1 : -1; + int16_t lineErr = lineDx + lineDy; + int16_t lineE2; + + while ((lineX0 != lineX1 || lineY0 != lineY1)) { + + if (drawContour) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + vLine(lineX0, lineY0, py1z0, shouldStippleFill); + graphicsPut(lineX0, lineY0, shouldStippleBorder); + } + } + + lineE2 = lineErr << 2; + + if (lineE2 >= lineDy) { + lineErr += lineDy; + lineX0 += lineSx; + } + + if (lineX0 >= XRES) { + goto right_stroke; + } + + if (lineE2 <= lineDx) { + lineErr += lineDx; + lineY0 += lineSy; + } + } + } + + right_stroke: + + lineX0 = px1z0; + lineX1 = px1z1; + + if (lineX0 != lineX1) { + int16_t lineY0 = py0z0; + int16_t lineY1 = py0z1; + int16_t lineDx = abs(lineX1 - lineX0); + int16_t lineSx = lineX0 < lineX1 ? 1 : -1; + int16_t lineDy = -abs(lineY1 - lineY0); + int16_t lineSy = lineY0 < lineY1 ? 1 : -1; + int16_t lineErr = lineDx + lineDy; + int16_t lineE2; + + while ((lineX0 != lineX1 || lineY0 != lineY1)) { + + if (drawContour) { + if (IN_RANGE(0, XRESMINUSONE, lineX0)) { + vLine(lineX0, lineY0, py1z0, shouldStippleFill); + graphicsPut(lineX0, lineY0, shouldStippleBorder); + } + } + + lineE2 = lineErr << 2; + + if (lineE2 >= lineDy) { + lineErr += lineDy; + lineX0 += lineSx; + } + + if (lineX0 >= XRES) { + goto final_stroke; + } + + if (lineE2 <= lineDx) { + + lineErr += lineDx; + lineY0 += lineSy; + } + } + } + + final_stroke: + + if (drawContour) { + for (x = px0z0; x <= px1z0; ++x) { + if (IN_RANGE(0, XRESMINUSONE, x)) { + vLine(x, py0z0, py1z0, shouldStippleFill); + graphicsPut(x, py0z0, shouldStippleBorder); + } + } + } + + if (IN_RANGE(0, XRESMINUSONE, px0z0)) { + vLine(px0z0, py0z0, py1z0, shouldStippleBorder); + } + + if (IN_RANGE(0, XRESMINUSONE, px1z0)) { + vLine(px1z0, py0z0, py1z0, shouldStippleBorder); + } +} + + + +void drawFloorAt(int16_t x0, int16_t y0, int16_t z0, int16_t dX, int16_t dZ) { + + int16_t z1; + + int16_t z0px; + int16_t z0py; + int16_t z1px; + int16_t z1py; + int16_t z0dx; + int16_t z1dx; + int16_t px0z0; + int16_t py0z0; + int16_t px1z0; + int16_t px0z1; + int16_t py0z1; + int16_t px1z1; + + uint16_t shouldStipple = (z0 >= STIPPLE_DISTANCE) ? 2 : (2 + STIPPLE_COLOUR_THRESHOLD); + + if (z0 >= 32 || z0 < 1) { + return; + } + + z1 = z0 + dZ; + + if (z1 >= 32) { + return; + } + + z0px = (projections[z0].px); + z1px = (projections[z1].px); + z0dx = ((projections[z0].dx)); + z1dx = ((projections[z1].dx)); + + z1py = (projections[z1].py); + z0py = (projections[z0].py); + + px0z0 = z0px - ((x0) * z0dx); + px0z1 = z1px - ((x0) * z1dx); + px1z0 = px0z0 - (dX * z0dx); + px1z1 = px0z1 - (dX * z1dx); + py0z0 = z0py + ((y0) * z0dx); + py0z1 = z1py + ((y0) * z1dx); + + + int16_t leftX0, leftX1, rightX0, rightX1; + + leftX0 = px0z0; + leftX1 = px0z1; + rightX0 = px1z0; + rightX1 = px1z1; + int16_t dy = -abs(py0z1 - py0z0); + int16_t sy = py0z0 < py0z1 ? 1 : -1; + + int16_t currentY0 = py0z0; + int16_t leftDx = abs(leftX1 - leftX0); + int16_t leftSx = leftX0 < leftX1 ? 1 : -1; + int16_t leftErr = leftDx + dy; + int16_t leftE2; + + int16_t rightDx = abs(rightX1 - rightX0); + int16_t rightSx = rightX0 < rightX1 ? 1 : -1; + int16_t rightErr = rightDx + dy; + int16_t rightE2; + + while (currentY0 != py0z1) { + if (leftX0 >= XRES) { + return; + } + + if (rightX1 < 0) { + return; + } + + if (IN_RANGE(0, XRESMINUSONE, leftX0) || IN_RANGE(0, XRESMINUSONE, rightX0)) { + hLine(leftX0, rightX0, currentY0, shouldStipple); + } + + leftE2 = leftErr << 2; + + if (leftE2 >= dy) { + leftErr += dy; + leftX0 += leftSx; + } + + rightE2 = rightErr << 2; + + if (rightE2 >= dy) { + rightErr += dy; + rightX0 += rightSx; + } + + if (rightE2 <= rightDx || leftE2 <= leftDx) { + rightErr += rightDx; + leftErr += leftDx; + currentY0 += sy; + } + } +} + diff --git a/mz_frontend/src/RendererScene.c b/mz_frontend/src/RendererScene.c new file mode 100755 index 000000000..403c8b6d0 --- /dev/null +++ b/mz_frontend/src/RendererScene.c @@ -0,0 +1,153 @@ +#ifndef SMD +#include +#include +#include +#include +#else +#include +typedef unsigned long size_t; +#endif + +#include "Common.h" +#include "Renderer.h" +#include "map.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" +#include "PackedFileReader.h" + +extern int8_t cameraX; +extern int8_t cameraZ; +extern int8_t cameraRotation; +extern int16_t cameraHeight; +extern struct MapWithCharKey tileProperties; +extern struct MapWithCharKey customMeshes; + +extern uint8_t playerLocation; + +#ifdef USE_OWN_MIN_MAX +int8_t max(int8_t x1, int8_t x2) { + return x1 > x2 ? x1 : x2; +} + +int8_t min(int8_t x1, int8_t x2) { + return x1 < x2 ? x1 : x2; +} +#endif + +void renderScene(void) { + + uint16_t pattern = map[cameraZ][cameraX]; + + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, pattern); + + cameraHeight = fixToInt(prop->mFloorHeight) + 1; + + + switch (cameraRotation) { + case DIRECTION_N: + renderCameraNorth(); + break; + + case DIRECTION_E: + renderCameraEast(); + break; + + case DIRECTION_S: + renderCameraSouth(); + break; + + case DIRECTION_W: + default: + renderCameraWest(); + break; + } + return; + repaintMapItems(); +} + +void renderCameraWest(void) { + int16_t x; + int16_t y; + + for (x = 0; x < cameraX; ++x) { + + int16_t minZ = max(cameraZ - ((cameraX) - x) - 2, 0); + int16_t maxZ = min(cameraZ + ((cameraX) - x) + 1, 31); + + for (y = minZ; y < cameraZ; ++y) { + drawPattern(map[y][x], -(y - cameraZ) + 1, -(y - cameraZ) + 2, cameraX - x); + } + + for (y = maxZ; y >= cameraZ; --y) { + drawPattern(map[y][x], -(y - cameraZ) + 1, -(y - cameraZ) + 2, cameraX - x); + } + } +} + +void +renderCameraSouth(void) { + int16_t y; + int16_t x; + + for (y = 31; y > cameraZ; --y) { + + int16_t maxX = min(cameraX + (y - cameraZ) + 1, 31); + int16_t minX = max(cameraX - (y - cameraZ) - 3, 0); + + for (x = minX; x < cameraX - 1; ++x) { + drawPattern(map[y][x], cameraX - x, cameraX - x + 1, y - cameraZ); + } + + + for (x = maxX - 1; x >= cameraX - 1; --x) { + drawPattern(map[y][x], cameraX - x, cameraX - x + 1, y - cameraZ); + } + + } +} + +void renderCameraEast(void) { + int16_t x; + + int16_t y; + + + for (x = 31; x > cameraX; --x) { + + int16_t maxZ = min(cameraZ + (x - cameraX) + 2, 31); + int16_t minZ = max(cameraZ - (x - cameraX) - 2, 0); + + for (y = minZ; y < cameraZ; ++y) { + drawPattern(map[y][x], (y - cameraZ) + 2, (y - cameraZ) + 3, x - cameraX); + } + + for (y = maxZ - 1; y >= cameraZ; --y) { + drawPattern(map[y][x], (y - cameraZ) + 2, (y - cameraZ) + 3, x - cameraX); + } + } +} + +void loadMesh(struct Mesh *mesh, char *filename) { + /* Dummy, just to satisfy the linker */ +} + +void renderCameraNorth(void) { + + int16_t y; + int16_t x; + + for (y = 0; y < cameraZ; ++y) { + int16_t maxX = min(cameraX + ((cameraZ) - y + 3), 31); + int16_t minX = max(cameraX - ((cameraZ) - y), 0); + + for (x = maxX; x > cameraX - 1; --x) { + drawPattern(map[y][x], x - cameraX, x - cameraX + 1, cameraZ - y); + } + + for (x = minX; x <= cameraX + 1; ++x) { + drawPattern(map[y][x], x - cameraX, x - cameraX + 1, cameraZ - y); + } + } +} diff --git a/mz_frontend/src/RendererTesselation.c b/mz_frontend/src/RendererTesselation.c new file mode 100755 index 000000000..1cace95fb --- /dev/null +++ b/mz_frontend/src/RendererTesselation.c @@ -0,0 +1,207 @@ +#include +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include "Common.h" +#include "Core.h" +#include "Renderer.h" +#include "map.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" +#include "PackedFileReader.h" + +#include "map.h" + +extern int8_t cameraX; +extern int8_t cameraZ; +extern int8_t cameraRotation; +extern uint8_t playerLocation; +struct MapWithCharKey tileProperties; +struct MapWithCharKey customMeshes; +int16_t cameraHeight = 1; + +void drawPattern(uint16_t _pattern, int16_t x0, int16_t x1, int16_t z) { + int16_t diff; + uint16_t pattern = (_pattern) & 127; + uint16_t type; + + /* 127 = 01111111 - the first bit is used for indicating the presence of an object. + * And since there are only 127 patterns anyway... + * */ + if (_pattern & 128) { + drawObjectAt(x0 - 1, z + 2); + } + + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, pattern); + + int ceilingHeight = fixToInt(prop->mCeilingHeight); + int floorHeight = fixToInt(prop->mFloorHeight); + + + diff = ceilingHeight - floorHeight; + + type = prop->mGeometryType; + + if (prop->mCeilingRepeatedTextureIndex != 0xFF && prop->mCeilingRepetitions > 0) { + drawCubeAt(x0 - 1, ceilingHeight - cameraHeight, z + 2, x1 - x0, + prop->mCeilingRepetitions, 1); + } + + if (prop->mFloorRepeatedTextureIndex != 0xFF && prop->mFloorRepetitions > 0) { + drawCubeAt(x0 - 1, floorHeight - prop->mFloorRepetitions - cameraHeight, z + 2, x1 - x0, + prop->mFloorRepetitions, 1); + } + + + if (prop->mCeilingTextureIndex != 0xFF) { + drawFloorAt(x0 - 1, ceilingHeight - cameraHeight, z + 2, x1 - x0, 1); + } + + if (prop->mFloorTextureIndex != 0xFF) { + drawFloorAt(x0 - 1, floorHeight - cameraHeight, z + 2, x1 - x0, 1); + } + + + if (type == kCube) { + drawCubeAt(x0 - 1, floorHeight - cameraHeight, z + 2, x1 - x0, + diff, 1); + } else if (type == kRightNearWall || type == kLeftNearWall) { + + if (cameraRotation == 0 || cameraRotation == 2) { + + if (type == kRightNearWall) { + type = kLeftNearWall; + } else { + type = kRightNearWall; + } + } + + drawWedge(x0 - 1, floorHeight - cameraHeight, z + 2, x1 - x0, + diff, 1, 0xFF, type); + + } else if (type == kWallWest) { + + switch (cameraRotation) { + case 0: + case 2: + drawWedge(x0 - (cameraRotation == 0 ? 1 : 0), floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + break; + case 1: + case 3: + default: + drawSquare(x0 - 1, floorHeight - cameraHeight, + z + (cameraRotation == 3 ? 1 : 0) + 2, + x1 - x0, diff, 0xFF); + } + } else if (type == kWallNorth) { + + + switch (cameraRotation) { + case 0: + case 2: + drawSquare(x0 - 1, floorHeight - cameraHeight, + z + (cameraRotation == 0 ? 1 : 0) + 2, + x1 - x0, diff, 0xFF); + break; + case 1: + case 3: + default: + drawWedge(x0 - (cameraRotation == 1 ? 1 : 0), + floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + break; + } + } else if (type == kWallCorner) { + + switch (cameraRotation) { + + case 3: + case 0: + drawWedge(x0 - (cameraRotation == 3 ? 0 : 1), + floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + + drawSquare(x0 - 1, floorHeight - cameraHeight, z + 1 + 2, + x1 - x0, diff, 0xFF); + break; + + case 1: + case 2: + default: + drawSquare(x0 - 1, floorHeight - cameraHeight, z + 2, + x1 - x0, diff, 0xFF); + + drawWedge(x0 - (cameraRotation == 1 ? 1 : 0), floorHeight - cameraHeight, z + 2, + 0, diff, 1, 0xFF, kLeftNearWall); + + break; + } + } +} + +void repaintMapItems(void) { + struct ObjectNode *node; + + /* ignore header node */ + node = getRoom(playerLocation)->itemsPresent->next; + + switch (cameraRotation) { + case 0: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt(item->position.x - cameraX + 2 - 1, cameraZ - item->position.y + 2); + node = node->next; + } + break; + + case 1: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt((item->position.y - cameraZ) + 1, (item->position.x - cameraX) + 2); + node = node->next; + } + break; + + case 2: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt(-(item->position.x - cameraX) + 1, (item->position.y - cameraZ) + 2); + node = node->next; + } + break; + + case 3: + default: + while (node != NULL) { + struct Item *item = getItem(node->item); + drawObjectAt(-(item->position.y - cameraZ) + 1, (cameraX - item->position.x) + 2); + node = node->next; + } + break; + } +} + +void updateMapItems(void) { + struct ObjectNode *node; + + /* ignore header node */ + node = getRoom(playerLocation)->itemsPresent->next; + + while (node != NULL) { + struct Item *item = getItem(node->item); + uint16_t pattern = map[item->position.y][item->position.x]; + map[item->position.y][item->position.x] = pattern; + node = node->next; + } +} diff --git a/mz_frontend/src/SDLVersion/sdl2.c b/mz_frontend/src/SDLVersion/sdl2.c new file mode 100644 index 000000000..0d08ae739 --- /dev/null +++ b/mz_frontend/src/SDLVersion/sdl2.c @@ -0,0 +1,587 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "Common.h" +#include "Enums.h" +#include "Core.h" +#include "Derelict.h" +#include "Renderer.h" +#include "UI.h" +#include "KeyboardUI.h" + +#include "SDL.h" +#include "font.h" + +extern struct ObjectNode *focusedItem; +extern struct ObjectNode *roomItem; +extern int accessGrantedToSafe; +SDL_Window *window; +SDL_Renderer *renderer; + +#define TRANSPARENCY_COLOR 17 + +uint8_t mBufferedCommand; +uint32_t palette[16]; +uint8_t framebuffer[256 * 160]; + +extern uint8_t firstFrameOnCurrentState; +extern enum EGameMenuState currentGameMenuState; + +#ifdef SUPPORTS_ROOM_TRANSITION_ANIMATION +extern uint8_t roomTransitionAnimationStep; +#endif + +extern enum EDirection playerDirection; +extern int8_t cameraX; +extern int8_t cameraZ; + +char playerPositionSprite[4][8]={ + { + 0b00011000, + 0b00111100, + 0b01111110, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00100000, + 0b01100000, + 0b11100000, + 0b11100000, + 0b01100000, + 0b00100000, + 0b00000000, + 0b00000000 + }, + { + 0b01111110, + 0b00111100, + 0b00011000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }, + { + 0b00000100, + 0b00000110, + 0b00000111, + 0b00000111, + 0b00000110, + 0b00000100, + 0b00000000, + 0b00000000 + }, +}; + +void graphicsPut(int16_t x, int16_t y, uint16_t colour) { + if (x < 0) { + x = 0; + } + + if (x >= 128) { + x = 127; + } + + if (y < 0) { + y = 0; + } + + if (y >= 128) { + y = 127; + } + + assert( !(colour < 0 || colour >= 16)); + framebuffer[(256 * y) + x] = colour; +#ifdef PUTAFLIP + graphicsFlush(); + SDL_Delay(100); +#endif +} + +void hLine(int16_t x0, int16_t x1, int16_t y, uint16_t colour) { + if (y < 0) { + return; + } + + int16_t _x0 = x0; + int16_t _x1 = x1; + + if (x0 > x1) { + _x0 = x1; + _x1 = x0; + } + + if (_x0 < 0) { + _x0 = 0; + } + + if (_x1 >= 128) { + _x1 = 127; + } + + for (int x = _x0; x <= _x1; ++x) { + framebuffer[(256 * y) + x] = colour; + } +} + +void vLine(int16_t x0, int16_t y0, int16_t y1, uint16_t colour) { + + if (x0 < 0 || x0 > XRESMINUSONE) { + return; + } + + int16_t y; + int16_t _y0 = y0; + int16_t _y1 = y1; + + if (y0 > y1) { + _y0 = y1; + _y1 = y0; + } + + if (_y0 < 0) { + _y0 = 0; + } + + if (_y1 >= 128) { + _y1 = 127; + } + + for (y = _y0; y <= _y1; ++y) { + framebuffer[(256 * y) + x0] = colour; + } +} + +void shutdownGraphics(void) { + SDL_Quit(); +} + +void realPut(int x, int y, uint8_t value) { + if (x < 0) { + x = 0; + } + + if (x >= 256) { + x = 255; + } + + if (y < 0) { + y = 0; + } + + if (y >= 160) { + y = 159; + } + assert( !(value < 0 || value >= 16)); + framebuffer[(256 * y) + x] = value; +} + +void clearGraphics(void) { + memFill(framebuffer, 0, 256 * 160); +} + +void clearScreen(void) {} + +void put_sprite_8(uint16_t x, uint8_t y, uint8_t *sprite, uint8_t colour) { + + for(uint8_t c = 0; c < 8; ++c) { + uint8_t line = *sprite; + for (uint16_t d = 0; d < 8; ++d) { + if (line & 1) { + realPut( x + d, y + c, colour); + } + line = line >> 1; + } + ++sprite; + } +} + +void handleSystemEvents(void) { + SDL_Event event; + + mBufferedCommand = '.'; + + while (SDL_PollEvent(&event)) { + + if (event.type == SDL_QUIT) { + + mBufferedCommand = 'q'; + } + + if (event.type == SDL_KEYUP) { + + switch (event.key.keysym.sym) { + case SDLK_RETURN: + case SDLK_z: + mBufferedCommand = 'a'; + break; + + case SDLK_ESCAPE: + case SDLK_q: + SDL_Quit(); + exit(0); + break; + + case SDLK_SPACE: + break; + + case SDLK_KP_7: + case SDLK_7: + mBufferedCommand = '7'; + break; + + case SDLK_KP_8: + case SDLK_8: + mBufferedCommand = '8'; + break; + + + case SDLK_KP_9: + case SDLK_9: + mBufferedCommand = '9'; + break; + + + case SDLK_s: + break; + case SDLK_d: + break; + case SDLK_v: + break; + case SDLK_b: + break; + case SDLK_j: + break; + case SDLK_k: + break; + case SDLK_x: + mBufferedCommand = 'd'; + break; + case SDLK_c: + break; + case SDLK_e: + break; + + case SDLK_1: + mBufferedCommand = '1'; + break; + + case SDLK_2: + mBufferedCommand = '2'; + break; + + case SDLK_3: + mBufferedCommand = '3'; + break; + + case SDLK_4: + mBufferedCommand = '4'; + break; + + case SDLK_5: + mBufferedCommand = '5'; + break; + + case SDLK_6: + mBufferedCommand = '6'; + break; + + + case SDLK_LEFT: + mBufferedCommand = 'q'; + break; + case SDLK_RIGHT: + mBufferedCommand = 'e'; + break; + case SDLK_UP: + mBufferedCommand = 'w'; + break; + case SDLK_DOWN: + mBufferedCommand = 's'; + break; + default: + mBufferedCommand = '.'; + } + } + } +} + +enum ECommand getInput(void) { + + if (currentGameMenuState == kPlayGame) { + put_sprite_8( + (XRES_FRAMEBUFFER / 2) + ((cameraX + 6) * 3) - 1, + (cameraZ * 3) + 10, + &playerPositionSprite[playerDirection][0], + 0 + ); + } + + switch(mBufferedCommand) { + case 'q': + return kCommandLeft; + case 'w': + return kCommandUp; + case 's': + return kCommandDown; + case 'e': + return kCommandRight; + case 'a': + return kCommandStrafeLeft; + case 'd': + return kCommandStrafeRight; + case 'l': + return kCommandBack; + + case '1': + if (waitForKey) { + waitForKey = 0; + firstFrameOnCurrentState = 1; + needsToRedrawVisibleMeshes = 1; + return kCommandNone; + } + + return kCommandFire1; + case '2': + return kCommandFire2; + case '3': + return kCommandFire3; + case '4': + return kCommandFire4; + case '5': + return kCommandFire5; + case '6': + return kCommandFire6; + case 'k': + exit(0); + } + + return kCommandNone; +} + +void initHW(int argc, char **argv) { + renderer = NULL; + int r, g, b; + mBufferedCommand = '.'; + SDL_Init(SDL_INIT_EVERYTHING); + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); + memFill(framebuffer, 0, 256 * 160); + window = + SDL_CreateWindow("Derelict 16-bits SDL2 test", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, 512, 320, SDL_WINDOW_SHOWN); + + renderer = SDL_CreateRenderer(window, -1, 0); + + palette[0] = 0x000000; + palette[1] = 0x0000AA; + palette[2] = 0x00AA00; + palette[3] = 0x00AAAA; + palette[4] = 0xAA0000; + palette[5] = 0xAA00AA; + palette[6] = 0xAA5500; + palette[7] = 0xAAAAAA; + palette[8] = 0x555555; + palette[9] = 0x5555FF; + palette[10] = 0x55FF55; + palette[11] = 0x55FFFF; + palette[12] = 0xFF5555; + palette[13] = 0xFF55FF; + palette[14] = 0xFFFF55; + palette[15] = 0xFFFFFF; + +#ifdef __EMSCRIPTEN__ + enterFullScreenMode (); +#endif + + initKeyboardUI(); + clearGraphics(); +} + + +void flipRenderer(void) { + SDL_Rect rect; + uint32_t pixel; + int x, y; + + rect.x = 0; + rect.y = 0; + rect.w = 512; + rect.h = 320; + + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderFillRect(renderer, &rect); + + for (y = 0; y < 160; ++y) { + for (x = 0; x < 255; ++x) { + rect.x = 2 * x; + rect.y = 2 * y; + rect.w = 2; + rect.h = 2; + int index = framebuffer[(256 * y) + x]; + assert( !(index < 0 || index >= 16)); + + pixel = palette[index]; + + int r = (pixel & 0x00FF0000) >> 16; + int g = ((pixel & 0x0000FF00) >> 8); + int b = ((pixel & 0x000000FF)); + + SDL_SetRenderDrawColor(renderer, r, + g, + b, 255); + SDL_RenderFillRect(renderer, &rect); + } + } + + SDL_RenderPresent(renderer); + +#ifndef __EMSCRIPTEN__ + SDL_Delay(1000 / 60); +#endif +} + +void drawTextAtWithMarginWithFiltering(const int x, const int y, int margin, const char *text, const uint8_t fg, + char charToReplaceHifenWith) { + + size_t len = strlen(text); + int32_t dstX = x * 8; + int32_t dstY = y * 8; + + size_t c; + size_t d; + uint8_t lastSpacePos = 0xFF; + + for (c = 0; c < len; ++c) { + + char currentChar = text[c]; + + if (currentChar == '-') { + currentChar = charToReplaceHifenWith; + } + + if (currentChar == '\n' || dstX >= (margin)) { + dstX = x * 8; + dstY += 8; + continue; + } + + if (dstY >= YRES_FRAMEBUFFER) { + return; + } + + if (currentChar == ' ') { + lastSpacePos = c; + } else { + if ((c - 1) == lastSpacePos) { + d = c; + while (d < len && text[d] != ' ') ++d; + + if ((dstX + ((d - c ) * 8)) >= margin ) { + dstX = x * 8; + dstY += 8; + } + } + } + + + if (currentChar >= 'a') { + if (currentChar <= 'z') { + currentChar = (currentChar - 'a') + 'A'; + } else { + currentChar -= ('z' - 'a'); + } + } + + uint8_t *fontTop = &font[((currentChar - 32) << 3)]; + + for (int f = 0; f < 8; ++f) { + int e; + uint8_t chunk = *fontTop; + + for (e = 0; e < 8; ++e) { + if (chunk & 1) { + realPut(dstX + (7 - e), dstY + (f), 1); + } else { + realPut(dstX + (7 - e), dstY + (f), 0); + } + chunk = chunk >> 1; + } + + fontTop++; + } + dstX += 8; + } +} + +void startFrame(int x, int y, int width, int height) { + +} + +void endFrame(void) { + if (currentGameMenuState == kPlayGame) { + put_sprite_8( + (XRES_FRAMEBUFFER / 2) + ((cameraX + 6) * 3) - 1, + (cameraZ * 3) + 10, + &playerPositionSprite[playerDirection][0], + 1 + ); + } + flipRenderer(); +} + + +void clearTextScreen(void) { + int c, d; + for (c = 16; c < 24; ++c) { + for (d = 0; d < 32; ++d) { + drawTextAtWithMarginWithFiltering(d, c, 256, " ", 2, ' '); + } + } +} + +void fillRect(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour, uint8_t stipple) { + int x, y; + for (y = y0; y < y1; ++y) { + for (x = x0; x < x1; ++x) { + realPut(x, y, colour); + } + } +} + +void drawLine(uint16_t x0, uint8_t y0, uint16_t x1, uint8_t y1, uint8_t colour) { + int dx = abs(x1 - x0); + int sx = x0 < x1 ? 1 : -1; + int dy = abs(y1 - y0); + int sy = y0 < y1 ? 1 : -1; + int err = (dx > dy ? dx : -dy) >> 1; + int e2; + for (;;) { + + if (x0 == x1 && y0 == y1) break; + + realPut(x0, y0, colour); + + e2 = err; + if (e2 > -dx) { + err -= dy; + x0 += sx; + } + if (e2 < dy) { + err += dx; + y0 += sy; + } + } +} + diff --git a/mz_frontend/src/UI.c b/mz_frontend/src/UI.c new file mode 100644 index 000000000..06e6cdfee --- /dev/null +++ b/mz_frontend/src/UI.c @@ -0,0 +1,244 @@ +/* + Created by Daniel Monteiro on 11/07/2023. +*/ +#ifdef WIN32 +#include "Win32Int.h" +#else +#ifndef SMD +#include +#include +#else +#include +typedef unsigned long size_t; +#endif +#endif + +#include "Enums.h" +#include "UI.h" +#include "Core.h" +#include "Renderer.h" +#include "Engine.h" +#include "SoundSystem.h" +#include "Common.h" +#include "MapWithCharKey.h" +#include "FixP.h" +#include "CTile3DProperties.h" + +extern uint8_t playerLocation; + +extern int8_t cursorPosition; + +extern int8_t map[32][32]; + +uint8_t waitForKey = 0; + +uint8_t redrawMap; + +uint8_t needsToRedrawHUD; + +extern struct MapWithCharKey tileProperties; + +void drawGraphic(int x, int y, int dx, int dy, const uint8_t *graphic) { + const uint8_t *ptr = graphic; + + while (*ptr) { + uint8_t c; + const uint8_t npoints = *ptr++; +#ifndef MONOCHROME_VECTORS + ptr += 3; /* skip colours */ +#endif + const uint8_t *shape = ptr; + + for (c = 0; c < npoints - 1; ++c) { + drawLine(x + ((dx * shape[2 * c]) / 128), + y + ((dy * shape[(2 * c) + 1]) / 128), + x + ((dx * shape[(2 * c) + 2]) / 128), + y + ((dy * shape[(2 * c) + 3]) / 128), + 2); + } + drawLine(x + ((dx * shape[2 * npoints - 2]) / 128), + y + ((dy * shape[2 * npoints - 1]) / 128), + x + ((dx * shape[0]) / 128), + y + ((dy * shape[1]) / 128), + 2); + ptr += 2 * npoints; + } +} + +void drawTextAt(uint8_t _x, uint8_t y, const char *text, uint8_t colour) { + drawTextAtWithMargin(_x, y, (XRES_FRAMEBUFFER), text, colour); +} + +void drawTextAtWithMargin(const int x, const int y, int margin, const char *text, const uint8_t colour) { + drawTextAtWithMarginWithFiltering(x, y, margin, text, colour, '-'); +} + +void showMessage(const char *message) { + clearTextScreen(); + drawTextWindow(1, 16, (XRES_FRAMEBUFFER / 8) - 3, (YRES_FRAMEBUFFER / 8) - 18, "", message); + waitForKey = 1; +} + +uint8_t isPositionAllowed(int8_t x, int8_t y) { + uint8_t pattern = map[y][x]; + struct CTile3DProperties *prop = + (struct CTile3DProperties *) getFromMap(&tileProperties, pattern); + + return prop->mBlockMovement; +} + + +void drawMap(void) { + uint8_t x, y; + + if (!redrawMap) { + return; + } + + if (playerLocation == 0) { + return; + } + + redrawMap = 0; + + drawWindow((XRES_FRAMEBUFFER / 8) / 2, + 0, + (XRES_FRAMEBUFFER / 8) / 2 - 1, + (YRES_FRAMEBUFFER / 8) / 2 + 1, + ""); + + for (y = 0; y < 32; ++y) { + for (x = 0; x < 32; ++x) { + + if (isPositionAllowed(x, y)) { + fillRect((XRES_FRAMEBUFFER / 2) + (x * 3), + (y * 3), + (XRES_FRAMEBUFFER / 2) + (x * 3) + 3, + (y * 3) + 3, + 2, + 0); + } + } + } +} + +void performAction(void) { + switch (getGameStatus()) { + case kBadVictory: + showMessage("Victory! Too bad you didn't survive"); + while (1); + + case kBadGameOver: + showMessage("You're dead! And so are the\n" + "other people on the path of\n" + "destruction faulty reactor"); + while (1); + + case kGoodVictory: + showMessage("Victory! You managed to destroy the\nship and get out alive"); + while (1); + + case kGoodGameOver: + showMessage("You failed! While you're alive\n" + "you failed to prevent the worst\n" + "scenario and now EVERYBODY is\n" + "dead!)"); + while (1); + } +} + +void drawWindow(uint8_t tx, uint8_t ty, uint8_t tw, uint8_t th, const char *title) { + uint16_t x0 = tx * 8; + uint16_t x1 = (tx + tw) * 8; + uint8_t y0 = ty * 8; + uint8_t y1 = (ty + th) * 8; + uint8_t c, d; + + for (c = 0; c < th; ++c) { + for (d = 0; d < tw; ++d) { + drawTextAtWithMarginWithFiltering( tx + d, ty + c, XRES_FRAMEBUFFER, " ", 2, ' '); + } + } + + drawLine(x0, y0, x1, y0, 2); + + drawLine(x0, y1, x1, y1, 2); + + drawLine(x0, y0, x0, y1, 2); + + drawLine(x1, y0, x1, y1, 2); + + drawTextAt(tx + 1, ty, title, 1); +} + + +void +drawWindowWithOptions(const uint8_t x, + const uint8_t y, + const uint8_t dx, + const uint8_t dy, + const char *title, + const char **options, + const uint8_t optionsCount, + const uint8_t selectedOption) { + uint8_t c; + + if (firstFrameOnCurrentState || selectedOption == 0xFF) { + drawWindow(x - 1, + y - 1, + dx + 1, + dy + 1, + title); + } + + for (c = 0; c < optionsCount; ++c) { + drawTextAt(x, + y + 1 + c, + (selectedOption == c) ? ">" : " ", + 1); + + if (firstFrameOnCurrentState || selectedOption == 0xFF) { + drawTextAt(x + 1, + y + 1 + c, + &options[c][0], + 1); + } + } +} + +void +drawTextWindow(const uint8_t x, const uint8_t y, const uint8_t dx, const uint8_t dy, const char *title, + const char *content) { + drawWindow(x, y, dx, dy, title); + drawTextAtWithMargin(x + 1, y + 2, (x + dx - 1) * 8, content, 1); +} + +enum EGameMenuState handleCursor(const enum EGameMenuState* options, uint8_t optionsCount, const enum ECommand cmd, enum EGameMenuState backState) { + + switch (cmd) { + case kCommandBack: + return backState; + case kCommandUp: + playSound(2); + --cursorPosition; + break; + case kCommandDown: + playSound(2); + ++cursorPosition; + break; + case kCommandFire1: + case kCommandFire2: + case kCommandFire3: + return options[cursorPosition]; + } + + if (cursorPosition >= optionsCount) { + cursorPosition = optionsCount - 1; + } + + if (cursorPosition < 0) { + cursorPosition = 0; + } + + return kResumeCurrentState; +} diff --git a/tools/svg-triangulator/newtitle.svg b/tools/svg-triangulator/newtitle.svg index 24374f656..e0b6b2370 100644 --- a/tools/svg-triangulator/newtitle.svg +++ b/tools/svg-triangulator/newtitle.svg @@ -26,16 +26,16 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2.375346" - inkscape:cx="23.575513" - inkscape:cy="62.306712" + inkscape:zoom="4.0346656" + inkscape:cx="75.347013" + inkscape:cy="57.625594" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" - inkscape:window-width="1312" - inkscape:window-height="449" - inkscape:window-x="75" - inkscape:window-y="25" + inkscape:window-width="1440" + inkscape:window-height="872" + inkscape:window-x="0" + inkscape:window-y="28" inkscape:window-maximized="0" showguides="true" inkscape:guide-bbox="true" @@ -114,183 +114,126 @@ inkscape:groupmode="layer" id="layer1"> - - - - - + sodipodi:nodetypes="cccccc" /> - + sodipodi:nodetypes="cccccc" /> + sodipodi:nodetypes="cccc" /> - - - - - + + + - + id="path3031" + d="M 1.34075 9.69841 L 1.44119 21.1627 L 43.3161 17.2753 Z" + style="opacity:1;fill:#918a6f;stroke:none;stroke-width:0.117774;stroke-opacity:1" /> - + + sodipodi:nodetypes="ccccccc" /> + sodipodi:nodetypes="ccccc" /> + d="M 62.8037 95.7691 L 58.7016 67.3665 L 53.4743 84.92 Z" + style="opacity:1;fill:#808000;stroke:none;stroke-width:0.485158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + d="M 53.5138 84.9797 L 58.7259 67.3832 L 53.4918 59.2398 Z" + style="opacity:1;fill:#969600;fill-opacity:1;stroke:none;stroke-width:0.485158;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - + + + + +