diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 4f10cedac..223ef83cb 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -14,10 +14,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Make Executable - working-directory: ${{github.workspace}}/tools - run: sudo chmod +x makefsdata - - name: Use Node.js uses: actions/setup-node@v3 with: diff --git a/README.md b/README.md index 4bc38a979..af2d97773 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Full documentation can be found at ## Features * Select from 5 input modes: XInput, Nintendo Switch, PS4, PS3 and Keyboard -* Overclocked polling rate for less than 1 ms of input latency in all modes. +* Overclocked polling rate for an average of 0.77ms of input latency in Xinput, Switch and Dinput modes and on average 1.72 for Playstation 4/5. * Multiple SOCD cleaning modes - Up Priority (a.k.a. Stickless), Neutral, and Second Input Priority. * Left and Right stick emulation via D-pad inputs as well as dedicated toggle switches. * Dual direction via D-pad + LS/RS. diff --git a/configs/Liatris/assets/Liatris.png b/configs/Liatris/assets/Liatris.png index 8e6062396..ac1e36ee0 100644 Binary files a/configs/Liatris/assets/Liatris.png and b/configs/Liatris/assets/Liatris.png differ diff --git a/configs/OpenCore0/assets/Open_Core0_WASD.jpg b/configs/OpenCore0/assets/Open_Core0_WASD.jpg index 39e6583f2..1d43cde78 100644 Binary files a/configs/OpenCore0/assets/Open_Core0_WASD.jpg and b/configs/OpenCore0/assets/Open_Core0_WASD.jpg differ diff --git a/configs/OpenCore0/assets/Open_Core0_WASD_pinout.png b/configs/OpenCore0/assets/Open_Core0_WASD_pinout.png index 5ef895f5a..b6c2732e2 100644 Binary files a/configs/OpenCore0/assets/Open_Core0_WASD_pinout.png and b/configs/OpenCore0/assets/Open_Core0_WASD_pinout.png differ diff --git a/configs/OpenCore0WASD/assets/Open_Core0_WASD.jpg b/configs/OpenCore0WASD/assets/Open_Core0_WASD.jpg index 39e6583f2..1d43cde78 100644 Binary files a/configs/OpenCore0WASD/assets/Open_Core0_WASD.jpg and b/configs/OpenCore0WASD/assets/Open_Core0_WASD.jpg differ diff --git a/configs/OpenCore0WASD/assets/Open_Core0_WASD_pinout.png b/configs/OpenCore0WASD/assets/Open_Core0_WASD_pinout.png index 5ef895f5a..205e4bb5b 100644 Binary files a/configs/OpenCore0WASD/assets/Open_Core0_WASD_pinout.png and b/configs/OpenCore0WASD/assets/Open_Core0_WASD_pinout.png differ diff --git a/configs/RP2040AdvancedBreakoutBoardUSBPassthrough/assets/RP2040 Advanced Breakout Board - Passthrough.jpg b/configs/RP2040AdvancedBreakoutBoardUSBPassthrough/assets/RP2040 Advanced Breakout Board - Passthrough.jpg index fc669b874..a85f7f6e8 100644 Binary files a/configs/RP2040AdvancedBreakoutBoardUSBPassthrough/assets/RP2040 Advanced Breakout Board - Passthrough.jpg and b/configs/RP2040AdvancedBreakoutBoardUSBPassthrough/assets/RP2040 Advanced Breakout Board - Passthrough.jpg differ diff --git a/configs/RanaTadpole/assets/RanaTadpole_buttons.png b/configs/RanaTadpole/assets/RanaTadpole_buttons.png index e251624ba..eded53fae 100644 Binary files a/configs/RanaTadpole/assets/RanaTadpole_buttons.png and b/configs/RanaTadpole/assets/RanaTadpole_buttons.png differ diff --git a/configs/ReflexEncodeV2.0/assets/ReflexBoard_V2.png b/configs/ReflexEncodeV2.0/assets/ReflexBoard_V2.png index 2de7e98bd..e6c0a0f8a 100644 Binary files a/configs/ReflexEncodeV2.0/assets/ReflexBoard_V2.png and b/configs/ReflexEncodeV2.0/assets/ReflexBoard_V2.png differ diff --git a/headers/addons/inputhistory.h b/headers/addons/inputhistory.h index 13f4d2a33..d4944eaff 100644 --- a/headers/addons/inputhistory.h +++ b/headers/addons/inputhistory.h @@ -25,6 +25,34 @@ #define INPUT_HISTORY_ROW 7 #endif +#define INPUT_HISTORY_MAX_INPUTS 22 + +#define CHAR_TRIANGLE "\x80" +#define CHAR_CIRCLE "\x81" +#define CHAR_CROSS "\x82" +#define CHAR_SQUARE "\x83" + +#define CHAR_UP "\x84" +#define CHAR_DOWN "\x85" +#define CHAR_LEFT "\x86" +#define CHAR_RIGHT "\x87" + +#define CHAR_UL "\x88" +#define CHAR_UR "\x89" +#define CHAR_DL "\x8A" +#define CHAR_DR "\x8B" + +#define CHAR_HOME_S "\x8C" +#define CHAR_CAP_S "\x8D" + +#define CHAR_VIEW_X "\x8E" +#define CHAR_MENU_X "\x8F" +#define CHAR_HOME_X "\x90" + +#define CHAR_TPAD_P "\x91" +#define CHAR_HOME_P "\x92" +#define CHAR_SHARE_P "\x93" + #define InputHistoryName "InputHistory" class InputHistoryAddon : public GPAddon @@ -42,13 +70,18 @@ class InputHistoryAddon : public GPAddon uint32_t row; std::string historyString; std::deque inputHistory; - std::array lastInput; + std::array lastInput; Gamepad* gamepad; Gamepad* pGamepad; bool pressedUp(); bool pressedDown(); bool pressedLeft(); bool pressedRight(); + + bool pressedUpLeft(); + bool pressedUpRight(); + bool pressedDownLeft(); + bool pressedDownRight(); }; #endif diff --git a/headers/gp2040.h b/headers/gp2040.h index 907a8452b..53d43967a 100644 --- a/headers/gp2040.h +++ b/headers/gp2040.h @@ -6,6 +6,8 @@ #ifndef GP2040_H_ #define GP2040_H_ +#include + // GP2040 Classes #include "gamepad.h" #include "addonmanager.h" @@ -48,6 +50,9 @@ class GP2040 { SET_INPUT_MODE_PS4 }; BootAction getBootAction(); + + // input mask, action + std::map bootActions; }; #endif diff --git a/lib/OneBitDisplay/fonts.h b/lib/OneBitDisplay/fonts.h new file mode 100644 index 000000000..427a40fa6 --- /dev/null +++ b/lib/OneBitDisplay/fonts.h @@ -0,0 +1,584 @@ +const uint8_t ucMirror[256] = + {0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, + 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, + 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, + 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, + 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, + 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, + 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, + 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, + 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, + 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, + 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, + 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, + 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, + 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, + 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, + 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255}; + +const uint8_t ucFont[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x5f, 0x5f, 0x06, 0x00, + 0x00, 0x07, 0x07, 0x00, 0x07, 0x07, 0x00, 0x14, 0x7f, 0x7f, 0x14, 0x7f, 0x7f, 0x14, + 0x24, 0x2e, 0x2a, 0x6b, 0x6b, 0x3a, 0x12, 0x46, 0x66, 0x30, 0x18, 0x0c, 0x66, 0x62, + 0x30, 0x7a, 0x4f, 0x5d, 0x37, 0x7a, 0x48, 0x00, 0x04, 0x07, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x3e, 0x63, 0x41, 0x00, 0x00, 0x00, 0x41, 0x63, 0x3e, 0x1c, 0x00, 0x00, + 0x08, 0x2a, 0x3e, 0x1c, 0x3e, 0x2a, 0x08, 0x00, 0x08, 0x08, 0x3e, 0x3e, 0x08, 0x08, + 0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x01, + 0x3e, 0x7f, 0x59, 0x4d, 0x47, 0x7f, 0x3e, 0x40, 0x42, 0x7f, 0x7f, 0x40, 0x40, 0x00, + 0x62, 0x73, 0x59, 0x49, 0x6f, 0x66, 0x00, 0x22, 0x63, 0x49, 0x49, 0x7f, 0x36, 0x00, + 0x18, 0x1c, 0x16, 0x53, 0x7f, 0x7f, 0x50, 0x27, 0x67, 0x45, 0x45, 0x7d, 0x39, 0x00, + 0x3c, 0x7e, 0x4b, 0x49, 0x79, 0x30, 0x00, 0x03, 0x03, 0x71, 0x79, 0x0f, 0x07, 0x00, + 0x36, 0x7f, 0x49, 0x49, 0x7f, 0x36, 0x00, 0x06, 0x4f, 0x49, 0x69, 0x3f, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe6, 0x66, 0x00, 0x00, + 0x08, 0x1c, 0x36, 0x63, 0x41, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x00, 0x41, 0x63, 0x36, 0x1c, 0x08, 0x00, 0x00, 0x02, 0x03, 0x59, 0x5d, 0x07, 0x02, + 0x3e, 0x7f, 0x41, 0x5d, 0x5d, 0x5f, 0x0e, 0x7c, 0x7e, 0x13, 0x13, 0x7e, 0x7c, 0x00, + 0x41, 0x7f, 0x7f, 0x49, 0x49, 0x7f, 0x36, 0x1c, 0x3e, 0x63, 0x41, 0x41, 0x63, 0x22, + 0x41, 0x7f, 0x7f, 0x41, 0x63, 0x3e, 0x1c, 0x41, 0x7f, 0x7f, 0x49, 0x5d, 0x41, 0x63, + 0x41, 0x7f, 0x7f, 0x49, 0x1d, 0x01, 0x03, 0x1c, 0x3e, 0x63, 0x41, 0x51, 0x33, 0x72, + 0x7f, 0x7f, 0x08, 0x08, 0x7f, 0x7f, 0x00, 0x00, 0x41, 0x7f, 0x7f, 0x41, 0x00, 0x00, + 0x30, 0x70, 0x40, 0x41, 0x7f, 0x3f, 0x01, 0x41, 0x7f, 0x7f, 0x08, 0x1c, 0x77, 0x63, + 0x41, 0x7f, 0x7f, 0x41, 0x40, 0x60, 0x70, 0x7f, 0x7f, 0x0e, 0x1c, 0x0e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x06, 0x0c, 0x18, 0x7f, 0x7f, 0x1c, 0x3e, 0x63, 0x41, 0x63, 0x3e, 0x1c, + 0x41, 0x7f, 0x7f, 0x49, 0x09, 0x0f, 0x06, 0x1e, 0x3f, 0x21, 0x31, 0x61, 0x7f, 0x5e, + 0x41, 0x7f, 0x7f, 0x09, 0x19, 0x7f, 0x66, 0x26, 0x6f, 0x4d, 0x49, 0x59, 0x73, 0x32, + 0x03, 0x41, 0x7f, 0x7f, 0x41, 0x03, 0x00, 0x7f, 0x7f, 0x40, 0x40, 0x7f, 0x7f, 0x00, + 0x1f, 0x3f, 0x60, 0x60, 0x3f, 0x1f, 0x00, 0x3f, 0x7f, 0x60, 0x30, 0x60, 0x7f, 0x3f, + 0x63, 0x77, 0x1c, 0x08, 0x1c, 0x77, 0x63, 0x07, 0x4f, 0x78, 0x78, 0x4f, 0x07, 0x00, + 0x47, 0x63, 0x71, 0x59, 0x4d, 0x67, 0x73, 0x00, 0x7f, 0x7f, 0x41, 0x41, 0x00, 0x00, + 0x01, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x41, 0x41, 0x7f, 0x7f, 0x00, 0x00, + 0x08, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x08, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x03, 0x07, 0x04, 0x00, 0x00, 0x20, 0x74, 0x54, 0x54, 0x3c, 0x78, 0x40, + 0x41, 0x7f, 0x3f, 0x48, 0x48, 0x78, 0x30, 0x38, 0x7c, 0x44, 0x44, 0x6c, 0x28, 0x00, + 0x30, 0x78, 0x48, 0x49, 0x3f, 0x7f, 0x40, 0x38, 0x7c, 0x54, 0x54, 0x5c, 0x18, 0x00, + 0x48, 0x7e, 0x7f, 0x49, 0x03, 0x06, 0x00, 0x98, 0xbc, 0xa4, 0xa4, 0xf8, 0x7c, 0x04, + 0x41, 0x7f, 0x7f, 0x08, 0x04, 0x7c, 0x78, 0x00, 0x44, 0x7d, 0x7d, 0x40, 0x00, 0x00, + 0x60, 0xe0, 0x80, 0x84, 0xfd, 0x7d, 0x00, 0x41, 0x7f, 0x7f, 0x10, 0x38, 0x6c, 0x44, + 0x00, 0x41, 0x7f, 0x7f, 0x40, 0x00, 0x00, 0x7c, 0x7c, 0x18, 0x78, 0x1c, 0x7c, 0x78, + 0x7c, 0x78, 0x04, 0x04, 0x7c, 0x78, 0x00, 0x38, 0x7c, 0x44, 0x44, 0x7c, 0x38, 0x00, + 0x84, 0xfc, 0xf8, 0xa4, 0x24, 0x3c, 0x18, 0x18, 0x3c, 0x24, 0xa4, 0xf8, 0xfc, 0x84, + 0x44, 0x7c, 0x78, 0x4c, 0x04, 0x0c, 0x18, 0x48, 0x5c, 0x54, 0x74, 0x64, 0x24, 0x00, + 0x04, 0x04, 0x3e, 0x7f, 0x44, 0x24, 0x00, 0x3c, 0x7c, 0x40, 0x40, 0x3c, 0x7c, 0x40, + 0x1c, 0x3c, 0x60, 0x60, 0x3c, 0x1c, 0x00, 0x3c, 0x7c, 0x60, 0x30, 0x60, 0x7c, 0x3c, + 0x44, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0x44, 0x9c, 0xbc, 0xa0, 0xa0, 0xfc, 0x7c, 0x00, + 0x4c, 0x64, 0x74, 0x5c, 0x4c, 0x64, 0x00, 0x08, 0x08, 0x3e, 0x77, 0x41, 0x41, 0x00, + 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x41, 0x41, 0x77, 0x3e, 0x08, 0x08, 0x00, + 0x02, 0x03, 0x01, 0x03, 0x02, 0x03, 0x01, 0x70, 0x78, 0x4c, 0x46, 0x4c, 0x78, 0x70}; +// AVR MCUs have very little memory; save 6K of FLASH by stretching the 'normal' +// font instead of using this large font + +const uint8_t ucBigFont[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xfc, 0xfc, 0xfc, 0xfc, 0xc0, 0xc0, 0xfc, 0xfc, 0xfc, 0xfc, 0xc0, 0xc0, 0x00, 0x00, + 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, + 0xf0, 0xf0, 0xc3, 0xc3, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f, 0x3f, 0x3f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x3c, 0xff, 0xff, 0xc3, 0xc3, 0xff, 0xff, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x3f, 0x3f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0x0c, 0x0c, 0xcc, 0xcc, 0xff, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0xff, 0xcc, 0xcc, 0x0c, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3f, 0x3f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x30, 0x0f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0x3c, 0x3c, 0x00, 0x00, + 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x3f, 0x3f, 0xf3, 0xf3, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x3c, 0x3c, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf3, 0xf3, 0x3f, 0x3f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x3c, 0x3f, 0x3f, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0xfc, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x3c, 0x3c, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0xc3, 0xc3, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0xc3, 0xc3, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0xfc, 0xfc, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x3f, 0x3f, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xf0, 0xf0, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xf0, 0xf0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x3c, 0xff, 0xff, 0xc3, 0xc3, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f, 0x3c, 0x3c, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x3f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x3f, 0x3f, 0xff, 0xff, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xfc, 0xfc, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x3f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, + 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x3f, 0x3f, 0xfc, 0xfc, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xfc, 0xfc, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xc3, 0xc3, 0xcf, 0xcf, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xcf, 0xcf, 0xcf, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xcf, 0xcf, 0xcf, 0xcf, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0xff, 0xff, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0xff, 0xff, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x30, 0x30, 0xf0, 0xf0, 0xc3, 0xc3, 0x03, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, + 0x03, 0x03, 0xc3, 0xc3, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +// 5x7 font (in 6x8 cell) +const uint8_t ucSmallFont[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x5f, 0x06, 0x00, + 0x07, 0x03, 0x00, 0x07, 0x03, + 0x24, 0x7e, 0x24, 0x7e, 0x24, + 0x24, 0x2b, 0x6a, 0x12, 0x00, + 0x63, 0x13, 0x08, 0x64, 0x63, + 0x36, 0x49, 0x56, 0x20, 0x50, + 0x00, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x3e, 0x41, 0x00, 0x00, + 0x00, 0x41, 0x3e, 0x00, 0x00, + 0x08, 0x3e, 0x1c, 0x3e, 0x08, + 0x08, 0x08, 0x3e, 0x08, 0x08, + 0x00, 0xe0, 0x60, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x60, 0x60, 0x00, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3e, 0x51, 0x49, 0x45, 0x3e, + 0x00, 0x42, 0x7f, 0x40, 0x00, + 0x62, 0x51, 0x49, 0x49, 0x46, + 0x22, 0x49, 0x49, 0x49, 0x36, + 0x18, 0x14, 0x12, 0x7f, 0x10, + 0x2f, 0x49, 0x49, 0x49, 0x31, + 0x3c, 0x4a, 0x49, 0x49, 0x30, + 0x01, 0x71, 0x09, 0x05, 0x03, + 0x36, 0x49, 0x49, 0x49, 0x36, + 0x06, 0x49, 0x49, 0x29, 0x1e, + 0x00, 0x6c, 0x6c, 0x00, 0x00, + 0x00, 0xec, 0x6c, 0x00, 0x00, + 0x08, 0x14, 0x22, 0x41, 0x00, + 0x24, 0x24, 0x24, 0x24, 0x24, + 0x00, 0x41, 0x22, 0x14, 0x08, + 0x02, 0x01, 0x59, 0x09, 0x06, + 0x3e, 0x41, 0x5d, 0x55, 0x1e, + 0x7e, 0x11, 0x11, 0x11, 0x7e, + 0x7f, 0x49, 0x49, 0x49, 0x36, + 0x3e, 0x41, 0x41, 0x41, 0x22, + 0x7f, 0x41, 0x41, 0x41, 0x3e, + 0x7f, 0x49, 0x49, 0x49, 0x41, + 0x7f, 0x09, 0x09, 0x09, 0x01, + 0x3e, 0x41, 0x49, 0x49, 0x7a, + 0x7f, 0x08, 0x08, 0x08, 0x7f, + 0x00, 0x41, 0x7f, 0x41, 0x00, + 0x30, 0x40, 0x40, 0x40, 0x3f, + 0x7f, 0x08, 0x14, 0x22, 0x41, + 0x7f, 0x40, 0x40, 0x40, 0x40, + 0x7f, 0x02, 0x04, 0x02, 0x7f, + 0x7f, 0x02, 0x04, 0x08, 0x7f, + 0x3e, 0x41, 0x41, 0x41, 0x3e, + 0x7f, 0x09, 0x09, 0x09, 0x06, + 0x3e, 0x41, 0x51, 0x21, 0x5e, + 0x7f, 0x09, 0x09, 0x19, 0x66, + 0x26, 0x49, 0x49, 0x49, 0x32, + 0x01, 0x01, 0x7f, 0x01, 0x01, + 0x3f, 0x40, 0x40, 0x40, 0x3f, + 0x1f, 0x20, 0x40, 0x20, 0x1f, + 0x3f, 0x40, 0x3c, 0x40, 0x3f, + 0x63, 0x14, 0x08, 0x14, 0x63, + 0x07, 0x08, 0x70, 0x08, 0x07, + 0x71, 0x49, 0x45, 0x43, 0x00, + 0x00, 0x7f, 0x41, 0x41, 0x00, + 0x02, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x41, 0x41, 0x7f, 0x00, + 0x04, 0x02, 0x01, 0x02, 0x04, + 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x03, 0x07, 0x00, 0x00, + 0x20, 0x54, 0x54, 0x54, 0x78, + 0x7f, 0x44, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x28, + 0x38, 0x44, 0x44, 0x44, 0x7f, + 0x38, 0x54, 0x54, 0x54, 0x08, + 0x08, 0x7e, 0x09, 0x09, 0x00, + 0x18, 0xa4, 0xa4, 0xa4, 0x7c, + 0x7f, 0x04, 0x04, 0x78, 0x00, + 0x00, 0x00, 0x7d, 0x40, 0x00, + 0x40, 0x80, 0x84, 0x7d, 0x00, + 0x7f, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x00, 0x7f, 0x40, 0x00, + 0x7c, 0x04, 0x18, 0x04, 0x78, + 0x7c, 0x04, 0x04, 0x78, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x38, + 0xfc, 0x44, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0xfc, + 0x44, 0x78, 0x44, 0x04, 0x08, + 0x08, 0x54, 0x54, 0x54, 0x20, + 0x04, 0x3e, 0x44, 0x24, 0x00, + 0x3c, 0x40, 0x20, 0x7c, 0x00, + 0x1c, 0x20, 0x40, 0x20, 0x1c, + 0x3c, 0x60, 0x30, 0x60, 0x3c, + 0x6c, 0x10, 0x10, 0x6c, 0x00, + 0x9c, 0xa0, 0x60, 0x3c, 0x00, + 0x64, 0x54, 0x54, 0x4c, 0x00, + 0x08, 0x3e, 0x41, 0x41, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, + 0x00, 0x41, 0x41, 0x3e, 0x08, + 0x02, 0x01, 0x02, 0x01, 0x00, + 0x3c, 0x26, 0x23, 0x26, 0x3c, + + 0x18, 0x1e, 0x1f, 0x1e, 0x18, // triangle + 0x0c, 0x1e, 0x1e, 0x0c, 0x00, // circle + 0x12, 0x0c, 0x0c, 0x12, 0x00, // cross + 0x1e, 0x1e, 0x1e, 0x1e, 0x00, // square + + 0x04, 0x06, 0x7f, 0x06, 0x04, // arrow up + 0x10, 0x30, 0x7f, 0x30, 0x10, // arrow down + 0x08, 0x1c, 0x3e, 0x08, 0x08, // arrow left + 0x08, 0x08, 0x3e, 0x1c, 0x08, // arrow right + + 0x07, 0x03, 0x05, 0x08, 0x10, // arrow up-left + 0x10, 0x08, 0x05, 0x03, 0x07, // arrow up-right + 0x1c, 0x18, 0x14, 0x02, 0x01, // arrow down-left + 0x01, 0x02, 0x14, 0x18, 0x1c, // arrow down-right + + // switch + 0x3c, 0x34, 0x24, 0x26, 0x3e, // capture (camera) + 0x3c, 0x22, 0x39, 0x22, 0x3c, // home + + // xbox + 0x1e, 0x02, 0x3a, 0x2a, 0x38, // view + 0x00, 0x2a, 0x2a, 0x2a, 0x2a, // menu + 0x42, 0x3c, 0x18, 0x3c, 0x42, // Xbox button + + // PS4/5 + 0x1e, 0x22, 0x2a, 0x22, 0x1e, // touchpad + 0x0f, 0x05, 0x52, 0x68, 0x28, // PS button + 0x38, 0x44, 0x5f, 0x4e, 0x04, // share +}; diff --git a/lib/OneBitDisplay/obd.inl b/lib/OneBitDisplay/obd.inl index 0a3bab27d..903e434a0 100644 --- a/lib/OneBitDisplay/obd.inl +++ b/lib/OneBitDisplay/obd.inl @@ -2,566 +2,12 @@ // obd.inl // Drawing code for OneBitDisplay library // +#include "fonts.h" void obdSetDCMode(OBDISP *pOBD, int iMode); void InvertBytes(uint8_t *pData, uint8_t bLen); void SPI_BitBang(OBDISP *pOBD, uint8_t *pData, int iLen, uint8_t iMOSIPin, uint8_t iSCKPin); -const uint8_t ucMirror[256] = - {0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, - 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, - 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, - 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, - 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, - 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, - 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, - 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, - 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, - 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, - 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, - 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, - 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, - 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, - 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, - 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255}; - -const uint8_t ucFont[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x5f, 0x5f, 0x06, 0x00, - 0x00, 0x07, 0x07, 0x00, 0x07, 0x07, 0x00, 0x14, 0x7f, 0x7f, 0x14, 0x7f, 0x7f, 0x14, - 0x24, 0x2e, 0x2a, 0x6b, 0x6b, 0x3a, 0x12, 0x46, 0x66, 0x30, 0x18, 0x0c, 0x66, 0x62, - 0x30, 0x7a, 0x4f, 0x5d, 0x37, 0x7a, 0x48, 0x00, 0x04, 0x07, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x3e, 0x63, 0x41, 0x00, 0x00, 0x00, 0x41, 0x63, 0x3e, 0x1c, 0x00, 0x00, - 0x08, 0x2a, 0x3e, 0x1c, 0x3e, 0x2a, 0x08, 0x00, 0x08, 0x08, 0x3e, 0x3e, 0x08, 0x08, - 0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x01, - 0x3e, 0x7f, 0x59, 0x4d, 0x47, 0x7f, 0x3e, 0x40, 0x42, 0x7f, 0x7f, 0x40, 0x40, 0x00, - 0x62, 0x73, 0x59, 0x49, 0x6f, 0x66, 0x00, 0x22, 0x63, 0x49, 0x49, 0x7f, 0x36, 0x00, - 0x18, 0x1c, 0x16, 0x53, 0x7f, 0x7f, 0x50, 0x27, 0x67, 0x45, 0x45, 0x7d, 0x39, 0x00, - 0x3c, 0x7e, 0x4b, 0x49, 0x79, 0x30, 0x00, 0x03, 0x03, 0x71, 0x79, 0x0f, 0x07, 0x00, - 0x36, 0x7f, 0x49, 0x49, 0x7f, 0x36, 0x00, 0x06, 0x4f, 0x49, 0x69, 0x3f, 0x1e, 0x00, - 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe6, 0x66, 0x00, 0x00, - 0x08, 0x1c, 0x36, 0x63, 0x41, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x00, 0x41, 0x63, 0x36, 0x1c, 0x08, 0x00, 0x00, 0x02, 0x03, 0x59, 0x5d, 0x07, 0x02, - 0x3e, 0x7f, 0x41, 0x5d, 0x5d, 0x5f, 0x0e, 0x7c, 0x7e, 0x13, 0x13, 0x7e, 0x7c, 0x00, - 0x41, 0x7f, 0x7f, 0x49, 0x49, 0x7f, 0x36, 0x1c, 0x3e, 0x63, 0x41, 0x41, 0x63, 0x22, - 0x41, 0x7f, 0x7f, 0x41, 0x63, 0x3e, 0x1c, 0x41, 0x7f, 0x7f, 0x49, 0x5d, 0x41, 0x63, - 0x41, 0x7f, 0x7f, 0x49, 0x1d, 0x01, 0x03, 0x1c, 0x3e, 0x63, 0x41, 0x51, 0x33, 0x72, - 0x7f, 0x7f, 0x08, 0x08, 0x7f, 0x7f, 0x00, 0x00, 0x41, 0x7f, 0x7f, 0x41, 0x00, 0x00, - 0x30, 0x70, 0x40, 0x41, 0x7f, 0x3f, 0x01, 0x41, 0x7f, 0x7f, 0x08, 0x1c, 0x77, 0x63, - 0x41, 0x7f, 0x7f, 0x41, 0x40, 0x60, 0x70, 0x7f, 0x7f, 0x0e, 0x1c, 0x0e, 0x7f, 0x7f, - 0x7f, 0x7f, 0x06, 0x0c, 0x18, 0x7f, 0x7f, 0x1c, 0x3e, 0x63, 0x41, 0x63, 0x3e, 0x1c, - 0x41, 0x7f, 0x7f, 0x49, 0x09, 0x0f, 0x06, 0x1e, 0x3f, 0x21, 0x31, 0x61, 0x7f, 0x5e, - 0x41, 0x7f, 0x7f, 0x09, 0x19, 0x7f, 0x66, 0x26, 0x6f, 0x4d, 0x49, 0x59, 0x73, 0x32, - 0x03, 0x41, 0x7f, 0x7f, 0x41, 0x03, 0x00, 0x7f, 0x7f, 0x40, 0x40, 0x7f, 0x7f, 0x00, - 0x1f, 0x3f, 0x60, 0x60, 0x3f, 0x1f, 0x00, 0x3f, 0x7f, 0x60, 0x30, 0x60, 0x7f, 0x3f, - 0x63, 0x77, 0x1c, 0x08, 0x1c, 0x77, 0x63, 0x07, 0x4f, 0x78, 0x78, 0x4f, 0x07, 0x00, - 0x47, 0x63, 0x71, 0x59, 0x4d, 0x67, 0x73, 0x00, 0x7f, 0x7f, 0x41, 0x41, 0x00, 0x00, - 0x01, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x41, 0x41, 0x7f, 0x7f, 0x00, 0x00, - 0x08, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x08, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x00, 0x00, 0x03, 0x07, 0x04, 0x00, 0x00, 0x20, 0x74, 0x54, 0x54, 0x3c, 0x78, 0x40, - 0x41, 0x7f, 0x3f, 0x48, 0x48, 0x78, 0x30, 0x38, 0x7c, 0x44, 0x44, 0x6c, 0x28, 0x00, - 0x30, 0x78, 0x48, 0x49, 0x3f, 0x7f, 0x40, 0x38, 0x7c, 0x54, 0x54, 0x5c, 0x18, 0x00, - 0x48, 0x7e, 0x7f, 0x49, 0x03, 0x06, 0x00, 0x98, 0xbc, 0xa4, 0xa4, 0xf8, 0x7c, 0x04, - 0x41, 0x7f, 0x7f, 0x08, 0x04, 0x7c, 0x78, 0x00, 0x44, 0x7d, 0x7d, 0x40, 0x00, 0x00, - 0x60, 0xe0, 0x80, 0x84, 0xfd, 0x7d, 0x00, 0x41, 0x7f, 0x7f, 0x10, 0x38, 0x6c, 0x44, - 0x00, 0x41, 0x7f, 0x7f, 0x40, 0x00, 0x00, 0x7c, 0x7c, 0x18, 0x78, 0x1c, 0x7c, 0x78, - 0x7c, 0x78, 0x04, 0x04, 0x7c, 0x78, 0x00, 0x38, 0x7c, 0x44, 0x44, 0x7c, 0x38, 0x00, - 0x84, 0xfc, 0xf8, 0xa4, 0x24, 0x3c, 0x18, 0x18, 0x3c, 0x24, 0xa4, 0xf8, 0xfc, 0x84, - 0x44, 0x7c, 0x78, 0x4c, 0x04, 0x0c, 0x18, 0x48, 0x5c, 0x54, 0x74, 0x64, 0x24, 0x00, - 0x04, 0x04, 0x3e, 0x7f, 0x44, 0x24, 0x00, 0x3c, 0x7c, 0x40, 0x40, 0x3c, 0x7c, 0x40, - 0x1c, 0x3c, 0x60, 0x60, 0x3c, 0x1c, 0x00, 0x3c, 0x7c, 0x60, 0x30, 0x60, 0x7c, 0x3c, - 0x44, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0x44, 0x9c, 0xbc, 0xa0, 0xa0, 0xfc, 0x7c, 0x00, - 0x4c, 0x64, 0x74, 0x5c, 0x4c, 0x64, 0x00, 0x08, 0x08, 0x3e, 0x77, 0x41, 0x41, 0x00, - 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x41, 0x41, 0x77, 0x3e, 0x08, 0x08, 0x00, - 0x02, 0x03, 0x01, 0x03, 0x02, 0x03, 0x01, 0x70, 0x78, 0x4c, 0x46, 0x4c, 0x78, 0x70}; -// AVR MCUs have very little memory; save 6K of FLASH by stretching the 'normal' -// font instead of using this large font - -const uint8_t ucBigFont[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xfc, 0xfc, 0xfc, 0xfc, 0xc0, 0xc0, 0xfc, 0xfc, 0xfc, 0xfc, 0xc0, 0xc0, 0x00, 0x00, - 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, - 0xf0, 0xf0, 0xc3, 0xc3, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f, 0x3f, 0x3f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3c, 0x3c, 0xff, 0xff, 0xc3, 0xc3, 0xff, 0xff, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x30, 0x3f, 0x3f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0x0c, 0x0c, 0xcc, 0xcc, 0xff, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0xff, 0xcc, 0xcc, 0x0c, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3f, 0x3f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x30, 0x0f, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x30, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0x3c, 0x3c, 0x00, 0x00, - 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x3f, 0x3f, 0xf3, 0xf3, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x3c, 0x3c, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf3, 0xf3, 0x3f, 0x3f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3c, 0x3c, 0x3f, 0x3f, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0x3c, 0x3c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xfc, 0xfc, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x3c, 0x3c, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0xc3, 0xc3, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0xc3, 0xc3, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0xfc, 0xfc, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, - 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x3f, 0x3f, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xf0, 0xf0, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xf0, 0xf0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xfc, 0xfc, 0x0f, 0x0f, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3c, 0x3c, 0xff, 0xff, 0xc3, 0xc3, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f, 0x3c, 0x3c, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0f, 0x0f, 0xfc, 0xfc, 0xf0, 0xf0, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0x3f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x3f, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x3f, 0x3f, 0xff, 0xff, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xfc, 0xfc, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0x3f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0xc3, 0xc3, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, - 0xc0, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x3f, 0x3f, 0xfc, 0xfc, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xf0, 0xfc, 0xfc, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xc3, 0xc3, 0xcf, 0xcf, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xcf, 0xcf, 0xcf, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xcf, 0xcf, 0xcf, 0xcf, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0xff, 0xff, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0xff, 0xff, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x3c, 0x3c, 0x30, 0x30, 0xf0, 0xf0, 0xc3, 0xc3, 0x03, 0x03, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xff, 0xff, 0x3f, 0x3f, 0x00, 0x00, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, - 0x03, 0x03, 0xc3, 0xc3, 0xf0, 0xf0, 0x3c, 0x3c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x0f, 0x0f, 0x0c, 0x0c, 0x0f, 0x0f, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xff, 0xff, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0xff, 0xff, 0xfc, 0xfc, 0x00, 0x00, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -// 5x7 font (in 6x8 cell) -const uint8_t ucSmallFont[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x5f, 0x06, 0x00, - 0x07, 0x03, 0x00, 0x07, 0x03, - 0x24, 0x7e, 0x24, 0x7e, 0x24, - 0x24, 0x2b, 0x6a, 0x12, 0x00, - 0x63, 0x13, 0x08, 0x64, 0x63, - 0x36, 0x49, 0x56, 0x20, 0x50, - 0x00, 0x07, 0x03, 0x00, 0x00, - 0x00, 0x3e, 0x41, 0x00, 0x00, - 0x00, 0x41, 0x3e, 0x00, 0x00, - 0x08, 0x3e, 0x1c, 0x3e, 0x08, - 0x08, 0x08, 0x3e, 0x08, 0x08, - 0x00, 0xe0, 0x60, 0x00, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x60, 0x60, 0x00, 0x00, - 0x20, 0x10, 0x08, 0x04, 0x02, - 0x3e, 0x51, 0x49, 0x45, 0x3e, - 0x00, 0x42, 0x7f, 0x40, 0x00, - 0x62, 0x51, 0x49, 0x49, 0x46, - 0x22, 0x49, 0x49, 0x49, 0x36, - 0x18, 0x14, 0x12, 0x7f, 0x10, - 0x2f, 0x49, 0x49, 0x49, 0x31, - 0x3c, 0x4a, 0x49, 0x49, 0x30, - 0x01, 0x71, 0x09, 0x05, 0x03, - 0x36, 0x49, 0x49, 0x49, 0x36, - 0x06, 0x49, 0x49, 0x29, 0x1e, - 0x00, 0x6c, 0x6c, 0x00, 0x00, - 0x00, 0xec, 0x6c, 0x00, 0x00, - 0x08, 0x14, 0x22, 0x41, 0x00, - 0x24, 0x24, 0x24, 0x24, 0x24, - 0x00, 0x41, 0x22, 0x14, 0x08, - 0x02, 0x01, 0x59, 0x09, 0x06, - 0x3e, 0x41, 0x5d, 0x55, 0x1e, - 0x7e, 0x11, 0x11, 0x11, 0x7e, - 0x7f, 0x49, 0x49, 0x49, 0x36, - 0x3e, 0x41, 0x41, 0x41, 0x22, - 0x7f, 0x41, 0x41, 0x41, 0x3e, - 0x7f, 0x49, 0x49, 0x49, 0x41, - 0x7f, 0x09, 0x09, 0x09, 0x01, - 0x3e, 0x41, 0x49, 0x49, 0x7a, - 0x7f, 0x08, 0x08, 0x08, 0x7f, - 0x00, 0x41, 0x7f, 0x41, 0x00, - 0x30, 0x40, 0x40, 0x40, 0x3f, - 0x7f, 0x08, 0x14, 0x22, 0x41, - 0x7f, 0x40, 0x40, 0x40, 0x40, - 0x7f, 0x02, 0x04, 0x02, 0x7f, - 0x7f, 0x02, 0x04, 0x08, 0x7f, - 0x3e, 0x41, 0x41, 0x41, 0x3e, - 0x7f, 0x09, 0x09, 0x09, 0x06, - 0x3e, 0x41, 0x51, 0x21, 0x5e, - 0x7f, 0x09, 0x09, 0x19, 0x66, - 0x26, 0x49, 0x49, 0x49, 0x32, - 0x01, 0x01, 0x7f, 0x01, 0x01, - 0x3f, 0x40, 0x40, 0x40, 0x3f, - 0x1f, 0x20, 0x40, 0x20, 0x1f, - 0x3f, 0x40, 0x3c, 0x40, 0x3f, - 0x63, 0x14, 0x08, 0x14, 0x63, - 0x07, 0x08, 0x70, 0x08, 0x07, - 0x71, 0x49, 0x45, 0x43, 0x00, - 0x00, 0x7f, 0x41, 0x41, 0x00, - 0x02, 0x04, 0x08, 0x10, 0x20, - 0x00, 0x41, 0x41, 0x7f, 0x00, - 0x04, 0x02, 0x01, 0x02, 0x04, - 0x80, 0x80, 0x80, 0x80, 0x80, - 0x00, 0x03, 0x07, 0x00, 0x00, - 0x20, 0x54, 0x54, 0x54, 0x78, - 0x7f, 0x44, 0x44, 0x44, 0x38, - 0x38, 0x44, 0x44, 0x44, 0x28, - 0x38, 0x44, 0x44, 0x44, 0x7f, - 0x38, 0x54, 0x54, 0x54, 0x08, - 0x08, 0x7e, 0x09, 0x09, 0x00, - 0x18, 0xa4, 0xa4, 0xa4, 0x7c, - 0x7f, 0x04, 0x04, 0x78, 0x00, - 0x00, 0x00, 0x7d, 0x40, 0x00, - 0x40, 0x80, 0x84, 0x7d, 0x00, - 0x7f, 0x10, 0x28, 0x44, 0x00, - 0x00, 0x00, 0x7f, 0x40, 0x00, - 0x7c, 0x04, 0x18, 0x04, 0x78, - 0x7c, 0x04, 0x04, 0x78, 0x00, - 0x38, 0x44, 0x44, 0x44, 0x38, - 0xfc, 0x44, 0x44, 0x44, 0x38, - 0x38, 0x44, 0x44, 0x44, 0xfc, - 0x44, 0x78, 0x44, 0x04, 0x08, - 0x08, 0x54, 0x54, 0x54, 0x20, - 0x04, 0x3e, 0x44, 0x24, 0x00, - 0x3c, 0x40, 0x20, 0x7c, 0x00, - 0x1c, 0x20, 0x40, 0x20, 0x1c, - 0x3c, 0x60, 0x30, 0x60, 0x3c, - 0x6c, 0x10, 0x10, 0x6c, 0x00, - 0x9c, 0xa0, 0x60, 0x3c, 0x00, - 0x64, 0x54, 0x54, 0x4c, 0x00, - 0x08, 0x3e, 0x41, 0x41, 0x00, - 0x00, 0x00, 0x77, 0x00, 0x00, - 0x00, 0x41, 0x41, 0x3e, 0x08, - 0x02, 0x01, 0x02, 0x01, 0x00, - 0x3c, 0x26, 0x23, 0x26, 0x3c}; - #define MAX_CACHE 192 static uint8_t u8Cache[MAX_CACHE]; // for faster character drawing static volatile uint8_t u8End = 0; diff --git a/proto/config.proto b/proto/config.proto index 9c9da2f6c..16ce6d6cc 100644 --- a/proto/config.proto +++ b/proto/config.proto @@ -16,6 +16,14 @@ message GamepadOptions optional uint32 profileNumber = 9; optional PS4ControllerType ps4ControllerType = 10; optional uint32 debounceDelay = 11; + optional int32 inputModeB1 = 12; + optional int32 inputModeB2 = 13; + optional int32 inputModeB3 = 14; + optional int32 inputModeB4 = 15; + optional int32 inputModeL1 = 16; + optional int32 inputModeL2 = 17; + optional int32 inputModeR1 = 18; + optional int32 inputModeR2 = 19; } message KeyboardMapping diff --git a/site/docs/assets/boards/FlatboxRev5Southpaw.jpg b/site/docs/assets/boards/FlatboxRev5Southpaw.jpg index ddef79c63..be4a2349e 100644 Binary files a/site/docs/assets/boards/FlatboxRev5Southpaw.jpg and b/site/docs/assets/boards/FlatboxRev5Southpaw.jpg differ diff --git a/site/docs/assets/boards/KeyboardConverter.jpg b/site/docs/assets/boards/KeyboardConverter.jpg index 972dac102..936480fc8 100644 Binary files a/site/docs/assets/boards/KeyboardConverter.jpg and b/site/docs/assets/boards/KeyboardConverter.jpg differ diff --git a/site/docs/assets/boards/Liatris.jpg b/site/docs/assets/boards/Liatris.jpg index 39c3d9d20..fe47c7286 100644 Binary files a/site/docs/assets/boards/Liatris.jpg and b/site/docs/assets/boards/Liatris.jpg differ diff --git a/site/docs/assets/boards/OpenCore0.jpg b/site/docs/assets/boards/OpenCore0.jpg index 0775a1d7e..a0fa41e85 100644 Binary files a/site/docs/assets/boards/OpenCore0.jpg and b/site/docs/assets/boards/OpenCore0.jpg differ diff --git a/site/docs/assets/boards/OpenCore0WASD.jpg b/site/docs/assets/boards/OpenCore0WASD.jpg index fb34d28a0..56768fc8d 100644 Binary files a/site/docs/assets/boards/OpenCore0WASD.jpg and b/site/docs/assets/boards/OpenCore0WASD.jpg differ diff --git a/site/docs/assets/boards/PicoW.jpg b/site/docs/assets/boards/PicoW.jpg index 40af05ba1..a7ffc1e39 100644 Binary files a/site/docs/assets/boards/PicoW.jpg and b/site/docs/assets/boards/PicoW.jpg differ diff --git a/site/docs/assets/boards/RP2040AdvancedBreakoutBoardUSBPassthrough.jpg b/site/docs/assets/boards/RP2040AdvancedBreakoutBoardUSBPassthrough.jpg index 262ee57c1..28cbcfaa9 100644 Binary files a/site/docs/assets/boards/RP2040AdvancedBreakoutBoardUSBPassthrough.jpg and b/site/docs/assets/boards/RP2040AdvancedBreakoutBoardUSBPassthrough.jpg differ diff --git a/site/docs/assets/boards/ReflexCtrlSNES.jpg b/site/docs/assets/boards/ReflexCtrlSNES.jpg index 5b61cc522..148a4f9d1 100644 Binary files a/site/docs/assets/boards/ReflexCtrlSNES.jpg and b/site/docs/assets/boards/ReflexCtrlSNES.jpg differ diff --git a/site/docs/assets/boards/ReflexEncode_v2.0.jpg b/site/docs/assets/boards/ReflexEncode_v2.0.jpg index be598cef9..6baea2e9b 100644 Binary files a/site/docs/assets/boards/ReflexEncode_v2.0.jpg and b/site/docs/assets/boards/ReflexEncode_v2.0.jpg differ diff --git a/site/docs/assets/boards/SGFDevices.jpg b/site/docs/assets/boards/SGFDevices.jpg index 33c6b62ea..0ae037f32 100644 Binary files a/site/docs/assets/boards/SGFDevices.jpg and b/site/docs/assets/boards/SGFDevices.jpg differ diff --git a/site/docs/assets/gp2040-ce-placeholder.png b/site/docs/assets/gp2040-ce-placeholder.png index 3b5f8f319..1a737bae4 100644 Binary files a/site/docs/assets/gp2040-ce-placeholder.png and b/site/docs/assets/gp2040-ce-placeholder.png differ diff --git a/site/docs/assets/images/gpc-add-ons-dual-directional.png b/site/docs/assets/images/gpc-add-ons-dual-directional.png index 98c2a8d23..c6ba6fccd 100644 Binary files a/site/docs/assets/images/gpc-add-ons-dual-directional.png and b/site/docs/assets/images/gpc-add-ons-dual-directional.png differ diff --git a/site/docs/assets/images/gpc-add-ons-focus-mode.png b/site/docs/assets/images/gpc-add-ons-focus-mode.png index 908b794f3..b90cb3cd5 100644 Binary files a/site/docs/assets/images/gpc-add-ons-focus-mode.png and b/site/docs/assets/images/gpc-add-ons-focus-mode.png differ diff --git a/site/docs/assets/images/gpc-add-ons-input-history.png b/site/docs/assets/images/gpc-add-ons-input-history.png index c49d1e3a6..456be34d7 100644 Binary files a/site/docs/assets/images/gpc-add-ons-input-history.png and b/site/docs/assets/images/gpc-add-ons-input-history.png differ diff --git a/site/docs/assets/images/gpc-add-ons-joystick-slider.png b/site/docs/assets/images/gpc-add-ons-joystick-slider.png index 31c90fe97..d8ae108b0 100644 Binary files a/site/docs/assets/images/gpc-add-ons-joystick-slider.png and b/site/docs/assets/images/gpc-add-ons-joystick-slider.png differ diff --git a/site/docs/assets/images/gpc-add-ons-keyboard-host-configuration.png b/site/docs/assets/images/gpc-add-ons-keyboard-host-configuration.png index a9717b217..c894d3785 100644 Binary files a/site/docs/assets/images/gpc-add-ons-keyboard-host-configuration.png and b/site/docs/assets/images/gpc-add-ons-keyboard-host-configuration.png differ diff --git a/site/docs/assets/images/gpc-add-ons-player-number.png b/site/docs/assets/images/gpc-add-ons-player-number.png index 6faf6f8fc..1c223bd42 100644 Binary files a/site/docs/assets/images/gpc-add-ons-player-number.png and b/site/docs/assets/images/gpc-add-ons-player-number.png differ diff --git a/site/docs/assets/images/gpc-add-ons-ps-passthrough.png b/site/docs/assets/images/gpc-add-ons-ps-passthrough.png index 57172d594..a9eae0b51 100644 Binary files a/site/docs/assets/images/gpc-add-ons-ps-passthrough.png and b/site/docs/assets/images/gpc-add-ons-ps-passthrough.png differ diff --git a/site/docs/assets/images/gpc-add-ons-ps4-mode.png b/site/docs/assets/images/gpc-add-ons-ps4-mode.png index d413dbde1..2eaff48ce 100644 Binary files a/site/docs/assets/images/gpc-add-ons-ps4-mode.png and b/site/docs/assets/images/gpc-add-ons-ps4-mode.png differ diff --git a/site/docs/assets/images/gpc-add-ons-snespad-input-pinout.svg b/site/docs/assets/images/gpc-add-ons-snespad-input-pinout.svg index 1589fce92..8b4d7a69a 100644 --- a/site/docs/assets/images/gpc-add-ons-snespad-input-pinout.svg +++ b/site/docs/assets/images/gpc-add-ons-snespad-input-pinout.svg @@ -1,200 +1 @@ - - - - - - - - - - - - - - - - - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - - +1234567 \ No newline at end of file diff --git a/site/docs/assets/images/gpc-add-ons-tilt.png b/site/docs/assets/images/gpc-add-ons-tilt.png index 16263f3cc..6f448b8c0 100644 Binary files a/site/docs/assets/images/gpc-add-ons-tilt.png and b/site/docs/assets/images/gpc-add-ons-tilt.png differ diff --git a/site/docs/assets/images/gpc-add-ons-wii-extensions.png b/site/docs/assets/images/gpc-add-ons-wii-extensions.png index 88313c8cf..54130fe62 100644 Binary files a/site/docs/assets/images/gpc-add-ons-wii-extensions.png and b/site/docs/assets/images/gpc-add-ons-wii-extensions.png differ diff --git a/site/docs/assets/images/gpc-backup-and-restore.png b/site/docs/assets/images/gpc-backup-and-restore.png index 470fe695b..7a6b11fcd 100644 Binary files a/site/docs/assets/images/gpc-backup-and-restore.png and b/site/docs/assets/images/gpc-backup-and-restore.png differ diff --git a/site/docs/assets/images/gpc-backup.png b/site/docs/assets/images/gpc-backup.png index a9968b096..1c24cb1e1 100644 Binary files a/site/docs/assets/images/gpc-backup.png and b/site/docs/assets/images/gpc-backup.png differ diff --git a/site/docs/assets/images/gpc-documentation-current-version.png b/site/docs/assets/images/gpc-documentation-current-version.png index 0064c29e2..94a2c61ca 100644 Binary files a/site/docs/assets/images/gpc-documentation-current-version.png and b/site/docs/assets/images/gpc-documentation-current-version.png differ diff --git a/site/docs/assets/images/gpc-documentation-next-version.png b/site/docs/assets/images/gpc-documentation-next-version.png index bc1b6bee9..f5bdffdbd 100644 Binary files a/site/docs/assets/images/gpc-documentation-next-version.png and b/site/docs/assets/images/gpc-documentation-next-version.png differ diff --git a/site/docs/assets/images/gpc-home.png b/site/docs/assets/images/gpc-home.png index b9e9bbf88..f936508e6 100644 Binary files a/site/docs/assets/images/gpc-home.png and b/site/docs/assets/images/gpc-home.png differ diff --git a/site/docs/assets/images/gpc-hotkey-settings.png b/site/docs/assets/images/gpc-hotkey-settings.png index c7411b7b8..1c942b852 100644 Binary files a/site/docs/assets/images/gpc-hotkey-settings.png and b/site/docs/assets/images/gpc-hotkey-settings.png differ diff --git a/site/docs/assets/images/gpc-keyboard-mapping.png b/site/docs/assets/images/gpc-keyboard-mapping.png index 288bbd208..621387a39 100644 Binary files a/site/docs/assets/images/gpc-keyboard-mapping.png and b/site/docs/assets/images/gpc-keyboard-mapping.png differ diff --git a/site/docs/assets/images/gpc-macros-input-line.png b/site/docs/assets/images/gpc-macros-input-line.png index ff1419c83..d87b61ee6 100644 Binary files a/site/docs/assets/images/gpc-macros-input-line.png and b/site/docs/assets/images/gpc-macros-input-line.png differ diff --git a/site/docs/assets/images/gpc-macros.png b/site/docs/assets/images/gpc-macros.png index 47a2a7439..56a5fecde 100644 Binary files a/site/docs/assets/images/gpc-macros.png and b/site/docs/assets/images/gpc-macros.png differ diff --git a/site/docs/assets/images/gpc-profile-settings.png b/site/docs/assets/images/gpc-profile-settings.png index f00bf8271..3f244b40e 100644 Binary files a/site/docs/assets/images/gpc-profile-settings.png and b/site/docs/assets/images/gpc-profile-settings.png differ diff --git a/site/docs/assets/images/gpc-restore.png b/site/docs/assets/images/gpc-restore.png index ba7de4b2f..d4781ec29 100644 Binary files a/site/docs/assets/images/gpc-restore.png and b/site/docs/assets/images/gpc-restore.png differ diff --git a/site/docs/assets/images/wii-extension-controllers/classic.svg b/site/docs/assets/images/wii-extension-controllers/classic.svg index 2ded60949..9258e70d0 100644 --- a/site/docs/assets/images/wii-extension-controllers/classic.svg +++ b/site/docs/assets/images/wii-extension-controllers/classic.svg @@ -1,372 +1 @@ - - - -LSRSURDYXB+Home-RZRZLLRZRZLL +LSRSURDYXB+Home-RZRZLLRZRZLL \ No newline at end of file diff --git a/site/docs/assets/images/wii-extension-controllers/drums.svg b/site/docs/assets/images/wii-extension-controllers/drums.svg index 461b41dad..bc7c75545 100644 --- a/site/docs/assets/images/wii-extension-controllers/drums.svg +++ b/site/docs/assets/images/wii-extension-controllers/drums.svg @@ -1,233 +1 @@ - - - -JSJS--++PedalPedal +JSJS--++PedalPedal \ No newline at end of file diff --git a/site/docs/assets/images/wii-extension-controllers/guitar.svg b/site/docs/assets/images/wii-extension-controllers/guitar.svg index a65b073a4..1e05670d1 100644 --- a/site/docs/assets/images/wii-extension-controllers/guitar.svg +++ b/site/docs/assets/images/wii-extension-controllers/guitar.svg @@ -1,286 +1 @@ - - - -+-JSWhammyBarWhammyBarPedalPedal ++-JSWhammyBarWhammyBarPedalPedal \ No newline at end of file diff --git a/site/docs/assets/images/wii-extension-controllers/nunchuck.svg b/site/docs/assets/images/wii-extension-controllers/nunchuck.svg index 35d621c89..dcca5dba5 100644 --- a/site/docs/assets/images/wii-extension-controllers/nunchuck.svg +++ b/site/docs/assets/images/wii-extension-controllers/nunchuck.svg @@ -1,244 +1 @@ - - - -ZCAnalogStickZCAnalogStick +ZCAnalogStickZCAnalogStick \ No newline at end of file diff --git a/site/docs/assets/images/wii-extension-controllers/taiko.svg b/site/docs/assets/images/wii-extension-controllers/taiko.svg index 25e8ed521..0a6eaf15e 100644 --- a/site/docs/assets/images/wii-extension-controllers/taiko.svg +++ b/site/docs/assets/images/wii-extension-controllers/taiko.svg @@ -1,174 +1 @@ - - - -DONKATDONKAT +DONKATDONKAT \ No newline at end of file diff --git a/site/docs/assets/images/wii-extension-controllers/turntable.svg b/site/docs/assets/images/wii-extension-controllers/turntable.svg index 1cf6818a1..69442260d 100644 --- a/site/docs/assets/images/wii-extension-controllers/turntable.svg +++ b/site/docs/assets/images/wii-extension-controllers/turntable.svg @@ -1,320 +1 @@ - - - --+EUEFFECTJSFADER +-+EUEFFECTJSFADER \ No newline at end of file diff --git a/site/docs/faq/faq-troubleshooting.mdx b/site/docs/faq/faq-troubleshooting.mdx index 708aa3828..97d9f3fca 100644 --- a/site/docs/faq/faq-troubleshooting.mdx +++ b/site/docs/faq/faq-troubleshooting.mdx @@ -22,8 +22,6 @@ Select the button labels to be displayed in the usage guide: There are many different reasons why this could be the case. -PS5 is at present supported using passthrough authentication only; see [PS Passthrough](../add-ons/ps-passthrough.mdx). - #### Incorrect Mapping in Steam Verify that your controller settings in Steam are correctly set, both global settings and the per-game settings. See [Steam Support](https://partner.steamgames.com/doc/features/steam_controller/getting_started_for_players) for more information on how to resolve this issue. diff --git a/site/static/img/gp2040-ce-logo.svg b/site/static/img/gp2040-ce-logo.svg index 97d03342c..d868227d0 100644 --- a/site/static/img/gp2040-ce-logo.svg +++ b/site/static/img/gp2040-ce-logo.svg @@ -1,814 +1 @@ - - - - + \ No newline at end of file diff --git a/src/addons/inputhistory.cpp b/src/addons/inputhistory.cpp index daef24bb4..d279530a6 100644 --- a/src/addons/inputhistory.cpp +++ b/src/addons/inputhistory.cpp @@ -5,39 +5,45 @@ #include "helper.h" #include "config.pb.h" -static const std::string displayNames[][18] = { +static const std::string displayNames[][INPUT_HISTORY_MAX_INPUTS] = { { // HID / DINPUT - "U", "D", "L", "R", - "X", "O", "#", "^", + CHAR_UP, CHAR_DOWN, CHAR_LEFT, CHAR_RIGHT, + CHAR_UL, CHAR_UR, CHAR_DL, CHAR_DR, + CHAR_CROSS, CHAR_CIRCLE, CHAR_SQUARE, CHAR_TRIANGLE, "L1", "R1", "L2", "R2", "SL", "ST", "L3", "R3", "PS", "A2" }, { // Switch - "U", "D", "L", "R", + CHAR_UP, CHAR_DOWN, CHAR_LEFT, CHAR_RIGHT, + CHAR_UL, CHAR_UR, CHAR_DL, CHAR_DR, "B", "A", "Y", "X", "L", "R", "ZL", "ZR", - "-", "+", "LS", "RS", "H", "C" + "-", "+", "LS", "RS", CHAR_HOME_S, CHAR_CAP_S }, { // XInput - "U", "D", "L", "R", + CHAR_UP, CHAR_DOWN, CHAR_LEFT, CHAR_RIGHT, + CHAR_UL, CHAR_UR, CHAR_DL, CHAR_DR, "A", "B", "X", "Y", "LB", "RB", "LT", "RT", - "BK", "ST", "LS", "RS", "G", "A2" + CHAR_VIEW_X, CHAR_MENU_X, "LS", "RS", CHAR_HOME_X, "A2" }, { // Keyboard / HID-KB - "U", "D", "L", "R", + CHAR_UP, CHAR_DOWN, CHAR_LEFT, CHAR_RIGHT, + CHAR_UL, CHAR_UR, CHAR_DL, CHAR_DR, "B1", "B2", "B3", "B4", "L1", "R1", "L2", "R2", "S1", "S2", "L3", "R3", "A1", "A2" }, { // PS4 - "U", "D", "L", "R", - "X", "O", "#", "^", + CHAR_UP, CHAR_DOWN, CHAR_LEFT, CHAR_RIGHT, + CHAR_UL, CHAR_UR, CHAR_DL, CHAR_DR, + CHAR_CROSS, CHAR_CIRCLE, CHAR_SQUARE, CHAR_TRIANGLE, "L1", "R1", "L2", "R2", - "SH", "OP", "L3", "R3", "PS", "T" + CHAR_SHARE_P, "OP", "L3", "R3", CHAR_HOME_P, CHAR_TPAD_P }, { // Config - "U", "D", "L", "R", + CHAR_UP, CHAR_DOWN, CHAR_LEFT, CHAR_RIGHT, + CHAR_UL, CHAR_UR, CHAR_DL, CHAR_DR, "B1", "B2", "B3", "B4", "L1", "R1", "L2", "R2", "S1", "S2", "L3", "R3", "A1", "A2" @@ -64,11 +70,18 @@ void InputHistoryAddon::process() { std::deque pressed; // Get key states - std::array currentInput = { + std::array currentInput = { + pressedUp(), pressedDown(), pressedLeft(), pressedRight(), + + pressedUpLeft(), + pressedUpRight(), + pressedDownLeft(), + pressedDownRight(), + gamepad->pressedB1(), gamepad->pressedB2(), gamepad->pressedB3(), @@ -100,7 +113,7 @@ void InputHistoryAddon::process() { // Check if any new keys have been pressed if (lastInput != currentInput) { // Iterate through array - for (uint8_t x=0; x<18; x++) { + for (uint8_t x=0; xgetOptions().dpadMode) { - case DPAD_MODE_DIGITAL: return pGamepad->pressedUp(); + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == GAMEPAD_MASK_UP); case DPAD_MODE_LEFT_ANALOG: return pGamepad->state.ly == GAMEPAD_JOYSTICK_MIN; case DPAD_MODE_RIGHT_ANALOG: return pGamepad->state.ry == GAMEPAD_JOYSTICK_MIN; } @@ -165,7 +178,7 @@ bool InputHistoryAddon::pressedDown() { switch (gamepad->getOptions().dpadMode) { - case DPAD_MODE_DIGITAL: return pGamepad->pressedDown(); + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == GAMEPAD_MASK_DOWN); case DPAD_MODE_LEFT_ANALOG: return pGamepad->state.ly == GAMEPAD_JOYSTICK_MAX; case DPAD_MODE_RIGHT_ANALOG: return pGamepad->state.ry == GAMEPAD_JOYSTICK_MAX; } @@ -177,7 +190,7 @@ bool InputHistoryAddon::pressedLeft() { switch (gamepad->getOptions().dpadMode) { - case DPAD_MODE_DIGITAL: return pGamepad->pressedLeft(); + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == GAMEPAD_MASK_LEFT); case DPAD_MODE_LEFT_ANALOG: return pGamepad->state.lx == GAMEPAD_JOYSTICK_MIN; case DPAD_MODE_RIGHT_ANALOG: return pGamepad->state.rx == GAMEPAD_JOYSTICK_MIN; } @@ -189,10 +202,58 @@ bool InputHistoryAddon::pressedRight() { switch (gamepad->getOptions().dpadMode) { - case DPAD_MODE_DIGITAL: return pGamepad->pressedRight(); + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == GAMEPAD_MASK_RIGHT); case DPAD_MODE_LEFT_ANALOG: return pGamepad->state.lx == GAMEPAD_JOYSTICK_MAX; case DPAD_MODE_RIGHT_ANALOG: return pGamepad->state.rx == GAMEPAD_JOYSTICK_MAX; } return false; } + +bool InputHistoryAddon::pressedUpLeft() +{ + switch (gamepad->getOptions().dpadMode) + { + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == (GAMEPAD_MASK_UP | GAMEPAD_MASK_LEFT)); + case DPAD_MODE_LEFT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MIN) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MIN); + case DPAD_MODE_RIGHT_ANALOG: return (pGamepad->state.rx == GAMEPAD_JOYSTICK_MIN) && (pGamepad->state.ry == GAMEPAD_JOYSTICK_MIN); + } + + return false; +} + +bool InputHistoryAddon::pressedUpRight() +{ + switch (gamepad->getOptions().dpadMode) + { + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == (GAMEPAD_MASK_UP | GAMEPAD_MASK_RIGHT)); + case DPAD_MODE_LEFT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MAX) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MIN); + case DPAD_MODE_RIGHT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MAX) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MIN); + } + + return false; +} + +bool InputHistoryAddon::pressedDownLeft() +{ + switch (gamepad->getOptions().dpadMode) + { + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == (GAMEPAD_MASK_DOWN | GAMEPAD_MASK_LEFT)); + case DPAD_MODE_LEFT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MIN) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MAX); + case DPAD_MODE_RIGHT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MIN) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MAX); + } + + return false; +} + +bool InputHistoryAddon::pressedDownRight() +{ + switch (gamepad->getOptions().dpadMode) + { + case DPAD_MODE_DIGITAL: return ((pGamepad->state.dpad & GAMEPAD_MASK_DPAD) == (GAMEPAD_MASK_DOWN | GAMEPAD_MASK_RIGHT)); + case DPAD_MODE_LEFT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MAX) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MAX); + case DPAD_MODE_RIGHT_ANALOG: return (pGamepad->state.lx == GAMEPAD_JOYSTICK_MAX) && (pGamepad->state.ly == GAMEPAD_JOYSTICK_MAX); + } + + return false; +} diff --git a/src/config_utils.cpp b/src/config_utils.cpp index d20fdc811..d13138553 100644 --- a/src/config_utils.cpp +++ b/src/config_utils.cpp @@ -78,6 +78,30 @@ #ifndef DEFAULT_INPUT_MODE #define DEFAULT_INPUT_MODE INPUT_MODE_XINPUT #endif +#ifndef DEFAULT_INPUT_MODE_B1 + #define DEFAULT_INPUT_MODE_B1 INPUT_MODE_SWITCH +#endif +#ifndef DEFAULT_INPUT_MODE_B2 + #define DEFAULT_INPUT_MODE_B2 INPUT_MODE_XINPUT +#endif +#ifndef DEFAULT_INPUT_MODE_B3 + #define DEFAULT_INPUT_MODE_B3 INPUT_MODE_HID +#endif +#ifndef DEFAULT_INPUT_MODE_B4 + #define DEFAULT_INPUT_MODE_B4 INPUT_MODE_PS4 +#endif +#ifndef DEFAULT_INPUT_MODE_L1 + #define DEFAULT_INPUT_MODE_L1 -1 +#endif +#ifndef DEFAULT_INPUT_MODE_L2 + #define DEFAULT_INPUT_MODE_L2 -1 +#endif +#ifndef DEFAULT_INPUT_MODE_R1 + #define DEFAULT_INPUT_MODE_R1 -1 +#endif +#ifndef DEFAULT_INPUT_MODE_R2 + #define DEFAULT_INPUT_MODE_R2 INPUT_MODE_KEYBOARD +#endif #ifndef DEFAULT_DPAD_MODE #define DEFAULT_DPAD_MODE DPAD_MODE_DIGITAL #endif @@ -114,6 +138,14 @@ void ConfigUtils::initUnsetPropertiesWithDefaults(Config& config) INIT_UNSET_PROPERTY(config.gamepadOptions, profileNumber, 1); INIT_UNSET_PROPERTY(config.gamepadOptions, ps4ControllerType, DEFAULT_PS4CONTROLLER_TYPE); INIT_UNSET_PROPERTY(config.gamepadOptions, debounceDelay, 5); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeB1, DEFAULT_INPUT_MODE_B1); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeB2, DEFAULT_INPUT_MODE_B2); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeB3, DEFAULT_INPUT_MODE_B3); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeB4, DEFAULT_INPUT_MODE_B4); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeL1, DEFAULT_INPUT_MODE_L1); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeL2, DEFAULT_INPUT_MODE_L2); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeR1, DEFAULT_INPUT_MODE_R1); + INIT_UNSET_PROPERTY(config.gamepadOptions, inputModeR2, DEFAULT_INPUT_MODE_R2); // hotkeyOptions HotkeyOptions& hotkeyOptions = config.hotkeyOptions; diff --git a/src/configs/webconfig.cpp b/src/configs/webconfig.cpp index 982157275..bab499cbd 100644 --- a/src/configs/webconfig.cpp +++ b/src/configs/webconfig.cpp @@ -623,6 +623,14 @@ std::string setGamepadOptions() readDoc(gamepadOptions.profileNumber, doc, "profileNumber"); readDoc(gamepadOptions.ps4ControllerType, doc, "ps4ControllerType"); readDoc(gamepadOptions.debounceDelay, doc, "debounceDelay"); + readDoc(gamepadOptions.inputModeB1, doc, "inputModeB1"); + readDoc(gamepadOptions.inputModeB2, doc, "inputModeB2"); + readDoc(gamepadOptions.inputModeB3, doc, "inputModeB3"); + readDoc(gamepadOptions.inputModeB4, doc, "inputModeB4"); + readDoc(gamepadOptions.inputModeL1, doc, "inputModeL1"); + readDoc(gamepadOptions.inputModeL2, doc, "inputModeL2"); + readDoc(gamepadOptions.inputModeR1, doc, "inputModeR1"); + readDoc(gamepadOptions.inputModeR2, doc, "inputModeR2"); HotkeyOptions& hotkeyOptions = Storage::getInstance().getHotkeyOptions(); save_hotkey(&hotkeyOptions.hotkey01, doc, "hotkey01"); @@ -660,6 +668,14 @@ std::string getGamepadOptions() writeDoc(doc, "profileNumber", gamepadOptions.profileNumber); writeDoc(doc, "ps4ControllerType", gamepadOptions.ps4ControllerType); writeDoc(doc, "debounceDelay", gamepadOptions.debounceDelay); + writeDoc(doc, "inputModeB1", gamepadOptions.inputModeB1); + writeDoc(doc, "inputModeB2", gamepadOptions.inputModeB2); + writeDoc(doc, "inputModeB3", gamepadOptions.inputModeB3); + writeDoc(doc, "inputModeB4", gamepadOptions.inputModeB4); + writeDoc(doc, "inputModeL1", gamepadOptions.inputModeL1); + writeDoc(doc, "inputModeL2", gamepadOptions.inputModeL2); + writeDoc(doc, "inputModeR1", gamepadOptions.inputModeR1); + writeDoc(doc, "inputModeR2", gamepadOptions.inputModeR2); writeDoc(doc, "fnButtonPin", -1); GpioMappingInfo* gpioMappings = Storage::getInstance().getGpioMappings().pins; diff --git a/src/gp2040.cpp b/src/gp2040.cpp index 6b3547b03..0e13f6e6d 100644 --- a/src/gp2040.cpp +++ b/src/gp2040.cpp @@ -59,6 +59,19 @@ void GP2040::setup() { Gamepad * gamepad = Storage::getInstance().GetGamepad(); gamepad->setup(); + const GamepadOptions& gamepadOptions = Storage::getInstance().getGamepadOptions(); + + // check setup options and add modes to the list + // user modes + bootActions.insert({GAMEPAD_MASK_B1, gamepadOptions.inputModeB1}); + bootActions.insert({GAMEPAD_MASK_B2, gamepadOptions.inputModeB2}); + bootActions.insert({GAMEPAD_MASK_B3, gamepadOptions.inputModeB3}); + bootActions.insert({GAMEPAD_MASK_B4, gamepadOptions.inputModeB4}); + bootActions.insert({GAMEPAD_MASK_L1, gamepadOptions.inputModeL1}); + bootActions.insert({GAMEPAD_MASK_L2, gamepadOptions.inputModeL2}); + bootActions.insert({GAMEPAD_MASK_R1, gamepadOptions.inputModeR1}); + bootActions.insert({GAMEPAD_MASK_R2, gamepadOptions.inputModeR2}); + // Initialize our ADC (various add-ons) adc_init(); @@ -79,7 +92,6 @@ void GP2040::setup() { addons.LoadAddon(new TiltInput(), CORE0_INPUT); addons.LoadAddon(new InputMacro(), CORE0_INPUT); - const BootAction bootAction = getBootAction(); switch (bootAction) { @@ -205,30 +217,37 @@ GP2040::BootAction GP2040::getBootAction() { // Copy Processed Gamepad for Core1 (race condition otherwise) memcpy(&processedGamepad->state, &gamepad->state, sizeof(GamepadState)); - ForcedSetupOptions& forcedSetupOptions = Storage::getInstance().getForcedSetupOptions(); - bool modeSwitchLocked = forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_MODE_SWITCH || - forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_BOTH; + const ForcedSetupOptions& forcedSetupOptions = Storage::getInstance().getForcedSetupOptions(); + bool modeSwitchLocked = forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_MODE_SWITCH || + forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_BOTH; - bool webConfigLocked = forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_WEB_CONFIG || - forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_BOTH; + bool webConfigLocked = forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_WEB_CONFIG || + forcedSetupOptions.mode == FORCED_SETUP_MODE_LOCK_BOTH; if (gamepad->pressedS1() && gamepad->pressedS2() && gamepad->pressedUp()) { return BootAction::ENTER_USB_MODE; } else if (!webConfigLocked && gamepad->pressedS2()) { return BootAction::ENTER_WEBCONFIG_MODE; - } else if (!modeSwitchLocked && gamepad->pressedB3()) { // P1 - return BootAction::SET_INPUT_MODE_HID; - } else if (!modeSwitchLocked && gamepad->pressedB4()) { // P2 - return BootAction::SET_INPUT_MODE_PS4; - } else if (!modeSwitchLocked && gamepad->pressedB1()) { // K1 - return BootAction::SET_INPUT_MODE_SWITCH; - } else if (!modeSwitchLocked && gamepad->pressedB2()) { // K2 - return BootAction::SET_INPUT_MODE_XINPUT; - } else if (!modeSwitchLocked && gamepad->pressedR2()) { // K3 - return BootAction::SET_INPUT_MODE_KEYBOARD; - } else { - return BootAction::NONE; - } + } else { + if (!modeSwitchLocked) { + if (auto search = bootActions.find(gamepad->state.buttons); search != bootActions.end()) { + switch (search->second) { + case INPUT_MODE_XINPUT: + return BootAction::SET_INPUT_MODE_XINPUT; + case INPUT_MODE_SWITCH: + return BootAction::SET_INPUT_MODE_SWITCH; + case INPUT_MODE_HID: + return BootAction::SET_INPUT_MODE_HID; + case INPUT_MODE_KEYBOARD: + return BootAction::SET_INPUT_MODE_KEYBOARD; + case INPUT_MODE_PS4: + return BootAction::SET_INPUT_MODE_PS4; + default: + return BootAction::NONE; + } + } + } + } break; } diff --git a/tools/linux_compile_makefsdata.sh b/tools/linux_compile_makefsdata.sh deleted file mode 100755 index 352c43ef9..000000000 --- a/tools/linux_compile_makefsdata.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -# This compiles makefsdata for Linux statically linking against musl -# - Make sure that you have the required packages installed (for Ubuntu these are: musl and musl-tools) -# - Download the latest release ZIP from https://github.com/richgel999/miniz/releases and copy miniz.c and miniz.h to -# $PICO_SDK_PATH/lib/lwip/src/apps/http - -musl-gcc \ - $PICO_SDK_PATH/lib/lwip/src/apps/http/makefsdata/makefsdata.c \ - --no-pie -static \ - -o makefsdata \ - -I$PICO_SDK_PATH/lib/lwip/src/include \ - -I$PICO_SDK_PATH/lib/lwip/contrib/ports/unix/lib \ - -I$PICO_SDK_PATH/lib/lwip/contrib/ports/unix/port/include \ - -DMAKEFS_SUPPORT_DEFLATE=1 diff --git a/tools/makefsdata b/tools/makefsdata deleted file mode 100755 index 8bdcc58e7..000000000 Binary files a/tools/makefsdata and /dev/null differ diff --git a/tools/makefsdata.darwin b/tools/makefsdata.darwin deleted file mode 100755 index 84ac07ab0..000000000 Binary files a/tools/makefsdata.darwin and /dev/null differ diff --git a/tools/makefsdata.exe b/tools/makefsdata.exe deleted file mode 100644 index 1c4ab23e6..000000000 Binary files a/tools/makefsdata.exe and /dev/null differ diff --git a/www/makefsdata.js b/www/makefsdata.js index fadc10ca1..7b436683e 100644 --- a/www/makefsdata.js +++ b/www/makefsdata.js @@ -1,41 +1,261 @@ -import path from "path"; -import fs from "fs"; +import path from 'node:path'; +import fs from 'node:fs'; -import { execFile } from "child_process"; -import { fileURLToPath } from "url"; +import { fileURLToPath } from 'node:url'; + +import pako from 'pako'; const __filename = fileURLToPath(import.meta.url); -const root = path.dirname(__filename).replace(path.normalize("www"), ""); +const root = path.dirname(__filename).replace(path.normalize('www'), ''); const rootwww = path.dirname(__filename); +const buildPath = path.join(rootwww, 'build'); + +const fsdataPath = path.normalize(path.join(root, 'lib/httpd/fsdata.c')); + +// These are the same content types that are used by the original makefsdata +const contentTypes = new Map([ + ['html', 'text/html'], + ['htm', 'text/html'], + [ + 'shtml', + 'text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache', + ], + [ + 'shtm', + 'text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache', + ], + [ + 'ssi', + 'text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache', + ], + ['gif', 'image/gif'], + ['png', 'image/png'], + ['jpg', 'image/jpeg'], + ['bmp', 'image/bmp'], + ['ico', 'image/x-icon'], + ['class', 'application/octet-stream'], + ['cls', 'application/octet-stream'], + ['js', 'application/javascript'], + ['ram', 'application/javascript'], + ['css', 'text/css'], + ['swf', 'application/x-shockwave-flash'], + ['xml', 'text/xml'], + ['xsl', 'text/xml'], + ['pdf', 'application/pdf'], + ['json', 'application/json'], +]); + +const defaultContentType = 'text/plain'; + +const shtmlExtensions = new Set(['shtml', 'shtm', 'ssi', 'xml', 'json']); + +const skipCompressionExtensions = new Set(['png', 'json']); + +const serverHeader = 'GP2040-CE'; + +const payloadAlignment = 4; +const hexBytesPerLine = 16; + +function getFiles(dir) { + let results = []; + const list = fs.readdirSync(dir, { withFileTypes: true }); + for (const file of list) { + file.path = dir + '/' + file.name; + if (file.isDirectory()) { + results = results.concat(getFiles(file.path)); + } else if (file.isFile()) { + results.push(file.path); + } + } + return results; +} + +function getLowerCaseFileExtension(file) { + const ext = file.split('.').pop(); + return ext ? ext.toLowerCase() : ''; +} + +function fixFilenameForC(filename) { + let varName = ''; + for (let i = 0; i < filename.length; i++) { + const c = filename[i]; + if (c >= 'a' && c <= 'z') { + varName += c; + } else if (c >= 'A' && c <= 'Z') { + varName += c; + } else if (c >= '0' && c <= '9') { + varName += c; + } else { + varName += '_'; + } + } + return varName; +} + +function CStringLength(str) { + return Buffer.from(str, 'utf8').length; +} + +function createHexString(value, prependComment = false) { + let column = 0; + let hexString = ''; + if (typeof value === 'string') { + const bytes = Buffer.from(value, 'utf8'); + if (prependComment) { + hexString += `/* "${value}" (${bytes.length} bytes) */\n`; + } + bytes.forEach((byte) => { + hexString += '0x' + byte.toString(16).padStart(2, '0') + ','; + if (++column >= hexBytesPerLine) { + hexString += '\n'; + column = 0; + } + }); + } else if (Buffer.isBuffer(value) || value instanceof Uint8Array) { + value.forEach((byte) => { + hexString += '0x' + byte.toString(16).padStart(2, '0') + ','; + if (++column >= hexBytesPerLine) { + hexString += '\n'; + column = 0; + } + }); + } else { + throw new Error('Invalid value type'); + } -const fsdata_filename = path.normalize("/lib/httpd/fsdata.c"); - -function correctincludes() { - fs.readFile(root + fsdata_filename, "utf8", function (error, data) { - if (data) { - let result = data.replace("#include \"lwip/apps/fs.h\"\r\n#include \"lwip/def.h\"", '#include "fsdata.h"'); - - fs.writeFile(root + fsdata_filename, result, "utf8", function (error) { - if (error) { - console.error(error); - } - }); - } else { - if (error) { - console.error(error); - } - } - }); + return hexString + '\n'; } function makefsdata() { - execFile(path.normalize(process.platform !== "darwin" ? `${root}/tools/makefsdata` : `${root}/tools/makefsdata.darwin`), [path.normalize(`${rootwww}/build`), '-defl:10', '-xc:png,json', `-f:`+ path.normalize(`${root}/lib/httpd/fsdata.c`)], function(error, data) { - if (error) { - console.error(error); - } else { - correctincludes(); - } - }); + let fsdata = ''; + fsdata += '#include "fsdata.h"\n'; + fsdata += '\n'; + fsdata += '#define file_NULL (struct fsdata_file *) NULL\n'; + fsdata += '\n'; + fsdata += '#ifndef FS_FILE_FLAGS_HEADER_INCLUDED\n'; + fsdata += '#define FS_FILE_FLAGS_HEADER_INCLUDED 1\n'; + fsdata += '#endif\n'; + fsdata += '#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT\n'; + fsdata += '#define FS_FILE_FLAGS_HEADER_PERSISTENT 0\n'; + fsdata += '#endif\n'; + fsdata += '/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */\n'; + fsdata += '#ifndef FSDATA_FILE_ALIGNMENT\n'; + fsdata += '#define FSDATA_FILE_ALIGNMENT 0\n'; + fsdata += '#endif\n'; + fsdata += '#ifndef FSDATA_ALIGN_PRE\n'; + fsdata += '#define FSDATA_ALIGN_PRE\n'; + fsdata += '#endif\n'; + fsdata += '#ifndef FSDATA_ALIGN_POST\n'; + fsdata += '#define FSDATA_ALIGN_POST\n'; + fsdata += '#endif\n'; + fsdata += '#if FSDATA_FILE_ALIGNMENT==2\n'; + fsdata += '#include "fsdata_alignment.h"\n'; + fsdata += '#endif\n'; + fsdata += '\n'; + + let payloadAlignmentDummyCounter = 0; + + const fileInfos = []; + + getFiles(buildPath).forEach((file) => { + const ext = getLowerCaseFileExtension(file); + + const qualifiedName = '/' + path.relative(buildPath, file).replace(/\\/g, '/'); + const varName = fixFilenameForC(qualifiedName); + + fsdata += '#if FSDATA_FILE_ALIGNMENT==1\n'; + fsdata += `static const unsigned int dummy_align_${varName} = ${payloadAlignmentDummyCounter++};\n`; + fsdata += '#endif\n'; + + const fileContent = fs.readFileSync(file); + let compressed = fileContent.buffer; + let isCompressed = false; + if (!skipCompressionExtensions.has(ext)) { + compressed = pako.deflate(fileContent, { + level: 9, + windowBits: 15, + memLevel: 9, + }); + console.log( + `Compressed ${qualifiedName} from ${fileContent.byteLength} to ${ + compressed.byteLength + } bytes (${Math.round( + (compressed.byteLength / fileContent.byteLength) * 100, + )}%)`, + ); + if (compressed.byteLength >= fileContent.byteLength) { + console.log( + `Skipping compression of ${qualifiedName}, compressed size is larger than original`, + ); + } else { + isCompressed = true; + } + } else { + console.log(`Skipping compression of ${qualifiedName} by file extension`); + } + + const qualifiedNameLength = CStringLength(qualifiedName) + 1; + const paddedQualifiedNameLength = + Math.ceil(qualifiedNameLength / payloadAlignment) * payloadAlignment; + // Zero terminate the qualified name and pad it to the next multiple of payloadAlignment + const paddedQualifiedName = + qualifiedName + + '\0'.repeat(1 + paddedQualifiedNameLength - qualifiedNameLength); + fsdata += `static const unsigned char data_${varName}[] FSDATA_ALIGN_PRE = {\n`; + fsdata += `/* ${qualifiedName} (${qualifiedNameLength} chars) */\n`; + fsdata += createHexString(paddedQualifiedName, false); + fsdata += '\n'; + fsdata += '/* HTTP header */\n'; + fsdata += createHexString('HTTP/1.0 200 OK\r\n', true); + fsdata += createHexString(`Server: ${serverHeader}\r\n`, true); + fsdata += createHexString( + `Content-Length: ${ + isCompressed ? compressed.byteLength : fileContent.byteLength + }\r\n`, + true, + ); + if (isCompressed) { + fsdata += createHexString('Content-Encoding: deflate\r\n', true); + } + fsdata += createHexString( + `Content-Type: ${contentTypes.get(ext) ?? defaultContentType}\r\n\r\n`, + true, + ); + fsdata += `/* raw file data (${ + isCompressed ? compressed.byteLength : fileContent.byteLength + } bytes) */\n`; + fsdata += createHexString(isCompressed ? compressed : fileContent); + fsdata += '};\n\n'; + + fileInfos.push({ + varName, + paddedQualifiedNameLength, + isSsiFile: shtmlExtensions.has(ext), + }); + }); + + let prevFile = 'NULL'; + fileInfos.forEach((fileInfo) => { + fsdata += `const struct fsdata_file file_${fileInfo.varName}[] = {{\n`; + fsdata += `file_${prevFile},\n`; + fsdata += `data_${fileInfo.varName},\n`; + fsdata += `data_${fileInfo.varName} + ${fileInfo.paddedQualifiedNameLength},\n`; + fsdata += `sizeof(data_${fileInfo.varName}) - ${fileInfo.paddedQualifiedNameLength},\n`; + fsdata += `FS_FILE_FLAGS_HEADER_INCLUDED | ${ + fileInfo.isSsiFile + ? 'FS_FILE_FLAGS_SSI' + : 'FS_FILE_FLAGS_HEADER_PERSISTENT' + }\n`; + fsdata += '}};\n\n'; + + prevFile = fileInfo.varName; + }); + + fsdata += `#define FS_ROOT file_${prevFile}\n`; + fsdata += `#define FS_NUMFILES ${fileInfos.length}\n`; + + fs.writeFileSync(fsdataPath, fsdata, 'utf8'); } -makefsdata(); \ No newline at end of file + +makefsdata(); diff --git a/www/package-lock.json b/www/package-lock.json index a8f549bac..30d044bbe 100644 --- a/www/package-lock.json +++ b/www/package-lock.json @@ -40,6 +40,7 @@ "eslint-plugin-react-refresh": "^0.4.1", "express": "^4.18.2", "nodemon": "^2.0.22", + "pako": "^2.1.0", "prettier": "^3.0.1", "sass": "^1.62.1", "source-map-explorer": "^2.5.3", @@ -4282,6 +4283,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", diff --git a/www/package.json b/www/package.json index dd1b851f7..b93e6b101 100644 --- a/www/package.json +++ b/www/package.json @@ -47,6 +47,7 @@ "eslint-plugin-react-refresh": "^0.4.1", "express": "^4.18.2", "nodemon": "^2.0.22", + "pako": "^2.1.0", "prettier": "^3.0.1", "sass": "^1.62.1", "source-map-explorer": "^2.5.3", diff --git a/www/server/app.js b/www/server/app.js index 8a1c65c2b..7685c1348 100644 --- a/www/server/app.js +++ b/www/server/app.js @@ -96,6 +96,14 @@ app.get('/api/getGamepadOptions', (req, res) => { profileNumber: 1, ps4ControllerType: 0, debounceDelay: 5, + inputModeB1: 1, + inputModeB2: 0, + inputModeB3: 2, + inputModeB4: 4, + inputModeL1: -1, + inputModeL2: -1, + inputModeR1: -1, + inputModeR2: 3, hotkey01: { auxMask: 32768, buttonsMask: 66304, diff --git a/www/src/Addons/I2CAnalog1219.tsx b/www/src/Addons/I2CAnalog1219.tsx index 09cde4884..5d5f48318 100644 --- a/www/src/Addons/I2CAnalog1219.tsx +++ b/www/src/Addons/I2CAnalog1219.tsx @@ -1,7 +1,8 @@ import { AppContext } from '../Contexts/AppContext'; import React, { useContext, useEffect, useState } from 'react'; -import { useTranslation } from 'react-i18next'; +import { Trans, useTranslation } from 'react-i18next'; import { FormCheck, Row, FormLabel } from 'react-bootstrap'; +import { NavLink } from 'react-router-dom'; import * as yup from 'yup'; import Section from '../Components/Section'; @@ -107,7 +108,7 @@ const I2CAnalog1219 = ({ values, errors, handleChange, handleCheckbox }) => { }} /> : - {t('PeripheralMapping:peripheral-toggle-unavailable',{'name':'I2C'})} + {t('PeripheralMapping:header-text')} } ); diff --git a/www/src/Addons/Keyboard.tsx b/www/src/Addons/Keyboard.tsx index 9d0cbea86..30f3740e9 100644 --- a/www/src/Addons/Keyboard.tsx +++ b/www/src/Addons/Keyboard.tsx @@ -1,6 +1,7 @@ import React, { useContext, useState } from 'react'; -import { useTranslation } from 'react-i18next'; +import { Trans, useTranslation } from 'react-i18next'; import { FormCheck, Row, FormLabel } from 'react-bootstrap'; +import { NavLink } from 'react-router-dom'; import * as yup from 'yup'; import Section from '../Components/Section'; @@ -85,7 +86,7 @@ const Keyboard = ({ }} /> : - {t('PeripheralMapping:peripheral-toggle-unavailable',{'name':'USB'})} + {t('PeripheralMapping:header-text')} } ); diff --git a/www/src/Addons/Passthrough.tsx b/www/src/Addons/Passthrough.tsx index e0ab64104..9c53fc28b 100644 --- a/www/src/Addons/Passthrough.tsx +++ b/www/src/Addons/Passthrough.tsx @@ -1,7 +1,8 @@ import { AppContext } from '../Contexts/AppContext'; import React, { useContext } from 'react'; -import { useTranslation } from 'react-i18next'; +import { Trans, useTranslation } from 'react-i18next'; import { FormCheck, Row, FormLabel } from 'react-bootstrap'; +import { NavLink } from 'react-router-dom'; import * as yup from 'yup'; import Section from '../Components/Section'; @@ -53,7 +54,7 @@ const PSPassthrough = ({ values, errors, handleChange, handleCheckbox }) => { }} /> : - {t('PeripheralMapping:peripheral-toggle-unavailable',{'name':'USB'})} + {t('PeripheralMapping:header-text')} } ); diff --git a/www/src/Addons/Wii.tsx b/www/src/Addons/Wii.tsx index 93abe805d..61444cb2e 100644 --- a/www/src/Addons/Wii.tsx +++ b/www/src/Addons/Wii.tsx @@ -2,6 +2,7 @@ import { AppContext } from '../Contexts/AppContext'; import React, { useContext, useEffect, useState } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { Button, Form, Row, FormCheck, Tab, Tabs, FormLabel } from 'react-bootstrap'; +import { NavLink } from 'react-router-dom'; import * as yup from 'yup'; import Section from '../Components/Section'; @@ -301,7 +302,7 @@ const Wii = ({ values, errors, handleChange, handleCheckbox, setFieldValue }) => }} /> : - {t('PeripheralMapping:peripheral-toggle-unavailable',{'name':'I2C'})} + {t('PeripheralMapping:header-text')} } ); diff --git a/www/src/Locales/en/PeripheralMapping.jsx b/www/src/Locales/en/PeripheralMapping.jsx index eded957e8..08a4aa531 100644 --- a/www/src/Locales/en/PeripheralMapping.jsx +++ b/www/src/Locales/en/PeripheralMapping.jsx @@ -11,8 +11,8 @@ export default { 'spi-description': 'SPI is a four-wire interface used for accessory devices, such as displays, GPIO expansion, and sensors via a RX and TX data line, as well as a SCK clock line, and a CS sync/chip select line. The RP2040 supports two SPI controller blocks: SPI0 and SPI1. The following are the supported GPIO pins for each block:', 'usb-label': 'USB Host', 'usb-desc-header': 'USB Host Information', - 'usb-description': 'NYI', - 'peripheral-toggle-unavailable': 'Cannot Enable. Peripheral "{{name}}" unavailable.', + 'usb-description': 'USB Host allows supported USB client devices to be used, such as keyboards, gamepads, or other devices.', + 'peripheral-toggle-unavailable': 'Cannot Enable. Peripheral "{{name}}" unavailable. Enable it in the <0>Peripheral Mapping section.', 'pin-sda-label': 'SDA', 'pin-scl-label': 'SCL', 'option-speed-label': 'Speed', diff --git a/www/src/Locales/en/SettingsPage.jsx b/www/src/Locales/en/SettingsPage.jsx index 61e75d85e..f6288f58a 100644 --- a/www/src/Locales/en/SettingsPage.jsx +++ b/www/src/Locales/en/SettingsPage.jsx @@ -3,12 +3,14 @@ export default { 'input-mode-label': 'Input Mode', 'input-mode-extra-label': 'Switch Touchpad and Share', 'input-mode-options': { + none: 'No Mode Selected', xinput: 'XInput', 'nintendo-switch': 'Nintendo Switch', ps3: 'PS3/DirectInput', keyboard: 'Keyboard', ps4: 'PS4', }, + 'boot-input-mode-label': 'Boot Input Modes', 'ps4-mode-options': { controller: 'Controller', arcadestick: 'Arcade Stick', diff --git a/www/src/Pages/DisplayConfig.jsx b/www/src/Pages/DisplayConfig.jsx index 4b326b66c..f554ec7e1 100644 --- a/www/src/Pages/DisplayConfig.jsx +++ b/www/src/Pages/DisplayConfig.jsx @@ -4,6 +4,7 @@ import { Formik, useFormikContext, Field } from 'formik'; import chunk from 'lodash/chunk'; import * as yup from 'yup'; import { Trans, useTranslation } from 'react-i18next'; +import { NavLink } from 'react-router-dom'; import { AppContext } from '../Contexts/AppContext'; import FormControl from '../Components/FormControl'; @@ -699,7 +700,7 @@ export default function DisplayConfigPage() { : - {t('PeripheralMapping:peripheral-toggle-unavailable',{'name':'I2C'})} + {t('PeripheralMapping:header-text')} } )} diff --git a/www/src/Pages/SettingsPage.jsx b/www/src/Pages/SettingsPage.jsx index 474312f84..7ac48f7e9 100644 --- a/www/src/Pages/SettingsPage.jsx +++ b/www/src/Pages/SettingsPage.jsx @@ -19,6 +19,15 @@ const INPUT_MODES = [ { labelKey: 'input-mode-options.ps4', value: PS4Mode }, ]; +const INPUT_BOOT_MODES = [ + { labelKey: 'input-mode-options.none', value: -1 }, + { labelKey: 'input-mode-options.xinput', value: 0 }, + { labelKey: 'input-mode-options.nintendo-switch', value: 1 }, + { labelKey: 'input-mode-options.ps3', value: 2 }, + { labelKey: 'input-mode-options.keyboard', value: 3 }, + { labelKey: 'input-mode-options.ps4', value: PS4Mode }, +]; + const DPAD_MODES = [ { labelKey: 'd-pad-mode-options.d-pad', value: 0 }, { labelKey: 'd-pad-mode-options.left-analog', value: 1 }, @@ -83,6 +92,17 @@ const FORCED_SETUP_MODES = [ { labelKey: 'forced-setup-mode-options.disable-both', value: 3 }, ]; +const INPUT_MODES_BINDS = [ + { value: 'B1' }, + { value: 'B2' }, + { value: 'B3' }, + { value: 'B4' }, + { value: 'L1' }, + { value: 'L2' }, + { value: 'R1' }, + { value: 'R2' }, +]; + const hotkeySchema = { action: yup .number() @@ -140,6 +160,46 @@ const schema = yup.object().shape({ .oneOf(PS4_MODES.map((o) => o.value)) .label('PS4 Controller Type'), debounceDelay: yup.number().required().label('Debounce Delay'), + inputModeB1: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('B1 Input Mode'), + inputModeB2: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('B2 Input Mode'), + inputModeB3: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('B3 Input Mode'), + inputModeB4: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('B4 Input Mode'), + inputModeL1: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('L1 Input Mode'), + inputModeL2: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('L2 Input Mode'), + inputModeR1: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('R1 Input Mode'), + inputModeR2: yup + .number() + .required() + .oneOf(INPUT_BOOT_MODES.map((o) => o.value)) + .label('R2 Input Mode'), }); const FormContext = ({ setButtonLabels }) => { @@ -239,6 +299,7 @@ export default function SettingsPage() { const { t } = useTranslation(''); + const translatedInputBootModes = translateArray(INPUT_BOOT_MODES); const translatedInputModes = translateArray(INPUT_MODES); const translatedDpadModes = translateArray(DPAD_MODES); const translatedSocdModes = translateArray(SOCD_MODES); @@ -462,6 +523,36 @@ export default function SettingsPage() { +
+
+ {INPUT_MODES_BINDS.map((mode) => ( + + { (mode.value in currentButtonLabels)? currentButtonLabels[mode.value]:mode.value} +
+ + {translatedInputBootModes.map((o, i) => ( + + ))} + + + {errors[`inputMode${mode.value}`]} + +
+
+ ))} +
+