From 782f197c8380cc6fb4e681c40d314452fda6cdc1 Mon Sep 17 00:00:00 2001 From: CidVonHighwind Date: Thu, 20 Nov 2025 11:23:26 +0100 Subject: [PATCH] init --- .gitignore | 5 + README.md | 94 ++++++++ platformio.ini | 20 ++ src/image.h | 587 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 261 ++++++++++++++++++++++ 5 files changed, 967 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 platformio.ini create mode 100644 src/image.h create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/README.md b/README.md new file mode 100644 index 0000000..512b37d --- /dev/null +++ b/README.md @@ -0,0 +1,94 @@ +# Xteink X4 Sample + +A simple sample project for the Xteink X4 e-ink device using the GxEPD2 library. + +## Hardware + +- **Device**: Xteink X4 +- **Board**: ESP32-C3 (QFN32) +- **Display**: [4.26" E-Ink (800×480px, GDEQ0426T82, SSD1677 controller)](https://www.good-display.com/product/457.html) +- **Custom SPI pins**: SCLK=8, MOSI=10, CS=21, DC=4, RST=5, BUSY=6 + +### Resources + +- [Hardware Schematics](https://github.com/sunwoods/Xteink-X4) - XteinkX4 circuit diagrams +- [Display Datasheet](https://www.good-display.com/product/457.html) - 4.26" GDEQ0426T82 specifications + +## Features + +- Basic GxEPD2 display initialization +- Custom SPI pin configuration +- Button input detection via ADC +- Simple text display examples + +## Building + +```powershell +# Build +platformio run + +# Upload +platformio run -t upload + +# Monitor +platformio device monitor +``` + +## Firmware Backup & Restore + +### Backup Original Firmware + +Before flashing custom firmware, back up the factory firmware: + +```powershell +# Read entire 16MB flash +esptool.py --chip esp32c3 --port COM5 read_flash 0x0 0x1000000 firmware_backup.bin +``` + +### Restore Original Firmware + +To restore the backed-up firmware: + +```powershell +# Write back the entire flash +esptool.py --chip esp32c3 --port COM5 write_flash 0x0 firmware_backup.bin +``` + +**Important**: Make sure to use the correct COM port for your device. + +## Notes + +- This uses `GxEPD2_426_GDEQ0426T82` as the display class for the 4.26" 800x480 display +- Display rotation is set to 3 (270 degrees) +- Partial refresh is used for button presses to improve responsiveness + +## Open Tasks + +- Better font rendering with grayscale +- Power on/off +- SD card reader +- WiFi +- Bluetooth + +## Button System + +The XteinkX4 uses **resistor ladder networks** connected to two ADC pins for button detection. Each button press produces a unique analog voltage that's read via `analogRead()`. + +### Button ADC Values + +**GPIO1 (4 buttons)**: +- Back: ~3470 +- Confirm: ~2655 +- Left: ~1470 +- Right: ~3 + +**GPIO2 (2 buttons)**: +- Volume Up: ~2205 +- Volume Down: ~3 + +### Implementation Notes + +- Use threshold ranges (e.g., `value > 3200 && value < 3700`) to detect button presses +- Add debouncing with edge detection (track last button state) to prevent multiple triggers +- Polling every 50ms works well for responsive input +- The resistor ladder allows multiple buttons on a single ADC pin, saving GPIO pins diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..f2f7ca2 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,20 @@ +[env:esp32-c3-devkitm-1] +platform = espressif32 +board = esp32-c3-devkitm-1 +framework = arduino +monitor_speed = 115200 +upload_speed = 921600 + +; Board configuration +board_build.flash_mode = dio +board_build.flash_size = 4MB + +; Libraries +lib_deps = + zinggjm/GxEPD2@^1.5.9 + +; Build flags +build_flags = + -DARDUINO_USB_MODE=1 + -DARDUINO_USB_CDC_ON_BOOT=1 + -DCONFIG_ESP_TASK_WDT_INIT=0 diff --git a/src/image.h b/src/image.h new file mode 100644 index 0000000..6b2525c --- /dev/null +++ b/src/image.h @@ -0,0 +1,587 @@ +#ifndef _IMAGE_H_ +#define _IMAGE_H_ + +#include + +// '50-506468_dr-mario-png-dr-mario-smash-ultimate-transparent', 263x280px +const unsigned char dr_mario[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xcc, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x12, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x62, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x29, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x22, 0x48, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0xc6, 0x32, 0x00, 0x00, 0x00, 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, 0x80, 0x08, + 0x45, 0x30, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, + 0x01, 0x04, 0x09, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0xf8, 0x11, 0x32, 0xc9, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0xff, 0x92, 0x42, 0x44, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xbf, 0xc4, 0x99, 0x32, 0x1a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3b, 0xef, 0x44, 0x84, 0xc9, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xfb, 0x93, 0x32, 0xf1, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x88, 0x4b, 0xf4, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xfd, 0xab, 0x49, 0xf2, 0x42, 0x3f, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xef, 0x80, 0x23, 0xe2, 0x11, 0x7f, 0xf8, 0x00, 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, 0xff, 0x34, 0x90, 0xe0, 0x81, 0x7f, 0xff, 0x00, + 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, 0xff, 0x84, 0x84, 0x00, 0x00, 0xfe, 0xff, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x20, 0x00, 0x02, 0x7b, + 0xef, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xa2, 0x00, 0x88, 0x02, + 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xa0, 0x00, 0x00, + 0x01, 0xff, 0xbd, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x02, + 0x40, 0x05, 0xef, 0xff, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xc0, + 0x00, 0x00, 0x07, 0xfb, 0x77, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, + 0xf0, 0x00, 0x00, 0x03, 0xff, 0xff, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xbf, 0xe0, 0x00, 0x90, 0x1f, 0xff, 0xef, 0xef, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xfe, 0xe8, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xfb, 0xf0, 0x01, 0x00, 0x7f, 0xbd, 0xff, 0xf6, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x21, 0x3f, 0xf7, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x02, 0x04, 0xff, 0xff, 0xb7, 0xff, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0x48, 0x43, 0xff, 0xff, 0xfd, 0xbf, 0xdc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xbf, 0x81, 0x1b, 0x7f, 0xff, 0xff, 0xef, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf4, 0xed, 0xff, 0xff, 0xff, 0xfd, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xbd, 0xff, 0x9f, 0xb6, 0x22, 0xfe, 0xff, 0xff, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe9, 0x32, 0x49, 0xff, 0xbf, + 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfb, 0xfd, 0x24, 0xc1, 0x17, 0xff, + 0x8d, 0xff, 0xef, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xf4, 0x12, 0x0c, 0x9f, + 0xff, 0xe1, 0xdf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0xc8, 0x90, + 0xbf, 0xff, 0xe4, 0x7f, 0xfb, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x04, + 0x92, 0x3f, 0xff, 0xf2, 0x2f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, + 0x31, 0x02, 0x7f, 0xff, 0xf2, 0x8f, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, + 0xff, 0x02, 0x48, 0xff, 0x00, 0x78, 0x91, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xc8, 0x21, 0xfc, 0x50, 0x09, 0x33, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x89, 0x25, 0xf0, 0x16, 0x84, 0x49, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x2f, 0xc2, 0x45, 0xe0, 0x00, 0x92, 0x48, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0xe4, 0x13, 0xcf, 0x02, 0x22, 0x26, 0xef, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc1, 0xe1, 0x13, 0x3d, 0x82, 0x24, 0x91, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x04, 0xe8, 0xc7, 0x66, 0xc1, 0x84, 0x91, 0xfd, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x07, 0xe2, 0x08, 0xff, 0x40, 0x10, 0x4c, 0xf7, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4e, 0x71, 0x22, 0xdb, 0xe1, 0x4b, 0x02, 0xff, + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0f, 0xcc, 0x24, 0xf3, 0xa1, 0x08, 0x62, + 0xef, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x99, 0xa0, 0x85, 0xbf, 0xb0, 0x90, + 0x99, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x22, 0x51, 0xff, 0xe0, + 0x84, 0x85, 0xdf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x12, 0x44, 0xff, + 0xc1, 0x24, 0x25, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x41, 0x84, 0x24, + 0xff, 0xf1, 0x12, 0x4b, 0x7b, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x92, 0x21, + 0x13, 0xff, 0xa0, 0x91, 0x13, 0xdf, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x08, + 0x29, 0x40, 0xff, 0xa2, 0x24, 0x4f, 0xff, 0x64, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, + 0x21, 0x84, 0x2c, 0xff, 0xe1, 0x02, 0x4f, 0x7b, 0xc9, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x24, 0x10, 0x82, 0x7f, 0x61, 0x58, 0x97, 0xdf, 0x8f, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x89, 0x22, 0x52, 0x6d, 0xc4, 0x41, 0x37, 0xfe, 0x32, 0xd8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x22, 0x48, 0x89, 0x11, 0x3f, 0x86, 0x0c, 0x4f, 0xff, 0x32, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x12, 0x49, 0x24, 0x9e, 0x02, 0xa4, 0x8f, 0xf7, 0x4c, 0x8c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x91, 0x24, 0x48, 0x92, 0x58, 0xbc, 0x93, 0xfe, 0x61, 0x26, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x24, 0x8a, 0x61, 0x04, 0x7e, 0x43, 0xfe, 0x92, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x24, 0x92, 0x22, 0x4c, 0xb3, 0xfe, 0x28, 0xfe, 0xd2, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x92, 0x42, 0x49, 0x12, 0x9f, 0xfe, 0x89, 0x7b, + 0x4c, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x49, 0x29, 0x15, 0x92, 0x7f, 0xfe, 0x45, + 0x7e, 0x64, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x49, 0x24, 0xb0, 0xcf, 0xff, 0xfe, + 0x50, 0xfe, 0x93, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x24, 0x92, 0x0a, 0x7f, 0xff, + 0xfe, 0x12, 0x7e, 0x90, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x24, 0x92, 0x66, 0x7f, + 0xff, 0xee, 0x8c, 0xfb, 0x4c, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x92, 0x49, 0x91, + 0xff, 0xff, 0xfe, 0x61, 0x3e, 0x42, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x49, 0x24, + 0x59, 0xff, 0xff, 0xfc, 0x13, 0x3c, 0x92, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x24, + 0x95, 0x4e, 0xff, 0xff, 0xf9, 0x94, 0xb3, 0x24, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, + 0x96, 0x53, 0x27, 0xff, 0xff, 0xf2, 0x48, 0x89, 0x24, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7e, 0x51, 0x48, 0xb3, 0xff, 0xbe, 0x84, 0x4a, 0x4c, 0xc8, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xcd, 0x2d, 0x9f, 0xfe, 0xfe, 0x25, 0x25, 0x32, 0x49, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xe9, 0xa6, 0x7f, 0xff, 0xfc, 0x91, 0x31, 0x26, 0x44, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xfa, 0xdb, 0xff, 0xff, 0xfe, 0x48, 0x8a, 0xc9, 0xb2, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x7f, 0xf7, 0xff, 0xf9, 0x0a, 0x66, 0x19, 0x9b, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xdf, 0xff, 0xf8, 0x62, 0x44, 0xc6, 0x49, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe7, 0xe6, 0x11, 0x19, 0x36, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xef, 0xff, 0xff, 0xc4, 0x90, 0x94, 0xc9, 0x25, + 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0x90, 0x11, 0x24, 0xa6, + 0xdd, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x13, 0xf1, 0xfe, 0x6b, 0x44, 0x49, + 0x32, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x47, 0x94, 0x09, 0x20, 0x49, + 0x13, 0x19, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x4b, 0x24, 0x94, + 0x92, 0x44, 0xcd, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x24, 0x48, 0x92, + 0x44, 0x92, 0x59, 0x24, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x24, + 0xc9, 0x22, 0x49, 0x13, 0x33, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xc9, + 0x26, 0x49, 0x29, 0x24, 0xcc, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x22, 0x49, 0x24, 0x09, 0x24, 0x64, 0xcd, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x12, 0x11, 0x24, 0xc4, 0x49, 0x33, 0x37, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc4, 0x92, 0x10, 0x31, 0x13, 0x1b, 0x77, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x80, 0x09, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x42, 0x43, 0x04, 0x94, 0xcc, 0xdf, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x24, + 0x01, 0x49, 0x20, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x08, 0x48, 0x48, 0xcd, 0xb7, 0xa7, 0xd0, 0x00, 0x00, 0x04, 0x11, + 0x13, 0x30, 0x40, 0x46, 0x58, 0x41, 0x24, 0x92, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x21, 0x09, 0x23, 0x23, 0x36, 0xec, 0x02, 0x49, 0x04, 0xc0, + 0x44, 0x40, 0x04, 0x96, 0x10, 0x42, 0x10, 0x84, 0x48, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x94, 0xa4, 0x94, 0x7a, 0xdf, 0x18, 0x20, 0x40, 0x12, + 0x12, 0x04, 0x88, 0xc1, 0x20, 0x81, 0x00, 0x8c, 0x11, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x92, 0x24, 0x95, 0x8c, 0xfc, 0x42, 0x8c, 0x12, + 0x08, 0x80, 0x22, 0x22, 0x11, 0x29, 0x24, 0x2c, 0x41, 0x40, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x99, 0x90, 0x24, 0x00, 0x00, 0x03, 0x49, 0x12, 0x49, 0x37, 0xf9, 0x22, 0x01, + 0x80, 0x24, 0x88, 0x88, 0x90, 0x12, 0x89, 0x08, 0x81, 0x12, 0x12, 0x32, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x64, 0x22, 0x04, 0x85, 0x90, 0x89, 0xb7, 0xc9, 0xca, 0x6b, 0x67, 0xe2, 0x24, + 0x40, 0x20, 0x12, 0x22, 0x09, 0x05, 0x42, 0xc4, 0x42, 0x30, 0x84, 0x88, 0x82, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x21, 0x01, 0x02, 0x40, 0x50, 0x04, 0x24, 0x0f, 0xa6, 0x29, 0x92, 0x5d, 0xc8, + 0x91, 0x12, 0x02, 0x49, 0x08, 0x21, 0x24, 0x09, 0x31, 0x10, 0x86, 0x24, 0x62, 0x48, 0x90, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x44, 0x92, 0x50, 0x49, 0x12, 0x43, 0x10, 0xcb, 0x34, 0xb6, 0xdd, 0x9f, + 0x00, 0x04, 0x00, 0x80, 0x08, 0x10, 0x04, 0x48, 0x81, 0x24, 0x24, 0x10, 0x49, 0x01, 0x10, 0x80, + 0x00, 0x00, 0x00, 0x92, 0x08, 0x48, 0x80, 0x8c, 0x02, 0x24, 0x88, 0x42, 0x0f, 0x5d, 0xd6, 0x67, + 0xfe, 0x11, 0x20, 0x24, 0x09, 0x06, 0x50, 0x92, 0x42, 0x33, 0x49, 0x83, 0x49, 0x10, 0x94, 0x24, + 0x00, 0x00, 0x00, 0x04, 0x11, 0x82, 0x12, 0x24, 0x21, 0x84, 0x8c, 0x20, 0x08, 0x0f, 0x4f, 0x59, + 0xb6, 0xfc, 0x00, 0x24, 0x01, 0x00, 0x30, 0x18, 0x08, 0x90, 0x02, 0x48, 0x18, 0x22, 0x46, 0x11, + 0x80, 0x00, 0x00, 0x00, 0x04, 0x44, 0x31, 0x92, 0x09, 0x10, 0x14, 0x31, 0x03, 0x21, 0x0d, 0xba, + 0x7f, 0x9f, 0xf0, 0x40, 0x90, 0x88, 0x12, 0x00, 0xa2, 0x41, 0x09, 0x89, 0xa6, 0x40, 0x92, 0x49, + 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, 0x44, 0x09, 0x08, 0xc6, 0x10, 0x40, 0x40, 0x04, 0x27, + 0xbd, 0xbe, 0xfb, 0xc8, 0x00, 0x10, 0x00, 0x09, 0x08, 0x30, 0x12, 0x42, 0x23, 0x20, 0x04, 0x94, + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x89, 0x00, 0x64, 0x62, 0x08, 0x19, 0x18, 0x24, 0x90, + 0x07, 0xed, 0xae, 0xef, 0x90, 0x03, 0x24, 0x10, 0xa4, 0x42, 0x5c, 0x04, 0x30, 0x02, 0x49, 0x24, + 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x21, 0x32, 0x06, 0x01, 0x20, 0x4c, 0x23, 0x20, + 0x02, 0x03, 0xfe, 0x7b, 0xbe, 0x60, 0x00, 0x20, 0x80, 0x12, 0x10, 0x48, 0x41, 0x04, 0xc9, 0x90, + 0x43, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x44, 0x90, 0x94, 0x24, 0x24, 0x20, + 0x88, 0x48, 0x09, 0xb3, 0xdb, 0xf9, 0x80, 0x00, 0x08, 0x02, 0x42, 0x04, 0xb2, 0x12, 0x42, 0x02, + 0x12, 0x10, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x10, 0x4c, 0x01, 0x81, 0x32, + 0x08, 0x91, 0x00, 0x06, 0xff, 0xef, 0x78, 0xc0, 0x03, 0x20, 0x40, 0x29, 0x80, 0x98, 0x04, 0x28, + 0x32, 0x40, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x28, 0x18, + 0x1a, 0x42, 0x44, 0x20, 0x10, 0xce, 0xfd, 0x73, 0x08, 0x24, 0x24, 0x04, 0x88, 0x20, 0x64, 0x41, + 0x81, 0x81, 0x24, 0x21, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0x02, + 0x42, 0x6c, 0x12, 0x48, 0x08, 0x01, 0x63, 0xf4, 0xe6, 0x80, 0x81, 0x84, 0x00, 0x92, 0x09, 0x24, + 0x12, 0x14, 0x09, 0x21, 0x08, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, + 0x92, 0x40, 0x24, 0x81, 0x22, 0x42, 0x49, 0x33, 0x77, 0xec, 0x84, 0x1c, 0x10, 0x82, 0x44, 0xc0, + 0xda, 0x08, 0x44, 0x42, 0x48, 0x42, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, + 0x08, 0x44, 0x11, 0x32, 0x24, 0x90, 0x00, 0x02, 0x9b, 0xfd, 0xc9, 0x23, 0x34, 0x42, 0x11, 0x24, + 0x04, 0x92, 0x41, 0x21, 0x12, 0x42, 0x10, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x09, 0x23, 0x04, 0x90, 0x4e, 0x02, 0x4c, 0x2d, 0x90, 0xcb, 0xef, 0x92, 0x00, 0xe1, 0x08, 0x04, + 0x89, 0x20, 0x94, 0x12, 0x24, 0x43, 0x10, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0xc0, 0x48, 0x30, 0x84, 0x49, 0x12, 0x42, 0x02, 0x04, 0x69, 0xfb, 0xb6, 0x03, 0x88, 0x23, + 0x02, 0x20, 0x08, 0xc4, 0x02, 0x11, 0x21, 0x04, 0x21, 0x0a, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x12, 0x08, 0x82, 0x21, 0x32, 0x41, 0x32, 0x42, 0x01, 0x37, 0xdf, 0x68, 0x01, 0x82, + 0x10, 0x12, 0x44, 0x82, 0x29, 0x24, 0xc4, 0x89, 0x61, 0x08, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x02, 0x26, 0x09, 0x20, 0x46, 0x0c, 0x09, 0x10, 0x00, 0xcd, 0xfd, 0x48, 0x00, + 0xc0, 0x84, 0x44, 0x90, 0x90, 0x8a, 0x00, 0x08, 0x22, 0x12, 0x42, 0x11, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x88, 0x90, 0x64, 0x48, 0xc9, 0x20, 0xc9, 0x04, 0x00, 0x4b, 0xfe, 0x10, + 0x00, 0x50, 0x25, 0x04, 0x82, 0x04, 0x92, 0x49, 0x23, 0x22, 0x84, 0x10, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x84, 0x10, 0x82, 0x29, 0x02, 0x12, 0x20, 0x01, 0x23, 0xec, + 0xa0, 0x00, 0x44, 0x09, 0x12, 0x28, 0x60, 0x44, 0x09, 0x24, 0x49, 0x21, 0x04, 0x20, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x24, 0x86, 0x20, 0x84, 0x49, 0x24, 0x90, 0x00, 0x67, + 0xb4, 0xa0, 0x00, 0x21, 0x20, 0x12, 0x42, 0x09, 0x25, 0x22, 0x48, 0x81, 0x28, 0x61, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x10, 0x22, 0x61, 0x18, 0x92, 0x08, 0x44, 0x40, 0x00, + 0x57, 0xf4, 0x80, 0x04, 0x60, 0x46, 0x8c, 0x90, 0x80, 0x91, 0x04, 0x48, 0x92, 0x89, 0x08, 0xd8, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x81, 0x89, 0x09, 0x42, 0x62, 0x92, 0x53, 0x12, + 0x00, 0x57, 0x7d, 0x80, 0x04, 0xc8, 0x48, 0x89, 0x0c, 0x32, 0x49, 0x11, 0x12, 0x48, 0x92, 0x12, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x11, 0x12, 0x24, 0x28, 0x84, 0x88, + 0x10, 0x00, 0x6d, 0xd9, 0x00, 0x11, 0x82, 0x08, 0x49, 0x61, 0x00, 0x26, 0x49, 0x24, 0x49, 0x24, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc4, 0x91, 0x24, 0x24, + 0x89, 0x8c, 0x84, 0x2f, 0xf6, 0x00, 0x03, 0x10, 0x93, 0x26, 0x11, 0x4c, 0x90, 0x88, 0x89, 0x21, + 0x49, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x12, 0x53, + 0x22, 0x64, 0x23, 0x01, 0x37, 0xbe, 0x24, 0xac, 0x44, 0x24, 0x24, 0x94, 0x42, 0x13, 0x26, 0x49, + 0x25, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x48, + 0x98, 0x99, 0x13, 0x00, 0x48, 0x5f, 0xec, 0x00, 0x0c, 0x01, 0x09, 0x99, 0x84, 0x99, 0x24, 0x91, + 0x24, 0x91, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x89, 0x26, 0x45, 0x20, 0x91, 0x42, 0x5b, 0xfc, 0x92, 0x51, 0x28, 0x42, 0x12, 0x62, 0x25, 0x24, + 0xc1, 0x24, 0x92, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x33, 0x03, 0x44, 0xce, 0x04, 0x30, 0x37, 0xf0, 0x02, 0x70, 0x02, 0x12, 0x4c, 0x9b, 0x64, + 0xc9, 0x2c, 0x92, 0x48, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x58, 0x50, 0x92, 0x40, 0x95, 0x9f, 0xd3, 0x48, 0xc4, 0x90, 0x81, 0x26, 0xc9, + 0x1a, 0x49, 0x22, 0x49, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x04, 0x1f, 0xc8, 0x49, 0x80, 0x04, 0x24, 0x92, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x5f, 0x29, 0x27, 0x22, 0x41, 0x00, + 0x49, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x19, 0xdd, 0xa5, 0x34, 0x48, 0x10, + 0xc9, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x36, 0x54, 0xd9, 0x01, + 0x06, 0x00, 0x24, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x67, 0x9c, 0xd3, 0x92, + 0x30, 0x40, 0x24, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x99, 0x64, 0x3a, + 0x64, 0x84, 0x11, 0x21, 0x0b, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xc9, 0x25, + 0x0e, 0x40, 0x01, 0x84, 0x48, 0x48, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x26, + 0x5c, 0x47, 0x19, 0x24, 0x20, 0x82, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, + 0x20, 0x96, 0x51, 0x81, 0x08, 0x09, 0x20, 0x82, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x88, 0x26, 0x13, 0xa4, 0x42, 0x42, 0x10, 0xa9, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x46, 0x00, 0x0c, 0xa4, 0xc8, 0x10, 0x10, 0xc4, 0x24, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x11, 0x20, 0x59, 0xad, 0x92, 0x44, 0x84, 0x09, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x80, 0x1e, 0x49, 0xc1, 0x00, 0x23, 0x20, 0x52, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x80, 0xbb, 0x52, 0xc8, 0x23, 0x08, 0x24, 0x12, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xe2, 0xfb, 0x76, 0xc8, 0x88, 0x40, 0x81, 0x21, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x7f, 0xdd, 0x99, 0xa6, 0x00, 0x12, 0x10, 0x4c, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x5d, 0xd6, 0xcf, 0xb0, 0x92, 0x00, 0x44, 0x02, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xd6, 0x76, 0xf2, 0xc4, 0x90, 0xc9, 0x01, + 0x22, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xb7, 0xb9, 0x9d, 0x92, 0x44, 0x02, + 0x28, 0x18, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xac, 0xce, 0x67, 0x22, 0x11, + 0x20, 0x82, 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x6b, 0x66, 0xdb, 0x29, + 0x20, 0x08, 0x10, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x59, 0x31, 0x9b, + 0x09, 0x26, 0x42, 0x44, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x44, 0x8c, + 0x6c, 0xc0, 0x80, 0x10, 0x80, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x64, + 0x83, 0x6e, 0x32, 0x19, 0x84, 0x33, 0x22, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x92, 0x31, 0x19, 0x08, 0x40, 0x21, 0x04, 0x09, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x20, 0xc8, 0x04, 0xd1, 0x49, 0x04, 0x08, 0x40, 0xc1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x61, 0x02, 0x64, 0x44, 0x21, 0x02, 0x18, 0x10, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x24, 0x49, 0x89, 0x30, 0x88, 0x40, 0x83, 0x04, 0x90, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x98, 0x4c, 0x82, 0x0a, 0x02, 0x11, 0x20, 0x61, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x30, 0x32, 0xc9, 0x20, 0x84, 0x09, 0x18, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x83, 0x00, 0x24, 0x48, 0x20, 0x81, 0x04, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x11, 0x10, 0x88, 0x49, 0x24, 0x82, 0x08, 0x24, 0x65, 0x24, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x60, 0x02, 0x12, 0x20, 0x82, 0x00, 0x09, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x08, 0x89, 0x04, 0x90, 0x92, 0x48, 0x20, 0x92, + 0x88, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x21, 0x24, 0x84, 0x41, 0x02, 0x08, + 0x00, 0x22, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0c, 0x90, 0x21, 0x19, 0x30, + 0x82, 0x4d, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x93, 0x20, 0x22, + 0x44, 0x20, 0x90, 0x85, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x22, 0x28, 0x94, + 0x84, 0x81, 0x2c, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x28, + 0xd0, 0x10, 0x98, 0x00, 0x09, 0x02, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x41, + 0x26, 0x49, 0x12, 0x22, 0x40, 0x20, 0x49, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x04, 0xb3, 0x24, 0x42, 0x42, 0x49, 0x02, 0x11, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x24, 0x99, 0x30, 0x08, 0x48, 0x00, 0x00, 0x84, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x62, 0x11, 0x00, 0xc2, 0x21, 0x24, 0x90, 0x90, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x82, 0x4e, 0x40, 0x84, 0x84, 0x04, 0x04, 0x08, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x08, 0x28, 0x01, 0x08, 0x10, 0x30, 0x61, 0x21, 0x09, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x43, 0x20, 0x22, 0x43, 0x02, 0x08, 0x08, 0x41, 0x24, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x10, 0x24, 0x80, 0x08, 0x48, 0x82, 0x42, 0x44, 0x24, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x04, 0x80, 0x11, 0x20, 0x48, 0x20, 0x10, 0x90, 0x88, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x60, 0x62, 0x12, 0x44, 0x04, 0x83, 0x0c, 0x84, 0x08, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x89, 0x00, 0x00, 0x90, 0x24, 0x40, 0x21, + 0x22, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x82, 0x04, 0x64, 0x92, 0x02, 0x10, 0x12, + 0x48, 0x88, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x43, 0x00, 0x00, 0x48, 0x92, + 0x90, 0x82, 0x24, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x18, 0x12, 0x48, 0x00, + 0x20, 0x84, 0x21, 0x20, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x21, 0x00, 0x02, + 0x24, 0x49, 0x24, 0x0c, 0x49, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x14, 0x05, 0x24, + 0x90, 0x81, 0x02, 0x21, 0x80, 0x48, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0xc4, + 0x00, 0x00, 0x10, 0x24, 0x88, 0x23, 0x12, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, + 0x13, 0x12, 0x49, 0x04, 0x80, 0x24, 0x08, 0x40, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x85, 0x02, 0x40, 0x00, 0x40, 0x19, 0x13, 0x20, 0x88, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x20, 0x49, 0x09, 0x24, 0x12, 0x41, 0x12, 0x0c, 0x82, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x12, 0x13, 0x00, 0x01, 0x00, 0x04, 0x41, 0xd3, 0x20, 0x12, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x84, 0x82, 0x24, 0x90, 0x49, 0x20, 0x48, 0x44, 0x09, 0x01, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x22, 0x00, 0x04, 0x00, 0x09, 0x02, 0x04, 0x00, 0x48, 0x48, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x0b, 0x12, 0x41, 0x24, 0x82, 0x20, 0x90, 0x92, 0x02, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0x0a, 0x40, 0x10, 0x00, 0x20, 0x88, 0x06, 0x00, 0x92, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x62, 0x09, 0x04, 0x92, 0x08, 0x12, 0x40, 0x48, + 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x83, 0x00, 0x40, 0x00, 0x82, 0x40, 0x12, + 0x02, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x12, 0x24, 0x12, 0x48, 0x21, 0x09, + 0x02, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x46, 0x01, 0x00, 0x02, 0x08, + 0x20, 0x48, 0x99, 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, 0x03, 0x18, 0xc9, 0x20, + 0x82, 0x26, 0x42, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf2, 0x02, 0x12, + 0x4c, 0x64, 0x91, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xfe, 0x80, + 0x00, 0x01, 0x09, 0x00, 0x05, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x6f, + 0xff, 0xed, 0x90, 0x00, 0x6e, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0x6d, 0xbf, 0xff, 0xdf, 0xb6, 0xdb, 0xef, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x19, 0x27, 0xfe, 0xef, 0xfe, 0xf6, 0xfe, 0xff, 0xbe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xd8, 0x93, 0xfb, 0xfb, 0xbb, 0xdb, 0xb6, 0xf7, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x26, 0x76, 0xdd, 0xbe, 0xff, 0xef, 0xff, 0xff, 0xdf, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x26, 0x6d, 0xb7, 0xfd, 0x6d, 0xbf, 0xed, 0xfb, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x99, 0xa6, 0xfd, 0xfd, 0xb4, 0xcb, 0x7f, 0x6f, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xcb, 0x32, 0x5f, 0xf6, 0xd6, 0x7b, 0x5b, 0xfd, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x60, 0x49, 0x2f, 0xfe, 0x5b, 0xb4, 0xdb, 0xb7, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xbf, 0x49, 0xa6, 0xf9, 0x62, 0x07, 0xb6, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xfe, 0x59, 0xf3, 0x0d, 0xd8, + 0x2d, 0x9b, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x56, 0xfe, 0x5b, 0x74, 0x90, + 0x66, 0xc9, 0xed, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xdb, 0x6f, 0xce, 0xd9, + 0xf6, 0x24, 0x92, 0x6d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x2b, 0x6b, 0xf3, + 0xdb, 0xff, 0xf9, 0x36, 0x1b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x99, 0xbb, 0xbb, + 0x7c, 0xf7, 0x9b, 0xdf, 0xc1, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x66, 0xcc, + 0xdd, 0xdf, 0x3e, 0xec, 0xd6, 0xf8, 0x64, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xda, + 0x67, 0x77, 0x77, 0xdb, 0x36, 0x76, 0xbf, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x9b, 0x79, 0xb6, 0xff, 0xfd, 0xd3, 0x99, 0xa7, 0x92, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x25, 0x9b, 0xbb, 0xad, 0xe6, 0x5b, 0x6d, 0xf9, 0xf2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x32, 0xec, 0xcc, 0xcf, 0x7f, 0x7b, 0x6c, 0xcd, 0x5e, 0x7c, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0x9b, 0x6d, 0xf5, 0xdb, 0xcd, 0xa6, 0xb3, 0x57, 0x9f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6d, 0xb3, 0x33, 0x3d, 0xfe, 0xd4, 0xb3, 0x36, 0xd9, 0xef, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x6c, 0xde, 0xcf, 0x6f, 0x36, 0xd9, 0xcc, 0xee, 0x69, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0x4d, 0xb3, 0xf6, 0xfb, 0xeb, 0x4c, 0xdb, 0x33, 0xbf, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0xb3, 0x3c, 0x77, 0xbe, 0x99, 0x66, 0x66, 0xdd, 0xb6, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb5, 0xbb, 0xcf, 0x9d, 0xee, 0xe6, 0xb7, 0x34, 0xcd, + 0x66, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd6, 0xcc, 0xf3, 0xed, 0xfb, 0x6e, 0x99, 0x9b, + 0x73, 0x7b, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7a, 0x77, 0x3c, 0x7b, 0x7d, 0x99, 0xcc, + 0xcb, 0x5e, 0xdb, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xaf, 0xb7, 0xcf, 0x9f, 0xdd, 0xf6, + 0x76, 0xf6, 0xdb, 0x9c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xb5, 0xb9, 0xf3, 0xed, 0xf6, + 0x57, 0x33, 0x35, 0xb2, 0xe7, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xdd, 0xce, 0x7c, 0xf7, + 0x7b, 0xd9, 0xcd, 0x9d, 0xb6, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xdb, 0x77, 0x9f, + 0x3f, 0xdb, 0x6e, 0xdc, 0xe6, 0xdd, 0x9d, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x6e, 0xd9, + 0xe7, 0xcd, 0xf6, 0xee, 0xb3, 0x7b, 0x6d, 0xb7, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x6d, + 0xbe, 0x79, 0xff, 0x76, 0xb3, 0xbf, 0x4d, 0xb6, 0xec, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xb7, 0x67, 0x9e, 0x73, 0xdd, 0xbd, 0xcd, 0xf6, 0xdb, 0x6f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xdb, 0x7b, 0xe7, 0x9e, 0xf7, 0x6d, 0x76, 0x9b, 0x6d, 0xb3, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x6d, 0x9c, 0xf9, 0xff, 0xbb, 0x6f, 0x76, 0xed, 0xb6, 0xdf, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x6d, 0xe7, 0x3f, 0x6d, 0xed, 0xb3, 0x9b, 0x6d, 0xb6, 0xdd, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xb6, 0x7f, 0xcd, 0xbf, 0x7d, 0xbc, 0xed, 0xb6, 0xdb, 0xb7, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xb7, 0x99, 0xf6, 0xdb, 0xf6, 0xcf, 0x76, 0xde, 0xde, 0xf7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xee, 0x76, 0xf7, 0xf6, 0xfb, 0x9e, 0xdb, 0x76, 0xdd, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x7b, 0x9f, 0xbf, 0xdb, 0x6c, 0xeb, 0x6d, 0xb7, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdf, 0xf9, 0xee, 0xdb, 0x6f, 0x7b, 0x6d, + 0xb9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xf6, 0xef, 0x7e, 0xef, 0xb3, 0x9d, + 0xb6, 0xcf, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xff, 0xff, 0xf3, 0x26, 0xde, + 0xe6, 0xdb, 0x7d, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x19, 0xb6, 0x9d, 0xd3, + 0xdb, 0x7b, 0x6d, 0xd7, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xb3, 0xed, + 0x41, 0xfd, 0xdd, 0xb6, 0xdf, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xb6, 0xcc, + 0x66, 0x01, 0xb7, 0xf7, 0xdb, 0x7b, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x99, + 0x6d, 0x98, 0x01, 0xbf, 0x7e, 0xff, 0xee, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x23, 0x20, 0x00, 0xdb, 0xdb, 0xb6, 0xfa, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x98, 0x40, 0x01, 0x56, 0xdf, 0xff, 0x9b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x64, 0xa4, 0xc9, 0xb5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x36, 0x6c, 0xcc, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x5b, 0x36, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc9, 0x93, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x69, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2ef97d4 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,261 @@ +#include +#include +#include +#include +#include +#include "image.h" + +// Display SPI pins (custom pins for XteinkX4, not hardware SPI defaults) +#define EPD_SCLK 8 // SPI Clock +#define EPD_MOSI 10 // SPI MOSI (Master Out Slave In) +#define EPD_CS 21 // Chip Select +#define EPD_DC 4 // Data/Command +#define EPD_RST 5 // Reset +#define EPD_BUSY 6 // Busy + +// Button pins (ADC resistor ladders) +#define BTN_GPIO1 1 // 4 buttons: Back, Confirm, Left, Right +#define BTN_GPIO2 2 // 2 buttons: Volume Up, Volume Down + +// Button enum +enum Button +{ + NONE = 0, + RIGHT, + LEFT, + CONFIRM, + BACK, + VOLUME_UP, + VOLUME_DOWN +}; + +// Display command enum +enum DisplayCommand +{ + DISPLAY_NONE = 0, + DISPLAY_HEADER, + DISPLAY_TEXT, + TOGGLE_IMAGE +}; + +// Button ADC thresholds +const int BTN_THRESHOLD = 100; // Threshold tolerance +const int BTN_RIGHT_VAL = 3; +const int BTN_LEFT_VAL = 1470; +const int BTN_CONFIRM_VAL = 2655; +const int BTN_BACK_VAL = 3470; +const int BTN_VOLUME_DOWN_VAL = 3; +const int BTN_VOLUME_UP_VAL = 2205; + +// Get button name as string +const char *getButtonName(Button btn) +{ + switch (btn) + { + case NONE: + return "Press any button"; + case RIGHT: + return "RIGHT pressed!"; + case LEFT: + return "LEFT pressed!"; + case CONFIRM: + return "CONFIRM pressed!"; + case BACK: + return "BACK pressed!"; + case VOLUME_UP: + return "VOLUME UP pressed!"; + case VOLUME_DOWN: + return "VOLUME DOWN pressed!"; + default: + return ""; + } +} + +// Get currently pressed button by reading ADC values +Button GetPressedButton() +{ + int btn1 = analogRead(BTN_GPIO1); + int btn2 = analogRead(BTN_GPIO2); + + // Check BTN_GPIO1 (4 buttons on resistor ladder) + if (btn1 < BTN_RIGHT_VAL + BTN_THRESHOLD) + { + return RIGHT; + } + else if (btn1 < BTN_LEFT_VAL + BTN_THRESHOLD) + { + return LEFT; + } + else if (btn1 < BTN_CONFIRM_VAL + BTN_THRESHOLD) + { + return CONFIRM; + } + else if (btn1 < BTN_BACK_VAL + BTN_THRESHOLD) + { + return BACK; + } + + // Check BTN_GPIO2 (2 buttons on resistor ladder) + if (btn2 < BTN_VOLUME_DOWN_VAL + BTN_THRESHOLD) + { + return VOLUME_DOWN; + } + else if (btn2 < BTN_VOLUME_UP_VAL + BTN_THRESHOLD) + { + return VOLUME_UP; + } + + return NONE; +} + +// GxEPD2 display - Using GxEPD2_426_GDEQ0426T82 +// Note: XteinkX4 has 4.26" 800x480 display +GxEPD2_BW display(GxEPD2_426_GDEQ0426T82(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY)); + +// FreeRTOS task for non-blocking display updates +TaskHandle_t displayTaskHandle = NULL; +volatile DisplayCommand displayCommand = DISPLAY_NONE; +volatile Button currentPressedButton = NONE; +volatile bool imageVisible = false; + +// Display update task running on separate core +void displayUpdateTask(void *parameter) +{ + while (1) + { + if (displayCommand != DISPLAY_NONE) + { + DisplayCommand cmd = displayCommand; + displayCommand = DISPLAY_NONE; + + if (cmd == DISPLAY_HEADER) + { + // Use full window for initial welcome screen with header + display.setFullWindow(); + display.firstPage(); + do + { + display.fillScreen(GxEPD_WHITE); + + // Header font + display.setFont(&FreeMonoBold18pt7b); + display.setCursor(20, 50); + display.print("XteinkX4 Sample"); + + // Button text with smaller font + display.setFont(&FreeMonoBold12pt7b); + display.setCursor(20, 100); + display.print(getButtonName(currentPressedButton)); + } while (display.nextPage()); + } + else if (cmd == DISPLAY_TEXT) + { + // Use partial refresh for text updates + display.setPartialWindow(0, 75, display.width(), 150); + display.firstPage(); + do + { + display.fillScreen(GxEPD_WHITE); + display.setFont(&FreeMonoBold12pt7b); + display.setCursor(20, 100); + display.print(getButtonName(currentPressedButton)); + } while (display.nextPage()); + } + else if (cmd == TOGGLE_IMAGE) + { + // Toggle image visibility and use partial refresh + imageVisible = !imageVisible; + display.setPartialWindow(20, 150, 263, 280); + display.firstPage(); + do + { + if (imageVisible) + { + display.drawBitmap(20, 150, dr_mario, 263, 280, GxEPD_BLACK); + } + else + { + display.fillRect(20, 150, 263, 280, GxEPD_WHITE); + } + } while (display.nextPage()); + } + } + vTaskDelay(10 / portTICK_PERIOD_MS); + } +} + +void setup() +{ + Serial.begin(115200); + + // Wait for serial monitor + unsigned long start = millis(); + while (!Serial && (millis() - start) < 3000) + { + delay(10); + } + + Serial.println("\n================================="); + Serial.println(" xteink x4 sample"); + Serial.println("================================="); + Serial.println(); + + // Initialize button pins + pinMode(BTN_GPIO1, INPUT); + pinMode(BTN_GPIO2, INPUT); + + // Initialize SPI with custom pins + SPI.begin(EPD_SCLK, -1, EPD_MOSI, EPD_CS); + + // Initialize display + display.init(115200); + + // Setup display properties + display.setRotation(3); // 270 degrees + display.setTextColor(GxEPD_BLACK); + + Serial.println("Display initialized"); + + // Draw initial welcome screen + currentPressedButton = NONE; + displayCommand = DISPLAY_HEADER; + + // Create display update task on core 0 (main loop runs on core 1) + xTaskCreatePinnedToCore(displayUpdateTask, // Task function + "DisplayUpdate", // Task name + 4096, // Stack size + NULL, // Parameters + 1, // Priority + &displayTaskHandle, // Task handle + 0 // Core 0 + ); + + Serial.println("Display task created"); + Serial.println("Setup complete!\n"); +} + +void loop() +{ + static Button lastButton = NONE; + Button currentButton = GetPressedButton(); + + // Detect button press (transition from NONE to a button) + if (currentButton != NONE && lastButton == NONE) + { + Serial.print("Button: "); + Serial.println(getButtonName(currentButton)); + currentPressedButton = currentButton; + + if (currentButton == CONFIRM) + { + displayCommand = TOGGLE_IMAGE; + } + else + { + displayCommand = DISPLAY_TEXT; + } + } + + lastButton = currentButton; + delay(50); +}