diff --git a/Documentation/Grow Controller EL System Diagram.vsdx b/Documentation/Grow Controller EL System Diagram.vsdx index aefcd1d..de0975b 100644 Binary files a/Documentation/Grow Controller EL System Diagram.vsdx and b/Documentation/Grow Controller EL System Diagram.vsdx differ diff --git a/Firmware/DNSServer.cpp b/Firmware/DNSServer.cpp new file mode 100644 index 0000000..d1d8967 --- /dev/null +++ b/Firmware/DNSServer.cpp @@ -0,0 +1,143 @@ +#include "./DNSServer.h" +#include +#include + +#define DEBUG +#define DEBUG_OUTPUT Serial + +DNSServer::DNSServer() { + _ttl = htonl(60); + _errorReplyCode = DNSReplyCode::NonExistentDomain; +} + +bool DNSServer::start(const uint16_t &port, const String &domainName, + const IPAddress &resolvedIP) { + _port = port; + _domainName = domainName; + _resolvedIP[0] = resolvedIP[0]; + _resolvedIP[1] = resolvedIP[1]; + _resolvedIP[2] = resolvedIP[2]; + _resolvedIP[3] = resolvedIP[3]; + downcaseAndRemoveWwwPrefix(_domainName); + return _udp.begin(_port) == 1; +} + +void DNSServer::setErrorReplyCode(const DNSReplyCode &replyCode) { + _errorReplyCode = replyCode; +} + +void DNSServer::setTTL(const uint32_t &ttl) { + _ttl = htonl(ttl); +} + +void DNSServer::stop() { + _udp.stop(); +} + +void DNSServer::downcaseAndRemoveWwwPrefix(String &domainName) { + domainName.toLowerCase(); + domainName.replace("www.", ""); +} + +void DNSServer::processNextRequest() { + _currentPacketSize = _udp.parsePacket(); + if (_currentPacketSize) { + _buffer = (unsigned char*) malloc(_currentPacketSize * sizeof(char)); + _udp.read(_buffer, _currentPacketSize); + _dnsHeader = (DNSHeader*) _buffer; + + if (_dnsHeader->QR == DNS_QR_QUERY && + _dnsHeader->OPCode == DNS_OPCODE_QUERY && + requestIncludesOnlyOneQuestion() && + (_domainName == "*" || getDomainNameWithoutWwwPrefix() == _domainName) + ) { + replyWithIP(); + } else if (_dnsHeader->QR == DNS_QR_QUERY) { + replyWithCustomCode(); + } + + free(_buffer); + } +} + +bool DNSServer::requestIncludesOnlyOneQuestion() { + return ntohs(_dnsHeader->QDCount) == 1 && + _dnsHeader->ANCount == 0 && + _dnsHeader->NSCount == 0 && + _dnsHeader->ARCount == 0; +} + +String DNSServer::getDomainNameWithoutWwwPrefix() { + String parsedDomainName = ""; + unsigned char *start = _buffer + 12; + if (*start == 0) { + return parsedDomainName; + } + int pos = 0; + while (true) { + unsigned char labelLength = *(start + pos); + for (int i = 0; i < labelLength; i++) { + pos++; + parsedDomainName += (char)*(start + pos); + } + pos++; + if (*(start + pos) == 0) { + downcaseAndRemoveWwwPrefix(parsedDomainName); + return parsedDomainName; + } else { + parsedDomainName += "."; + } + } +} + +void DNSServer::replyWithIP() { + _dnsHeader->QR = DNS_QR_RESPONSE; + _dnsHeader->ANCount = _dnsHeader->QDCount; + _dnsHeader->QDCount = _dnsHeader->QDCount; + //_dnsHeader->RA = 1; + + _udp.beginPacket(_udp.remoteIP(), _udp.remotePort()); + _udp.write(_buffer, _currentPacketSize); + + _udp.write((uint8_t) 192); // answer name is a pointer + _udp.write((uint8_t) 12); // pointer to offset at 0x00c + + _udp.write((uint8_t) 0); // 0x0001 answer is type A query (host address) + _udp.write((uint8_t) 1); + + _udp.write((uint8_t) 0); //0x0001 answer is class IN (internet address) + _udp.write((uint8_t) 1); + + _udp.write((unsigned char*) &_ttl, 4); + + // Length of RData is 4 bytes (because, in this case, RData is IPv4) + _udp.write((uint8_t) 0); + _udp.write((uint8_t) 4); + _udp.write(_resolvedIP, sizeof(_resolvedIP)); + _udp.endPacket(); + + + + #ifdef DEBUG + DEBUG_OUTPUT.print("DNS responds: "); + DEBUG_OUTPUT.print(_resolvedIP[0]); + DEBUG_OUTPUT.print("."); + DEBUG_OUTPUT.print(_resolvedIP[1]); + DEBUG_OUTPUT.print("."); + DEBUG_OUTPUT.print(_resolvedIP[2]); + DEBUG_OUTPUT.print("."); + DEBUG_OUTPUT.print(_resolvedIP[3]); + DEBUG_OUTPUT.print(" for "); + DEBUG_OUTPUT.println(getDomainNameWithoutWwwPrefix()); + #endif +} + +void DNSServer::replyWithCustomCode() { + _dnsHeader->QR = DNS_QR_RESPONSE; + _dnsHeader->RCode = (unsigned char) _errorReplyCode; + _dnsHeader->QDCount = 0; + + _udp.beginPacket(_udp.remoteIP(), _udp.remotePort()); + _udp.write(_buffer, sizeof(DNSHeader)); + _udp.endPacket(); +} diff --git a/Firmware/DNSServer.h b/Firmware/DNSServer.h new file mode 100644 index 0000000..f5bab4e --- /dev/null +++ b/Firmware/DNSServer.h @@ -0,0 +1,68 @@ +#ifndef DNSServer_h +#define DNSServer_h +#include + +#define DNS_QR_QUERY 0 +#define DNS_QR_RESPONSE 1 +#define DNS_OPCODE_QUERY 0 + +enum class DNSReplyCode { + NoError = 0, + FormError = 1, + ServerFailure = 2, + NonExistentDomain = 3, + NotImplemented = 4, + Refused = 5, + YXDomain = 6, + YXRRSet = 7, + NXRRSet = 8 +}; + +struct DNSHeader { + uint16_t ID; // identification number + unsigned char RD : 1; // recursion desired + unsigned char TC : 1; // truncated message + unsigned char AA : 1; // authoritive answer + unsigned char OPCode : 4; // message_type + unsigned char QR : 1; // query/response flag + unsigned char RCode : 4; // response code + unsigned char Z : 3; // its z! reserved + unsigned char RA : 1; // recursion available + uint16_t QDCount; // number of question entries + uint16_t ANCount; // number of answer entries + uint16_t NSCount; // number of authority entries + uint16_t ARCount; // number of resource entries +}; + +class DNSServer { +public: + DNSServer(); + void processNextRequest(); + void setErrorReplyCode(const DNSReplyCode &replyCode); + void setTTL(const uint32_t &ttl); + + // Returns true if successful, false if there are no sockets available + bool start(const uint16_t &port, + const String &domainName, + const IPAddress &resolvedIP); + // stops the DNS server + void stop(); + +private: + WiFiUDP _udp; + uint16_t _port; + String _domainName; + unsigned char _resolvedIP[4]; + int _currentPacketSize; + unsigned char* _buffer; + DNSHeader* _dnsHeader; + uint32_t _ttl; + DNSReplyCode _errorReplyCode; + + void downcaseAndRemoveWwwPrefix(String &domainName); + String getDomainNameWithoutWwwPrefix(); + bool requestIncludesOnlyOneQuestion(); + void replyWithIP(); + void replyWithCustomCode(); +}; +#endif diff --git a/Firmware/Firmware.ino b/Firmware/Firmware.ino new file mode 100644 index 0000000..e94dc66 --- /dev/null +++ b/Firmware/Firmware.ino @@ -0,0 +1,847 @@ +/// +/// +/// Grow Controller +/// +/// +/// The beginnings of a WiFi accessible switch. +/// +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + + +// Application includes +#include "./DNSServer.h" // Patched lib +#include "WiFiConfiguration.h" +#include "Web_RootPage.h" +#include "Web_RSSIGraph.h" +#include "Web_FavIcon.h" +#include "Web_APConfig.h" +#include "ProjGlobals.h" +#include "Web_Resources.h" +#include "GrowController.h" // APIs available in this (.ino) file +#include "fauxmoESP.h" + + +// If there is no hardware, such as with an ESP-01 module only, +// set this. Then it won't loop through reset constantly, and +// other behaviors that will be determined. +#define HW_SIMULATE + +// SW Update Deployment instructions: +// +// 1) If any resources changed, rebuild Web_Resources.h +// 2) Update this version number +// 3) Build the binary +// 4) Rename the .bin to match the version (e.g. GrowController v1.02.12.bin) +// 5) Move the product (.bin) to the server location +// 6) Update the PHP script on the server to match this version (if it does not auto-adapt) +// 7) Visit the node's web page and initiate an update, or let it check on its own cycle +// +const String MyVer = "GrowController v2.00.11"; ///< Compared to the server version for SW Updates +#define UPDATE_INTERVAL (12 * 60 * 60 * 1000) ///< Check once every 12 hours +bool swUpdateInProcess = false; ///< Status of an update to keep the relays from running + +// ESP12-E pinout Version 2 +// +// +------------------+ +// | __ __ _____ | +// | | |_| |_| | +// | |__________ | +// |__________________| +// Reset | !Reset Tx | Tx +// Current | ADC Rx | Rx +// Prog En | CHPD-EN GPIO5 | FAULT +// SW_RESET | GPIO16 GPIO4 | SW_TOGGLE +// OLED SCL | GPIO14 GPIO0 | +// RLY Set2 | GPIO12 GPIO2 | OLED SDA +// RLY Set1 | GPIO13 GPIO15 | Pull-down +// | Vcc Gnd | +// +------------------+ + +// ESP12-E pinout Version 1 +// +// +------------------+ +// | __ __ _____ | +// | | |_| |_| | +// | |__________ | +// |__________________| +// Reset | !Reset Tx | Tx +// Current | ADC Rx | Rx +// Prog En | CHPD-EN GPIO5 | +// SW_RESET | GPIO16 GPIO4 | SW_TOGGLE +// RLY Set2 | GPIO14 GPIO0 | +// LED On | GPIO12 GPIO2 | +// RLY Set1 | GPIO13 GPIO15 | LED WiFi +// | Vcc Gnd | +// +------------------+ + +// +-------------+ +// SW_RESET ---+----|(----------->| WiFiConfig |-----> LED_WIFI +// | | | +// | | |-----> isStationMode +// | |-------------| +// +----|>o---------->| Timer | +// | |-----> Factory Reset +// RESET_MS --------------------->| | +// +-------------+ +// +#define SW_RESET 16 ///< The local reset switch +#define RESET_MS 8000 ///< Hold Reset for this long to factory reset +#define LED_WIFI 15 ///< The Pin controlling the WiFi on LED +bool isStationMode = false; ///< Tracks if the WiFi is in station mode + +// WiFI LED Duty Cycle +// +// |******* | AP Mode +// |************************* | Joining AP +// |************************************************ | Joined +// | | | | | | +// 0 100 200 300 400 500ms +// +#define LED_APMODE__MS 80 +#define LED_JOINING_MS 250 +#define LED_JOINED__MS 490 +#define LED_PERIOD__MS 500 + +// __ // +// | \ // +// onRef ------------------------------|- \ +-----------+ // +// | +-----| S Q |--+--> CurrStatus // +// +--------|+ / | | | // +// +---------+ | |__/ +--| R !Q | +--> LED_ON // +// ANA_IN --+--->| average |----+-->iRawSum/X | +-----------+ // +// | +---------+ | __ | // +// | | | \ | // +// +--> iRaw +--------|- \ | // +// | +--+ // +// offRef ------------------------------|+ / // +// |__/ // +// +#define ANA_IN A0 ///< The Analog input signal +#define SENSE_SAMPLE_MS 20 ///< The Sample rate for the analog input +#define AVG_RATIO 64 ///< Average Ratio (new is 1/AVG_RATIO of old) +#define LED_ON 12 ///< The load-on indicating LED +int32_t iRaw; ///< The raw sampled value +int32_t iRawSum; ///< The Averaged Sum of Raw Samples +bool CurrStatus = false; ///< Track the current sense indication of power on/off + + +// _ +------------------+ +// Turn On -------------| \____ | +-----------+ | +// +--|>o--|_/ | _ +-->| D !Q |--+ +// CurrStatus --| and +-------->) \ | | +// | _ +-------->) +--->| ck Q |--------> RelayState +// +-------| \____| +---->)_/ +-----------+ +// Turn Off-------------|_/ | or +// and | +// SW_TOGGLE ----|>o---------------+ +// +#define SW_TOGGLE 4 ///< The local toggle switch +bool RelayState = false; ///< The current tracked relay drive state + +// +-----------+ +// | _ _ | +// | _/ _| |_ |--------> Relay Set +// RelayState ---------------------------------->| _ _ | +// | \_ _| |_ |--------> Relay Reset +// | | +// +-----------+ +// +#define RELAY_PULSE_MS 15 ///< Duration of a pulse +#define RLY_SET1 13 ///< The set-pin for the relay +#define RLY_SET2 14 ///< The reset-pin for the relay + +// Timing: +// +// | | | | | +// _________________________ +// 3WaySwitch ____________________/ \__________________ +// | | |b->| | |b->| +// ______________________ +// RelayState __________/ \______________________ +// | |a->| | |a->| | +// | | | | | +// +++++++ ++++++++++ +// +++ +++ +++ +++ +// AnalogIn ++++++++++++ ++++++++++ +++++++++++++++ +// | | | | | +// CurrStatus |Off |On |Off |On |Off +// +// a) Locally applied change in load to filtered AnalogIn delay +// b) Externally applied change in load to filtered AnalogIn delay +// + +bool DebugValue; ///< Makes it chatty while running + +const byte DNS_PORT = 53; ///< Capture DNS requests on port 53 +IPAddress apIP(192,168,4,1); ///< Private network for server +DNSServer dnsServer; ///< Create the DNS object + +ESP8266WebServer server(80); ///< For the user experience +fauxmoESP fauxmo; ///< For the WEMO emulator +ConfigManager wifiConfig; ///< Track various configuration items + +ESP8266HTTPUpdate Updater; +bool updateCheck = false; ///< Set when a SW update check is pending + +uint16_t autoOffTimer; ///< When the output is turned on, this is set to timeout in seconds + +// local functions +void WiFiStateHandler(); ///< WiFi interface manager +void StartWebServer(); ///< Activate the web server +void HandleNotFound(); ///< Webpage for not-found URL +void ProcessAutoOff(bool init = false); ///< Process the auto-off timer + +String AP_SSID = "GrowController"; ///< When in Access Point, this is the prefix +void GetMac(); +String macToStr(const uint8_t* mac); ///< Create C++ String with the mac +String clientMac = ""; ///< Hosts the MAC to easily identify this node + + +// =========================================================================== +typedef enum { + WFC_ConnectToAP, + WFC_JoiningAP, + WFC_JoinedAP, + WFC_CreateAP, + WFC_HostingAP, +} WiFiConnectState; +WiFiConnectState wifiConState; ///< Track the current WiFi state + +void SetLED(int pin, int state) { + digitalWrite(pin, state); + if (pin == LED_WIFI) + ; // Serial.printf("SET LED_WIFI to %d\n", state); + else if (pin == LED_ON) + Serial.printf("SET LED_ON to %d\n", state); + else + Serial.printf("***** ERROR setting LED pin %d to %d\n", pin, state); +} + +void ResetMonitor(bool init = false) { + static unsigned long timeAtReset; + static bool monitorActive; + + if (init) { + timeAtReset = millis(); + monitorActive = true; + } else if (monitorActive) { + int sw_state = digitalRead(SW_RESET); + #ifdef HW_SIMULATE + sw_state = 1; + #endif + if (sw_state == 1) { + // not pressed + monitorActive = false; + } else if ((millis() - timeAtReset) > RESET_MS) { + // reset has been held long enough + FactoryReset(true); + } + } +} + +// +// Average the new sample by summation with 7/8 of the running Sum. +// +void ProcessCurrentSense() { + static unsigned long last = millis(); + unsigned long now = millis(); + + if (now - last > SENSE_SAMPLE_MS) { + last = now; + iRaw = analogRead(ANA_IN); // 1023 = 1.0v + iRawSum = iRawSum - (iRawSum / AVG_RATIO) + iRaw; // Now have running avg. + if (DebugValue) + Serial.printf("Sample: %d, rawSum: %d, relay: %d (%d%d), \n", + iRaw, iRawSum, RelayState, digitalRead(RLY_SET1), digitalRead(RLY_SET2)); + if (iRawSum / AVG_RATIO > wifiConfig.getOnRef() && !CurrStatus) { + CurrStatus = true; + SetLED(LED_ON, 1); + ProcessAutoOff(true); + autoOffTimer = wifiConfig.getAutoOff(); // if zero, we do nothing... + Serial.printf("Auto Off Timer set to %d\n", autoOffTimer); + } else if (iRawSum / AVG_RATIO < wifiConfig.getOffRef() && CurrStatus) { + CurrStatus = false; + SetLED(LED_ON, 0); + } + } +} + +// _______ ___ __ _______ +// Press \_________________________/ \___/ \___/ +// | | +// v v +// _ _ +// Toggle _______/ \____________.............../ \______________.... +// +// Sample | | | | | ... +// Block |---- 80 ms ---| |---- 80 ms -----| +#define Block_ms 800 +#define SAMPL_ms 100 +void ProcessToggleSw() { + static unsigned long last = millis(); + static bool lastSWState = false; + static uint8_t blockTics; + unsigned long now = millis(); + + if (now - last > SAMPL_ms) { + last = now; + if (blockTics) { + blockTics--; + return; + } + bool swState = !digitalRead(SW_TOGGLE); // active low is pressed. + if (DebugValue) + Serial.printf("Sample: %d, rawSum: %d, relay: %d (%d%d), sw: %d\n", + iRaw, iRawSum, RelayState, digitalRead(RLY_SET1), digitalRead(RLY_SET2), swState); + if (swState != lastSWState && swState == true) { + Serial.printf("Toggle pushed\n"); + blockTics = Block_ms / SAMPL_ms; + SetCircuit(CMD_Toggle); + } + lastSWState = swState; + } +} + +// Drive Relay controls pulsing either the set or the reset pin +// +// If the control signal changes, then it will generate a pulse on the +// appropriate relay driver pin, ensuring that the alternate pin is +// first off. +// +// This API is also called periodically, which permits it to then +// time and auto-off any active control pin. +// +// @param i can be -1 for timing, 0 to drive one relay pin, 1 to drive the other. +// +void DriveRelay(int i = -1) { + static int currentSignal = -1; + static bool isActive = false; + static unsigned long timeSet = 0; + + if (swUpdateInProcess) + i = 2; + + switch (i) { + case -1: + // Any active timing to process + if (isActive && (millis() - timeSet > RELAY_PULSE_MS)) { + digitalWrite(RLY_SET1, LOW); + digitalWrite(RLY_SET2, LOW); + isActive = false; + } + break; + case 0: + if (i != currentSignal) { + currentSignal = i; + digitalWrite(RLY_SET2, LOW); // Turn off the alternate + digitalWrite(RLY_SET1, HIGH); + timeSet = millis(); + isActive = true; + } + break; + case 1: + if (i != currentSignal) { + currentSignal = i; + digitalWrite(RLY_SET1, LOW); // Turn off the alternate + digitalWrite(RLY_SET2, HIGH); + timeSet = millis(); + isActive = true; + } + break; + case 2: + default: + // Error, or the force-off state + digitalWrite(RLY_SET1, LOW); // Turn off the elements + digitalWrite(RLY_SET2, LOW); + isActive = false; + break; + } +} + +void ProcessNameChange() { + char xName[CFG_NAMESIZE]; + + fauxmo.getDeviceName(0, xName, CFG_NAMESIZE); + if (0 != strcmp(wifiConfig.getName().c_str(), xName)) { + fauxmo.renameDevice(0, wifiConfig.getName().c_str()); + } +} + +void ProcessSWUpdate() { + static unsigned long lastCheck; + unsigned long nowCheck = millis(); + + if ((nowCheck - lastCheck) > (UPDATE_INTERVAL)) { + lastCheck = nowCheck; + updateCheck = true; + } + if (updateCheck) { + WiFiClient wifiClient; + swUpdateInProcess = true; + Serial.printf("SW Update start '%s'...\n", wifiConfig.getURL().c_str()); + t_httpUpdate_return swRet = Updater.update(wifiClient, wifiConfig.getURL(), MyVer); + switch (swRet) { + default: + case HTTP_UPDATE_FAILED: + Serial.printf("SW Update - failed.\n"); + Serial.printf("Error: %s\n", Updater.getLastErrorString().c_str()); + delay(100); + ESP.restart(); + break; + case HTTP_UPDATE_NO_UPDATES: + Serial.printf("SW Update - no updates.\n"); + break; + case HTTP_UPDATE_OK: + Serial.printf("SW Update - update ok.\n"); + break; + } + swUpdateInProcess = false; + updateCheck = false; + Serial.printf("SW Update - process end.\n"); + } +} + +void ProcessConsole() { + if (Serial.available()) { + int ch = Serial.read(); + Serial.printf("Serial.available() => %d\n", ch); + switch (ch) { + case '0': + iRawSum = 10; + break; + case '1': + iRawSum = 1000; + break; + case 'd': + DebugValue = !DebugValue; + break; + case 'u': + updateCheck = true; + break; + case '\x0D': // Ignore + break; + case '?': + default: + DebugValue = false; + Serial.printf("Commands:\n"); + Serial.printf(" 0|1 Off or On (by forcing rawSum\n"); + Serial.printf(" d Debug toggle\n"); + Serial.printf(" u update check\n"); + break; + } + } + static unsigned long last = millis(); + if (millis() - last > 5000) { + static uint32_t refFreeHeap; + uint32_t freeHeap = ESP.getFreeHeap(); + last = millis(); + if (freeHeap != refFreeHeap) + Serial.printf("[MAIN] Free heap: %d bytes\n", ESP.getFreeHeap()); + refFreeHeap = freeHeap; + } +} + +void ProcessAutoOff(bool init) { + static unsigned long lastCheck; + unsigned long nowCheck = millis(); + + if (init) + lastCheck = nowCheck; + if (autoOffTimer && ((nowCheck - lastCheck) >= 1000)) { + lastCheck += 1000; + --autoOffTimer; + SetLED(LED_ON, autoOffTimer & 1); // During auto-Off, blink slowly... + if (autoOffTimer == 0) { + Serial.printf("AutoOff time remaining 0 sec. Off Now.\n"); + SetCircuit(CMD_Off); + } + else { + Serial.printf("AutoOff time remaining %d sec\n", autoOffTimer); + } + } +} + +void HWIOInit() { + // User push-buttons + pinMode(SW_TOGGLE, INPUT); + pinMode(SW_RESET, INPUT); + // Turn off relay drivers + pinMode(RLY_SET1, OUTPUT); + digitalWrite(RLY_SET1, 0); + pinMode(RLY_SET2, OUTPUT); + digitalWrite(RLY_SET2, 0); + // Turn off user LEDs + pinMode(LED_ON, OUTPUT); + digitalWrite(LED_ON, 0); + pinMode(LED_WIFI, OUTPUT); + digitalWrite(LED_WIFI, 0); +} + + +void setup(void) { + HWIOInit(); + ResetMonitor(true); /// Initialize the reset switch monitor for long press + + Serial.begin(115200); + Serial.printf("\n******************************************************************\n"); + Serial.printf(" GrowController Web Server - Build " __DATE__ " " __TIME__ "\n"); + Serial.printf(" Version %s\n", MyVer.c_str()); + Serial.printf(" Copyright (c) 2018 by Smartware Computing, all rights reserved.\n"); + Serial.printf("******************************************************************\n"); + + GetMac(); + AP_SSID += "-"; + AP_SSID += clientMac; + + wifiConfig.load(); + String name = wifiConfig.getName(); + String ssid = wifiConfig.getSSID(); + String pass = wifiConfig.getPassword(); + if (ssid == "" || pass == "") + wifiConState = WFC_CreateAP; + else + wifiConState = WFC_ConnectToAP; + #if 0 + if (MDNS.begin("esp")) { // clientMac.c_str() + //MDNS.addService("switch", "tcp", 80); + //MDNS.addServiceTxt("switch", "tcp", "switchkey", "SWITCHVALUE"); + Serial.printf("MDNS responder started.\n"); + } + #endif + StartWebServer(); + #if 1 + fauxmo.addDevice(name.c_str()); + fauxmo.enable(true); + fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state) { + Serial.printf("[MAIN] Device #%d (%s) state command: %s\n", device_id, device_name, state ? "ON" : "OFF"); + if ((state && !CurrStatus) + || (!state && CurrStatus)) { + SetCircuit(RelayState ? CMD_Off : CMD_On); + } + }); + fauxmo.onGetState([](unsigned char device_id, const char * device_name) { + (void) device_id; + (void) device_name; + return CurrStatus; // GetCircuitStatus(); // whatever the state of the device is + }); + #endif +} + + +void loop(void) { + ResetMonitor(); // Monitor for long press to factory reset + WiFiStateHandler(); // start/connect as AP or Station + ProcessSWUpdate(); // query the server for fresh SW + fauxmo.handle(); // WEMO interface + ProcessNameChange(); // Update fauxmo if the name changes + ProcessCurrentSense(); // Get status by measuring current + ProcessToggleSw(); // Monitor for user pressing toggle + DriveRelay(); // Do what the relays need, if anything + ProcessConsole(); + ProcessAutoOff(); // If auto-off is enabled... +} + + +// ########################################################################### + +void WiFiStateHandler() { + static unsigned long timeStateChange = 0; + static unsigned long timeLEDControl; + unsigned long timeLEDCycle; + String ssid = wifiConfig.getSSID(); + String pass = wifiConfig.getPassword(); + IPAddress myIP; + + timeLEDCycle = millis() - timeLEDControl; + if (timeLEDCycle >= LED_PERIOD__MS) { + timeLEDControl = millis(); + timeLEDCycle = 0; + } + switch (wifiConState) { + case WFC_ConnectToAP: + isStationMode = true; + WiFi.mode(WIFI_STA); + ssid = wifiConfig.getSSID(); + pass = wifiConfig.getPassword(); + WiFi.begin(ssid.c_str(), pass.c_str()); + timeStateChange = millis(); + timeLEDControl = timeStateChange; + wifiConState = WFC_JoiningAP; + break; + case WFC_JoiningAP: + if (timeLEDCycle <= LED_JOINING_MS) + SetLED(LED_WIFI, 1); + else + SetLED(LED_WIFI, 0); + if (WiFi.status() == WL_CONNECTED) { + myIP = WiFi.localIP(); + Serial.printf("IP Address: %s\n", myIP.toString().c_str()); + timeStateChange = millis(); + StartWebServer(); + wifiConState = WFC_JoinedAP; + } else if (millis() - timeStateChange > 30000) { + timeStateChange = millis(); + wifiConState = WFC_CreateAP; // failed for 30 sec, now what. retry or CreateAP? + } + break; + case WFC_CreateAP: + if (timeLEDCycle <= LED_APMODE__MS) + SetLED(LED_WIFI, 1); + else + SetLED(LED_WIFI, 0); + isStationMode = false; + Serial.printf("Starting Access Point %s\n", AP_SSID.c_str()); + WiFi.softAP(AP_SSID.c_str()); + myIP = WiFi.softAPIP(); + Serial.printf("IP Address: %s\n", myIP.toString().c_str()); + dnsServer.start(DNS_PORT, "*", apIP); + timeStateChange = millis(); + StartWebServer(); + wifiConState = WFC_HostingAP; + break; + case WFC_JoinedAP: + if (timeLEDCycle <= LED_JOINED__MS) + SetLED(LED_WIFI, 1); + else + SetLED(LED_WIFI, 0); + server.handleClient(); + break; + case WFC_HostingAP: + if (timeLEDCycle <= LED_APMODE__MS) + SetLED(LED_WIFI, 1); + else + SetLED(LED_WIFI, 0); + server.handleClient(); + dnsServer.processNextRequest(); + break; + } +} + + +bool GetCircuitStatus() { + return CurrStatus; +} +void SetCircuit(CircuitCmd_T newState) { + if (swUpdateInProcess) + return; + switch (newState) { + case CMD_Off: + if (GetCircuitStatus()) { + RelayState = !RelayState; + DriveRelay(RelayState); + } + break; + case CMD_On: + if (!GetCircuitStatus()) { + RelayState = !RelayState; + DriveRelay(RelayState); + } + break; + case CMD_Toggle: + RelayState = !RelayState; + DriveRelay(RelayState); + break; + default: + break; + } +} + +void HandleCircuitOn() { + SetCircuit(CMD_On); + HandleGetState(); // Reply with current state +} + +void HandleCircuitOff() { + SetCircuit(CMD_Off); + HandleGetState(); // Reply with current state +} + +void HandleCircuitToggle() { + SetCircuit(CMD_Toggle); + HandleGetState(); // Reply with current state +} + +// { +// "id": "5c:cf:7f:c0:52:82", +// "name": "3-Way Switch", +// "state": 0, +// "sense": 56, +// "ip": "192.168.1.23", +// "rssi": -63, +// "countdown": "3:45", +// "uptime": "0:11:45", +// "wifimode": "station"|"ap", +// } +// +void HandleGetState() { + int day, hr, min, sec; + char _upTime[15]; // 0000.00:00:00\0 + 1 spare + char _timeout[10]; // 00:00:00\0 + 1 spare + + sec = millis() / 1000; + min = sec / 60; + hr = min / 60; + day = hr / 24; + if (day) + snprintf(_upTime, sizeof(_upTime), "%dd %d:%02d:%02d", day, hr % 24, min % 60, sec % 60); + else if (hr) + snprintf(_upTime, sizeof(_upTime), "%d:%02d:%02d", hr, min % 60, sec % 60); + else + snprintf(_upTime, sizeof(_upTime), "%02d:%02d", min % 60, sec % 60); + + sec = autoOffTimer; + min = sec / 60; + hr = min / 60; + if (hr) + snprintf(_timeout, sizeof(_timeout), "%d:%02d:%02d", hr, min % 60, sec % 60); + else + snprintf(_timeout, sizeof(_timeout), "%d:%02d", min, sec % 60); + + GetMac(); + String modeText = (isStationMode) ? "Station" : "Access Point"; + String message = "{ \"id\": \"" + String(clientMac) + "\", "; + message += "\"name\": \"" + wifiConfig.getName() + "\", "; + message += "\"version\": \"" + MyVer + "\", "; + message += "\"state\": " + String(CurrStatus) + ", "; + message += "\"raw\": " + String(iRaw) + ", "; + message += "\"sense\": " + String(iRawSum / AVG_RATIO) + ", "; + message += "\"ip\": \"" + + String(WiFi.localIP()[0]) + + "." + String(WiFi.localIP()[1]) + + "." + String(WiFi.localIP()[2]) + + "." + String(WiFi.localIP()[3]) + + "\", "; + message += "\"rssi\": " + String(WiFi.RSSI()) + ", "; + message += "\"countdown\": \"" + String(_timeout) + "\", "; + message += "\"uptime\": \"" + String(_upTime) + "\", "; + message += "\"wifimode\": \"" + modeText + "\", "; + message += "\"toggle\": " + String(!digitalRead(SW_TOGGLE)) + ", "; + message += "\"reset\": " + String(!digitalRead(SW_RESET)); + message += " }"; + if (DebugValue) + Serial.println(message + "\0"); + server.sendHeader("Access-Control-Allow-Origin", String("*"), true); + server.send(200, "text/plain", message); +} + + +// Prototypes: +// const char Button_css[] +// const char favicon_ico[] +// const char Green1x1_png[] +// const char index_htm[] +// const char index_js[] +// const char rssi_htm[] +// const char rssi_js[] + +void HandleSWUpdateCheck() { + updateCheck = true; + HandleAPConfigPage(); +} +void HandleButton_css() { + server.sendHeader("Access-Control-Allow-Origin", String("*"), true); + server.send_P(200, "text/plain", Button_css); +} +void HandleIndex_js() { + server.sendHeader("Access-Control-Allow-Origin", String("*"), true); + server.send_P(200, "text/plain", index_js); +} +void HandleAbout_htm() { + server.sendHeader("Access-Control-Allow-Origin", String("*"), true); + server.send_P(200, "text/html", about_htm); +} +void HandleAbout_js() { + server.sendHeader("Access-Control-Allow-Origin", String("*"), true); + server.send_P(200, "text/plain", about_js); +} +void HandleMyIP_js() { + server.sendHeader("Access-Control-Allow-Origin", String("*"), true); + String message = "var mySite = 'http://"; + message += String(WiFi.localIP()[0]); + message += "." + String(WiFi.localIP()[1]); + message += "." + String(WiFi.localIP()[2]); + message += "." + String(WiFi.localIP()[3]); + message += "';\n"; + server.send(200, "text/plain", message); +} +void StartWebServer() { + // path /firmware + //httpUpdater.setup(&server, update_path, update_username, update_password); + server.on("/", HandleRootPage); + server.on("/myip.js", HandleMyIP_js); + server.on("/button.css", HandleButton_css); + server.on("/index.js", HandleIndex_js); + server.on("/about", HandleAbout_htm); + server.on("/about.js", HandleAbout_js); + server.on("/favicon.ico", HandleFavIcon); + server.on("/PlantModel.png", HandlePlantModel); + server.on("/Heater.png", HandleHeater); + server.on("/Water.png", HandleWater); + server.on("/config", HandleAPConfigPage); + server.on("/swupdatecheck", HandleSWUpdateCheck); + server.on("/scan", HandleAPScan); + server.on("/green1x1.png", HandleGreen1x1); + server.on("/rssi", HandleRSSIPage); + server.on("/rssi.js", HandleRSSI_JS); + server.on("/curr", HandleCurrPage); + server.on("/curr.js", HandleCurr_JS); + server.on("/on", HandleCircuitOn); + server.on("/off", HandleCircuitOff); + server.on("/toggle", HandleCircuitToggle); + server.on("/state", HandleGetState); + server.on("/icon.png", HandleIcon); + server.on("/Open.png", HandleOpenDoor); + server.onNotFound(HandleNotFound); + server.begin(); + Serial.println("HTTP server started"); +} + +void HandleNotFound() { + Serial.printf("not found: %s\n", server.uri().c_str()); + const DirEntry *de = Directory; + boolean found = false; + while (*de->Filename) { + if (0 == strcmp(de->Filename, server.uri().c_str())) { + Serial.printf("send %s\n", de->Filename); + server.send_P(200, de->Filetype, de->Filedata, de->Filesize); + found = true; + break; + } else { + de++; + } + } + if (!found) { + Serial.printf("!found - redirect to home\n"); + server.sendHeader("Location", String("/"), true); + server.send(302, "text/plain", "Not supported. Heading for home."); + } +} + +void GetMac() { + unsigned char mac[6]; + WiFi.macAddress(mac); + clientMac = macToStr(mac); +} + +String macToStr(const uint8_t * mac) { + String result; + + for (int i = 0; i < 6; ++i) { + result += String(mac[i], 16); + if (i < 5) + result += ':'; + } + return result; +} diff --git a/Firmware/GrowController.h b/Firmware/GrowController.h new file mode 100644 index 0000000..db12f33 --- /dev/null +++ b/Firmware/GrowController.h @@ -0,0 +1,23 @@ + +#ifndef GROWCONTROLLER_H +#define GROWCONTROLLER_H + +bool GetCircuitStatus(); + +/// Command for the circuit +typedef enum { + CMD_Off, ///< Command it off + CMD_On, ///< Command it on + CMD_Toggle ///< Command a toggle +} CircuitCmd_T; + + +/// Set the state +/// @param[in] newState +/// - 0 = Off +/// - 1 = On +/// - 2 = Toggle +/// +void SetCircuit(CircuitCmd_T newState); + +#endif // GROWCONTROLLER_H diff --git a/Firmware/ProjGlobals.h b/Firmware/ProjGlobals.h new file mode 100644 index 0000000..a1fc2a2 --- /dev/null +++ b/Firmware/ProjGlobals.h @@ -0,0 +1,16 @@ +// +// Some settings +// + +#ifndef PROJGLOBALS_H +#define PROJGLOBALS_H + +#include + +#include "WiFiConfiguration.h" + +extern bool isStationMode; +extern ESP8266WebServer server; +extern ConfigManager wifiConfig; + +#endif // PROJGLOBALS_H \ No newline at end of file diff --git a/Firmware/Resources/Button.css b/Firmware/Resources/Button.css new file mode 100644 index 0000000..9411547 --- /dev/null +++ b/Firmware/Resources/Button.css @@ -0,0 +1,21 @@ +input.BigButton { + width: 150px; + padding: 20px; + white-space: normal; + cursor: pointer; + font-weight: bold; + font-size: 120%; + background: #3366cc; + color: #fff; + border: 5px solid #112233; + border-radius: 10px; + -moz-box-shadow: 6px 6px 5px #999; + -webkit-box-shadow: 6px 6px 5px #999; + box-shadow: 6px 6px 5px #999; +} + +input.BigButton:hover { + color: #ffff00; + background: #000; + border: 5px solid #fff; +} diff --git a/Firmware/Resources/Green1x1.png b/Firmware/Resources/Green1x1.png new file mode 100644 index 0000000..b791f31 Binary files /dev/null and b/Firmware/Resources/Green1x1.png differ diff --git a/Firmware/Resources/Heater.png b/Firmware/Resources/Heater.png new file mode 100644 index 0000000..d3bfd51 Binary files /dev/null and b/Firmware/Resources/Heater.png differ diff --git a/Firmware/Resources/Open.png b/Firmware/Resources/Open.png new file mode 100644 index 0000000..e39cad7 Binary files /dev/null and b/Firmware/Resources/Open.png differ diff --git a/Firmware/Resources/PlantModel.png b/Firmware/Resources/PlantModel.png new file mode 100644 index 0000000..3a610b8 Binary files /dev/null and b/Firmware/Resources/PlantModel.png differ diff --git a/Firmware/Resources/Water.png b/Firmware/Resources/Water.png new file mode 100644 index 0000000..8306824 Binary files /dev/null and b/Firmware/Resources/Water.png differ diff --git a/Firmware/Resources/about.htm b/Firmware/Resources/about.htm new file mode 100644 index 0000000..763ccc7 --- /dev/null +++ b/Firmware/Resources/about.htm @@ -0,0 +1,55 @@ + + + + Grow Controller + + + + + +

Grow Controller

+ by Smartware Computing +
+ + + + + +
+ This Grow Controller is an IOT device based on an ESP8266-12 module. The software for it has been + derived from various sources and where copyrights have been identified, they are listed below.
+
    +
  • The composite work is Copyright © 2018-2021 by Smartware Computing, all rights reserved.
  • +
  • Library for WEMO emulation, Copyright © 2016 by Xose Pérez
  • +
  • Libraries; Copyright © 2001-2013 Free Software Foundation, Inc.
  • +
  • Libraries; Copyright (c) 1997 Silicon Graphics Computer Systems, Inc.
  • +
+
+
Toggle Button
+
Each press will toggle the circuit between on and off.
+
Reset Button
+
Momentary press resets unit. Very Long press causes Factory reset back to Access Point mode.
+
+
+ + Mode: + Uptime: + +
+ + + + + + +
NAV: + Home | + Config | + Scan | + RSSI | + Current | + Factory Reset | + About +
+ + diff --git a/Firmware/Resources/about.js b/Firmware/Resources/about.js new file mode 100644 index 0000000..0e118e5 --- /dev/null +++ b/Firmware/Resources/about.js @@ -0,0 +1,30 @@ +// +// rssi script +// +// var mySite = 'http://192.168.1.23' from myip.js +var url = mySite + '/state'; +setInterval(RefreshStatus, 5000); + +getIt = function(aUrl, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', aUrl, true); + xhr.responseType = 'text'; + xhr.onload = function(e) { + if (this.status === 200) { + callback(this.response); + } + }; + xhr.send(); +} + +function RefreshStatus() { + getIt(url, + function(data) { + obj = JSON.parse(data); + var elms = document.querySelectorAll('.' + 'ip'), i; + for (i = 0; i < elms.length; ++i) { + elms[i].textContent = obj.ip; + } + } + ); +} diff --git a/Firmware/Resources/curr.htm b/Firmware/Resources/curr.htm new file mode 100644 index 0000000..67119b1 --- /dev/null +++ b/Firmware/Resources/curr.htm @@ -0,0 +1,43 @@ + + + + Grow Controller + + + + + +

Grow Controller - Current Sense

+
+ + + + + + + + +
+ +
+
x:xx:xx
+
+
xx
+
+
+ + + + + +
NAV: + Home | + Config | + Scan | + RSSI | + Current | + Factory Reset | + About +
+ + diff --git a/Firmware/Resources/curr.js b/Firmware/Resources/curr.js new file mode 100644 index 0000000..f59731f --- /dev/null +++ b/Firmware/Resources/curr.js @@ -0,0 +1,141 @@ +// +// curr script +// +// var mySite = 'http://192.168.1.23' from myip.js +var url = mySite + '/state'; +var rawData = []; +var avgData = []; +var currIndex = 0; +var axes = {}; +var totalSamples = 400; // Width of the graph +for (var i = 0; i < totalSamples; i++) + rawData[i] = avgData[i] = 0; +setInterval(RefreshStatus, 250); + +// ------------------------- + +getIt = function (aUrl, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', aUrl, true); + xhr.responseType = 'text'; + xhr.onload = function (e) { + if (this.status === 200) { + callback(this.response); + } + }; + xhr.send(); +}; + +function RefreshStatus() { + getIt(url, + function (data) { + obj = JSON.parse(data); + UpdateGraph(obj.raw, obj.sense); // raw and averaged + document.getElementById('uptime').innerHTML = 'Uptime: ' + obj.uptime; + document.getElementById('currText').innerHTML = 'raw: ' + obj.raw + ', avg: ' + obj.sense; + } + ); +} + +function CurrInit() { + var canvas = document.getElementById('curr'); + if (null === canvas || !canvas.getContext) + return; + ctx = canvas.getContext('2d'); + axes.w = 0.9 * canvas.width; + axes.h = 0.8 * canvas.height; + axes.x0 = 0.07 * canvas.width; // x0 pixels from left to x=0 + axes.y0 = 0.10 * canvas.height; // y0 pixels from top to y=0 + axes.scaleX = totalSamples; // # pixels from x=0 to x=1 + axes.scaleY = 1024; + axes.doNegativeX = false; + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.rect(0, 0, canvas.width - 1, canvas.height - 1); + ctx.strokeStyle = 'black'; + ctx.lineWidth = 1; + ctx.stroke(); + showAxes(ctx, axes); +} + +function UpdateGraph(rawCurr, avgCurr) { + var xx, yy; + var i; + + if (rawCurr > axes.scaleY) // safety limit + rawCurr = axes.scaleY; + else if (rawCurr < 0) + rawCurr = 0; + if (avgCurr > axes.scaleY) // safety limit + avgCurr = axes.scaleY; + else if (avgCurr < 0) + avgCurr = 0; + rawData[currIndex] = rawCurr; + avgData[currIndex] = avgCurr; + console.log('UpdateGraph(-' + rawCurr + ')'); + CurrInit(); + + // Draw Raw + x0 = axes.x0; + y0 = axes.y0; + ctx.beginPath(); + ctx.strokeStyle = '#FF8080'; + ctx.lineWidth = 3; + for (i = 0; i < totalSamples; i++) { + pi = (currIndex + 1 + i) % totalSamples; + xx = x0 + i / axes.scaleX * axes.w; + yy = y0 + axes.h - rawData[pi] / axes.scaleY * axes.h; + ctx.lineTo(xx, yy); + } + ctx.stroke(); + // Circle + ctx.beginPath(); + ctx.arc(xx, yy, 7, 0, 2 * Math.PI, false); + ctx.fillstyle = '#FF8080'; + ctx.fill(); + ctx.strokeStyle = '#FF0000'; + ctx.stroke(); + + // Draw Average + x0 = axes.x0; + y0 = axes.y0; + ctx.beginPath(); + ctx.strokeStyle = '#8080FF'; + ctx.lineWidth = 3; + for (i = 0; i < totalSamples; i++) { + pi = (currIndex + 1 + i) % totalSamples; + xx = x0 + i / axes.scaleX * axes.w; + yy = y0 + axes.h - avgData[pi] / axes.scaleY * axes.h; + ctx.lineTo(xx, yy); + } + ctx.stroke(); + // Circle + ctx.beginPath(); + ctx.arc(xx, yy, 7, 0, 2 * Math.PI, false); + ctx.fillstyle = '#8080FF'; + ctx.fill(); + ctx.strokeStyle = '#0000FF'; + ctx.stroke(); + currIndex++; + currIndex %= totalSamples; +} + +function showAxes(ctx, axes) { + var x0 = axes.x0, w = axes.w; + var y0 = axes.y0, h = axes.h; + var xmin = axes.doNegativeX ? 0 : x0; + ctx.lineWidth = 1; + ctx.font = '12px Arial'; + ctx.textAlign = 'end'; + ctx.beginPath(); + ctx.strokeStyle = 'rgb(128,128,128)'; + ctx.moveTo(x0, y0); ctx.lineTo(x0, y0 + h); // Y axis + for (var y = 0; y <= axes.scaleY; y += 100) { + yy = axes.y0 + axes.h - y / axes.scaleY * axes.h; + ctx.moveTo(xmin, yy); ctx.lineTo(x0 + w, yy); // X axis + ctx.fillText(y, x0 - 3, yy + 3); + } + ctx.font = '18px Arial'; + ctx.textAlign = 'start'; + ctx.fillText('Current Graph', axes.x0, axes.y0 - 6); + ctx.stroke(); +} diff --git a/Firmware/Resources/favicon.ico b/Firmware/Resources/favicon.ico new file mode 100644 index 0000000..46c0ed3 Binary files /dev/null and b/Firmware/Resources/favicon.ico differ diff --git a/Firmware/Resources/icon.png b/Firmware/Resources/icon.png new file mode 100644 index 0000000..d372cb3 Binary files /dev/null and b/Firmware/Resources/icon.png differ diff --git a/Firmware/Resources/index.htm b/Firmware/Resources/index.htm new file mode 100644 index 0000000..02da567 --- /dev/null +++ b/Firmware/Resources/index.htm @@ -0,0 +1,208 @@ + + + + Grow Controller + + + + + + +

Grow Controller

+
+ + + + + + +
+
+
+ + +
+
92°F
+
8%
+
74°F
+
ON
+
65°F
+
12.3V
+
1.2A
+
0.0V
+
OK
+
+
+
+
+ + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+

+ + + + + + +
NAV: + Home | + Config | + Scan | + RSSI | + Current | + Factory Reset | + About +
+
+ + + + + +
GrowController by Origin TechnologiesFirmware: v0.00.00
+ + diff --git a/Firmware/Resources/index.js b/Firmware/Resources/index.js new file mode 100644 index 0000000..2093fb5 --- /dev/null +++ b/Firmware/Resources/index.js @@ -0,0 +1,44 @@ +// +// rssi script +// +// var mySite = 'http://192.168.1.23' from myip.js +var url = mySite + '/state'; +setInterval(RefreshStatus, 250); + +getIt = function (aUrl, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', aUrl, true); + xhr.responseType = 'text'; + xhr.onload = function (e) { + if (this.status === 200) { + callback(this.response); + } + }; + xhr.send(); +}; + +function RefreshStatus() { + getIt(url, + function(data) { + obj = JSON.parse(data); + if (obj.state === 1) + state = "On"; + else + state = "Off"; + document.getElementById('version').innerHTML = obj.version; + document.getElementById('name').innerHTML = obj.name; + document.getElementById('state').innerHTML = 'Output: ' + state; + document.getElementById('raw').innerHTML = 'raw: ' + obj.raw; + document.getElementById('sense').innerHTML = 'Sense: ' + obj.sense; + document.getElementById('toggle').innerHTML = 'Toggle: ' + obj.toggle; + document.getElementById('reset').innerHTML = 'Reset: ' + obj.reset; + document.getElementById('countdown').innerHTML = obj.countdown; + document.getElementById('uptime').innerHTML = 'Uptime: ' + obj.uptime; + document.getElementById('wifimode').innerHTML = 'Mode: ' + obj.wifimode; + var elms = document.querySelectorAll('.' + 'ip'), i; + for (i = 0; i < elms.length; ++i) { + elms[i].textContent = obj.ip; + } + } + ); +} diff --git a/Firmware/Resources/rssi.htm b/Firmware/Resources/rssi.htm new file mode 100644 index 0000000..e1ec8b9 --- /dev/null +++ b/Firmware/Resources/rssi.htm @@ -0,0 +1,43 @@ + + + + Grow Controller RSSI + + + + + +

Grow Controller - RSSI

+
+ + + + + + + + +
+ +
+
x:xx:xx
+
+
-xx
+
+
+ + + + + +
NAV: + Home | + Config | + Scan | + RSSI | + Current | + Factory Reset | + About +
+ + diff --git a/Firmware/Resources/rssi.js b/Firmware/Resources/rssi.js new file mode 100644 index 0000000..dbd7efb --- /dev/null +++ b/Firmware/Resources/rssi.js @@ -0,0 +1,109 @@ +// +// rssi script +// +// var mySite = 'http://192.168.1.23' from myip.js +var url = mySite + '/state'; +var rssiData = []; +var rssiIndex = 0; +var axes = {}; +for (var i = 0; i<100; i++) + rssiData[i] = 0; +setInterval(RefreshStatus, 250); + +// ------------------------- + +getIt = function (aUrl, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', aUrl, true); + xhr.responseType = 'text'; + xhr.onload = function (e) { + if (this.status === 200) { + callback(this.response); + } + }; + xhr.send(); +}; + +function RefreshStatus() { + getIt(url, + function(data) { + obj = JSON.parse(data); + UpdateGraph(obj.rssi); + document.getElementById('rssi').innerHTML = 'RSSI: ' + obj.rssi; + document.getElementById('uptime').innerHTML = 'Uptime: ' + obj.uptime; + } + ); +} + +function RSSIInit() { + var canvas = document.getElementById('RSSIGraph'); + if (null === canvas || !canvas.getContext) + return; + ctx = canvas.getContext('2d'); + axes.w = 0.9 * canvas.width; + axes.h = 0.8 * canvas.height; + axes.x0 = 0.07 * canvas.width; // x0 pixels from left to x=0 + axes.y0 = 0.10 * canvas.height; // y0 pixels from top to y=0 + axes.scaleX = 100; // # pixels from x=0 to x=1 + axes.scaleY = 100; + axes.doNegativeX = false; + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.rect(0, 0, canvas.width - 1, canvas.height - 1); + ctx.strokeStyle = 'black'; + ctx.lineWidth = 1; + ctx.stroke(); + showAxes(ctx, axes); +} + +function UpdateGraph(rssi) { + var xx, yy; + rssi = -rssi; // invert for convenience + if (rssi > axes.scaleY) // safety limit + rssi = axes.scaleY; + else if (rssi < 0) + rssi = 0; + rssiData[rssiIndex] = rssi; + console.log('UpdateGraph(-' + rssi + ')'); + RSSIInit(); + x0 = axes.x0; + y0 = axes.y0; + ctx.beginPath(); + ctx.strokeStyle = 'rgb(250,128,128)'; + ctx.lineWidth = 5; + for (var i = 0; i<100; i++) { + pi = (rssiIndex + 1 + i) % 100; + xx = x0 + i / axes.scaleX * axes.w; + yy = y0 + rssiData[pi] / axes.scaleY * axes.h; + ctx.lineTo(xx, yy); + } + ctx.stroke(); + ctx.beginPath(); + ctx.arc(xx, yy, 7, 0, 2 * Math.PI, false); + ctx.fillstyle = 'green'; + ctx.fill(); + ctx.strokeStyle = '#003300'; + ctx.stroke(); + rssiIndex++; + rssiIndex %= 100; +} + +function showAxes(ctx, axes) { + var x0 = axes.x0, w = axes.w; + var y0 = axes.y0, h = axes.h; + var xmin = axes.doNegativeX ? 0 : x0; + ctx.lineWidth = 1; + ctx.font = '12px Arial'; + ctx.textAlign = 'end'; + ctx.beginPath(); + ctx.strokeStyle = 'rgb(128,128,128)'; + ctx.moveTo(x0, y0); ctx.lineTo(x0, y0 + h); // Y axis + for (var y = 0; y <= axes.scaleY; y += 10) { + yy = axes.y0 + y / axes.scaleY * axes.h; + ctx.moveTo(xmin, yy); ctx.lineTo(x0 + w, yy); // X axis + ctx.fillText(-y, x0 - 3, yy + 3); + } + ctx.font = '18px Arial'; + ctx.textAlign = 'start'; + ctx.fillText('RSSI Graph', axes.x0, axes.y0 - 6); + ctx.stroke(); +} diff --git a/Firmware/SmartSwitch.sln b/Firmware/SmartSwitch.sln new file mode 100644 index 0000000..25a4150 --- /dev/null +++ b/Firmware/SmartSwitch.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2020 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SmartSwitch", "SmartSwitch.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2245D551-F0E5-4A91-B978-826DFEF0D6BF} + EndGlobalSection +EndGlobal diff --git a/Firmware/SmartSwitch.vcxproj b/Firmware/SmartSwitch.vcxproj new file mode 100644 index 0000000..acca64a --- /dev/null +++ b/Firmware/SmartSwitch.vcxproj @@ -0,0 +1,163 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {C5F80730-F44F-4478-BDAE-6634EFC2CA88} + + + SmartSwitch + + + + Application + true + + + MultiByte + + + Application + false + + + true + MultiByte + + + + + + + + + + + + + Build + + + + Level4 + Disabled + true + $(ProjectDir)..\Firmware;$(ARDUINO_ESP8266_SDK)\libraries\esp8266\src;$(ARDUINO_ESP8266_SDK)\libraries\Wire;$(ARDUINO_ESP8266_SDK)\libraries\ESP8266WiFi\src;$(ARDUINO_ESP8266_SDK)\libraries\ESP8266WebServer\src;$(ARDUINO_ESP8266_SDK)\libraries\ESP8266httpUpdate\src;$(ARDUINO_ESP8266_SDK)\libraries\ESP8266HTTPClient\src;$(ARDUINO_ESP8266_SDK)\libraries\EEPROM;$(ARDUINO_ESP8266_SDK)\libraries;$(ARDUINO_ESP8266_SDK)\cores\esp8266;$(ARDUINO_ESP8266_SDK)\cores\esp8266\libb64;$(ARDUINO_ESP8266_SDK)\cores\esp8266\spiffs;$(ARDUINO_ESP8266_SDK)\cores\esp8266\umm_malloc;$(ARDUINO_ESP8266_SDK)\variants\espino;$(ARDUINO_ESP8266_SDK)\tools\sdk\include;$(ARDUINO_ESP8266_SDK)\tools\sdk\lwip2\include;$(ARDUINO_ESP8266_SDK)\tools\sdk\libc\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\Users\David\Documents\Arduino\libraries;$(ProjectDir)..\..\..\Users\David\Documents\Arduino\libraries\ESPAsyncTCP-master\src;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\program files (x86)\microsoft visual studio\2019\preview\common7\ide\extensions\mbsqucm2.qs1\Micro Platforms\visualmicro\ide\libraries;%(AdditionalIncludeDirectories) + $(ProjectDir)__vm\.Firmware.vsarduino.h;%(ForcedIncludeFiles) + false + WIN32;__ESP8266_ESp8266__;__ESP8266_ESP8266__;DEBUG_FAUXMO=Serial;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;TCP_MSS=536;ARDUINO=10807;ARDUINO_ESP8266_ESP12;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions) + + + true + + + cd $(ProjectDir)\Tools +MakeResourceFiles.cmd +pause + + + + $(ProjectDir)\Resources\*.*;%(Inputs) + + + + + Level3 + Disabled + true + true + true + $(ProjectDir)..\Firmware;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\esp8266\src;$(ProjectDir)..\..\..\Users\David\Documents\Arduino\libraries\ESPAsyncTCP-master\src;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\Wire;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\ESP8266WiFi\src;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\ESP8266WebServer\src;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\ESP8266httpUpdate\src;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\ESP8266HTTPClient\src;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries\EEPROM;$(ProjectDir)..\..\..\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Extensions\mcovr5xb.z02\Micro Platforms\visualmicro\ide\libraries;$(ProjectDir)..\..\..\Users\David\Documents\Arduino\libraries;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\libraries;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\cores\esp8266;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\cores\esp8266\libb64;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\cores\esp8266\spiffs;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\cores\esp8266\umm_malloc;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\variants\espino;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\tools\sdk\include;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\tools\sdk\lwip2\include;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\tools\sdk\libc\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\xtensa-lx106-elf;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\lib\gcc\xtensa-lx106-elf\4.8.2\include;$(ProjectDir)..\..\..\Users\David\AppData\Local\arduino15\packages\esp8266\hardware\esp8266\2.4.1\tools\sdk\include;%(AdditionalIncludeDirectories) + $(ProjectDir)__vm\.Firmware.vsarduino.h;%(ForcedIncludeFiles) + false + __ESP8266_ESp8266__;__ESP8266_ESP8266__;__ets__;ICACHE_FLASH;F_CPU=80000000L;LWIP_OPEN_SRC;TCP_MSS=536;ARDUINO=10801;ARDUINO_ESP8266_ESP12;ARDUINO_ARCH_ESP8266;ESP8266;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions) + + + true + true + true + + + cd $(ProjectDir)\Resources +\tools\MakeByteArray.pl *.* -o=..\Web_Resources.h +pause + + + + $(ProjectDir)\Resources\*.*;%(Inputs) + + + + + + + + + + + true + + + + true + + + + + true + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + VisualMicroDebugger + + + + + + + + + + \ No newline at end of file diff --git a/Firmware/WeMo.h b/Firmware/WeMo.h new file mode 100644 index 0000000..2c91f17 --- /dev/null +++ b/Firmware/WeMo.h @@ -0,0 +1,262 @@ +/* + +FAUXMO ESP 2.4.0 + +Copyright (C) 2016 by Xose Pérez + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#pragma once + +const char UDP_TEMPLATE[] PROGMEM = + "HTTP/1.1 200 OK\r\n" + "CACHE-CONTROL: max-age=86400\r\n" + "DATE: Mon, 22 Jun 2015 17:24:01 GMT\r\n" + "EXT:\r\n" + "LOCATION: http://%s:%d/setup.xml\r\n" + "OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n" + "01-NLS: %s\r\n" + "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" + "ST: %s\r\n" + "USN: uuid:Socket-1_0-%s::" + "%s\r\n" // %s = urn:Belkin:device:** (Echo Dot 2Gen, Echo 1Gen) or %s = upnp:rootdevice (Echo 2Gen, Echo Plus) + "X-User-Agent: redsonic\r\n" + "\r\n"; + +const char SETUP_TEMPLATE[] PROGMEM = + "\n" + "\n" + " \n" + " 1\n" + " 0\n" + " \n" + " \n" + " urn:Belkin:device:controllee:1\n" + " %s\n" + " Belkin International Inc.\n" ///< must be "Belkin..." for Alexa discovery + " http://www.smart-family.net\n" ///< + " Smartware Grow Controller\n" ///< + " Grow Controller\n" ///< + " 1.0.0\n" +#if 0 + " http://www.smart-family.net\n" ///< This causes it to fail to send completely +#endif + " uuid:Socket-1_0-%s\n" + " %s\n" + " \n" + " jpg\n" + " 100\n" + " 100\n" + " 100\n" + " icon.jpg\n" + " \n" + " http://%s:%d\n" +#if 0 + " \n" + " \n" + " urn:Belkin:service:WiFiSetup:1\n" + " urn:Belkin:serviceId:WiFiSetup1\n" + " /upnp/control/WiFiSetup1\n" + " /upnp/event/WiFiSetup1\n" + " /setupservice.xml\n" + " \n" + " \n" + " urn:Belkin:service:timesync:1\n" + " urn:Belkin:serviceId:timesync1\n" + " /upnp/control/timesync1\n" + " /upnp/event/timesync1\n" + " /timesyncservice.xml\n" + " \n" + " \n" + " urn:Belkin:service:basicevent:1\n" + " urn:Belkin:serviceId:basicevent1\n" + " /upnp/control/basicevent1\n" + " /upnp/event/basicevent1\n" + " /eventservice.xml\n" + " \n" + " \n" + " urn:Belkin:service:firmwareupdate:1\n" + " urn:Belkin:serviceId:firmwareupdate1\n" + " /upnp/control/firmwareupdate1\n" + " /upnp/event/firmwareupdate1\n" + " /firmwareupdate.xml\n" + " \n" + " \n" + " urn:Belkin:service:rules:1\n" + " urn:Belkin:serviceId:rules1\n" + " /upnp/control/rules1\n" + " /upnp/event/rules1\n" + " /rulesservice.xml\n" + " \n" + " \n" + " urn:Belkin:service:metainfo:1\n" + " urn:Belkin:serviceId:metainfo1\n" + " /upnp/control/metainfo1\n" + " /upnp/event/metainfo1\n" + " /metainfoservice.xml\n" + " \n" + " \n" + " urn:Belkin:service:remoteaccess:1\n" + " urn:Belkin:serviceId:remoteaccess1\n" + " /upnp/control/remoteaccess1\n" + " /upnp/event/remoteaccess1\n" + " /remoteaccess.xml\n" + " \n" + " \n" + " urn:Belkin:service:deviceinfo:1\n" + " urn:Belkin:serviceId:deviceinfo1\n" + " /upnp/control/deviceinfo1\n" + " /upnp/event/deviceinfo1\n" + " /deviceinfoservice.xml\n" + " \n" + " \n" + " urn:Belkin:service:smartsetup:1\n" + " urn:Belkin:serviceId:smartsetup1\n" + " /upnp/control/smartsetup1\n" + " /upnp/event/smartsetup1\n" + " /smartsetup.xml\n" + " \n" + " \n" + " urn:Belkin:service:manufacture:1\n" + " urn:Belkin:serviceId:manufacture1\n" + " /upnp/control/manufacture1\n" + " /upnp/event/manufacture1\n" + " /manufacture.xml\n" + " \n" + " \n" +#endif + " \n" + "\n"; + +const char EVENTSERVICE_TEMPLATE[] PROGMEM = + "" + "" + "" + "SetBinaryState" + "" + "" + "" + "BinaryState" + "BinaryState" + "in" + "" + "" + "" + "" + "GetBinaryState" + "" + "" + "" + "BinaryState" + "BinaryState" + "out" + "" + "" + "" + "" + "" + "" + "BinaryState" + "Boolean" + "0" + "" + "" + "level" + "string" + "0" + "" + "" + "\r\n" + "\r\n"; + +const char METAINFO_TEMPLATE[] PROGMEM = + "" + "10" + "" + "" + "GetMetaInfo" + "" + "" + "GetMetaInfo" + "MetaInfo" + "in" + "" + "" + "" + "" + "" + "MetaInfo" + "string" + "0" + "" + "" + "\r\n" + "\r\n"; + +const char SETSTATE_TEMPLATE[] PROGMEM = + "" + "" + "" + "%d" + "" + "" + "\r\n"; + +const char GETSTATE_TEMPLATE[] PROGMEM = + "" + "" + "" + "%d" + "" + "" + "\r\n"; + +const char HEADERS[] PROGMEM = + "HTTP/1.1 200 OK\r\n" + "CONTENT-LENGTH: %d\r\n" + "CONTENT-TYPE: text/xml\r\n" + "DATE: Sun, 01 Jan 2017 00:00:00 GMT\r\n" + "LAST-MODIFIED: Sat, 01 Jan 2017 00:00:00 GMT\r\n" + "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" + "X-USER-AGENT: redsonic\r\n" + "CONNECTION: close\r\n\r\n"; + +const char HEADERJPG[] PROGMEM = + "HTTP/1.1 200 OK\r\n" + "CONTENT-LENGTH: %d\r\n" + "CONTENT-TYPE: image/jpg\r\n" + "DATE: Sun, 01 Jan 2017 00:00:00 GMT\r\n" + "LAST-MODIFIED: Sat, 01 Jan 2017 00:00:00 GMT\r\n" + "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" + "X-USER-AGENT: redsonic\r\n" + "CONNECTION: close\r\n\r\n"; + +const char HEADERPNG[] PROGMEM = + "HTTP/1.1 200 OK\r\n" + "CONTENT-LENGTH: %d\r\n" + "CONTENT-TYPE: image/png\r\n" + "DATE: Sun, 01 Jan 2017 00:00:00 GMT\r\n" + "LAST-MODIFIED: Sat, 01 Jan 2017 00:00:00 GMT\r\n" + "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" + "X-USER-AGENT: redsonic\r\n" + "CONNECTION: close\r\n\r\n"; diff --git a/Firmware/Web_APConfig.cpp b/Firmware/Web_APConfig.cpp new file mode 100644 index 0000000..eedda09 --- /dev/null +++ b/Firmware/Web_APConfig.cpp @@ -0,0 +1,253 @@ + +#include + +#include "ProjGlobals.h" +#include "Web_APConfig.h" + +static String EncType_str(uint8_t encType) { + switch (encType) { + case ENC_TYPE_NONE: + return "open"; + break; + case ENC_TYPE_WEP: + return "wep"; + break; + case ENC_TYPE_TKIP: + return "wpa psk"; + break; + case ENC_TYPE_CCMP: + return "wpa2 psk"; + break; + case ENC_TYPE_AUTO: + return "wpa wpa2 psk"; + break; + default: + return "unknown"; + break; + } +} + +void HandleAPScan() { + // WiFi.scanNetworks will return the number of networks found + Serial.println("Scan ..."); + int n = WiFi.scanNetworks(false, true); // blocking call and show hidden. + Serial.println("scan done."); + if (n == 0) { + Serial.println("no networks found"); + } else { + Serial.print(n); + Serial.println(" networks found"); + server.sendContent_P("HTTP/1.1 200 OK\r\n"); + server.sendContent_P("Content-Type: text/html\r\n"); + server.sendContent_P("\r\n"); + server.sendContent_P( + "\n" + "\n" + "Grow Controller - Scan\n" + "\n" + "

Grow Controller - Scan

" + ); + + server.sendContent_P( + "
\n" + "
\n" + " \n" + " \n" + ); + + for (int i = 0; i < n; ++i) { + // Select, Network #, RSSI, SSID, BSSID, Channel, Hidden + String bgcolor = (i & 1) ? "#E0E0E0" : "#FFFFFF"; + String record = + " \n" + + " \n" + + " \n" + + " \n" + + " \n"; + + record += " \n"; + record += " \n"; + record += WiFi.isHidden(i) + ? " \n" + : " \n"; + record += " \n"; + server.sendContent(record); + // + Serial.print(i + 1); + Serial.print(": "); + Serial.print(WiFi.SSID(i)); + Serial.print(" ("); + Serial.print(WiFi.RSSI(i)); + Serial.print(")"); + Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*"); + } + server.sendContent_P( + " \n" + " \n" + " \n" + "
NetRSSISSIDBSSIDEncryptionChannelHidden
" + (i + 1) + "" + WiFi.RSSI(i) + "" + WiFi.SSID(i) + "
" + + "
" + WiFi.BSSIDstr(i) + "" + EncType_str(WiFi.encryptionType(i)) + "" + String(WiFi.channel(i)); + record += "YesNo
 \n" + " \n" + " \n" + "
\n" + "
\n" + "
\n" + "NAV:  " + " Home | " + " Config | " + " Scan | " + " RSSI | " + " Current | " + " Factory Reset | " + " About\n" + "
\n" + "\n" + "\n" + ); + } +} + +void FactoryReset(bool forceRestart) { + Serial.println("Factory Reset Configuration...\n"); + wifiConfig.factoryReset(); + wifiConfig.save(); + if (forceRestart) { + Serial.println("Restart in 3 sec ..."); + delay(3000); + ESP.restart(); + } +} + +void HandleAPConfigPage() { + String name = wifiConfig.getName(); + String ssid = wifiConfig.getSSID(); + String pass = wifiConfig.getPassword(); + String url = wifiConfig.getURL(); + //String ntp = wifiConfig.getNTPServerName(); + char _onref[6], _offref[6], _autoOff[6]; + + snprintf(_onref, sizeof(_onref), "%d", wifiConfig.getOnRef()); + snprintf(_offref, sizeof(_offref), "%d", wifiConfig.getOffRef()); + snprintf(_autoOff, sizeof(_autoOff), "%d", wifiConfig.getAutoOff()); + String onref = String(_onref); + String offref = String(_offref); + String autooff = String(_autoOff); + + if (server.hasArg("ssid") && server.hasArg("pass")) { + String _ssid = server.hasArg("_ssid") ? server.arg("_ssid") : ""; + String _pass = server.hasArg("_pass") ? server.arg("_pass") : ""; + name = server.arg("name"); + ssid = server.arg("ssid"); + pass = server.arg("pass"); + url = server.hasArg("url") ? server.arg("url") : ""; + onref = server.hasArg("onref") ? server.arg("onref") : ""; + offref = server.hasArg("offref") ? server.arg("offref") : ""; + autooff = server.hasArg("autooff") ? server.arg("autooff") : ""; + //ntp = server.hasArg("ntp") ? server.arg("ntp") : ""; + if (ssid == "reset" && pass == "reset") { + FactoryReset(true); + } + wifiConfig.setName(name); + wifiConfig.setSSID(ssid); + wifiConfig.setPassword(pass); + wifiConfig.setURL(url); + wifiConfig.setOnRef(onref.toInt()); + wifiConfig.setOffRef(offref.toInt()); + wifiConfig.setAutoOff(autooff.toInt()); + //wifiConfig.setNTPServerName(ntp); + wifiConfig.save(); + Serial.println("Settings saved."); + if (ssid != _ssid || pass != _pass) { + // They changed stuff that requires a restart. + server.send(200, "text/html", "Configuration Saved! Restarting in 3 sec..."); + Serial.printf("Config saved. Restarting in 3 sec . . ."); + delay(3000); + ESP.restart(); + return; + } + } + + String modeText = (isStationMode) ? "Station mode
" : "Access Point mode
"; + if (server.hasArg("ssid") && !server.hasArg("pass")) { + ssid = server.arg("ssid"); + pass = ""; + Serial.println("ssid: " + ssid + ", pass: " + pass); + } + if (server.hasArg("url")) + url = server.arg("url"); + //if (server.hasArg("ntp")) + // ntp = server.arg("ntp"); + server.send(200, "text/html", + "\n" + "\n" + "Grow Controller - Config\n" + "\n" + "

Grow Controller - Configuration

" + "
\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" +// " \n" +// " \n" +// " \n" +// " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
Node Name
SSID **\n" + "
Password **\n" + "
Update URL
NTP Server
Auto-Off (time in seconds when non-zero)
On Reference (sense above this indicates power is on)
Off Reference (sense below this indicates power is off)
 \n" + " \n" + " ** Changes to these will trigger a module restart.\n" + "

 Check for SW update (module will restart if updated)
\n" + "
\n" + "
\n" + "NAV:  " + " Home | " + " Config | " + " Scan | " + " RSSI | " + " Current | " + " Factory Reset | " + " About\n" + "
\n" + "\n" + "\n" + ); +} diff --git a/Firmware/Web_APConfig.h b/Firmware/Web_APConfig.h new file mode 100644 index 0000000..720b8de --- /dev/null +++ b/Firmware/Web_APConfig.h @@ -0,0 +1,12 @@ + +#ifndef WEB_APCONFIG_H +#define WEB_APCONFIG_H + + +void FactoryReset(bool forceRestart = false); + +void HandleAPScan(); + +void HandleAPConfigPage(); + +#endif // WEB_APCONFIG_H diff --git a/Firmware/Web_FavIcon.cpp b/Firmware/Web_FavIcon.cpp new file mode 100644 index 0000000..77ec92d --- /dev/null +++ b/Firmware/Web_FavIcon.cpp @@ -0,0 +1,39 @@ + +#include + +#include "ProjGlobals.h" +#include "Web_FavIcon.h" +#include "Web_Resources.h" + +void HandleGreen1x1() { + Serial.printf("Green1x1.png\n"); + server.send_P(200, "image/png", Green1x1_png, sizeof(Green1x1_png)); +} + +void HandleFavIcon() { + Serial.printf("favicon.ico\n"); + server.send_P(200, "image/x-icon", favicon_ico, sizeof(favicon_ico)); +} + +void HandleIcon() { + Serial.printf("icon.png\n"); + server.send_P(200, "image/png", icon_png, sizeof(icon_png)); +} + +void HandleOpenDoor() { + Serial.printf("Open.png\n"); + server.send_P(200, "image/png", Open_png, sizeof(Open_png)); +} + +void HandlePlantModel() { + Serial.printf("PlantModel\n"); + server.send_P(200, "image/png", PlantModel_png, sizeof(PlantModel_png)); +} +void HandleHeater() { + Serial.printf("Heater\n"); + server.send_P(200, "image/png", Heater_png, sizeof(Heater_png)); +} +void HandleWater() { + Serial.printf("Water\n"); + server.send_P(200, "image/png", Water_png, sizeof(Water_png)); +} diff --git a/Firmware/Web_FavIcon.h b/Firmware/Web_FavIcon.h new file mode 100644 index 0000000..8b4967a --- /dev/null +++ b/Firmware/Web_FavIcon.h @@ -0,0 +1,13 @@ + +#ifndef WEB_FAVICON_H +#define WEB_FAVICON_H + +void HandleGreen1x1(); +void HandleFavIcon(); +void HandlePlantModel(); +void HandleHeater(); +void HandleWater(); +void HandleIcon(); +void HandleOpenDoor(); + +#endif // WEB_FAVICON_H \ No newline at end of file diff --git a/Firmware/Web_RSSIGraph.cpp b/Firmware/Web_RSSIGraph.cpp new file mode 100644 index 0000000..1eed749 --- /dev/null +++ b/Firmware/Web_RSSIGraph.cpp @@ -0,0 +1,22 @@ + +#include + +#include "ProjGlobals.h" +#include "Web_RSSIGraph.h" +#include "Web_Resources.h" + +void HandleRSSIPage() { + server.send_P(200, "text/html", rssi_htm); +} + +void HandleRSSI_JS() { + server.send_P(200, "text/html", rssi_js); +} + +void HandleCurrPage() { + server.send_P(200, "text/html", curr_htm); +} + +void HandleCurr_JS() { + server.send_P(200, "text/html", curr_js); +} \ No newline at end of file diff --git a/Firmware/Web_RSSIGraph.h b/Firmware/Web_RSSIGraph.h new file mode 100644 index 0000000..4a5048f --- /dev/null +++ b/Firmware/Web_RSSIGraph.h @@ -0,0 +1,10 @@ + +#ifndef WEB_RSSIGRAPH_H +#define WEB_RSSIGRAPH_H + +void HandleRSSIPage(); +void HandleRSSI_JS(); +void HandleCurrPage(); +void HandleCurr_JS(); + +#endif // WEB_RSSIGRAPH_H diff --git a/Firmware/Web_Resources.h b/Firmware/Web_Resources.h new file mode 100644 index 0000000..6d2a2f5 --- /dev/null +++ b/Firmware/Web_Resources.h @@ -0,0 +1,3549 @@ +// +// Command : MakeByteArray -ESP -DIR *.* -o=..\Web_Resources.h +// version: 1.0 +// From cwd : D:/Projects/GrowController/Firmware/Resources +// Generated: Tue Sep 28 16:12:34 2021 +// Run script in command shell, not PowerShell + +// File: about.htm +// +const char about_htm[] PROGMEM = { + "\n" + "\n" + "\n" + " Grow Controller\n" + " \n" + " \n" + " \n" + "\n" + "\n" + "

Grow Controller

\n" + " by Smartware Computing\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
\n" + " This Grow Controller is an IOT device based on an ESP8266-12 module. The software for it has been\n" + " derived from various sources and where copyrights have been identified, they are listed below.
\n" + "
    \n" + "
  • The composite work is Copyright © 2018-2021 by Smartware Computing, all rights reserved.
  • \n" + "
  • Library for WEMO emulation, Copyright © 2016 by Xose Pérez
  • \n" + "
  • Libraries; Copyright © 2001-2013 Free Software Foundation, Inc.
  • \n" + "
  • Libraries; Copyright (c) 1997 Silicon Graphics Computer Systems, Inc.
  • \n" + "
\n" + "
\n" + "
Toggle Button
\n" + "
Each press will toggle the circuit between on and off.
\n" + "
Reset Button
\n" + "
Momentary press resets unit. Very Long press causes Factory reset back to Access Point mode.
\n" + "
\n" + "
\n" + "\n" + " Mode: \n" + " Uptime: \n" + "\n" + "
\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
NAV:\n" + " Home |\n" + " Config |\n" + " Scan |\n" + " RSSI |\n" + " Current |\n" + " Factory Reset |\n" + " About\n" + "
\n" + "\n" + "\n" +}; // about_htm, 1839 bytes + +// File: about.js +// +const char about_js[] PROGMEM = { + "//\n" + "// rssi script\n" + "//\n" + "// var mySite = 'http://192.168.1.23' from myip.js\n" + "var url = mySite + '/state';\n" + "setInterval(RefreshStatus, 5000);\n" + "\n" + "getIt = function(aUrl, callback) {\n" + " var xhr = new XMLHttpRequest();\n" + " xhr.open('GET', aUrl, true);\n" + " xhr.responseType = 'text';\n" + " xhr.onload = function(e) {\n" + " if (this.status === 200) {\n" + " callback(this.response);\n" + " }\n" + " };\n" + " xhr.send();\n" + "}\n" + "\n" + "function RefreshStatus() {\n" + " getIt(url,\n" + " function(data) {\n" + " obj = JSON.parse(data);\n" + " var elms = document.querySelectorAll('.' + 'ip'), i;\n" + " for (i = 0; i < elms.length; ++i) {\n" + " elms[i].textContent = obj.ip;\n" + " }\n" + " }\n" + " );\n" + "}\n" +}; // about_js, 605 bytes + +// File: Button.css +// +const char Button_css[] PROGMEM = { + "input.BigButton {\n" + " width: 150px;\n" + " padding: 20px;\n" + " white-space: normal;\n" + " cursor: pointer;\n" + " font-weight: bold;\n" + " font-size: 120%;\n" + " background: #3366cc;\n" + " color: #fff;\n" + " border: 5px solid #112233;\n" + " border-radius: 10px;\n" + " -moz-box-shadow: 6px 6px 5px #999;\n" + " -webkit-box-shadow: 6px 6px 5px #999;\n" + " box-shadow: 6px 6px 5px #999;\n" + "}\n" + "\n" + "input.BigButton:hover {\n" + " color: #ffff00;\n" + " background: #000;\n" + " border: 5px solid #fff;\n" + "}\n" +}; // Button_css, 404 bytes + +// File: curr.htm +// +const char curr_htm[] PROGMEM = { + "\n" + "\n" + "\n" + " Grow Controller\n" + " \n" + " \n" + " \n" + "\n" + "\n" + "

Grow Controller - Current Sense

\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
\n" + " \n" + "
\n" + "
x:xx:xx
\n" + "
\n" + "
xx
\n" + "
\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
NAV:\n" + " Home |\n" + " Config |\n" + " Scan |\n" + " RSSI |\n" + " Current |\n" + " Factory Reset |\n" + " About\n" + "
\n" + "\n" + "\n" +}; // curr_htm, 1196 bytes + +// File: curr.js +// +const char curr_js[] PROGMEM = { + "//\n" + "// curr script\n" + "//\n" + "// var mySite = 'http://192.168.1.23' from myip.js\n" + "var url = mySite + '/state';\n" + "var rawData = [];\n" + "var avgData = [];\n" + "var currIndex = 0;\n" + "var axes = {};\n" + "var totalSamples = 400; // Width of the graph\n" + "for (var i = 0; i < totalSamples; i++)\n" + " rawData[i] = avgData[i] = 0;\n" + "setInterval(RefreshStatus, 250);\n" + "\n" + "// -------------------------\n" + "\n" + "getIt = function (aUrl, callback) {\n" + " var xhr = new XMLHttpRequest();\n" + " xhr.open('GET', aUrl, true);\n" + " xhr.responseType = 'text';\n" + " xhr.onload = function (e) {\n" + " if (this.status === 200) {\n" + " callback(this.response);\n" + " }\n" + " };\n" + " xhr.send();\n" + "};\n" + "\n" + "function RefreshStatus() {\n" + " getIt(url,\n" + " function (data) {\n" + " obj = JSON.parse(data);\n" + " UpdateGraph(obj.raw, obj.sense); // raw and averaged\n" + " document.getElementById('uptime').innerHTML = 'Uptime: ' + obj.uptime;\n" + " document.getElementById('currText').innerHTML = 'raw: ' + obj.raw + ', avg: ' + obj.sense;\n" + " }\n" + " );\n" + "}\n" + "\n" + "function CurrInit() {\n" + " var canvas = document.getElementById('curr');\n" + " if (null === canvas || !canvas.getContext)\n" + " return;\n" + " ctx = canvas.getContext('2d');\n" + " axes.w = 0.9 * canvas.width;\n" + " axes.h = 0.8 * canvas.height;\n" + " axes.x0 = 0.07 * canvas.width; // x0 pixels from left to x=0\n" + " axes.y0 = 0.10 * canvas.height; // y0 pixels from top to y=0\n" + " axes.scaleX = totalSamples; // # pixels from x=0 to x=1\n" + " axes.scaleY = 1024;\n" + " axes.doNegativeX = false;\n" + " ctx.clearRect(0, 0, canvas.width, canvas.height);\n" + " ctx.rect(0, 0, canvas.width - 1, canvas.height - 1);\n" + " ctx.strokeStyle = 'black';\n" + " ctx.lineWidth = 1;\n" + " ctx.stroke();\n" + " showAxes(ctx, axes);\n" + "}\n" + "\n" + "function UpdateGraph(rawCurr, avgCurr) {\n" + " var xx, yy;\n" + " var i;\n" + "\n" + " if (rawCurr > axes.scaleY) // safety limit\n" + " rawCurr = axes.scaleY;\n" + " else if (rawCurr < 0)\n" + " rawCurr = 0;\n" + " if (avgCurr > axes.scaleY) // safety limit\n" + " avgCurr = axes.scaleY;\n" + " else if (avgCurr < 0)\n" + " avgCurr = 0;\n" + " rawData[currIndex] = rawCurr;\n" + " avgData[currIndex] = avgCurr;\n" + " console.log('UpdateGraph(-' + rawCurr + ')');\n" + " CurrInit();\n" + "\n" + " // Draw Raw\n" + " x0 = axes.x0;\n" + " y0 = axes.y0;\n" + " ctx.beginPath();\n" + " ctx.strokeStyle = '#FF8080';\n" + " ctx.lineWidth = 3;\n" + " for (i = 0; i < totalSamples; i++) {\n" + " pi = (currIndex + 1 + i) % totalSamples;\n" + " xx = x0 + i / axes.scaleX * axes.w;\n" + " yy = y0 + axes.h - rawData[pi] / axes.scaleY * axes.h;\n" + " ctx.lineTo(xx, yy);\n" + " }\n" + " ctx.stroke();\n" + " // Circle\n" + " ctx.beginPath();\n" + " ctx.arc(xx, yy, 7, 0, 2 * Math.PI, false);\n" + " ctx.fillstyle = '#FF8080';\n" + " ctx.fill();\n" + " ctx.strokeStyle = '#FF0000';\n" + " ctx.stroke();\n" + "\n" + " // Draw Average\n" + " x0 = axes.x0;\n" + " y0 = axes.y0;\n" + " ctx.beginPath();\n" + " ctx.strokeStyle = '#8080FF';\n" + " ctx.lineWidth = 3;\n" + " for (i = 0; i < totalSamples; i++) {\n" + " pi = (currIndex + 1 + i) % totalSamples;\n" + " xx = x0 + i / axes.scaleX * axes.w;\n" + " yy = y0 + axes.h - avgData[pi] / axes.scaleY * axes.h;\n" + " ctx.lineTo(xx, yy);\n" + " }\n" + " ctx.stroke();\n" + " // Circle\n" + " ctx.beginPath();\n" + " ctx.arc(xx, yy, 7, 0, 2 * Math.PI, false);\n" + " ctx.fillstyle = '#8080FF';\n" + " ctx.fill();\n" + " ctx.strokeStyle = '#0000FF';\n" + " ctx.stroke();\n" + " currIndex++;\n" + " currIndex %= totalSamples;\n" + "}\n" + "\n" + "function showAxes(ctx, axes) {\n" + " var x0 = axes.x0, w = axes.w;\n" + " var y0 = axes.y0, h = axes.h;\n" + " var xmin = axes.doNegativeX ? 0 : x0;\n" + " ctx.lineWidth = 1;\n" + " ctx.font = '12px Arial';\n" + " ctx.textAlign = 'end';\n" + " ctx.beginPath();\n" + " ctx.strokeStyle = 'rgb(128,128,128)';\n" + " ctx.moveTo(x0, y0); ctx.lineTo(x0, y0 + h); // Y axis\n" + " for (var y = 0; y <= axes.scaleY; y += 100) {\n" + " yy = axes.y0 + axes.h - y / axes.scaleY * axes.h;\n" + " ctx.moveTo(xmin, yy); ctx.lineTo(x0 + w, yy); // X axis\n" + " ctx.fillText(y, x0 - 3, yy + 3);\n" + " }\n" + " ctx.font = '18px Arial';\n" + " ctx.textAlign = 'start';\n" + " ctx.fillText('Current Graph', axes.x0, axes.y0 - 6);\n" + " ctx.stroke();\n" + "}\n" +}; // curr_js, 3615 bytes + +// File: favicon.ico +// +const char favicon_ico[] PROGMEM = { + 0x00,0x00,0x01,0x00,0x01,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x00,0xA8,0x10, + 0x00,0x00,0x16,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x40,0x00, + 0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08, + 0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08, + 0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08, + 0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08, + 0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0xFF,0x08,0x08, + 0x08,0xFF,0x02,0x02,0x02,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00,0x00,0xFF,0x06,0x06, + 0x06,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x0A,0x02,0x00,0xFF,0x06,0x06, + 0x06,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x3F, + 0x0F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66, + 0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66, + 0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x66, + 0x3F,0xFF,0xFF,0x66,0x3F,0xFF,0xFF,0x59,0x2F,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x22,0x06,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x66, + 0x3F,0xFF,0x82,0x82,0x82,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59, + 0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59, + 0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59,0x59,0xFF,0x59,0x59, + 0x59,0xFF,0x45,0x45,0x45,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x22,0x06,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x0F,0x0F,0x0C,0xFF,0x3F,0x3F,0x33,0xFF,0x16,0x16, + 0x13,0xFF,0x3F,0x3F,0x33,0xFF,0x31,0x31,0x28,0xFF,0x31,0x31,0x28,0xFF,0x3F,0x3F, + 0x33,0xFF,0x3F,0x3F,0x33,0xFF,0x3F,0x3F,0x33,0xFF,0x3F,0x3F,0x33,0xFF,0x2F,0x2F, + 0x26,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x31,0x09,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x12,0x12, + 0x12,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFD,0x64, + 0x3E,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0xCC,0xBF,0xFF,0xFD,0xD6, + 0xCD,0xFF,0x57,0x57,0x57,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x1E,0x1E,0x1E,0xFF,0xFF,0xF2,0xEF,0xFF,0xFF,0xCC,0xBF,0xFF,0xFF,0xCC, + 0xBF,0xFF,0xFF,0xB5,0xA2,0xFF,0xFF,0x33,0x00,0xFF,0x26,0x07,0x00,0xFF,0x19,0x19, + 0x19,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xBD,0xBD,0xBD,0xFF,0x06,0x06,0x06,0xFF,0x08,0x08, + 0x08,0xFF,0x14,0x14,0x14,0xFF,0x3F,0x3F,0x33,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xBF,0xBF, + 0x99,0xFF,0x06,0x06,0x06,0xFF,0x21,0x21,0x21,0xFF,0x0A,0x0A,0x0A,0xFF,0x00,0x00, + 0x00,0xFF,0xBF,0xBF,0xBF,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00,0x00,0xFF,0x12,0x12, + 0x12,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xEC,0xEC,0xEC,0xFF,0x34,0x34,0x34,0xFF,0x1B,0x1B, + 0x1B,0xFF,0x91,0x91,0x74,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0x97,0x97,0x7B,0xFF,0x08,0x08,0x08,0xFF,0x2F,0x2F, + 0x2F,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x59,0x2F,0xFF,0xFA,0xED,0xEA,0xFF,0x34,0x34, + 0x34,0xFF,0x0C,0x0C,0x0C,0xFF,0xCF,0xCF,0xA5,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xCF,0xCF,0xA5,0xFF,0x06,0x06,0x06,0xFF,0x35,0x35,0x35,0xFF,0xFF,0xF2, + 0xEF,0xFF,0xFF,0x53,0x27,0xFF,0xFF,0x33,0x00,0xFF,0x26,0x07,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x59,0x2F,0xFF,0xEC,0xEC, + 0xEC,0xFF,0x34,0x34,0x34,0xFF,0x29,0x29,0x26,0xFF,0xD5,0xD5,0xAB,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xCF,0xCF, + 0xA5,0xFF,0x0F,0x0F,0x0C,0xFF,0x2F,0x2F,0x2F,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0x59, + 0x2F,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x59, + 0x2F,0xFF,0xFA,0xED,0xEA,0xFF,0x2E,0x2E,0x2E,0xFF,0x19,0x19,0x19,0xFF,0xD5,0xD5, + 0xAC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xD5,0xD5,0xAC,0xFF,0x12,0x12, + 0x12,0xFF,0x2F,0x2F,0x2F,0xFF,0xFF,0xF2,0xEF,0xFF,0xFF,0x59,0x2F,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x59,0x2F,0xFF,0xBD,0xBD,0xBD,0xFF,0x19,0x19,0x19,0xFF,0x16,0x16, + 0x13,0xFF,0xCF,0xCF,0xA5,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xFF,0xCC,0xFF,0xD5,0xD5,0xAB,0xFF,0x1C,0x1C,0x19,0xFF,0x2F,0x2F, + 0x2F,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0x59,0x2F,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xBF,0xBF,0xBF,0xFF,0xBF,0xBF,0xBF,0xFF,0xBF,0xBF, + 0xBF,0xFF,0x19,0x19,0x19,0xFF,0xCF,0xCF,0xA5,0xFF,0xFF,0xFF,0xCC,0xFF,0xFF,0xFF, + 0xCC,0xFF,0xCF,0xCF,0xA5,0xFF,0x12,0x12,0x12,0xFF,0x2F,0x2F,0x2F,0xFF,0xFF,0xF2, + 0xEF,0xFF,0xFF,0x59,0x2F,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xBF,0xBF,0xBF,0xFF,0xBF,0xBF,0xBF,0xFF,0xBF,0xBF, + 0xBF,0xFF,0x06,0x06,0x06,0xFF,0x0F,0x0F,0x0C,0xFF,0xCF,0xCF,0xA5,0xFF,0xCF,0xCF, + 0xA5,0xFF,0x0F,0x0F,0x0C,0xFF,0x2F,0x2F,0x2F,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0x59, + 0x2F,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xBF,0xBF,0xBF,0xFF,0x8F,0x8F,0x8F,0xFF,0xFF,0x33, + 0x00,0xFF,0xBF,0xBF,0xBF,0xFF,0x2F,0x2F,0x2F,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x2F,0x2F,0x2F,0xFF,0xFF,0xF2,0xEF,0xFF,0xFF,0x59,0x2F,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFF,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xEF,0xEF,0xEF,0xFF,0xBF,0xBF,0xBF,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xEF,0xEF,0xEF,0xFF,0xBF,0xBF,0xBF,0xFF,0xBF,0xBF, + 0xBF,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0x59,0x2F,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x19,0x19, + 0x19,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xE8,0x29,0x29,0xFF,0xFD,0x00, + 0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xD5,0x3C,0x16,0xFF,0xFF,0x33,0x00,0xFF,0x40,0x40,0x40,0xBF,0x67,0x3D, + 0x31,0xD8,0xD4,0x35,0x0E,0xFF,0xF3,0x41,0x14,0xFF,0xF3,0x41,0x14,0xFF,0xF3,0x41, + 0x14,0xFF,0xF3,0x41,0x14,0xFF,0xF3,0x41,0x14,0xFF,0xF3,0x41,0x14,0xFF,0xF3,0x41, + 0x14,0xFF,0xF6,0x3D,0x0F,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFD,0x00,0x00,0xBF,0xFD,0x00,0x00,0xBF,0xE1,0x32,0x32,0xCF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0xA5,0x3F,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00,0x00,0xFF,0x7F,0x19, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0xA5,0x3F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x26,0x07, + 0x00,0xFF,0x7F,0x19,0x00,0xFF,0x9E,0x1F,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x00,0x00,0x00,0xFF,0x26,0x07,0x00,0xFF,0x9E,0x1F,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33, + 0x00,0xFF,0xFF,0x33,0x00,0xFF,0xFF,0x33,0x00,0xFF,0x7F,0x19,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x26,0x07,0x00,0xFF,0xD1,0x6B, + 0x52,0xFF,0xD1,0x6B,0x52,0xFF,0xD1,0x6B,0x52,0xFF,0xD1,0x6B,0x52,0xFF,0xD1,0x6B, + 0x52,0xFF,0xD1,0x6B,0x52,0xFF,0xD1,0x6B,0x52,0xFF,0x26,0x07,0x00,0xFF,0x00,0x00, + 0x00,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,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4, + 0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0xA4,0xA4,0xA4,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00, + 0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00, + 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,0xE0,0x00, + 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,0xE0,0x00, + 0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07, +}; // favicon_ico, 4286 bytes + +// File: Green1x1.png +// +const char Green1x1_png[] PROGMEM = { + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53, + 0xDE,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, + 0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, + 0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x12,0x74,0x00,0x00,0x12,0x74,0x01,0xDE, + 0x66,0x1F,0x78,0x00,0x00,0x00,0x0C,0x49,0x44,0x41,0x54,0x18,0x57,0x63,0x50,0xDA, + 0xE8,0x03,0x00,0x02,0x18,0x01,0x20,0xE2,0xE0,0x90,0x6F,0x00,0x00,0x00,0x00,0x49, + 0x45,0x4E,0x44,0xAE,0x42,0x60,0x82, +}; // Green1x1_png, 119 bytes + +// File: Heater.png +// +const char Heater_png[] PROGMEM = { + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x4A,0x00,0x00,0x00,0x18,0x08,0x03,0x00,0x00,0x00,0x6A,0x48,0x9B, + 0xBF,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, + 0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, + 0x00,0x27,0x50,0x4C,0x54,0x45,0xFF,0x00,0x00,0xFF,0x70,0x70,0xFF,0x30,0x30,0xFF, + 0x8F,0x8F,0xFF,0x50,0x50,0xFF,0x08,0x08,0xFF,0x18,0x18,0xFF,0x40,0x40,0xFF,0x58, + 0x58,0xFF,0x20,0x20,0xFF,0x10,0x10,0xFF,0x97,0x97,0x00,0x00,0x00,0x7A,0x54,0x91, + 0x5B,0x00,0x00,0x00,0x0D,0x74,0x52,0x4E,0x53,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0xE8,0x22,0x86,0x00,0x00,0x00,0x09,0x70,0x48, + 0x59,0x73,0x00,0x00,0x0E,0xC2,0x00,0x00,0x0E,0xC2,0x01,0x15,0x28,0x4A,0x80,0x00, + 0x00,0x01,0x04,0x49,0x44,0x41,0x54,0x48,0x4B,0xED,0x53,0xDB,0x16,0x83,0x20,0x0C, + 0x13,0xAF,0x73,0xF2,0xFF,0xDF,0xBB,0x36,0x69,0xA1,0x75,0x3E,0x78,0xCE,0xF6,0x68, + 0x5E,0x0C,0x10,0x92,0xA8,0x30,0xD4,0xBF,0xE1,0xB1,0xBA,0x8F,0x66,0x35,0x28,0x0A, + 0x68,0x01,0x07,0xAD,0xA3,0xD2,0x91,0x1C,0xD3,0x13,0x68,0x94,0x38,0x7C,0x38,0x63, + 0x6D,0x01,0x5F,0xC0,0x67,0x70,0x50,0x8A,0x28,0x59,0xC1,0xA3,0xC4,0xE1,0x56,0x58, + 0x62,0x2D,0x26,0x72,0x3F,0x4A,0x59,0x2D,0x52,0xD4,0x8A,0x92,0x06,0x1B,0x31,0x91, + 0xB5,0x98,0xC8,0x4C,0xA3,0xAA,0x72,0x89,0xD6,0x8A,0x92,0x06,0x11,0x95,0x6D,0xDB, + 0x6C,0x49,0x6B,0x79,0xA2,0xEE,0xB7,0x52,0xA8,0x65,0x4C,0x6B,0x75,0x89,0x6C,0x25, + 0x5E,0xB0,0xEA,0x3E,0x82,0xA5,0x25,0x6A,0xA6,0x11,0x41,0x2B,0xA5,0xB5,0xBA,0xA4, + 0x61,0xFF,0xB6,0x1A,0xDE,0xF6,0x54,0xEC,0xF6,0x14,0x04,0x9A,0xB8,0xE3,0xCA,0xEA, + 0x36,0x72,0xB5,0x6C,0x75,0xF4,0xC5,0xE5,0x30,0x22,0x98,0xFB,0xAB,0x45,0xC9,0x1A, + 0xDE,0x5E,0x90,0xAC,0xC6,0xF0,0x35,0x4B,0xFF,0xE0,0x22,0x30,0x92,0x25,0x53,0x90, + 0x08,0x68,0xD5,0xE1,0x99,0x7A,0x24,0x8C,0xEA,0xFF,0x6E,0xB5,0x82,0x84,0x27,0x35, + 0x21,0x59,0x79,0xA6,0x1E,0x54,0xCF,0xD4,0x79,0xA3,0x7A,0x50,0x5D,0xC2,0xFB,0x93, + 0x90,0xAC,0x2C,0x93,0xD7,0x07,0x94,0x87,0xD0,0x6A,0x61,0x9A,0x92,0x8B,0x52,0x27, + 0x2B,0x66,0xF2,0x52,0xB3,0x16,0x28,0x6D,0x79,0xA9,0x29,0xB9,0x28,0x75,0xB2,0xFA, + 0x09,0x8F,0xD5,0x5D,0xD4,0xFA,0x01,0xFE,0x53,0x35,0x93,0x78,0xB2,0x5F,0x66,0x00, + 0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82, +}; // Heater_png, 443 bytes + +// File: icon.png +// +const char icon_png[] PROGMEM = { + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xA0,0x08,0x02,0x00,0x00,0x00,0x14,0xE1,0x7C, + 0xE3,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, + 0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, + 0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7, + 0x6F,0xA8,0x64,0x00,0x00,0x21,0xA6,0x49,0x44,0x41,0x54,0x78,0x5E,0xED,0x9D,0x07, + 0x60,0x14,0x55,0xFE,0xC7,0xB3,0xB3,0x35,0x6D,0xB3,0xBB,0xE9,0x8D,0xF4,0x84,0x84, + 0x40,0x48,0x08,0x20,0x2D,0x90,0x80,0x34,0xA9,0x22,0x20,0x2A,0x28,0x82,0xE5,0xF0, + 0x44,0x3D,0x1B,0x78,0xF7,0xBF,0xF3,0x3C,0x3D,0xFF,0x7A,0x77,0x9E,0x5E,0xF1,0xD4, + 0x13,0xB1,0xA1,0x22,0x52,0x44,0x10,0x10,0xA4,0x93,0x04,0x48,0x42,0x80,0x90,0x02, + 0x04,0xD2,0x48,0xDB,0x24,0x9B,0x64,0x7B,0xCD,0xFF,0x3B,0xFB,0x86,0x25,0xD9,0xDD, + 0x6C,0x49,0x36,0x67,0xB9,0xFF,0x87,0x61,0x33,0xF3,0x66,0x76,0x77,0x7E,0xAF,0xFC, + 0xCA,0x7B,0x6F,0xDE,0xB2,0x7A,0x7A,0x7A,0xBC,0xFE,0xB3,0x98,0x4C,0x26,0x8D,0x46, + 0x63,0x34,0x1A,0xD9,0x6C,0x36,0xF6,0xF1,0xCA,0x62,0xB1,0x04,0x02,0x01,0x73,0x7A, + 0x88,0x19,0x72,0x81,0xF5,0x7A,0x7D,0x63,0x63,0xE3,0x8D,0x1B,0x37,0xDA,0xCC,0x48, + 0xA5,0x52,0xB5,0x5A,0x8D,0xF4,0xE8,0xE8,0xE8,0x65,0xCB,0x96,0x61,0xA7,0xA5,0xA5, + 0x65,0xCB,0x96,0x2D,0x90,0x59,0x2C,0x16,0x47,0x45,0x45,0x4D,0x9D,0x3A,0x95,0xC7, + 0xE3,0x19,0x0C,0x06,0x91,0x48,0x64,0xFE,0x00,0x0F,0x33,0x54,0x02,0x77,0x74,0x74, + 0x94,0x97,0x97,0x5F,0xBD,0x7A,0xB5,0xBE,0xBE,0x1E,0x85,0xC9,0xA4,0x9A,0xE1,0x72, + 0xB9,0x1C,0x0E,0x27,0x2E,0x2E,0x6E,0xDA,0xB4,0x69,0x14,0x45,0xB5,0xB6,0xB6,0xEE, + 0xDE,0xBD,0x1B,0x65,0x8E,0x53,0x41,0x41,0x41,0xF7,0xDF,0x7F,0xBF,0x42,0xA1,0x78, + 0xFF,0xFD,0xF7,0xFD,0xFC,0xFC,0x12,0x13,0x13,0x53,0x52,0x52,0xE2,0xE3,0xE3,0x71, + 0x3D,0x79,0xEF,0xE0,0xF1,0xB0,0xC0,0xB8,0xEF,0x8A,0x8A,0x8A,0x92,0x92,0x92,0x86, + 0x86,0x06,0xF2,0xC9,0x10,0x09,0x62,0x44,0x46,0x46,0x06,0x07,0x07,0x87,0x84,0x84, + 0x84,0x86,0x86,0xFA,0xFA,0xFA,0x22,0x1D,0x45,0x6A,0x7E,0x07,0x0D,0xAE,0x44,0xA6, + 0xA0,0xF0,0xF1,0x76,0x89,0x44,0x82,0xEA,0xB0,0x77,0xEF,0x5E,0x95,0x4A,0x85,0x53, + 0xFE,0xFE,0xFE,0x0F,0x3E,0xF8,0x20,0x2E,0xC0,0xA9,0x88,0x88,0x08,0x72,0xFD,0x60, + 0xF0,0x98,0xC0,0x4A,0xA5,0x12,0x72,0xE6,0xE7,0xE7,0x93,0x1A,0xCB,0xE7,0xF3,0x51, + 0x32,0x69,0x69,0x69,0x09,0x09,0x09,0xDE,0xDE,0xDE,0xBD,0xC5,0x73,0x05,0xC8,0xDF, + 0xDC,0xDC,0x5C,0x55,0x55,0x85,0x37,0x66,0x67,0x67,0x5F,0xBB,0x76,0x6D,0xD7,0xAE, + 0x5D,0xA8,0x14,0x39,0x39,0x39,0x31,0x31,0x31,0xEE,0x7E,0x5A,0x6F,0x3C,0x20,0xB0, + 0x56,0xAB,0x2D,0x2C,0x2C,0x3C,0x75,0xEA,0x94,0x4E,0xA7,0xC3,0xAD,0x84,0x87,0x87, + 0x67,0x65,0x65,0x8D,0x1C,0x39,0x12,0x32,0x33,0x57,0x0C,0x02,0xDC,0x1E,0x72,0xB0, + 0xAC,0xAC,0xEC,0xF0,0xE1,0xC3,0x28,0x64,0x7C,0xFE,0x88,0x11,0x23,0xEE,0xB8,0xE3, + 0x0E,0x64,0x22,0x73,0x85,0x9B,0x0C,0x4A,0x60,0xBC,0x17,0xAD,0xF4,0xDB,0x6F,0xBF, + 0x95,0xC9,0x64,0xA8,0xBA,0x50,0x39,0x68,0x96,0xB1,0xB1,0xB1,0xD8,0x67,0xAE,0xF0, + 0x1C,0xA8,0xE1,0xC8,0xD3,0xF3,0xE7,0xCF,0xCF,0x9F,0x3F,0x1F,0x79,0xDA,0xD4,0xD4, + 0x04,0xB5,0xE7,0xE3,0xE3,0xC3,0x9C,0x76,0x99,0x81,0x0B,0x8C,0x8C,0xDF,0xB3,0x67, + 0x0F,0x34,0x13,0x3E,0x01,0xED,0x73,0xCE,0x9C,0x39,0xA8,0x72,0x83,0xA9,0x6C,0xAE, + 0x80,0x42,0x26,0x7C,0xF4,0xD1,0x47,0xB0,0x67,0x8B,0x16,0x2D,0x82,0x62,0x63,0xCE, + 0xB9,0xC6,0x00,0x05,0x86,0xA5,0xD9,0xB6,0x6D,0x1B,0x0A,0x16,0xF5,0x76,0xF2,0xE4, + 0xC9,0x13,0x26,0x4C,0xF0,0xA0,0x22,0x75,0x4A,0x7B,0x7B,0xFB,0x8E,0x1D,0x3B,0xA0, + 0xDB,0x50,0x95,0x26,0x4D,0x9A,0x94,0x9B,0x9B,0xEB,0x7A,0x9D,0x72,0x5B,0x60,0x5C, + 0x5F,0x5A,0x5A,0x8A,0x6A,0x0C,0x03,0x8B,0x82,0x5D,0xBA,0x74,0x29,0x74,0x2F,0x73, + 0xAE,0x7F,0xB4,0x3A,0x0D,0x9F,0xE7,0x49,0xD7,0x02,0x5A,0xED,0xC8,0x91,0x23,0x05, + 0x05,0x05,0x50,0x16,0x68,0x47,0xD0,0xFC,0xB0,0x76,0xCC,0x39,0x87,0xB8,0x27,0x30, + 0x2E,0x86,0x1E,0x3E,0x74,0xE8,0x10,0xF6,0x47,0x8D,0x1A,0x35,0x77,0xEE,0x5C,0x57, + 0x34,0x53,0x4B,0x7B,0xD3,0x63,0xBF,0xBF,0xF7,0xC9,0xFB,0x7F,0x33,0x3E,0x63,0x32, + 0x97,0xC3,0x33,0x18,0x0D,0xC5,0x65,0x05,0xF1,0xC3,0x92,0x83,0xC5,0xA1,0xCC,0x15, + 0x03,0xA5,0xA6,0xA6,0x06,0xE6,0x1A,0x8E,0xCA,0xB9,0x73,0xE7,0x46,0x8F,0x1E,0x1D, + 0x10,0x10,0xC0,0x9C,0xE8,0x1F,0x37,0x04,0xC6,0x95,0x10,0x15,0x9A,0x03,0x0D,0x35, + 0x2F,0x2F,0x0F,0x35,0xD9,0xC5,0x16,0xAB,0xD3,0x6B,0x7F,0xFD,0xE6,0xFA,0x82,0x73, + 0xC7,0xD2,0x93,0x32,0xDF,0xFC,0xF5,0xE6,0x4F,0x77,0xBF,0xF7,0xFE,0xB6,0xBF,0x85, + 0x06,0x86,0x7F,0xFD,0xF6,0x09,0xE6,0x8A,0x41,0x00,0x1B,0x51,0x54,0x54,0x74,0xF0, + 0xE0,0x41,0x48,0xBB,0x72,0xE5,0x4A,0xD8,0x7C,0xE6,0x44,0x3F,0xB8,0xA1,0x4E,0x8F, + 0x1E,0x3D,0x0A,0x69,0xA1,0x2A,0xE6,0xCD,0x9B,0x37,0x65,0xCA,0x14,0xD7,0xF5,0x13, + 0x8F,0xCB,0x7F,0xFD,0x99,0x77,0xFE,0xF5,0xE2,0x67,0x95,0xD7,0x2E,0x1E,0x3D,0x7D, + 0xE0,0xCC,0x85,0x53,0x48,0x94,0x75,0x77,0x90,0xB3,0x83,0x04,0x55,0x2C,0x23,0x23, + 0x03,0x3E,0x49,0x57,0x57,0xD7,0xC7,0x1F,0x7F,0x8C,0x57,0xE6,0x44,0x3F,0xB8,0x2A, + 0xF0,0xD9,0xB3,0x67,0x8F,0x1D,0x3B,0x06,0x21,0x17,0x2E,0x5C,0x38,0x66,0xCC,0x18, + 0x26,0xD5,0x65,0xF0,0x46,0x14,0x6F,0x46,0xEA,0xD8,0x8F,0x76,0xFD,0xAB,0xB1,0xB5, + 0x1E,0x29,0x91,0xA1,0xD1,0xE4,0xD4,0xE0,0x41,0xAD,0x86,0x43,0x0A,0xA3,0x08,0xE7, + 0xA7,0xBA,0xBA,0x1A,0xCA,0x85,0x39,0x61,0x0F,0x97,0x04,0x86,0xB7,0x08,0x2D,0x85, + 0x9D,0xD9,0xB3,0x67,0xA3,0xE9,0x92,0x44,0x57,0x40,0x65,0x3E,0x55,0x72,0xE4,0xEC, + 0xC5,0x53,0x46,0x93,0x11,0x32,0xAF,0xBF,0x6F,0x43,0x67,0x77,0x47,0x9B,0xAC,0x15, + 0xA7,0x42,0x83,0x3C,0xE0,0x27,0x5A,0x40,0x39,0xAF,0x58,0xB1,0x02,0x85,0x91,0x94, + 0x94,0xD4,0xDD,0xDD,0x8D,0x20,0x8C,0x39,0x61,0x83,0x73,0x81,0x61,0x03,0xBE,0xFE, + 0xFA,0x6B,0x34,0x60,0xB8,0x75,0xE3,0xC7,0x8F,0x67,0x52,0x5D,0xE0,0xD2,0xD5,0xF3, + 0x2B,0x9F,0x9B,0xFF,0xF4,0x6B,0x0F,0x3D,0xFE,0xF2,0xFD,0xEB,0x5F,0xBE,0x5F,0xA3, + 0x55,0x27,0x0C,0x4B,0x79,0xEF,0xA5,0x2F,0xC9,0x59,0x49,0x00,0xD3,0xD8,0xA0,0xC0, + 0xC9,0xCE,0x20,0x81,0xA2,0x46,0xA4,0xD1,0xD9,0xD9,0xB9,0x73,0xE7,0xCE,0x7D,0xFB, + 0xF6,0xF5,0xA7,0x9B,0xFA,0x08,0x8C,0x6B,0x6A,0x9B,0x55,0x67,0x2A,0x64,0xC7,0x4A, + 0xDB,0x4A,0xAF,0x74,0x5D,0x6F,0x52,0xB5,0x75,0xAA,0xBE,0xDC,0xF6,0x15,0x0C,0x7D, + 0x72,0x72,0x72,0x6E,0x6E,0x9E,0x42,0x6D,0x20,0x9B,0x46,0xD7,0x6F,0x16,0x12,0x8A, + 0x2F,0x15,0x3E,0xFA,0xBB,0x15,0x41,0xE2,0x90,0x1D,0x7F,0x3F,0xB2,0xF9,0x8F,0x3B, + 0x2B,0xAA,0x2F,0x7E,0xB0,0xE3,0x9F,0x48,0xEF,0xC1,0x3F,0x33,0x42,0xDF,0x80,0x4B, + 0x57,0x4A,0xEF,0xDF,0xB0,0x70,0xC6,0xEA,0xCC,0x77,0xBE,0xF8,0x8B,0x83,0x32,0x71, + 0x1D,0x62,0x32,0xE0,0x84,0x41,0x8D,0xC1,0x23,0x22,0x89,0x56,0xDC,0xD2,0xD2,0x2D, + 0x1D,0xDA,0xD7,0x3F,0xBB,0x7C,0xA9,0xA6,0xDB,0x92,0x35,0xD0,0x4A,0xD0,0x4B,0xE4, + 0x02,0x54,0x48,0x60,0xC9,0x34,0x8A,0xE5,0x95,0x1C,0xED,0x77,0x67,0x4E,0xC4,0xE4, + 0x51,0x41,0x76,0x95,0xD7,0xC9,0x92,0xC3,0xE7,0x2B,0x8A,0x1E,0x5D,0xF1,0x34,0x9B, + 0x62,0xE3,0x10,0x6A,0x79,0xFB,0xC1,0x2D,0xDB,0xDF,0xFA,0xBE,0xB1,0xB5,0xE1,0xBE, + 0xE7,0xE6,0x21,0x45,0x2C,0x0C,0xEC,0x94,0x77,0x64,0xA6,0x8E,0xCB,0x4E,0x9F,0xB0, + 0x79,0xC7,0xDB,0xF7,0xCC,0x5B,0xF3,0x8B,0x15,0x4F,0x9B,0xDF,0x3A,0x58,0x60,0x9C, + 0x0F,0x1C,0x38,0x20,0x10,0x08,0xD6,0xAD,0x5B,0x27,0x14,0x0A,0x99,0xD4,0x9B,0x30, + 0x02,0x77,0x2B,0xF5,0x8F,0xBF,0x79,0x41,0xDA,0xA9,0x9D,0x3C,0x2A,0x30,0x23,0x31, + 0xC0,0xCF,0x9B,0xD3,0xD1,0xAD,0xAB,0xAC,0x6E,0xBA,0x50,0x59,0x67,0x62,0x09,0xC2, + 0xC2,0x23,0x21,0x3A,0x8F,0x43,0xF9,0x08,0xD8,0x78,0x85,0x57,0xD3,0xD1,0xAD,0xBF, + 0xD2,0xA0,0xD0,0xEA,0x4C,0xEB,0xEF,0x4A,0x98,0x73,0x9B,0x73,0x73,0x7A,0xA3,0xA5, + 0xEE,0xEE,0x5F,0xCD,0x7A,0xF5,0x57,0xFF,0x14,0xF9,0x8B,0xD7,0xFE,0xCF,0x52,0xA4, + 0x24,0x44,0x27,0xAF,0x5E,0xF2,0x58,0xDE,0x6D,0x73,0x28,0x16,0xB5,0xEB,0xFB,0x2F, + 0xBE,0x39,0xBC,0xED,0xDD,0x97,0xB6,0x72,0xD8,0x1E,0x70,0xD7,0x20,0xD1,0xE7,0x9F, + 0x7F,0x0E,0x05,0x76,0xFB,0xED,0xB7,0xDB,0x86,0x56,0x8C,0xC0,0x6F,0xEF,0xBA,0xF6, + 0xF5,0x89,0xA6,0x47,0x17,0xC6,0x2D,0xCE,0x61,0x74,0x89,0xC1,0x60,0x40,0x14,0x8E, + 0x18,0x0D,0x6E,0xE3,0xAC,0x59,0xB3,0x48,0x62,0x6F,0x5A,0x65,0xDA,0xC7,0xDF,0x3C, + 0xCF,0xE5,0x50,0x1F,0x6C,0xC8,0xE2,0x71,0x9D,0xE8,0x02,0xD4,0xD8,0x47,0x7E,0xB7, + 0x1C,0x3B,0x0F,0x2D,0x7D,0x62,0xFD,0x2B,0x0F,0x60,0x67,0xDD,0x8A,0x67,0x56,0x2D, + 0x7A,0xD4,0x7C,0x92,0xAE,0xE7,0xF0,0x9C,0x3C,0x22,0x2D,0x81,0xF8,0xDB,0x28,0x19, + 0x48,0x8B,0x88,0x9A,0x49,0x35,0x43,0xDF,0x68,0xB7,0xD2,0xB0,0xAF,0xB0,0x05,0x55, + 0x74,0xE1,0x94,0x70,0x92,0x0A,0xE0,0xBB,0x40,0x5A,0x54,0x89,0xA9,0x53,0xA7,0x32, + 0x49,0x7D,0x09,0x11,0xF3,0x73,0x32,0x82,0x3A,0xE4,0x3A,0x99,0xC2,0x91,0x19,0x20, + 0xE0,0xBB,0x9F,0x5E,0xFD,0xBB,0xAB,0xB5,0x55,0xAF,0x6F,0xFA,0x1D,0x49,0x11,0xF0, + 0x6F,0xC5,0x77,0x68,0x3A,0x1E,0x94,0x16,0x90,0x1E,0xB2,0xE2,0xE2,0xE2,0x2D,0x5B, + 0xB6,0xA0,0xE4,0x48,0x22,0x81,0x16,0xF8,0x6C,0xA5,0x4C,0xA7,0x37,0xCD,0x1E,0x1F, + 0x8A,0x0C,0x21,0xA9,0x70,0x5F,0x8E,0x1F,0x3F,0x8E,0xEC,0x99,0x39,0x73,0xA6,0x83, + 0xEE,0x35,0xC8,0x6C,0x34,0xF6,0x18,0x8C,0x2E,0xE9,0x9B,0xE1,0xF1,0xE9,0x6F,0x6C, + 0x78,0xDF,0xD2,0xDD,0x43,0x6A,0x5A,0x4F,0x8F,0x09,0x8E,0x27,0x31,0x54,0x9E,0x05, + 0x4A,0xFB,0xC2,0x85,0x0B,0x28,0xB3,0x8B,0x17,0x2F,0x32,0x49,0x66,0x68,0x81,0x8B, + 0xAB,0x3A,0xD9,0x14,0x0B,0xC5,0x45,0x92,0x00,0x0C,0xAF,0x5C,0x2E,0x97,0x48,0x24, + 0xA9,0xA9,0xA9,0x4C,0x92,0x3D,0x44,0xFE,0xDC,0xA0,0x00,0x9E,0x0F,0xDF,0xD5,0xC2, + 0xC9,0x4C,0x1B,0xF7,0xC4,0xAA,0x8D,0x64,0x1F,0xB1,0x84,0xD1,0x68,0x78,0xE3,0xC3, + 0x97,0xEF,0x5A,0x9F,0xB7,0x64,0x7D,0xDE,0x4B,0xFF,0x7C,0x76,0xCF,0xD1,0xED,0x07, + 0xF3,0xF7,0x78,0x44,0x5D,0x03,0xC4,0x12,0xA4,0x6E,0xC2,0x3B,0xB4,0xE4,0x32,0xA0, + 0x05,0x2E,0xBB,0xD6,0x15,0x1E,0x28,0x80,0xA2,0x22,0x49,0xF0,0x54,0xE0,0x45,0x62, + 0x07,0x86,0x17,0x8E,0x24,0x49,0xB4,0xCB,0x8C,0x31,0x21,0xFF,0x7E,0x2E,0x4B,0xEC, + 0xEF,0x3C,0x4C,0xB1,0xD8,0x02,0x8B,0x1B,0x84,0x12,0xFE,0x74,0xF7,0xBF,0x77,0x1D, + 0xFA,0xE2,0xB9,0xB5,0x7F,0x78,0x62,0xD5,0x0B,0x95,0xD7,0xCB,0xFE,0xF6,0xC9,0xAB, + 0x5B,0xBE,0x79,0x1F,0xBE,0x0A,0xB9,0x60,0xF0,0xA0,0xB4,0xD0,0x24,0xE1,0x87,0x34, + 0x34,0x34,0x30,0x49,0x5E,0x5E,0x1C,0x95,0xD6,0xD8,0xDA,0xA9,0x1D,0x9F,0x26,0xB1, + 0x28,0xB3,0xFA,0xFA,0x7A,0x98,0x6F,0x91,0x48,0x34,0x62,0xC4,0x08,0x26,0xA9,0x1F, + 0xF0,0x16,0xE8,0x6D,0xE6,0xC0,0x06,0xE4,0x2B,0x4A,0xAC,0xFC,0xEA,0xF9,0xF2,0xEA, + 0x8B,0x3A,0xBD,0x66,0x52,0x66,0xEE,0x8A,0x79,0x0F,0x6A,0x74,0x74,0x8F,0x17,0xA8, + 0x6F,0xAA,0xF9,0x7C,0xEF,0x07,0x6B,0x97,0xAE,0x9F,0x9F,0x7B,0x17,0x0E,0x17,0xCF, + 0x58,0x81,0x53,0x7C,0x2E,0x9F,0x32,0x9B,0x31,0x8F,0x00,0xB3,0xBC,0x60,0xC1,0x02, + 0x6F,0x33,0x4C,0x12,0x4A,0xB8,0xB9,0x5D,0x83,0xDC,0x8F,0x0E,0xB9,0x95,0x54,0x52, + 0x52,0x82,0x57,0x48,0xEB,0x34,0xA6,0x47,0xF5,0x6B,0x69,0x91,0x32,0x07,0x36,0x74, + 0x2B,0xBB,0xE0,0x51,0x9C,0xBE,0x70,0x32,0x22,0x24,0x2A,0x3E,0x3A,0x79,0xC7,0xA1, + 0xCF,0x57,0x6F,0x5C,0x7C,0xA5,0xB6,0x82,0x9C,0xDD,0x71,0xF0,0xF3,0xE4,0xD8,0xB4, + 0xFB,0x16,0x3C,0x4C,0x0E,0x51,0xE0,0xDE,0x7C,0x1F,0x0F,0x4A,0x4B,0x80,0x59,0x42, + 0x63,0x56,0xAB,0xD5,0x0A,0x85,0x82,0xA4,0x50,0xB0,0xB7,0xF8,0x13,0x2C,0x62,0xC2, + 0x5A,0x95,0x4A,0x75,0xF9,0xF2,0x65,0xD4,0xE4,0xAC,0xAC,0x2C,0x92,0xE2,0x80,0x6E, + 0xB9,0xEA,0x70,0x49,0x33,0x73,0x60,0x83,0x58,0x28,0xD9,0xF5,0xCF,0xE3,0x5B,0xFF, + 0xFA,0xDD,0x4B,0xEB,0xFF,0xFA,0xE2,0x2F,0xFF,0xF2,0xE9,0xEB,0x7B,0x4C,0x3D,0xA6, + 0x1D,0xDF,0x7D,0x46,0xCE,0xAA,0x35,0xCA,0xE7,0xD6,0xBE,0x44,0xDC,0x92,0xA1,0x03, + 0x2D,0xF9,0xCC,0x99,0x33,0x9B,0x36,0x6D,0x22,0xA5,0x08,0xA8,0x0E,0x39,0xDD,0xA8, + 0x2C,0x02,0xD7,0xD5,0xD5,0xE9,0x74,0xBA,0xD0,0xD0,0x50,0x68,0x2C,0x92,0xE2,0x80, + 0x4B,0xD7,0xDA,0xF6,0x9E,0x51,0xC8,0xBA,0x98,0xCC,0x73,0x4C,0xB0,0x24,0xF4,0x99, + 0x07,0x5F,0x44,0xF4,0x4F,0x0E,0x97,0xCF,0x7D,0x20,0x25,0xCE,0x49,0x93,0xF1,0x08, + 0xB1,0xB1,0xB1,0xA8,0x89,0xD0,0xD8,0xE4,0x90,0x92,0x99,0x4B,0x38,0x50,0xC8,0x23, + 0xC7,0x08,0xAF,0xF0,0x9A,0x98,0x98,0x48,0xCC,0x86,0x03,0x34,0x5A,0xDD,0xD6,0x23, + 0x2D,0xD2,0x6E,0xD3,0x81,0xFC,0x3A,0x26,0xC9,0x19,0xA3,0x52,0xE0,0xA2,0xD0,0x5F, + 0x14,0x28,0x0A,0xFE,0xE5,0xBD,0xCF,0x93,0xC4,0xA1,0x26,0x3A,0x3A,0x1A,0x8D,0x19, + 0x5A,0x09,0xDA,0x0B,0x87,0x54,0x97,0x92,0xCE,0x72,0x89,0x90,0xD6,0xB4,0xD0,0xA5, + 0x55,0x55,0x55,0xD8,0x41,0xD8,0x81,0x57,0xC7,0x94,0x94,0x37,0x5D,0x6E,0xA4,0xDF, + 0xBB,0xE7,0x4C,0x97,0x5C,0x41,0x8F,0x12,0x38,0x45,0xA9,0x56,0xE8,0x0D,0x74,0x85, + 0x82,0xE4,0xAE,0x77,0xBB,0x0D,0x12,0xF8,0x11,0x81,0x81,0x81,0x88,0x99,0x11,0xF6, + 0xE1,0x90,0x52,0x6A,0xE8,0x9B,0xF6,0xF7,0xA1,0x05,0x96,0xC9,0x64,0x68,0xDC,0x3E, + 0x3E,0x3E,0xC1,0xC1,0xC1,0xF4,0xB5,0xFD,0x83,0xAC,0x29,0x28,0x6B,0x23,0xB6,0x46, + 0xA6,0x34,0xD5,0x36,0xCA,0xCC,0xC9,0x4E,0xA8,0xA8,0x2E,0x23,0xF6,0x69,0x54,0x8A, + 0xDB,0x5D,0x08,0x03,0x06,0x55,0x75,0xC9,0x92,0x25,0x6B,0xD6,0xAC,0x21,0x8D,0x94, + 0x52,0x69,0x8C,0x6C,0x36,0x8B,0x6F,0x76,0x86,0x3B,0x3A,0x3A,0x50,0xDD,0xC5,0x62, + 0x31,0x8F,0xC7,0xD4,0xF0,0xFE,0xC0,0x65,0x72,0x35,0xE3,0x21,0xC0,0x53,0x50,0x9B, + 0x73,0xCD,0x29,0x17,0x2F,0xD3,0x9A,0x03,0x77,0x90,0x96,0xE0,0x46,0x2F,0xC2,0xE0, + 0x81,0xEA,0x42,0x41,0x22,0x6C,0xC4,0x3E,0xA5,0xD5,0x9B,0x88,0xB4,0xA0,0xAD,0xAD, + 0x0D,0xAF,0x4E,0x8B,0x17,0x40,0x8D,0x4B,0xFC,0x19,0x05,0xCB,0x61,0xA3,0x4D,0xBA, + 0x34,0xF0,0x41,0x04,0x86,0x66,0x8E,0x8B,0x4A,0x22,0x29,0xFF,0x31,0x10,0x08,0xED, + 0xDC,0xB9,0x13,0xE5,0x44,0x69,0x75,0x46,0x44,0x3C,0x24,0x55,0x2A,0xA5,0x8D,0xAA, + 0xD3,0x8E,0x3F,0xC2,0xAC,0xDB,0xA2,0x84,0xDE,0xB4,0x62,0x4B,0x8B,0xE6,0x45,0x85, + 0x89,0x49,0xA2,0x03,0xD0,0x7A,0xDB,0x3B,0xE9,0xCF,0x97,0x88,0x82,0x84,0x7E,0xCE, + 0xFB,0x53,0x3D,0x08,0x9A,0x31,0xF4,0x16,0x9C,0x3C,0xE8,0x2D,0x4A,0x67,0x30,0x71, + 0xD9,0x8C,0xC0,0x2D,0x2D,0x2D,0x78,0x0D,0x0F,0xBF,0x15,0x33,0x39,0x20,0x25,0x2E, + 0xE4,0xAD,0xC7,0x53,0xFE,0xFC,0x70,0xF4,0xFF,0xAC,0x4E,0xE7,0xF1,0x9C,0x7B,0x97, + 0x06,0x83,0x5E,0xA3,0xA5,0x7B,0x73,0x2C,0x9D,0x3B,0x84,0xFA,0xFA,0x0F,0x5A,0x5B, + 0x9F,0xEF,0xBD,0xB5,0xB5,0x31,0xCE,0x89,0xA7,0x80,0x07,0x05,0xA5,0x85,0xE2,0x85, + 0xAE,0xA6,0x10,0xEA,0x58,0xF4,0x25,0x82,0x66,0xBC,0xDA,0xF6,0x12,0xF4,0x47,0x44, + 0x68,0xE0,0xC8,0x94,0x61,0x7E,0xBE,0x2E,0xD5,0x67,0xA8,0x2B,0xC4,0x46,0xD8,0x11, + 0xF4,0x1D,0x82,0xE0,0xF3,0xF7,0x87,0x84,0xBC,0xDE,0x7B,0x33,0x1A,0x3D,0x1C,0x3C, + 0xC1,0x22,0x40,0x63,0x21,0x30,0x46,0xA8,0x08,0x59,0x7B,0xB8,0x6C,0xC6,0xE4,0x22, + 0x68,0xC6,0xEB,0x80,0x47,0x22,0x5D,0x80,0xFE,0x22,0xA3,0xA9,0xCF,0x84,0x00,0x82, + 0x5C,0x3E,0x56,0x2E,0x9F,0xA2,0xD5,0x46,0x32,0xC7,0x9E,0x66,0xFA,0xF4,0xE9,0x50, + 0xD4,0x61,0x61,0x61,0x68,0xC3,0x8C,0xB2,0x45,0xFE,0xA3,0x96,0x23,0x33,0x86,0x68, + 0x58,0x8C,0xCB,0xE5,0x79,0x0B,0xE8,0xAC,0x6C,0x92,0xDE,0x20,0x29,0xBD,0x51,0x28, + 0x3E,0xF5,0xF6,0x3E,0x2C,0x93,0xDD,0xC9,0x1C,0x0F,0x01,0x50,0xB4,0x28,0x61,0xD6, + 0x43,0xAF,0x97,0x18,0x0C,0xA6,0x4D,0x1B,0xC6,0x20,0x3A,0x7D,0xF5,0xD5,0x57,0x21, + 0xF0,0x53,0x4F,0xFD,0xAA,0xFA,0x7C,0xA1,0x56,0x25,0x67,0x2E,0xF4,0x1C,0xE5,0xD5, + 0x17,0x54,0x6A,0x25,0xCC,0x52,0x56,0xDA,0x78,0x8B,0x27,0x17,0x9D,0xFE,0x71,0x68, + 0xE8,0xF6,0xE2,0x53,0xBB,0x7B,0x34,0x3D,0x61,0x49,0x7B,0xA3,0x86,0xBD,0x77,0xB1, + 0x68,0xB3,0xB6,0xCB,0xB9,0x63,0xEB,0x3A,0x89,0x99,0x53,0x34,0x3A,0x2D,0x8C,0x13, + 0x0A,0xF5,0x56,0x61,0x22,0x03,0x70,0x13,0x88,0xE9,0x7A,0x4C,0xA6,0xC2,0x6F,0xDE, + 0x6F,0xAE,0x3E,0xCF,0x9C,0x18,0x02,0xF6,0x9F,0xDA,0xCD,0xEC,0x79,0x79,0x3D,0xF4, + 0x66,0x32,0x5E,0x2F,0x9F,0x39,0x70,0xB5,0xF0,0xE8,0x3D,0x2F,0xD1,0xF6,0xB9,0xF6, + 0x52,0xC1,0xB9,0x6F,0xE9,0xE1,0x18,0x8F,0xC0,0x62,0x51,0xAB,0x5E,0xDE,0x56,0x5A, + 0x5E,0x05,0x77,0x7A,0xE6,0xCC,0x99,0x37,0xF5,0x95,0xD9,0x1F,0x40,0x1E,0x40,0x95, + 0x19,0x4D,0x26,0xBE,0x4F,0x9F,0x8E,0xAF,0x9F,0x34,0x2C,0x8A,0x0D,0xCB,0x8F,0x28, + 0x10,0xF5,0x19,0xC6,0xE9,0x96,0xC0,0x80,0x74,0x5F,0x69,0xB5,0x1A,0x6F,0xBF,0x21, + 0x99,0x23,0xF5,0x83,0x40,0x6B,0x25,0x1E,0x97,0xE8,0x63,0x6B,0x81,0x61,0xAC,0xF0, + 0xDA,0xD5,0xD5,0xED,0x37,0xE8,0x91,0xDB,0x1F,0x0F,0x6C,0x1E,0xDF,0xDB,0x2F,0x80, + 0x4C,0x82,0x42,0x89,0xF6,0x11,0x98,0x8C,0xE5,0x37,0x37,0x37,0x89,0xC3,0x86,0x91, + 0x94,0x9F,0x01,0x7C,0x1F,0x21,0x87,0xC7,0x87,0x2F,0x8D,0xA2,0x16,0x89,0x44,0x94, + 0x80,0x77,0xAB,0xCF,0x81,0x78,0xD1,0x70,0x30,0xC3,0xE3,0x86,0x93,0x94,0x9F,0x01, + 0x81,0x11,0xF1,0x3A,0x9D,0x4E,0xAD,0x56,0x43,0x43,0x05,0x04,0x04,0xD0,0x25,0x6C, + 0xE9,0x57,0x26,0x5E,0x34,0xE2,0x46,0x5F,0xA1,0x98,0xE3,0xD1,0x29,0x19,0x3F,0x20, + 0x92,0xF0,0x78,0x44,0x81,0x30,0x48,0x70,0xB6,0xA0,0x98,0xE9,0xBE,0x77,0x83,0x91, + 0xE9,0x43,0x45,0xA0,0x8C,0x72,0xC7,0x69,0x6F,0x7F,0x91,0x7F,0xA0,0x27,0xC7,0x6F, + 0x7F,0x38,0x58,0xC9,0xD9,0xB9,0x75,0x75,0xB5,0xD8,0x23,0x31,0x02,0x65,0x89,0x0D, + 0x01,0xAA,0x38,0xF4,0x16,0xDA,0x77,0x47,0x47,0x7B,0x7C,0x46,0x0E,0x93,0x3A,0xC4, + 0xB4,0x37,0x87,0x37,0xD6,0x4E,0xD0,0x6B,0xE9,0x9E,0x90,0x4E,0x69,0x10,0xF6,0x35, + 0xB4,0x47,0xEF,0x19,0x04,0xBE,0xC2,0xE0,0xC8,0x38,0xD2,0x8D,0x43,0x66,0x74,0x51, + 0xF0,0x77,0x2C,0x63,0x25,0x28,0xF1,0xA4,0x24,0x3A,0x52,0xBD,0x7C,0xF9,0x72,0xEC, + 0x88,0x71,0x24,0x71,0xA8,0xD9,0xF5,0xA7,0xFC,0xCD,0x2F,0xA8,0xEB,0x4A,0x0B,0xB0, + 0xBF,0xFF,0xED,0xE3,0xD8,0xAF,0x3C,0x41,0xEF,0x7B,0x04,0x51,0x58,0x2C,0x9B,0xC7, + 0x43,0x23,0x85,0x5B,0x15,0x19,0x49,0x3B,0xEA,0x14,0x8F,0x8B,0x80,0x89,0xA9,0xD2, + 0x20,0x21,0x21,0x01,0xAF,0xD5,0xD5,0xD5,0x51,0xC9,0xA3,0xBC,0xFD,0x3D,0xE9,0xDF, + 0xF5,0x87,0xC9,0xA8,0x37,0x19,0xF4,0x24,0x90,0x32,0x19,0x0D,0xF4,0xBE,0x87,0x46, + 0x5B,0x40,0xDA,0x84,0xB9,0x8D,0x8D,0x8D,0x50,0x5A,0xA8,0xBC,0x64,0x52,0x13,0xDA, + 0x2C,0x0B,0x21,0x31,0x39,0x0D,0x62,0x63,0x63,0x79,0x3C,0x1E,0x02,0x63,0x9D,0xC1, + 0x90,0x38,0x26,0x8F,0x49,0xFD,0x69,0xC2,0xF3,0xF6,0x4B,0x9B,0x30,0xB3,0xA8,0xA8, + 0x08,0xFB,0x19,0x19,0x19,0x24,0x91,0x6E,0xC3,0xBD,0x33,0xD4,0xC7,0xC7,0x27,0x39, + 0x39,0x19,0x1E,0xF5,0xB9,0x73,0xE7,0x32,0xA6,0x2E,0xB6,0xB8,0xF8,0x3F,0x45,0x22, + 0x93,0xB3,0xE0,0x75,0xD4,0xD4,0xD4,0x40,0x8A,0x91,0x23,0x47,0x92,0x44,0x38,0x9A, + 0x2C,0x7D,0xAF,0x12,0x06,0x64,0xCC,0xA1,0xAC,0xAC,0x2C,0x34,0x26,0x29,0x24,0xF6, + 0x3F,0xD1,0x57,0x3E,0x14,0xB0,0x28,0x6A,0xFC,0xBC,0x07,0x2B,0x2A,0x2A,0xE0,0x72, + 0xA0,0x4A,0x8B,0xC5,0x4C,0x27,0x14,0x45,0xFA,0x77,0x74,0xFA,0x5B,0x32,0x47,0x47, + 0x47,0xC3,0xCF,0xEE,0xEA,0xEA,0xAA,0xBA,0x5C,0x75,0xDB,0xFC,0xB5,0x4C,0xEA,0x4F, + 0x8D,0xD0,0xD8,0x11,0x11,0xF1,0xA9,0x27,0x4E,0x9C,0x40,0x1B,0x5E,0xBA,0x94,0x9E, + 0x64,0x41,0xA0,0x95,0x16,0xFE,0x58,0x4C,0x31,0x80,0x47,0x02,0x83,0x8C,0xB0,0x29, + 0x3F,0x3F,0x3F,0x29,0x73,0x62,0x50,0x14,0x1D,0xBE,0xFD,0xC4,0x60,0xB1,0x26,0xDD, + 0xB9,0xEE,0x6A,0xF5,0xD5,0xEE,0xEE,0x6E,0x0E,0x87,0x63,0xA9,0xCF,0x00,0x25,0x4C, + 0xB7,0x52,0x8D,0xAE,0x4F,0xB7,0xCB,0xA2,0x45,0x8B,0x64,0x32,0x59,0x5B,0x5B,0xDB, + 0xD5,0xEA,0xEA,0x29,0xCB,0xD6,0xE3,0x03,0x98,0x13,0x3F,0x11,0x22,0x93,0xC7,0xC4, + 0x8D,0xC8,0x3E,0x72,0xE4,0x08,0x0C,0xD2,0xCA,0x95,0x2B,0x61,0x93,0x98,0x13,0xB4, + 0xC0,0xE6,0x3E,0xDA,0xDE,0x8A,0x1A,0xC4,0xC5,0xC5,0x41,0x89,0xC3,0x1D,0x3B,0x78, + 0xF0,0x60,0x5C,0xFA,0xD8,0x84,0xCC,0x5C,0xE6,0xC4,0x4F,0x01,0x36,0x97,0x7F,0xFB, + 0xCA,0xE7,0xCF,0x95,0x9E,0xEB,0xEC,0xEC,0x44,0x54,0x38,0x69,0xD2,0x24,0xE6,0x84, + 0x19,0x8A,0xCF,0xB3,0x23,0x30,0xB8,0xFB,0xEE,0xBB,0xD1,0xD6,0x51,0x25,0xD0,0x0C, + 0x66,0xAC,0x7A,0x8E,0x27,0xA0,0x1F,0x45,0xF9,0x49,0x30,0x6A,0xDA,0x12,0xBF,0xA0, + 0x30,0x14,0xAF,0x5C,0x2E,0x5F,0xB6,0x6C,0x99,0x55,0x17,0x1D,0x53,0xA5,0x7B,0x2B, + 0x2D,0x42,0x6A,0x6A,0xAA,0xBF,0xBF,0x3F,0x2A,0xC3,0xD9,0xB3,0x67,0x75,0x26,0xAF, + 0xDC,0xFF,0xD4,0x60,0xDF,0x20,0x09,0x1E,0x96,0x92,0x77,0xCF,0x93,0xFB,0xF6,0xED, + 0xD3,0x9B,0xC9,0xCD,0xB5,0xAE,0x9B,0x4C,0x95,0xB6,0x9D,0x4A,0x08,0x51,0x73,0x72, + 0x72,0xA2,0xA2,0xA2,0x60,0x93,0xB7,0x6D,0xDB,0x96,0x36,0x71,0x66,0xDA,0xE4,0x85, + 0xCC,0xB9,0x1F,0x2B,0x7C,0x6F,0xFF,0x05,0xEB,0xFE,0xF7,0xFC,0xF9,0xF3,0x70,0x8D, + 0xD1,0x1E,0xC7,0x8E,0x1D,0x6B,0x3B,0x48,0xC6,0x04,0x0F,0x56,0xA6,0x98,0x90,0x9D, + 0x9D,0xCD,0xE7,0xF3,0xC3,0xC2,0xC2,0x60,0xA2,0xBE,0xF9,0xE6,0x9B,0x39,0xAB,0x5F, + 0x08,0x8E,0x76,0x3E,0x8C,0xFA,0x43,0x41,0x51,0xEC,0xE9,0xAB,0x36,0x18,0x39,0x02, + 0xE8,0x1D,0xF8,0x8F,0xB8,0xED,0x85,0x0B,0xED,0x94,0x10,0x63,0x96,0x6C,0xAB,0x34, + 0x80,0xB4,0x42,0xA1,0x70,0xEE,0xDC,0xB9,0x02,0x81,0x00,0x01,0x47,0xC1,0xE9,0xC2, + 0xA5,0xCF,0xFE,0x5D,0x18,0x34,0x54,0x7D,0xE5,0x83,0x01,0xBE,0xD4,0xE4,0xA5,0x4F, + 0xC4,0x67,0xE6,0x7C,0xF9,0xE5,0x97,0x30,0xA8,0x99,0x99,0x99,0xB8,0x67,0xBB,0x43, + 0x28,0x14,0xC7,0xEC,0x78,0x68,0xEC,0x09,0x0C,0xA6,0x4D,0x9B,0x76,0xE9,0xD2,0xA5, + 0x05,0x0B,0x16,0xA0,0x86,0x9F,0x3C,0x79,0xF2,0xCA,0xF5,0xBA,0x65,0xCF,0xBD,0xED, + 0x2D,0x74,0x1E,0x54,0x18,0x24,0x71,0x46,0xE1,0xCD,0x59,0x8C,0xE2,0x18,0x83,0x88, + 0x99,0x0E,0x6E,0x14,0x86,0xEB,0x03,0xE9,0xF8,0x84,0xDE,0xF7,0x0B,0xD6,0x07,0x33, + 0xC3,0x88,0x26,0x6F,0x91,0x2E,0x2C,0x8D,0xEC,0xBB,0x0D,0x8B,0x35,0x6E,0xDE,0xDA, + 0xAC,0xDB,0x97,0x6D,0xD9,0xB2,0x05,0x8A,0x0A,0x8E,0x13,0xC0,0x9D,0x33,0x67,0xFB, + 0xC2,0x94,0xB0,0x46,0x6B,0x67,0xF8,0x03,0x20,0x3C,0x46,0x7D,0x4E,0x49,0x49,0x21, + 0xD3,0x2D,0xBF,0xFB,0xEE,0xBB,0xB6,0x6E,0xD5,0x3D,0x2F,0x6C,0xF2,0x93,0x84,0x91, + 0x0B,0xEC,0xD2,0xC3,0xF5,0x96,0xAE,0xD8,0xDC,0x3E,0xFF,0x35,0x38,0x78,0x3D,0x5C, + 0x81,0x74,0xF9,0xBF,0xDB,0x17,0xBF,0xD5,0x43,0x71,0x90,0xBD,0xED,0x0B,0xFE,0xD2, + 0x76,0xF7,0xA6,0x1E,0x2E,0xFD,0x80,0x95,0x6C,0xD6,0xEF,0xA5,0x77,0x7F,0x60,0xE2, + 0x9B,0x7B,0x0E,0xA7,0x3D,0x2D,0xBD,0xFB,0x43,0xA3,0xD0,0xD1,0xC7,0xDA,0x85,0x45, + 0xB1,0x27,0x2E,0x5A,0x37,0x69,0xF1,0xDA,0xAD,0x5B,0xBF,0x80,0xE3,0x10,0x1C,0x1C, + 0x7C,0xCF,0x3D,0xF7,0x54,0x56,0x56,0x22,0x0A,0x62,0xAE,0xE8,0x0B,0x7B,0xDD,0x13, + 0x1B,0xBF,0x2F,0x96,0x66,0xA7,0x88,0x52,0x86,0xD9,0xEF,0x8B,0x0E,0x0D,0x0D,0x2D, + 0x29,0x29,0x99,0x38,0x71,0x22,0xF6,0xAF,0x5F,0xBF,0x0E,0x7D,0x10,0x1E,0x35,0x6C, + 0xCA,0x1D,0xF7,0xD6,0x5C,0x3A,0xA3,0xB2,0xF7,0xDC,0x82,0x36,0x76,0x42,0xD7,0xD4, + 0xA7,0x58,0x5A,0xB9,0x49,0x18,0xCE,0x91,0x5E,0xD1,0x47,0x8C,0x32,0xA0,0x48,0xD9, + 0x3C,0xB6,0xBC,0xC5,0xE8,0x1F,0xA2,0x1E,0x3E,0x9B,0x23,0xAB,0xED,0xE1,0xF9,0x7A, + 0xF5,0x98,0x14,0x63,0xEE,0xE3,0xD7,0x17,0x1B,0x03,0x63,0xD9,0x8A,0xD6,0xAE,0x9C, + 0x27,0x7D,0xAE,0x7C,0xAF,0xCC,0x58,0xAA,0x0F,0x4E,0xD6,0xC4,0x4D,0x46,0xC9,0xF3, + 0x6F,0x94,0x32,0x9F,0xD8,0x3F,0x6C,0x0E,0x6F,0xDA,0x8A,0x67,0x32,0x6F,0x5F,0xF6, + 0xD9,0x67,0x5B,0xE0,0x42,0xA2,0x0E,0xAF,0x5E,0xBD,0x5A,0xA9,0x54,0xC2,0x7F,0x26, + 0x71,0xAE,0x2D,0xEC,0x5F,0x3E,0xF5,0xC2,0x77,0x67,0x5B,0xB3,0x92,0x45,0xA9,0x31, + 0xF6,0x05,0x46,0xFC,0x74,0xEA,0xD4,0xA9,0x51,0xA3,0x46,0xC5,0xC4,0xC4,0xA0,0x79, + 0xD4,0xD6,0xD6,0x5E,0xB9,0x72,0xC5,0xD7,0x3F,0x60,0xE6,0xD2,0x87,0xDB,0x1B,0xEB, + 0x64,0xCD,0xB5,0x28,0x51,0xE6,0x52,0x33,0x26,0xDF,0x40,0x2F,0x16,0xDB,0xAF,0xF8, + 0x53,0xAE,0xAC,0x56,0x3E,0xE1,0x21,0x75,0x7C,0x8E,0xF8,0xD0,0x1F,0xF9,0xB5,0x85, + 0xDD,0x53,0x9F,0xD2,0x45,0x8F,0xF5,0x3F,0xFD,0x81,0x4F,0xE5,0xBE,0xCE,0xDB,0x7F, + 0x8D,0x5C,0xF0,0x29,0xDF,0xEB,0x77,0xFE,0xCB,0xCE,0xE9,0x1B,0x8D,0xC2,0x48,0x41, + 0x6D,0x81,0xB0,0xF0,0xDF,0xA8,0x0E,0x94,0x5E,0x4D,0xE9,0x55,0x6C,0xB5,0x8C,0xDB, + 0x5A,0xC9,0x7C,0x62,0x3F,0xF8,0x04,0x04,0xCD,0x5F,0xF7,0xBF,0xB1,0x19,0x93,0x3E, + 0xF9,0xE4,0x63,0xA9,0x54,0x0A,0x4F,0x69,0xD5,0xAA,0x55,0x08,0x12,0x8E,0x1E,0x3D, + 0x3A,0x63,0xC6,0x0C,0xE8,0x2D,0xE6,0xBA,0xBE,0xB0,0x1F,0x7B,0x6A,0xE3,0x81,0x33, + 0xAD,0x23,0x13,0x02,0xD2,0xE3,0xED,0x8F,0x92,0x42,0x1F,0x40,0xB9,0x23,0xFF,0xA0, + 0xF7,0xE0,0x81,0x61,0xFF,0xDA,0xB5,0x6B,0x88,0xB9,0x94,0x2A,0xD5,0x1D,0xF7,0x3C, + 0xE2,0x2D,0x0C,0x6E,0xA8,0x2A,0x42,0xE0,0xCE,0x5C,0x8D,0x4F,0x94,0xB7,0xF0,0x6F, + 0x9C,0x63,0xAB,0x64,0x9C,0x8E,0x1A,0xF9,0xF8,0x35,0x28,0xBD,0x80,0x53,0x6F,0x73, + 0xBA,0x1A,0x55,0xE9,0x0B,0x4C,0x7C,0xA1,0xE8,0xD0,0xCB,0x1C,0x79,0xB3,0x76,0xD8, + 0x38,0x7D,0x68,0xAA,0x64,0xCF,0x06,0xB6,0xB2,0xCD,0x10,0x18,0xAF,0x89,0x9F,0x22, + 0xD9,0xFD,0x2C,0xA5,0xE9,0xC2,0x1B,0xC9,0xE6,0x44,0x5A,0x16,0x2B,0x6A,0xF8,0x58, + 0x68,0x13,0x2D,0x8B,0xFF,0xF9,0xE7,0x9F,0xC3,0x3B,0x42,0x4D,0x7E,0xE0,0x81,0x07, + 0x20,0x2D,0x9C,0x25,0xD4,0xC7,0xD1,0xA3,0x47,0x33,0x57,0xDA,0xC0,0xBA,0x52,0xAF, + 0x78,0xEC,0xAF,0xA5,0x2B,0x67,0x0D,0xBB,0x6F,0x66,0xBF,0x8F,0x99,0xC0,0xA6,0x41, + 0xFB,0x2D,0x5F,0x4E,0x4F,0x78,0x06,0xA5,0xA5,0xA5,0x7B,0xF6,0xEC,0x41,0x44,0x85, + 0xAF,0xB9,0xEB,0xAE,0xBB,0xF4,0x8A,0xCE,0x83,0x1F,0xBF,0x76,0xA3,0xEA,0x2C,0x2E, + 0x23,0x17,0x58,0x30,0x04,0x44,0xB1,0x4C,0x06,0xB6,0x9C,0x9E,0xBC,0x66,0xF4,0x0F, + 0xED,0x61,0xF3,0x38,0x9D,0xF4,0x23,0x2D,0x46,0xDF,0xA0,0x1E,0xBE,0x1F,0x72,0x04, + 0xFB,0x26,0x41,0x00,0x0E,0xB9,0xED,0xF4,0x74,0x29,0x57,0x10,0xF8,0x89,0x26,0x2E, + 0xFA,0x45,0xD6,0xF4,0xC5,0x27,0x4F,0x9D,0x2A,0x28,0x28,0x40,0xA5,0x43,0xD5,0xC3, + 0xBD,0x91,0x07,0x2F,0x8F,0x1F,0x3F,0x8E,0x58,0x9F,0x74,0x6E,0xD8,0x85,0xFD,0xD4, + 0xB3,0xBF,0xDE,0x93,0xDF,0x9C,0x16,0xEB,0x9F,0x99,0xD4,0xEF,0xF0,0x0A,0x0A,0xB9, + 0xA3,0xA3,0x03,0x8A,0x9E,0x0C,0x4D,0xA0,0xA8,0x93,0x92,0x92,0x50,0xCE,0x70,0xCD, + 0x2F,0x5C,0xB8,0x20,0x94,0x04,0xCD,0x5A,0xFE,0x70,0x40,0x48,0x6C,0xD3,0xF5,0x4B, + 0x3A,0x75,0x9F,0x49,0x6A,0x94,0xB6,0x9B,0xD2,0xDD,0x9C,0xF3,0xA7,0x53,0x52,0x1A, + 0x7A,0xA6,0x14,0xBD,0xAF,0x57,0x51,0xEA,0x4E,0xB2,0xCF,0x32,0x68,0x51,0x81,0xC9, + 0xBE,0x63,0x60,0x69,0x87,0x4F,0x98,0xBF,0xE4,0xC9,0x37,0x84,0xE1,0xB1,0xDB,0x77, + 0xEC,0x80,0xF9,0xA0,0xAD,0xD1,0xE4,0xC9,0xB0,0xB7,0xB0,0xA0,0xE4,0x1A,0x98,0x12, + 0xF8,0x1B,0x64,0xDF,0x2E,0xAC,0xBA,0x16,0xD5,0xDA,0xD7,0x4A,0xEE,0xCC,0x89,0x78, + 0x64,0x61,0x1C,0x93,0x66,0x0F,0x94,0xDE,0xD6,0xAD,0x5B,0xE1,0x60,0x33,0xC7,0xE6, + 0xD1,0x73,0x78,0x23,0xF8,0x56,0xEC,0xA3,0xA8,0x67,0xCF,0x9E,0x1D,0x11,0x1E,0x51, + 0xFC,0xFD,0xF6,0xE2,0xFD,0x9F,0x74,0xB7,0xD9,0x19,0x01,0x1E,0x0C,0x14,0x9B,0x9D, + 0x94,0x3D,0x73,0xE2,0xC2,0xB5,0x92,0xF0,0x61,0x47,0x8F,0x1E,0x29,0x2A,0x2A,0x42, + 0xC1,0xFA,0xFA,0xFA,0x22,0xAA,0x23,0xBD,0x8E,0x04,0x38,0x0B,0xB8,0x2B,0x4B,0x6F, + 0x8E,0x5D,0x58,0x2D,0x1D,0x9A,0x95,0x2F,0x17,0x2D,0x98,0x1C,0xFE,0xD8,0xE2,0x78, + 0x26,0xAD,0x1F,0xBE,0xFD,0xF6,0xDB,0xE9,0xD3,0xA7,0x5B,0xF2,0x92,0x00,0xA5,0x7D, + 0xE0,0xC0,0x01,0x32,0xE7,0x0B,0x96,0x00,0xDE,0x68,0x44,0x44,0x64,0xD9,0xA9,0x03, + 0x65,0x27,0x77,0xDF,0xE8,0xDB,0xB6,0x07,0x06,0xFC,0x9C,0xA4,0xEC,0x19,0xA3,0x73, + 0xEF,0x14,0x06,0x85,0x9D,0x3D,0x7B,0xA6,0xB0,0xB0,0x50,0xAB,0xD5,0xC2,0x29,0x18, + 0x33,0x66,0x4C,0x5E,0x5E,0x1E,0x19,0xFD,0xB3,0xF0,0xD5,0x57,0x5F,0x2D,0x59,0xB2, + 0x04,0xC5,0xCE,0x1C,0xDB,0x83,0xD5,0xDE,0xA5,0x5D,0xF1,0xFB,0xB3,0x73,0xC6,0x87, + 0x3E,0xB9,0xCC,0xC9,0x83,0xB8,0x6A,0xB5,0x1A,0x32,0xE3,0x13,0x99,0xE3,0x9B,0xA0, + 0x31,0x43,0x8D,0x9F,0x3E,0x7D,0x9A,0x0C,0x58,0x45,0x44,0x44,0x8C,0x1B,0x37,0x2E, + 0x29,0x39,0x59,0xA3,0x90,0x97,0xE7,0xEF,0xAF,0x29,0x2B,0x6C,0xA9,0xB9,0xA4,0x96, + 0xBB,0xF1,0xE0,0x1D,0xC5,0xE6,0x04,0x45,0xA7,0x44,0x26,0x8D,0x4E,0xCE,0xCE,0x8B, + 0x49,0xCD,0x6A,0x6F,0x97,0xA2,0xE1,0x40,0x15,0x41,0x21,0x41,0x18,0x64,0x2B,0x9C, + 0x02,0x34,0x2B,0xE6,0xEA,0x9B,0x40,0x75,0x1D,0x3B,0x76,0x6C,0xFE,0xFC,0xF9,0xCC, + 0x71,0x3F,0xB0,0x3A,0x15,0xBA,0x65,0xBF,0x3D,0x33,0x23,0x3B,0xE4,0xD9,0x15,0xCE, + 0xE7,0x4E,0x7D,0xFD,0xF5,0xD7,0xF8,0x44,0xBB,0x1A,0x9F,0x3C,0x18,0x8F,0xD0,0x0A, + 0x36,0x10,0x87,0x08,0xCA,0xD2,0xD2,0xD2,0x10,0x72,0x41,0x7E,0x1E,0x8F,0x2F,0xAD, + 0xBF,0xDE,0x58,0x7D,0xA1,0xA3,0xB9,0xAE,0xAD,0xE1,0xAA,0x46,0xD1,0xA5,0xD7,0xA9, + 0xF5,0x5A,0xB5,0x41,0xA7,0x46,0xEC,0x0A,0xF1,0x04,0x3E,0x42,0x36,0x8F,0x2F,0x0A, + 0x8E,0x0A,0x8E,0x4E,0x92,0x84,0xC7,0xC6,0xA4,0x65,0xF3,0x05,0x02,0xA9,0xB4,0x15, + 0xB6,0x00,0x0A,0x92,0xCC,0x1E,0xC3,0x97,0xC6,0xC7,0xC7,0x4F,0x9D,0x3A,0x15,0x5E, + 0x94,0xF9,0x0B,0xAD,0xD9,0xBD,0x7B,0x37,0xBC,0x60,0xA7,0xF3,0x35,0x58,0x4A,0x8D, + 0x61,0xF1,0x0B,0x85,0xB9,0x59,0xC1,0x1B,0xEE,0x75,0xDE,0x95,0xD3,0xDC,0xDC,0x5C, + 0x5E,0x5E,0x8E,0xBA,0xC4,0x1C,0xDB,0x80,0x88,0x0C,0xC1,0x0A,0x0A,0xA4,0xA1,0xA1, + 0x01,0xCD,0x0C,0x29,0x28,0x13,0x89,0x44,0x92,0x98,0x98,0x18,0x12,0x12,0x12,0x18, + 0x18,0xE8,0xEF,0x2F,0x44,0x3D,0xE4,0x70,0xB8,0x48,0x37,0xE8,0xF5,0x6C,0x0E,0x9B, + 0xC5,0xA2,0x8C,0x46,0xD4,0x12,0x83,0x42,0x21,0x87,0x6A,0x44,0xEB,0xA8,0xAF,0xAF, + 0x87,0xA8,0x48,0x21,0x6A,0x1F,0x9A,0x12,0xAE,0x1E,0x54,0x91,0x6D,0xA9,0x5A,0xC0, + 0x77,0xA1,0x3E,0x93,0x85,0x41,0x1C,0xC3,0x82,0x53,0xB9,0x60,0x63,0xC1,0xA4,0x91, + 0x81,0xBF,0x7D,0xC0,0xA5,0x11,0x43,0x84,0x8A,0x30,0x45,0x8E,0xDB,0x09,0x6E,0x14, + 0x0E,0x29,0x2A,0x21,0x3C,0x33,0xB2,0x58,0x05,0x73,0xC2,0x5C,0x50,0x78,0x2F,0x01, + 0xF1,0x36,0x6A,0x29,0x39,0x8B,0xB7,0xE0,0xA6,0x2D,0x86,0x0D,0x67,0x61,0x54,0x51, + 0x3B,0x46,0x8C,0x18,0x91,0x9C,0x9C,0xDC,0xBB,0x8F,0xC6,0x2E,0x27,0x4E,0x9C,0x40, + 0x9E,0xBA,0x32,0xC3,0x8C,0xEE,0xA3,0xBD,0xE3,0xB9,0xFC,0x09,0xE9,0x92,0x17,0x57, + 0x3B,0x7A,0x9E,0xC3,0x42,0x45,0x45,0x05,0x6E,0x0B,0xD5,0x95,0x39,0x76,0x08,0xAE, + 0x44,0x41,0xC1,0x69,0x81,0x0D,0x43,0xCD,0x44,0xE9,0xC1,0xEF,0x43,0xE5,0x87,0x6C, + 0x48,0x27,0xD7,0x40,0x36,0x2E,0x97,0x8B,0x8C,0x80,0xD6,0x85,0xFD,0x0C,0x0A,0x0A, + 0x42,0x49,0xE2,0xEE,0x51,0xB0,0xFD,0x79,0x4B,0x56,0xE0,0x5B,0xAC,0x2C,0x88,0x23, + 0x70,0xF5,0xCC,0x5F,0x9D,0xFC,0xED,0x26,0x7A,0xED,0x02,0x17,0xF9,0xE4,0x93,0x4F, + 0x48,0x69,0x0C,0x00,0xD4,0x79,0x14,0x29,0xF4,0x1F,0x34,0x1C,0xB2,0x00,0x0D,0x1E, + 0x3B,0x48,0x41,0x2E,0xD0,0xF3,0x69,0x06,0x04,0xEA,0xFF,0x99,0x33,0x67,0x98,0x03, + 0x67,0xD0,0x59,0x88,0xDA,0x69,0x99,0xAD,0xE5,0x0A,0x30,0x7D,0x64,0x56,0xE6,0x00, + 0x80,0x52,0x81,0x61,0x43,0x33,0xF6,0xF6,0xF6,0x46,0x93,0x46,0xA9,0x62,0x07,0x29, + 0xF0,0x58,0x5D,0x2C,0x4F,0x5B,0x60,0x23,0xB2,0xB3,0xB3,0x99,0x03,0x67,0xD0,0xDF, + 0xC1,0xEF,0x35,0x09,0xC0,0x15,0x60,0x03,0xF7,0xED,0xDB,0xC7,0x1C,0xB8,0x09,0x8A, + 0xB1,0x3F,0x88,0x92,0x73,0x17,0xD4,0x11,0x32,0xD2,0xCD,0x1C,0x3B,0x83,0x7E,0xF6, + 0x70,0xD1,0x0B,0x85,0x89,0x91,0xBE,0x7F,0x7E,0xEC,0x56,0x6F,0xB5,0x53,0x0E,0x1F, + 0x3E,0x3C,0x7E,0xFC,0x78,0x94,0x0F,0x73,0xEC,0x1A,0x0A,0xA5,0xEA,0x6F,0x5F,0x96, + 0x2B,0x35,0xD6,0x2E,0x37,0x61,0xDE,0x6D,0x81,0x13,0x32,0x9D,0x38,0x3F,0xB6,0xC0, + 0x1A,0x21,0x36,0x72,0x7D,0x05,0x13,0xA6,0x16,0xF5,0x1A,0x30,0x75,0x09,0xB8,0x16, + 0xFB,0xF7,0xEF,0x67,0x0E,0x5C,0x06,0x0D,0xFF,0x62,0xAD,0xAE,0xE8,0xAA,0xFD,0x4D, + 0xA6,0x70,0xDB,0x2D,0x83,0x46,0x80,0x3A,0x70,0x5D,0x5A,0x30,0xC0,0x66,0x03,0x15, + 0x0A,0xD5,0x0A,0xA3,0xC2,0x1C,0xFF,0x40,0xC0,0xE0,0x4F,0x98,0x30,0x81,0x39,0x70, + 0x8D,0x01,0x0A,0x0C,0xE0,0x09,0xC0,0x9D,0x64,0x0E,0x7E,0x08,0xD0,0x18,0x21,0xF0, + 0xB0,0x61,0xEE,0xCD,0xB0,0x1A,0xB8,0xC0,0xB0,0xF2,0x75,0x75,0x75,0x03,0xD3,0x34, + 0x1E,0x01,0xE6,0xDD,0xAD,0x15,0x18,0x08,0x03,0x17,0x18,0x40,0x6F,0x91,0xF9,0x22, + 0x2E,0xA2,0xD5,0xE9,0x6D,0xFA,0x08,0x6E,0xA1,0xD5,0x31,0xBE,0xA4,0x8B,0xC0,0xBB, + 0x72,0xD0,0xB3,0xD1,0x1F,0x83,0x12,0x38,0x21,0x21,0x01,0x01,0x03,0x73,0xE0,0x90, + 0x6E,0xB9,0x72,0xFB,0xA1,0xAA,0x0D,0xEF,0x56,0xC8,0x14,0xFD,0x8A,0xF4,0xE1,0x41, + 0xD9,0xEB,0x1F,0x97,0x54,0x54,0x37,0xBB,0x52,0x6B,0x10,0x1B,0x91,0x91,0x20,0xE6, + 0xD8,0x65,0x06,0x25,0x30,0xAC,0x1F,0xF2,0xF8,0xC6,0x0D,0x47,0xE1,0x3E,0xEE,0xBE, + 0xF0,0x7C,0xFD,0x13,0x6F,0x5D,0x78,0x6F,0x5F,0x5B,0x43,0xBB,0x23,0x49,0x34,0x7A, + 0xAF,0xC3,0x17,0x34,0xCF,0xBC,0x5B,0xFD,0xAF,0xAF,0xCA,0xBA,0xBA,0x9D,0x4C,0x5D, + 0x42,0x58,0x36,0x65,0xCA,0x14,0xE6,0xC0,0x1D,0x18,0x81,0x5D,0x35,0xDB,0x36,0xA4, + 0xA7,0xA7,0xC3,0x26,0x33,0x07,0x36,0x18,0x0C,0xC6,0x4F,0xF7,0x55,0xBD,0xF4,0x69, + 0x5D,0xA3,0xCC,0xD5,0xA6,0x6E,0x30,0x7A,0xED,0x3E,0x2D,0x7F,0xFE,0x9D,0xB2,0xC6, + 0x56,0xA6,0x0F,0xC8,0x16,0x58,0x23,0xE4,0xB2,0xEB,0xCF,0x66,0xF4,0x86,0x11,0xD8, + 0xF2,0x24,0x8F,0xBB,0xC0,0x38,0x45,0x46,0x46,0x76,0x76,0xDA,0xB9,0x39,0x38,0x4F, + 0xEF,0x7F,0x5D,0xFE,0xD9,0x91,0x0E,0xD7,0x1E,0x99,0xEF,0xC3,0xF5,0x16,0xC3,0x86, + 0x77,0x2A,0xEA,0x9B,0xEC,0x77,0x1B,0x20,0x44,0x9D,0x3E,0x7D,0x3A,0x73,0xE0,0x26, + 0xB4,0x9C,0xEE,0x68,0x0A,0x3B,0xDC,0x76,0xDB,0x6D,0xE4,0x89,0xF2,0xDE,0x40,0xFD, + 0xEC,0x3E,0x56,0xBD,0xAB,0xE0,0xD6,0xAA,0x20,0xEE,0xD2,0xD2,0x65,0xFA,0xC3,0x47, + 0x97,0x65,0x5D,0x76,0xEA,0x76,0x69,0x69,0x29,0x99,0x65,0x36,0x00,0x68,0x81,0xB5, + 0x7A,0xFB,0xE3,0x2C,0x2E,0x02,0x47,0x07,0x0D,0x15,0xE1,0x0E,0x73,0x6C,0xE6,0x7A, + 0x7D,0xDB,0xE6,0xEF,0x98,0x87,0x13,0x07,0x4C,0xAD,0xD4,0xF8,0xE1,0xDE,0x2B,0x88, + 0xCB,0x98,0x63,0x33,0xB0,0x85,0x2E,0x06,0xA7,0x76,0x61,0x4A,0x18,0x01,0x29,0x39, + 0x1E,0x18,0x79,0x79,0x79,0xF9,0xF9,0xF9,0xCC,0x01,0x3D,0xF8,0x6A,0xD8,0xB4,0xA7, + 0x46,0xAB,0x1F,0x9C,0xB8,0x66,0x0E,0x95,0x2A,0x2F,0x5D,0xA1,0x9F,0x19,0xB4,0x50, + 0x5C,0x5C,0x9C,0x99,0x99,0xC9,0x1C,0xB8,0x0F,0x05,0xFF,0x16,0x7F,0x6E,0x3E,0x9B, + 0x36,0x40,0x44,0x22,0x11,0xDC,0x00,0x8B,0x39,0xB9,0x52,0x23,0x2D,0xBE,0xE6,0x19, + 0xAF,0x13,0x3A,0x6C,0xFB,0xD1,0x46,0x8B,0x7D,0x46,0x6C,0x04,0xD5,0xE0,0xB4,0xE3, + 0xCA,0x01,0x94,0xDE,0xE0,0x81,0x72,0x00,0x39,0x39,0x39,0xE4,0xB1,0x73,0xDC,0xDC, + 0xFE,0xD3,0xCD,0x83,0xAC,0xCC,0xBD,0x39,0x77,0x4D,0xDB,0xDC,0xCA,0x68,0xAF,0xA2, + 0xA2,0xA2,0xD9,0xB3,0x67,0x93,0xFD,0x81,0x41,0x91,0x1B,0xEB,0x3D,0x89,0x78,0x60, + 0x44,0x45,0x45,0x11,0xAF,0x4B,0xA5,0x52,0x97,0x56,0x33,0x4B,0x39,0x78,0x04,0xD8, + 0xE7,0xB3,0x15,0x74,0xBF,0x37,0x6A,0x50,0x8D,0x79,0x11,0x3C,0x92,0x3E,0x30,0x28, + 0xA2,0xB1,0xD8,0xF4,0x34,0xE2,0x41,0x01,0x27,0x24,0x35,0x35,0xF5,0xEA,0xD5,0xAB, + 0x1D,0x5D,0xCA,0xD6,0x6E,0xEB,0xF2,0x85,0xD9,0x23,0x5F,0x40,0x51,0xAC,0x9B,0xBB, + 0x6E,0x50,0x59,0x47,0xEB,0xEA,0x8B,0x17,0x2F,0xF6,0x37,0xCC,0xED,0x3A,0x4C,0x1B, + 0xE6,0x0D,0xD4,0x0E,0xF7,0x06,0xBA,0x04,0x1A,0xE5,0xDA,0x0D,0x85,0x75,0x7D,0x16, + 0xF0,0xFE,0xF1,0x74,0x46,0x9A,0x04,0x0D,0x8F,0x75,0xF7,0x9D,0xA9,0x6B,0xA6,0x98, + 0x9F,0xD4,0x46,0x0E,0xB1,0xBC,0x58,0x3E,0x82,0x85,0x99,0x01,0xC8,0x00,0xEC,0x93, + 0x85,0x71,0x2C,0x3B,0xBD,0xA9,0x6B,0x55,0xA3,0xA5,0x54,0x56,0x56,0xC6,0xC4,0xC4, + 0x30,0x49,0x03,0x85,0x69,0xC3,0xEC,0x9B,0xCF,0x5B,0x0E,0x06,0x48,0x20,0x16,0x8B, + 0x1B,0x9A,0xE8,0x7E,0x73,0x2B,0xAE,0x5F,0xEB,0xCA,0x19,0x1B,0x28,0x10,0x7A,0xFB, + 0xA8,0x54,0x08,0xF3,0xC7,0x8D,0x89,0x98,0x33,0x36,0xF0,0xFE,0xD9,0xD1,0x31,0xE1, + 0x7E,0x63,0x53,0x25,0xB1,0x11,0x7E,0x6B,0x67,0x47,0xCF,0x98,0x14,0x31,0x25,0x4E, + 0x70,0xDF,0xF2,0xB4,0x85,0xD9,0x12,0x1F,0x6E,0x9F,0xFB,0xD1,0x19,0x58,0x70,0xAD, + 0x02,0x03,0x03,0xE9,0x4C,0x1A,0x1C,0x94,0xDE,0xEC,0x07,0x91,0x99,0x1E,0x83,0x07, + 0x0E,0xD0,0xF1,0x13,0x76,0x9E,0xA2,0xD3,0x28,0x35,0xED,0x3C,0xBF,0x69,0xA3,0x03, + 0x4F,0x95,0x75,0x22,0x63,0xC6,0x0E,0xE3,0xEF,0x3D,0xD3,0x56,0xAD,0x62,0xF1,0x95, + 0xEA,0xA6,0x66,0xB9,0x97,0xBF,0x6F,0x4D,0x55,0xCB,0xE1,0x73,0x6D,0x63,0xD3,0xC4, + 0x7A,0x9D,0xE1,0xF0,0xB9,0x76,0x55,0x5F,0x93,0x06,0x5D,0x5D,0x50,0x50,0x60,0x3B, + 0xE9,0x6A,0x00,0x30,0x93,0xA5,0x39,0x9E,0x28,0x61,0x80,0xF0,0xE5,0xCE,0xC5,0x76, + 0x47,0x77,0x7A,0x4E,0x5C,0xEC,0xCC,0x8D,0xA2,0xAE,0x77,0x1B,0xA1,0xC7,0xCB,0x5A, + 0x0D,0x79,0x23,0x45,0xF1,0x3E,0x3D,0xD7,0x3B,0x0D,0x7C,0x89,0x9F,0x97,0x42,0x15, + 0x93,0x1C,0x9C,0x33,0x52,0x52,0x52,0x69,0xDF,0x7F,0xA6,0xBC,0xF4,0x3A,0x9D,0x6E, + 0x00,0xB1,0x91,0x2D,0xAC,0xEB,0x4D,0xCA,0x47,0xFE,0x74,0xEE,0xEE,0xE9,0x51,0xAB, + 0xE7,0x0E,0xB6,0x79,0x10,0x4A,0xCA,0x1B,0x36,0x6E,0xA2,0x9F,0x22,0xE9,0x0D,0x6A, + 0x22,0x1A,0x76,0xEF,0x57,0x68,0x2F,0x34,0x4B,0xF3,0x21,0xF2,0x1A,0xE5,0x49,0xFF, + 0x81,0x53,0x45,0xCE,0x5A,0x21,0x61,0x37,0xBD,0xFB,0x9B,0x99,0x03,0x8B,0x16,0xAC, + 0xA0,0x0C,0xE6,0x36,0xEC,0xA9,0x12,0x06,0xB1,0x61,0x7E,0xB6,0xEB,0x4D,0x11,0x19, + 0x7A,0xBF,0x5A,0xC6,0x55,0x88,0xD8,0xF8,0x4F,0x5C,0x48,0x92,0x68,0xC5,0x8C,0x89, + 0xC3,0x3D,0x22,0x2D,0x60,0xDA,0xF0,0x80,0xA3,0x25,0x5B,0x84,0x42,0xBF,0xC4,0x70, + 0x0F,0xD4,0xBD,0xDE,0x8C,0x4E,0xF4,0x8C,0xB4,0x80,0x79,0xA4,0xC5,0xE9,0xA2,0x76, + 0xAE,0x03,0xBF,0x2F,0x37,0x33,0x90,0x39,0xF0,0x04,0x91,0x12,0x56,0x5A,0x82,0xF3, + 0x05,0x8E,0x5D,0x84,0x22,0x93,0x0E,0x3D,0x56,0xA1,0xCD,0x4C,0xCA,0x08,0x25,0x2B, + 0x5E,0x78,0x84,0xBC,0x4C,0x91,0xB7,0xB7,0xC7,0x9E,0x0B,0xA4,0x48,0x9B,0x19,0xBC, + 0x6B,0xD9,0x1B,0x89,0x48,0xB8,0x7C,0xAA,0x67,0x9E,0x79,0x0A,0x17,0x53,0x0B,0xA6, + 0x78,0x46,0x9B,0x12,0xE8,0x95,0x5A,0xF0,0x87,0x35,0x68,0xD7,0xD2,0x8A,0xB9,0x93, + 0x62,0x93,0x23,0x5D,0x5A,0xE1,0xDA,0x01,0x50,0x2C,0x6B,0xE6,0x44,0x08,0xFD,0x3D, + 0x39,0x37,0x1D,0x25,0x4C,0x17,0xB1,0x67,0x4B,0x18,0xF8,0xF8,0x08,0x36,0xDE,0x9B, + 0x1C,0xE4,0x3F,0xF0,0x8F,0x85,0x7D,0x5A,0x36,0x55,0x3C,0x29,0xD3,0xC3,0x4F,0x32, + 0x53,0xE4,0x79,0x16,0x58,0x45,0x72,0xEC,0x41,0x22,0x42,0x45,0xBF,0x59,0x19,0x1F, + 0x62,0x7E,0x62,0xD7,0x5D,0xE0,0xF8,0x2D,0xBA,0x4D,0x78,0xEF,0xEC,0x64,0x8F,0xDF, + 0x18,0x65,0x34,0x0B,0xEC,0x41,0x3B,0xDC,0x9B,0xD4,0x84,0xD0,0x57,0x1F,0x1E,0x9E, + 0x12,0xC9,0x71,0xEB,0xD3,0x7D,0xF8,0xAC,0x87,0xE7,0x86,0x3C,0xB4,0xD8,0xF9,0xA2, + 0x7C,0x03,0x80,0x31,0x4B,0x96,0xE5,0x78,0x3C,0x4E,0x54,0x98,0xF8,0xB5,0x75,0xA3, + 0x57,0xCF,0x94,0x04,0xF8,0x38,0x97,0x1A,0x77,0x31,0x26,0x91,0xF7,0xD7,0x75,0xC9, + 0x8B,0x72,0x93,0xD8,0x43,0x73,0x4B,0x88,0x96,0x68,0xA5,0x35,0x64,0xF2,0xD2,0x78, + 0x0B,0xF8,0xCB,0x67,0xA5,0xBE,0xFB,0x74,0xFA,0x83,0x33,0x25,0xFC,0xFE,0x15,0x59, + 0x56,0x02,0xEF,0xCF,0x8F,0xC4,0xBF,0xF4,0x50,0x66,0x6C,0x94,0x4B,0xCB,0x3D,0x0D, + 0x0C,0xA6,0xC7,0x83,0xC7,0xF5,0xB0,0x6F,0x64,0x8B,0x58,0x24,0x9C,0x33,0x71,0x98, + 0xAF,0xA0,0xDF,0x72,0x9E,0x32,0x32,0x20,0x2D,0x31,0x7C,0x28,0xAA,0x71,0x6F,0x6E, + 0xAD,0xC5,0xF3,0x5F,0x02,0x53,0x95,0x87,0xB4,0x4A,0xFF,0xA8,0x60,0x04,0xF5,0xA0, + 0x2F,0xFD,0x23,0x87,0xB5,0x69,0x4F,0xCD,0xD6,0xC3,0x0D,0x9B,0x37,0x8E,0x89,0x08, + 0xFA,0x99,0xAC,0x63,0xE1,0x18,0xA6,0x60,0x3D,0xEE,0x69,0xFD,0x68,0xF9,0xAF,0x69, + 0xBB,0x37,0xF9,0x7F,0x81,0x7F,0xEE,0xFC,0xBF,0xC0,0x3F,0x77,0xFE,0x5B,0x05,0x56, + 0xF7,0x5D,0xF4,0xE0,0x67,0x0C,0xBD,0x70,0x09,0xFD,0x97,0xC4,0x10,0xAE,0x61,0x32, + 0xF5,0x68,0xF5,0xA6,0x21,0xDD,0xC8,0x10,0xDF,0x50,0xC0,0xDA,0xF2,0x5D,0xDD,0x47, + 0xFB,0xEB,0xDE,0x7F,0x3E,0xAB,0xF7,0xBA,0xF8,0x8E,0x29,0xAA,0x94,0xFD,0xE9,0x8B, + 0x2B,0x43,0x17,0x42,0x23,0x62,0x7D,0xFE,0xDE,0xE4,0xAC,0x64,0xEB,0x27,0xE5,0xB4, + 0x3A,0xDD,0x85,0xAA,0x26,0x3B,0xB3,0xD6,0x58,0x5E,0xA3,0x92,0x42,0x5C,0x5C,0x70, + 0x95,0x11,0xF8,0x1F,0x4F,0x65,0x24,0x45,0xB9,0x3A,0xD0,0x5C,0x70,0xA9,0x63,0xE7, + 0xF1,0x46,0xDC,0x13,0x73,0xEC,0x69,0xFE,0xF8,0x71,0xD5,0xF2,0xE9,0x51,0xE3,0x52, + 0xAD,0x57,0x34,0x96,0x2B,0x94,0x0F,0xBC,0x5A,0xAA,0xB8,0xF5,0xC4,0x08,0x03,0xC5, + 0xF2,0xFA,0xEC,0xD7,0x69,0x96,0xC5,0x67,0x1C,0xC3,0x2C,0x7A,0xE0,0x2E,0x2C,0x96, + 0x17,0x97,0xCD,0xC2,0xC6,0xE3,0x50,0x81,0x42,0x9E,0x67,0x37,0x8E,0x7B,0x3D,0x42, + 0xEE,0x41,0x91,0xB1,0x7F,0xBB,0x23,0x3A,0x0E,0xD0,0xE9,0x4D,0xCD,0x1D,0x5A,0x6C, + 0xD2,0x4E,0xAD,0xBB,0xEF,0xFD,0x61,0x61,0x8A,0xD7,0xE9,0x2F,0x64,0x59,0xE1,0x23, + 0xE0,0x24,0x47,0xFB,0x61,0x8B,0x8F,0xF0,0xA5,0x87,0xFD,0x7E,0x3A,0x50,0x64,0x86, + 0x16,0xE9,0x9D,0x76,0x1D,0x83,0xD1,0xD4,0xA9,0xD0,0x5B,0x6D,0xD0,0xAE,0xCC,0xE9, + 0x21,0x40,0xA5,0x52,0x9F,0xBE,0xD8,0xA4,0xB3,0xF7,0x94,0x00,0x6E,0xFD,0x78,0x69, + 0x8B,0x5C,0xEE,0xD2,0x52,0x7A,0x96,0xC5,0x87,0xDC,0xBB,0x57,0x8D,0xD6,0x54,0xD7, + 0xA2,0xB2,0xDA,0xC8,0x4F,0x46,0x78,0x1C,0xA3,0xD1,0x78,0xA2,0xB8,0xE6,0xF1,0x37, + 0x4B,0xFF,0xF4,0x55,0x8B,0x7D,0x81,0x7B,0xBC,0xDE,0xDE,0xD3,0xFE,0x8B,0x37,0xCE, + 0xEF,0x3B,0x79,0x55,0xAF,0x77,0xF2,0xE0,0x04,0x45,0xA6,0xB3,0xD8,0x5D,0xC7,0xC3, + 0x01,0x7E,0x3E,0x9C,0x51,0x09,0x01,0x56,0x5B,0x58,0xA0,0xE7,0xBB,0x10,0xB4,0x5A, + 0xDD,0x5B,0x5B,0xCB,0x5E,0xF9,0xEC,0x86,0xE3,0xA9,0xC7,0x40,0xDA,0xDD,0xF3,0xE6, + 0xCE,0x96,0x57,0x3E,0x3C,0xAF,0x54,0x39,0x9A,0x34,0xD5,0xEF,0xE2,0x43,0x8E,0x31, + 0x1A,0x7B,0xE4,0x2A,0x03,0x36,0xF2,0x33,0x11,0x43,0x04,0xA4,0x7D,0xE5,0xA3,0x8B, + 0x07,0x8A,0xFB,0x9F,0x54,0x6E,0x43,0x41,0xA5,0xE6,0x37,0xEF,0x95,0x29,0x94,0xFD, + 0xCA,0xCC,0xAC,0xE3,0xA1,0xEE,0x67,0x1D,0x8F,0xFE,0x50,0xA8,0x0D,0xE5,0x35,0xDD, + 0xD8,0xAA,0xEA,0x14,0x43,0xE4,0x15,0xA1,0x26,0xBF,0xBB,0xB3,0xF2,0x74,0x95,0x8D, + 0xD9,0x75,0x46,0x79,0xBD,0xEE,0x8D,0x2F,0x2A,0xFA,0xAB,0xDB,0xCC,0xDA,0xB4,0x56, + 0x0B,0x88,0x39,0x25,0xC0,0x8F,0x3B,0x3E,0x4D,0x82,0x0D,0xFE,0xD0,0x50,0x8C,0x4B, + 0xA1,0x61,0x16,0x5D,0xBA,0xB1,0xAF,0x68,0x80,0xAB,0x98,0xE7,0x57,0xA8,0x8F,0x15, + 0x5B,0xCF,0x33,0x21,0x50,0xDE,0x66,0x81,0xDD,0x2D,0x61,0x94,0x2A,0xDE,0x62,0xB5, + 0xF5,0x5E,0x67,0x6E,0x90,0xA8,0xD5,0xBA,0xCD,0xFB,0x1A,0x07,0x5C,0x75,0xA0,0xC6, + 0x3E,0x39,0xD8,0x6A,0xF7,0x17,0x64,0x50,0xC2,0x74,0x95,0x56,0xB9,0x29,0x70,0x97, + 0x52,0x0F,0x8F,0xDA,0x6A,0x6B,0x90,0x7A,0x6C,0x8A,0x65,0xE5,0x75,0x69,0x8D,0x74, + 0x50,0x01,0x5C,0x73,0xA7,0xA9,0xE8,0x52,0x9F,0x79,0xC7,0x04,0xCA,0x9B,0x4F,0x97, + 0xB0,0x4A,0xE3,0xDE,0xA7,0x8B,0xFD,0x79,0x53,0x32,0x82,0xAC,0xB6,0xD8,0x30,0xB7, + 0x7F,0xC2,0xBC,0x3F,0xCE,0x5E,0xB6,0x99,0xBF,0xE8,0x3E,0x47,0x4A,0x65,0x96,0x19, + 0xCD,0x16,0xE8,0x1F,0xAB,0xC4,0x1F,0xA5,0x9B,0x02,0xC3,0x51,0x81,0x62,0xC7,0x66, + 0x77,0x21,0xAE,0xC1,0xD3,0xD4,0xF7,0xA1,0x90,0xAC,0x91,0x21,0x53,0xB3,0x82,0x53, + 0x43,0x9D,0xFC,0x64,0x8E,0x15,0xD7,0x9A,0x75,0xD0,0xF3,0xCC,0xC1,0x4D,0x68,0xA5, + 0xC5,0x61,0xB3,0xE4,0x2A,0xE7,0x3F,0xD6,0xD8,0x1B,0x99,0x5C,0x9F,0x7F,0xB1,0x1D, + 0xDB,0xD9,0x4A,0x99,0xD5,0x14,0x7D,0x8F,0x60,0xE8,0x9B,0xFF,0xC3,0xA3,0x7D,0x8E, + 0x97,0xB6,0x4D,0x9F,0x16,0x13,0x1D,0xE9,0x27,0xE1,0xB0,0xA2,0x23,0xFC,0xA3,0xC2, + 0x7D,0xC7,0x24,0x8B,0x73,0xD2,0xC5,0x69,0x49,0xE2,0xD1,0xC3,0x7C,0xB8,0xBE,0xFC, + 0xF1,0xC3,0x45,0xB9,0x19,0x81,0xFC,0x5E,0x03,0xDD,0x4A,0x6D,0x4F,0x67,0xB7,0x75, + 0x33,0xA6,0x67,0xAE,0x42,0xE5,0x2A,0xD4,0x46,0xB7,0x6E,0x5B,0x22,0xE4,0x4D,0xCB, + 0x0C,0xC6,0x36,0x31,0x3D,0xD0,0x76,0xF2,0xAB,0xC7,0x11,0xF8,0xF2,0xF3,0xC6,0x85, + 0x4A,0x6B,0x3A,0x62,0xE2,0x45,0x21,0x5C,0x56,0x52,0x9C,0x38,0x21,0x4E,0x24,0xD2, + 0x68,0xFC,0xA2,0x83,0x7A,0x64,0xF2,0x49,0xD9,0xA1,0x3C,0x7F,0xEF,0xB1,0x11,0xDC, + 0xB2,0x8E,0x9E,0x25,0x99,0xB7,0x96,0x50,0x42,0xAE,0x29,0xD4,0x36,0x25,0x8C,0xFF, + 0x62,0x08,0xAC,0x32,0x58,0x7E,0x28,0xD7,0x45,0xA0,0xA8,0xAD,0xB6,0x21,0x28,0x69, + 0x06,0x8D,0x52,0x7B,0xB8,0xB0,0x79,0xEB,0xE9,0x76,0x9D,0xA1,0x07,0x56,0x50,0x40, + 0xEB,0x9D,0x1E,0x85,0xCA,0xA8,0x50,0xEA,0xE5,0x6A,0x83,0xD6,0x3C,0x99,0x50,0xAE, + 0xD4,0xA3,0x89,0xF5,0x9E,0x6E,0x8B,0x3D,0x5B,0x93,0x49,0x0B,0x8C,0xE2,0xEA,0x56, + 0x39,0x7A,0x2A,0xD0,0x96,0x8E,0x6E,0xDD,0xF1,0xF3,0x6D,0x56,0x1B,0xDC,0x69,0xE6, + 0xB4,0xA7,0xB9,0x7E,0x83,0x59,0xD0,0xA7,0xEC,0x52,0x47,0xFA,0xD8,0x10,0x4A,0xA1, + 0x6E,0x91,0xAA,0xDB,0xB4,0xA6,0x96,0x16,0xA5,0xCA,0xE0,0x75,0xA5,0x9E,0x3E,0x1B, + 0x15,0x15,0x30,0x35,0x4E,0xB0,0xBB,0xF4,0xD6,0x6F,0x88,0x73,0x39,0x2C,0x7F,0x9F, + 0x3E,0xEB,0xCA,0x00,0x7A,0x86,0xE7,0xDF,0xB7,0x57,0xEF,0xC9,0x6F,0xDE,0xFE,0xF2, + 0x78,0xCB,0x8F,0x5B,0x3A,0xA6,0xE0,0x52,0x07,0xAE,0x7F,0xE5,0xA1,0x81,0x3F,0x4B, + 0xE3,0x98,0xE7,0xDF,0x29,0xAB,0xA8,0xE9,0x32,0x2F,0x29,0xEE,0x2A,0x7C,0x91,0x6F, + 0x96,0xC8,0x54,0x50,0xD3,0xC7,0x2E,0x46,0x88,0xA9,0x77,0x9E,0x1D,0xC3,0xE7,0xF7, + 0x51,0x75,0x74,0x09,0x07,0x9A,0x7F,0x12,0xAF,0xB1,0xCD,0x6D,0x27,0x6E,0xE8,0x18, + 0x16,0x44,0xDF,0x98,0xEB,0x68,0x3B,0x95,0x56,0xD2,0x82,0xE4,0x28,0xBE,0xED,0x0F, + 0x41,0xD1,0x9F,0x1B,0x6E,0x1E,0x28,0xAD,0x75,0xA7,0x42,0xA2,0x4A,0x1F,0x29,0x91, + 0x62,0xCB,0x2F,0x6B,0x1F,0x8A,0xA6,0x3B,0x61,0x84,0x98,0x43,0x9B,0xCB,0x81,0xC3, + 0xA6,0xBC,0x66,0x8F,0x0B,0xB2,0x9D,0x41,0x4F,0x0B,0x1C,0x26,0xA1,0x05,0x6E,0x68, + 0x75,0xC3,0x4F,0x42,0xB3,0xCF,0xCD,0x0A,0xC6,0x06,0x2D,0x3D,0x14,0x4A,0x3A,0x2E, + 0x2A,0x70,0x74,0x9C,0x75,0xF3,0x73,0x8B,0xA4,0x08,0xEE,0x88,0x44,0x3B,0x0B,0xB7, + 0xD0,0x02,0x47,0x05,0x7B,0xC3,0xB4,0xD4,0x34,0x0D,0x95,0xCA,0x19,0x00,0x1C,0x0E, + 0x67,0xCD,0x1D,0xC3,0xBC,0xDD,0x73,0x34,0x6E,0xC1,0xE3,0x78,0xAD,0x9D,0x1B,0x69, + 0xF7,0x87,0xCD,0x68,0x81,0xFD,0x7D,0x38,0xA8,0xD5,0xA8,0xD2,0xBD,0x57,0xC7,0x77, + 0x4C,0x7B,0x97,0xF6,0xBB,0xB3,0x2D,0x56,0xDB,0xF5,0x26,0xCF,0xFD,0x5E,0x01,0x0A, + 0x39,0x3A,0xF8,0xC1,0x59,0x21,0x03,0x88,0xC4,0x50,0xE3,0x96,0x4E,0x11,0xA7,0x27, + 0xDB,0xFF,0x9D,0x0A,0x46,0x37,0x8C,0x4E,0x0C,0x68,0xEE,0xD0,0xB4,0xBB,0xDC,0x47, + 0x13,0x18,0xC0,0x9F,0x39,0x36,0xD4,0x6A,0x8B,0x0B,0xF7,0xE4,0x2C,0x50,0x34,0xBF, + 0x79,0x39,0x09,0xCB,0x73,0x44,0x6E,0x75,0xF8,0x43,0xDA,0xB9,0xD9,0xFE,0xF7,0xCC, + 0x49,0xE9,0xEF,0xF9,0x17,0xE6,0xC3,0xB2,0x87,0x8B,0xA0,0x7B,0x8E,0x95,0xDA,0x79, + 0x02,0xE7,0x07,0x84,0xA2,0xA8,0x55,0xF3,0xD2,0x7E,0x31,0x2F,0xC4,0xDF,0xB5,0xD9, + 0xD7,0xDE,0x3C,0xD6,0xBD,0xB9,0xE2,0xC7,0x96,0xA6,0x73,0xFA,0x7F,0x1C,0x84,0x11, + 0x38,0x23,0x21,0xC0,0x57,0xC0,0xD9,0x5F,0xD8,0xE2,0x62,0x4C,0xDB,0xD6,0xA9,0x3D, + 0x70,0xBA,0x05,0xDB,0xD1,0x73,0xD2,0xA1,0x73,0xB0,0x00,0x5C,0xA5,0x79,0x39,0x89, + 0x6F,0xFE,0x72,0xF8,0x84,0xE1,0x02,0xC8,0xC3,0xA4,0xDA,0xC0,0xE7,0x78,0x65,0xC6, + 0xF3,0x5E,0x7F,0x38,0xE1,0xBE,0xB9,0xA9,0x8E,0xE7,0x2C,0x32,0xE7,0x7C,0xBD,0x39, + 0x77,0xE5,0x46,0x22,0xA0,0xDD,0x7D,0xCA,0x4E,0x0C,0x69,0x4B,0x90,0x88,0x3F,0x6B, + 0x7C,0x28,0x36,0xB8,0xD3,0x43,0xA1,0xA5,0x7B,0x83,0xCA,0x19,0x15,0x26,0xF9,0xED, + 0x9A,0xCC,0xBF,0x3C,0x12,0x27,0xB0,0xA7,0xC6,0xD0,0xCE,0xFF,0xF8,0x60,0xF4,0x2B, + 0x8F,0x66,0x25,0xC7,0x85,0xF6,0x57,0x93,0x2D,0xDC,0xCA,0x8C,0xF9,0x13,0xC3,0x42, + 0xC4,0xFC,0xCD,0xDF,0xD6,0x7E,0x5F,0x2C,0xF5,0x60,0xDF,0x85,0xA7,0x40,0xF5,0x0E, + 0x09,0x12,0xF6,0x37,0x2E,0x14,0x19,0xE2,0xEA,0x8A,0x0F,0xEC,0x17,0x5F,0x7C,0x91, + 0xEC,0xF1,0xB9,0xD4,0xC8,0x78,0xE1,0xF1,0xF3,0xED,0x70,0x27,0xE0,0x3C,0xB6,0x75, + 0x69,0x3B,0x15,0x86,0x4E,0x85,0x5E,0xDA,0xA9,0x6D,0x95,0xD1,0xFB,0x6A,0xAD,0xB1, + 0x5B,0x69,0xC0,0x56,0xDF,0xAA,0x3E,0x5B,0x21,0x43,0x24,0x7C,0xB9,0x5E,0x71,0xB9, + 0x41,0x51,0xDB,0xAC,0xAA,0x6E,0x54,0x62,0x43,0xF5,0x13,0xFB,0x0F,0xD4,0x92,0xF4, + 0xE2,0x50,0x51,0x6B,0x5A,0xAC,0x30,0x32,0xD8,0x7A,0x34,0x50,0xA7,0xD3,0xEF,0x3A, + 0xD9,0x6C,0xDB,0x35,0x8D,0x42,0x5D,0x92,0x13,0xEC,0xEA,0xE8,0xA1,0x55,0x8C,0xD3, + 0xD6,0xA5,0xFB,0x70,0x5F,0xED,0xC9,0x0B,0xED,0x5A,0x1D,0x1D,0xFF,0x30,0xA9,0xF6, + 0xC0,0xD7,0x20,0x96,0x86,0xFB,0xFD,0x8F,0xA7,0x32,0x44,0x7E,0x83,0x9D,0xED,0xDF, + 0x1B,0xF8,0xD2,0x4B,0xA6,0x46,0x0E,0xD1,0xE8,0xA1,0xB5,0xC0,0x04,0x14,0x26,0xDA, + 0xB3,0xB4,0x53,0x07,0x17,0xD2,0xD2,0x47,0x8F,0x88,0xB9,0x5B,0x41,0x7B,0xF4,0x37, + 0xDA,0x34,0x67,0xCA,0x3B,0xD0,0xEC,0xF1,0x56,0x6F,0x3E,0xFB,0xE1,0x05,0xB1,0xEE, + 0xAE,0xC8,0xE5,0x98,0x0F,0xF6,0xD6,0x3C,0x30,0x27,0xC6,0xAE,0xC0,0x6B,0x5E,0xB3, + 0x2F,0xF0,0x27,0x1B,0x07,0x27,0xB0,0x63,0x1A,0xA5,0xEA,0xE7,0xDE,0xA1,0x17,0x2C, + 0x1D,0x3A,0x5E,0x5F,0x97,0x1E,0x61,0x33,0x8E,0x61,0x34,0x1A,0x3B,0xBB,0x15,0x76, + 0xC3,0x76,0xA1,0xBF,0x0F,0x97,0xEB,0x42,0x2D,0xF3,0xF2,0xFA,0x3F,0x2D,0xFC,0xA8, + 0x75,0xB9,0xBB,0x5E,0xB4,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60, + 0x82, +}; // icon_png, 8721 bytes + +// File: index.htm +// +const char index_htm[] PROGMEM = { + "\n" + "\n" + "\n" + " Grow Controller\n" + " \n" + " \n" + " \n" + " \n" + "\n" + "\n" + "

Grow Controller

\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
\n" + "
\n" + "
\n" + " \n" + " \n" + "
\n" + "
92°F
\n" + "
8%
\n" + "
74°F
\n" + "
ON
\n" + "
65°F
\n" + "
12.3V
\n" + "
1.2A
\n" + "
0.0V
\n" + "
OK
\n" + "
\n" + "
\n" + "
\n" + "
\n" + " \n" + " \n" + "
\n" + " \n" + "
\n" + "
\n" + " \n" + "
\n" + " \n" + "
\n" + " \n" + "
\n" + " \n" + "
\n" + " \n" + "
\n" + "
\n" + "

\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
NAV:\n" + " Home |\n" + " Config |\n" + " Scan |\n" + " RSSI |\n" + " Current |\n" + " Factory Reset |\n" + " About\n" + "
\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
GrowController by Origin TechnologiesFirmware: v0.00.00
\n" + "\n" + "\n" +}; // index_htm, 5713 bytes + +// File: index.js +// +const char index_js[] PROGMEM = { + "//\n" + "// rssi script\n" + "//\n" + "// var mySite = 'http://192.168.1.23' from myip.js\n" + "var url = mySite + '/state';\n" + "setInterval(RefreshStatus, 250);\n" + "\n" + "getIt = function (aUrl, callback) {\n" + " var xhr = new XMLHttpRequest();\n" + " xhr.open('GET', aUrl, true);\n" + " xhr.responseType = 'text';\n" + " xhr.onload = function (e) {\n" + " if (this.status === 200) {\n" + " callback(this.response);\n" + " }\n" + " };\n" + " xhr.send();\n" + "};\n" + "\n" + "function RefreshStatus() {\n" + " getIt(url,\n" + " function(data) {\n" + " obj = JSON.parse(data);\n" + " if (obj.state === 1)\n" + " state = \"On\";\n" + " else\n" + " state = \"Off\";\n" + " document.getElementById('version').innerHTML = obj.version;\n" + " document.getElementById('name').innerHTML = obj.name;\n" + " document.getElementById('state').innerHTML = 'Output: ' + state;\n" + " document.getElementById('raw').innerHTML = 'raw: ' + obj.raw;\n" + " document.getElementById('sense').innerHTML = 'Sense: ' + obj.sense;\n" + " document.getElementById('toggle').innerHTML = 'Toggle: ' + obj.toggle;\n" + " document.getElementById('reset').innerHTML = 'Reset: ' + obj.reset;\n" + " document.getElementById('countdown').innerHTML = obj.countdown;\n" + " document.getElementById('uptime').innerHTML = 'Uptime: ' + obj.uptime;\n" + " document.getElementById('wifimode').innerHTML = 'Mode: ' + obj.wifimode;\n" + " var elms = document.querySelectorAll('.' + 'ip'), i;\n" + " for (i = 0; i < elms.length; ++i) {\n" + " elms[i].textContent = obj.ip;\n" + " }\n" + " }\n" + " );\n" + "}\n" +}; // index_js, 1408 bytes + +// File: Open.png +// +const char Open_png[] PROGMEM = { + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x74,0x08,0x03,0x00,0x00,0x00,0x63,0x44,0xE6, + 0x15,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, + 0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, + 0x00,0x18,0x50,0x4C,0x54,0x45,0xF6,0xF6,0xF6,0xF8,0xF8,0xF8,0xF2,0xF2,0xF2,0xF7, + 0xF7,0xF7,0xF5,0xF5,0xF5,0xF3,0xF3,0xF3,0xF4,0xF4,0xF4,0x00,0x00,0x00,0x60,0x9A, + 0x3A,0x5D,0x00,0x00,0x00,0x08,0x74,0x52,0x4E,0x53,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x00,0xDE,0x83,0xBD,0x59,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00, + 0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7,0x6F,0xA8,0x64,0x00,0x00,0x01,0xEC,0x49, + 0x44,0x41,0x54,0x68,0x43,0xED,0xDA,0xD9,0x72,0x83,0x30,0x0C,0x05,0x50,0x48,0x58, + 0xFE,0xFF,0x8F,0x2B,0x4B,0x6A,0x09,0x09,0x8B,0xAD,0xE8,0x8A,0xE9,0xA0,0xFB,0x50, + 0x96,0xCE,0x70,0x6A,0x63,0x64,0xA0,0x74,0xF3,0x05,0xB9,0x0C,0xED,0xBA,0xBE,0x44, + 0x76,0x44,0x84,0xD0,0xFE,0xA1,0xD1,0x5D,0xF8,0x10,0xFA,0x54,0x73,0x85,0x0E,0x43, + 0x87,0x6B,0xFA,0x1E,0xFA,0xB9,0xC7,0x31,0x84,0x76,0x02,0x6C,0xA0,0xA3,0x6E,0x78, + 0xE7,0x10,0xA5,0x5F,0x42,0xF2,0x77,0xDC,0xB7,0xE1,0xCB,0xA8,0xAE,0xBB,0x67,0xA7, + 0x31,0x32,0xA2,0x75,0x83,0xD3,0x3F,0x46,0xB7,0x91,0x75,0xD0,0x83,0xFD,0x53,0x57, + 0x38,0x53,0xF9,0x2B,0x26,0xDD,0xF8,0x32,0xD5,0xA7,0x8D,0x9B,0xEE,0xD4,0xE1,0xB5, + 0xA8,0x5C,0x57,0xAB,0xB6,0xDB,0x53,0x8B,0xB2,0xE9,0x35,0xB2,0xAA,0xBB,0xF7,0x39, + 0xBA,0x9D,0xD2,0x7A,0x94,0xE2,0x56,0x18,0x5B,0xD0,0x75,0x46,0xFB,0x09,0x36,0xA3, + 0x74,0x25,0x9B,0xAB,0xA4,0x19,0xE5,0x81,0x35,0xE8,0x46,0x63,0xAC,0xE8,0xC0,0xA8, + 0x71,0x38,0x5B,0x51,0x31,0x8D,0x23,0xCB,0x8A,0x72,0x71,0xB6,0x5E,0x42,0xE6,0x73, + 0x5A,0x66,0x44,0x5D,0x6B,0x8E,0x1D,0xA5,0xD6,0xEA,0xB2,0x39,0xDF,0xA0,0xE6,0xFC, + 0x6F,0xB4,0x65,0x24,0x7B,0xA1,0x34,0x1D,0xD4,0x1F,0xCA,0x09,0xE5,0x9B,0xBB,0xEA, + 0x63,0xF9,0xA0,0xFA,0x90,0x50,0x5B,0x15,0x7D,0xD0,0xC6,0xA2,0xE8,0xD4,0xBD,0xDC, + 0x54,0x5D,0x3F,0x8F,0x13,0x5A,0xD4,0xFA,0xE1,0xEB,0x85,0x36,0xD5,0x27,0x3F,0xB4, + 0x21,0x89,0x42,0x83,0x41,0x4F,0x8E,0x0A,0x41,0xA7,0x93,0x7B,0x0A,0x04,0x4A,0xC5, + 0xFF,0xB8,0x22,0x02,0xD0,0x62,0x1E,0x57,0x7F,0x00,0xCA,0xE6,0x61,0x51,0x44,0x74, + 0x2F,0x9B,0x47,0x05,0x0A,0x81,0x9E,0x3E,0x71,0x20,0x50,0x9A,0xEA,0x74,0xB9,0x13, + 0x0C,0x7A,0x92,0x44,0xA1,0x49,0x14,0x1A,0x34,0x3A,0x6C,0x95,0x43,0x2C,0x5A,0xEE, + 0x4C,0x37,0x66,0x39,0x28,0x2A,0xF3,0xCD,0x67,0x15,0x86,0xA2,0x7B,0x37,0xFE,0xD8, + 0xEE,0xBD,0x04,0xBD,0xE2,0x9C,0x96,0xB3,0xBA,0x35,0xAF,0x82,0xD1,0xED,0x24,0x0A, + 0x4D,0xA2,0xD0,0x24,0xEA,0x9C,0x7E,0x7C,0xFD,0x47,0x52,0x08,0xCA,0x2F,0x7C,0x5E, + 0xEA,0x7E,0x08,0x2A,0xF3,0xAA,0x6E,0x50,0x62,0xBA,0x97,0xD1,0x85,0x0A,0x44,0x97, + 0xA6,0xC6,0xA0,0xE5,0x16,0x22,0x7A,0x20,0xBD,0x33,0x41,0xE8,0x3A,0x89,0x42,0x93, + 0x28,0x34,0x89,0x42,0x13,0x89,0x96,0x4F,0x25,0x78,0x25,0x0E,0x95,0xCF,0x9E,0x64, + 0x95,0x7F,0x46,0x44,0x6E,0x1F,0xF8,0x79,0x2A,0xB0,0x7B,0x19,0xE5,0xB7,0x86,0xD1, + 0x28,0xBF,0x1E,0x0D,0x44,0x27,0x22,0xE5,0xF3,0x97,0x40,0x74,0x49,0xA2,0xD0,0x24, + 0x0A,0x4D,0xA2,0xD0,0xDC,0x01,0x95,0x0F,0x7A,0x43,0x51,0x9E,0x67,0x48,0x8D,0x47, + 0xE9,0x91,0xF1,0x26,0x28,0x89,0x37,0x41,0xA7,0x3B,0xA0,0xBF,0xEF,0x93,0x42,0x51, + 0xAA,0x0D,0xBC,0x88,0x45,0x35,0x77,0x41,0xE7,0xF9,0x07,0xA5,0x3C,0x68,0x95,0x14, + 0xE6,0xEB,0xBA,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82, +}; // Open_png, 655 bytes + +// File: PlantModel.png +// +const char PlantModel_png[] PROGMEM = { + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0xF3,0x00,0x00,0x01,0xE8,0x08,0x06,0x00,0x00,0x00,0x9C,0x90,0xD9, + 0xD3,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, + 0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, + 0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7, + 0x6F,0xA8,0x64,0x00,0x00,0x6E,0x4E,0x49,0x44,0x41,0x54,0x78,0x5E,0xED,0x9D,0x07, + 0x7C,0x14,0x65,0xFA,0xC7,0x9F,0x4D,0x27,0x05,0xD2,0x0B,0x49,0x20,0x01,0x82,0x20, + 0x4D,0x7A,0x55,0x40,0x01,0x51,0xE1,0x44,0xC5,0x82,0x7F,0xF5,0xB0,0x9C,0x82,0x77, + 0x16,0xCE,0xC2,0xE9,0x79,0x67,0x39,0xEF,0x94,0xF3,0x14,0x3D,0x3D,0xFB,0x89,0x27, + 0x16,0xCE,0x06,0x9E,0x28,0x08,0xA8,0x20,0xA1,0x08,0x48,0x2F,0x21,0xA1,0x25,0x21, + 0x8D,0x54,0x42,0x02,0x29,0x24,0xF3,0xDF,0xDF,0xEC,0xBB,0x9B,0xD9,0xDD,0x99,0xDD, + 0xD9,0x9A,0xD9,0xDD,0xF7,0xFB,0x61,0xC9,0xBC,0xB3,0xB3,0x9B,0xC9,0xEE,0xFC,0xE6, + 0x79,0xDE,0xE7,0x7D,0xDE,0xE7,0x25,0x0E,0x87,0xE3,0x1F,0xE8,0xD8,0x4F,0x8E,0x8F, + 0x51,0x59,0x59,0x29,0x34,0x34,0x34,0x88,0xDB,0xF8,0x59,0x55,0x55,0x25,0x6E,0x1B, + 0x91,0xDB,0x27,0x25,0x23,0x23,0x83,0x42,0x42,0x42,0x58,0xCB,0x80,0x74,0x5F,0x76, + 0x76,0x36,0xBF,0x36,0x7C,0x0C,0xFE,0x85,0x69,0x9C,0xE3,0xC7,0x8F,0x0B,0x75,0x75, + 0x75,0x84,0xC7,0xC9,0x93,0x27,0x45,0x91,0x96,0x97,0x97,0xB3,0x67,0x3D,0x0F,0x04, + 0x1E,0x1D,0x1D,0x4D,0xA9,0xA9,0xA9,0x94,0x98,0x98,0x28,0x6E,0x73,0xA1,0x6B,0x13, + 0xFE,0xA5,0x68,0x88,0x5D,0xBB,0x76,0x09,0x10,0x2C,0x2C,0x2A,0x04,0xDB,0xD4,0xD4, + 0xC4,0x9E,0xD1,0x1E,0x10,0x35,0xC4,0x0D,0x91,0x43,0xF0,0x83,0x06,0x0D,0xE2,0xD7, + 0x52,0x27,0xC3,0xBF,0x80,0x4E,0x04,0xE2,0x3D,0x71,0xE2,0x04,0xE1,0x01,0xCB,0xEB, + 0xEB,0x40,0xDC,0x59,0x59,0x59,0xE2,0x83,0x8B,0xDB,0xFB,0xF0,0x0F,0xDC,0x8B,0xF8, + 0x9B,0x78,0xED,0x01,0x71,0xF7,0xE9,0xD3,0x47,0x14,0x77,0xFF,0xFE,0xFD,0xF9,0xB5, + 0xE6,0x61,0xF8,0x07,0xEC,0x61,0x36,0x6E,0xDC,0x28,0xEC,0xD8,0xB1,0x23,0x20,0xC4, + 0x6B,0x0F,0xB8,0xE3,0x17,0x5D,0x74,0x11,0x8D,0x1C,0x39,0x92,0x5F,0x77,0x1E,0x80, + 0x7F,0xA8,0x1E,0x00,0x16,0x78,0xF7,0xEE,0xDD,0xA2,0x05,0xF6,0x14,0xC6,0x3E,0x6B, + 0x44,0x44,0x84,0xD8,0x6F,0x95,0x62,0x7C,0xCE,0x1E,0xE8,0x9F,0x9F,0x3F,0x7F,0x9E, + 0xB5,0x0C,0x18,0xCF,0x59,0xEE,0x39,0x77,0x32,0x70,0xE0,0x40,0xEA,0xD7,0xAF,0x1F, + 0x77,0xC7,0xDD,0x08,0xFF,0x20,0xDD,0xC4,0xA1,0x43,0x87,0x84,0xFD,0xFB,0xF7,0x53, + 0x5E,0x5E,0x9E,0x5B,0x45,0xD0,0xD9,0xD1,0x64,0x4F,0x47,0xD3,0x71,0x33,0x82,0xB0, + 0x61,0xB1,0x33,0x33,0x33,0xF9,0xF5,0xE8,0x02,0xFC,0xC3,0x73,0x81,0xB2,0xB2,0x32, + 0xD1,0x85,0x86,0x80,0x8D,0x63,0xBE,0xAE,0x60,0x0C,0x1E,0xE1,0xA1,0xF5,0xE1,0x1F, + 0x8C,0x73,0x43,0xE0,0xC6,0x18,0x00,0x84,0xEE,0x2A,0xB1,0xB1,0xB1,0xA2,0xA8,0x27, + 0x4F,0x9E,0xCC,0xAF,0x4B,0x27,0xE0,0x1F,0x9A,0x13,0xC0,0x5A,0xAD,0x5F,0xBF,0xDE, + 0x65,0x37,0x1A,0x56,0xD7,0x28,0xDE,0x9C,0x9C,0x1C,0x9F,0xFF,0x2E,0xE0,0x9D,0x18, + 0xC5,0xED,0xAA,0xF5,0x86,0xA8,0x27,0x4C,0x98,0x40,0x49,0x49,0x49,0xFC,0x1A,0x55, + 0x09,0xFF,0xA0,0x1C,0xC0,0x55,0x11,0xFB,0x9B,0x78,0xED,0xB1,0x6F,0xDF,0x3E,0x93, + 0xB8,0x6D,0x65,0xA3,0xD9,0x02,0xFD,0xEA,0x49,0x93,0x26,0x51,0x5A,0x5A,0x1A,0xBF, + 0x56,0xED,0xC0,0x3F,0x20,0x15,0xC0,0xE2,0xE4,0xE6,0xE6,0x3A,0xE5,0x4A,0xA2,0x9F, + 0x0B,0x2B,0x73,0xF1,0xC5,0x17,0x07,0xF4,0x67,0x0D,0xB7,0x1C,0x5D,0x12,0xC4,0x15, + 0x9C,0xE9,0x92,0x40,0xD4,0xB0,0xD4,0xBC,0x5F,0xAD,0x0C,0xFF,0x60,0x6C,0x00,0x11, + 0xC3,0x12,0x3B,0xEA,0x32,0xF2,0xA0,0x8E,0x6D,0x5C,0x09,0x16,0xC2,0xAB,0x81,0xA5, + 0xE6,0x29,0xA5,0xD6,0xF0,0x0F,0x44,0x86,0x82,0x82,0x02,0x61,0xDD,0xBA,0x75,0x0E, + 0x8B,0x98,0x0F,0xB7,0x38,0x8E,0xB3,0xC3,0x78,0x10,0xF5,0x94,0x29,0x53,0xF8,0xCD, + 0x52,0x02,0xFF,0x20,0x2C,0x58,0xBA,0x74,0xA9,0x70,0xE4,0xC8,0x11,0xD6,0xB2,0x0F, + 0x86,0x8A,0xE0,0xFE,0x8D,0x1D,0x3B,0x96,0x7F,0x96,0x2E,0xF2,0xE3,0x8F,0x3F,0x0A, + 0x5B,0xB7,0x6E,0x75,0x28,0x27,0x1D,0xDE,0xCF,0x35,0xD7,0x5C,0xC3,0x3F,0x7B,0x3D, + 0xFC,0x43,0x60,0x20,0x53,0x0B,0x2E,0xB5,0x5A,0xB7,0x0F,0xC3,0x28,0x10,0x31,0xCF, + 0x66,0x72,0x3F,0x8E,0x8A,0x1A,0xDD,0x9A,0xE9,0xD3,0xA7,0xD3,0xD0,0xA1,0x43,0x03, + 0xFA,0xBB,0x08,0xF8,0x0B,0x11,0x2E,0xF5,0xEA,0xD5,0xAB,0x55,0x47,0x5B,0x21,0x62, + 0xF4,0xD9,0x02,0xFD,0xC2,0xF1,0x06,0x5B,0xB6,0x6C,0x11,0x03,0x8F,0x6A,0x03,0x66, + 0x18,0x2D,0x98,0x35,0x6B,0x56,0xC0,0x0E,0x67,0x05,0xF4,0x05,0xF9,0xD9,0x67,0x9F, + 0x89,0x81,0x18,0x35,0x20,0x2A,0x0D,0x4B,0xCC,0x45,0xEC,0x7D,0x1C,0x15,0x35,0xBE, + 0xA7,0xA9,0x53,0xA7,0x06,0xDC,0xF7,0x14,0x90,0x17,0x26,0x2E,0x0E,0xB8,0xD4,0x6A, + 0xDC,0x38,0x88,0x18,0x81,0x16,0x3E,0xEB,0xA7,0xF3,0x41,0xB0,0x0C,0x81,0x49,0x35, + 0xA2,0x46,0x2C,0x63,0xC6,0x8C,0x19,0x01,0xF5,0xBD,0x05,0xDC,0x05,0xFA,0xCE,0x3B, + 0xEF,0x88,0x05,0x00,0xEC,0x81,0x7E,0x18,0xEE,0xF0,0x81,0x3E,0x3E,0xAC,0x45,0xD6, + 0xAE,0x5D,0x2B,0xF6,0xA9,0xD5,0xC4,0x37,0x30,0xC2,0x70,0xFD,0xF5,0xD7,0x07,0xC4, + 0x77,0x18,0x30,0x17,0x2A,0xC6,0x36,0x57,0xAC,0x58,0xA1,0xCA,0x1A,0x07,0xD2,0x05, + 0xE0,0xAB,0x20,0x09,0x65,0xE5,0xCA,0x95,0xAA,0x86,0xB4,0xE0,0x5D,0xCD,0x9E,0x3D, + 0xDB,0xEF,0xB3,0xC8,0x02,0xE2,0x82,0x5D,0xB5,0x6A,0x95,0x78,0x27,0xB7,0x07,0xBE, + 0x74,0xB8,0x66,0x3C,0x21,0xC1,0x77,0x40,0xCA,0x28,0x02,0x98,0xF6,0x5C,0x6F,0x14, + 0x2A,0x44,0x77,0xC9,0x9F,0x87,0x10,0xFD,0xFE,0xA2,0x55,0xE3,0x56,0xE3,0x8B,0x46, + 0x84,0x9A,0xBB,0xD4,0xBE,0x8B,0xDA,0x1B,0x36,0x92,0x7A,0xE6,0xCC,0x99,0xE3,0x97, + 0xDF,0xB3,0xDF,0x5E,0xBC,0x6A,0xDD,0x6A,0x7F,0xFE,0x72,0x03,0x8D,0xE2,0xE2,0x62, + 0xD1,0x4A,0xDB,0xBB,0x79,0x63,0x78,0x11,0x6E,0xB7,0xBF,0x65,0x8F,0xF9,0xE5,0x45, + 0xAC,0xE6,0x2E,0x0D,0x6B,0x8C,0x44,0x03,0x9E,0xF4,0xE1,0x7F,0x20,0x40,0x86,0xA1, + 0x2C,0x5B,0xF8,0xA3,0xDB,0xED,0x77,0x17,0xB2,0x1A,0xB7,0x3A,0x50,0x02,0x22,0x81, + 0x0C,0x92,0x81,0x3E,0xFF,0xFC,0xF3,0x80,0xF2,0xCC,0xFC,0xEA,0x62,0x5E,0xBC,0x78, + 0xB1,0x58,0xFD,0xC2,0x16,0x3C,0x52,0x1D,0x58,0xA8,0xB9,0xB9,0xA3,0x24,0xD3,0xFC, + 0xF9,0xF3,0x7D,0xFE,0x9A,0xF0,0x8B,0x8B,0x1A,0xE5,0x7B,0x96,0x2D,0x5B,0x66,0xB3, + 0x02,0xA6,0x2F,0xB8,0xD5,0xA5,0xA7,0x8A,0x85,0xBF,0xBF,0xFB,0x67,0x6A,0x6E,0x6D, + 0xA6,0x7B,0xE7,0x3C,0x42,0x83,0xFA,0xF2,0x6C,0x33,0x77,0xA0,0xC6,0xED,0xF6,0x07, + 0x41,0xFB,0xFC,0xC5,0x82,0xA0,0xC7,0x87,0x1F,0x7E,0x68,0xD3,0x9D,0xF2,0x15,0xB7, + 0xFA,0xD1,0x17,0xE6,0x09,0x1B,0xB6,0xAF,0x15,0xB7,0xC3,0x42,0xC3,0x69,0xE9,0xA2, + 0xFF,0x51,0x56,0x46,0x1F,0x9F,0xFF,0x8E,0xCA,0xCB,0xCB,0x85,0x13,0x95,0xB5,0xD4, + 0xDE,0xDE,0xCE,0xF6,0x18,0xE8,0x99,0x18,0x4B,0xE9,0xE9,0xE9,0x5E,0xF9,0xFB,0x50, + 0x25,0x06,0x6E,0xB7,0xAD,0x21,0x2C,0x04,0xC6,0x6E,0xB9,0xE5,0x16,0x9F,0xCD,0xED, + 0xF6,0xE9,0x0B,0x05,0xFD,0x22,0x58,0x64,0x5B,0x99,0x40,0xBE,0xE4,0x56,0x4B,0xC5, + 0x6C,0x64,0xEA,0xB8,0x19,0x74,0xE5,0xC4,0x6B,0x69,0xDC,0xD0,0x89,0x36,0xFF,0x86, + 0x35,0x9B,0xBE,0x16,0xBE,0xDD,0xF0,0xA5,0x68,0xD5,0x63,0x22,0xBB,0xD2,0xAC,0x29, + 0x73,0xEC,0xBE,0xC6,0xD3,0x6C,0x3F,0x70,0x58,0xA8,0x6B,0x68,0xA4,0xCD,0xCD,0xD1, + 0xB4,0xAA,0x21,0x92,0x5A,0x28,0x88,0x3D,0x63,0x60,0x42,0x44,0x23,0x5D,0x11,0xD5, + 0x48,0x31,0x61,0xC1,0x34,0x61,0xA8,0x77,0xE6,0x80,0x2F,0x59,0xB2,0x44,0x2C,0x65, + 0xA4,0x04,0x32,0xFF,0xE6,0xCE,0x9D,0xEB,0x93,0xF1,0x14,0x9F,0x3B,0x61,0x23,0xC8, + 0xD3,0xC5,0xD0,0x93,0x2D,0x30,0x76,0xEC,0x4B,0x95,0x1E,0xD7,0x6F,0x5B,0x23,0x2C, + 0xFC,0xC7,0x7C,0xD6,0x32,0x67,0x60,0xCE,0x45,0xF4,0xA7,0xF9,0x8B,0x64,0x2D,0xF5, + 0x3B,0x9F,0xBE,0x22,0xBC,0xFB,0xF9,0x3F,0x59,0xAB,0x83,0x07,0x7F,0xFD,0x47,0x9A, + 0x73,0xD5,0x1D,0x5E,0xFF,0xFB,0x0F,0x9D,0x28,0x16,0x4E,0x54,0x54,0xD3,0xF3,0xB5, + 0x89,0xB4,0xA1,0x29,0x9A,0xED,0x55,0x66,0x60,0xE8,0x39,0x7A,0x3C,0xBE,0x8A,0xFA, + 0x27,0x44,0xD1,0xD0,0xBE,0xBD,0x3C,0x7E,0xBE,0xCB,0x97,0x2F,0x17,0x0B,0x22,0x28, + 0x81,0x2E,0xD9,0x4D,0x37,0xDD,0xE4,0x73,0x75,0xDA,0x7C,0xEA,0x64,0x8D,0x60,0xEE, + 0x31,0x12,0xEE,0x6D,0x81,0x4C,0x2E,0x5F,0x1C,0x76,0x7A,0xE6,0xF5,0x47,0x85,0x6F, + 0xD6,0x7F,0xC1,0x5A,0xE6,0xC4,0x44,0x75,0xA5,0x0F,0xF4,0xAE,0x77,0xF7,0xE4,0x8E, + 0xF1,0xD1,0xAA,0xDA,0x53,0xC2,0x55,0xF7,0x8C,0x65,0x2D,0x73,0xE0,0xAA,0x2F,0x7F, + 0x6D,0x3D,0x25,0xC6,0x25,0x7B,0xED,0x73,0xD8,0xAA,0xB7,0xC6,0xCB,0x2A,0x43,0xE8, + 0xE5,0xBA,0x04,0xB6,0x47,0x3D,0x37,0x47,0xD7,0xD1,0xBC,0xC4,0x46,0xBA,0xE4,0xA2, + 0x01,0x1E,0x3F,0x5F,0x7B,0xFD,0x68,0x08,0x1A,0xD7,0x90,0x2F,0xCD,0x92,0x33,0xF7, + 0x7B,0x7C,0x00,0x4C,0x5C,0xB7,0x25,0x64,0x7C,0x09,0xE8,0x1F,0xFB,0xEA,0xF8,0xF1, + 0x9F,0xEF,0xFD,0xBB,0x6E,0xD1,0xC3,0x6F,0x88,0x96,0xD8,0x92,0x33,0x8D,0xF5,0xF4, + 0xA7,0x57,0x1E,0x64,0x2D,0x03,0x6B,0x37,0xAF,0x64,0x5B,0xD6,0xB4,0xE8,0x5D,0xEE, + 0xAD,0xBB,0x7F,0x62,0x2D,0xCF,0x03,0x21,0x3F,0x53,0x12,0xE9,0x94,0x90,0xC1,0xC7, + 0x0D,0xB1,0xF4,0x60,0x69,0x1C,0xFD,0xB4,0xFB,0x80,0xC0,0x76,0x79,0x0C,0x4C,0x91, + 0x44,0x40,0x54,0x09,0x74,0xDD,0xE0,0xF9,0xC1,0x03,0x64,0xBB,0x34,0x8F,0x4F,0x89, + 0x19,0x42,0xC6,0xD4,0x45,0x25,0xD0,0xDF,0x81,0x7B,0xE4,0xEB,0x35,0xB8,0x26,0x8D, + 0x9A,0xA6,0xFB,0xF7,0x5F,0xBF,0xD0,0xFD,0xF7,0xA5,0xEF,0xC4,0x3E,0xB3,0x94,0xFD, + 0x05,0xBB,0x69,0xF3,0xAE,0x0D,0xA6,0x0B,0xAC,0xA8,0xF4,0x38,0xDB,0xEA,0x5C,0xF6, + 0x1D,0x2D,0x14,0x96,0x9E,0x0A,0xA5,0x6F,0xCF,0xC6,0xB0,0x3D,0xCE,0xB1,0xB3,0x25, + 0x92,0x9E,0x39,0xD5,0x4D,0xBC,0x31,0xB0,0x5D,0x1E,0x03,0x09,0x23,0x28,0x66,0x00, + 0x03,0xA0,0x84,0x2F,0x09,0xDA,0x67,0xC4,0x8C,0x0F,0xD4,0x9E,0x90,0x11,0xB8,0xF0, + 0xA7,0x7A,0xD4,0xE8,0x1F,0x3F,0xFB,0xE0,0x2B,0x3A,0x4B,0x41,0x23,0xD0,0x65,0x24, + 0xFF,0xC4,0x41,0xB6,0x25,0x4F,0xCF,0xF4,0xDE,0x6C,0xCB,0xB3,0x1C,0xAF,0xAA,0xA3, + 0x7F,0x9D,0x8E,0x67,0x2D,0xD7,0x58,0x77,0x36,0x9A,0xF6,0x9C,0x6E,0xA3,0x9A,0x9A, + 0x1A,0x8F,0x8B,0x08,0x6E,0x34,0x0C,0x80,0x2D,0x41,0x63,0x76,0x16,0x82,0xAD,0xAC, + 0xA9,0x59,0x7C,0x42,0xCC,0xC6,0x3C,0x6B,0x25,0x30,0xA4,0xF0,0xD8,0x63,0x8F,0xE9, + 0xFC,0x35,0xA3,0xEB,0xD6,0xAB,0xEF,0x61,0x5B,0x06,0xA4,0x11,0xEF,0xC2,0xD2,0x63, + 0x6C,0x4B,0x9E,0xB4,0xA4,0x74,0xB6,0xE5,0x39,0x10,0xB5,0x7E,0xB1,0x16,0xAE,0x75, + 0x10,0x2D,0xBE,0xB4,0x1B,0xD1,0xAC,0x58,0x9D,0xD2,0x03,0xBD,0xFB,0xBB,0x47,0xB2, + 0x63,0x2C,0x90,0xEE,0xC7,0xFB,0x1D,0x3C,0x61,0x7F,0xDE,0xB9,0x3B,0x80,0x01,0xB8, + 0xEB,0xAE,0xBB,0x44,0x83,0x20,0x07,0x5C,0x6E,0x8C,0x9A,0x60,0x18,0x94,0xED,0xD2, + 0x24,0x9A,0x17,0xB3,0x71,0x7C,0x50,0x09,0x0C,0xF6,0x2F,0x58,0xB0,0xC0,0x2F,0x45, + 0x6C,0xE4,0x82,0xEC,0x0B,0x75,0x52,0x0B,0x8B,0xBE,0xF0,0x17,0x6B,0x3E,0x12,0x10, + 0xFC,0x42,0x3F,0x5A,0x09,0x04,0xCC,0xBC,0x11,0xFC,0xC2,0xF0,0x93,0x21,0x6A,0xDD, + 0x4E,0x0B,0x7E,0x38,0xAD,0xF7,0x4D,0xEB,0x04,0x3C,0xEE,0x2E,0x11,0x0C,0x17,0x3F, + 0x6B,0xE3,0xB1,0x45,0xDC,0x61,0x9F,0xFC,0xD6,0x70,0x2A,0x6A,0xF6,0xDE,0xD7,0x0A, + 0x43,0x00,0x41,0xC3,0x30,0xC8,0x01,0x41,0x23,0x9F,0x01,0xF3,0xA8,0xD9,0x2E,0xCD, + 0xA1,0x69,0x31,0x1B,0x33,0xBB,0x94,0xC6,0x91,0xF1,0xC1,0xFB,0x43,0x1A,0x9E,0x1A, + 0xAE,0xBA,0xE4,0x1A,0xB6,0x65,0xE0,0x8D,0x4F,0xFE,0x41,0x5B,0xF7,0x6C,0x64,0x2D, + 0x79,0x7A,0x76,0xEF,0xC5,0xB6,0x3C,0x07,0x12,0x42,0x30,0x8E,0xEC,0x09,0xD6,0x9D, + 0x8D,0xD2,0x77,0x23,0x8A,0xBC,0x26,0x1E,0x24,0x8B,0xC0,0x30,0x28,0x59,0x68,0x24, + 0x26,0x41,0xD0,0x5A,0x45,0xD3,0x62,0xB6,0x95,0xD9,0x85,0x1A,0x4F,0xFE,0x6E,0x91, + 0xA5,0x5C,0x35,0xE9,0x3A,0x71,0xA8,0xC9,0x08,0x2C,0x32,0x52,0x3F,0x6D,0xE1,0x8D, + 0xFE,0x72,0x49,0x6D,0x3D,0xE5,0x9E,0x95,0xBF,0xF8,0x5D,0x65,0x5B,0x53,0x17,0x3A, + 0x55,0xAB,0xB7,0xF4,0x5E,0x06,0xB1,0x17,0xA5,0x3E,0x34,0x52,0x86,0x5F,0x7D,0xF5, + 0x55,0x4D,0x5A,0x67,0xCD,0x8A,0x19,0x93,0x26,0x94,0x52,0xEF,0x70,0xE7,0x44,0xDA, + 0x5D,0x20,0x01,0x77,0xF9,0xAE,0xD9,0xF7,0xB1,0x96,0x81,0xE6,0x16,0xDB,0x33,0x82, + 0xD2,0x12,0x3D,0xDF,0x5F,0x6E,0x6E,0x69,0xA5,0xEA,0x76,0xE5,0xE0,0x91,0x4D,0x24, + 0x7D,0x69,0x3C,0xDE,0x4E,0xD7,0x99,0xDD,0x9C,0xF1,0xBE,0xC2,0xF9,0x56,0xD6,0xF2, + 0x1E,0x70,0xB9,0x6D,0x05,0xC5,0x50,0x96,0xF9,0x8D,0x37,0xDE,0xD0,0x9C,0xA0,0x35, + 0x29,0x66,0x7C,0x50,0x4A,0x93,0x26,0xF0,0x01,0xE3,0x83,0xF6,0x87,0x60,0xD7,0x2F, + 0x07,0xB6,0x0A,0x48,0xC3,0x44,0xE6,0x17,0xFA,0xBF,0x6C,0xB7,0x22,0xBF,0xBE,0x66, + 0xBE,0x0E,0x16,0x5A,0x2D,0xDE,0x08,0x7E,0xB5,0xB5,0x34,0x53,0x59,0x5B,0x28,0x6B, + 0x39,0x88,0xA4,0x2F,0x8D,0x87,0xA9,0x8F,0xCD,0xC0,0xFB,0x86,0xB6,0xB5,0xB0,0x96, + 0x77,0x41,0x50,0x0C,0xC3,0x56,0x4A,0x60,0xE9,0xA2,0x4F,0x3E,0xF9,0x44,0x53,0x82, + 0xD6,0x9C,0x98,0x91,0x6A,0x67,0x6B,0x8D,0x27,0x24,0x84,0xF8,0x7A,0x8D,0xAE,0xC5, + 0xEF,0x3F,0x2B,0x4C,0xB9,0x7D,0xA8,0x70,0xEF,0xD3,0xFF,0x27,0x26,0x81,0x20,0x85, + 0x13,0x59,0x5C,0xF3,0x9F,0xBE,0x59,0x38,0x71,0xF2,0x88,0xCD,0x0B,0x04,0x49,0x25, + 0x8F,0xDE,0xF5,0x8C,0x99,0xCB,0xAD,0x44,0x7C,0x6C,0x12,0xDB,0xF2,0x1C,0xBA,0x90, + 0x50,0x4A,0x08,0x72,0x6C,0xF1,0x37,0xB5,0xE0,0x7D,0x5B,0x83,0x9C,0xB4,0xFA,0x6E, + 0x00,0xF9,0x0A,0xB6,0x12,0x4B,0xB0,0xF0,0x1D,0xCA,0x36,0xB3,0x66,0xA7,0xA3,0x29, + 0x31,0x63,0x2C,0xD9,0x56,0xCE,0x2C,0xEE,0x94,0xBE,0x5C,0x07,0x19,0x56,0xF8,0xCA, + 0xBB,0xC7,0x08,0xCB,0xBE,0x5D,0x22,0xF6,0x79,0x2D,0xD9,0x79,0xE0,0x67,0xBA,0x75, + 0xE1,0xAF,0x68,0xE5,0x8F,0x9F,0xDB,0xBC,0x40,0xAE,0x9B,0xF6,0x7F,0xBA,0xFF,0x2E, + 0xFE,0x8E,0x92,0xE3,0x53,0xD9,0x1E,0x79,0x12,0xBC,0x20,0xE6,0xF0,0xB0,0x30,0x4A, + 0x08,0x6E,0x63,0x2D,0xF7,0x82,0xF7,0xD5,0x85,0x84,0xB1,0x56,0xE7,0x80,0xC4,0x12, + 0xE4,0xF8,0x2B,0x81,0x6C,0x44,0xAD,0x0C,0x59,0x69,0x46,0xCC,0xC6,0xD2,0xA9,0x4A, + 0xF8,0xFA,0x92,0x30,0x0F,0xFE,0xED,0x76,0x01,0x56,0xB8,0xBA,0xAE,0x92,0xED,0x91, + 0x07,0xC3,0x4E,0x7F,0x79,0x63,0xA1,0x5D,0x41,0x23,0x3F,0x3B,0x38,0xD8,0xB6,0xD5, + 0x4A,0x88,0x4D,0x64,0x5B,0x9E,0x23,0xB9,0x5B,0x34,0x0D,0x0F,0x3F,0xC7,0x5A,0xEE, + 0x65,0x40,0xC8,0x59,0x8A,0xEB,0xEA,0x5A,0x46,0x99,0x3B,0xC0,0x64,0x1D,0x2C,0x50, + 0x27,0x07,0x46,0x5A,0x6C,0x0D,0x9D,0x7A,0x13,0xCD,0x88,0xD9,0xD6,0x10,0x14,0x3E, + 0x48,0x5F,0x9A,0xFD,0x24,0x05,0x05,0x07,0x6E,0x7D,0x74,0x86,0xB0,0x45,0x26,0x47, + 0x1A,0x96,0x73,0xD8,0x80,0xD1,0xB2,0x79,0xD8,0x10,0xF4,0xBE,0x7C,0xDB,0x69,0x84, + 0x65,0x95,0x76,0xCA,0x23,0x29,0x8C,0x31,0x1F,0x3E,0x7E,0x50,0xC0,0xCD,0xE2,0x93, + 0x6F,0xDE,0x13,0x70,0x7E,0x6C,0xB7,0x53,0xF4,0xCC,0x48,0xD7,0x4D,0x8D,0x6C,0x64, + 0x2D,0xF7,0x72,0x75,0xD7,0xB3,0x34,0xA0,0x8F,0x36,0xBA,0x54,0x58,0x69,0x12,0xCB, + 0xC8,0xCA,0x81,0xF8,0x8E,0x16,0xFA,0xCF,0x9A,0xF8,0xA0,0x6C,0x4D,0x49,0x43,0x61, + 0x81,0xFB,0xEE,0xBB,0xCF,0x27,0x85,0x0C,0xD1,0xA0,0x3F,0x6C,0x29,0x3A,0xF4,0x77, + 0x11,0x99,0x46,0x40,0x8B,0xED,0x12,0xA7,0x3F,0xC2,0x72,0xC3,0x32,0x1B,0xC1,0xD0, + 0xD2,0xA7,0x8B,0xD7,0x28,0xFE,0xED,0xA3,0x6F,0xE8,0xAD,0x78,0x01,0xA5,0x25,0x65, + 0xD0,0x8A,0x7F,0x6D,0x30,0x7B,0x2D,0x6E,0x0E,0xAF,0x7F,0xF2,0x82,0xE8,0xCE,0x4B, + 0xC1,0x0D,0x05,0xD3,0x2B,0xA5,0xB3,0xB1,0x1C,0x21,0x77,0xE7,0x5E,0xE1,0x8E,0xB2, + 0x14,0x31,0xD1,0xC3,0x5D,0xA0,0xBF,0xFC,0x65,0x5A,0x11,0x4D,0x1C,0x39,0x4C,0x53, + 0xDF,0xFD,0x0B,0x2F,0xBC,0xA0,0x38,0xCA,0x82,0xFE,0x75,0x67,0x16,0x08,0x74,0x9B, + 0x65,0xDE,0x73,0xA4,0x4E,0xC0,0xE3,0x83,0xD5,0x85,0xA6,0xC7,0xF6,0x43,0x35,0xE2, + 0x3E,0x3C,0xD8,0x61,0x56,0xD8,0xEA,0x27,0x1B,0x23,0xD7,0xBE,0x08,0xA2,0xD3,0xBF, + 0x7D,0xE6,0xFF,0xAC,0x84,0x0C,0x2B,0x8C,0x0A,0x22,0x52,0x21,0x03,0x4C,0xAE,0xC0, + 0x6C,0x29,0x29,0x85,0x25,0x47,0x09,0xD6,0x93,0x35,0x5D,0xE2,0x5F,0x1F,0xBF,0x20, + 0xDC,0xF5,0xC4,0x6C,0x2B,0x21,0x03,0xEC,0xBB,0xEB,0x89,0xEB,0xC5,0x9B,0x0F,0xDB, + 0xE5,0x10,0x13,0x86,0x0D,0xD6,0xFD,0x2D,0xA1,0x82,0xB5,0xDC,0xC3,0xFC,0xD8,0x5A, + 0xEA,0x95,0x9E,0xC6,0x5A,0xDA,0x01,0x01,0x58,0x25,0x3A,0xBB,0xFF,0xEC,0xF4,0x5D, + 0xE4,0xC8,0xC9,0x06,0xE1,0xDB,0xAD,0xE5,0xB4,0x69,0x5F,0x0D,0xD5,0x9E,0x51,0x3F, + 0x7C,0xD0,0xBF,0x67,0x8C,0xDE,0x32,0x05,0x51,0xAF,0xEE,0x51,0xA4,0x6B,0x6F,0xA6, + 0xDD,0xBF,0x6C,0xA5,0x2E,0x3A,0xF9,0xC4,0x00,0xAC,0xF5,0xD4,0xA7,0x4F,0x1F,0xD6, + 0x32,0x70,0xE8,0xC4,0x19,0x6A,0x39,0x6F,0x5E,0x7E,0x46,0x8E,0xE8,0x2E,0x21,0xD4, + 0x3B,0x3D,0x8A,0x86,0xF4,0xB1,0xCE,0x01,0xF6,0x06,0xFF,0x59,0xFE,0x86,0xDE,0x0A, + 0xFE,0x83,0xB5,0x0C,0x60,0x58,0x09,0xD1,0x68,0xD6,0x94,0x05,0x91,0x6E,0x04,0xC8, + 0x8C,0xC8,0x59,0x58,0x00,0xF7,0xF8,0x9A,0xDF,0x29,0x07,0x66,0x8C,0xAF,0xC3,0x0C, + 0xAB,0x97,0x3F,0xF8,0xAB,0x78,0x63,0xB0,0x07,0xD2,0x3F,0xFF,0xF5,0xE7,0x8F,0xC4, + 0xF4,0x51,0xB6,0x4B,0x35,0xBB,0xF2,0x8F,0x09,0x2F,0x14,0x05,0x89,0xD3,0x18,0x5D, + 0x65,0x58,0xD8,0x59,0xFA,0x67,0xC6,0x69,0x9A,0x30,0x58,0x9B,0xC1,0x4E,0x5B,0xB3, + 0xF7,0x90,0x95,0xD8,0x59,0xC9,0x4C,0x0E,0xFF,0xD2,0xA2,0x8A,0xB3,0xC2,0x7B,0xDF, + 0x14,0xD2,0xE6,0xFD,0xD5,0x6C,0x8F,0xB6,0x09,0x0B,0x09,0xA2,0x11,0xFD,0xE2,0x68, + 0xF8,0x05,0xB1,0x34,0x73,0xBC,0xF7,0xC6,0xA6,0xD1,0x27,0x45,0xBF,0xD7,0xC8,0x5D, + 0xB3,0xEF,0xA7,0xDF,0xDC,0xF0,0x80,0xDD,0xDF,0x0F,0x8B,0x0E,0x91,0x4A,0xDD,0x6D, + 0x58,0x6C,0x58,0x6E,0xD6,0x14,0xB1,0x27,0xE6,0xAE,0xD1,0xDD,0x28,0x35,0xB1,0x3B, + 0xE5,0x9F,0x38,0xC4,0xF6,0x98,0x33,0x71,0xE4,0x54,0xD1,0x6B,0xB0,0x7C,0x1E,0x37, + 0x81,0x77,0x9F,0xFD,0xCC,0xA9,0x9C,0xEE,0xDC,0xBD,0x87,0x84,0xFB,0x4F,0x76,0x13, + 0xA7,0x31,0x3A,0x4B,0xCF,0xE0,0x66,0x5A,0x92,0x56,0x41,0x97,0x8E,0x18,0xEC,0xB5, + 0xEF,0xCA,0x19,0x6C,0x95,0x1F,0xEA,0xAC,0xF2,0xBD,0x0E,0xFD,0xC2,0x4D,0xFB,0xAA, + 0x84,0xE7,0x96,0xE6,0xAB,0xB2,0x8C,0x5A,0x04,0xD6,0xFA,0x9E,0xAB,0xB3,0xE9,0xF2, + 0x51,0x29,0x5E,0xF9,0xA0,0x61,0x9D,0x77,0x1D,0xDA,0x26,0xD6,0xF0,0x9A,0x36,0x7E, + 0xA6,0xEA,0xDF,0xF9,0xC4,0xCB,0x0F,0x08,0xD2,0xA2,0x03,0x10,0xDE,0xDF,0x1F,0x79, + 0xD3,0xEC,0xF5,0xF6,0xC4,0xAC,0x04,0xFA,0xE1,0xE8,0x1F,0x1B,0x2B,0x7F,0xC2,0xFD, + 0xFE,0x60,0xC5,0x9B,0xE2,0x73,0x46,0xD0,0x87,0x7E,0xE3,0xC9,0x8F,0x9D,0xFA,0x8C, + 0x36,0xEC,0xDC,0x27,0xFC,0xA5,0x2A,0x4E,0x9C,0xC6,0xE8,0x28,0xB0,0xC8,0x2F,0xA4, + 0x54,0xD3,0x65,0xC3,0x7D,0x63,0x3E,0xBA,0xAD,0xFE,0x33,0x86,0x51,0xBD,0x3D,0xFA, + 0xA2,0xFA,0x97,0x7D,0xBD,0xA9,0x4C,0x78,0xF5,0x0B,0xFB,0xAE,0x9A,0x2F,0x30,0x6D, + 0x64,0x0A,0x3D,0x3C,0x47,0xBB,0xF3,0x9E,0x11,0xA8,0x42,0xFF,0xD6,0x08,0x02,0x66, + 0x1B,0x3F,0x3A,0x68,0x76,0xBE,0x48,0x2E,0xB9,0xF1,0xF7,0x97,0xB3,0x96,0x7D,0xF0, + 0x1E,0x37,0x5D,0x75,0x3B,0xFD,0xF6,0xE6,0x47,0xAC,0xFE,0x6E,0x39,0x41,0x23,0x31, + 0x05,0xE3,0xD9,0xAC,0xE9,0x10,0x28,0x2C,0x80,0xF9,0xC8,0x98,0xC6,0xA8,0x26,0x28, + 0x86,0x60,0xD7,0x82,0xB8,0x1A,0xBA,0xB4,0x6B,0x2B,0x8D,0x1B,0xE2,0xF9,0x92,0x41, + 0xEE,0x02,0x33,0xFA,0xDE,0x7F,0xFF,0x7D,0xD6,0x32,0x07,0x73,0x07,0x1E,0x79,0xC4, + 0xFA,0xB3,0xF6,0x24,0xAA,0x7E,0x19,0x2C,0xF2,0xD3,0x4B,0xF2,0x58,0xCB,0x1A,0xB8, + 0xB2,0xFD,0xB3,0x0C,0xE3,0x81,0x83,0x7A,0x75,0x15,0x7F,0x82,0x93,0x95,0x4D,0xA6, + 0xFE,0xB4,0xDA,0xBE,0xAE,0xB7,0x98,0x31,0x2E,0x95,0xEE,0x9F,0xAD,0xDD,0x32,0xB6, + 0xB3,0x7E,0x3B,0x51,0x90,0x06,0xCF,0x60,0x4D,0x67,0x4C,0x9E,0x6D,0x3A,0x5F,0xA4, + 0x82,0x22,0x83,0x4C,0x0D,0xB0,0xEC,0x28,0xEE,0x67,0x2B,0x5A,0x6D,0x59,0x19,0x54, + 0xCE,0x1B,0x70,0x04,0x14,0x16,0xC0,0x7C,0xE4,0x72,0xFD,0xD7,0xFF,0xF9,0x99,0x18, + 0x51,0xD4,0x85,0xE7,0xC3,0xC4,0x7C,0xEB,0x98,0xA0,0x76,0xCA,0x09,0x69,0x12,0x5D, + 0xEA,0xE9,0x31,0xE7,0xE8,0xC2,0x90,0xB3,0x94,0x95,0x99,0x41,0x99,0x69,0xA9,0x9A, + 0xFD,0x3E,0x94,0xB0,0xD5,0x7F,0x1E,0x31,0x62,0x04,0xCD,0x9C,0xA9,0xDE,0x23,0x73, + 0x15,0xBB,0xBF,0x08,0x81,0xAE,0x07,0xFF,0xB9,0x57,0x56,0x88,0x71,0x31,0x61,0x74, + 0xC7,0x55,0x3D,0x1D,0x72,0x5B,0x57,0xFE,0xB0,0x5B,0xF8,0xFE,0x87,0xF5,0x74,0xE6, + 0x7C,0x37,0x6A,0x67,0xC1,0xF4,0x33,0xED,0x86,0x0A,0x15,0x31,0x31,0x31,0x94,0x90, + 0xA0,0x5C,0x3F,0x4A,0x7A,0xA3,0x30,0x22,0xBD,0x91,0x94,0xD7,0x34,0x53,0x45,0x8D, + 0x61,0xF2,0x01,0x6E,0x24,0x3B,0xF2,0x6A,0xA9,0xE1,0x9C,0x72,0xAA,0xE1,0x93,0xB7, + 0xF7,0xA3,0xF1,0x83,0x12,0x35,0x79,0x01,0x59,0x56,0xDC,0x1C,0x7B,0xD1,0x25,0xF4, + 0xF2,0xE3,0x4B,0x4C,0xE7,0x6A,0x4B,0xCC,0x38,0x28,0x55,0xDF,0xF7,0xBD,0xF1,0xCA, + 0x5F,0x8B,0xA2,0x54,0x33,0xE4,0x84,0xBE,0x3A,0x22,0xDA,0xC6,0x1B,0x88,0x3B,0x2B, + 0x7B,0xE6,0x1F,0x2F,0x14,0xAA,0xEA,0x1B,0xA8,0xAD,0xF9,0x1C,0x85,0xB6,0x9F,0xA7, + 0xB6,0xA0,0x10,0xD2,0x85,0x77,0xA1,0x6E,0x51,0x91,0x94,0x16,0xDF,0x8D,0xE2,0xE3, + 0xE3,0x35,0xF9,0x1D,0xA8,0x65,0xE9,0xD2,0xA5,0xC2,0x91,0x23,0x47,0x58,0xCB,0x1C, + 0xCC,0x91,0xF6,0xD6,0x02,0x75,0x76,0x7F,0xC9,0xFC,0x17,0x77,0x09,0x47,0x4B,0xAC, + 0x93,0x02,0x26,0x0D,0x4D,0xA2,0xC7,0x6F,0xBD,0xC0,0xE1,0x93,0x54,0xEA,0x67,0x78, + 0xCA,0x2D,0xC1,0xB0,0xD8,0x7F,0x7F,0x28,0x11,0x85,0x6D,0x09,0xA2,0xDD,0x6F,0x3C, + 0xA4,0xCD,0xAC,0x32,0x39,0x37,0xFA,0x83,0x45,0x5F,0x9B,0x22,0xCD,0xF6,0x2C,0xB3, + 0x9A,0xC8,0xB9,0x1C,0x18,0x0A,0x43,0x10,0xCC,0x32,0xE0,0xC6,0x51,0x06,0xD9,0x8B, + 0x6F,0xBE,0xF9,0xA6,0x6C,0xD2,0x93,0x37,0x57,0xCA,0xB0,0x39,0xCE,0xFC,0xDD,0xB6, + 0x0A,0xB7,0x0A,0x19,0xAB,0x33,0x2A,0x05,0x0C,0x6C,0xE5,0xBF,0xBA,0x02,0x86,0xA6, + 0xFE,0x76,0xF7,0x00,0xDD,0x7D,0xD7,0x59,0xCF,0xED,0xC5,0xDF,0x86,0x2E,0x04,0x6B, + 0x6A,0x0A,0xD4,0xFF,0xB2,0xCC,0x0C,0xFB,0xEF,0xAA,0x8E,0xFE,0x59,0x73,0x4B,0x47, + 0xB4,0xDB,0x9D,0xC0,0x1A,0x73,0x21,0x3B,0x06,0x8A,0x1A,0x8C,0x19,0x33,0x86,0xB5, + 0xCC,0xC1,0xA4,0x21,0x6F,0x4D,0xC6,0xB0,0x29,0x66,0x0C,0x41,0x59,0x02,0x6B,0xE6, + 0x8C,0x90,0x51,0x35,0x64,0xC7,0x8E,0x1D,0xAC,0x65,0x0E,0xEE,0x5E,0x9E,0x2E,0x8D, + 0x8B,0x61,0xA9,0x71,0x03,0xAD,0x5D,0xF8,0x2D,0xFB,0xAD,0x2D,0xB6,0x56,0xB0,0xAC, + 0xFD,0x85,0x7A,0xDA,0xB0,0xC8,0xD8,0xAE,0xB1,0x93,0xE3,0xCD,0xF1,0x2E,0x28,0xDD, + 0x0B,0xEF,0x52,0x0E,0x5B,0x85,0x28,0xDD,0x89,0xA2,0x98,0x61,0x95,0xE5,0x92,0x41, + 0xE4,0x2C,0x9C,0x1A,0x30,0x89,0x42,0x29,0xF7,0xDA,0xD6,0xBC,0x51,0x77,0x32,0x75, + 0xA4,0xF5,0x2C,0x22,0x2D,0x8F,0x97,0xC3,0x42,0xF6,0xCD,0xEA,0xCF,0x5A,0x06,0x90, + 0x1E,0xAA,0x26,0x53,0x2B,0x5C,0xC5,0x14,0x49,0x8E,0x7B,0x41,0xD1,0x7C,0x39,0x50, + 0x2D,0xE7,0xB3,0xCF,0x3E,0xF3,0xB8,0x75,0x56,0x14,0xF3,0x8A,0x8D,0xA5,0x6C,0xAB, + 0x03,0x44,0x80,0x2F,0xCC,0xEA,0xEA,0xB0,0x05,0x45,0xCA,0xA6,0xD2,0xB2,0x9A,0x70, + 0x4F,0xBC,0x55,0x68,0x00,0xC1,0x2E,0x04,0xCC,0xA4,0xD8,0x0A,0x90,0x69,0x81,0x27, + 0xE6,0xFF,0x9D,0x6D,0x19,0xC0,0xD4,0x49,0xA4,0x89,0xEE,0xC9,0x93,0xF7,0x72,0x8C, + 0xC4,0x77,0xF3,0xFC,0x8C,0x29,0x8E,0x39,0x98,0x9E,0x8B,0x84,0x11,0x39,0xF6,0xEF, + 0xDF,0x2F,0x0E,0x65,0xB1,0xA6,0x47,0x90,0x15,0xF3,0xC1,0x13,0xF5,0xB2,0x7D,0xE5, + 0x2B,0xC7,0xD8,0x9E,0x3F,0xAB,0x84,0xD2,0x0A,0x14,0x70,0x4B,0xAE,0xB8,0xE2,0x0A, + 0xAF,0xF6,0xCF,0x32,0x53,0xBA,0xB0,0xAD,0x0E,0x10,0xB1,0x67,0x9B,0x9A,0x03,0x01, + 0xAF,0x7B,0xE7,0x3C,0xCC,0x5A,0x06,0x20,0xE8,0xFF,0xFD,0xF8,0x99,0xFA,0x24,0x01, + 0x8E,0xD7,0x40,0xE6,0x97,0x52,0xB9,0xA1,0xD5,0xAB,0x57,0xB3,0x2D,0xCF,0x20,0x2B, + 0xE6,0x2D,0x07,0x6A,0xD8,0x56,0x07,0xE8,0x6F,0xF6,0xC9,0x88,0x76,0xF8,0xFA,0x41, + 0xE7,0x5F,0x29,0xE8,0x35,0x65,0xCA,0x14,0xB6,0xE5,0x3D,0x52,0xE2,0xAC,0x8B,0xCF, + 0x35,0x36,0x69,0xDB,0x3A,0x63,0x52,0x06,0xD2,0x41,0x2D,0xD1,0xEC,0x1D,0x28,0xC0, + 0xC1,0x9C,0x02,0x39,0x10,0x0C,0x43,0x0D,0x78,0xD6,0x74,0x3B,0xB2,0x62,0x5E,0xBF, + 0xAB,0x8A,0x6D,0x75,0x20,0xD7,0xDF,0x54,0x83,0xD2,0xE2,0x5C,0x19,0x19,0x19,0x9D, + 0x52,0x6C,0x00,0x29,0x9D,0xBE,0x08,0xF2,0xBA,0x91,0x95,0x85,0xC9,0x10,0x1C,0x6D, + 0x83,0xB9,0xF7,0x9D,0x11,0x0C,0xB3,0x12,0x33,0x26,0x52,0x18,0x13,0x2F,0x8C,0xA0, + 0x9F,0xE9,0x4C,0x72,0x85,0x2D,0xAB,0xAC,0x14,0x2C,0xF0,0x34,0x35,0x0E,0xCC,0xF0, + 0xD2,0x1A,0x48,0xAF,0x5C,0xF6,0xD2,0x77,0x62,0x02,0x89,0x3B,0x40,0x7E,0x37,0xA2, + 0xE3,0xC6,0x08,0x39,0xC7,0x7D,0xD8,0xB2,0xCE,0x9E,0x9A,0x26,0x69,0x25,0xE6,0xF5, + 0xBB,0xAC,0x87,0x3C,0xC6,0x0D,0x72,0x6E,0x55,0x3F,0x25,0xAB,0x8C,0x20,0x41,0x67, + 0x55,0xD7,0x6C,0xF5,0xD1,0x49,0x22,0x46,0x30,0x9B,0x09,0x99,0x60,0x53,0x2C,0xD6, + 0x9F,0xB2,0x24,0x2C,0x54,0xB9,0x76,0x16,0xC4,0x8B,0x32,0x46,0x98,0xA8,0x81,0xC4, + 0x13,0x3C,0x50,0x60,0x10,0xD3,0x2F,0xD5,0x54,0x09,0xE5,0xD8,0x07,0x45,0x0A,0x94, + 0xAC,0xB3,0xAD,0xA5,0x64,0x5D,0xC1,0x4A,0xCC,0xC7,0x4A,0xCF,0xB2,0xAD,0x0E,0x30, + 0x7D,0xD0,0x51,0xD0,0x37,0x50,0xB2,0xCA,0x4A,0xF5,0x94,0xBC,0x81,0x65,0x9F,0x19, + 0x5E,0x47,0x67,0xCD,0x79,0x76,0x85,0x2C,0x3B,0xAB,0x55,0x28,0x15,0xF3,0xC3,0xD4, + 0x4C,0x88,0xD7,0xB2,0x8C,0x11,0x82,0x6A,0x98,0x47,0x0D,0x81,0x43,0xD4,0xCE,0x16, + 0x2A,0xE0,0x74,0xA0,0x64,0x9D,0x51,0xD5,0x13,0x79,0x17,0xAC,0xE9,0x36,0xAC,0xC4, + 0xBC,0xF7,0xA8,0x75,0xA1,0x80,0x21,0xBD,0xBB,0xB1,0x2D,0xF5,0x28,0xF5,0x0D,0x90, + 0x20,0xD2,0x99,0x15,0x36,0x6F,0xB8,0x34,0x5D,0xCC,0x29,0x37,0x72,0xCB,0xB4,0x4C, + 0xB6,0xE5,0xDB,0xA8,0xF9,0x40,0x91,0xEF,0x2D,0x9D,0x63,0x2D,0x07,0xE6,0x51,0x43, + 0xD4,0xB7,0x2D,0x9C,0x29,0x96,0x25,0x92,0x3E,0x60,0xBD,0xA5,0xCB,0xC9,0x72,0x6C, + 0x63,0xCB,0x3A,0x7B,0xA2,0xEF,0x6C,0x26,0x66,0x0C,0xD1,0x58,0x8E,0xBB,0x22,0x60, + 0x94,0x9A,0x10,0xE1,0x90,0xF8,0x60,0x95,0x95,0x6A,0x5F,0x7B,0x2A,0x6D,0x53,0x2D, + 0x3D,0x52,0x22,0x75,0xFF,0x7D,0x7A,0x94,0xEE,0x85,0x7B,0x07,0xD2,0xEB,0xBF,0xBF, + 0x88,0x6E,0x9A,0xE2,0x9D,0x24,0x78,0x77,0x53,0x73,0xDA,0x3C,0x48,0x69,0x4F,0x61, + 0xB0,0xC8,0xD2,0x89,0x1B,0x46,0x90,0x32,0xAA,0xB6,0x24,0x2F,0xAC,0x37,0xAA,0x96, + 0x70,0xD4,0xA3,0xE4,0x85,0x7A,0xC2,0x3A,0x9B,0x89,0x59,0xCE,0x2A,0x0F,0xF6,0x23, + 0xAB,0x2C,0x05,0xAE,0xB5,0x33,0x43,0x6D,0x5A,0xA1,0x59,0x52,0x89,0xC4,0x1E,0x98, + 0xB4,0xB1,0xC8,0x62,0x5D,0x2A,0xCC,0x6F,0x5E,0xFC,0xD8,0x7B,0x84,0x45,0xDD,0xBF, + 0x7D,0x7B,0xAB,0x0E,0xB3,0xA4,0xD4,0x88,0xBA,0xBB,0x17,0x56,0xC9,0xF0,0x27,0x90, + 0xE6,0xA9,0x34,0xEE,0xEC,0x6E,0xEB,0x6C,0x26,0xE6,0x8A,0x5A,0xEB,0x0B,0xA4,0x57, + 0x77,0xC7,0x4A,0xC0,0x68,0xD9,0x2A,0x07,0x2A,0x8F,0xBE,0x78,0xAF,0x59,0x19,0x22, + 0x08,0xF9,0xF5,0x27,0x3F,0xA2,0x71,0x43,0x27,0x9A,0x6E,0x66,0x98,0x60,0x01,0x51, + 0x63,0xDE,0x34,0x16,0x77,0x97,0x1B,0x02,0xC3,0x74,0xCA,0x27,0xF4,0xCF,0x73,0x1C, + 0x03,0xF3,0x9A,0xE5,0x80,0x75,0x76,0x27,0x66,0x62,0x2E,0x3E,0x65,0x5D,0xCC,0x1C, + 0x13,0x2B,0x1C,0x41,0xA9,0xD2,0xA6,0x96,0xAC,0xB2,0x16,0x41,0x14,0xD9,0x38,0x4C, + 0xE4,0x8E,0xE0,0x53,0x34,0x13,0x23,0xAA,0x88,0x58,0x16,0xF3,0x5B,0x78,0xD7,0x33, + 0xA6,0xB2,0x41,0x96,0xA0,0x00,0xC2,0xB3,0x0F,0xBE,0xA2,0x5B,0xB7,0x64,0x97,0xEE, + 0xE7,0x4F,0x8F,0x9A,0x3D,0x50,0xAC,0xC0,0x1B,0xEB,0x3D,0xFB,0x1B,0xC8,0x72,0x54, + 0xB2,0xCE,0x28,0x6E,0xC0,0x36,0x5D,0xC6,0x4C,0xCC,0x72,0x29,0x9C,0x99,0xC9,0x8E, + 0x59,0x66,0xA5,0x49,0xDA,0xDC,0x2A,0x1B,0x40,0x49,0x20,0x08,0x16,0xC1,0xA8,0x67, + 0x5E,0x7F,0x54,0xB8,0xF3,0x8F,0xD7,0x89,0xC1,0x25,0xAC,0x35,0x65,0x1C,0x26,0x32, + 0x06,0x9F,0x50,0x3C,0x5F,0x69,0x65,0x0B,0xCB,0x12,0xBE,0x96,0xC0,0xB2,0xE2,0x77, + 0x59,0x96,0x03,0xBA,0xE9,0xCA,0xDB,0xCD,0x2A,0x96,0x70,0xBC,0x83,0x92,0x75,0xB6, + 0xB5,0x1C,0x93,0xA3,0x98,0x89,0xD9,0x72,0x96,0x14,0x86,0x6D,0x10,0x30,0x62,0x4D, + 0xBB,0x6C,0xDF,0xBE,0x5D,0x90,0x9B,0x19,0x85,0x88,0x5E,0xA0,0x5B,0x65,0x58,0x5E, + 0x2C,0x0C,0x87,0xDA,0x5E,0x10,0x2C,0x82,0x51,0x98,0xD2,0xB8,0xBF,0x40,0xF9,0xCB, + 0x44,0xE5,0x4C,0x44,0x9F,0x51,0x42,0xC8,0x32,0x8A,0xDC,0x62,0x67,0x3E,0x73,0x78, + 0x58,0x04,0xFD,0xFD,0xDD,0x3F,0xB1,0x96,0x01,0x14,0xF3,0x5B,0x30,0xF7,0x09,0x2E, + 0xE4,0x4E,0x40,0x69,0x0E,0x02,0x56,0xC3,0x70,0xD7,0x04,0x0C,0x93,0x98,0xE5,0x26, + 0x1B,0xC8,0x4D,0x4A,0xB0,0x85,0xD2,0x5D,0x66,0xE0,0xC0,0x81,0x6C,0x2B,0x70,0xD9, + 0xBA,0xFB,0x27,0xD9,0x02,0xF4,0x6A,0x80,0x15,0x5E,0xF0,0xDC,0x1D,0xB4,0xE8,0x9D, + 0x3F,0x99,0xBE,0xA3,0xEA,0x3A,0xEB,0x94,0x5B,0x29,0xEB,0x7F,0x5E,0x6D,0x55,0x46, + 0x17,0xFD,0x61,0x4E,0xE7,0xA1,0xB4,0xBC,0x0D,0x66,0x54,0xB9,0x03,0x93,0x98,0x2B, + 0x6A,0xAD,0x17,0xEE,0x76,0xC4,0xC5,0x46,0xE9,0x14,0xA5,0x69,0x8E,0x5A,0x14,0xF3, + 0xD6,0xED,0xBB,0x04,0x4F,0x0C,0xDC,0x2B,0x61,0xEC,0xC3,0x2A,0x81,0x52,0x3D,0x28, + 0x71,0x8B,0x07,0xB6,0xE5,0xF8,0x72,0xED,0xC7,0x62,0x42,0x07,0xB6,0x1B,0xCE,0x5A, + 0xAF,0x22,0x29,0xE5,0xBF,0xAB,0x3E,0x60,0x5B,0x06,0xE0,0x5E,0x2B,0xF5,0x93,0x39, + 0xDE,0x41,0x69,0x98,0xCA,0x5D,0x62,0x36,0x7D,0xB9,0x5F,0x6E,0x28,0x11,0xDE,0xFC, + 0xEA,0x38,0x6B,0x19,0xB8,0xE6,0x92,0xEE,0x34,0x7F,0x56,0x2F,0x55,0x17,0x80,0x52, + 0x95,0x42,0x2D,0xAE,0x15,0x55,0x55,0x55,0x25,0x1C,0xCE,0x3F,0x42,0x09,0x89,0x49, + 0xD4,0xAF,0x6F,0x6F,0xAF,0x9D,0xDB,0x17,0x6B,0x3E,0x12,0xD6,0x6D,0xF9,0x46,0xDC, + 0xEE,0xDB,0xF3,0x42,0x8A,0x8E,0x8C,0x11,0xC5,0x3B,0x7C,0xC0,0x18,0xAB,0x73,0x40, + 0xDE,0xF4,0xBB,0x9F,0xBF,0x2A,0xBA,0xE2,0x96,0xC0,0xC2,0xDA,0x4B,0xFE,0x90,0x82, + 0x21,0x27,0x44,0xAA,0x59,0x93,0xD3,0x89,0xFC,0xE5,0x2F,0x7F,0x91,0xED,0x8A,0x62, + 0xD9,0x1B,0xAC,0x07,0xCD,0x9A,0x4E,0x61,0xB2,0xCC,0xB5,0x0D,0xAD,0x6C,0xAB,0x83, + 0x94,0x38,0xF5,0xD5,0x2A,0x94,0x5C,0xEC,0xCE,0x4C,0xDD,0x54,0xA2,0xB8,0xB4,0x92, + 0x76,0xE9,0xBB,0x29,0x0D,0x8D,0x9E,0x59,0x8A,0x54,0x09,0x4C,0x94,0x40,0x71,0x79, + 0x3C,0xD0,0x77,0xC5,0x4C,0x28,0x39,0x21,0x03,0x54,0xD4,0x44,0x41,0x3E,0x0C,0x21, + 0x59,0x8E,0xFF,0x3E,0xFF,0x8E,0x79,0x5F,0xD8,0x1E,0x18,0x43,0xE6,0x68,0x03,0x5B, + 0xC5,0x0B,0x5C,0xA5,0xC3,0xCD,0xAE,0xB1,0x0E,0xA8,0xC4,0xC5,0x84,0xB2,0x2D,0xDB, + 0xA0,0x03,0x8F,0x8E,0xBC,0x1C,0x17,0x5F,0x7C,0xB1,0xE6,0x2C,0xC2,0xB9,0xB3,0x67, + 0x68,0xED,0xBE,0x76,0x6A,0x69,0xB6,0xCE,0x43,0xD7,0x1A,0x10,0x3B,0x96,0xA7,0xC1, + 0xD8,0xB0,0x91,0xD6,0xF3,0xEA,0x67,0x7E,0xC1,0xF2,0x3B,0xB2,0x9A,0x06,0xC7,0xB3, + 0x28,0x19,0x37,0xA5,0x51,0x20,0x47,0xE8,0xB0,0xCC,0x32,0x53,0x03,0x53,0xE2,0xAD, + 0x27,0xF2,0xCB,0xA1,0x74,0x57,0xB1,0x5C,0xF4,0x4D,0x2B,0x54,0x37,0xE8,0xE8,0x5C, + 0x8B,0x40,0x7B,0x0A,0x89,0x4E,0x96,0x94,0x7A,0xAD,0xDF,0xEC,0x2C,0xE8,0xEB,0xCA, + 0x59,0x57,0x7B,0x27,0x8E,0x1B,0xC0,0x83,0xB7,0x3D,0xC1,0x5A,0x1C,0x2D,0x90,0x93, + 0x93,0x23,0x9B,0xAF,0x0D,0xD7,0x1B,0xA3,0x41,0xAC,0xE9,0x14,0x26,0x31,0xA3,0x80, + 0xBC,0x25,0xF1,0x92,0x09,0x09,0xB6,0x50,0x12,0xB3,0x16,0x03,0x5F,0x79,0xF9,0x47, + 0x85,0x2D,0x87,0x0D,0x37,0xAE,0xB5,0x7B,0x5A,0xA9,0xB0,0xC8,0xBA,0xD6,0x99,0x16, + 0x81,0x8B,0x8E,0x0C,0x2C,0x29,0x52,0x73,0x2B,0x67,0x7A,0xAF,0x9D,0x7A,0xB3,0x53, + 0x2B,0x3A,0x72,0x3C,0x8B,0x92,0x2E,0x5C,0x1D,0x73,0xEE,0xB0,0xCC,0xF5,0xD6,0x96, + 0x59,0xCD,0x04,0x0B,0xB8,0xD8,0xA8,0x3E,0x68,0x09,0x32,0x5E,0x3A,0xA3,0x92,0x88, + 0x3D,0xAA,0xAB,0x6B,0x29,0xAF,0xC4,0xB0,0xDD,0xD0,0x24,0xD0,0xDE,0xA2,0x76,0x9F, + 0xB0,0xCE,0x60,0xD6,0x94,0x39,0x6C,0xCB,0x1A,0xCB,0x3F,0x80,0x8F,0x29,0x6B,0x17, + 0x25,0x57,0x5B,0x69,0x34,0x48,0x2D,0x26,0x31,0x5B,0x2E,0x3F,0xA3,0xB6,0xBC,0x8E, + 0xD2,0xB2,0x96,0x5A,0xB4,0xCA,0x10,0x2D,0xC4,0x0B,0x11,0x1B,0xF1,0x25,0xEB,0x8C, + 0x5C,0x6A,0x35,0x93,0x21,0xBA,0x44,0x44,0xD2,0xCB,0x8F,0xFD,0x9B,0xB5,0x38,0x5A, + 0x03,0x85,0x39,0x30,0xCA,0x23,0x87,0x2B,0x35,0xC2,0x44,0x31,0x97,0x57,0x4B,0xAE, + 0x6E,0x86,0xDA,0xE0,0x97,0x92,0x98,0x95,0x06,0xC8,0x3B,0x13,0x88,0x16,0xE2,0x95, + 0xE2,0x6B,0xD6,0x59,0x2F,0x68,0xB6,0x65,0x8E,0xD4,0x04,0xFF,0xEB,0xCF,0x1F,0xAA, + 0x5A,0x5F,0x8A,0xD3,0x79,0x28,0xC5,0x93,0x94,0xF4,0xA4,0x06,0x51,0xCC,0x72,0x75, + 0xB1,0xE2,0xBB,0xAA,0xEB,0x2F,0x2B,0xB9,0x06,0x5A,0x73,0xB1,0xF3,0x8F,0x1C,0x17, + 0x72,0xF3,0xCE,0x9B,0x59,0x65,0x23,0xBE,0x64,0x9D,0xA3,0x23,0xE5,0x93,0x4F,0x8C, + 0x7F,0x15,0x2C,0xF7,0x80,0x3E,0x43,0xB8,0x90,0x35,0x8E,0x92,0xB1,0x73,0x59,0xCC, + 0x72,0x91,0x6C,0x69,0x35,0x0E,0x25,0xD0,0x5F,0x96,0x1B,0x00,0x8F,0x8D,0x75,0xBC, + 0xCC,0x90,0xA7,0x29,0xAF,0xA8,0xA2,0x0D,0x07,0xE4,0x4B,0xEA,0xFA,0x92,0x75,0xAE, + 0x6F,0xB0,0x9E,0x73,0x2E,0xC5,0x72,0x7D,0x2A,0x8E,0x36,0x51,0x9A,0xAB,0xA0,0x34, + 0x7D,0x58,0x0D,0xA2,0x98,0x1B,0xCE,0xB5,0x89,0x0D,0x29,0x6A,0xDC,0x6C,0x5F,0x71, + 0xB1,0xF3,0x0B,0x8E,0x09,0x10,0xB2,0xAD,0x5A,0x7E,0xBE,0x62,0x9D,0xCB,0xAB,0x58, + 0xF4,0xCE,0x88,0xC5,0x25,0x31,0xF4,0xC2,0x51,0x6C,0x8B,0xA3,0x75,0x30,0x2D,0x58, + 0x0E,0x67,0xFB,0xCD,0xA2,0x98,0x2D,0x4B,0xEB,0x82,0xA8,0x88,0x60,0xB6,0xA5,0x8C, + 0xAF,0x88,0xB9,0xB2,0xAA,0x86,0x76,0x9D,0xB0,0x5D,0x95,0x13,0xD6,0xF9,0x54,0xBD, + 0xF6,0xBB,0xCD,0x79,0xC7,0x2D,0x86,0x01,0x2D,0x4E,0xB9,0x6F,0xD6,0x85,0x6C,0x8B, + 0xA3,0x75,0xDC,0xED,0x6A,0x8B,0x62,0x96,0x43,0x4D,0x34,0xDB,0x17,0xFA,0xCB,0x58, + 0xC1,0xBF,0xB4,0x56,0x90,0xED,0x2B,0x5B,0xB2,0xF5,0x70,0x0B,0xED,0x3F,0x98,0xAF, + 0x59,0x45,0x23,0x5F,0xBB,0xF1,0xAC,0x7C,0xC5,0x53,0x23,0x4A,0xE9,0xA1,0x1C,0xED, + 0xE1,0x11,0x31,0xD7,0xC9,0xE4,0x65,0x47,0xD9,0x11,0xB3,0xAF,0xF4,0x97,0x6B,0x6A, + 0x4F,0xD3,0xFE,0x22,0xEB,0xBF,0x4F,0x8E,0x72,0x7D,0x77,0xB4,0xA1,0xD1,0xBA,0x40, + 0x83,0x56,0xB0,0x9C,0xD2,0x28,0x22,0x91,0xAE,0xE5,0x8A,0x91,0x1C,0x6D,0xE3,0xEE, + 0x7E,0xB3,0x28,0xE6,0x96,0x56,0x6B,0x63,0x14,0x16,0x62,0xFB,0x06,0xEF,0x2B,0x2E, + 0x76,0x4D,0xDD,0x19,0x2A,0xD3,0x5B,0x66,0x35,0x54,0x9E,0x16,0x48,0x68,0xB3,0x0E, + 0x06,0x6A,0x85,0x03,0x47,0xF6,0xB0,0x2D,0x09,0x92,0x3F,0x6D,0x60,0xCE,0x50,0xB6, + 0xC5,0xF1,0x15,0xDC,0xD9,0x6F,0x66,0x01,0x30,0x6B,0x0B,0x6B,0x6F,0x68,0xCA,0x57, + 0xC4,0xDC,0xD6,0x7A,0x8E,0x4E,0x56,0xAB,0xFB,0x5C,0x10,0x20,0x6B,0x39,0xAF,0x5D, + 0x2F,0xB5,0xE0,0xC4,0x41,0xB6,0x25,0x4F,0x9F,0x9E,0xF2,0x33,0x72,0x38,0xDA,0xC5, + 0x9D,0xAE,0xB6,0x28,0x66,0x67,0x56,0x41,0x54,0x72,0x05,0xB4,0x36,0xBE,0xAC,0xD3, + 0x9B,0x2E,0x1F,0x5F,0x91,0xC6,0x84,0xAD,0x12,0x43,0x80,0x5B,0x66,0xDF,0x43,0x49, + 0xCC,0x55,0x55,0xB6,0x2B,0xC9,0xC8,0xA1,0x18,0x00,0x93,0x5B,0xFA,0x54,0x8A,0x52, + 0x3E,0x36,0xC7,0x33,0xA0,0xF6,0x35,0x8A,0xD0,0x2B,0x81,0x19,0x52,0x7C,0x52,0x85, + 0xEF,0xA1,0x94,0xD6,0xE9,0x4C,0xBF,0x59,0x14,0xB3,0xDC,0x8C,0x29,0x5B,0x28,0xAD, + 0x62,0xA7,0x74,0x62,0x9D,0x89,0xA0,0xB7,0xCD,0x21,0x8A,0xB7,0x2C,0x6B,0x42,0xEC, + 0x8F,0xC8,0x75,0x0A,0xF9,0x85,0x32,0xC1,0x2F,0x09,0x59,0xE9,0xB6,0xD7,0x9E,0xE2, + 0x68,0x93,0xA4,0xA4,0x24,0xD9,0x1B,0xB0,0xD2,0x3A,0x6D,0xB6,0x70,0xE0,0x32,0xEF, + 0x40,0xE9,0xAE,0xA1,0x45,0x31,0x07,0x87,0x76,0xA1,0x8C,0x04,0x75,0x06,0x2B,0x36, + 0x4A,0xEF,0x96,0xEB,0x9C,0xFA,0x48,0x3C,0xCE,0x81,0x02,0x99,0xE0,0x97,0x04,0xEE, + 0x62,0xFB,0x2E,0x4A,0xBA,0x71,0xB4,0x46,0x9D,0xE2,0x95,0x6B,0x6B,0xFA,0xA3,0x52, + 0x55,0x11,0x2D,0x8A,0x39,0x39,0x31,0x96,0xFA,0xA4,0xAA,0x13,0x68,0x5A,0x6C,0x10, + 0x75,0x89,0x74,0xAC,0xE8,0xBF,0xB7,0xB0,0x57,0x27,0x9B,0x07,0xBF,0x7C,0x17,0x25, + 0xDD,0x38,0xDA,0x6F,0x16,0xAF,0xF2,0x96,0x56,0xC7,0x22,0x44,0x4A,0xBF,0x44,0x8B, + 0x62,0xCE,0xEA,0xD9,0x43,0x37,0xB4,0x97,0xBA,0xBE,0xFC,0x80,0x1E,0xC1,0x94,0x96, + 0x1C,0xC7,0x5A,0xDA,0xC2,0x9E,0x98,0x79,0xE6,0x97,0xEF,0xA2,0xA4,0x1B,0x47,0xFB, + 0xCD,0xA2,0x98,0xE5,0x26,0x5A,0xD8,0xC2,0x97,0xC4,0x0C,0x12,0xE3,0xA2,0xA9,0x7F, + 0xBA,0x6D,0xEB,0x1C,0xAD,0x77,0x44,0x06,0x64,0x04,0x63,0xDC,0x4F,0x93,0x41,0xA4, + 0xB2,0x4A,0x8B,0x9C,0x6C,0x0B,0xD2,0xF8,0x82,0x6E,0x3E,0x8B,0x52,0xA2,0x95,0x92, + 0x07,0xAC,0x84,0xEC,0x15,0x6E,0x2F,0x95,0x53,0x49,0xCC,0x98,0x74,0xCD,0x36,0x35, + 0xC5,0xD0,0xC1,0xFD,0x75,0x33,0x47,0x86,0x89,0x7D,0x62,0x25,0xA6,0x0F,0x0D,0xA1, + 0x9E,0x3D,0xBA,0xB3,0x96,0xF6,0xB0,0x15,0xC9,0xC6,0x52,0x34,0x7C,0x0D,0x28,0xDF, + 0x45,0x29,0x71,0xC4,0x29,0x37,0xDB,0x12,0x5B,0xA9,0x9C,0x28,0x76,0xCF,0x36,0xCD, + 0x50,0x5A,0x54,0x5A,0x2B,0x4C,0xB9,0x64,0x84,0x6E,0xFE,0xE5,0x91,0x34,0xA2,0xB7, + 0xCE,0x4C,0xD4,0x89,0x31,0x44,0xF7,0x4C,0x8D,0xA0,0x8B,0x07,0x27,0x51,0x46,0x7A, + 0x77,0x4D,0x0A,0x02,0x39,0xD9,0x6C,0x53,0x96,0x9E,0xDD,0x79,0x24,0xDB,0x97,0xC9, + 0xCC,0x94,0x2F,0x24,0xE1,0xA8,0x98,0xC5,0x37,0x99,0xF6,0xFB,0x5C,0xB3,0x8B,0x05, + 0x55,0x39,0x97,0x3E,0x31,0x42,0xF6,0x17,0x20,0xCD,0x6C,0xD9,0xB2,0x65,0xAC,0xD5, + 0x01,0x2A,0x27,0xDC,0x7A,0xEB,0xAD,0x9A,0xB7,0x0E,0x28,0xE8,0x57,0x53,0x53,0xAB, + 0xBF,0x8B,0x19,0x12,0x65,0x04,0x5D,0x18,0xF5,0xEE,0xD5,0x93,0x92,0x93,0x54,0x86, + 0xBC,0x3B,0x01,0xAC,0x0A,0x89,0xC5,0xE4,0x94,0x40,0x39,0x5D,0xD4,0xE2,0x66,0x4D, + 0x55,0x94,0x95,0x1D,0x13,0x0A,0x0B,0x4F,0xB1,0x96,0xF3,0x84,0x84,0xB4,0xD3,0x88, + 0x11,0xE3,0x34,0xFF,0xBD,0x6B,0x9D,0xE7,0x9E,0x7B,0x4E,0xB6,0x96,0xDE,0xD3,0x4F, + 0x3F,0xAD,0xFA,0xB3,0xD5,0xA1,0x64,0xD0,0x6D,0x7F,0xDD,0xC1,0x9A,0x06,0x6C,0x89, + 0x79,0xE3,0xC6,0x8D,0xC2,0xBA,0x75,0xEB,0x58,0xAB,0x03,0xAC,0x72,0x37,0x73,0x26, + 0xAF,0xCF,0xEC,0x09,0xB0,0x6A,0x24,0x16,0x9B,0x53,0xC2,0x19,0x31,0x1F,0x3D,0xBA, + 0x47,0x88,0x89,0x79,0x9C,0x92,0x92,0x0C,0x2B,0x6C,0x38,0xCB,0xA1,0x43,0x1F,0xD3, + 0x85,0x17,0xDE,0xCC,0xBF,0x77,0x17,0x59,0xB2,0x64,0x89,0x20,0x97,0xC2,0x39,0x77, + 0xEE,0x5C,0xCA,0xCE,0xCE,0x56,0xF5,0xF9,0xDA,0x8E,0x0A,0xC9,0x20,0x37,0x53,0x0A, + 0x38,0xE2,0x66,0x63,0x5A,0xE2,0x9E,0xC3,0x47,0x84,0xCD,0x7B,0x0E,0x98,0x3D,0x0E, + 0x1C,0x39,0xAE,0xB7,0x9A,0x35,0x0E,0x8D,0xAD,0x71,0x0C,0xEB,0x54,0x71,0x3A,0x87, + 0x53,0xA7,0x4E,0x09,0xBF,0x1C,0xCA,0xB7,0xBA,0x96,0x8F,0x15,0x16,0x39,0x74,0x1D, + 0x2B,0x05,0xC1,0xE4,0xAC,0xB5,0x12,0x6E,0x13,0xB3,0x9A,0xA9,0x8F,0x05,0x85,0xC5, + 0xC2,0x4F,0xDB,0x76,0x08,0x9F,0xE5,0x95,0xD3,0xE3,0x27,0x42,0xE9,0x77,0x25,0x71, + 0x66,0x8F,0x27,0x8E,0x12,0xE1,0xB9,0x4D,0xFA,0x63,0x8A,0x4B,0xBD,0xB7,0xA8,0x9B, + 0xD6,0x69,0xB6,0xB3,0x7C,0x2B,0xC7,0xFB,0x1C,0x3C,0x56,0x28,0x6C,0xFC,0x79,0xBB, + 0xB0,0xE4,0x70,0x0D,0xFD,0xA1,0x30,0xC2,0xEA,0x5A,0x7E,0x2A,0xBF,0x95,0x3E,0xDF, + 0xBA,0x57,0xD8,0xB8,0x7D,0xA7,0xA0,0xEF,0xFB,0x3A,0x7D,0x2D,0xBB,0x2C,0xE6,0x78, + 0x1B,0x25,0x83,0x9C,0x49,0x33,0x03,0x1B,0xF4,0x7F,0xD4,0x2B,0x47,0x9B,0xE9,0xAA, + 0xF2,0x5E,0x74,0xCF,0xA9,0xEE,0xF4,0xCD,0xB9,0x6E,0xB4,0xB3,0x25,0xD2,0xEC,0xB1, + 0xFC,0x5C,0x9C,0xF8,0xDC,0x74,0xFD,0x31,0x6F,0x1D,0x69,0xA0,0x0D,0xBF,0xEC,0xE5, + 0x82,0xD6,0x13,0x1E,0xA6,0x7E,0xCD,0x2F,0x8E,0x67,0xA9,0xA8,0xAE,0x11,0xD6,0x6D, + 0xDF,0x2D,0xFC,0xED,0x58,0x3B,0x5D,0x5C,0x96,0x43,0x0B,0xAB,0x53,0x69,0x6D,0x53, + 0x57,0xAB,0x6B,0xF9,0x83,0xC6,0x04,0x9A,0x5D,0xDE,0x83,0x6E,0x28,0xCF,0xA4,0x8F, + 0xF2,0x2A,0x29,0x77,0xD7,0x3E,0x9B,0xD7,0xB2,0x3B,0x02,0xC8,0xB2,0x62,0x0E,0x0B, + 0x75,0xD8,0x60,0x53,0x44,0x84,0xFC,0xC4,0x8C,0x13,0x65,0x15,0xC2,0xA7,0x5B,0xF7, + 0x09,0xD7,0x96,0xF5,0xA0,0xD7,0xEA,0x13,0xE9,0x4C,0xBB,0xFD,0xF7,0xC6,0x31,0xCF, + 0xD6,0x24,0xD1,0x6D,0xA5,0x29,0xF4,0xF5,0xB6,0xBD,0x42,0x45,0x8D,0xCA,0x09,0xC9, + 0x01,0x4A,0x4D,0x5D,0x25,0xDB,0xE2,0x78,0x92,0xBC,0xC2,0x93,0xC2,0xD7,0xF9,0x15, + 0x74,0x8D,0xFE,0x5A,0xFE,0xB0,0x41,0x5D,0x72,0x51,0x59,0x5B,0x28,0x3D,0x50,0x95, + 0x46,0xF3,0x4A,0x13,0x69,0xED,0xF6,0x3D,0x8A,0xD7,0xB1,0xD2,0x24,0x25,0x47,0xC6, + 0x9A,0x1D,0x56,0xAD,0x92,0x65,0x96,0x13,0xB3,0x78,0x17,0x3B,0x51,0x43,0xB7,0x94, + 0xA7,0x53,0x75,0xBB,0xE3,0x33,0xAA,0x0A,0xDB,0xC2,0xE9,0xE6,0xF2,0x0C,0xDA,0x90, + 0xEF,0x5A,0xA5,0x7F,0x7F,0xA7,0xB9,0x95,0xBB,0xE1,0x9E,0xE6,0xD8,0xC9,0x52,0xE1, + 0xF3,0xA2,0xB3,0x74,0x57,0x45,0x9A,0x2A,0x83,0x64,0xC9,0xFE,0xD6,0x2E,0x74,0x53, + 0x59,0x3A,0xAD,0x56,0x10,0xB4,0x3B,0x66,0x1C,0x3A,0x7C,0x56,0x4A,0x7D,0x66,0xB9, + 0x93,0xD9,0x7C,0xE4,0x24,0xDD,0x5B,0x91,0x42,0x2D,0x8E,0xFF,0x1A,0x13,0xF8,0xE0, + 0xEE,0x3C,0xA5,0xFC,0x21,0x70,0x88,0x5A,0xDC,0xD8,0xA7,0x2E,0x2F,0xBF,0x5D,0x8C, + 0x50,0x5B,0x3E,0x0E,0x1F,0x7E,0x8F,0x5A,0x5B,0x13,0xD8,0x51,0x81,0x05,0x8C,0xD2, + 0x0F,0xC5,0xA7,0xE9,0x89,0xEA,0x64,0xB6,0xC7,0x39,0x60,0xD0,0xEE,0x29,0x4F,0x95, + 0xED,0x3E,0x2A,0xB9,0xD9,0x0E,0xF5,0x99,0x2B,0x6A,0xD5,0x1F,0x0C,0x94,0xC4,0x6C, + 0x39,0xF0,0x9D,0xBB,0x73,0xAF,0xB0,0xB0,0xCA,0x35,0x21,0x1B,0x81,0xA0,0x9F,0xAB, + 0x4E,0xA0,0xED,0x07,0x0E,0x07,0xA4,0xA0,0x13,0xBA,0xD9,0x4E,0x93,0x2D,0x2C,0x3D, + 0xC6,0xB6,0x5C,0xA7,0xB6,0x76,0x2A,0xC5,0xC5,0x4D,0x16,0x87,0x9B,0xA4,0x8F,0xD6, + 0xD6,0xFE,0x74,0xEE,0x5C,0x4F,0x76,0x54,0x60,0x91,0x77,0xEC,0x04,0x2D,0xAC,0xB4, + 0xBF,0x2C,0x90,0x1A,0xE0,0x6D,0xBE,0x53,0x1B,0x23,0x06,0xD0,0xD8,0x2E,0x9B,0x78, + 0x34,0x9A,0xAD,0x26,0x00,0x86,0xE1,0xA5,0x03,0x4D,0x21,0x94,0xDF,0x6A,0x3F,0x70, + 0x73,0xF7,0xC8,0x6E,0x44,0xB3,0x62,0x75,0x77,0xB3,0xB6,0x12,0x1B,0x9A,0xA2,0xA9, + 0xAC,0xC1,0xB1,0x1B,0x8F,0xBF,0x90,0x95,0xD1,0xC7,0xE6,0x38,0xA3,0xAD,0x54,0x4F, + 0x67,0x90,0x4B,0xCB,0x0D,0x0E,0x0E,0x4C,0xC7,0x08,0xA3,0x2A,0x6B,0xCF,0xC5,0xD8, + 0xEE,0x26,0xC6,0x84,0x53,0xC1,0xD5,0x86,0xEB,0xD8,0xF4,0xB0,0xC1,0xA7,0x0D,0xDD, + 0xA8,0xAC,0xB2,0x9A,0xB5,0x0C,0xB8,0xA3,0x10,0xA6,0xEB,0x66,0x53,0x86,0xBC,0xE2, + 0x32,0x7A,0xAB,0xCE,0xDE,0xC9,0x85,0xD2,0x37,0xFA,0x0F,0xE0,0xED,0x74,0x9D,0xAA, + 0x01,0x71,0x80,0xF7,0xC4,0xF8,0x34,0x6B,0x06,0x14,0xF6,0xC6,0x92,0xF7,0xE5,0xEF, + 0x0A,0x4C,0xB5,0x79,0x98,0x13,0x25,0x65,0xF4,0xEF,0xD3,0xB6,0xAE,0x65,0xFD,0x75, + 0x7C,0x69,0x30,0xBD,0xF0,0xD5,0x69,0xA2,0x15,0x75,0x02,0x7D,0x7F,0x4E,0x28,0x10, + 0x04,0xA1,0xA0,0x9F,0xB2,0xB4,0xE0,0xAD,0x7E,0xD6,0xD0,0x95,0x8E,0x17,0xD9,0x4E, + 0xD3,0x05,0x9D,0x12,0x00,0x93,0xD2,0xD2,0x74,0x8E,0xF6,0xB7,0xD8,0x2E,0x3B,0x74, + 0xF7,0xC8,0x48,0xBA,0x4A,0xA7,0xD3,0x8D,0xDD,0xDE,0xA2,0xFA,0x22,0xDC,0xDA,0x1C, + 0x45,0xF5,0xA7,0x1D,0x9B,0x49,0xE2,0x2F,0xD8,0xAB,0x24,0x62,0x6F,0x8A,0x24,0xC7, + 0x39,0x1A,0xF4,0x5D,0x3C,0x44,0xA4,0x95,0x69,0xA5,0xAB,0xBE,0x3A,0x4B,0x6F,0xB3, + 0x16,0x9D,0x69,0xA6,0x17,0x4A,0x89,0x72,0xFA,0x75,0xB5,0x69,0xA4,0x72,0x9B,0xA2, + 0xA8,0xA4,0xBA,0xE3,0x5A,0x56,0x1A,0x0D,0x72,0x04,0xDD,0x9E,0x23,0x75,0xC2,0x23, + 0xAF,0x9B,0xAF,0x92,0x30,0xA4,0x4F,0x37,0x7A,0xE1,0xDE,0x41,0xB2,0x27,0xF3,0xE4, + 0x93,0x4F,0xCA,0x8A,0xCF,0x98,0x43,0x7A,0xF2,0x64,0x99,0xB0,0xA6,0xA8,0x9A,0xEE, + 0x38,0xA5,0x32,0x2B,0x29,0x3D,0x92,0x68,0x64,0x98,0xEE,0x6E,0xFD,0x5D,0xCD,0xF4, + 0x81,0xD8,0xE0,0xDB,0xD4,0xE3,0x34,0x28,0xB3,0x27,0x85,0xF1,0xB1,0x57,0x97,0xA8, + 0xAE,0x3A,0x4C,0x89,0x09,0x7F,0xB2,0x4A,0xE7,0x3C,0x70,0xF0,0x23,0x8A,0x89,0x99, + 0x4A,0x11,0x5D,0xCC,0xA7,0x98,0x55,0x94,0xED,0xA2,0x9E,0x3D,0xEF,0xA7,0xAE,0x5D, + 0x77,0xB2,0x3D,0x06,0x94,0x8E,0xF7,0x07,0xEA,0x4F,0x57,0xD3,0x47,0x25,0xE7,0xE8, + 0xA9,0xDA,0x14,0xB6,0x47,0x1D,0xE8,0x3A,0x8A,0x1E,0x27,0x2C,0xB5,0x0D,0x36,0xA5, + 0xE6,0xD3,0xF8,0x31,0xA3,0x4C,0x3A,0x93,0xD3,0x16,0x0A,0xFE,0xDD,0x7E,0xFB,0xED, + 0xAA,0xBC,0x57,0x87,0xC5,0xFC,0x97,0xBF,0xFC,0x45,0xB6,0xF8,0xBD,0x51,0xCC,0xC7, + 0x8F,0x17,0x0A,0x1F,0x1F,0x3F,0x4D,0x7F,0xAC,0xEF,0x21,0xEE,0xB7,0x8B,0x83,0x62, + 0x7E,0x2F,0xE6,0x20,0x35,0x7E,0xF3,0x0F,0xAA,0x3D,0x79,0x98,0xED,0xE1,0x38,0xC3, + 0xB0,0xAB,0xE7,0xD2,0xA8,0xA9,0xEB,0xAD,0xC4,0xBC,0x6B,0xC7,0x5B,0xB4,0xE9,0x93, + 0xEF,0xAC,0x3E,0xDF,0x09,0x73,0x1F,0xA2,0xE1,0xE3,0x5F,0xB3,0x12,0xB3,0xD2,0xF1, + 0xFE,0x40,0xEF,0xB1,0xBF,0xA2,0x1F,0x07,0xDD,0x49,0xEF,0x36,0x38,0x30,0x4F,0x1F, + 0xFD,0xE7,0x4B,0x23,0x28,0x7F,0xC7,0x69,0xBA,0xCA,0xF6,0x14,0x74,0xFA,0x2E,0xB9, + 0x80,0x2E,0x1F,0x37,0x52,0xD4,0x0D,0x66,0x23,0xBE,0xF6,0xDA,0x6B,0xE2,0x7E,0x29, + 0x8E,0x88,0xD9,0x61,0x37,0xDB,0x5E,0xA6,0x8A,0xA0,0xBF,0xB7,0x1C,0x6F,0xD7,0x0B, + 0xD4,0x43,0x94,0xB4,0x47,0x50,0x17,0x3B,0xD1,0x5D,0x0E,0xC7,0x1D,0x04,0x27,0xF4, + 0xB0,0xE3,0x62,0x5B,0x12,0x44,0x8B,0x47,0x46,0x50,0x8E,0xBE,0xFB,0x68,0x4F,0xC8, + 0xA0,0xB2,0x3D,0x94,0xAA,0xAB,0x0D,0x09,0x51,0xCE,0x66,0x56,0x4A,0x71,0x7B,0x00, + 0x2C,0x38,0x24,0x84,0xBA,0x07,0x79,0x6E,0x55,0x88,0x24,0x5D,0x0B,0x35,0x37,0xDA, + 0x5E,0xD6,0x94,0xC3,0x71,0x07,0x6D,0xF5,0x95,0x94,0x10,0x24,0x3F,0x14,0x2B,0xC7, + 0xDD,0x23,0x63,0x68,0x41,0x57,0x9D,0x6E,0xAC,0x1D,0xF7,0xDA,0x48,0x5C,0x50,0x1B, + 0x25,0x24,0xC4,0xD9,0xB4,0xBA,0x8E,0x44,0xB9,0xDD,0x6E,0x99,0xC3,0xC2,0xC2,0x28, + 0x25,0x58,0xDD,0xDA,0x4E,0xCE,0x90,0x10,0xDC,0x46,0xAD,0x67,0xDD,0x3B,0x14,0xC3, + 0xE1,0xC8,0x71,0xBE,0xA1,0x86,0x52,0x74,0xEA,0x86,0x43,0x8D,0xFD,0x64,0x74,0x17, + 0xB7,0xB0,0x7D,0xF6,0x88,0x09,0xEA,0xA8,0xBD,0xE7,0x68,0x89,0x20,0x39,0x1C,0x16, + 0xB3,0x52,0xDA,0x99,0xB1,0x96,0x76,0x5A,0x6A,0x92,0xAE,0x5F,0xA8,0x67,0xC6,0x83, + 0xF1,0xC7,0xC7,0xEA,0xEF,0x66,0x0D,0xD5,0x65,0x6C,0x0F,0x87,0xE3,0x39,0xEA,0xCA, + 0x8E,0xD1,0x10,0x9D,0x7D,0x91,0x49,0x85,0xAC,0x26,0xEE,0x03,0x7A,0x06,0x37,0x53, + 0x7B,0x90,0xFD,0x22,0xED,0x8E,0x44,0xB9,0xDD,0x26,0x66,0x69,0x50,0x4C,0x68,0x6F, + 0xA7,0x81,0xA1,0xE7,0x58,0x4B,0x1E,0x63,0xB2,0x08,0x82,0x5F,0x68,0xBF,0xCD,0x06, + 0xDB,0x17,0xC7,0x88,0x4F,0xCB,0x32,0x26,0xAC,0x81,0x6A,0x4A,0x0A,0xA8,0xBD,0xCD, + 0x73,0x96,0x9F,0xC3,0x31,0x72,0xBA,0xEC,0x28,0xA5,0x86,0x9C,0xB7,0xED,0x6A,0xC7, + 0x84,0xD3,0x23,0xAC,0x74,0x9C,0xF1,0x1A,0x36,0x3E,0x6C,0x5D,0xCB,0x93,0xC3,0x4F, + 0x53,0x57,0x89,0x50,0x95,0x32,0xBD,0x3C,0x2A,0x66,0x25,0x37,0x5B,0x2A,0xE6,0xB8, + 0x88,0x30,0xBA,0x32,0xCC,0x76,0xFD,0xA2,0xB7,0xB7,0xB3,0x41,0x76,0x8B,0xC7,0x82, + 0x33,0xEC,0x00,0x19,0x66,0x86,0x94,0x53,0xED,0xFE,0xF5,0xAC,0xC5,0xE1,0x78,0x9E, + 0x8A,0xFC,0xED,0x74,0x79,0x44,0x2D,0x6B,0xC9,0x70,0xA6,0x99,0x72,0x8C,0x09,0x23, + 0x0E,0x5C,0xCB,0x57,0x85,0x56,0x52,0x52,0x42,0xC7,0x90,0x97,0x23,0x69,0x9B,0x4A, + 0xB8,0x2D,0x00,0x26,0x8D,0xC6,0x45,0x06,0x07,0xD1,0xD8,0xD6,0x42,0xEA,0x1B,0xEA, + 0xBE,0x09,0x00,0x78,0xAF,0x5E,0xE7,0xAB,0xE9,0xD4,0x11,0xF3,0xA1,0x11,0x0E,0xC7, + 0x93,0x9C,0xDC,0xFC,0x25,0xDD,0x12,0x56,0x46,0x61,0xE4,0xBE,0xD5,0x07,0xAF,0x8B, + 0xA8,0xA2,0x96,0x13,0x3B,0x29,0x2C,0xCC,0xBE,0xD5,0xED,0xD4,0x00,0x18,0x08,0x0E, + 0x0B,0xA7,0x93,0xEB,0xDE,0xA3,0x87,0xC3,0x0A,0xDC,0xF2,0x21,0xE0,0x3D,0x9E,0x0A, + 0x3F,0x4C,0x47,0x56,0xFE,0x93,0xED,0xE1,0x70,0xBC,0x03,0x46,0x4E,0x8A,0xB7,0xAC, + 0xA0,0xC7,0xBA,0x1C,0x67,0x7B,0x5C,0x23,0x2D,0xB8,0x95,0x6E,0xA2,0x63,0x54,0xBA, + 0xF9,0x0B,0x7D,0x77,0xB4,0x8D,0xED,0xD5,0x58,0x00,0x4C,0x6A,0x99,0x23,0xA2,0xBB, + 0x89,0x49,0x04,0xC2,0x8E,0x2F,0x5D,0xFE,0x10,0x20,0xE4,0x17,0xA3,0xF2,0xA9,0x76, + 0xFD,0x12,0xAA,0x3F,0x55,0xC4,0xF6,0x72,0x38,0xDE,0xA3,0x62,0xD7,0x77,0xD4,0xA7, + 0xF8,0x27,0xBA,0x25,0xDC,0xF1,0x95,0x19,0xA5,0x20,0x80,0xFB,0x62,0x97,0x43,0x54, + 0xB2,0x72,0x31,0x85,0x04,0x87,0x52,0xBB,0x8A,0x85,0xFD,0x3D,0xDA,0x67,0x56,0x42, + 0x2A,0xE6,0xB0,0x08,0x83,0xF5,0xC6,0x87,0xD0,0xA3,0xE0,0x3B,0xFA,0x5B,0x97,0xC3, + 0x4E,0x59,0x68,0xFC,0xF1,0xAF,0x45,0x1D,0xA4,0x90,0x9F,0x3F,0xA2,0xEA,0xFC,0x6D, + 0x6C,0x2F,0x87,0xE3,0x7D,0x8E,0xAF,0x79,0x97,0xAE,0xA8,0xDE,0x48,0xBF,0x8F,0x70, + 0xCE,0x38,0xC1,0x22,0xFF,0x2B,0x62,0x2F,0x55,0xAD,0x7B,0x5B,0x34,0x4A,0x5D,0xBA, + 0x26,0x20,0x52,0xCC,0x9E,0xED,0xA4,0x00,0x98,0x9A,0x45,0xAE,0xDA,0xF5,0xEE,0x43, + 0x24,0x4E,0x56,0x4F,0xC9,0x4F,0x1F,0x51,0xDC,0xF6,0x0F,0xE9,0xB3,0x6E,0xFB,0xE9, + 0xAA,0x2E,0xEA,0x93,0x3D,0xD0,0xAF,0xF8,0x38,0x7A,0x2F,0x35,0xAF,0x7A,0x89,0x2A, + 0xF7,0xFE,0xC0,0xF6,0x72,0x38,0x9D,0xC7,0xD1,0xFF,0xBD,0x4C,0x17,0xE6,0xAD,0xD0, + 0x5F,0xCB,0x07,0x68,0x58,0xD8,0x59,0xB6,0xD7,0x36,0x30,0x48,0xF3,0xBA,0x94,0xD2, + 0x9B,0x11,0xBB,0xA9,0xE6,0x7F,0x8B,0xA8,0xEE,0xD8,0x2E,0xC3,0xFE,0x84,0x54,0x33, + 0x2F,0xF7,0xE4,0x49,0xF9,0x89,0x32,0x6A,0xBA,0xB5,0x46,0xDC,0x26,0x66,0xA9,0xCF, + 0xAF,0xA3,0x36,0x4A,0xC8,0xE8,0xCB,0x5A,0x24,0x8A,0x31,0xFF,0xA3,0x3F,0xD1,0xAD, + 0x15,0xDF,0xD2,0x37,0x71,0xFB,0xE9,0x89,0xE8,0x22,0x71,0x98,0x49,0x1A,0x20,0xC3, + 0x50,0xD6,0xC4,0x88,0x06,0xF1,0xB9,0x35,0xF1,0xFB,0xE9,0xDA,0xB2,0x55,0x74,0x70, + 0xE9,0xE3,0x3C,0x07,0x9B,0xA3,0x29,0x4A,0x37,0x7F,0x4E,0x25,0x5F,0x3C,0x4B,0x4F, + 0xB4,0x6E,0xA1,0x15,0xB1,0xFB,0xE9,0x77,0xD1,0xE5,0xA2,0xB0,0x31,0x6E,0x6C,0x04, + 0xED,0xA9,0x11,0xF5,0xF4,0xF7,0xA8,0x02,0xFA,0x34,0x66,0x1F,0x8D,0x3D,0xFC,0x5F, + 0xF1,0x5A,0x96,0x76,0x13,0x93,0x7B,0x5E,0x48,0xC9,0x29,0xF1,0xA6,0xEC,0x2F,0xA5, + 0x74,0x4E,0xA5,0xF5,0x9B,0xE5,0x70,0x58,0xCC,0x4A,0xEB,0x49,0x49,0x2D,0x73,0x5A, + 0x5A,0x92,0x2E,0x36,0xC5,0xBC,0x2A,0xC5,0xB9,0xFA,0x2A,0xCA,0x5F,0xF9,0x9A,0xFE, + 0x8F,0xFA,0x23,0xF5,0xDA,0xFA,0x26,0x3D,0xD2,0xB4,0x89,0x5E,0x0A,0xDE,0x49,0x5B, + 0x53,0xF3,0xC4,0xC7,0xB3,0xB4,0x9D,0x7E,0x57,0xFF,0xA3,0xF8,0xDC,0xAE,0x25,0x8F, + 0xD2,0xD1,0x55,0x6F,0xF2,0xB4,0x4D,0x8E,0x26,0x81,0x28,0xF7,0x7F,0xF4,0x67,0x3A, + 0xBA,0xEC,0x49,0x1A,0xBD,0xFB,0xDF,0xA2,0xB0,0xDF,0x88,0xD8,0x63,0xBA,0x96,0xD1, + 0xBE,0xAB,0x66,0x2D,0xC5,0xFE,0xF4,0x3A,0xED,0x5E,0xF2,0x30,0x15,0xE6,0x7E,0x4E, + 0xAD,0x4D,0xE6,0x96,0x3C,0x49,0xB2,0x04,0xAF,0xD2,0x3A,0xCC,0x8E,0x2E,0xC4,0xE8, + 0x54,0x9F,0x59,0xC9,0xF4,0x4B,0xD7,0xA1,0x92,0x9E,0xAC,0x14,0x88,0xFA,0xE4,0xDE, + 0x0D,0x74,0x60,0xD9,0x33,0xB4,0xF3,0xBD,0x87,0x69,0xCD,0x4B,0x77,0x8A,0x8F,0xBD, + 0xFF,0x79,0x8C,0x0E,0x7D,0xFE,0xBC,0xF8,0x1C,0x17,0x31,0xC7,0x17,0x68,0xAC,0x29, + 0xA7,0xE3,0xDB,0xBE,0x15,0x85,0xBD,0xE3,0x9D,0x05,0xA6,0x6B,0x19,0xED,0xC3,0x2B, + 0x5E,0xA2,0xF2,0xC3,0xDB,0xAC,0x44,0x6C,0x24,0x36,0xB9,0xC3,0xD8,0x29,0xAD,0x29, + 0xE5,0xB0,0x98,0x43,0x43,0x1C,0xD7,0xB3,0x9A,0x55,0xEB,0x62,0x93,0x55,0x4E,0x81, + 0xE4,0x70,0x02,0x90,0x88,0xE8,0x8E,0xF1,0x63,0xB7,0x89,0x39,0x3E,0x26,0x8C,0x6D, + 0xAA,0x47,0x4D,0x10,0x2C,0x36,0x35,0x9B,0x6D,0x71,0x38,0x1C,0x29,0xB1,0xA9,0x3D, + 0xA9,0xFD,0x7C,0x47,0x4A,0xB2,0x92,0x98,0x1D,0xAD,0x0B,0xE6,0x94,0x9B,0xAD,0xF4, + 0x4B,0xA4,0x27,0x15,0x1C,0x1C,0x46,0xE1,0x91,0xEA,0x23,0x71,0x1C,0x4E,0xA0,0x10, + 0x9B,0x9C,0x4D,0x41,0x92,0x02,0x89,0x4A,0x62,0x56,0xF2,0x80,0x95,0x70,0x4A,0xCC, + 0x6A,0x2C,0xB3,0xD0,0xDE,0x42,0x31,0xF1,0xDA,0x5D,0xBC,0x9C,0xC3,0x91,0xD2,0x2D, + 0xAD,0x37,0x25,0xF7,0x19,0x26,0x56,0x17,0xC1,0x23,0x21,0x6B,0x20,0x75,0xF5,0x50, + 0x57,0x11,0xC3,0x52,0xA9,0xA9,0x1D,0x51,0x6A,0x25,0x31,0x2B,0xAD,0xDB,0xAC,0x84, + 0x53,0x62,0xCE,0xC9,0xC9,0xB1,0x1B,0xD1,0xC6,0x18,0x5A,0x37,0x8B,0x88,0x36,0x87, + 0xA3,0x25,0xBA,0x74,0x4D,0xA4,0xBE,0x33,0x7E,0x47,0xE3,0x7E,0xFB,0x3A,0x25,0xFC, + 0x6A,0x21,0xB5,0x5C,0x7A,0x9F,0x58,0x26,0x08,0x8F,0xE0,0x69,0x0B,0x28,0xFD,0xBA, + 0x27,0xC4,0xE7,0x72,0xA6,0xFF,0x46,0x3C,0xD6,0x5D,0x58,0x06,0x87,0xE5,0xCA,0x70, + 0x39,0x53,0xE0,0x4F,0x56,0xCC,0xE5,0x35,0xF6,0x27,0x48,0xC8,0xA5,0x75,0x4A,0xB3, + 0x58,0x30,0x86,0x96,0xDE,0x77,0x38,0x6B,0x71,0x38,0xDA,0x21,0x28,0x38,0x94,0x7A, + 0x5F,0x31,0x8F,0x2E,0xBC,0xF5,0xAF,0xB4,0x34,0xE5,0x4A,0xBA,0xF1,0xF4,0x00,0xBA, + 0xE5,0xCC,0x00,0xBA,0xBF,0xA1,0xAF,0x58,0xEF,0x0B,0x8F,0x79,0x0D,0xFD,0xE8,0x7A, + 0xFD,0x7E,0x3C,0xF7,0x69,0xFA,0xD5,0xE2,0xB1,0x78,0x0D,0x5E,0xEB,0x2A,0x69,0xBD, + 0x87,0xB2,0x2D,0xA2,0x82,0x82,0x02,0xB7,0x0C,0x4B,0x01,0xA7,0x2C,0x33,0x50,0xFA, + 0x65,0x87,0x0E,0x1D,0x32,0x9D,0x5C,0xE6,0x85,0x63,0xD9,0x16,0x87,0xA3,0x0D,0x42, + 0x23,0x22,0xA9,0xDF,0xCD,0x4F,0xD1,0x97,0x69,0x57,0xD0,0x55,0xB5,0x03,0xC5,0xD5, + 0x48,0x6D,0x15,0xB8,0xC7,0x73,0x58,0x9D,0x14,0xC7,0xE2,0x35,0x78,0x2D,0xDE,0xC3, + 0x59,0x10,0x47,0x8A,0x94,0x58,0x79,0xA5,0xCC,0x2F,0x47,0xFB,0xCB,0xC0,0x69,0x31, + 0xA3,0x6A,0xA0,0x1C,0xD2,0xD5,0xDF,0x71,0xD2,0x3C,0x08,0xC6,0xD1,0x0A,0x10,0xE1, + 0x80,0x5B,0x9E,0xA5,0xA7,0x82,0x46,0xD3,0x17,0x4D,0x8E,0x5B,0x3E,0xBC,0x06,0xAF, + 0xED,0x7D,0xC3,0x9F,0x9D,0x16,0x74,0x5A,0x9F,0x11,0xA4,0xD3,0x75,0x44,0xB2,0xA5, + 0x7A,0x91,0x92,0x91,0xE1,0xF8,0x02,0xFA,0x1E,0x15,0x33,0x4E,0x1A,0x27,0xCF,0xE1, + 0x74,0x36,0x70,0x8F,0x73,0xAE,0xFF,0x23,0x3D,0xDE,0x3A,0x58,0x5C,0x91,0xD1,0x59, + 0xF0,0xDA,0xE7,0x83,0x86,0x53,0xEF,0x6B,0x17,0x3A,0xE5,0x72,0xF7,0x18,0x30,0xC6, + 0x2C,0xF8,0xA5,0x64,0x99,0x87,0x0E,0x1D,0xEA,0x50,0xF0,0x0B,0x04,0xA5,0x26,0x44, + 0x38,0xFC,0x22,0xD0,0xBF,0x7F,0x7F,0xD9,0xD7,0x95,0x97,0x77,0x4C,0x13,0xC3,0x49, + 0xE3,0xE4,0x39,0x9C,0xCE,0x26,0xFB,0xD2,0x5B,0xE8,0xCB,0xF0,0x01,0x2E,0x09,0xD9, + 0x08,0x16,0x53,0x5F,0x1D,0x31,0x80,0x7A,0x5C,0x72,0x23,0xDB,0xA3,0x9E,0xAC,0xC1, + 0x97,0xB0,0x2D,0xD4,0x98,0x3F,0x2E,0x5B,0x83,0xDE,0xD9,0x75,0xA7,0x9C,0xB6,0xCC, + 0x40,0xC9,0xAF,0x97,0xF6,0x9B,0x7B,0x0D,0xBB,0x94,0x6D,0x71,0x38,0x9D,0x43,0x78, + 0x54,0x37,0x8A,0xCB,0x19,0x45,0x9F,0x9F,0x75,0xDF,0x92,0xB4,0x1F,0x36,0xA5,0x50, + 0x62,0xFF,0xF1,0xE2,0x7B,0xAB,0x05,0x43,0xB5,0x61,0x92,0x95,0x3F,0x94,0x5C,0x6C, + 0x25,0xAF,0xD7,0x1E,0x2E,0x89,0x59,0x8D,0xAB,0x1D,0x12,0x1A,0xCE,0xC7,0x9B,0x35, + 0x48,0x7B,0xBB,0x8E,0x8A,0x4E,0xCC,0x15,0x57,0xA4,0x90,0x3E,0x5A,0xCF,0xF7,0x61, + 0x47,0x98,0xD3,0xD6,0x7A,0x9E,0x8E,0xE4,0x3F,0x24,0x7B,0x7C,0x7B,0x9B,0x8D,0x82, + 0x77,0x1A,0x20,0x63,0xDC,0xB5,0xF4,0x61,0x4B,0x9A,0xC2,0xF2,0xC2,0x41,0xB4,0xF8, + 0x52,0x8B,0x15,0x1C,0x2D,0x1E,0x72,0x61,0x5C,0xBC,0x17,0xDE,0x13,0xEF,0xAD,0x96, + 0xB4,0xBE,0xC3,0x28,0x2C,0xB4,0xA3,0x22,0xA7,0xBB,0xC5,0x2C,0xBA,0xCA,0xD3,0x7E, + 0x9F,0x6B,0x16,0x1E,0x4F,0x89,0x8F,0xA0,0xA5,0x4F,0x8C,0xB0,0xEB,0x7E,0xC3,0x02, + 0x2F,0x5B,0xB6,0x8C,0xB5,0x3A,0x80,0xC5,0x9E,0x3F,0x7F,0xBE,0xF8,0xFA,0xAA,0xCA, + 0x5A,0x61,0xDD,0xD2,0xE7,0x29,0x7F,0xEB,0x4A,0xF1,0x39,0x8E,0x36,0x80,0x45,0x89, + 0x8C,0x93,0xF7,0xAC,0xE4,0xA6,0x9D,0x2A,0x1D,0x0F,0x21,0xA3,0x8A,0xA5,0x96,0x19, + 0x3D,0xEF,0x55,0x9A,0xDB,0x38,0x48,0xD5,0xEA,0x14,0x6A,0xD7,0x89,0x02,0x28,0x38, + 0xF0,0x7E,0xD4,0x3E,0xFA,0xF9,0xCD,0xFB,0xD8,0x1E,0xDB,0x5C,0xFE,0x9B,0xE7,0x69, + 0xF4,0xD4,0x99,0x26,0x5D,0xD9,0x5B,0xEA,0xC9,0x51,0x64,0x2D,0x73,0xE3,0x39,0x75, + 0x77,0x5A,0x35,0xFD,0xE6,0xC4,0xA4,0x38,0x5D,0xF6,0xA0,0x09,0xAC,0xC5,0xD1,0x0A, + 0x98,0x99,0x06,0xD1,0xCA,0x3D,0xE4,0x50,0x3A,0x5E,0xEB,0x42,0x46,0x16,0x57,0xBD, + 0x2E,0xDC,0xC1,0x65,0x66,0xD4,0x81,0xF7,0xC4,0x7B,0xAB,0xCD,0x14,0x83,0x65,0x36, + 0xE2,0xEE,0xFE,0x32,0x90,0x15,0x73,0x83,0x4A,0x31,0x03,0xA5,0x7E,0xF3,0xAE,0x5D, + 0x1D,0xEB,0x05,0x4B,0xFF,0x08,0x0E,0xC7,0x9B,0x84,0x46,0x76,0xA5,0xEA,0x36,0xFB, + 0xC5,0xE6,0x9D,0x05,0xEF,0x8D,0xDF,0x61,0x0F,0x74,0x35,0xD1,0xE5,0x34,0xE2,0x6E, + 0x17,0x1B,0xB8,0xD4,0x67,0x06,0xAA,0xFA,0xCD,0x21,0xA1,0x94,0x9C,0x35,0x88,0xB5, + 0x38,0x1C,0xEF,0x81,0xEE,0x41,0xA5,0xE0,0xF8,0xCC,0x40,0xB5,0xE0,0xBD,0xD5,0x04, + 0xC1,0x72,0x46,0x4D,0xA7,0xEE,0xDD,0x13,0x4D,0x9E,0xAC,0xC7,0xC4,0x1C,0xDD,0x45, + 0x39,0x03,0xC6,0x1E,0x4A,0xBF,0xFC,0xC8,0x91,0x23,0x6C,0x8B,0xA8,0x7B,0x7A,0xB2, + 0x6E,0xE0,0xA4,0xEB,0x58,0x8B,0xC3,0x09,0x3C,0x06,0x4E,0x9C,0xCD,0xB6,0x0C,0x28, + 0x89,0xD9,0x99,0xF1,0x65,0x23,0xA2,0x98,0xA3,0x5C,0x10,0x33,0xFA,0xCD,0x72,0x79, + 0xDA,0xA8,0x69,0x24,0xCD,0x3B,0xCD,0x1E,0x32,0x89,0x82,0x43,0xF8,0x02,0xE9,0x1C, + 0xEF,0x82,0xBE,0x3E,0x56,0x0E,0xF5,0x14,0xE9,0x41,0x4D,0x74,0xEE,0xB4,0xFC,0xAC, + 0x27,0x23,0xF0,0x4A,0xC3,0x22,0x3A,0xC6,0xB7,0x37,0x6E,0xDC,0x28,0x1B,0x5C,0x73, + 0xA5,0xBF,0x0C,0x5C,0x76,0xB3,0x41,0x9F,0x3E,0xF2,0xC3,0x19,0xBB,0x77,0xEF,0x66, + 0x5B,0x98,0xDF,0xCC,0x73,0xB5,0x39,0xDE,0xE7,0x6C,0x4D,0x39,0x65,0x86,0x7A,0x6E, + 0xE8,0x2C,0x25,0xA4,0x9D,0x9A,0xEA,0xAB,0x59,0x4B,0x9E,0xFE,0xE3,0x7F,0x25,0x7A, + 0xA7,0xAC,0x69,0xA6,0x0B,0x29,0x17,0x5D,0x74,0x11,0xDB,0x72,0x0E,0xB7,0x88,0x59, + 0xE9,0x24,0xF2,0xF2,0xF2,0xD8,0x96,0x21,0x1B,0x6C,0xF0,0x65,0x8E,0x67,0xCC,0x70, + 0x38,0xAE,0x80,0x9A,0x73,0xBA,0x16,0xF3,0xEA,0x99,0xEE,0x02,0xEF,0x89,0xF7,0xC6, + 0xEF,0x50,0x02,0xDE,0x68,0xAF,0xA1,0x93,0x59,0xCB,0x50,0xBC,0x4F,0x69,0xFE,0xF2, + 0xC0,0x81,0x03,0xD9,0x96,0x73,0x28,0x8A,0xB9,0xBC,0xBA,0xC9,0xEE,0x38,0x9B,0x11, + 0xB8,0xDA,0x72,0xF3,0x2F,0x11,0x7A,0x97,0x46,0xB5,0x93,0x7A,0xF4,0x33,0xD5,0xD3, + 0xE6,0x70,0xBC,0x45,0xF5,0x81,0x8D,0x74,0x79,0x84,0xEB,0xCB,0xBF,0x58,0x82,0xF7, + 0xC4,0x7B,0xDB,0x02,0xDE,0x68,0x68,0x58,0x47,0x37,0x54,0xC9,0x2A,0x63,0x62,0x85, + 0x23,0x65,0x75,0xE5,0x70,0x8B,0x65,0x06,0x4A,0x77,0x15,0xE9,0xC9,0xA7,0xEB,0x5D, + 0x8D,0x9C,0x51,0x57,0xB0,0x16,0x87,0xE3,0x1D,0x4A,0xF7,0x7C,0x4F,0xB3,0x42,0x2B, + 0x54,0xAD,0xAA,0x62,0x5A,0x9D,0xD4,0x0E,0x58,0xE6,0xF5,0x57,0x41,0x25,0x74,0x72, + 0xE7,0x6A,0xB6,0x47,0x1E,0x78,0xA3,0xD2,0x89,0x15,0xFB,0xF7,0xEF,0x67,0x5B,0xE6, + 0xB8,0xEA,0x62,0x03,0x51,0xCC,0xF1,0x31,0xAE,0x0F,0xA8,0x2B,0x9D,0x8C,0x65,0xD4, + 0xAE,0xFF,0xF8,0xAB,0xD9,0x16,0x87,0xE3,0x1D,0x10,0x04,0xAB,0x3A,0xB4,0x89,0x6E, + 0x89,0xA8,0x60,0x7B,0x5C,0xE7,0xB7,0x11,0xC5,0x54,0xFE,0xF3,0x57,0x8A,0xA5,0x74, + 0x01,0xA6,0xFF,0x26,0xF5,0x18,0xC0,0x5A,0x86,0x42,0x04,0x72,0xC5,0xEE,0x11,0x40, + 0x1E,0x39,0x72,0xA4,0x4B,0x56,0x19,0x88,0x62,0x0E,0x0B,0x75,0xDD,0x40,0xA3,0x5E, + 0x91,0x52,0x34,0x4E,0x1A,0xBD,0x8B,0x8E,0x4D,0x16,0xAB,0x13,0x72,0x38,0xDE,0xE4, + 0xC4,0x8F,0x1F,0xD2,0xF4,0x33,0x3B,0xE9,0xD2,0x30,0xD7,0xDD,0xED,0xE9,0xE1,0x35, + 0x74,0x61,0xF5,0x6E,0x2A,0xDD,0xBD,0x8E,0xED,0x91,0xA7,0xF7,0xB0,0x69,0x14,0x11, + 0x61,0xDF,0xC5,0x56,0x0A,0x20,0x3B,0x8A,0xDB,0xDC,0x6C,0xA0,0x64,0x9D,0xA5,0x7F, + 0x44,0xF7,0xF4,0x44,0xDD,0x90,0xCB,0x6E,0x61,0x2D,0x0E,0xC7,0x7B,0xE4,0x7F,0xF9, + 0x02,0xDD,0x2F,0xEC,0x13,0xC5,0xE8,0x2C,0x78,0xED,0xAF,0xCF,0x6E,0xA7,0x23,0xFF, + 0x7B,0x85,0xED,0x51,0x66,0xE8,0xE5,0xBF,0xA6,0x84,0x84,0x6E,0x26,0x8B,0x2B,0x0D, + 0x08,0x83,0x2F,0xBE,0xF8,0x42,0x9C,0xCF,0xEC,0x6A,0xE0,0xCB,0x88,0xA2,0x98,0x2B, + 0x6A,0x1D,0x5F,0xC9,0x5D,0xE9,0xA4,0x10,0xBD,0x2B,0x2E,0x2E,0x36,0x59,0xE7,0x3E, + 0x23,0xA6,0xF0,0x40,0x18,0xC7,0xEB,0xB4,0xB7,0xB5,0xD2,0xFE,0x0F,0xFF,0x44,0x73, + 0xEB,0x36,0xD0,0x9F,0x23,0x8F,0x8B,0x8B,0xBA,0xA9,0x05,0x7D,0x64,0xBC,0x06,0xAF, + 0x3D,0xFA,0xF9,0x73,0xE2,0x7B,0xD9,0x22,0x6B,0xF0,0x24,0x8A,0xEA,0xD6,0x91,0x19, + 0xB6,0x65,0xCB,0x16,0xB3,0x5C,0x6C,0xB8,0xDB,0xE8,0x82,0xC2,0x2A,0x0F,0x1A,0x34, + 0xC8,0x65,0x17,0x1B,0xB8,0xD5,0x32,0x23,0x1A,0xA7,0x54,0xEE,0x24,0x37,0x37,0x97, + 0x6D,0x19,0x02,0x61,0x23,0x67,0xCE,0x63,0x2D,0x0E,0xC7,0x7B,0x40,0x84,0xF9,0xCB, + 0xFF,0x41,0x3D,0x76,0xBC,0x2F,0x2E,0xEA,0x76,0x7F,0x64,0x89,0xD9,0x02,0x86,0x96, + 0xE0,0xB9,0x47,0xA2,0x4B,0xE8,0x3F,0x51,0x7B,0xC5,0xD7,0xE0,0xB5,0xF6,0x84,0x0C, + 0xC6,0x5F,0xBF,0xC0,0x2C,0xF0,0x25,0xBD,0xFE,0xC1,0xCF,0x3F,0xFF,0x4C,0xA3,0x47, + 0x8F,0x76,0x9B,0x55,0x06,0x6E,0x15,0x33,0xB0,0x35,0xE6,0x2C,0x5D,0x20,0x8B,0x5B, + 0x67,0x4E,0x67,0x82,0xFE,0x2E,0x16,0x75,0x1B,0xBE,0x6F,0xA9,0xB8,0x80,0x21,0x56, + 0x27,0x7D,0x2F,0xE6,0xA0,0xD9,0x03,0xAB,0x91,0xE2,0xB9,0x81,0x3B,0xDE,0xA1,0x7D, + 0xFF,0x59,0x68,0xB7,0x8F,0x6C,0x44,0xCE,0x2A,0x4B,0x03,0x5F,0xB0,0xD0,0x88,0x6A, + 0x43,0x2B,0xEE,0x88,0x62,0x1B,0x11,0xC5,0x9C,0x12,0xE7,0x78,0x8D,0x5E,0x25,0x10, + 0x95,0x53,0x5A,0x58,0x6E,0xFD,0xFA,0xF5,0x6C,0xCB,0x60,0x9D,0x07,0x4E,0xBC,0x81, + 0xB5,0x38,0x1C,0xEF,0x83,0x48,0x74,0xE1,0xCF,0x5F,0x8B,0x0B,0x18,0x62,0x75,0xD2, + 0xC6,0x6F,0xFE,0x61,0xF6,0xC0,0x6A,0xA4,0x78,0xAE,0x70,0xE7,0x5A,0x9B,0x51,0x6B, + 0x4B,0x46,0xCD,0xF8,0x8D,0x4D,0xAB,0x0C,0x21,0x63,0x4E,0x03,0x5C,0x6C,0x47,0x0B, + 0xDD,0xDB,0xC2,0xED,0x96,0x19,0x7C,0xFD,0xF5,0xD7,0x66,0x73,0x9A,0x8D,0x58,0x5A, + 0xE7,0x01,0x13,0xAF,0xE3,0xF9,0xDA,0x1C,0x4D,0x80,0x2C,0x2E,0xCB,0xB9,0xDA,0xCE, + 0xAC,0x46,0x9A,0x98,0xD1,0x97,0xBA,0x26,0x75,0x54,0xD6,0xB1,0xB4,0xCA,0xC0,0xE8, + 0x62,0x4F,0x9A,0x34,0x89,0xED,0x71,0x0F,0x8A,0x62,0x76,0x64,0x4E,0xB3,0x25,0xBF, + 0xFE,0xF5,0xAF,0xE9,0x97,0x5F,0x7E,0x61,0x2D,0x73,0xA4,0xD6,0x39,0xB3,0x47,0x9A, + 0x6E,0xE0,0xA4,0xEB,0x59,0x8B,0xC3,0xF1,0x7D,0xC6,0xE9,0xFB,0xCA,0xB6,0xF2,0xB0, + 0x11,0xBD,0xC6,0xB8,0x32,0xDC,0x6B,0xA5,0xE2,0x1E,0xCE,0x62,0x43,0xCC,0x6D,0x6C, + 0xCB,0x71,0xEE,0xBC,0xF3,0x4E,0x5D,0x49,0x49,0x89,0xEC,0x6A,0xF0,0x96,0xD6,0x79, + 0xD8,0xF4,0xB9,0xDC,0x3A,0x73,0xFC,0x02,0x58,0xE5,0xE4,0x1E,0x1D,0x4B,0xCF,0xA0, + 0xAC,0x96,0xA5,0x87,0xEA,0x29,0xAB,0x0C,0x44,0x31,0x87,0x85,0xBA,0xF5,0x06,0x21, + 0xF2,0xF0,0xC3,0x0F,0xC3,0xC5,0x60,0x2D,0x73,0x76,0xEC,0xD8,0xC1,0xB6,0xB8,0x75, + 0xE6,0xF8,0x0F,0x96,0x56,0x59,0xEA,0x85,0x02,0x18,0x37,0x58,0xE6,0x89,0x13,0x27, + 0xBA,0xDD,0x2A,0x03,0x51,0xCC,0xB1,0xD1,0xEE,0xAF,0x8F,0x74,0xF3,0xCD,0x37,0xD3, + 0xD1,0xA3,0x47,0x65,0x17,0xC5,0xB2,0x74,0x3D,0x86,0x4D,0xBB,0x8D,0xAF,0x7C,0xC1, + 0xF1,0x69,0x30,0x67,0xD9,0x9E,0x55,0x86,0x11,0x1B,0x32,0x64,0x08,0x4D,0x9D,0x3A, + 0x95,0xED,0x71,0x2F,0x8A,0x6E,0x76,0x4B,0xAB,0xFA,0x01,0x75,0x39,0xD2,0xD2,0xD2, + 0x74,0xB3,0x67,0xCF,0xA6,0x9D,0x3B,0x77,0xB2,0x3D,0x1D,0x40,0xE0,0xCB,0x97,0x2F, + 0x37,0xB9,0xDA,0x99,0x59,0xE9,0xBA,0x31,0xD7,0x3C,0xC0,0x5A,0x1C,0x8E,0xEF,0x31, + 0xF5,0xCE,0x67,0x6D,0x5A,0x65,0x5C,0xF3,0x7B,0xF6,0xEC,0xF1,0x98,0x55,0x06,0x8A, + 0x62,0xAE,0x3D,0xE3,0x7A,0x75,0x86,0xDF,0xFD,0xEE,0x77,0x8A,0xB3,0x44,0x60,0x9D, + 0xA5,0x59,0x61,0x39,0x23,0xA6,0x88,0x7D,0x0E,0x0E,0xC7,0xD7,0x18,0x32,0xE5,0x16, + 0xEA,0x7D,0x41,0x1F,0x93,0x40,0xF7,0xED,0xDB,0x67,0x65,0x95,0x51,0x46,0x0B,0xC5, + 0x2F,0xAF,0xB8,0xC2,0x73,0xB3,0x06,0x15,0xC5,0xEC,0x0E,0x70,0x07,0x82,0x5B,0x51, + 0x50,0x50,0xC0,0xF6,0x98,0xB3,0x72,0x65,0x47,0x2D,0x6D,0xDC,0xD5,0xA6,0xDC,0xF9, + 0x57,0xD6,0xE2,0x70,0x7C,0x03,0x24,0x3E,0x0D,0xBF,0x7C,0x2E,0x6B,0x19,0x58,0xBD, + 0xDA,0x7A,0x5A,0xE4,0xA6,0x4D,0x9B,0x68,0xCA,0x94,0x29,0x34,0x76,0xEC,0x58,0x8F, + 0x58,0x65,0x20,0x8A,0x19,0x45,0xEF,0x3D,0xC5,0x43,0x0F,0x3D,0x44,0x07,0x0E,0x1C, + 0x60,0x2D,0x73,0x70,0xF7,0xC2,0x38,0x1C,0x6B,0x52,0x6C,0x62,0x0A,0xF5,0x1F,0x3F, + 0x8B,0xB5,0x38,0x1C,0xED,0x73,0xC9,0xCD,0x7F,0xA0,0x8C,0x9E,0x69,0x26,0x81,0xAE, + 0x5A,0xB5,0xCA,0x6A,0x5C,0x19,0xD7,0x39,0xDC,0x6C,0x0C,0xD9,0x7A,0x12,0x45,0xCB, + 0xDC,0xDA,0x66,0xD2,0x98,0x4B,0x4C,0x9E,0x3C,0x59,0xFC,0x43,0xEB,0xEB,0xEB,0xC5, + 0xB6,0x25,0xD2,0xBE,0x45,0x72,0x4A,0x82,0x6E,0xD4,0xAF,0xE6,0xF1,0x34,0x4F,0x8E, + 0x4F,0x90,0x96,0x33,0x8C,0x32,0x2F,0x18,0xC9,0x5A,0x86,0x92,0x40,0xD2,0x91,0x1A, + 0x23,0x18,0x8E,0x9A,0x36,0x6D,0x9A,0x5B,0xE6,0x2C,0xDB,0x42,0xB9,0xCF,0x5C,0x6F, + 0x3F,0x99,0x5C,0x2D,0x4F,0x3D,0xF5,0x14,0xED,0xDD,0xBB,0x97,0xB5,0xCC,0x69,0x6A, + 0x6A,0xA2,0xCF,0x3E,0xFB,0xCC,0x74,0xE7,0xE8,0x99,0x9D,0xA9,0x1B,0x37,0xFB,0x41, + 0xD6,0xE2,0x70,0xB4,0x09,0x72,0x23,0x26,0xDF,0xFA,0x47,0x4A,0x4B,0xEF,0x48,0xDB, + 0x44,0xB7,0xD1,0x72,0xF4,0x06,0x56,0x1A,0xB3,0xA3,0x9E,0x79,0xE6,0x19,0xB6,0xC7, + 0x73,0x78,0xB4,0xCF,0x6C,0xE4,0x9A,0x6B,0xAE,0xD1,0x61,0x98,0x4A,0x69,0xF5,0x0B, + 0x04,0xC9,0xB0,0x5C,0x07,0x6B,0x52,0xD6,0xA0,0x09,0x3C,0x18,0xC6,0xD1,0x34,0xC8, + 0x8D,0xE8,0xD3,0xAF,0x9F,0x49,0xC8,0xA8,0x75,0x27,0xB7,0xD6,0x32,0xAE,0x6D,0x24, + 0x88,0x64,0x65,0x65,0x79,0xD4,0x2A,0x03,0x51,0xCC,0xA9,0xF1,0x9E,0xCF,0xC0,0x7A, + 0xE0,0x81,0x07,0x44,0xEB,0x2C,0x57,0x63,0x1B,0x48,0x83,0x06,0x08,0x86,0x4D,0xBB, + 0xFB,0x39,0x9E,0x19,0xC6,0xD1,0x24,0x58,0x6A,0x66,0xC4,0x15,0x77,0xB0,0x96,0x81, + 0x75,0xEB,0xE4,0x67,0x54,0x6D,0xDE,0xBC,0x99,0x5E,0x7E,0xF9,0x65,0xD6,0xF2,0x2C, + 0x5E,0xB1,0xCC,0x60,0xC1,0x82,0x05,0xBA,0xE5,0xCB,0x97,0xD3,0xA8,0x51,0xA3,0xD8, + 0x1E,0x73,0x2C,0x83,0x61,0xB8,0xEB,0x5D,0x32,0x67,0x21,0x6B,0x71,0x38,0xDA,0x00, + 0x06,0xE6,0xCA,0xDF,0x2E,0xA6,0xF4,0xCC,0x14,0x93,0xA5,0x95,0x0B,0x7A,0x01,0xA4, + 0x2E,0x8F,0x18,0x31,0xC2,0x2B,0x56,0x19,0x28,0x8A,0xD9,0x99,0x4A,0x23,0xF6,0xB8, + 0xE9,0xA6,0x9B,0x44,0xB7,0x23,0x31,0x31,0x91,0xED,0x31,0x07,0x77,0x37,0xB3,0x8A, + 0x24,0xC3,0x27,0x51,0xEF,0xA1,0x53,0x58,0x8B,0xC3,0xE9,0x7C,0x60,0x60,0x2E,0x18, + 0x34,0xD0,0x24,0x4E,0x64,0x7A,0x6D,0xDD,0xBA,0x95,0xB5,0xCC,0x39,0x78,0xF0,0x20, + 0x3D,0xFA,0xE8,0xA3,0xAC,0xE5,0x79,0xBC,0x66,0x99,0x01,0x5C,0xED,0x57,0x5F,0x7D, + 0x95,0xA6,0x4F,0x9F,0xCE,0xF6,0x98,0x83,0xE0,0xC1,0xE7,0x9F,0x7F,0xCE,0x5A,0x44, + 0x69,0xDD,0x53,0x74,0x97,0xDC,0xFC,0x28,0x5F,0xAC,0x9D,0xA3,0x09,0x60,0x58,0x60, + 0x60,0xA4,0xAC,0x58,0xB1,0x82,0x6D,0x99,0x53,0x59,0x59,0x49,0xED,0xED,0xED,0x48, + 0x12,0xF1,0x8A,0x55,0x06,0xA2,0x98,0xE3,0x62,0x3C,0xB7,0x4A,0x9E,0x94,0xEC,0xEC, + 0x6C,0x1D,0xA6,0x7E,0xC1,0x3A,0x2B,0x95,0x4B,0xA9,0xAB,0xAB,0xA3,0x4F,0x3E,0xF9, + 0xC4,0x64,0x9D,0x33,0x7B,0xA6,0xEB,0xE0,0xD6,0xF0,0xFE,0x33,0xA7,0x33,0x81,0x41, + 0x81,0x61,0x81,0x81,0x61,0xBB,0xE8,0x9D,0x77,0xDE,0x11,0x30,0x1A,0x23,0x07,0xBA, + 0x8D,0x77,0xDD,0x75,0x17,0x6B,0x79,0x07,0x51,0xCC,0x61,0x21,0xDE,0x33,0xD0,0x4F, + 0x3E,0xF9,0x24,0x56,0x86,0xA7,0xEB,0xAF,0xBF,0x5E,0x76,0x15,0x0C,0x80,0xBE,0x86, + 0xB4,0xFF,0x0C,0xB7,0x86,0xF7,0x9F,0x39,0x9D,0x85,0xB1,0x9F,0x0C,0xC3,0xC2,0x76, + 0x89,0xFD,0x64,0xB9,0xE8,0x35,0x88,0x8A,0x8A,0x12,0x03,0x5F,0x88,0x13,0xB1,0x5D, + 0x5E,0x41,0x51,0xC5,0x35,0xF5,0x9E,0x59,0x39,0xCF,0xB8,0x64,0x25,0x42,0xF9,0xB3, + 0x66,0x29,0x67,0x7B,0xF1,0xFE,0x33,0x47,0x2B,0x38,0xD2,0x4F,0xC6,0x68,0x4D,0x4B, + 0x4B,0x8B,0x18,0x1F,0xF2,0x36,0x8A,0x62,0x6E,0x39,0x6F,0xD2,0x91,0xDB,0x31,0x5A, + 0x67,0xE4,0x6E,0x8F,0x19,0x33,0x86,0xED,0x35,0x87,0xF7,0x9F,0x39,0x5A,0xC0,0x91, + 0x7E,0x32,0x98,0x31,0x63,0x06,0x7D,0xF8,0xE1,0x87,0x74,0xCF,0x3D,0xF7,0xB0,0x3D, + 0xDE,0x43,0x14,0x73,0x6A,0x42,0x84,0x57,0xDD,0x01,0x24,0x91,0xE0,0xCE,0x86,0xF4, + 0x37,0x04,0x08,0x94,0xCA,0xF3,0xCA,0xF5,0x9F,0x67,0xDC,0xFF,0x4F,0x3E,0xF7,0xD9, + 0x87,0x39,0x7E,0xAA,0x91,0x7E,0x3C,0x70,0x8A,0xBE,0xFE,0xA5,0x8C,0x96,0xAC,0x3F, + 0x41,0x9F,0x6C,0x2A,0x12,0xDB,0xDB,0x8F,0xD6,0x50,0x43,0x93,0xE7,0x96,0x5E,0x75, + 0x06,0x24,0x2E,0x4D,0xBA,0xE5,0x0F,0xAA,0xFB,0xC9,0x88,0x07,0x21,0xDB,0xAB,0x5F, + 0xBF,0x7E,0x1E,0x9B,0xE6,0x68,0x0B,0xD3,0x2F,0x9C,0xF6,0xFB,0x5C,0x33,0x53,0x8C, + 0xC9,0x17,0x4B,0x9F,0x18,0xE1,0xB1,0x13,0x5A,0xBC,0x78,0xB1,0x50,0x58,0x58,0x88, + 0x01,0x75,0xF1,0x77,0x3C,0xF7,0xDC,0x73,0x8A,0x1F,0x12,0xA2,0xDF,0xD2,0xD9,0x26, + 0x87,0xF7,0xED,0x17,0x3E,0x7F,0xEE,0x36,0x6A,0x3B,0xEF,0xFE,0x65,0x3A,0x39,0xEE, + 0x07,0x22,0xDD,0x98,0x57,0x45,0xBB,0x8E,0xD7,0x51,0x53,0xAB,0xED,0x72,0x54,0x99, + 0x09,0x5D,0x68,0x42,0xBF,0x24,0xEA,0x9F,0x1E,0xC3,0xF6,0x74,0x0E,0xF0,0x00,0x67, + 0x3F,0xF6,0xBE,0x55,0x3F,0x59,0xC9,0xBD,0xC6,0x70,0xEB,0x7D,0xF7,0xDD,0xA7,0xD3, + 0x77,0x1D,0x05,0x4C,0xA8,0x80,0xC1,0x62,0x4F,0x79,0x0D,0xD3,0x2F,0xB4,0x14,0x33, + 0x58,0xF3,0xD2,0x04,0x8F,0x9E,0x50,0x6C,0x6C,0xAC,0xA0,0xB7,0xBE,0xE2,0xEF,0x40, + 0x3F,0x64,0xD9,0xB2,0x65,0xE2,0x7E,0x4B,0xD0,0x0F,0x41,0x1F,0x24,0x27,0x27,0xC7, + 0x74,0x3E,0xFB,0x77,0x6C,0x15,0xBE,0x7A,0xE9,0x5E,0x2E,0x68,0x8D,0xB3,0x76,0x6F, + 0x05,0x6D,0x29,0xA8,0xA1,0xF3,0x6D,0xAC,0xD8,0x05,0xD2,0x74,0x87,0x5E,0x46,0x94, + 0x9E,0x63,0xD8,0x6E,0xD1,0xDF,0xC0,0xF3,0x77,0xE8,0x4D,0xF6,0x3E,0xA2,0x5D,0xDF, + 0x1B,0xDA,0x7A,0x52,0x63,0x23,0xE8,0x86,0xB1,0x19,0x94,0x18,0xE3,0xFD,0x51,0x0C, + 0x08,0x79,0xD6,0x43,0x6F,0x52,0x76,0x4E,0x6F,0xD3,0xF5,0x86,0x18,0x8F,0x92,0x7B, + 0x8D,0xEB,0x73,0xDE,0xBC,0x79,0x62,0x1E,0xF6,0xE4,0xC9,0x93,0x61,0x9D,0x3D,0xAA, + 0x1B,0x25,0x4C,0xBF,0xB4,0x33,0xC4,0xFC,0xE0,0x83,0x0F,0x0A,0x3D,0x7B,0xF6,0x34, + 0x45,0xFD,0x6C,0xDD,0xF9,0xF0,0x81,0x21,0xD4,0x8F,0x0A,0x26,0x6C,0x17,0xED,0xF8, + 0x71,0xB5,0xF0,0xED,0x1B,0x0F,0xB1,0x16,0x47,0x4B,0xC0,0x02,0x7F,0xB6,0xE5,0x24, + 0x15,0x94,0xB3,0xCC,0xA8,0xD1,0x57,0x11,0xDD,0xF4,0x07,0xA2,0xEC,0x41,0x86,0xB6, + 0x1C,0x10,0xF2,0x77,0x4B,0x88,0xBE,0x7C,0x99,0xA8,0xB6,0x82,0x22,0xC2,0x82,0x69, + 0xCE,0xB8,0x4C,0xCA,0x4E,0x8E,0x62,0x07,0x78,0x1E,0x74,0xE1,0xAE,0x7D,0xF4,0x7D, + 0xCA,0xB9,0xB0,0xC3,0x4D,0xC6,0xEA,0x8D,0xE8,0x07,0x2B,0x81,0x40,0x2E,0x02,0xBB, + 0x96,0xD7,0xB3,0xB7,0x31,0xFD,0xD2,0x1B,0x9F,0xDC,0x26,0x58,0x56,0x17,0xF1,0xB4, + 0x98,0xD1,0x67,0xD6,0xBB,0xCF,0x66,0x77,0x32,0xF4,0x49,0x94,0x42,0xFE,0x18,0xCA, + 0x82,0xA0,0xA5,0x8B,0x52,0x6F,0xFC,0xFA,0xBF,0xC2,0x8F,0x4B,0x3D,0x3F,0x23,0x85, + 0xA3,0x9E,0xF3,0x6D,0x82,0xBE,0x3F,0x7C,0x9C,0x8A,0xAB,0xCF,0x11,0x45,0x75,0x23, + 0x7A,0xEC,0x23,0xA2,0x81,0x13,0xD8,0xB3,0x2A,0x80,0xA8,0x5F,0xBC,0x93,0xE8,0xE7, + 0x6F,0x28,0x24,0x38,0x88,0xE6,0x8C,0xCF,0xA4,0x9C,0x54,0xCF,0xC7,0x49,0x30,0x04, + 0x35,0xFB,0xB1,0x0F,0xCC,0x22,0xD7,0x98,0x00,0x04,0x21,0x5B,0xCE,0x86,0x32,0x82, + 0x7E,0xB2,0xD1,0xA5,0x4E,0x4D,0x4D,0x45,0x85,0x11,0x8F,0x6A,0xC6,0x16,0xA6,0x68, + 0xB6,0x3B,0x96,0x75,0x75,0x14,0x58,0x59,0x7C,0x18,0xD2,0x7A,0x60,0xBF,0xF9,0xCD, + 0x6F,0x14,0xC7,0x9F,0xD1,0xA7,0xB6,0xBC,0x43,0xF6,0x1F,0x33,0x85,0x46,0xFD,0x6A, + 0x3E,0x6B,0x71,0xB4,0xC0,0xF2,0xED,0x25,0x06,0x21,0xC7,0xA5,0x10,0x2D,0x5A,0xEB, + 0x98,0x90,0x41,0x98,0xFE,0xFB,0xC7,0x0D,0xE0,0xD2,0x9B,0x45,0xF7,0xFC,0xB3,0xAD, + 0x27,0xA9,0xBC,0x4E,0x3E,0x9E,0xE2,0x2E,0x20,0xE4,0xAB,0x7F,0xFF,0xBA,0x99,0x90, + 0x61,0x6C,0xD0,0xF5,0x53,0x12,0x32,0xFA,0xC9,0x46,0x21,0x23,0x06,0xD4,0x19,0xC3, + 0x51,0x52,0x6C,0x2A,0xB8,0xBC,0xBA,0xC9,0xCA,0xF5,0x76,0x37,0xC6,0x61,0x2A,0x29, + 0xB7,0xDC,0x72,0x8B,0xE2,0xEC,0x2A,0x44,0xB8,0xDF,0x78,0xE3,0x0D,0xD3,0x79,0x25, + 0x26,0x25,0xE8,0x86,0x5E,0x76,0x03,0x0D,0xB8,0x64,0x36,0xDB,0xA3,0x0D,0x9A,0xB2, + 0x27,0x50,0xFD,0xF8,0x7B,0xC5,0x47,0x7B,0x94,0x7C,0x2E,0xBA,0x94,0xB3,0xFD,0xAE, + 0x70,0xFA,0x78,0x21,0xD8,0x7E,0xBF,0xB2,0xE1,0xA2,0x1B,0x9C,0x3A,0xFE,0xCC,0x18, + 0xC7,0xB2,0x98,0x0E,0x95,0x9C,0xA1,0x7D,0x45,0xA7,0x89,0x42,0xF5,0xBF,0xE3,0x0F, + 0xFA,0x1B,0x2F,0xFA,0xC5,0xCE,0x72,0xFF,0xEB,0x44,0xC3,0xA6,0x50,0x53,0x4B,0x1B, + 0x7D,0xB9,0xAD,0x84,0xED,0xF4,0x0C,0x97,0xFF,0xE6,0x6F,0x34,0x70,0xC4,0x18,0x33, + 0xAB,0x0A,0x21,0x2B,0x05,0x65,0x61,0x70,0x10,0xF0,0x62,0x4D,0xFA,0xCF,0x7F,0xFE, + 0xE3,0xF1,0x4A,0x22,0xF6,0xF0,0xBE,0x39,0xB6,0x00,0x7D,0x0D,0x7C,0x30,0xD2,0x8C, + 0x2F,0xAC,0xBF,0x83,0xBB,0x9C,0x92,0xA0,0x91,0x2A,0x07,0x77,0x9C,0x35,0x29,0x25, + 0x2D,0x59,0x37,0x7E,0xF6,0xEF,0x34,0x23,0x68,0x88,0xA5,0xE6,0xCA,0x67,0x4D,0xE2, + 0xA9,0x1F,0xA3,0x77,0x19,0x6D,0x00,0xF1,0xD6,0x5E,0xE5,0xFC,0xF1,0x8D,0x7A,0xE1, + 0xD9,0xA2,0x35,0xB9,0x1F,0xD5,0x4D,0xFB,0xB3,0x53,0xC7,0x9F,0xBE,0xE4,0x41,0x3A, + 0x97,0x73,0x19,0x7B,0xC6,0x3E,0x18,0x66,0x12,0xB9,0xED,0x29,0x22,0x49,0x15,0x0E, + 0xA7,0xC1,0x0D,0x41,0x6F,0xE1,0x61,0x99,0x71,0xA3,0xF0,0x04,0x57,0xCE,0x7F,0x91, + 0x46,0x4C,0x9E,0x6E,0x26,0x64,0x58,0x5A,0x18,0x0E,0x39,0x70,0xBD,0xCE,0x9D,0xDB, + 0x51,0xF7,0xEB,0xC7,0x1F,0x7F,0x14,0x62,0x63,0x63,0x4D,0x09,0x51,0x9D,0x85,0x49, + 0xCC,0xDE,0x98,0xD3,0xAC,0xC4,0xC2,0x85,0x0B,0x69,0xD1,0xA2,0x45,0xAC,0x65,0x00, + 0x91,0x6B,0x0C,0xC0,0x2B,0x81,0x7E,0xF5,0xD2,0xA5,0x4B,0x4D,0x82,0xC6,0x42,0x5D, + 0x13,0xAE,0xFB,0xAD,0x26,0x5C,0x6E,0x88,0x45,0x6A,0x5D,0x2D,0xDB,0x96,0x40,0xBC, + 0x52,0x6B,0xE9,0xE8,0xF1,0x96,0x6D,0x4B,0xEA,0xC7,0x9B,0x7F,0x26,0x0E,0x1F,0x6F, + 0xD1,0x56,0x02,0x62,0x13,0xDD,0x61,0x04,0xB9,0x66,0x5A,0xBF,0xE6,0xEE,0x91,0xFA, + 0xFE,0xF3,0xAC,0x58,0xDD,0x58,0xD6,0x96,0x62,0x7C,0x8E,0x35,0x3B,0x80,0xCB,0x7D, + 0xAD,0xA1,0xF2,0xCC,0xD6,0x82,0x6A,0xF1,0xA7,0xBB,0x80,0x6B,0x7D,0xDD,0xC2,0xF7, + 0xAD,0x84,0x0C,0xCF,0x4F,0x49,0xC8,0x30,0x30,0x28,0x21,0x2D,0x0D,0xC4,0xBE,0xF2, + 0xCA,0x2B,0xE2,0x24,0xA2,0xCE,0xC6,0xA6,0x65,0x6E,0x39,0xEF,0x5A,0xED,0x6C,0xB5, + 0xA0,0xDF,0x81,0xD2,0xBB,0xD2,0x6A,0x23,0x00,0x77,0x3A,0xA5,0x19,0x56,0x00,0xE5, + 0x4B,0xA5,0xFD,0x6D,0x58,0xE8,0x11,0x97,0xCF,0xA1,0xC9,0xB7,0xFE,0x99,0xED,0xF1, + 0x3E,0x10,0x89,0xA5,0x65,0x95,0xDB,0x67,0x04,0xA2,0xB5,0xB4,0x94,0x8E,0x1E,0x2F, + 0xB7,0xCF,0x08,0xAC,0xAC,0xA5,0x65,0x75,0xF4,0x78,0xB9,0x7D,0x72,0xE4,0x95,0xB0, + 0x3A,0x6F,0x88,0x5C,0xCB,0xF0,0x76,0xA9,0xA1,0x14,0xD5,0x0D,0x56,0x43,0xC8,0xA1, + 0x74,0x75,0x77,0xA2,0x6F,0xB6,0xD7,0x99,0x7D,0xFF,0x26,0xF4,0x7D,0x67,0xB8,0xED, + 0xE8,0x87,0xDB,0x1B,0xA7,0x56,0x0B,0xA2,0xD6,0xD7,0x3C,0xF2,0x0E,0x0D,0x18,0x6E, + 0x5E,0x97,0x0B,0x06,0x02,0x9E,0x9F,0x12,0x10,0xB2,0x74,0x88,0x14,0xFD,0x6A,0x8C, + 0xC0,0x74,0xC6,0xB8,0xB2,0x25,0x36,0xC5,0xEC,0x8E,0xDA,0xD9,0x6A,0xC1,0x9D,0x0D, + 0x77,0x38,0x4B,0x90,0x2C,0x32,0x61,0x82,0x72,0x00,0x05,0x37,0x01,0xA9,0x85,0x46, + 0x1F,0xFA,0xE2,0x99,0x37,0xEA,0xE0,0x3A,0x75,0xC6,0x4C,0x2B,0xA9,0x55,0x0D,0xAE, + 0xEF,0xE8,0xE7,0x49,0xF7,0x4B,0x91,0x5A,0xC9,0xA0,0xA6,0x0E,0x37,0x52,0xCD,0xF1, + 0xD2,0xF7,0x97,0xEE,0x97,0x22,0xB5,0xAA,0xD2,0xF7,0x57,0x73,0xBC,0xD9,0xFB,0xAB, + 0xB0,0xCE,0xA6,0x61,0xA8,0x09,0xD7,0x1A,0x7E,0x5A,0x52,0xD2,0x4A,0xDF,0x08,0x82, + 0x30,0x23,0xDD,0xE2,0xB2,0x4B,0x0F,0xA5,0xAB,0x74,0x3A,0xDD,0x57,0x4A,0xDD,0x62, + 0x44,0xC4,0xF5,0x2E,0x3B,0x82,0x61,0x05,0x65,0xD6,0x45,0x00,0x1C,0x05,0x05,0x23, + 0x31,0xFC,0x74,0xE1,0xD0,0xE1,0x56,0x16,0x19,0x06,0x42,0x09,0x78,0x8A,0x96,0x99, + 0x5D,0xF0,0x28,0xE1,0x59,0x6A,0x01,0xD3,0xA7,0x1A,0xEA,0xC5,0x99,0x53,0x72,0x60, + 0x6C,0x0E,0x83,0xF2,0xB8,0xD3,0xB1,0x5D,0x26,0xA6,0x4E,0x9D,0x2A,0x46,0xBD,0x95, + 0xC0,0x17,0x20,0xED,0x43,0x03,0xB8,0x4E,0x88,0x4E,0x7A,0x5A,0xD0,0x10,0x5C,0x73, + 0xE6,0x48,0xD3,0x43,0x6A,0x51,0x63,0xBF,0xFF,0x3B,0x75,0x29,0xF8,0x5E,0xDC,0x96, + 0xB3,0xB6,0x96,0x16,0x32,0x6E,0xD5,0x13,0x14,0x7A,0x2A,0x4F,0xDC,0x56,0x73,0x7C, + 0xE2,0x97,0x0F,0x98,0x8E,0xB7,0x7C,0x0E,0x58,0x5A,0xD4,0x84,0xCF,0xE7,0x51,0x50, + 0x63,0x95,0xB8,0x6D,0xEF,0x78,0x5D,0x5B,0x33,0x25,0x7F,0x72,0x87,0xE9,0x78,0x3C, + 0xD7,0x30,0xFC,0x56,0xB3,0xBF,0x55,0xFA,0x38,0x9D,0x3C,0xC4,0x90,0x8E,0x09,0xE1, + 0x29,0x06,0xBD,0x5A,0xE9,0xAB,0x52,0x7D,0x17,0xAA,0x5F,0x57,0x33,0x57,0xFB,0xEE, + 0xEE,0x86,0xE5,0x91,0xDE,0x16,0xFF,0x57,0x80,0x45,0xC4,0xEB,0xCE,0xBA,0x56,0x68, + 0x52,0xCC,0xEC,0xFA,0x83,0xF9,0x38,0x32,0x78,0xF5,0xD5,0x57,0x6D,0x5A,0x64,0xD4, + 0xF1,0x92,0xAB,0xAE,0x89,0x6B,0xB6,0xB3,0xA3,0xD8,0x46,0x4C,0x0A,0x8E,0xF7,0xD2, + 0x9C,0x66,0x5B,0x60,0xF0,0x5D,0x29,0x0B,0x0C,0x6E,0x0C,0x16,0xA7,0x56,0x02,0x7D, + 0x68,0x69,0x94,0x1B,0x20,0x3A,0x79,0xE3,0x9F,0x3F,0xF6,0x68,0x2E,0xF7,0xB9,0x5E, + 0x13,0xA8,0x72,0xCE,0x12,0xD3,0x03,0x22,0x01,0x10,0x19,0x84,0xDC,0x75,0xD3,0x1B, + 0x62,0x1B,0x58,0x5A,0x5B,0xA9,0x75,0x74,0xF4,0x78,0x1C,0x8B,0xD7,0x48,0x8F,0x97, + 0x3E,0x0F,0xA4,0xD6,0x14,0xC7,0x87,0x97,0xEE,0xA1,0xAE,0x5B,0xFF,0xCD,0xF6,0xD8, + 0x3E,0x3E,0x6A,0xF7,0xA7,0x14,0x7C,0xBA,0xC4,0xEC,0xF8,0xBA,0xCB,0x16,0x9A,0xFD, + 0xAD,0xD2,0x47,0xF1,0xA4,0x3F,0x19,0x0E,0xC2,0x70,0x94,0x0D,0xDE,0xCE,0x6B,0xA2, + 0x02,0xE1,0xBC,0xD0,0xE1,0x6A,0xDB,0x71,0xB1,0x8D,0x24,0xF7,0x10,0x7F,0xB8,0x92, + 0xBF,0x8D,0x5C,0x6B,0xA4,0x68,0x66,0xF5,0xE9,0x65,0x12,0x25,0x8C,0x07,0x82,0x5D, + 0x55,0x55,0x86,0x9B,0x96,0x1C,0x28,0xFD,0x63,0x2C,0x19,0x2D,0x65,0xC9,0x92,0x25, + 0x02,0x44,0x2E,0xED,0x3F,0x77,0x26,0x36,0xCD,0xB1,0x2B,0x6B,0x34,0x3B,0x03,0xDC, + 0x15,0x39,0x57,0xDB,0xC8,0xAD,0xB7,0xDE,0x6A,0x53,0xD0,0xB8,0xB3,0xE2,0x8B,0xA9, + 0xAC,0xAC,0x34,0x5D,0x18,0xA8,0x25,0x06,0x97,0x2A,0x36,0xB5,0x27,0xDB,0xE3,0x1D, + 0x8C,0x22,0x33,0x8A,0x14,0x48,0xAD,0xAD,0xA5,0x65,0x34,0x1E,0x6F,0x14,0x29,0x70, + 0xF4,0x78,0xE9,0x31,0x96,0x56,0xD9,0x78,0x3C,0x44,0x2A,0x67,0x9D,0x2D,0xAD,0xB2, + 0x51,0xC4,0xD2,0xE3,0x6D,0xD1,0x72,0x86,0x05,0x8C,0x60,0x99,0x6D,0x71,0xA6,0x95, + 0x56,0x9E,0x09,0x26,0x93,0xAB,0x6D,0xCF,0xC5,0xB6,0x00,0x09,0x29,0xCE,0x80,0xD9, + 0x4F,0x33,0xEF,0x7F,0xD5,0x2C,0xD7,0x1A,0x53,0x6C,0xDF,0x7F,0xFF,0x7D,0x71,0xB8, + 0x53,0x09,0x78,0x84,0x33,0x67,0xCE,0x94,0x15,0xAB,0x56,0x02,0x5F,0x46,0xEC,0x88, + 0xD9,0x3D,0xC1,0x06,0xB5,0xE0,0x0E,0x87,0x29,0x91,0xD2,0x99,0x52,0x96,0xD8,0x13, + 0x34,0xBE,0x98,0x77,0xDF,0x7D,0xD7,0xCC,0x5D,0x87,0x4B,0x75,0xCD,0x43,0x6F,0x53, + 0xDF,0xD1,0x57,0xB2,0x3D,0xEE,0x23,0xB8,0xA1,0x8A,0x22,0x8A,0xB7,0x9B,0x3D,0x22, + 0xF3,0x56,0x99,0x04,0x0C,0xA4,0xD6,0xD3,0x68,0x6D,0xA5,0x56,0x51,0x2A,0x78,0x60, + 0xEF,0x78,0xA9,0x80,0x81,0xF4,0x78,0xE3,0x71,0x96,0x56,0xD9,0x78,0xBC,0x54,0xA8, + 0x40,0xEE,0x78,0xA9,0x80,0x71,0x7C,0xB7,0x9F,0x5E,0xB6,0xFA,0x1B,0x2D,0x1F,0x89, + 0xC4,0x04,0x51,0x5B,0x61,0xF8,0xA9,0x48,0x3B,0x7D,0x5A,0xDA,0x66,0x72,0xB5,0xE1, + 0x62,0x17,0xE4,0xD5,0x0B,0x36,0x5D,0x6C,0xC0,0xDE,0x37,0x3A,0x22,0x58,0xFC,0xE9, + 0x08,0x17,0xDF,0xF8,0x08,0x5D,0xFA,0xEB,0xC7,0x29,0x33,0x2B,0xC3,0x24,0x4A,0xA4, + 0x68,0x42,0xC8,0x4A,0xE3,0xC8,0x40,0x9A,0xDD,0x65,0x09,0x86,0x52,0x31,0x44,0xD5, + 0xD9,0xC3,0x51,0x52,0x4C,0x27,0xF2,0x8F,0x4F,0x0A,0x84,0x35,0xDB,0xCD,0xBF,0x88, + 0x87,0x6E,0xCA,0xA1,0xCB,0x47,0x75,0x4C,0xFF,0xF2,0x06,0x48,0x68,0xBF,0xFD,0xF6, + 0xDB,0x11,0xD8,0xB2,0xF9,0x7B,0x11,0xC5,0xB6,0x5C,0x1A,0x56,0x0A,0x86,0x10,0x2C, + 0x27,0x67,0x54,0x94,0x55,0x0A,0xC7,0xF6,0x6D,0xA2,0x1F,0xDE,0x7F,0xC6,0xEB,0x13, + 0x34,0xAA,0xAF,0x79,0xC5,0x64,0xF9,0x20,0xF6,0x73,0x39,0x97,0x9A,0xC4,0x99,0xB0, + 0xFC,0x01,0x33,0x31,0x83,0x8A,0xB9,0x9F,0x8B,0xD6,0x12,0x58,0x1E,0x9F,0xF2,0xFE, + 0x6C,0x33,0x31,0x03,0xE9,0xF1,0x51,0xFB,0x57,0x50,0xE3,0xC0,0x8E,0xC2,0x0F,0x96, + 0xC7,0xE3,0x7D,0xCA,0xE6,0x7D,0x27,0xDE,0x24,0x80,0xF4,0x78,0x88,0x37,0xED,0xCD, + 0xCB,0x55,0x59,0x63,0x4B,0x9E,0xF9,0xE2,0xA0,0xC1,0x72,0x7E,0x54,0x68,0xDB,0x42, + 0xC7,0x84,0x53,0xC1,0xA5,0xA1,0xB4,0xF2,0x87,0x66,0xEA,0x7B,0x69,0x38,0xE5,0xFF, + 0xD0,0x40,0x0B,0xEC,0x0D,0x21,0xBF,0xF9,0x7B,0xA2,0xD5,0xEF,0xD1,0xCC,0xE1,0x69, + 0x34,0xB2,0x77,0x3C,0xDB,0x69,0x1B,0x04,0xBA,0x7E,0xB5,0xE0,0x4D,0xEA,0x3B,0xE0, + 0x42,0xB3,0x6B,0xC9,0xD6,0xA4,0x09,0x23,0x70,0x9F,0xE5,0x5C,0x6B,0x23,0xFA,0x6B, + 0x4B,0xB8,0xFA,0xEA,0xAB,0x69,0xCE,0x9C,0x39,0x5E,0xD5,0x87,0x2D,0x4C,0x96,0x39, + 0x39,0xAE,0xF3,0xFB,0xCC,0x00,0x77,0x3A,0x0C,0xC0,0x63,0x20,0x9E,0xED,0x92,0x05, + 0x77,0x4C,0x5B,0x51,0x6E,0xA4,0xE0,0xA1,0xFF,0xBD,0x7D,0xFB,0x76,0xD3,0xFB,0xA4, + 0xA4,0x25,0xE9,0xC6,0x4E,0x9B,0x25,0xF6,0xA3,0x3B,0xCB,0xED,0x06,0xC8,0xDE,0x32, + 0x0A,0xD3,0xD2,0x2A,0x1B,0x51,0x3A,0xDE,0xD2,0x2A,0x1B,0x31,0xB3,0xE6,0x12,0x21, + 0xCB,0x1D,0x6F,0x69,0x9D,0xA5,0xC7,0xAB,0x75,0xAB,0xE5,0xC8,0x4C,0x88,0x34,0x6C, + 0xFC,0xFC,0x8D,0xE1,0xA7,0x12,0x46,0x57,0x7B,0x64,0xB8,0xDE,0xC5,0x0E,0xD1,0x7D, + 0xAA,0x26,0x17,0x84,0xBD,0xA7,0xDA,0x49,0x17,0x99,0x17,0x8E,0xA5,0x9B,0xFE,0xF4, + 0x5F,0x2B,0x21,0xE3,0xBA,0xB2,0x27,0x64,0x44,0xAD,0x6D,0x09,0xD9,0x38,0x1C,0xA5, + 0x25,0x21,0x03,0x9B,0x6E,0x76,0x67,0xA1,0x34,0x4C,0x65,0x09,0xA2,0xDC,0xB6,0xC6, + 0xA1,0x21,0x68,0x2C,0x19,0x22,0x5D,0xFE,0x06,0xA0,0x1F,0xED,0x29,0xB7,0x5B,0x09, + 0x35,0xA2,0x95,0xA2,0x46,0xB4,0x52,0x1C,0x3D,0x5E,0x4E,0xB4,0x96,0x22,0x77,0x94, + 0x81,0x99,0x5D,0x0D,0x1B,0xF6,0xC4,0x6C,0x74,0xB5,0xBB,0x86,0xE8,0xE0,0x62,0x6F, + 0x61,0x7B,0x15,0xC1,0xFB,0xE9,0xDD,0x6C,0x4C,0x87,0x54,0x33,0x25,0x12,0x6E,0xF5, + 0xF4,0x7B,0x9E,0x33,0x5B,0xD0,0x0D,0x20,0x60,0x65,0xB9,0x6E,0xB2,0x14,0x63,0x42, + 0x88,0xBD,0x35,0xA1,0xDE,0x7C,0xF3,0xCD,0x4E,0x4F,0xDD,0x94,0xC3,0xA6,0x98,0x6B, + 0x3D,0x54,0x07,0xCC,0x1E,0xB0,0xBA,0xA8,0xD8,0x00,0x77,0x88,0xED,0x52,0x04,0xE3, + 0xD0,0x88,0x82,0x2B,0xA5,0x7E,0x02,0x54,0x03,0xC5,0xD0,0x83,0xB4,0x1F,0x9D,0xD9, + 0x33,0x43,0x37,0xF9,0xE6,0x47,0x69,0xEA,0x5D,0x7F,0xF5,0xDA,0x78,0xB4,0xA5,0xB0, + 0x94,0x04,0x6E,0xC4,0xF2,0x78,0x25,0xC1,0x1A,0x71,0xE4,0x78,0x39,0xE1,0xBA,0x62, + 0x95,0x41,0xFF,0xF4,0xAE,0xE2,0x2C,0x27,0x51,0x7C,0x98,0x9F,0x6C,0x83,0x2D,0x79, + 0x0D,0x44,0x2B,0xEA,0x84,0x9C,0x3C,0x15,0x89,0x49,0xCB,0x9E,0x17,0x7F,0x8C,0xEC, + 0x1D,0x27,0xFE,0x54,0x02,0x6E,0xF5,0x4D,0x4F,0x7E,0x46,0x93,0xAF,0x9B,0xAB,0x4B, + 0xD3,0x7B,0x61,0x6C,0xB7,0xD8,0x3F,0x7E,0xE1,0x85,0x17,0x04,0x5C,0x53,0x4A,0xA0, + 0xFF,0x8B,0x6E,0xD9,0xA0,0x41,0x83,0xEC,0x5A,0x5B,0xE4,0x61,0x63,0xFE,0xB2,0xD6, + 0xB0,0x29,0x66,0x6F,0x65,0x80,0xC9,0x81,0x3B,0x1F,0x3E,0x34,0x35,0xC0,0x35,0xB7, + 0x95,0xCB,0x0D,0x30,0xF4,0x80,0xC0,0x98,0x9C,0xDB,0x3D,0xE7,0xE9,0xCF,0x29,0x39, + 0xCB,0xC6,0x3C,0x5B,0x37,0x01,0x61,0x45,0xFF,0xB2,0xD4,0x14,0x34,0xEA,0xB6,0xC1, + 0xF6,0xB2,0x25,0x10,0x23,0xFA,0xCB,0xC6,0xE3,0x95,0xAC,0xAC,0x11,0x47,0x8F,0x87, + 0x78,0x23,0x8E,0xE7,0x76,0x1C,0xEF,0x82,0x55,0x06,0xD1,0x11,0x21,0x34,0x36,0x87, + 0xF5,0x67,0xD1,0xC7,0x65,0x85,0x06,0x5C,0xE2,0x87,0x8F,0xC5,0x1B,0x03,0xDE,0xDB, + 0x56,0x5F,0x19,0x4B,0x01,0xCB,0xB9,0xD5,0x6B,0xD7,0xAE,0x15,0xA7,0x30,0xCA,0xAD, + 0x38,0x61,0xC4,0x98,0x6B,0x2D,0x8D,0xAF,0x28,0x81,0xE0,0x2C,0x82,0xB4,0x5A,0x19, + 0x8E,0x92,0x62,0x3A,0xA1,0x0F,0x56,0x17,0x0A,0x1F,0xAE,0x29,0x66,0x2D,0x03,0xB7, + 0x4C,0xCB,0xA4,0xDB,0xA6,0xF7,0xEC,0xB4,0x93,0xCE,0xCA,0xCA,0x12,0xB6,0x6C,0xD9, + 0xA2,0xFA,0x83,0xC3,0x50,0x03,0xBE,0x38,0x5B,0x11,0x4A,0x80,0x9A,0xDD,0x28,0xF5, + 0xCB,0x9A,0x22,0xA5,0x25,0xA7,0x84,0x93,0x87,0x77,0xD0,0x4F,0x1F,0x3F,0x4F,0x67, + 0xEB,0xDD,0x9B,0x03,0x1C,0x48,0x20,0x00,0xF6,0xCF,0xD5,0x05,0x54,0xD7,0xD8,0xAA, + 0xF7,0x77,0xAF,0x23,0x7A,0xC8,0x85,0x1B,0xC4,0xE1,0xED,0x44,0x4F,0xCC,0x20,0x6A, + 0x6D,0x56,0x0C,0x7C,0x61,0xEC,0x18,0x8B,0xF4,0x63,0x6D,0x6F,0x2C,0x09,0xCC,0x76, + 0x8B,0xD8,0x9A,0x1B,0x6F,0x04,0xF1,0x19,0xCC,0xD2,0x93,0xCE,0x91,0xB7,0x85,0x5E, + 0xC8,0x18,0x97,0xF6,0xE8,0xA2,0xE9,0xCE,0x62,0xB2,0xCC,0x9E,0x5C,0x70,0xDD,0x59, + 0x60,0x6D,0x31,0x7C,0xA0,0x16,0xCC,0xB6,0x7A,0xEC,0xB1,0xC7,0x14,0x0B,0x04,0x1A, + 0x91,0x73,0xBB,0xB1,0x58,0xDD,0xA8,0x4B,0xAF,0xD4,0xE1,0xEE,0x3E,0x70,0xE2,0x8D, + 0x6C,0x2F,0xC7,0x51,0x42,0x82,0x75,0x74,0xF3,0xF8,0x1E,0x06,0x77,0x7B,0xE3,0x17, + 0x86,0x22,0x03,0xCE,0x58,0x68,0xB8,0xEA,0xCF,0xCC,0x16,0x85,0x0C,0x11,0x5B,0x0A, + 0x19,0x89,0x40,0xE8,0x1B,0xCF,0x7A,0xE8,0x2D,0xD1,0x1A,0x4B,0x85,0x0C,0xB7,0x1A, + 0x35,0xE5,0xEC,0x09,0x19,0x85,0xF7,0x90,0x79,0xA8,0x56,0xC8,0xE8,0xF6,0xC1,0x50, + 0x68,0x51,0xC8,0xC0,0x74,0x52,0xDF,0x6D,0xAB,0x10,0x5E,0x5C,0x56,0xC0,0x5A,0x06, + 0x3A,0xDB,0x32,0x43,0x6C,0x96,0x95,0x48,0xD4,0x62,0xAB,0x04,0x91,0x11,0xB8,0xE5, + 0x53,0xA6,0x4C,0xB1,0xFA,0x72,0x2A,0x2B,0x6B,0x84,0xDA,0x53,0xE5,0xF4,0xC3,0x7F, + 0x9E,0xA1,0x53,0x27,0x6C,0xF7,0xFD,0x38,0xF2,0x60,0x06,0x15,0x8A,0x0A,0x88,0xB5, + 0xBF,0x90,0xDE,0x39,0xEF,0x25,0x75,0x45,0x0A,0x20,0x7C,0x94,0x0D,0x62,0xFD,0x64, + 0x14,0xF6,0xBB,0x7E,0x4C,0xA6,0x78,0x93,0x30,0xD2,0x7B,0xF8,0x54,0xBA,0x44,0x2F, + 0xE4,0xCC,0xAC,0x8E,0x04,0x10,0x23,0x70,0xAB,0x73,0x73,0x73,0x59,0x4B,0x1E,0xA5, + 0xEF,0xDD,0x1E,0x7A,0x57,0x5C,0x98,0x38,0x71,0x22,0xDD,0x7E,0xFB,0xED,0x0E,0x5F, + 0x8F,0xDE,0xC0,0x74,0x52,0x72,0x62,0x9E,0x31,0x2E,0x95,0xEE,0x9F,0xDD,0xA7,0x53, + 0x4F,0x7C,0xDE,0xBC,0x79,0xC2,0x90,0x21,0x43,0x68,0xFE,0xFC,0xF9,0x0E,0x9F,0x07, + 0x8A,0x04,0x62,0x18,0xC2,0x9E,0xDB,0x8D,0x75,0xA3,0x31,0x1C,0x01,0xCB,0xCE,0x76, + 0x89,0xC0,0xF5,0x3E,0xB1,0x2F,0x97,0x36,0x2E,0x5B,0x44,0xCD,0x67,0x5D,0x4F,0xF0, + 0x0F,0x34,0x30,0x1D,0xF2,0xE3,0x4D,0x45,0x06,0x97,0x1B,0x40,0xCC,0x98,0x84,0x81, + 0x59,0x55,0x96,0x69,0x9F,0xFB,0xF5,0x02,0x84,0x35,0x86,0x35,0xAF,0x33,0xCC,0x89, + 0x9E,0x3C,0x20,0x49,0xFF,0x48,0x16,0xB7,0x01,0x86,0x13,0xA7,0xDD,0xF1,0x37,0x8A, + 0x4F,0xEB,0xA1,0x77,0xA9,0xE3,0xCD,0xBE,0x2B,0x7C,0xD7,0x18,0xB9,0xB0,0xD5,0x37, + 0x06,0x70,0xAB,0x11,0xB1,0xB6,0xFC,0xAE,0xED,0xE1,0x8A,0x61,0xF1,0x16,0xA6,0x13, + 0x93,0x13,0xF3,0xB4,0x91,0x29,0xF4,0xF0,0x1C,0xFB,0x41,0x01,0x4F,0xA2,0x36,0x89, + 0xC4,0x16,0x6A,0xFA,0x4E,0x40,0x29,0xE3,0xE7,0x64,0x71,0x85,0xF0,0xCB,0xAA,0xF7, + 0x68,0xFF,0xFA,0xCF,0x78,0x35,0x50,0x07,0x41,0x1F,0x7A,0x63,0x5E,0x25,0x6D,0xC9, + 0xAF,0xB1,0x9E,0xBE,0x88,0x79,0xCF,0xA7,0x8A,0x88,0x1A,0x4F,0xB3,0x1D,0x06,0x30, + 0x96,0x7C,0xC5,0x45,0xA9,0x62,0x85,0x4E,0x80,0x28,0xF5,0xC8,0x99,0xF3,0x28,0x67, + 0xC4,0x34,0x7D,0x77,0x28,0xD1,0xEA,0xFB,0xC1,0xAC,0x39,0x5B,0xB3,0x9D,0x8C,0xC0, + 0xAD,0x76,0x76,0x6C,0x18,0x69,0xC2,0xD2,0xD2,0xD0,0x5A,0xC4,0x74,0x62,0x9B,0xF6, + 0x55,0x09,0x4F,0x2F,0x31,0x1F,0xC6,0xD0,0x82,0x98,0x81,0x3B,0x6A,0x11,0xAB,0x71, + 0xBB,0x01,0x22,0x9B,0x70,0xC1,0xE4,0xC6,0x1A,0x4B,0x4A,0x2A,0x85,0x03,0x1B,0x3E, + 0xA7,0x5D,0x6B,0xDE,0xE7,0x96,0xDA,0x41,0x30,0x41,0x02,0x53,0x24,0x31,0xE7,0x19, + 0x3F,0x2D,0x73,0xAC,0x31,0x7E,0x0C,0x97,0x7A,0x50,0x8F,0x6E,0x26,0x11,0x63,0x86, + 0xD3,0xB8,0xEB,0xEE,0xA7,0xCC,0x81,0xE3,0xA9,0x7B,0x9A,0xB9,0x25,0x06,0x48,0x00, + 0x81,0x4B,0xAD,0x54,0xA3,0xCB,0x08,0xDC,0x6A,0xE4,0x23,0xD8,0x1B,0x3F,0xB6,0x05, + 0x8A,0xF5,0xE9,0x0D,0x8B,0x26,0xA3,0xD8,0x46,0x4C,0x27,0xB6,0xE7,0x48,0x9D,0xF0, + 0xC8,0xEB,0xFB,0x59,0xCB,0x80,0x56,0xC4,0x8C,0xD4,0x4D,0x0C,0x53,0xE9,0x5D,0x66, + 0x97,0xCE,0x45,0xAD,0xDB,0x0D,0x10,0x44,0xC3,0x05,0x20,0xE7,0x8E,0xC1,0x52,0x1F, + 0xDE,0xFA,0x35,0xED,0xFA,0xEE,0x03,0x1E,0xF9,0xF6,0x00,0x88,0x50,0x0F,0xBF,0xE2, + 0x0E,0xCA,0x1C,0x30,0x96,0xBA,0x77,0xB7,0xB6,0xC4,0x08,0x70,0xAD,0x5E,0xBD,0x5A, + 0x1C,0x6E,0xB4,0x07,0x8A,0xEE,0x59,0x56,0x06,0x71,0x14,0x77,0x5D,0x7F,0x9E,0xC6, + 0x74,0x72,0x72,0x62,0x1E,0x37,0x30,0x81,0x9E,0xBA,0xC3,0xFB,0xCB,0x6C,0xC8,0xA1, + 0x77,0x81,0x85,0x25,0x4B,0x96,0xB8,0x25,0xB1,0x1D,0x63,0x85,0x58,0x69,0x52,0x0D, + 0x98,0xFE,0xA6,0x34,0x6B,0xA6,0x44,0xDF,0xA7,0x3E,0xB2,0x63,0x1D,0xED,0x5C,0xB5, + 0x84,0xCE,0xD4,0x94,0xB2,0xBD,0x1C,0x67,0xC1,0x58,0xFF,0x98,0x6B,0xEE,0xA5,0xE4, + 0x1E,0xFD,0xC4,0xD1,0x05,0xB6,0xDB,0x04,0xFA,0xAD,0xC8,0xE0,0x52,0xFB,0xDD,0x61, + 0x3C,0xD8,0x1D,0xEB,0x23,0x4F,0x9A,0x34,0x49,0x40,0xE1,0x49,0x5B,0x29,0x9E,0x5A, + 0xC0,0x74,0x72,0x72,0x62,0x1E,0xD2,0xA7,0x1B,0xBD,0x70,0xAF,0xFD,0x8C,0x18,0x6F, + 0x80,0xB9,0xCA,0x7B,0xF6,0xEC,0x41,0x2A,0x9D,0x5B,0xCE,0xC7,0x91,0xBB,0x3B,0xDC, + 0x34,0x5B,0x53,0xE1,0x4A,0x4B,0xAB,0x84,0xE2,0x03,0x5B,0x08,0xFD,0xEA,0xAA,0x93, + 0xF9,0x6C,0x2F,0x47,0x2D,0x59,0x83,0x27,0xD1,0xA8,0x19,0xBF,0xA1,0xAE,0x49,0xDD, + 0x65,0x45,0x8C,0x72,0x52,0x70,0xA7,0xD5,0xF4,0x8B,0x01,0xBC,0x2A,0x04,0x34,0xDD, + 0xE1,0x12,0xBB,0x23,0x66,0xE3,0x2D,0x4C,0x27,0xA8,0x75,0x31,0x03,0x47,0x93,0x48, + 0xD4,0xB0,0x71,0xE3,0x46,0xF1,0x6E,0x6F,0xAF,0xDF,0x65,0xC4,0xD6,0xB4,0x38,0x44, + 0xBF,0x5B,0x9A,0xCE,0xD1,0x7E,0x7D,0xBF,0x3A,0x6F,0xF3,0x57,0xDC,0x05,0xB7,0x01, + 0x22,0xD3,0xC3,0xA6,0xDF,0xAE,0x17,0xF2,0x44,0xFD,0xCD,0x52,0x27,0x16,0x64,0x64, + 0x4F,0x99,0x80,0x88,0xF1,0xDD,0xD8,0x4A,0xC3,0x94,0x82,0x78,0x07,0xBA,0x46,0xEE, + 0x9C,0x96,0xD8,0xD9,0xAB,0x54,0x38,0x82,0xE9,0x04,0x51,0x23,0xFB,0xB6,0xBF,0xEE, + 0x60,0x2D,0x03,0x5A,0x13,0x33,0x12,0x01,0x4E,0x9F,0x3E,0x4D,0xCF,0x3F,0xFF,0xBC, + 0xDB,0xCF,0x49,0x6D,0x44,0xD4,0x08,0x44,0x8D,0x59,0x5B,0x4A,0x09,0x07,0xA5,0x65, + 0x35,0x42,0x4D,0x49,0x01,0xED,0xFF,0xE9,0x4B,0x3A,0xBA,0x63,0x2D,0x8F,0x82,0xEB, + 0x41,0x54,0x1A,0x63,0xC4,0x43,0xA7,0xDD,0x46,0x61,0x11,0x51,0xB2,0x91,0x69,0x80, + 0xD8,0x06,0x44,0x6C,0xAB,0x8C,0x8F,0x25,0xB6,0xBA,0x43,0xAE,0xD0,0xD9,0xAB,0x54, + 0x38,0x82,0xE9,0x24,0x7D,0x41,0xCC,0x9E,0x1E,0xEB,0x83,0xEB,0x8D,0xB1,0x4A,0x5B, + 0x95,0x27,0x2C,0xC1,0x70,0x87,0xAD,0xD2,0x31,0x55,0x95,0xB5,0x42,0x8B,0xDE,0xE8, + 0x17,0xEF,0xCF,0xA5,0xBD,0xEB,0x3F,0xA5,0xB2,0x82,0x9D,0xEC,0x99,0xC0,0x00,0x93, + 0x58,0xB2,0x86,0x5C,0x42,0x43,0x2E,0x9B,0x43,0xF1,0xE9,0x39,0xB2,0x51,0x69,0x23, + 0xCE,0x88,0x58,0x29,0x47,0xC0,0x1D,0xF8,0xC2,0x70,0x94,0x14,0xD3,0x49,0xCA,0x89, + 0xD9,0xD3,0xCB,0xBA,0x3A,0x83,0x37,0xDC,0x1E,0x0C,0x79,0x60,0x18,0x4B,0x4D,0xD4, + 0xDB,0x08,0x2E,0x2A,0x58,0x07,0x5B,0xC3,0x1F,0x65,0x25,0x95,0x42,0x9B,0x20,0x50, + 0xC5,0xD1,0x3D,0x74,0x7C,0xCF,0x4F,0x54,0x7A,0xE4,0x17,0xAA,0x2B,0x2F,0x64,0xCF, + 0xFA,0x0F,0x08,0x64,0x75,0xEF,0x3B,0x8C,0x7A,0x5D,0x34,0x51,0x2F,0xE0,0xBE,0x14, + 0x12,0x24,0x58,0x25,0x79,0x48,0xC1,0xE7,0x8D,0x42,0x13,0x8E,0xDC,0x44,0xA3,0xA3, + 0xA3,0x45,0xCF,0xC8,0xD1,0x2C,0x2E,0x47,0xD0,0xDF,0xA8,0x85,0xE5,0xCB,0x97,0x77, + 0xCA,0x5A,0xCB,0xCE,0x60,0x3A,0x49,0x5F,0x11,0xB3,0x37,0x03,0x12,0xCE,0x88,0x1A, + 0xC0,0x5A,0x63,0x32,0x87,0xAD,0xE9,0x74,0xD5,0xD5,0xA7,0x85,0xE6,0xA6,0x56,0x6A, + 0x17,0xDA,0xA9,0xE4,0xD0,0xCF,0x74,0x7C,0x5F,0x2E,0x95,0xE5,0xEF,0xF4,0xC9,0xA8, + 0x38,0x86,0x92,0xD2,0x72,0x86,0x51,0xB6,0x5E,0xBC,0xA9,0xBD,0x86,0x50,0xBB,0xBE, + 0x4B,0x21,0x17,0xC8,0x92,0x82,0xD9,0x6B,0x10,0xB0,0x9A,0x64,0x1E,0x29,0xDE,0x10, + 0x31,0xF0,0x95,0xE1,0x28,0x29,0x66,0x27,0x6A,0xB9,0xAC,0xAB,0x16,0xC5,0x0C,0xBC, + 0xBD,0xA0,0xB5,0xB3,0xA2,0x46,0x40,0x06,0xA2,0x46,0xFF,0xDA,0x9E,0x1B,0x28,0xBA, + 0xE3,0xAD,0x6D,0x74,0xBE,0xB5,0x59,0x14,0x75,0xE9,0x91,0xDD,0x62,0x64,0xFC,0x74, + 0x45,0xA1,0xA6,0x02,0x69,0x08,0x5C,0x75,0x89,0x49,0xA0,0xF4,0xBE,0xC3,0x45,0xEB, + 0x9B,0xDC,0x73,0x10,0x91,0xD0,0x6A,0x57,0xBC,0x00,0x6E,0x34,0x26,0xB9,0xE0,0xE1, + 0x28,0x48,0xC3,0x84,0x88,0x5D,0x49,0xFC,0x70,0x04,0x6F,0x5F,0x63,0xEE,0xC0,0xEC, + 0x44,0x7D,0x45,0xCC,0xC8,0xE6,0x42,0x25,0x92,0xD5,0xAB,0x57,0x7B,0xF5,0xDC,0x50, + 0xC4,0x0D,0x43,0x24,0xF6,0xF2,0x7F,0xE5,0xC0,0xC5,0x08,0x61,0x67,0x65,0x65,0xA9, + 0x9A,0x37,0x0B,0xE0,0x96,0x0B,0x41,0xC1,0x62,0xBF,0xB3,0xB6,0xA4,0x80,0x1A,0x4F, + 0x57,0x52,0xC5,0x89,0x03,0x54,0x71,0x7C,0x3F,0x9D,0xD3,0x0B,0xDC,0x93,0xC3,0x60, + 0xB0,0xB4,0x08,0x58,0xC5,0xA5,0x66,0x51,0x8F,0x01,0x63,0x45,0x01,0x47,0xC7,0xA7, + 0x51,0x5B,0xCB,0x39,0xFD,0x45,0x23,0x50,0x5A,0xBA,0xBA,0x99,0x46,0xFB,0xF6,0xED, + 0x13,0x8B,0x02,0x60,0x6C,0xD8,0xD9,0xCF,0x0D,0x31,0x09,0x6F,0x16,0xCE,0xC3,0x4D, + 0x47,0x2F,0x62,0x9C,0xB3,0xE6,0xAE,0x7D,0x5B,0x98,0x9D,0xAC,0xAF,0x88,0x19,0xB8, + 0x33,0x89,0xC4,0x51,0x5C,0x11,0xB5,0x11,0x8C,0x85,0x42,0xD8,0x8E,0x88,0xDB,0x48, + 0x59,0x99,0x5E,0xE4,0xED,0x02,0x05,0x87,0x19,0xEA,0x61,0x35,0xD4,0x94,0x51,0xEB, + 0x39,0xF3,0x73,0x39,0x5D,0x59,0x4C,0xD5,0xA5,0x47,0x59,0xCB,0x1A,0x58,0xD5,0x88, + 0x2E,0xAC,0xCC,0x0F,0x23,0x32,0x2E,0x89,0xC2,0x23,0x63,0xC5,0xED,0xF6,0x96,0xB3, + 0xFA,0x9B,0x48,0xB0,0xCD,0xBE,0xAE,0x1C,0x10,0x02,0xC4,0x8B,0x87,0x23,0x81,0x2C, + 0x4B,0x10,0x83,0x40,0xD2,0x47,0x67,0x7C,0xBF,0xBE,0x34,0x1C,0x25,0xC5,0xEC,0x64, + 0x2D,0xC5,0x1C,0xDD,0x25,0x84,0xBE,0xFC,0xAB,0xF9,0x32,0x97,0x5A,0x01,0x59,0x5C, + 0x5F,0x7D,0xF5,0x15,0x8A,0xF6,0x75,0xDA,0xF9,0x39,0xDB,0xEF,0x93,0xC3,0x28,0x6C, + 0x3C,0xB2,0xB3,0xB3,0x7D,0xE6,0x22,0xC2,0x08,0x00,0x84,0x8B,0x61,0x3D,0x57,0xC4, + 0x6B,0x04,0xF1,0x06,0x74,0x4B,0x3A,0x33,0xE8,0xE4,0x4B,0xC3,0x51,0x52,0xCC,0x4E, + 0xD8,0x52,0xCC,0x60,0xCD,0x4B,0x13,0x34,0xFB,0x47,0xE9,0x2F,0x7C,0xB7,0x27,0x91, + 0x38,0x0B,0xE6,0xD1,0xA2,0x2F,0xE8,0x48,0x44,0xD6,0x16,0x70,0x2F,0xF1,0x80,0x05, + 0x47,0xD0,0x07,0x96,0xAA,0x33,0x45,0x8E,0x04,0x0E,0xDC,0xB4,0xE0,0x8D,0x40,0xB4, + 0xC8,0x9C,0x73,0xC5,0x33,0x91,0x82,0xFC,0x69,0x58,0x61,0x6F,0xF5,0x87,0x6D,0xE1, + 0x6B,0xC3,0x51,0x52,0xCC,0x4E,0xD8,0xD7,0xC4,0xAC,0xC5,0x0F,0x1E,0x17,0x3D,0xAC, + 0x35,0x84,0xAD,0x36,0xAB,0xCC,0x51,0x60,0xBD,0x21,0x70,0x88,0x00,0x41,0x36,0x08, + 0x5D,0x0A,0x9E,0x53,0x53,0x3D,0x03,0x65,0x96,0x2C,0xCF,0x11,0x56,0x16,0x40,0xB8, + 0x08,0xF8,0xB9,0xC3,0xEB,0x90,0x03,0xE7,0x88,0x18,0x02,0x86,0xF3,0xD4,0x56,0xFA, + 0xF0,0x06,0x9D,0xD9,0x7D,0x73,0x15,0xB3,0x13,0xBE,0xF1,0xC9,0x6D,0x82,0xE5,0xCA, + 0x8F,0x5A,0x16,0xB3,0xD6,0x27,0x8C,0x63,0x18,0x0D,0xA2,0x76,0x24,0xB3,0xCC,0x9F, + 0x41,0x8E,0xBB,0x71,0xD8,0x4E,0x8B,0x63,0xB7,0x18,0xB5,0x78,0xFA,0xE9,0xA7,0x69, + 0xFD,0xFA,0xF5,0x3E,0x27,0x64,0x60,0x76,0xD2,0xB7,0x3E,0xBB,0x43,0xA8,0xA8,0x31, + 0x1F,0x7E,0xD1,0xB2,0x98,0x81,0xAF,0x04,0x2B,0x20,0x6C,0x63,0x60,0xC8,0x5D,0xAE, + 0xB8,0x2F,0x00,0xAF,0xC1,0x18,0x0B,0xD0,0x7A,0xF2,0x85,0x2F,0x0E,0x47,0x49,0xF1, + 0x79,0x31,0xFB,0xEA,0x30,0x82,0xBF,0x8A,0x1B,0xAE,0xBF,0x51,0xBC,0x6A,0x6A,0x50, + 0x6B,0x05,0x78,0x79,0x7A,0xD7,0x1A,0xF1,0x00,0x9F,0x14,0x32,0xF0,0x79,0x31,0x03, + 0x5F,0xBF,0xA3,0x02,0xA3,0xB8,0xD1,0x47,0x55,0x33,0x2D,0x53,0x2B,0xC0,0xF2,0x1A, + 0x87,0xD9,0x7C,0x49,0xBC,0x96,0xF8,0xEA,0x70,0x94,0x14,0xBB,0x62,0xFE,0xE0,0x8F, + 0x23,0x28,0x35,0x21,0x42,0xD3,0x7F,0x20,0xC6,0x7D,0xF5,0x5F,0x02,0x6D,0xDD,0xBA, + 0xD5,0x67,0xBF,0x08,0x4B,0x60,0x29,0x10,0x2D,0x86,0xB8,0x61,0xB9,0xF1,0xC0,0xB6, + 0xA7,0x82,0x6A,0xB6,0x30,0x06,0xD9,0x60,0x75,0x11,0xB8,0x82,0x70,0xD5,0x06,0xD9, + 0x7C,0x05,0xFD,0xDF,0xA4,0x99,0x91,0x11,0x67,0xF1,0x0B,0x31,0x03,0x5F,0x8E,0x42, + 0x3A,0x0A,0x22,0xE6,0xD2,0xA1,0x21,0xFC,0xB4,0xB4,0xE6,0x72,0xFB,0xA4,0xC0,0x9A, + 0x22,0x20,0x25,0x45,0xBA,0xCF,0x38,0x34,0xE6,0x4B,0x63,0xDE,0xCE,0x82,0x35,0xA8, + 0x36,0x6C,0xD8,0x80,0x1A,0xED,0x3E,0xFD,0xB7,0xFA,0x8D,0x98,0x7D,0x31,0x31,0x9E, + 0xA3,0x0D,0xFC,0xC5,0x10,0xD8,0x5C,0x6B,0xCA,0x97,0x40,0x7F,0x19,0xE3,0xBB,0x70, + 0x4F,0xD9,0x2E,0x0E,0xC7,0x2E,0xE8,0xA2,0xA1,0x1B,0xE1,0x0F,0x1E,0x9D,0x99,0x98, + 0x53,0xE3,0xBD,0xB3,0x1A,0xA2,0xA7,0xC0,0x52,0xB0,0x8B,0x16,0x2D,0x62,0x2D,0x0E, + 0xC7,0x3E,0x98,0xB0,0x83,0xEB,0xC6,0x1F,0xF0,0x1B,0xCB,0x0C,0x10,0x89,0xC4,0x02, + 0xEB,0x1C,0x8E,0x1A,0xE0,0xC5,0x61,0x6A,0xAB,0xD6,0x16,0x4D,0x77,0x16,0xBF,0x12, + 0x33,0xC0,0x62,0x73,0x48,0xF3,0x64,0x4D,0x0E,0x47,0x11,0xAD,0x2E,0x9A,0xEE,0x2C, + 0x76,0xC5,0xDC,0x70,0xCE,0xFB,0x43,0x21,0xAE,0xB0,0x70,0xE1,0x42,0xEE,0x6A,0x73, + 0x54,0x81,0x80,0xA9,0x16,0x17,0x4D,0x77,0x16,0xBB,0x62,0x6E,0x6C,0xF2,0x2D,0x31, + 0x63,0x9C,0x10,0x33,0x70,0x10,0xDD,0x66,0xBB,0x38,0x1C,0x2B,0xB4,0xBC,0x68,0xBA, + 0xB3,0xF8,0x9D,0x9B,0x0D,0xB0,0xFA,0x00,0x12,0xE6,0x39,0x1C,0x25,0xFC,0x29,0xF0, + 0x65,0xC4,0xEC,0xAE,0xF4,0xC8,0xEB,0xFB,0x84,0x3D,0x47,0xCC,0x57,0xE4,0x7B,0xE1, + 0xDE,0x81,0x34,0xA4,0x4F,0xAC,0xCF,0xDD,0xBD,0xFC,0x35,0x89,0x04,0x41,0x1B,0x6F, + 0x66,0x81,0x79,0xA2,0x84,0x6D,0x67,0xE3,0xCE,0xA2,0x90,0xE5,0xE5,0xE5,0x42,0x50, + 0x50,0x10,0x25,0x27,0xDB,0xAF,0x81,0xE6,0x69,0xCC,0x4E,0xE0,0x6F,0x4B,0x0F,0x0B, + 0xEB,0x77,0x55,0xB2,0x96,0x01,0x5F,0x15,0xB3,0xBF,0x26,0x91,0x6C,0xDA,0xBC,0x4D, + 0xF8,0xE9,0x90,0x77,0xC4,0x1C,0x1B,0xA5,0xA3,0xE1,0x39,0x51,0x34,0x6A,0xF8,0x60, + 0xBF,0xFA,0x0C,0x5D,0x59,0x34,0x3D,0xFF,0x44,0x91,0x50,0x51,0x59,0x45,0x0D,0xED, + 0x41,0x54,0xDB,0x1E,0x4C,0x05,0xAD,0xE1,0x14,0xA1,0x6B,0xA7,0xCC,0x90,0x56,0x4A, + 0x0A,0x6A,0xA5,0x88,0x90,0x20,0xEA,0x91,0x92,0x44,0x3D,0x33,0xAC,0x17,0x82,0xF7, + 0x34,0x66,0xBF,0xF0,0x1F,0x9F,0x14,0x08,0x6B,0xB6,0x57,0xB0,0x96,0x01,0x5F,0x15, + 0x33,0x40,0xBE,0xED,0x8F,0x3F,0xFE,0xE8,0x57,0x29,0x89,0x1B,0x72,0xB7,0x09,0x7F, + 0xFD,0xD2,0x7C,0xCE,0xB9,0xA7,0xC8,0x4A,0xD2,0xD1,0x5D,0xD3,0x62,0xFC,0x4A,0xCC, + 0xF0,0x6C,0x9C,0x99,0x03,0x5F,0x50,0x58,0x2C,0x14,0x95,0x57,0xD2,0x47,0x0D,0xB1, + 0xB4,0xEA,0x6C,0x0C,0x95,0xB5,0x85,0xB2,0x67,0xCC,0xE9,0x19,0xDC,0x4C,0xD7,0x45, + 0xD7,0xD3,0xCC,0xA8,0x33,0xD4,0x27,0xB3,0x3B,0x65,0xA6,0xA5,0x7A,0xED,0xB3,0xF3, + 0xCB,0x3E,0xB3,0x11,0xF4,0x89,0xD0,0x37,0xE2,0x70,0x8C,0x20,0x0F,0x61,0xD6,0xAC, + 0x59,0xAC,0xA5,0x8E,0xCD,0x7B,0x0E,0x08,0xAF,0x1C,0x6D,0xA6,0x2B,0xCA,0xB2,0xE8, + 0xBD,0x33,0xF1,0x8A,0x42,0x06,0x85,0x6D,0xE1,0xF4,0xD2,0xE9,0x24,0xFA,0x55,0x79, + 0x16,0xFD,0xE7,0x48,0x3D,0x6D,0x3B,0x98,0xEF,0xB5,0x40,0xAC,0x5F,0x8B,0x99,0x27, + 0x91,0x70,0x2C,0xC1,0xB0,0x25,0x86,0x2F,0xD5,0xB2,0xE1,0x97,0xBD,0xC2,0xEF,0x4A, + 0xE2,0xE8,0xB5,0xFA,0x44,0x6A,0x71,0x40,0x2E,0x67,0xF4,0x6E,0xF8,0x13,0xD5,0xC9, + 0xF4,0xD4,0xC9,0x2E,0xB4,0x71,0xDF,0x61,0xAF,0x08,0xDA,0xAF,0xC5,0x0C,0x78,0x12, + 0x09,0xC7,0x08,0xE2,0x28,0x8E,0x0C,0x47,0xE5,0xEE,0x3D,0x24,0x2C,0xA8,0x48,0xA4, + 0x9D,0x2D,0x91,0x6C,0x8F,0xE3,0x7C,0xAB,0x77,0xC9,0x9F,0x2B,0x8B,0xF4,0x8A,0x85, + 0xF6,0x7B,0x31,0xE3,0x2E,0xCC,0x5D,0x6D,0x0E,0x70,0x64,0x38,0xEA,0xD0,0xF1,0x22, + 0xE1,0x83,0xAA,0x70,0x97,0x84,0x6C,0x04,0x82,0x5E,0x53,0x4D,0x54,0x5C,0x56,0xEE, + 0x51,0x41,0xFB,0xBD,0x98,0x71,0x17,0x46,0x1D,0x66,0x9E,0x44,0x12,0xD8,0x60,0x38, + 0x0A,0x05,0x1E,0x26,0x4F,0x9E,0xAC,0xCA,0x2A,0x97,0x9E,0xAA,0xA2,0xF7,0xEB,0x0D, + 0x0B,0x02,0xB8,0x83,0xC5,0xB5,0xF1,0x74,0xEC,0xA4,0x67,0xD7,0x11,0xF3,0x7B,0x31, + 0x03,0x9E,0x44,0xC2,0xC1,0x30,0xA5,0xDA,0x3C,0xEC,0xBD,0x05,0xC7,0x84,0xB7,0xEA, + 0xE3,0x15,0xFA,0xC8,0x41,0xB4,0xF8,0xD2,0x6E,0x44,0xB3,0x62,0x75,0x4A,0x8F,0xB1, + 0xEC,0x48,0x29,0xD5,0xED,0x21,0xB4,0xF6,0x5C,0x0C,0x15,0x97,0x7A,0x6E,0x8A,0x6E, + 0x40,0x88,0x19,0x89,0x23,0xA8,0x9A,0x81,0x52,0xAA,0x6C,0x17,0x27,0xC0,0x40,0x20, + 0x54,0x6D,0x7D,0xAF,0xD3,0xB5,0x35,0xF4,0xFD,0xB9,0x68,0xD6,0xB2,0xA4,0x9D,0x16, + 0xFC,0x70,0x9A,0x68,0x45,0x9D,0x80,0xC7,0xDD,0x25,0x82,0xE1,0x9A,0x62,0x6D,0x3C, + 0xB6,0x88,0x3B,0xAC,0x59,0x71,0x26,0x9A,0x0A,0x2B,0x3C,0x57,0xDF,0x2D,0x20,0xC4, + 0x0C,0xF8,0x30,0x55,0xE0,0x82,0x00,0x28,0x02,0xA1,0x6A,0xA9,0x15,0x42,0x45,0x4B, + 0xEA,0x6E,0xF6,0xB7,0x76,0x21,0xA1,0xC5,0xBC,0x92,0x8F,0x3B,0x09,0x18,0x31,0xA3, + 0x12,0x09,0x56,0x22,0x44,0x69,0x5E,0xB6,0x8B,0x13,0x20,0xBC,0xF5,0xD6,0x5B,0x74, + 0xCF,0x3D,0xF7,0xB0,0x96,0x6D,0xAA,0xAA,0xAA,0x84,0xE3,0xAD,0x61,0xAC,0xE5,0x7E, + 0x2A,0x04,0xCF,0x15,0x00,0x09,0x18,0x31,0x03,0x7C,0xA1,0xF8,0x62,0x39,0x81,0x03, + 0x02,0x9F,0x58,0x45,0x43,0x6D,0x01,0xFE,0xD6,0xD6,0x56,0x2A,0x3B,0xEF,0x7E,0xAB, + 0x6C,0x04,0x16,0xBF,0xA6,0xA6,0xC6,0x23,0x06,0x25,0xA0,0xC4,0x8C,0x3E,0xD3,0x8A, + 0x15,0x2B,0x78,0x9D,0xB0,0x00,0xC2,0x91,0xC0,0x97,0xAF,0x13,0x50,0x62,0x06,0x48, + 0xE5,0xE3,0x59,0x61,0x81,0x01,0xBA,0x54,0xE8,0x5A,0x39,0xB2,0x38,0x42,0x68,0x68, + 0x28,0xA5,0x85,0x78,0x6E,0x22,0x4B,0x42,0xD0,0x79,0x8A,0x8F,0x77,0x6C,0xCD,0x6B, + 0xB5,0x04,0x9C,0x98,0x79,0x12,0x49,0xE0,0xE0,0x48,0x5F,0xD9,0x48,0x62,0x62,0xA2, + 0x2E,0x3D,0xA4,0x95,0xB5,0xDC,0x4F,0x82,0xCE,0x73,0x93,0x64,0x02,0x4E,0xCC,0x48, + 0x22,0x99,0x34,0x69,0x92,0x58,0xF8,0x9C,0xED,0xE2,0xF8,0x29,0x8E,0x0C,0x47,0x49, + 0x49,0x09,0x6A,0x11,0x2D,0xA8,0xBB,0x19,0x18,0x7A,0x8E,0x42,0xC3,0x78,0x00,0xCC, + 0xAD,0xF8,0xE2,0x30,0x15,0xA2,0xAC,0x3F,0x6F,0xDF,0x2D,0x9C,0xAC,0x61,0x3B,0xBC, + 0x40,0xD5,0x19,0xA2,0x33,0x8D,0xCD,0xB4,0x67,0x5F,0x9E,0xCF,0xDD,0xF8,0x1C,0x1D, + 0x8E,0x92,0xD2,0xB5,0x5B,0x2C,0x8D,0x09,0x6F,0x64,0x2D,0xF7,0x31,0x21,0xA2,0x91, + 0xD2,0x13,0xDC,0x97,0x55,0x66,0x49,0x40,0x8A,0x19,0x49,0x24,0x58,0x3B,0x69,0xD5, + 0xAA,0x55,0x9A,0xBF,0x48,0x8B,0x8A,0x4F,0x0A,0x9B,0xB7,0x6E,0x17,0xBE,0xDB,0x7C, + 0x8C,0xDE,0x5E,0xD3,0x48,0xFF,0x59,0xEF,0x9D,0xB9,0xCC,0xA0,0xA1,0x49,0xA0,0x45, + 0x2B,0x9A,0xE9,0x83,0xEF,0xAB,0x69,0xD5,0x0F,0xDB,0xC5,0x9B,0xC9,0xA9,0x53,0xA7, + 0x7C,0x42,0xD8,0xAE,0x04,0xBE,0x86,0x5C,0xD0,0x47,0x77,0x7F,0x5C,0x2D,0x85,0x51, + 0x3B,0xDB,0xA3,0xCC,0xDB,0xDB,0x59,0x02,0x89,0x1D,0x60,0xE9,0x6F,0xE8,0xDA,0x40, + 0xD9,0x3D,0x3C,0x57,0xB9,0x25,0x20,0xC5,0x0C,0xB4,0x3E,0x4C,0x95,0x5F,0x70,0x4C, + 0xC8,0xDD,0xBC,0x4D,0x58,0xBE,0xE1,0x24,0xFD,0xE3,0x7F,0x2D,0xA2,0x88,0x8B,0xAB, + 0x3B,0x47,0x47,0xFB,0x8A,0x04,0x5A,0xBC,0xB2,0x59,0xBC,0x99,0x7C,0xBB,0xE9,0x04, + 0xE1,0xE6,0x72,0xB2,0xA4,0x54,0xB3,0xA2,0x46,0xA6,0x1F,0x32,0xFE,0x5C,0x29,0x19, + 0xD5,0x23,0x29,0x9E,0xE6,0x76,0x75,0xDF,0x52,0xBB,0x0B,0xE2,0x6A,0x28,0x27,0x23, + 0x95,0xB5,0x3C,0x43,0xC0,0x8A,0x19,0x11,0x4E,0x2C,0xA1,0x8A,0x04,0x7C,0xB6,0x4B, + 0x33,0x6C,0xDC,0xFC,0x8B,0xF0,0xDF,0x1F,0x2B,0xE8,0x6F,0x5F,0xB6,0xD0,0x37,0x3B, + 0xCF,0x8B,0x16,0x52,0x0B,0xE0,0x66,0xF2,0xF1,0xC6,0x16,0xF1,0xE6,0xF2,0x75,0xEE, + 0x49,0x82,0xA5,0x66,0x4F,0x69,0x0A,0x47,0x66,0x47,0x29,0xD1,0x3F,0xBB,0x87,0xEE, + 0xB6,0xC4,0x66,0x1A,0x16,0x76,0x96,0xED,0x71,0x9E,0x2B,0x23,0xCF,0xD0,0xB4,0x04, + 0xF2,0x78,0xD5,0x91,0x80,0x15,0x33,0x80,0x1B,0x06,0x77,0x4C,0x2B,0xEC,0x3D,0x90, + 0x2F,0x2C,0xFF,0x6E,0xBB,0xB0,0x78,0x65,0x13,0x6D,0xCC,0x6B,0xA3,0xF3,0xF6,0xBD, + 0xBC,0x4E,0x01,0x37,0x97,0xE5,0x3F,0xB7,0x88,0x96,0xFA,0xFB,0x9F,0x76,0x08,0xC7, + 0x4F,0x14,0x6B,0x46,0xD4,0xC6,0x55,0x2A,0xDC,0xB1,0x56,0xF7,0x84,0xC1,0xFD,0x75, + 0x8B,0x53,0xAA,0xC4,0xC0,0x95,0xB3,0x4C,0x89,0x6C,0xA0,0xC7,0xD2,0xCE,0xD2,0xA8, + 0x0B,0xFB,0x7A,0x54,0xC8,0xC0,0xEC,0x17,0xF8,0x5B,0x0D,0x30,0x35,0x68,0x61,0x5D, + 0xDE,0xD2,0xF2,0x0A,0xE1,0xE8,0xB1,0x22,0x5A,0xB5,0xAB,0x95,0x76,0x1C,0xD5,0xA8, + 0x82,0x15,0x08,0xD1,0x9B,0x83,0x2B,0x86,0x85,0xD2,0x88,0xDE,0xA1,0x34,0x76,0xF4, + 0xB0,0x4E,0xBF,0x4E,0x3C,0xB1,0x68,0xFA,0x4F,0xBB,0x0F,0x08,0x6F,0x57,0x45,0xD2, + 0xA7,0x0D,0xDD,0x54,0x57,0x1B,0x89,0x09,0x6A,0xA7,0x5F,0x47,0xD7,0xD0,0x2D,0x29, + 0x6D,0x34,0x66,0xC0,0x05,0x5E,0xF9,0x5C,0x02,0xDA,0x32,0x03,0x58,0x67,0x2C,0x53, + 0xD2,0x59,0x1C,0x3A,0x7C,0x4C,0x58,0xB7,0xB5,0x50,0x74,0x5D,0x7D,0x4D,0xC8,0x00, + 0xDE,0xC3,0xD7,0x3B,0x5A,0xE9,0xD5,0x6F,0xCF,0xD2,0xB7,0x3F,0xEC,0x10,0xCA,0x2B, + 0x2A,0x3B,0xD5,0x4A,0x23,0xC3,0xCF,0xD9,0x28,0xB6,0x12,0x97,0x5C,0x34,0x40,0xF7, + 0x78,0xAF,0x20,0x5A,0x95,0x76,0x82,0xEE,0x88,0xA9,0xA1,0xB4,0x60,0xE5,0x71,0x68, + 0x14,0xF4,0xFB,0x7D,0xB7,0x4A,0xFA,0x5F,0xEA,0x09,0x7A,0xA0,0x77,0xB8,0xD7,0x84, + 0x0C,0xCC,0x7E,0x51,0x20,0x5A,0x66,0x67,0xAB,0x35,0xBA,0x83,0x5D,0x7B,0x0F,0x09, + 0xAB,0xB6,0x9F,0xA6,0xF5,0x07,0x7C,0x6B,0xD5,0x10,0x25,0x60,0xA5,0x6F,0x9D,0x14, + 0x46,0x63,0x07,0xA7,0x53,0x56,0x0F,0xEF,0x97,0x9A,0xF5,0xC6,0xA2,0xE9,0xBC,0xD4, + 0xAE,0xC6,0x99,0x37,0x6F,0x9E,0x30,0x64,0xC8,0x10,0x9A,0x3F,0x7F,0xBE,0xD7,0xFE, + 0xCE,0x9F,0x7F,0xD9,0x27,0x7C,0xB9,0xA9,0x81,0x76,0x9D,0x68,0x63,0x7B,0xFC,0x87, + 0xD9,0x63,0xC3,0xE9,0xE2,0xC1,0x09,0xD4,0xFF,0x82,0x5E,0x5E,0xBD,0x6E,0x3A,0x63, + 0xE1,0x03,0x2D,0x15,0xC1,0x37,0x73,0xB3,0x7D,0x6D,0x91,0x38,0x77,0xE1,0xED,0x61, + 0xAA,0xDC,0x9F,0x77,0x0B,0xFF,0x5E,0x53,0xEF,0x97,0x42,0x06,0x9F,0x6F,0x69,0xA6, + 0xE5,0xB9,0xA7,0x68,0xB7,0x97,0xAA,0x52,0x82,0xCE,0x5A,0x34,0x3D,0x35,0x35,0x55, + 0xA7,0x05,0x21,0x03,0x33,0x31,0xFB,0xDA,0x22,0x71,0xEE,0x02,0x17,0x40,0x56,0x56, + 0x96,0x57,0xEA,0x84,0x6D,0xD8,0xB4,0x53,0x78,0x67,0x4D,0x23,0x9D,0xE8,0xDC,0xAE, + 0xA5,0xC7,0x41,0xD7,0xE1,0xCB,0x4D,0xB5,0xB4,0xED,0x97,0x03,0x5E,0xF9,0x43,0x1D, + 0x2D,0xA1,0xEB,0x8F,0x04,0x7C,0x00,0xCC,0x88,0x37,0x86,0xA9,0x36,0xFF,0xBC,0x4B, + 0x78,0xEF,0x87,0x73,0x54,0x56,0xEB,0xDF,0x42,0x36,0xB2,0x35,0xFF,0x3C,0xAD,0xFE, + 0xA5,0x9E,0xF6,0x1D,0x2C,0xF0,0xE8,0x1F,0x8C,0xB8,0xC7,0xEE,0xDD,0xBB,0xDD,0x32, + 0x1C,0xE5,0xCB,0x70,0x31,0x33,0x3C,0x9D,0x44,0xF2,0xCB,0xEE,0x83,0xC2,0x17,0x5B, + 0x9A,0x02,0x46,0xC8,0x46,0x72,0xF3,0xDA,0x68,0xCB,0x81,0x3A,0x3A,0x51,0x54,0xE2, + 0xB1,0x3F,0xDC,0xDF,0x16,0x4D,0x77,0x16,0x2E,0x66,0x09,0x9E,0x9A,0x80,0x71,0x28, + 0xFF,0xB8,0xF0,0xE3,0x9E,0x33,0xB4,0xAF,0xC8,0x3F,0xFB,0xC8,0xF6,0x40,0x1F,0x7A, + 0x4F,0x5E,0x19,0x55,0x56,0x79,0xA6,0xC2,0x06,0x3C,0x2A,0x7F,0x5A,0x34,0xDD,0x59, + 0xB8,0x98,0x25,0x60,0x55,0xC0,0xF5,0xEB,0xD7,0xBB,0xB5,0x12,0x09,0xC6,0x5D,0x77, + 0xE7,0x57,0xD2,0x9A,0x3D,0x9E,0x9B,0x23,0xEB,0x0B,0xBC,0xF7,0x83,0x5E,0xD0,0x07, + 0x8F,0xB1,0x96,0xFB,0xF0,0xC7,0x45,0xD3,0x9D,0xC5,0xAE,0x98,0xA3,0x22,0x3C,0x57, + 0x0F,0x49,0x8B,0x20,0xB2,0xED,0x4E,0xEB,0xBC,0xE7,0x50,0x21,0x2D,0xF5,0xE2,0x4C, + 0x27,0xAD,0x72,0xAE,0x45,0xA0,0xB7,0xD7,0x36,0xD1,0xA6,0xAD,0xBF,0xB8,0xD5,0x3A, + 0xBB,0x23,0x0F,0xDB,0x5F,0xB0,0x2B,0xE6,0xE8,0x2E,0x81,0x25,0xE6,0xB9,0x73,0xE7, + 0xBA,0xAD,0xAC,0xD0,0xD6,0xED,0xBB,0x84,0x8F,0x37,0x36,0x6B,0x36,0xC7,0xDA,0xDB, + 0xD4,0x35,0x12,0xFD,0xB0,0xB7,0x45,0x9C,0x11,0xC6,0x76,0xB9,0x04,0xE2,0x1B,0x4D, + 0x4D,0x4D,0x34,0x76,0xEC,0xD8,0x80,0xB7,0xCA,0x80,0xBB,0xD9,0x16,0xC0,0x5D,0x43, + 0x9D,0x30,0x57,0x17,0x9B,0x3B,0x59,0x5A,0x26,0x1C,0x28,0x6A,0x0D,0xB8,0x80,0x97, + 0x3D,0xB6,0xE4,0xB7,0xD1,0xF1,0x12,0xF7,0x54,0x58,0xE0,0x56,0xD9,0x1C,0x2E,0x66, + 0x19,0xDC,0x31,0x4C,0x75,0xF4,0x44,0x29,0x7D,0xF3,0x4B,0x60,0xF7,0x93,0xE5,0x80, + 0x97,0xF2,0xC5,0x96,0x66,0xDA,0xF6,0xCB,0x5E,0x97,0xEE,0x72,0x88,0x6B,0x20,0xBE, + 0x81,0x38,0x07,0xDB,0x15,0xF0,0x98,0x89,0xB9,0xA6,0x9E,0xF7,0xED,0x80,0xAB,0x49, + 0x24,0x07,0xF3,0x8E,0x08,0xDF,0xEF,0x69,0xD6,0xCC,0x3C,0x64,0xAD,0x81,0x84,0x99, + 0xA3,0x65,0x4D,0x62,0x70,0x90,0xED,0x72,0x98,0xF7,0xDF,0x7F,0xDF,0xED,0x13,0x2A, + 0x7C,0x1D,0x33,0x31,0xB7,0x9C,0xE7,0x17,0x9F,0x11,0x57,0x86,0xA9,0x4A,0x2A,0x6A, + 0x69,0x6B,0x01,0xEF,0x28,0xDB,0xE2,0xB3,0xCD,0xAD,0x74,0xF4,0x58,0x21,0x6B,0x39, + 0x0E,0x77,0xB1,0xAD,0xE1,0x6E,0xB6,0x02,0x58,0xFA,0x13,0x4B,0x80,0x3A,0x9A,0x44, + 0x82,0x99,0x50,0x2B,0x77,0x70,0xF7,0xDA,0x1E,0xF0,0x5A,0xF6,0x16,0xB5,0x93,0x33, + 0xE5,0x87,0x1C,0x5D,0x34,0x3D,0x50,0xE0,0x62,0xB6,0x01,0x72,0x7D,0x91,0xF3,0xEB, + 0x08,0x0D,0x67,0xCE,0xD0,0xA1,0x12,0x6E,0x95,0xD5,0xF0,0xE3,0xFE,0x16,0x2A,0x2A, + 0x76,0x7C,0xCD,0x62,0x6E,0x95,0xE5,0xB1,0x2B,0xE6,0xD4,0x84,0x88,0x80,0xBD,0xFB, + 0xCD,0x99,0x33,0x47,0x87,0x12,0x34,0x6A,0x93,0x48,0x4E,0x14,0x16,0x09,0x88,0xD6, + 0x72,0xD4,0x81,0xA1,0xAA,0x92,0x1A,0xC1,0xA1,0xB5,0x97,0x1C,0x5D,0x34,0x3D,0x90, + 0xE0,0x96,0xD9,0x0E,0xB0,0x00,0x6A,0xAD,0x73,0x49,0xE9,0x29,0xDE,0x57,0x76,0x90, + 0xDC,0x43,0xAD,0x54,0x78,0xD2,0x7C,0x0E,0xBD,0x2D,0x5C,0x29,0xA1,0xEB,0xEF,0x70, + 0x31,0xDB,0x01,0xB5,0xA4,0xD4,0x24,0x91,0xC0,0xBA,0x94,0xD6,0x0A,0x3C,0x82,0xED, + 0x20,0xE8,0x92,0xD4,0xD7,0x9F,0x61,0x2D,0xFB,0x38,0xBB,0x4A,0x45,0x20,0xC0,0xC5, + 0xAC,0x02,0x0C,0x81,0xD8,0x4B,0x22,0x39,0x56,0x58,0x2A,0xF6,0x01,0x39,0x8E,0xB3, + 0x29,0xAF,0x8D,0x8E,0x1C,0x3B,0x61,0xF7,0x2E,0xE8,0xCA,0x2A,0x15,0x81,0x80,0x99, + 0x98,0x6B,0xF9,0x38,0xB3,0x2C,0x6A,0x86,0xA9,0x5A,0x9A,0xCF,0xD2,0x09,0xDF,0x58, + 0xEC,0x41,0x73,0x1C,0x2E,0x6B,0xA7,0xAA,0xEA,0x5A,0xD6,0x52,0x86,0x07,0xBE,0x6C, + 0x63,0x26,0xE6,0x16,0x9E,0x44,0x2C,0x4B,0x76,0x76,0xB6,0xEE,0xA2,0x8B,0x2E,0xB2, + 0x99,0x44,0x52,0xDD,0xA0,0xE3,0x39,0xD8,0x4E,0x82,0x94,0xD7,0xB6,0xF3,0xB6,0x87, + 0xF3,0xF0,0xD9,0xE3,0x3B,0xC0,0x77,0xC1,0x76,0x71,0x2C,0xE0,0x6E,0xB6,0x4A,0x6C, + 0x0D,0x53,0x21,0x8A,0x7D,0xA8,0x38,0x30,0x4B,0x2E,0xB9,0x8B,0xD2,0x5A,0x9D,0xCD, + 0xA8,0x36,0x0F,0x7C,0xD9,0xC7,0xA6,0x98,0x03,0x6D,0xC6,0x94,0x2D,0x30,0x33,0x07, + 0x33,0x74,0xE4,0x92,0x48,0x4E,0x55,0xD5,0xD1,0x91,0x72,0x6E,0x96,0x5D,0x61,0x7F, + 0x51,0x2B,0xD5,0xD4,0x9E,0x66,0x2D,0x73,0x9C,0x59,0x34,0x3D,0x10,0xB1,0x29,0xE6, + 0x28,0x2E,0x66,0x33,0x9E,0x7C,0xF2,0x49,0x7A,0xFA,0xE9,0xA7,0x59,0xAB,0x83,0xF3, + 0xAD,0x4D,0x74,0xB2,0x93,0x16,0x75,0xF3,0x17,0x90,0xAF,0x5D,0x55,0x23,0xBF,0x50, + 0x9B,0x33,0x8B,0xA6,0x07,0x22,0xDC,0xCD,0x76,0x00,0x58,0x06,0xB9,0x24,0x92,0xC6, + 0x66,0xDE,0x5F,0x76,0x95,0xCA,0xD3,0x02,0xB5,0xB7,0xC9,0xF7,0x9B,0xF9,0x70,0x94, + 0x3A,0xB8,0x98,0x1D,0xC4,0xB2,0xEF,0x8C,0xF5,0x8A,0x91,0xC5,0xE4,0x16,0x86,0xF5, + 0xA3,0x35,0x2F,0x4D,0xD0,0xE1,0xF1,0xE4,0x30,0xB6,0x4F,0x8E,0xB4,0x1E,0xA6,0xE3, + 0xDE,0xBD,0x22,0x8A,0xED,0xF4,0x6D,0x70,0x33,0x3C,0x7D,0xD6,0x5A,0xAF,0x7C,0x38, + 0x4A,0x3D,0x26,0x31,0x97,0x57,0xF3,0x6C,0x07,0x35,0xC0,0x42,0x60,0xFA,0x9D,0x91, + 0xE6,0xE6,0x66,0x2A,0xAB,0x71,0x7F,0xF0,0x6B,0xEC,0xD4,0x1E,0xD4,0x8B,0x6D,0x5B, + 0x72,0xD9,0xE5,0x99,0x6C,0xCB,0x49,0xD8,0x4D,0xE3,0x8E,0x34,0xD6,0xD6,0x08,0x4D, + 0x32,0x86,0x99,0x07,0xBE,0xD4,0xC3,0x2D,0xB3,0x13,0xA0,0xB4,0x90,0x31,0x89,0xA4, + 0xB9,0xE5,0xBC,0xEC,0x45,0xE8,0x0A,0xCB,0xD6,0x56,0x09,0x41,0x29,0x3D,0x74,0x93, + 0x64,0xC5,0x96,0x48,0x13,0x06,0x11,0x6D,0x5A,0x5B,0xE4,0x77,0x37,0xDF,0xD3,0x67, + 0x05,0xD1,0xD3,0x61,0x4D,0x5A,0xB5,0x6A,0x95,0x90,0x9A,0x9A,0xEA,0xF5,0x55,0x2A, + 0x7C,0x15,0x2E,0x66,0x27,0x90,0xBA,0xDA,0x4D,0xCD,0xAD,0xD4,0xD4,0xE2,0x66,0x5D, + 0xED,0xAE,0xA2,0x4D,0x82,0x20,0xDC,0x70,0x79,0x22,0xDB,0xD1,0x41,0xAF,0x2B,0x32, + 0x69,0xBC,0x4E,0xA7,0xCB,0xDD,0xCD,0x76,0x58,0x22,0x71,0xC1,0x8D,0x8F,0x0E,0x97, + 0x3D,0x8A,0xEE,0x58,0x38,0x9E,0xD6,0xDC,0x92,0x28,0x8A,0xE3,0xA6,0x47,0x0C,0xCF, + 0xAF,0x9E,0x2B,0xF9,0x3D,0x36,0x5F,0x6F,0xA0,0xD7,0x15,0x43,0xC5,0x63,0x2E,0x73, + 0xB3,0xBB,0xDF,0xA8,0x77,0x0E,0xDB,0xDA,0x3A,0x26,0xAA,0x48,0x03,0x5F,0x9E,0xAA, + 0x67,0xEE,0x4F,0xD8,0x14,0x73,0x6A,0x7C,0x38,0xDB,0xE2,0x48,0xC1,0x3C,0x5A,0xCC, + 0xA7,0x45,0x22,0x43,0x53,0x73,0x0B,0x9D,0x69,0x62,0x4F,0xB8,0x8D,0x2A,0xCA,0xDD, + 0xA7,0xFF,0x72,0x06,0xF7,0xD3,0x5D,0xC6,0xF6,0x18,0x88,0xA2,0x49,0x83,0x23,0xA9, + 0x7D,0x6F,0x9E,0xF0,0x3D,0xDB,0x63,0x06,0xDC,0xE7,0x47,0x7A,0xE8,0x8A,0xD6,0xEE, + 0x12,0xA6,0xFD,0x3E,0xD7,0xF0,0xF8,0xB0,0x4A,0x18,0x7F,0x8B,0x51,0x90,0x8D,0xF4, + 0xDE,0xA2,0x4D,0x84,0x7D,0x68,0x2D,0x7B,0xC1,0x70,0xCC,0xF4,0xF7,0xAB,0xD0,0x54, + 0xF1,0x7A,0x73,0x16,0xEA,0x8F,0x35,0xBE,0xC7,0x5D,0xAB,0x1A,0xD9,0x5E,0xE7,0xA9, + 0x3F,0xDB,0x46,0xE7,0xCF,0x9F,0x17,0x85,0x7B,0xDF,0x7D,0xF7,0x09,0x2B,0x57,0xAE, + 0x44,0xD0,0x11,0x4F,0x09,0x7A,0xEB,0x2C,0xFE,0x8C,0x88,0x88,0x10,0x66,0xCD,0x9A, + 0x85,0x05,0xE2,0x04,0x77,0x96,0x44,0xF6,0x07,0xB8,0x65,0x76,0x12,0xE3,0x30,0x55, + 0x9B,0xFE,0xE2,0xD3,0x1B,0x67,0xB7,0xF3,0xFD,0x77,0xC5,0xE2,0xCF,0x09,0x52,0x11, + 0x0D,0xCB,0xA4,0x9B,0x52,0x74,0xBA,0x4F,0xBF,0x63,0xE2,0x33,0x43,0x6F,0x75,0xA7, + 0x26,0x88,0x42,0x37,0x13,0xD6,0xCE,0x3C,0x5A,0xB4,0x57,0x10,0x6C,0xF5,0xC1,0x0D, + 0x38,0xFE,0x7A,0x88,0xFE,0xBD,0x32,0xD6,0x70,0x03,0xF9,0xF9,0xF9,0x34,0x67,0xCE, + 0xFF,0xC1,0xAD,0xA6,0x57,0x5F,0x7D,0x55,0x14,0xB6,0x48,0x54,0x37,0xA2,0x6C,0x7D, + 0xDF,0x42,0x0F,0xC6,0xFA,0xB1,0x06,0xF3,0xED,0xB7,0xDF,0x8E,0x6C,0x30,0x7C,0x0F, + 0x5C,0xD0,0x0C,0x2E,0x66,0x27,0x41,0x3F,0x0E,0xAB,0x0E,0xEE,0xDD,0xB3,0x4B,0x6F, + 0x99,0x3D,0x70,0x3D,0x95,0x55,0xD3,0xB2,0x0A,0x73,0x11,0x5D,0x36,0x58,0x2F,0xB6, + 0x8A,0x22,0x61,0xBD,0x9C,0x80,0xD2,0x12,0x44,0xA1,0x9F,0xAC,0x38,0xC7,0x76,0x74, + 0x70,0xBC,0xE2,0x2C,0x29,0xF7,0xC1,0x19,0x4E,0xBC,0x7E,0xF3,0x6E,0xD7,0xAD,0xB1, + 0x91,0xA3,0x5B,0xDE,0xA3,0x25,0x8B,0xE6,0x52,0x6E,0xEE,0x4F,0x44,0x71,0x29,0x44, + 0xD3,0xEF,0x20,0xFA,0xF3,0xE7,0x44,0x2B,0xEA,0x88,0x3E,0x2A,0x24,0x5A,0xBC,0xD1, + 0xB0,0xBD,0xE4,0x30,0xD1,0xFD,0xAF,0x13,0x8D,0xBE,0x4A,0x14,0x36,0x6E,0xA8,0x59, + 0x59,0x59,0x02,0x77,0xC3,0x25,0x62,0xAE,0xA8,0x75,0xBB,0xAF,0xE8,0xF7,0xA0,0xEF, + 0xFC,0xE1,0x87,0x1F,0x50,0x97,0x30,0x4F,0xC4,0x67,0x1A,0x69,0xFD,0x5E,0xA9,0x88, + 0x0C,0x81,0xAF,0x93,0x7B,0xAB,0xC9,0xD6,0xBA,0x10,0xC5,0x15,0xD6,0x02,0x3B,0x26, + 0x23,0x50,0x25,0x5C,0x7D,0xBD,0xA3,0xB4,0x9F,0x6F,0xA1,0xDD,0xFF,0x7B,0x4C,0x14, + 0xB3,0xC8,0x4D,0x7F,0x20,0x7A,0x6D,0x1B,0xD1,0xBC,0x97,0xF4,0x9E,0xC8,0x14,0xC3, + 0x3E,0x29,0x10,0xFA,0xA5,0x37,0x13,0x3D,0xF6,0x91,0x41,0xE0,0x7A,0x8B,0x8D,0x35, + 0xC2,0xB0,0x60,0x3E,0x02,0x66,0xEC,0xA8,0x80,0x84,0x5B,0x66,0x17,0x40,0x12,0x49, + 0x4B,0x4B,0x0B,0x85,0x90,0x67,0x66,0x9B,0x1D,0x5B,0x55,0x2C,0x06,0xC2,0xC6,0x5D, + 0x14,0x65,0x0A,0x7C,0x7D,0x62,0xA7,0x6F,0x9A,0x99,0x62,0x1D,0x88,0xEA,0x95,0xD2, + 0x85,0x6D,0xD9,0xC7,0xD5,0xD7,0x3B,0x4A,0x41,0xEE,0x9B,0x74,0xEA,0x88,0x5E,0x94, + 0x70,0xA5,0x21,0x50,0x88,0x19,0xDB,0x6A,0x80,0xEB,0xBD,0x68,0x2D,0xD1,0xC5,0xD7, + 0x89,0x56,0x1A,0xFD,0x6B,0xAC,0xD3,0xCC,0x9E,0x0D,0x38,0xB8,0x98,0x5D,0xE4,0xCD, + 0xB7,0xFE,0x4D,0xB1,0x31,0x61,0xAC,0xE5,0x6E,0x0C,0x81,0xB0,0x1E,0x53,0x87,0xEA, + 0x1E,0xB7,0x15,0xF8,0x02,0xCC,0x2D,0xCF,0x90,0x11,0x5E,0x76,0x8A,0xFE,0xB5,0x4A, + 0xEE,0xB9,0x11,0x57,0x5F,0xEF,0x04,0xA5,0x07,0xBE,0xA5,0xC2,0x9D,0x9F,0x12,0x85, + 0x86,0x1B,0x84,0xAC,0x77,0x9D,0x1D,0x26,0x2C,0x82,0xE8,0xA1,0x7F,0x9B,0x09,0x3A, + 0x50,0x03,0x63,0x36,0xC5,0x1C,0x68,0xEB,0x4C,0x39,0x43,0x78,0x78,0x28,0xE9,0xFF, + 0x79,0x8C,0xEF,0xF5,0x6E,0x35,0xE8,0xA1,0x18,0xF8,0x32,0xC2,0xDC,0xF2,0xC1,0xFD, + 0xCC,0x22,0xCF,0x18,0x46,0x5A,0x38,0x58,0xA7,0xDB,0xB2,0xB6,0xA8,0xC3,0x3D,0x2F, + 0x3B,0x2B,0xFE,0x80,0xC5,0xEF,0xC0,0x81,0xD7,0xBB,0x01,0xB8,0xD7,0xF9,0xB9,0x6F, + 0x19,0x1A,0x77,0x3E,0x47,0x34,0x70,0x82,0x61,0xDB,0x59,0xEE,0xFB,0x97,0xF8,0x1E, + 0xE5,0xE5,0xE5,0x0E,0x17,0x61,0xF4,0x17,0x6C,0x8A,0x99,0xCF,0x9A,0xB2,0x4F,0x54, + 0x97,0x30,0x8A,0xF1,0x64,0xCD,0xC3,0x9D,0xC5,0xA2,0xC5,0x54,0x63,0x19,0x8F,0xAD, + 0xDA,0x25,0x0E,0x3B,0x61,0x28,0xC9,0x38,0xFE,0xFB,0xE6,0xD4,0x28,0x71,0xF8,0xE8, + 0xE9,0x9D,0xEC,0x20,0x50,0x56,0x44,0xF3,0xD6,0x36,0x0A,0xB0,0xF8,0x38,0xC6,0x38, + 0xCE,0xAC,0xFA,0xF5,0x6E,0xA0,0x78,0xEF,0x0A,0x6A,0x69,0xD4,0xDF,0xA8,0xD0,0x2F, + 0x46,0xB0,0xCB,0x82,0xBB,0x47,0xEA,0x5D,0xED,0x59,0xB1,0xBA,0xB1,0xAC,0x2D,0xC5, + 0xF8,0x1C,0x6B,0x1A,0x80,0x85,0xC6,0x4D,0x41,0x0F,0xD6,0x6B,0x0E,0x44,0xEB,0x6C, + 0xFA,0x40,0xF6,0x1C,0xA9,0x13,0x1E,0x79,0x7D,0x3F,0x6B,0x19,0x98,0x36,0x32,0x85, + 0x1E,0x9E,0x93,0xE3,0xC1,0x2B,0xD5,0xF7,0xC1,0x45,0xF3,0xE5,0xFA,0x22,0xFA,0x6A, + 0xBB,0x07,0xC6,0xA7,0xFC,0x98,0x8D,0xEF,0x5E,0x4F,0xE7,0xEA,0xF5,0x77,0xA7,0x67, + 0x57,0xCA,0x5B,0xE5,0xF4,0x48,0xA2,0x91,0x61,0xBA,0xC5,0xDF,0xD7,0x09,0x0B,0xCC, + 0x4A,0x84,0x85,0xD2,0x37,0x57,0xEB,0x9F,0xDB,0x71,0x9A,0xAE,0x2A,0x61,0xBB,0xA4, + 0x3C,0xF7,0x7F,0x44,0x3F,0x7F,0x43,0x6F,0xBC,0xF1,0x06,0xCD,0x9F,0x3F,0x3F,0xA0, + 0xAE,0x5D,0x93,0x65,0x6E,0x69,0xE5,0xD3,0x7E,0x9C,0x21,0x3C,0x3C,0x9C,0x92,0xBB, + 0xF1,0xD0,0x83,0x23,0x34,0xD6,0x14,0x1A,0x84,0x8C,0xC8,0xB4,0x92,0x7B,0x5D,0xD2, + 0x4A,0xDF,0x08,0x82,0x30,0x23,0xDD,0xE2,0xB3,0x4D,0x0F,0xA5,0xAB,0x74,0x3A,0xDD, + 0x57,0x72,0x42,0x06,0xAC,0xDF,0xFD,0xD5,0x57,0x5F,0x89,0x3F,0x03,0x09,0xD3,0x27, + 0x55,0x73,0x86,0x5B,0x16,0x67,0x88,0x8F,0x8F,0xD7,0x75,0x8F,0x0B,0xF8,0x21,0x4E, + 0x87,0xA8,0x39,0xB9,0xCB,0xB0,0x31,0xD4,0x3C,0xBF,0xCD,0x9C,0x56,0xFA,0xAA,0x94, + 0x28,0xA7,0x5F,0x57,0x33,0x57,0xFB,0xEE,0xEE,0x86,0x00,0xC5,0xDB,0xE2,0xFF,0x32, + 0x30,0x31,0x63,0x51,0xB9,0x40,0x83,0x9B,0x14,0x37,0x10,0x1C,0x12,0x4A,0x69,0x71, + 0xBC,0x37,0xA2,0x96,0xA6,0xFA,0x72,0xC3,0x46,0x7A,0x8E,0xE1,0xA7,0x02,0x6F,0xE7, + 0x35,0x51,0x81,0x70,0x5E,0xB8,0x21,0x86,0xED,0xD0,0xBB,0xD8,0x57,0x77,0x27,0xFA, + 0x66,0x7B,0x9D,0xF2,0xDD,0x13,0xC3,0x5A,0xC9,0x3D,0xC4,0xC8,0x76,0xA0,0x61,0x53, + 0xCC,0x71,0x5D,0x3D,0x18,0xA6,0xF5,0x23,0x12,0xE3,0x63,0x29,0x2B,0x89,0x8B,0x59, + 0x2D,0xCD,0x8D,0x6C,0x7D,0x66,0xB8,0xD9,0xB6,0xD0,0x7B,0x8B,0x2B,0xCF,0x04,0x93, + 0xC9,0xD5,0xB6,0xE7,0x62,0x1B,0x61,0xEF,0x7B,0xFC,0xF8,0xF1,0x80,0x72,0x99,0x6C, + 0x8A,0x39,0x34,0x98,0x5F,0xA0,0x6A,0xE8,0x1A,0x13,0x45,0xD9,0x29,0x3C,0xF2,0xAF, + 0x96,0xE0,0x60,0xB5,0xE3,0xF2,0xED,0xF4,0x69,0x69,0x9B,0xC9,0xD5,0x86,0x8B,0x5D, + 0x90,0x57,0x2F,0x28,0xBA,0xD8,0x46,0x1A,0xE5,0x6B,0x89,0xF9,0x3B,0x26,0x31,0xF3, + 0x00,0x98,0xF3,0x24,0x27,0x27,0xEB,0xB2,0x93,0x58,0x83,0x63,0x97,0xB0,0xA8,0x78, + 0xC3,0xC6,0xA9,0x22,0xC3,0x4F,0x1B,0x6C,0x29,0x69,0x65,0xAE,0x36,0x5C,0xEC,0x36, + 0x5A,0xA9,0x66,0x51,0xBE,0x5A,0xC3,0x72,0x37,0x81,0x56,0x96,0xD7,0x24,0xE6,0xDA, + 0x33,0xBC,0x00,0xBE,0x2B,0x84,0x86,0x04,0x51,0xAC,0x7F,0x54,0xF0,0xF1,0x38,0x51, + 0xF1,0x3D,0x0C,0x1B,0xFB,0x73,0x0D,0x3F,0x6D,0x61,0x74,0xB5,0x47,0x86,0xEB,0x5D, + 0xEC,0x10,0xDD,0xA7,0xF6,0x56,0xB2,0x39,0x99,0x2F,0x5A,0x66,0x14,0x35,0x08,0x34, + 0x6C,0xBA,0xD9,0x1C,0xF5,0x64,0xA4,0xA7,0xD2,0xF8,0x0B,0xB8,0xAB,0xAD,0x86,0xC4, + 0xAC,0x31,0x14,0x14,0xA2,0x77,0xB5,0x0F,0x6F,0x57,0xE1,0x12,0x33,0x57,0xBB,0x6B, + 0x88,0x0E,0x2E,0xF6,0x16,0xB6,0x57,0x91,0xDC,0x2F,0xC5,0x1F,0xD3,0xA7,0x4F,0x17, + 0x7F,0x06,0x12,0x36,0xC5,0x1C,0xE7,0xB1,0x9C,0x63,0xFF,0xA3,0x47,0x66,0x86,0x6E, + 0x68,0x76,0x30,0xE9,0x0D,0x34,0xC7,0x0E,0x21,0xE1,0xD1,0x14,0x9B,0x36,0x80,0xA8, + 0xB5,0x99,0xE8,0x87,0x8F,0xD9,0x5E,0x65,0xB6,0xE4,0x35,0x60,0xFA,0xA3,0x90,0x93, + 0x67,0xC7,0xC5,0x6E,0x69,0x22,0xFA,0x6E,0x89,0xB8,0x79,0xE3,0x8D,0x37,0x8A,0x3F, + 0x03,0x09,0x9B,0x97,0x5E,0x58,0x28,0xBF,0x32,0x1D,0x21,0x26,0x26,0x9A,0x72,0xD2, + 0xF8,0x67,0xA6,0x86,0x1E,0x43,0x6F,0x30,0x6C,0x7C,0xF9,0xB2,0x41,0x84,0xEE,0x00, + 0x42,0xD6,0xF7,0x97,0xB1,0x8C,0xCD,0x15,0x57,0x5C,0x11,0x70,0xD1,0x5B,0x7E,0xE5, + 0xB9,0x91,0xA1,0x83,0xFB,0xEB,0xA6,0x0C,0xE1,0xC3,0x79,0x6A,0x48,0xEE,0x73,0x31, + 0xA5,0xE8,0x1F,0x62,0xB0,0xEA,0x99,0xD9,0x6C,0xAF,0x0B,0x1C,0xDF,0x47,0xBA,0xA5, + 0x86,0x05,0x0A,0x50,0x05,0x26,0x10,0x31,0x89,0xF9,0x54,0x2D,0x0F,0x80,0xB9,0x83, + 0xC4,0x98,0x60,0xFD,0x83,0x35,0x38,0x36,0x99,0x7D,0xDB,0x03,0x94,0x98,0x94,0x64, + 0x08,0x84,0xFD,0xF3,0x5E,0xB6,0xD7,0x09,0x10,0xF4,0xD2,0xDF,0x10,0x04,0xBD,0x85, + 0x47,0x8D,0x6D,0xCC,0x33,0x67,0xCF,0x04,0x14,0xDC,0x32,0xBB,0x99,0xCC,0x8C,0x54, + 0xBA,0xF8,0x42,0x1E,0x6B,0x50,0xC3,0xAC,0x89,0x3D,0xE9,0xC3,0xA5,0x4B,0x29,0x3C, + 0x22,0xC2,0xD0,0x77,0xC6,0x24,0x09,0x47,0x5D,0x6E,0xFD,0x8D,0x40,0xB7,0x70,0xAA, + 0x68,0xE1,0x51,0x64,0x71,0xD9,0xB2,0x65,0x01,0x9B,0x1C,0xC1,0xC5,0xEC,0x66,0x32, + 0xD2,0xBB,0xEB,0x86,0xF6,0xE2,0xE9,0x9D,0xF6,0xB8,0xB8,0x5F,0x30,0xF5,0xEC,0x9E, + 0x80,0xA8,0xB3,0x6E,0xF5,0xAA,0x55,0xD4,0x2D,0x36,0x56,0x9C,0xED,0x44,0xF7,0x0C, + 0x21,0xFA,0xFA,0x0D,0xFB,0xA2,0xC6,0x18,0xF5,0x8B,0x77,0x12,0x3D,0x31,0x83,0x84, + 0xC6,0xD3,0x62,0xF4,0x7A,0xEB,0xD6,0xAD,0x01,0xFD,0xA1,0x9B,0xFE,0xF8,0x7F,0x7C, + 0x52,0x20,0xAC,0xD9,0x6E,0x18,0x6C,0x37,0xF2,0xD7,0xDF,0x5C,0x48,0x23,0xFB,0xC7, + 0xF3,0xAB,0xD2,0x09,0x56,0xFD,0xB0,0x5D,0x58,0xBC,0xB2,0x99,0xB5,0x38,0x52,0xA2, + 0x23,0x74,0xB4,0x60,0x46,0x04,0x5D,0x3C,0x6E,0xB8,0xE9,0xDA,0xC2,0x4A,0x8F,0x73, + 0xE6,0xCC,0xA1,0xDD,0xBB,0x25,0x05,0xC1,0x31,0x69,0x02,0xA5,0x81,0xFA,0x8E,0x30, + 0xCC,0x57,0x86,0x3B,0x5D,0x59,0x6C,0x10,0x3D,0xB6,0xF5,0xA0,0xA8,0xE2,0x83,0x0F, + 0x3E,0x48,0xCF,0x3F,0xFF,0x7C,0xC0,0x5F,0xA7,0x36,0xC5,0xFC,0xC2,0xBD,0x03,0x69, + 0x48,0x1F,0x8B,0x49,0xE0,0x1C,0x55,0xEC,0x3D,0x90,0x2F,0x2C,0x5B,0x5F,0x45,0x3B, + 0x8E,0xF2,0xCC,0x3A,0x4B,0x6E,0xB9,0x24,0x8C,0xA6,0x8C,0xE9,0x49,0xDD,0x53,0x53, + 0xAC,0xAE,0x2D,0xD4,0x22,0x7F,0xE5,0x95,0x57,0xEC,0xCE,0x7A,0x8A,0xD5,0x5B,0xF2, + 0x59,0xB3,0x66,0xD1,0x73,0xCF,0x3D,0x27,0xD6,0x31,0x67,0xBB,0x03,0x1A,0x2E,0x66, + 0x0F,0xF2,0xD3,0xA6,0x1D,0xC2,0x8B,0x5F,0x37,0xD3,0x39,0x77,0xAF,0x78,0xE1,0xC3, + 0x64,0x26,0xE8,0xE8,0xEE,0x69,0x51,0x34,0x7A,0xE4,0x45,0x36,0xAF,0x2B,0x14,0x7D, + 0x58,0xBD,0x7A,0xB5,0x58,0x79,0xB3,0xA2,0xA2,0x42,0xFC,0x39,0x7A,0xF4,0x68,0xF1, + 0x39,0xF4,0x8D,0x03,0x71,0xE8,0xC9,0x1E,0xA6,0x0F,0xE4,0x91,0xD7,0xF7,0x09,0x7B, + 0x8E,0x98,0x67,0xE3,0x70,0x31,0xBB,0xC6,0xC9,0x92,0x52,0xE1,0xEB,0xDC,0x93,0xB4, + 0xFC,0x67,0x3E,0x52,0x60,0xE4,0x91,0xAB,0xC3,0x69,0xEA,0xC4,0x91,0xFC,0x9A,0xF2, + 0x00,0x3C,0x00,0xE6,0x41,0x10,0x0C,0x1B,0x75,0x41,0x34,0x0D,0xEA,0x11,0xCC,0xF6, + 0x04,0x36,0xB3,0xC7,0x86,0x53,0x4E,0x76,0x77,0xD6,0xE2,0xB8,0x1B,0x6E,0x99,0xBD, + 0xC0,0xE6,0x9F,0x77,0x09,0x6F,0xAD,0x39,0x4B,0x65,0xB5,0xFE,0xED,0x6E,0x23,0xB0, + 0x95,0x93,0x4A,0x94,0x95,0x11,0x42,0x3D,0xE2,0x75,0x94,0x10,0xD1,0x11,0x2F,0x28, + 0x3F,0x17,0x44,0x49,0x5D,0xC3,0x69,0xFC,0xF0,0x21,0xFC,0x7A,0xF2,0x10,0x36,0xC5, + 0xFC,0xEE,0xC2,0x61,0xD4,0x23,0x25,0x92,0x7F,0xF8,0x6E,0xE0,0x87,0xDC,0x5F,0x84, + 0xD7,0xBE,0x6D,0xA2,0x06,0x3F,0x5C,0x06,0x1B,0x2B,0x7A,0x8C,0xBA,0x20,0x88,0xFA, + 0x67,0x87,0xD2,0xDE,0xF3,0x5D,0x68,0xD3,0xF9,0x18,0xDA,0xDF,0xDA,0x85,0xCA,0xDA, + 0x3A,0xB2,0xE1,0x06,0x86,0x9E,0xA3,0x9C,0x90,0x26,0xBA,0xBA,0xEB,0x59,0xEA,0x1D, + 0xD2,0x4C,0x17,0xF4,0xCC,0x10,0xA7,0x8E,0xB2,0xA7,0x39,0x6E,0xC0,0xA6,0x9B,0x1D, + 0xC6,0x67,0x0D,0xB8,0x8D,0x4B,0x27,0x0C,0xD7,0xDD,0x35,0x25,0xDC,0xEF,0x26,0x62, + 0x60,0xDA,0xE7,0x0D,0x97,0x85,0x51,0x61,0x7A,0x02,0xFD,0xBA,0xBE,0x17,0x3D,0xD5, + 0x90,0x4E,0x6B,0x9B,0xBA,0x9A,0x09,0x19,0x40,0xDC,0xCB,0xCF,0xC5,0xD1,0xDC,0x8A, + 0x74,0xBA,0xA1,0x3C,0x93,0x96,0x1C,0xAE,0xA1,0xAD,0x07,0x0E,0xF3,0xC8,0xA0,0x1B, + 0xE1,0x6A,0xF5,0x22,0xC3,0x06,0xF4,0xA4,0x5B,0x27,0x85,0xF9,0x8D,0xA0,0x91,0x18, + 0x73,0xDD,0xA5,0x5D,0xE8,0xF1,0xA6,0x1E,0xF4,0xF6,0xD9,0x64,0x3A,0xD3,0xAE,0xEE, + 0x0F,0x83,0xD0,0x17,0x56,0xA7,0xD2,0x13,0x25,0x51,0xB4,0x61,0xE7,0x3E,0x2E,0x68, + 0x37,0x61,0xFA,0xF4,0x1B,0xCE,0xB1,0xE5,0x33,0x39,0x1E,0x23,0x35,0x25,0x49,0x37, + 0xE1,0xA2,0x1E,0x74,0xF7,0xB4,0x2E,0x1E,0x5A,0x6C,0xCE,0x7B,0xC0,0x22,0x5F,0x39, + 0x21,0x82,0xEE,0x3A,0x93,0x4D,0x85,0x6D,0xCE,0xAD,0xE3,0xBD,0xEE,0x6C,0x34,0x2D, + 0x28,0x4F,0xA0,0xDC,0xBD,0x87,0xB8,0xA0,0xDD,0x80,0x44,0xCC,0x1D,0x2B,0xD6,0x73, + 0x3C,0x47,0x66,0x46,0xAA,0x6E,0xFC,0xB0,0x6C,0xBA,0x77,0x7A,0x84,0x18,0x30,0xF2, + 0x45,0xE0,0x59,0x5C,0x3F,0x29,0x9C,0x1E,0x6D,0xC8,0x50,0x6D,0x8D,0x95,0xD8,0xD9, + 0x12,0x49,0xAF,0x9F,0xEA,0x42,0xBB,0xF2,0x8F,0x71,0x41,0xBB,0x88,0x6B,0xDF,0x04, + 0xC7,0x29,0x92,0x12,0xE3,0x75,0x97,0x4F,0x1A,0xAE,0xFB,0xDD,0x95,0x11,0x3E,0x59, + 0x6A,0x68,0x74,0xBF,0x60,0xFA,0xA9,0xAD,0xAB,0xD3,0x16,0xD9,0x92,0x8F,0x1B,0x62, + 0xA9,0xB8,0xD6,0x5E,0x3D,0x20,0x8E,0x3D,0x6C,0x8A,0x39,0x35,0xC1,0x47,0x4D,0x87, + 0x8F,0x80,0xA0,0xD8,0xFD,0x57,0x46,0x52,0x9F,0x54,0xDF,0xF9,0x98,0xD1,0x3D,0x18, + 0x7D,0x41,0x30,0xBD,0x75,0xD6,0x7E,0x05,0x43,0xD9,0x35,0xA1,0x14,0x78,0xAA,0x3A, + 0x89,0x36,0xEF,0x39,0xC0,0xAD,0xB3,0x0B,0x70,0xCB,0xDC,0xC9,0x4C,0x18,0x3B,0x4C, + 0x77,0xC7,0xD4,0x6E,0x62,0xBE,0xB2,0x2F,0xF4,0xA3,0xFB,0x75,0x27,0xDA,0xDA,0x1C, + 0x45,0x2D,0x6E,0xBE,0x74,0xE0,0x6E,0x37,0x36,0xF1,0x89,0x29,0xAE,0xC0,0xC5,0xAC, + 0x01,0x46,0x0C,0x1D,0xA8,0xC3,0xC4,0x83,0x87,0x66,0x86,0x6B,0xDE,0x4A,0xE7,0x64, + 0x85,0xD2,0x8F,0xE7,0x55,0x2E,0x86,0xEE,0x20,0xDF,0x9F,0x8B,0x09,0xD8,0xB5,0x95, + 0xDD,0x01,0x17,0xB3,0x46,0xC0,0x0C,0xA2,0x4B,0xC6,0x8F,0x10,0xAD,0xF4,0xFC,0xCB, + 0xC3,0x35,0x1B,0x1C,0x4B,0xEB,0x4A,0x94,0xDF,0xEA,0x9E,0xBE,0xB2,0x25,0xFB,0x9A, + 0xC3,0xE8,0x54,0x7D,0x23,0x6B,0x71,0x1C,0xC5,0x24,0xE6,0x8A,0x9A,0xC0,0x5B,0x9B, + 0x47,0x8B,0xC0,0x4A,0x5F,0x73,0xF9,0x48,0x1D,0xAC,0xF4,0xEC,0xB1,0xA1,0x9A,0x2B, + 0x41,0xD4,0x2D,0x5C,0xA0,0xEA,0x36,0xCF,0xE4,0x9A,0xE3,0x7D,0xCF,0xB5,0xF0,0x05, + 0x0C,0x9D,0x85,0x5B,0x66,0x8D,0x32,0x7E,0xEC,0x08,0xDD,0xAF,0x2E,0xEE,0x49,0xF7, + 0x5D,0x19,0x29,0x5A,0xEA,0xCE,0x74,0xBF,0x31,0x14,0x35,0x34,0x4B,0x47,0x7F,0xB8, + 0x26,0x9C,0x74,0xFA,0xD3,0x70,0x77,0x7F,0xD9,0x08,0xDE,0xB7,0xBD,0x9D,0xCF,0xFF, + 0x76,0x16,0x2E,0x66,0x0D,0x93,0x9A,0x9A,0xAA,0x1B,0x3B,0x7A,0x98,0x68,0xA9,0xE1, + 0x7E,0x43,0x4C,0xFD,0x2D,0xD7,0x2B,0xF6,0x30,0x97,0x0F,0x09,0xA1,0xC7,0xAF,0x0D, + 0xA3,0x5B,0xA7,0x24,0xD1,0xA5,0x17,0x8F,0xD4,0x51,0x50,0x30,0xC5,0x04,0x79,0x46, + 0x70,0x78,0xDF,0xD0,0x10,0xBE,0x90,0x80,0xB3,0x28,0x5E,0x19,0xBC,0x00,0xBE,0xB6, + 0x80,0xFB,0x0D,0x31,0x5D,0x3B,0xDA,0x7B,0x17,0x3B,0x56,0xB6,0xBC,0x78,0x40,0x04, + 0x4D,0x18,0x37,0x4A,0x37,0xF0,0xC2,0xBE,0xA2,0x6B,0xD0,0x1E,0x1C,0x42,0xF1,0x3A, + 0xCF,0xB8,0xC2,0x78,0xDF,0xC8,0x70,0x7E,0xDD,0x39,0x8B,0xA2,0x98,0x79,0x01,0x7C, + 0x8E,0x88,0xCE,0xFC,0x3A,0x88,0xEF,0xD6,0x8D,0x86,0x85,0x9D,0x65,0x2D,0xF7,0x32, + 0x29,0xAA,0x89,0x52,0x62,0x79,0x9D,0x62,0x67,0xE1,0x8A,0xE5,0x38,0xC4,0x80,0x3E, + 0xD9,0x3A,0x4C,0x63,0x74,0x37,0x61,0xD4,0x4E,0x43,0x42,0x1B,0x29,0x31,0x31,0x51, + 0xDB,0x63,0x73,0x1A,0x86,0x8B,0x99,0xE3,0x30,0x7D,0xC2,0xDB,0xA8,0x6F,0xA8,0xFD, + 0x04,0x8F,0xB7,0xB7,0x9F,0x16,0xD7,0x88,0x62,0x4D,0x9B,0xDC,0x10,0x7D,0x9A,0x92, + 0x51,0x10,0x9F,0xE3,0x34,0xA2,0x98,0xCB,0xAB,0xFD,0x70,0xC6,0x3C,0xC7,0x63,0x5C, + 0x98,0x95,0x41,0x0F,0xC5,0x55,0xB3,0x96,0xEB,0xC0,0x2A,0xDF,0x1E,0x53,0x4B,0x17, + 0xF6,0xEA,0xC9,0xAD,0xB2,0x0B,0x70,0xCB,0xCC,0x71,0x98,0xF8,0xF8,0x78,0xDD,0x90, + 0x6E,0xC1,0x34,0x25,0xB2,0x81,0xED,0x71,0x8D,0xA7,0x13,0xAB,0xA8,0x57,0x46,0x1A, + 0x6B,0x71,0x9C,0x85,0x8B,0x99,0xE3,0x14,0x63,0x06,0x5C,0xA0,0xFB,0x53,0x62,0xAD, + 0xCB,0xC1,0xB0,0xDF,0x75,0xAD,0xA2,0x19,0x69,0x61,0x94,0x9D,0xCE,0x6B,0x5F,0xBB, + 0x8A,0xA2,0x98,0x53,0xE3,0x3D,0x93,0xB2,0xC7,0xF1,0x1F,0x26,0x0E,0x1B,0xA4,0xFB, + 0x67,0xC6,0x69,0xBA,0x39,0xBA,0x8E,0xED,0x51,0x0F,0x5C,0xEB,0xE7,0x12,0x4F,0xD1, + 0x3D,0x3D,0x43,0x68,0x50,0xEF,0x2C,0x2E,0x64,0x37,0xC0,0x2D,0x33,0xC7,0x25,0x26, + 0x0C,0xEE,0xAF,0x7B,0xA4,0x47,0x3B,0x7D,0x9E,0x5A,0x24,0x16,0xED,0x53,0xC3,0x0D, + 0x51,0x75,0xB4,0x2A,0xED,0x04,0xDD,0x94,0x1D,0xC3,0x85,0xEC,0x46,0xB8,0x98,0x39, + 0x2E,0x33,0xB4,0x6F,0x2F,0xDD,0xEC,0x31,0x83,0x75,0x6F,0x76,0xAF,0xA2,0xB5,0x69, + 0xC7,0xE8,0xE9,0xF8,0x53,0x74,0x55,0x97,0xD3,0xA2,0x0B,0x6E,0x7C,0xDC,0x16,0x55, + 0x4D,0xAF,0x24,0x96,0xD1,0xE6,0xB4,0x7C,0x7A,0x22,0xAB,0x9D,0x2E,0x1B,0x3D,0x4C, + 0xC7,0x5D,0x6B,0xF7,0x22,0x8A,0x99,0xD7,0xFF,0xE2,0xB8,0x83,0x09,0x43,0x07,0xE9, + 0xA6,0xEA,0x45,0x7A,0x4F,0xDF,0xAE,0xF4,0xB7,0xAC,0x56,0x7A,0x2D,0xBD,0xD6,0xF4, + 0x78,0xAA,0x6F,0x28,0xFD,0x5F,0xBF,0x24,0x1A,0x37,0x7A,0x94,0x6E,0x70,0x4E,0x2F, + 0x2E,0x62,0x0F,0x20,0x8A,0xB9,0xB1,0x89,0x8B,0x99,0xE3,0x3E,0x90,0x53,0x3E,0xE4, + 0x82,0x3E,0xBA,0x71,0x43,0x06,0x98,0x1E,0xBD,0x7A,0xF6,0xD0,0xF1,0x84,0x10,0xCF, + 0xC2,0xDD,0x6C,0x0E,0xC7,0x4F,0xE0,0x62,0xE6,0x70,0xFC,0x04,0x45,0x31,0xA7,0xC4, + 0x45,0xB0,0x2D,0x0E,0x87,0xE3,0x0B,0x88,0x7D,0x98,0x3D,0x47,0xEA,0x84,0x47,0x5E, + 0xDF,0x2F,0xEE,0x30,0x32,0x6D,0x64,0x0A,0x3D,0x3C,0x27,0x87,0xF7,0x71,0x34,0xC6, + 0x4F,0x9B,0xB6,0x09,0x1F,0xFE,0xE4,0x9D,0x6A,0x1C,0x58,0xB1,0xE2,0xAA,0x91,0xD1, + 0x34,0x6A,0xF8,0x60,0x7E,0x1D,0xF8,0x00,0x5C,0xCC,0x3E,0xC6,0xEE,0xBD,0x07,0x84, + 0x96,0x56,0xEF,0x2D,0x58,0x90,0x10,0xDF,0x8D,0x7A,0x67,0xF3,0x9C,0x69,0x5F,0x80, + 0x8B,0x99,0xC3,0xF1,0x13,0x78,0x00,0x8C,0xC3,0xF1,0x13,0xB8,0x98,0x39,0x1C,0x3F, + 0x81,0x8B,0x99,0xC3,0xF1,0x13,0x44,0x31,0x97,0xD7,0xF0,0x65,0x41,0x38,0x1C,0x5F, + 0x87,0x5B,0x66,0x0E,0xC7,0x4F,0xE0,0x62,0xE6,0x70,0xFC,0x04,0x2E,0x66,0x0E,0xC7, + 0x4F,0xE0,0x62,0xE6,0x70,0xFC,0x04,0x2E,0x66,0x0E,0xC7,0x4F,0xE0,0x62,0xE6,0x70, + 0xFC,0x04,0x45,0x31,0xC7,0x75,0x0D,0x65,0x5B,0x1C,0x0E,0xC7,0x17,0x50,0x14,0x73, + 0x68,0x30,0x4F,0xCB,0xE6,0x70,0x7C,0x09,0xEE,0x66,0x73,0x38,0x7E,0x02,0x17,0x33, + 0x87,0xE3,0x27,0x70,0x31,0x73,0x38,0x7E,0x02,0x17,0x33,0x87,0xE3,0x27,0x70,0x31, + 0x73,0x38,0x7E,0x82,0x28,0xE6,0xDA,0xFA,0x16,0xB1,0xC1,0xE1,0x70,0x7C,0x17,0x51, + 0xCC,0x2D,0xE7,0xDB,0xC5,0x06,0x87,0xC3,0xF1,0x5D,0xB8,0x9B,0xCD,0xE1,0xF8,0x09, + 0x5C,0xCC,0x1C,0x8E,0x9F,0xC0,0xC5,0xCC,0xE1,0xF8,0x09,0x5C,0xCC,0x1C,0x8E,0x9F, + 0xC0,0xC5,0xCC,0xE1,0xF8,0x09,0x5C,0xCC,0x1C,0x8E,0x9F,0xC0,0xC5,0xCC,0xE1,0xF8, + 0x09,0x5C,0xCC,0x1C,0x8E,0x9F,0xC0,0xC5,0xCC,0xE1,0xF8,0x09,0x5C,0xCC,0x1C,0x8E, + 0x9F,0xC0,0xC5,0xCC,0xE1,0xF8,0x09,0x5C,0xCC,0x1C,0x8E,0x9F,0xC0,0xC5,0xCC,0xE1, + 0xF8,0x09,0x5C,0xCC,0x1C,0x8E,0x9F,0xC0,0xC5,0xCC,0xE1,0xF8,0x09,0x5C,0xCC,0x1C, + 0x8E,0x9F,0xC0,0xC5,0xCC,0xE1,0xF8,0x09,0x5C,0xCC,0x1C,0x8E,0x9F,0xC0,0xC5,0xCC, + 0xE1,0xF8,0x09,0x5C,0xCC,0x1C,0x8E,0x9F,0x20,0x8A,0x39,0x25,0x3E,0x42,0x6C,0x70, + 0x38,0x1C,0xDF,0x85,0x5B,0x66,0x0E,0xC7,0x4F,0xE0,0x62,0xE6,0x70,0xFC,0x04,0x2E, + 0x66,0x0E,0xC7,0x4F,0x50,0x14,0xF3,0xA9,0x5A,0xBE,0xCA,0x05,0x87,0xE3,0x4B,0x88, + 0x2B,0xAA,0x7F,0xB7,0xAD,0x42,0x78,0x71,0x59,0x81,0xB8,0xC3,0xC8,0xB4,0x91,0x29, + 0xF4,0xF0,0x9C,0x1C,0x9F,0x5B,0x71,0x7D,0xCF,0x91,0x3A,0x81,0x6D,0x72,0xBC,0x4C, + 0x4A,0x5C,0x04,0xA5,0x26,0x44,0xF0,0x55,0xFA,0x3B,0x09,0xBF,0x13,0xF3,0xB4,0xDF, + 0xE7,0x72,0x31,0x77,0x12,0xB7,0x4C,0xCB,0xA4,0xDB,0xA6,0xF7,0xF4,0xC8,0x35,0x53, + 0x5C,0x5C,0xEC,0xB1,0xEF,0x35,0x24,0x24,0x84,0xD2,0xD2,0xD2,0x7C,0xFE,0x26,0xC4, + 0xC5,0xCC,0x71,0x1B,0x9E,0x12,0xF3,0xFE,0x83,0xF9,0xC2,0x8E,0xBC,0x6A,0x2A,0xAB, + 0xF5,0xCC,0x57,0x3B,0x3A,0x27,0x98,0x2E,0xBD,0x64,0xB4,0x7F,0x88,0x79,0xFB,0xA1, + 0x1A,0xE1,0x8F,0xEF,0x1C,0x14,0x77,0x18,0xF1,0x07,0x31,0xE3,0xE2,0xE2,0x78,0x96, + 0x7D,0xC7,0xEA,0xF5,0x5D,0x9B,0xD3,0xE2,0xB6,0x27,0xC5,0xBC,0x74,0x5D,0x25,0xED, + 0x3A,0xE1,0x19,0x31,0xDF,0x77,0x65,0x38,0xCD,0x9C,0x32,0xD2,0x3F,0xC4,0x8C,0x7E, + 0xE6,0x23,0xAF,0xEF,0x17,0x77,0x18,0xF1,0x07,0x31,0xAF,0x79,0x69,0x82,0xCF,0x7F, + 0x41,0x5A,0xE7,0x83,0xD5,0x85,0xC2,0x87,0x6B,0x8A,0xC5,0x6D,0x2E,0xE6,0xCE,0x85, + 0x0F,0x4D,0x71,0x38,0x7E,0x02,0x17,0x33,0x87,0xE3,0x27,0x28,0x8A,0xB9,0xE1,0xDC, + 0x79,0xB6,0xC5,0xE1,0x70,0x7C,0x01,0x45,0x31,0x37,0x36,0xF9,0xBE,0x98,0x11,0x0B, + 0xB0,0xF7,0x60,0x87,0x72,0x38,0x3E,0x8F,0x9F,0xBA,0xD9,0x3A,0xD2,0xE9,0x88,0x10, + 0x98,0xB1,0xF7,0xF8,0x71,0xE7,0x29,0x2E,0x68,0x8E,0x5F,0xE0,0xA7,0x62,0x16,0x48, + 0xD0,0x4B,0xF4,0x85,0x7B,0x07,0xE9,0xEC,0x3D,0x26,0x0F,0x4B,0xE6,0x11,0x6F,0x8E, + 0x5F,0x20,0x8A,0x39,0x34,0xC4,0x4F,0x35,0xCD,0xE1,0x04,0x10,0xA2,0x8A,0xE3,0x63, + 0xC2,0xC4,0x06,0x87,0xC3,0xF1,0x5D,0xB8,0x49,0xE6,0x70,0xFC,0x04,0x2E,0x66,0x0E, + 0xC7,0x4F,0x50,0x14,0x73,0x4B,0x6B,0x3B,0xDB,0xE2,0x70,0x38,0xBE,0x80,0xA2,0x98, + 0x6B,0xCE,0xB4,0xB2,0x2D,0x0E,0xA7,0x73,0xA8,0xA9,0xA9,0x11,0xB6,0xFD,0xB2,0x57, + 0x28,0xAB,0x3C,0x4D,0xC7,0x2B,0x3D,0x37,0x82,0xB8,0xFD,0x48,0x1B,0xE5,0x6E,0xDE, + 0x26,0xE4,0xE5,0x1F,0xF5,0xE9,0x61,0x4A,0x71,0x58,0xA6,0xBC,0xBA,0x49,0xB8,0xED, + 0xAF,0x3B,0xC4,0x1D,0x46,0x50,0xB1,0x73,0xE9,0x13,0x23,0x7C,0x6E,0xD8,0x46,0x3A, + 0xD1,0xE2,0x85,0x7B,0x07,0xB2,0x2D,0xD7,0x89,0x8B,0x09,0xA3,0x1E,0x29,0x91,0x7C, + 0x18,0xCB,0x02,0x4F,0x4C,0xB4,0x38,0x75,0xEA,0x94,0x70,0xE4,0x58,0x11,0x95,0xD4, + 0x08,0xB4,0x76,0x4F,0x0B,0x9D,0xF0,0xA0,0x90,0x8D,0x60,0x40,0xE7,0xA2,0x6C,0x1D, + 0x5D,0x3E,0x24,0x94,0xBA,0x76,0x8D,0xA1,0xA1,0x83,0xFB,0xFB,0xDC,0x77,0x6D,0x3A, + 0x61,0xCB,0x79,0xC0,0xBE,0x2D,0x66,0x24,0x8D,0x08,0x34,0xB8,0x77,0x37,0xB6,0xD7, + 0x75,0x20,0xE6,0xC7,0x6F,0xBD,0x80,0x8B,0xD9,0x02,0x77,0x8B,0x79,0xF3,0xCF,0xBB, + 0x84,0xFC,0xD2,0x56,0xFA,0x76,0x67,0x0B,0xD5,0x35,0xB2,0x9D,0x5E,0xA6,0x7F,0x7A, + 0x10,0x4D,0x1F,0x1A,0x4A,0xE9,0x29,0xDD,0x68,0xF0,0x80,0xBE,0x3E,0xF3,0x9D,0x2B, + 0x8A,0x19,0x17,0xEF,0x7F,0x9F,0x1E,0xE5,0xA3,0x62,0x36,0xC0,0xA7,0x40,0x7A,0x1E, + 0x77,0x89,0x79,0xEF,0x81,0x7C,0xA1,0xB0,0xEC,0x34,0x7D,0xB2,0xB1,0x99,0xAA,0xCE, + 0xB0,0x9D,0x9D,0xCC,0x88,0xDE,0x7A,0x51,0x5F,0x14,0x46,0x7D,0x7A,0x67,0x52,0xF7, + 0xD4,0x14,0xCD,0x5F,0x4B,0x8A,0x7D,0xE6,0xDA,0x33,0xBC,0xA0,0x1F,0xC7,0x3B,0x6C, + 0xDC,0xFC,0x8B,0xB0,0x6C,0x7D,0x15,0xBD,0xFA,0xAD,0x76,0x84,0x0C,0x76,0x1C,0x6D, + 0xA7,0x17,0xBF,0x6E,0xA6,0x75,0x5B,0x0B,0x69,0xC7,0xAE,0xFD,0x9E,0xF7,0xF5,0x5D, + 0x84,0x0F,0x4D,0x71,0x3A,0x8D,0x43,0xF9,0xC7,0x85,0xE5,0xDF,0x6D,0x17,0x16,0xAF, + 0x6C,0x12,0x85,0xA3,0x45,0xCE,0xB5,0x08,0xF4,0xE1,0x4F,0x2D,0xF4,0xDE,0xDA,0xD3, + 0xF4,0xD3,0xA6,0x1D,0x9A,0x16,0xB4,0x49,0xCC,0x7C,0x89,0x1A,0x8E,0x37,0xD9,0xBD, + 0xEF,0xB0,0xF0,0xCD,0x96,0x53,0xF4,0xC6,0x77,0xCD,0xD4,0xD0,0xA4,0x79,0xA3,0x47, + 0x47,0xCA,0x05,0xD1,0x4A,0x7F,0xFB,0xC3,0x0E,0xE1,0x54,0x65,0xB5,0x26,0x4F,0x98, + 0x5B,0x66,0x8E,0xD7,0xD9,0xF6,0xCB,0x01,0xE1,0xCB,0x4D,0xB5,0xB4,0x66,0x8F,0x6F, + 0x0D,0x7F,0xC2,0x4A,0xBF,0xF6,0x6D,0x13,0x6D,0xDC,0x71,0x9C,0x0A,0x8B,0x4B,0x35, + 0x27,0x68,0x9B,0x62,0xC6,0x90,0x15,0xDB,0xE4,0x70,0xDC,0x42,0xEE,0xCF,0xBB,0x85, + 0x8F,0xD6,0x9F,0xA6,0xAD,0xF9,0xBE,0x39,0x5F,0xFE,0xBC,0xBE,0x37,0xF0,0xD6,0xDA, + 0x26,0xFA,0x61,0x7B,0x09,0xE5,0xE5,0x7B,0xA8,0x28,0x99,0x93,0x70,0xCB,0xCC,0xF1, + 0x1A,0x18,0x76,0x7A,0x67,0x4D,0x23,0x1D,0x2A,0xF1,0xFD,0xEC,0xC2,0x4F,0x72,0x9B, + 0xE9,0x87,0x9D,0xA7,0xE8,0xC8,0xB1,0x22,0xCD,0x08,0xDA,0x24,0xE6,0xD4,0xF8,0x70, + 0xB6,0xE5,0x3F,0xC8,0x55,0x16,0xB1,0x7C,0xB0,0x43,0x39,0x1E,0xE6,0x97,0xDD,0x07, + 0x85,0x2F,0xB6,0x34,0x79,0xAC,0xF6,0x75,0x67,0xB0,0x62,0x5B,0x0B,0xED,0x39,0x7C, + 0x8A,0xB4,0xD2,0x87,0xB6,0x69,0x99,0x2B,0x6A,0x9B,0xD8,0x96,0x6F,0x81,0x01,0x41, + 0xB5,0x95,0x46,0x36,0xED,0xAB,0xE2,0x82,0xF6,0x30,0x05,0x47,0x4F,0x08,0x3F,0xED, + 0x3B,0x43,0xFB,0x8A,0xDA,0xD8,0x1E,0xFF,0xE1,0xDF,0xDF,0x37,0xD1,0xBE,0x43,0xC7, + 0x59,0xAB,0x73,0x31,0x0D,0x84,0x3F,0xFE,0xF6,0x01,0x61,0x47,0x5E,0x2D,0x6B,0x19, + 0x40,0x3A,0xE4,0x90,0x3E,0xB1,0x9A,0x1F,0x2C,0x97,0xC2,0x93,0x46,0xBC,0x8B,0xBD, + 0xA4,0x11,0x58,0x2D,0x04,0x8C,0xD0,0xCF,0xF4,0x57,0x62,0xA3,0x88,0xEE,0xBF,0x32, + 0x92,0x26,0x8C,0x1D,0xD6,0xA9,0xD7,0x9B,0xC9,0x32,0xCB,0x15,0x28,0xE0,0x33,0xA7, + 0x38,0xAE,0x72,0xF0,0xF0,0x71,0xD1,0x7A,0xF9,0x33,0x48,0x3B,0xFD,0x78,0xE3,0xB9, + 0x4E,0x4F,0x2C,0xB1,0xE9,0x66,0xF3,0x99,0x53,0x1C,0x57,0xD8,0xB5,0xF7,0x90,0xB0, + 0xFC,0xE7,0x16,0x31,0x02,0xEC,0xEF,0x60,0x1C,0xFA,0x78,0xD9,0x39,0x71,0xA6,0x17, + 0xDB,0xE5,0x75,0x4C,0x62,0x8E,0xEA,0x12,0xCC,0xB6,0x38,0x1C,0xD7,0xC1,0x45,0x7D, + 0xE4,0x64,0x83,0x5F,0x44,0xAE,0xD5,0xF2,0x49,0x6E,0x0B,0x1D,0x3A,0x7C,0x8C,0xB5, + 0xBC,0x4F,0x87,0x98,0x23,0xAC,0xC5,0xDC,0xC8,0x0B,0xE1,0x73,0x9C,0xE4,0x50,0xFE, + 0x71,0xFA,0x6C,0x4B,0x33,0x6B,0x05,0x06,0xC8,0x64,0xCB,0xCD,0x3B,0x4F,0xF9,0x47, + 0x8E,0x77,0x8A,0x75,0xB6,0xE9,0x66,0xF3,0x55,0x2D,0x38,0xCE,0x80,0x8B,0x39,0xF7, + 0x50,0x6B,0xA7,0x4D,0x61,0xEC,0x4C,0x36,0x1C,0x38,0x4F,0xC7,0x4F,0x56,0xB3,0x96, + 0x77,0x31,0x89,0x19,0x53,0x1E,0x39,0x1C,0x77,0x50,0x55,0x55,0x29,0x5E,0xD4,0x81, + 0x08,0xE2,0x03,0x3F,0xEC,0x6D,0x16,0x57,0xAE,0x64,0xBB,0xBC,0x86,0x49,0xCC,0x61, + 0xA1,0xD6,0x46,0xBA,0xAE,0xC1,0xB7,0x03,0x60,0x72,0x49,0x22,0xCE,0x3E,0xF4,0xFD, + 0xBF,0x4E,0x8D,0x54,0xFA,0x0A,0x27,0x4B,0x4A,0x85,0x3D,0x85,0x86,0x8B,0x3A,0x50, + 0xD9,0x57,0x24,0x50,0x4D,0xAD,0x61,0xCD,0x6A,0x6F,0x62,0x1A,0x17,0xC3,0x32,0x2D, + 0xCF,0x7D,0x98,0xCF,0x5A,0x06,0x7C,0x71,0x8D,0x66,0x8C,0x33,0x8B,0x27,0xAC,0xFF, + 0xCF,0x9D,0x95,0x46,0xA2,0x22,0x42,0xE8,0xA9,0x3B,0x7C,0xAF,0x94,0x8C,0xA7,0xB1, + 0x1C,0x67,0xEE,0x9B,0x50,0x43,0x6F,0xAC,0x3E,0xEB,0x57,0x99,0x5E,0xCE,0x70,0xCD, + 0xE8,0x30,0x9A,0x39,0x21,0x83,0x32,0xD2,0xBB,0x7B,0xED,0x9A,0x31,0xFD,0x22,0x58, + 0x1F,0xCB,0x05,0xD7,0xC7,0x0D,0x4C,0xF0,0xB9,0x0B,0x98,0x27,0x8D,0x78,0x17,0xA9, + 0x98,0x6F,0x98,0x94,0x42,0xE9,0xD1,0x75,0xB4,0x78,0x65,0x60,0x05,0xBE,0xE4,0x48, + 0x8C,0xC1,0x22,0xEE,0x91,0x34,0x76,0xB4,0xF7,0x12,0x49,0x6C,0x06,0xC0,0xFC,0x61, + 0x25,0x48,0x8E,0xF7,0x38,0x5D,0xDF,0x40,0xEB,0xF7,0xF3,0x0A,0x35,0x00,0x15,0x53, + 0xAA,0xCE,0x78,0x37,0x7D,0xD5,0x24,0xE6,0x94,0x38,0xEB,0xE2,0x04,0x3C,0x03,0x8C, + 0xE3,0x08,0xCD,0xCD,0x4D,0x94,0x57,0xCA,0x1A,0x1C,0xDA,0x71,0xA4,0x95,0x8E,0x1C, + 0xF5,0xDE,0x30,0x95,0x4D,0xCB,0xCC,0x33,0xC0,0x38,0x8E,0xD0,0xA2,0x77,0xE4,0x30, + 0x81,0x9F,0x63,0x00,0x25,0x82,0xAB,0x6A,0xEA,0x58,0xCB,0xF3,0x98,0xC4,0x9C,0x9A, + 0x10,0xC1,0xFB,0x97,0x1C,0x97,0xA8,0x3E,0xC3,0x85,0x2C,0x05,0x41,0x40,0xA1,0xCD, + 0x7B,0xDD,0x0E,0x9B,0x96,0xB9,0xA2,0xC6,0xBF,0x13,0xE4,0x39,0xEE,0xE5,0xF4,0x59, + 0xDE,0x2D,0xB3,0xA4,0xAA,0xC1,0xA6,0xC4,0xDC,0x8A,0xD9,0x6F,0x8A,0xEE,0x12,0xC2, + 0xB6,0x38,0x1C,0xC7,0x71,0x3A,0xE3,0x6B,0x58,0x3F,0x71,0xE4,0xC1,0xF2,0xF1,0xEE, + 0x15,0x51,0xEC,0x00,0xDF,0xE5,0x50,0xF1,0x79,0x3A,0x51,0xE8,0x9D,0x6A,0x24,0x66, + 0x62,0x8E,0xF2,0x33,0x31,0x5B,0x26,0x7E,0xC8,0x3D,0xD8,0xA1,0x1C,0x37,0xD0,0xE4, + 0x62,0x88,0x65,0xD9,0x0B,0xB9,0x02,0x86,0x16,0xC5,0xC7,0x87,0x55,0x42,0x8F,0xA9, + 0x43,0x75,0xAB,0xE7,0x26,0xB2,0x67,0x7D,0x93,0x13,0x95,0xED,0xFA,0x7E,0x73,0x3D, + 0x6B,0x79,0x16,0x33,0x31,0xC7,0xC7,0x84,0xB2,0xAD,0x0E,0x8A,0x2A,0xCE,0xFA,0xE0, + 0x05,0x8F,0xE5,0x69,0xD4,0x55,0x1A,0x41,0xB2,0x0C,0x7B,0x11,0x47,0x4B,0xEC,0xCC, + 0xA3,0x45,0x7B,0x05,0x21,0x68,0x70,0x3F,0xDD,0x65,0x6C,0x97,0x2F,0x72,0xBE,0x8D, + 0xA8,0xBD,0xDD,0x76,0xF7,0x63,0xF9,0xF2,0xE5,0xC2,0xBC,0x79,0xF3,0x84,0x49,0x93, + 0x26,0xE1,0x5A,0x34,0x3D,0xC6,0x8C,0x19,0x23,0xDC,0x74,0xD3,0x4D,0xC2,0x92,0x25, + 0x4B,0x54,0x5D,0xA3,0x66,0x41,0x2F,0x7F,0xA8,0x36,0xC2,0x93,0x46,0xBC,0x8B,0x34, + 0x69,0xC4,0x69,0xE0,0x66,0xDF,0x92,0xA8,0x83,0x65,0x7E,0xAF,0x8C,0xED,0xD3,0xD3, + 0xEB,0x8A,0xA1,0xF4,0xE6,0xD4,0x28,0xD3,0xFE,0xCB,0xE6,0x8E,0xA7,0x85,0x83,0x75, + 0xBA,0x45,0xFA,0xEF,0xF8,0x7B,0x76,0x0C,0x51,0x22,0x3D,0xF9,0xE2,0x05,0x94,0xB9, + 0x6E,0x37,0xDD,0xB5,0xAA,0x51,0x3C,0xE6,0x91,0x94,0x62,0xBA,0xF7,0x03,0xA2,0x37, + 0x1F,0xE9,0x61,0xFA,0xFE,0x37,0x7D,0x98,0x2B,0x3C,0xBD,0xB3,0xE3,0x3D,0xB0,0xAF, + 0x68,0xED,0x2E,0x01,0xAF,0x31,0x82,0xDF,0xF7,0xFA,0xE0,0x6A,0xBA,0x77,0xD1,0x59, + 0xBA,0x55,0xFF,0x9E,0xE3,0x75,0xF2,0xC7,0x39,0x02,0xAA,0x90,0x3C,0x78,0x55,0x04, + 0x8D,0x1B,0x63,0xBD,0x6E,0xDB,0xE2,0xC5,0x8B,0x85,0xE7,0x17,0x2D,0xA2,0x8A,0xF2, + 0x72,0xB6,0x47,0x99,0xF0,0x88,0x08,0x9A,0x3F,0x6F,0x1E,0x2D,0x5C,0xB8,0x90,0xD2, + 0xD2,0xD2,0x64,0xAF,0x6B,0x0B,0xCB,0x6C,0x3D,0xD9,0xA2,0xA6,0x9E,0x27,0x01,0x70, + 0x3A,0x87,0xEC,0x94,0x48,0xF1,0x67,0xA1,0x44,0xE0,0x6A,0x08,0x4A,0xE9,0xA1,0x83, + 0x90,0x21,0x7A,0xDC,0xDC,0x61,0xE1,0xC7,0xDF,0x62,0xE8,0x87,0x4F,0xD8,0xBB,0x49, + 0xBC,0xE1,0x1B,0xDD,0xF8,0x27,0x87,0xB1,0x17,0x31,0xC4,0xD7,0xBE,0xD4,0x4F,0x57, + 0xFC,0x0F,0xF3,0xE3,0x9C,0xED,0xBF,0x37,0xB7,0xEA,0xBD,0x44,0x32,0xB7,0xCC,0xBB, + 0x76,0xED,0x12,0xB2,0xB2,0xB2,0x84,0x05,0x0B,0x16,0x18,0x84,0x9C,0xD1,0x97,0xE8, + 0xA6,0x3F,0x10,0x2D,0x5A,0x4B,0xB4,0xA2,0xAE,0xE3,0xF1,0xDA,0x36,0xA2,0x79,0x2F, + 0x11,0x0D,0x9C,0x40,0xCD,0x4D,0x4D,0xF4,0xF2,0xCB,0x2F,0x53,0xBF,0xFE,0xFD,0x45, + 0x4B,0xCE,0xDE,0xCA,0x0C,0x33,0x31,0xC7,0x75,0xB5,0x76,0xB3,0x1B,0xCE,0xF9,0x5F, + 0x11,0x36,0x8E,0xF6,0x81,0x95,0x84,0x05,0x85,0x55,0xEC,0xB0,0xC2,0xEA,0x91,0x5A, + 0xEF,0xEF,0xF7,0x1A,0xA6,0x24,0xE2,0xBD,0x60,0x9D,0x45,0x76,0x56,0xD1,0x26,0x41, + 0x10,0xC6,0x0E,0xB6,0xEE,0x93,0xC3,0x8A,0x9B,0x3C,0x04,0xE6,0xEE,0x67,0x0C,0x4E, + 0xA0,0x5E,0x6C,0x97,0x23,0x60,0xDC,0x5D,0x2A,0xE6,0x55,0xAB,0x56,0x09,0x63,0xC6, + 0x8E,0xA5,0x13,0x27,0x4E,0xE8,0xEF,0x56,0x83,0x88,0x1E,0xFB,0xC8,0x20,0x5A,0x88, + 0xF9,0x82,0x91,0xEC,0x28,0x06,0x44,0x3E,0xFD,0x0E,0xA2,0x67,0x57,0xEA,0xCD,0xF8, + 0x46,0xBD,0x07,0x33,0x85,0x4E,0xD7,0xD5,0xD1,0x35,0xD7,0x5C,0x23,0x5A,0x75,0x76, + 0x94,0x09,0x33,0x31,0x87,0x06,0x5B,0x5B,0x6F,0xBE,0x80,0x1C,0xC7,0x5B,0xDC,0xF4, + 0x48,0x47,0x24,0xDB,0xE8,0x5E,0x3B,0xEB,0xDE,0x9A,0x51,0x76,0x56,0xFC,0x51,0x5C, + 0x21,0x7D,0xAF,0x73,0x54,0x7C,0x8A,0x6D,0x5A,0x90,0x6B,0x14,0x3C,0xE3,0x78,0xC5, + 0x59,0xD1,0x62,0x4F,0x4A,0x63,0x3B,0x1C,0xA4,0xB5,0xCD,0x20,0xB3,0x2D,0x5B,0xB6, + 0x08,0xB3,0xF4,0x42,0x84,0x95,0xA5,0x8B,0xAF,0x33,0x58,0xE2,0xD1,0x57,0x89,0xCF, + 0xD9,0x05,0xC2,0xFF,0xF3,0xE7,0x44,0xD7,0x2D,0x10,0x9B,0xB0,0xEA,0x6F,0xBC,0xF1, + 0x86,0x99,0xA0,0xCD,0xC4,0x2C,0xB7,0xDE,0x94,0xAF,0x4F,0x83,0xE4,0xF8,0x0E,0x66, + 0xD1,0x6C,0xFD,0x43,0xDA,0x7F,0xF6,0x75,0x8A,0x8A,0x8A,0x04,0x58,0x54,0x93,0x90, + 0x1F,0xFA,0x37,0x51,0x98,0x13,0xEB,0xBB,0xDD,0xFA,0x24,0xD1,0x9D,0xCF,0x89,0x9B, + 0xF3,0xE7,0xCF,0xA7,0x1F,0x7F,0xFC,0xD1,0x24,0x68,0x33,0x31,0x47,0xCB,0xD4,0x01, + 0xE3,0x6E,0x36,0x87,0x63,0xC0,0xD1,0xBE,0xBB,0x91,0xD0,0xE0,0x76,0x7A,0xE9,0xA5, + 0x97,0xA8,0x1C,0xFD,0x63,0xB8,0xD2,0xF7,0xFD,0x8B,0x3D,0xE3,0x24,0x33,0xE7,0x1B, + 0x1E,0x7A,0x60,0xA1,0x8D,0x58,0x88,0xD9,0x7A,0x9C,0x99,0xBB,0xD9,0x1C,0xAD,0x00, + 0x77,0xD7,0x8A,0xB4,0x48,0x53,0xD4,0xD9,0x5D,0xF4,0xB4,0x70,0xA7,0x11,0x88,0x6B, + 0xAF,0x28,0x12,0x9C,0x29,0x75,0x1F,0x1D,0xA1,0xA3,0xC3,0xF9,0x47,0xC5,0xE0,0x95, + 0x68,0x89,0x9D,0xB5,0xC8,0x96,0xC0,0x42,0xC7,0xA5,0xD0,0xEE,0xDD,0xBB,0x4D,0x01, + 0x31,0x73,0x37,0x5B,0x66,0xE6,0x54,0x79,0x8D,0xEF,0xCE,0x4D,0xC5,0xB0,0x89,0xBB, + 0x1E,0xDF,0x6D,0xAB,0x90,0x8D,0x20,0x72,0xBC,0xC7,0xB1,0xDD,0x86,0x40,0xD6,0x1C, + 0x63,0x64,0x39,0xAD,0x07,0xAD,0x91,0x0C,0x3F,0xB9,0x0B,0xF4,0xDD,0xEF,0x30,0x0A, + 0x7A,0x58,0x3F,0x31,0x10,0xB7,0x65,0x6D,0x11,0x39,0x53,0x77,0x33,0x24,0x58,0xA0, + 0x75,0xEB,0xF4,0x7D,0x63,0x70,0xE9,0xCD,0x44,0xC9,0x3D,0x0C,0xDB,0x12,0xEE,0x1E, + 0xD9,0x8D,0x68,0x56,0xAC,0x6E,0x2C,0x6B,0x4B,0x31,0x3E,0xC7,0x9A,0x1D,0xE0,0x86, + 0x70,0xED,0x83,0xE2,0xE6,0x5B,0x6F,0xBD,0x25,0xFE,0x34,0x13,0xB3,0xDC,0x64,0x0B, + 0x9E,0x9F,0x6D,0xA0,0x96,0x0F,0xD1,0x75,0x3E,0x65,0x45,0x34,0x6F,0x6D,0xA3,0x38, + 0x54,0x24,0x06,0xCA,0xC4,0xE1,0xA7,0x5D,0xC2,0xB2,0x0A,0xC1,0xAD,0x37,0xDA,0x45, + 0x2F,0x14,0x09,0xA6,0x60,0xDC,0x2D,0x89,0x3A,0xE3,0x18,0xB5,0x33,0xC4,0x46,0xEA, + 0x68,0xE3,0x4F,0x1B,0x0C,0x8D,0x09,0xD7,0x1A,0x7E,0x5A,0xF0,0x76,0xA9,0x21,0x2E, + 0x75,0x43,0x8C,0xF8,0x43,0x42,0x28,0x5D,0xDD,0x9D,0xE8,0x9B,0xED,0x0A,0x99,0x8A, + 0xB8,0x39,0xE8,0x59,0xBF,0x7E,0xBD,0xF8,0xD3,0x4A,0xBC,0x37,0x3E,0xB9,0x4D,0xB0, + 0x74,0xAD,0xF1,0x47,0xB1,0x4D,0xCD,0x83,0xC0,0x09,0xDB,0xE4,0x49,0x23,0x5E,0x00, + 0x5E,0x8B,0xCB,0x49,0x23,0x1A,0xC1,0x98,0xA4,0x62,0x9E,0x94,0xE2,0x1A,0x3D,0xBB, + 0xD6,0xD2,0x3B,0x4F,0xCD,0x24,0x8A,0xD2,0x5B,0xD8,0x25,0x87,0x15,0x5C,0xEC,0x50, + 0xFA,0xE6,0xEA,0x48,0xEA,0x7B,0xF8,0x0C,0xE5,0xE4,0x49,0xC6,0xA4,0xD3,0x23,0x89, + 0x46,0x86,0xE9,0xEE,0x5E,0x51,0x27,0xBC,0xCD,0x76,0x59,0xF1,0xCC,0x6C,0xA2,0x9D, + 0xEB,0x10,0x08,0x33,0xB7,0xCC,0x20,0x5E,0x66,0xAC,0x99,0x17,0xB3,0xE3,0xA8,0x21, + 0xDA,0x0D,0x5D,0x41,0x7F,0xA3,0x5B,0x10,0x1B,0xFF,0xC2,0x98,0xB1,0x62,0x5F,0xB9, + 0x95,0xBE,0x2A,0x25,0xCA,0xE9,0xD7,0xD5,0xCC,0xD5,0xBE,0xBB,0xBB,0x41,0x8B,0x8A, + 0x42,0x06,0xCC,0x6D,0xC7,0xB8,0xB5,0x95,0x98,0xE5,0x4A,0xEE,0xFA,0xEA,0x6A,0x90, + 0x1C,0xEF,0xD2,0xB5,0x0B,0xDB,0xE0,0x98,0x08,0x69,0x61,0xA9,0x9A,0xB1,0xC9,0x86, + 0x9F,0x0A,0xBC,0x9D,0xD7,0x44,0x05,0xC2,0x79,0xA1,0xC3,0xD5,0xB6,0xE3,0x62,0x1B, + 0x61,0xEF,0x8B,0x48,0xB9,0x95,0x98,0xE5,0xD6,0x69,0xAE,0xA9,0xE7,0x63,0xCD,0x1C, + 0xFB,0x24,0xC4,0xF8,0xF6,0x12,0x47,0xC7,0x56,0xED,0x12,0xBB,0x69,0xEE,0x72,0xB1, + 0x43,0xF4,0xEA,0x8A,0x55,0x5B,0x8F,0xFE,0x4C,0x2B,0xAD,0x3C,0x13,0x4C,0x33,0xD2, + 0x99,0x24,0xD3,0x43,0xE9,0x2A,0x9D,0x4E,0xF7,0x55,0x89,0xA1,0x69,0x8F,0x88,0x88, + 0x08,0x6B,0x31,0xC7,0x46,0x5B,0xBB,0xD9,0x7C,0x78,0x8A,0xA3,0x06,0x4C,0x2A,0xE0, + 0x74,0x90,0x91,0xA0,0xA3,0x8C,0xCC,0x9E,0x86,0xC6,0xA9,0x22,0xC3,0x4F,0x45,0xDA, + 0xE9,0xD3,0xD2,0x36,0x93,0xAB,0x0D,0x17,0xBB,0x20,0xAF,0x5E,0xB9,0xAF,0x6C,0x84, + 0xBD,0x6F,0x6A,0x6A,0xAA,0xB5,0x98,0xE5,0xB2,0xC0,0x4E,0x56,0x72,0x37,0x9B,0x63, + 0x9F,0x60,0xFD,0xD5,0x84,0x71,0x55,0x8E,0x81,0x3E,0xA9,0x41,0x34,0x78,0xD0,0x85, + 0x86,0x46,0x49,0x01,0x51,0xA3,0xED,0xC2,0xF8,0x5B,0x4A,0x5A,0x99,0xAB,0x0D,0x17, + 0xBB,0x8D,0x56,0xAA,0x59,0x74,0xEF,0xF8,0x3E,0xF1,0x47,0x56,0x56,0x96,0x3A,0x37, + 0xBB,0xF8,0x94,0xCC,0x60,0x3D,0x87,0x63,0x41,0x64,0x97,0x48,0x1A,0x9A,0x65,0x75, + 0x49,0x05,0x2C,0x43,0x7B,0x85,0xE8,0xC5,0x3C,0x50,0x37,0x69,0xD2,0x24,0xA2,0x16, + 0xBD,0x41,0xDC,0xB9,0x8E,0x3D,0xA3,0x80,0xD1,0xD5,0x1E,0x19,0xAE,0x77,0xB1,0x43, + 0x74,0x9F,0x9E,0x61,0xFB,0x95,0x80,0x55,0xD6,0x8B,0x39,0x36,0x36,0x96,0xC6,0x8E, + 0x1D,0xAB,0xB3,0xFA,0xE4,0xE5,0xE6,0x2E,0x57,0xF8,0x68,0xE2,0x88,0x65,0xE2,0x87, + 0xDC,0x83,0x47,0xEA,0xDD,0x47,0xD7,0xAE,0xD1,0x34,0xBE,0x3F,0x2F,0x3D,0x05,0x32, + 0xF5,0x2E,0x76,0xD7,0x48,0x43,0x97,0xF5,0xF2,0xCB,0x2F,0x17,0x7F,0x52,0xEE,0x97, + 0x86,0x9F,0x8A,0x30,0x57,0xBB,0x6B,0x88,0x0E,0x2E,0xF6,0x16,0xB6,0x57,0x91,0xAF, + 0xDF,0x10,0x7F,0xCC,0x9A,0x35,0x4B,0xFC,0x29,0x7B,0x1B,0x0D,0x43,0xCF,0x5D,0x82, + 0x3F,0xAF,0x06,0xC9,0x0B,0xFD,0xBB,0x8F,0x90,0x90,0x10,0x8A,0x8E,0x0C,0xA7,0xAC, + 0x24,0xEE,0x6A,0x5F,0x7C,0x61,0x28,0x65,0xF7,0xEC,0x2E,0x6E,0xCF,0x9D,0x3B,0x97, + 0xBA,0xE9,0xAD,0x27,0xFD,0xFC,0x8D,0xC9,0x2D,0x56,0x62,0x4B,0x5E,0x03,0xE6,0x32, + 0x0B,0x66,0xE3,0xCD,0x72,0xD4,0x56,0x10,0x7D,0xB7,0x44,0xDC,0x7C,0xE0,0x81,0x07, + 0xC4,0x9F,0xB2,0x62,0xCE,0x4C,0xB1,0x1E,0x63,0x38,0x78,0xA2,0xDE,0xE7,0x2C,0xD8, + 0x6D,0xD3,0x7B,0xEA,0xEC,0x3D,0x7C,0xA9,0x8A,0x8A,0x2F,0xD0,0x27,0x3B,0x83,0xA6, + 0x0E,0x09,0xEC,0x15,0x45,0x11,0x37,0xC8,0xD1,0xF7,0x97,0x93,0x93,0x93,0xC5,0x6B, + 0x0B,0x95,0x41,0x9E,0x7A,0xF2,0x49,0xF1,0x39,0x7A,0xEE,0xFF,0x0C,0x42,0x74,0x95, + 0x57,0x7F,0x2B,0xBA,0xEE,0xB0,0xCA,0x43,0x87,0x0E,0x15,0x7F,0x8F,0xAC,0x98,0xE5, + 0x72,0xB4,0x8B,0x4F,0x9D,0x63,0x5B,0x1C,0x8E,0x32,0xF1,0xF1,0xF1,0xBA,0xEE,0x71, + 0xBA,0x80,0x0E,0x84,0x21,0x6E,0x90,0x94,0x18,0xCF,0x5A,0x06,0x16,0x2C,0x58,0xA0, + 0x1B,0x33,0x66,0x8C,0xA1,0x9F,0xFB,0xE2,0x9D,0x76,0x83,0x61,0x36,0xF9,0xE7,0xBD, + 0x62,0xFF,0x1B,0x7D,0xE5,0xC5,0x8B,0x17,0xB3,0x9D,0x4A,0x62,0x96,0x09,0x82,0x9D, + 0xAC,0xE4,0x62,0xE6,0xA8,0xA3,0x67,0xCF,0x74,0xBA,0x6A,0xB8,0xF5,0x10,0x67,0x20, + 0xD0,0x25,0x4C,0x47,0x13,0x07,0x84,0x52,0xDF,0x9C,0x5E,0x56,0x77,0xB3,0x4F,0x3E, + 0xF9,0x44,0x1C,0x42,0xA2,0xFD,0xB9,0x44,0x4F,0xCC,0x50,0x31,0x5C,0x65,0x01,0x6E, + 0x00,0xB0,0xEC,0x3F,0x7C,0x2C,0x8E,0x2B,0x2F,0x5F,0xBE,0x9C,0xB2,0xB3,0xB3,0x4D, + 0xBF,0x47,0x56,0xCC,0x19,0x49,0xD6,0x6E,0x76,0x71,0x05,0x17,0xB3,0xBF,0x50,0x5C, + 0x5C,0x2C,0x6C,0xDD,0x77,0x48,0xD8,0xBC,0xE7,0x80,0xF8,0xD8,0x7E,0xE0,0xB0,0x80, + 0x7D,0xEC,0x69,0x97,0xC9,0xE8,0x9E,0xA6,0x1B,0xD0,0x23,0x94,0xD2,0xF4,0x16,0x3A, + 0xD0,0x98,0x3E,0x34,0x94,0x7A,0x65,0x19,0xFA,0xCA,0x96,0x40,0x78,0xC8,0xA1,0xEE, + 0xD7,0xAF,0x9F,0xA1,0xEF,0xFC,0xBB,0x51,0x44,0xCB,0x9E,0x57,0x67,0xA5,0xD1,0xDF, + 0x5E,0x70,0xB1,0xF8,0x13,0x16,0x79,0xD5,0xAA,0x55,0x34,0x79,0xF2,0x64,0xB3,0x0F, + 0x58,0xF6,0xD3,0x46,0x84,0xF7,0xDE,0x97,0x76,0xB3,0x96,0x81,0xCC,0xE4,0x2E,0xF4, + 0xEF,0x3F,0x0C,0xD7,0xFC,0xB7,0xC3,0x27,0x5A,0xC8,0x53,0x5C,0x5A,0x26,0x14,0x9D, + 0x2C,0xA1,0xB2,0xF6,0x30,0x5A,0xDD,0x10,0x49,0xFB,0x5B,0x22,0xA8,0x85,0xDD,0xCB, + 0x63,0x82,0xDA,0x29,0x27,0xA4,0x89,0x7E,0x15,0xD3,0x48,0x71,0xBA,0x56,0xCA,0xCA, + 0xCC,0xA0,0xCC,0xB4,0x54,0x55,0x9F,0x1D,0x46,0x04,0x8C,0x13,0x2D,0xB0,0x3E,0x33, + 0xE2,0x10,0x62,0x43,0xCF,0xDA,0x0D,0xDB,0x85,0x17,0xBE,0x0A,0x9C,0xE5,0x5D,0x71, + 0xF3,0x9A,0x3F,0x3D,0x92,0xC6,0x8C,0x34,0xF4,0x61,0x6D,0x81,0x12,0xBA,0xCB,0x96, + 0x2D,0x33,0x34,0x90,0xB3,0x8D,0xF2,0x41,0x98,0x55,0x85,0x09,0x19,0x46,0x30,0x9C, + 0xB5,0xED,0x5B,0x83,0x90,0x59,0x3F,0x1B,0xAE,0x3A,0x2C,0xBC,0xD4,0x22,0x1B,0x51, + 0xFC,0xA5,0x33,0x1E,0xDD,0x2C,0xB4,0x58,0x2C,0x7F,0xEF,0x0B,0xE2,0xE0,0x62,0xB6, + 0x66,0xE3,0x2F,0xBB,0x85,0xEF,0x1A,0xA3,0xE8,0x95,0xBA,0x04,0x3A,0xD3,0x2E,0xEB, + 0x8C,0x99,0x48,0x08,0x3A,0x4F,0x0B,0xE2,0x6A,0x68,0x62,0xE4,0x59,0xBA,0x78,0xF8, + 0x45,0x76,0x3F,0x3F,0x5B,0x62,0xCE,0x2F,0x38,0x26,0xFC,0xF7,0xC7,0x0A,0xDA,0x98, + 0x17,0x18,0xD5,0x6A,0x1E,0xB9,0x3A,0x9C,0xA6,0x4E,0x1C,0xA9,0xFA,0x9A,0x43,0xC9, + 0x9F,0xA7,0x9F,0x7E,0xDA,0x34,0x85,0xD1,0x16,0x48,0x0A,0x79,0xEE,0xB9,0xE7,0x68, + 0xCE,0x9C,0x39,0x8A,0xEF,0xAF,0xF8,0xCD,0xCA,0x45,0xB4,0xF9,0x0A,0x10,0xBE,0xC7, + 0xD7,0xDB,0xF6,0x0A,0xB7,0x94,0xA6,0xD1,0xB3,0x35,0x49,0x76,0x85,0x0C,0xAA,0xDB, + 0x43,0xE8,0x89,0xEA,0x64,0xC2,0x6B,0xF0,0x5A,0xB6,0xDB,0x29,0xD0,0x6F,0x9C,0x3C, + 0x28,0x3C,0x20,0xD2,0x3C,0x27,0x0D,0x08,0xA1,0x8C,0xD4,0x04,0xD6,0x52,0x07,0xDC, + 0x64,0xBD,0x90,0x75,0x65,0x65,0x65,0x28,0xCE,0x47,0xF3,0xE6,0xCD,0x23,0x24,0x98, + 0x18,0x1F,0x7A,0xEB,0x2D,0x0A,0xF8,0xD0,0xA1,0x43,0x98,0x15,0xA5,0xB3,0x25,0x64, + 0xA0,0xF8,0xE4,0x3F,0x3F,0x3F,0x22,0xAC,0xDC,0x6C,0x5E,0x9C,0xFB,0x8E,0x2B,0x7B, + 0xD2,0x4D,0x53,0x32,0x55,0xDF,0x79,0x3A,0x03,0xA9,0x65,0x86,0xA5,0x70,0x17,0x48, + 0x73,0xBD,0x7C,0x54,0x8A,0xA6,0xFF,0x76,0x4B,0x96,0x6D,0xDD,0x27,0xFC,0xE6,0x54, + 0xBA,0x2A,0x11,0xCB,0x01,0xF7,0xFB,0x3F,0xC9,0x27,0xE9,0xDA,0x31,0x83,0x15,0xFF, + 0x6E,0x5B,0x96,0xD9,0xC8,0xB7,0x3F,0xEC,0x10,0x5E,0xFB,0xB6,0x89,0x2C,0x1C,0x3D, + 0xBF,0x01,0x09,0x22,0x77,0x4D,0x8B,0xA6,0xB1,0x23,0x87,0x74,0xEA,0xF5,0xA1,0xF8, + 0x2D,0x5F,0xD0,0xC3,0xAA,0xEC,0x01,0xE5,0x15,0x35,0xB0,0xAD,0xC0,0xA3,0xD1,0xC7, + 0x12,0x67,0x56,0x6F,0xDF,0xE3,0x92,0x90,0x01,0x5E,0xFB,0x9B,0x53,0xDD,0xE9,0xDB, + 0xED,0xAE,0x59,0xE8,0x61,0x03,0x7A,0xD2,0xAD,0x93,0xFC,0x73,0xEC,0x19,0x5E,0xC7, + 0x6D,0x93,0xBA,0x74,0xBA,0x90,0x81,0xE2,0x09,0x60,0x8D,0xA9,0xBB,0x16,0x99,0xD7, + 0x4A,0x41,0xC1,0xBF,0x2F,0xFF,0x3A,0xA6,0xD3,0x4F,0xDA,0x16,0xBC,0xCF,0x4C,0x84, + 0xE8,0xF4,0xC3,0xC5,0x51,0xB4,0xA1,0x29,0x9A,0xED,0x71,0x8D,0x89,0x11,0x0D,0xF4, + 0x8F,0xCC,0x46,0x1A,0x39,0xE0,0x02,0xAB,0xCF,0x53,0x8D,0x65,0x06,0x87,0xF2,0x8F, + 0x0B,0xDF,0x6C,0x39,0x45,0x6B,0xF6,0xF8,0xCF,0x74,0x5A,0x24,0x4A,0x3E,0x30,0x43, + 0xEF,0xB1,0x4D,0xB2,0x5E,0x7A,0xA6,0x33,0x50,0xBC,0x6D,0xF7,0x48,0x89,0xD4,0x59, + 0x56,0xEB,0x44,0x5A,0x27,0xCF,0x65,0xD6,0x3E,0x65,0x0D,0x4D,0x76,0x85,0x3C,0xB6, + 0x9F,0xFE,0x79,0x85,0x22,0x72,0x96,0xE0,0xBD,0xF0,0x9E,0xAE,0xD0,0xBF,0x6F,0xB6, + 0x6E,0xF2,0x90,0x18,0x1A,0x9A,0xE5,0xDB,0x73,0x9E,0x8D,0x40,0xC8,0x77,0x5E,0x16, + 0x41,0x43,0x07,0x64,0xB3,0x3D,0x9D,0x8F,0x4D,0x1F,0x6C,0x70,0x6F,0x49,0x98,0x9C, + 0xB1,0x79,0xBF,0xA1,0x42,0x22,0x47,0x9B,0xFC,0x72,0x28,0x5F,0x78,0xB5,0x36,0x8E, + 0xB5,0xDC,0x07,0xDE,0x13,0xEF,0xCD,0x9A,0x4E,0x31,0xFC,0xA2,0x0B,0x75,0x37,0x5C, + 0xD2,0x4D,0x0C,0x16,0xF9,0x32,0x48,0x0C,0x99,0x77,0x79,0x04,0x8D,0x1A,0x94,0x41, + 0xC9,0x49,0xFA,0x0E,0xB3,0x46,0xB0,0x29,0xE6,0xE1,0x17,0xC4,0xB2,0xAD,0x0E,0xF6, + 0x1D,0xF3,0xCE,0x5A,0xB3,0x1C,0xE7,0x68,0x3C,0x53,0x4F,0x5B,0x5B,0xDC,0xE3,0x5E, + 0x4B,0xC1,0x7B,0xE2,0xBD,0x5D,0x05,0x82,0xBE,0x66,0x42,0x32,0xCD,0x1E,0x6B,0x9D, + 0x65,0xE8,0x0B,0xA0,0x8F,0x7C,0xEF,0xF4,0x08,0xFA,0xD5,0xD4,0x11,0xBA,0xCC,0x0C, + 0x75,0x63,0xF1,0xDE,0xC2,0xA6,0x98,0x47,0xF6,0xB3,0xBE,0xC3,0xEF,0x39,0xE2,0x42, + 0x4E,0x29,0xC7,0xE3,0x9C,0x6A,0x0F,0x73,0x29,0xE8,0xA5,0x04,0xDE,0x13,0xEF,0xED, + 0x0E,0xFA,0x5F,0xD0,0x4B,0x37,0x6D,0x74,0x77,0xBA,0xFD,0xD2,0x30,0xD1,0x5D,0xF5, + 0x15,0xC4,0xA4,0x90,0xCB,0x23,0xF5,0x7D,0x64,0x6D,0x26,0x4F,0xD9,0xFC,0x28,0x51, + 0x47,0x1B,0x99,0x5F,0x96,0x7C,0xBD,0xA9,0x8C,0xF7,0x9B,0x35,0x48,0x4D,0x4D,0x8D, + 0x80,0x71,0x62,0x4F,0x81,0xF7,0xC6,0xEF,0x60,0x4D,0x97,0xC8,0xEA,0x91,0xAE,0x9B, + 0x3C,0x32,0x9B,0x1E,0xFA,0x55,0x84,0x38,0xB4,0xA3,0x75,0x2E,0x1B,0x14,0x42,0xF7, + 0x4C,0x8B,0xA4,0xC9,0x13,0x86,0x69,0xF6,0x64,0xED,0xDE,0x17,0xA7,0x8E,0xB0,0xAE, + 0x2A,0xF8,0xED,0x56,0xFB,0x8B,0x43,0x73,0xBC,0x4F,0x4B,0x4B,0x0B,0x95,0x9F,0xF7, + 0x9C,0x98,0xEB,0xDA,0x82,0xE8,0xFC,0x79,0xF7,0x0D,0xD1,0xA5,0xA6,0x24,0xE9,0x2E, + 0xBB,0x64,0x84,0xEE,0xEE,0x69,0x51,0x74,0xCD,0xE8,0x30,0xB1,0x2F,0xAA,0x35,0x70, + 0xA3,0x41,0x66,0xD7,0x35,0x17,0xA7,0xD0,0xB8,0xD1,0xF6,0xD3,0x34,0x3B,0x13,0xBB, + 0x62,0x96,0x4B,0x12,0x39,0x5A,0xD2,0x48,0x9B,0xF6,0x55,0x69,0xDE,0x3A,0x63,0xD8, + 0xC4,0xDE,0xC3,0x9F,0xA2,0xF3,0x28,0x0E,0x10,0x1B,0xE4,0xB9,0xD4,0xC9,0x08,0x9D, + 0x40,0x41,0x41,0xEE,0xF7,0x8B,0x47,0x8F,0xBC,0x48,0x37,0x73,0x42,0x06,0x3D,0x34, + 0x33,0x9C,0xFA,0x68,0xA4,0x1B,0x0A,0xF7,0x7F,0xE6,0x88,0x50,0xC2,0x8D,0x06,0x29, + 0x9A,0x7D,0xFB,0x58,0xE7,0x42,0x6B,0x0D,0x55,0xDF,0xCC,0xB8,0x81,0xD6,0x69,0x6A, + 0xFE,0xB2,0x8A,0x81,0x3F,0x91,0x98,0x98,0xA8,0x4B,0x0A,0xF6,0x5C,0x72,0x0B,0xDE, + 0x1B,0xBF,0x83,0x35,0xDD,0x4A,0x46,0x7A,0x77,0xDD,0x25,0xE3,0x47,0xE8,0xEE,0x98, + 0xDA,0x8D,0x16,0xCC,0x08,0xA7,0x41,0xEE,0x5F,0x42,0x4A,0x15,0x98,0x87,0x7D,0xF9, + 0x90,0x10,0xFA,0xC3,0x35,0xE1,0x34,0x63,0x5C,0x77,0xF1,0x46,0xC3,0x9E,0xD2,0x3C, + 0xAA,0x4E,0x54,0x6E,0x16,0x15,0x78,0xF2,0xF6,0x7E,0x34,0x7E,0x90,0x67,0xBE,0x5C, + 0x67,0x09,0xF4,0xA4,0x91,0x8D,0x3F,0x6F,0x17,0x2E,0x2E,0xCB,0x61,0x2D,0x65,0x30, + 0xCE,0xBC,0xA5,0x5F,0x88,0x6E,0xEC,0x8A,0x3A,0xFB,0xB5,0xA6,0x18,0x1B,0xD3,0x0A, + 0xE8,0xE2,0xD1,0xE6,0x13,0x09,0xE0,0xDD,0xA8,0x49,0x1A,0x71,0x94,0x3D,0xFB,0xF2, + 0x84,0xBA,0xD3,0xF5,0xF4,0xD3,0xC1,0x36,0xDA,0x92,0xDF,0xE6,0xF1,0x54,0x50,0x44, + 0xA9,0xAF,0x1C,0x16,0x26,0x56,0x08,0x49,0x4D,0x4D,0xA2,0xDE,0xD9,0xEE,0xF9,0x3B, + 0xBC,0x89,0x2A,0xCB,0xDC,0x27,0x23,0x5A,0xC7,0xAD,0xB3,0x6F,0x10,0x1C,0x11,0x49, + 0xC3,0xC2,0xD4,0x57,0x53,0xDD,0x82,0x15,0x06,0xA5,0x0F,0x05,0xF0,0x9E,0x78,0x6F, + 0x6F,0x31,0x64,0x50,0x3F,0xDD,0xC4,0x09,0xA3,0x74,0x37,0x4E,0x4E,0xA1,0xC7,0xAE, + 0x0D,0xA3,0x44,0xEB,0xEC,0x62,0xB7,0x01,0x77,0xFA,0xC1,0xAB,0x22,0xE8,0xCA,0xF1, + 0x59,0x34,0x7E,0xEC,0x08,0x9D,0x2F,0x0A,0x19,0xA8,0xEE,0x00,0xC9,0x4D,0x5A,0x40, + 0xDF,0xF9,0x1F,0x9F,0x14,0xF0,0xC8,0xB6,0x86,0xE8,0x95,0x92,0x40,0x57,0x47,0xDB, + 0xCF,0xA1,0x37,0x16,0x8E,0xB3,0x7A,0x28,0x70,0x63,0x4C,0x3D,0xF5,0x49,0x4B,0x62, + 0x2D,0xEF,0x81,0x99,0x57,0x71,0xB1,0xB1,0x1E,0x8D,0x78,0x67,0x25,0x07,0xD1,0xB8, + 0x31,0x23,0x74,0xC6,0x9A,0x5D,0xBE,0x8A,0x6A,0x31,0x2B,0x59,0xE7,0x35,0xDB,0x2B, + 0xE8,0xCB,0x0D,0x25,0x5C,0xD0,0x1A,0x21,0x35,0x35,0x55,0x37,0x29,0xBA,0x99,0xFA, + 0x86,0xBA,0xAF,0x28,0x00,0xDE,0x6B,0x7C,0x54,0x8B,0xA9,0x40,0x1D,0x47,0x9B,0xA8, + 0x16,0x33,0xB8,0xE3,0xAA,0x9E,0x56,0x65,0x78,0xC1,0x7B,0xDF,0x14,0xD2,0x8F,0x3B, + 0x4F,0x71,0x41,0x6B,0x84,0x89,0xC3,0x06,0xE9,0x9E,0x8A,0x67,0xAB,0x0F,0xBA,0x48, + 0x18,0xB5,0xD3,0x9F,0x13,0xAA,0x68,0xC2,0x30,0xE5,0x69,0x90,0x1C,0x6D,0xE0,0x90, + 0x98,0x31,0xF9,0xE2,0xBE,0xD9,0xBD,0x59,0xAB,0x03,0x54,0x24,0x79,0xEE,0xC3,0x7C, + 0x71,0x0E,0x34,0xDB,0xC5,0xE9,0x64,0xC6,0x64,0x26,0xD0,0x93,0x09,0x95,0xAC,0xE5, + 0x3C,0x4F,0x27,0x56,0xD1,0xF8,0x4C,0xF3,0x4A,0x93,0x1C,0x6D,0xE2,0x90,0x98,0x01, + 0x26,0xE8,0x5F,0x73,0x89,0x7C,0xC1,0x32,0x14,0x33,0x98,0xFF,0xE2,0x2E,0xE1,0xBB, + 0x6D,0x15,0x5C,0xD4,0x9D,0x4C,0xAF,0x8C,0xEE,0xBA,0xD9,0xE9,0xE1,0xB4,0x38,0xA9, + 0x5C,0xB4,0xAE,0x8E,0x82,0xD7,0xE0,0xB5,0x33,0xBA,0x47,0x50,0x76,0x7A,0x1A,0xB7, + 0xCA,0x3E,0x80,0xD3,0x5F,0xD2,0x03,0xAF,0xEC,0x11,0x0E,0x15,0x2A,0x2F,0x86,0x83, + 0x75,0x9E,0xC7,0x0F,0x8A,0x17,0x8B,0x1C,0xF4,0xEE,0x1E,0x25,0xF6,0xB9,0xD9,0x53, + 0x1E,0xC5,0x53,0x95,0x46,0x30,0x1D,0xF4,0xDA,0x89,0xE9,0x3E,0x77,0x51,0x9F,0x28, + 0xAB,0x10,0x76,0x15,0x55,0xD0,0xCB,0xB5,0xF1,0xAA,0xE7,0x37,0x63,0xFE,0xF2,0x83, + 0x71,0x35,0x34,0xB4,0x47,0x0A,0x65,0xA5,0xD9,0xAE,0xAE,0xE2,0xA9,0xA1,0x29,0x29, + 0xFB,0x0F,0xE6,0x0B,0x4B,0xD7,0x55,0xD2,0xAE,0x13,0x9E,0xB1,0x11,0xF7,0x5D,0x19, + 0x4E,0x33,0xA7,0xA8,0xAF,0xDD,0xA5,0x55,0x5C,0xFA,0x03,0xFE,0xB6,0xF4,0xB0,0xB0, + 0x7E,0x97,0x7A,0x57,0xAE,0x77,0x7A,0x94,0x28,0x0A,0x30,0xA8,0x57,0x57,0xF1,0xA7, + 0x3D,0x86,0xF4,0xB1,0x9E,0x86,0xA9,0x04,0x56,0xA7,0xE0,0x65,0x83,0xE4,0x41,0xC1, + 0x02,0xCC,0x49,0x5E,0xD7,0x18,0x49,0xB9,0x4D,0x51,0xB2,0xD5,0x39,0xA7,0x45,0x36, + 0xD2,0xC4,0x2E,0x8D,0x94,0x18,0xDD,0x45,0xB6,0x10,0x81,0x1C,0x5C,0xCC,0xDA,0xC1, + 0xE5,0x3F,0x00,0x93,0x2E,0xDE,0xFA,0xEA,0xB8,0xD8,0x6F,0xD6,0x32,0xB8,0x89,0xE0, + 0x66,0x22,0x05,0x93,0x48,0xEE,0x9F,0xDD,0xC7,0xE7,0xBF,0x44,0x47,0x28,0x29,0x29, + 0x11,0x0A,0xAB,0xEA,0x88,0x9A,0x1A,0x29,0x48,0x30,0x7C,0x67,0x6D,0x41,0x21,0xA4, + 0x0B,0xEF,0x42,0xD9,0xC9,0xF1,0xE2,0x52,0x2A,0xE2,0x4E,0x95,0x70,0x31,0x6B,0x07, + 0xB7,0xFC,0x01,0xC8,0x10,0x7B,0xEF,0xDB,0x42,0xDA,0x91,0x57,0xCB,0xF6,0xF8,0x0E, + 0xBE,0x52,0x0F,0x5C,0xAB,0x70,0x31,0x6B,0x07,0x87,0x03,0x60,0x72,0xA0,0x3F,0xFC, + 0xB7,0xBB,0x07,0xE8,0xDE,0x5D,0x38,0x8C,0x66,0x8C,0x4B,0x95,0x1D,0xBE,0xD2,0x2A, + 0x58,0x43,0xAB,0xBC,0xBA,0xC9,0x33,0x57,0x09,0x87,0xE3,0x45,0xDC,0xAA,0x3A,0x0C, + 0x5D,0xC1,0x6D,0x5D,0xF9,0xF7,0x71,0x3A,0xE4,0x6D,0xE3,0x4E,0x3D,0xA2,0x5F,0x9C, + 0xD8,0xDF,0xD4,0x2A,0xB8,0xF1,0x60,0xDE,0x36,0x6B,0x72,0x38,0x3E,0x8B,0xD7,0x2F, + 0x62,0x63,0x21,0xFD,0xF2,0x9A,0x66,0xAA,0xA8,0x71,0xAC,0x48,0x5C,0x63,0x53,0x1B, + 0x1D,0x2B,0x6D,0x64,0x2D,0x79,0x1C,0xA9,0x84,0x02,0x21,0x23,0x11,0xC6,0x17,0xA3, + 0xD4,0x5A,0x81,0xBB,0xD9,0xDA,0xC1,0xEF,0x2E,0x62,0x69,0x34,0x5B,0x2E,0x12,0x7E, + 0xBE,0xAD,0x9D,0x9A,0x5B,0x0C,0x81,0x9F,0x2E,0x11,0xC1,0x14,0xA4,0xE3,0x3A,0x76, + 0x05,0xE9,0x4D,0x99,0x8B,0xB9,0x73,0xF1,0x6B,0x31,0x73,0xBC,0x8B,0xA7,0xC4,0x9C, + 0x97,0x7F,0x54,0x28,0x2E,0xAB,0xA6,0xA6,0x56,0xCF,0x5C,0xAE,0xF1,0x51,0x02,0x8D, + 0x1F,0x3B,0x8A,0x8B,0x59,0x6B,0x70,0x31,0x77,0x1E,0x9E,0x12,0x33,0x87,0xC3,0xE1, + 0x04,0x10,0x44,0xFF,0x0F,0xF8,0xBC,0x87,0x0F,0x69,0x7B,0x06,0x45,0x00,0x00,0x00, + 0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82, +}; // PlantModel_png, 28345 bytes + +// File: rssi.htm +// +const char rssi_htm[] PROGMEM = { + "\n" + "\n" + "\n" + " Grow Controller RSSI\n" + " \n" + " \n" + " \n" + "\n" + "\n" + "

Grow Controller - RSSI

\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
\n" + " \n" + "
\n" + "
x:xx:xx
\n" + "
\n" + "
-xx
\n" + "
\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
NAV:\n" + " Home |\n" + " Config |\n" + " Scan |\n" + " RSSI |\n" + " Current |\n" + " Factory Reset |\n" + " About\n" + "
\n" + "\n" + "\n" +}; // rssi_htm, 1194 bytes + +// File: rssi.js +// +const char rssi_js[] PROGMEM = { + "//\n" + "// rssi script\n" + "//\n" + "// var mySite = 'http://192.168.1.23' from myip.js\n" + "var url = mySite + '/state';\n" + "var rssiData = [];\n" + "var rssiIndex = 0;\n" + "var axes = {};\n" + "for (var i = 0; i<100; i++)\n" + " rssiData[i] = 0;\n" + "setInterval(RefreshStatus, 250);\n" + "\n" + "// -------------------------\n" + "\n" + "getIt = function (aUrl, callback) {\n" + " var xhr = new XMLHttpRequest();\n" + " xhr.open('GET', aUrl, true);\n" + " xhr.responseType = 'text';\n" + " xhr.onload = function (e) {\n" + " if (this.status === 200) {\n" + " callback(this.response);\n" + " }\n" + " };\n" + " xhr.send();\n" + "};\n" + "\n" + "function RefreshStatus() {\n" + " getIt(url,\n" + " function(data) {\n" + " obj = JSON.parse(data);\n" + " UpdateGraph(obj.rssi);\n" + " document.getElementById('rssi').innerHTML = 'RSSI: ' + obj.rssi;\n" + " document.getElementById('uptime').innerHTML = 'Uptime: ' + obj.uptime;\n" + " }\n" + " );\n" + "}\n" + "\n" + "function RSSIInit() {\n" + " var canvas = document.getElementById('RSSIGraph');\n" + " if (null === canvas || !canvas.getContext)\n" + " return;\n" + " ctx = canvas.getContext('2d');\n" + " axes.w = 0.9 * canvas.width;\n" + " axes.h = 0.8 * canvas.height;\n" + " axes.x0 = 0.07 * canvas.width; // x0 pixels from left to x=0\n" + " axes.y0 = 0.10 * canvas.height; // y0 pixels from top to y=0\n" + " axes.scaleX = 100; // # pixels from x=0 to x=1\n" + " axes.scaleY = 100;\n" + " axes.doNegativeX = false;\n" + " ctx.clearRect(0, 0, canvas.width, canvas.height);\n" + " ctx.rect(0, 0, canvas.width - 1, canvas.height - 1);\n" + " ctx.strokeStyle = 'black';\n" + " ctx.lineWidth = 1;\n" + " ctx.stroke();\n" + " showAxes(ctx, axes);\n" + "}\n" + "\n" + "function UpdateGraph(rssi) {\n" + " var xx, yy;\n" + " rssi = -rssi; // invert for convenience\n" + " if (rssi > axes.scaleY) // safety limit\n" + " rssi = axes.scaleY;\n" + " else if (rssi < 0)\n" + " rssi = 0;\n" + " rssiData[rssiIndex] = rssi;\n" + " console.log('UpdateGraph(-' + rssi + ')');\n" + " RSSIInit();\n" + " x0 = axes.x0;\n" + " y0 = axes.y0;\n" + " ctx.beginPath();\n" + " ctx.strokeStyle = 'rgb(250,128,128)';\n" + " ctx.lineWidth = 5;\n" + " for (var i = 0; i<100; i++) {\n" + " pi = (rssiIndex + 1 + i) % 100;\n" + " xx = x0 + i / axes.scaleX * axes.w;\n" + " yy = y0 + rssiData[pi] / axes.scaleY * axes.h;\n" + " ctx.lineTo(xx, yy);\n" + " }\n" + " ctx.stroke();\n" + " ctx.beginPath();\n" + " ctx.arc(xx, yy, 7, 0, 2 * Math.PI, false);\n" + " ctx.fillstyle = 'green';\n" + " ctx.fill();\n" + " ctx.strokeStyle = '#003300';\n" + " ctx.stroke();\n" + " rssiIndex++;\n" + " rssiIndex %= 100;\n" + "}\n" + "\n" + "function showAxes(ctx, axes) {\n" + " var x0 = axes.x0, w = axes.w;\n" + " var y0 = axes.y0, h = axes.h;\n" + " var xmin = axes.doNegativeX ? 0 : x0;\n" + " ctx.lineWidth = 1;\n" + " ctx.font = '12px Arial';\n" + " ctx.textAlign = 'end';\n" + " ctx.beginPath();\n" + " ctx.strokeStyle = 'rgb(128,128,128)';\n" + " ctx.moveTo(x0, y0); ctx.lineTo(x0, y0 + h); // Y axis\n" + " for (var y = 0; y <= axes.scaleY; y += 10) {\n" + " yy = axes.y0 + y / axes.scaleY * axes.h;\n" + " ctx.moveTo(xmin, yy); ctx.lineTo(x0 + w, yy); // X axis\n" + " ctx.fillText(-y, x0 - 3, yy + 3);\n" + " }\n" + " ctx.font = '18px Arial';\n" + " ctx.textAlign = 'start';\n" + " ctx.fillText('RSSI Graph', axes.x0, axes.y0 - 6);\n" + " ctx.stroke();\n" + "}\n" +}; // rssi_js, 2770 bytes + +// File: Water.png +// +const char Water_png[] PROGMEM = { + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x43,0x08,0x03,0x00,0x00,0x00,0xBB,0xBC,0x9B, + 0xAC,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00, + 0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00, + 0x00,0xCC,0x50,0x4C,0x54,0x45,0xA2,0xB8,0xE1,0x46,0x72,0xC4,0x63,0x88,0xCD,0x92, + 0xAC,0xDC,0x57,0x7F,0xCA,0xAE,0xC1,0xE5,0xC5,0xD3,0xEC,0x75,0x96,0xD3,0x9D,0xB5, + 0xE0,0x7A,0x9A,0xD5,0x52,0x7B,0xC8,0x97,0xB0,0xDE,0x86,0xA3,0xD9,0x5D,0x84,0xCC, + 0x80,0x9E,0xD7,0xB3,0xC5,0xE7,0x4C,0x76,0xC6,0x5D,0x85,0xCC,0x4E,0x78,0xC7,0xCB, + 0xD7,0xEE,0x6F,0x91,0xD1,0x69,0x8D,0xCF,0x77,0x9C,0xD5,0xBD,0xD7,0xEE,0xA6,0xC4, + 0xE6,0x51,0x7B,0xC8,0xA2,0xC1,0xE5,0x98,0xB8,0xE0,0x4A,0x75,0xC6,0x7E,0xA2,0xD8, + 0xA0,0xBE,0xE3,0x6B,0x91,0xD2,0x64,0x8C,0xCF,0x55,0x7F,0xCA,0x8C,0xA7,0xDB,0x61, + 0x88,0xCD,0x94,0xB4,0xDF,0xB5,0xD1,0xEB,0xAE,0xCA,0xE9,0xB9,0xD4,0xED,0x6F,0x95, + 0xD3,0xB9,0xCA,0xE9,0x4A,0x75,0xC5,0x9C,0xBA,0xE2,0x7A,0x9E,0xD7,0xBF,0xCE,0xEA, + 0x90,0xB1,0xDE,0x8C,0xAD,0xDD,0x73,0x98,0xD5,0x92,0xAE,0xDD,0x81,0xA5,0xD9,0x81, + 0xA4,0xD9,0x85,0xA7,0xDA,0x83,0xA5,0xD9,0x59,0x82,0xCA,0xAA,0xC7,0xE8,0xC0,0xD9, + 0xEF,0xB2,0xCE,0xEA,0x89,0xAB,0xDB,0xC1,0xD9,0xEF,0xC2,0xD9,0xF0,0xBF,0xD9,0xEF, + 0xBD,0xD7,0xED,0xBD,0xD6,0xEE,0xBC,0xD7,0xEE,0xBE,0xD7,0xEF,0xC2,0xDA,0xEF,0x00, + 0x00,0x00,0x84,0x2D,0xBB,0x17,0x00,0x00,0x00,0x44,0x74,0x52,0x4E,0x53,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x00,0x71,0xD2,0x8F,0x12,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00, + 0x0E,0xC3,0x00,0x00,0x0E,0xC3,0x01,0xC7,0x6F,0xA8,0x64,0x00,0x00,0x01,0xD2,0x49, + 0x44,0x41,0x54,0x58,0x47,0xED,0x98,0xDB,0x52,0xC2,0x30,0x14,0x45,0x1B,0xB9,0x54, + 0xAE,0x5A,0x10,0x42,0xA9,0xD4,0xCA,0xA5,0x20,0x2A,0xA8,0x45,0x05,0xC1,0x6B,0xFF, + 0xFF,0x9F,0x3C,0x49,0x4E,0x4A,0xC7,0xE1,0x21,0x0F,0x0D,0x33,0x76,0xB2,0x1E,0x20, + 0x7B,0x27,0xED,0x4A,0x33,0x30,0xA3,0x58,0xB1,0x6E,0xB2,0x34,0x58,0x84,0x90,0x13, + 0x1C,0xEF,0x49,0x0C,0x85,0x22,0x29,0x96,0x70,0xCC,0x28,0x17,0x6C,0xFB,0x14,0xC7, + 0x87,0x29,0x55,0xAA,0xB6,0x5D,0xC3,0x00,0xD4,0x41,0x40,0x48,0x03,0x53,0x02,0x1A, + 0xCA,0xD5,0x3F,0xD3,0x4D,0x9E,0x49,0xE2,0xB0,0x1A,0x6C,0x3A,0xB5,0x85,0xB3,0x73, + 0xB1,0xA2,0x2A,0xF7,0x58,0x86,0xE0,0xB4,0xA0,0x68,0x63,0x81,0xC0,0xBC,0x65,0x59, + 0x05,0xB1,0x9A,0x90,0x0B,0xAC,0x3B,0x98,0x09,0xEE,0x51,0xE6,0x8E,0x88,0x71,0x5C, + 0xC3,0x02,0xA8,0x88,0xA6,0x48,0x48,0x97,0xF6,0x5C,0x56,0xC0,0x1D,0x25,0xDC,0x20, + 0xD6,0x39,0x7D,0xEA,0x5D,0x12,0x52,0xE7,0xAB,0x6D,0x28,0x06,0xBE,0x7F,0x05,0x6F, + 0x7C,0xDB,0xEC,0x01,0xDC,0xE0,0x1A,0x5E,0xF1,0x9C,0x87,0x30,0x1C,0x8D,0x27,0xA1, + 0x17,0xC0,0x80,0x6F,0xAB,0x02,0x2B,0xA6,0x94,0x86,0x0E,0x14,0x29,0xF6,0x86,0x19, + 0xCC,0x52,0x0F,0x06,0x76,0x3B,0xBE,0x81,0x1B,0xCE,0x6F,0x21,0xD3,0x3B,0x28,0x86, + 0xF7,0x35,0x38,0xC2,0xD6,0x18,0xE2,0x62,0x0E,0x87,0x00,0xCA,0x32,0xDB,0x41,0x97, + 0x5D,0x41,0xE9,0x12,0x86,0xD5,0xA6,0xCD,0x4E,0xD9,0x63,0x79,0xF2,0x00,0x8B,0xF6, + 0x70,0xC3,0xE3,0x53,0x14,0xF5,0xF9,0x6A,0x3A,0xC0,0x9E,0xCC,0x17,0xA2,0x60,0x4F, + 0xC1,0x70,0x7B,0x3C,0xF6,0xE1,0x9C,0x91,0x88,0x17,0xC0,0x58,0xDE,0x71,0x85,0xC5, + 0xD4,0x5F,0x45,0x82,0x67,0xF6,0x70,0x60,0x88,0x71,0x86,0x11,0x89,0xE5,0x2D,0x1F, + 0xF3,0xB4,0xCB,0xB3,0x13,0x62,0x0E,0x5F,0x78,0x26,0xEE,0x12,0x0B,0xE0,0x75,0xC4, + 0x1A,0x47,0x5E,0x92,0x62,0x7D,0xC0,0x40,0x37,0xAB,0x59,0x30,0x5B,0x6C,0x30,0x01, + 0x21,0xEC,0x05,0x9F,0x90,0xE3,0x75,0x83,0x20,0x78,0x13,0x27,0x24,0x99,0xF8,0x7E, + 0xEA,0x8A,0x3D,0x07,0x0D,0x99,0x62,0x0C,0x2A,0x24,0x86,0x35,0x16,0x99,0x63,0x0C, + 0x2A,0x18,0x83,0x0A,0x89,0x61,0x8B,0x45,0xE6,0x24,0x86,0x1D,0x16,0x99,0xA3,0xDF, + 0xB0,0x33,0x06,0x05,0xB6,0xDA,0x0D,0x47,0xFC,0x2C,0x69,0xFB,0xC6,0xBD,0x6B,0x37, + 0x50,0x63,0x50,0xE0,0xC3,0x18,0x14,0xF8,0x94,0x06,0xCC,0x1A,0xC8,0x81,0xE1,0x4B, + 0xBB,0x21,0x0F,0xA7,0x64,0x0C,0x4A,0x18,0x83,0x0A,0xC6,0xA0,0x82,0x31,0xA8,0x70, + 0x3C,0xC3,0x37,0xE6,0xEC,0x91,0x86,0x7F,0xFC,0x17,0x59,0xAE,0x0C,0x3F,0x98,0xB3, + 0x47,0x1A,0xB4,0xFD,0x0F,0x94,0x2B,0x83,0xB6,0xDF,0x35,0x12,0x83,0x4E,0xE2,0xF8, + 0x17,0x10,0x4C,0xD8,0xAF,0xAD,0x7C,0x4D,0x0E,0x00,0x00,0x00,0x00,0x49,0x45,0x4E, + 0x44,0xAE,0x42,0x60,0x82, +}; // Water_png, 869 bytes + +// Prototypes: +// const char about_htm[] PROGMEM +// const char about_js[] PROGMEM +// const char Button_css[] PROGMEM +// const char curr_htm[] PROGMEM +// const char curr_js[] PROGMEM +// const char favicon_ico[] PROGMEM +// const char Green1x1_png[] PROGMEM +// const char Heater_png[] PROGMEM +// const char icon_png[] PROGMEM +// const char index_htm[] PROGMEM +// const char index_js[] PROGMEM +// const char Open_png[] PROGMEM +// const char PlantModel_png[] PROGMEM +// const char rssi_htm[] PROGMEM +// const char rssi_js[] PROGMEM +// const char Water_png[] PROGMEM + +// Directory of Files +// +// This typedef is used to iterate through the directory listing, until +// an empty "" Filename is reached. +// +typedef struct { + const char * Filename; + const char * Filedata; + const char * Filetype; + uint16_t Filesize; +} DirEntry; + +const DirEntry Directory[] PROGMEM = { + { "Button.css", Button_css, "text/css", 404 }, + { "Green1x1.png", Green1x1_png, "image/png", 119 }, + { "Heater.png", Heater_png, "image/png", 443 }, + { "Open.png", Open_png, "image/png", 655 }, + { "PlantModel.png", PlantModel_png, "image/png", 28345 }, + { "Water.png", Water_png, "image/png", 869 }, + { "about.htm", about_htm, "text/html", 1839 }, + { "about.js", about_js, "application/javascript", 605 }, + { "curr.htm", curr_htm, "text/html", 1196 }, + { "curr.js", curr_js, "application/javascript", 3615 }, + { "favicon.ico", favicon_ico, "image/x-icon", 4286 }, + { "icon.png", icon_png, "image/png", 8721 }, + { "index.htm", index_htm, "text/html", 5713 }, + { "index.js", index_js, "application/javascript", 1408 }, + { "rssi.htm", rssi_htm, "text/html", 1194 }, + { "rssi.js", rssi_js, "application/javascript", 2770 }, + { "", NULL, NULL, 0 } +}; + diff --git a/Firmware/Web_RootPage.cpp b/Firmware/Web_RootPage.cpp new file mode 100644 index 0000000..c7a62cd --- /dev/null +++ b/Firmware/Web_RootPage.cpp @@ -0,0 +1,33 @@ + +#include + +#include "ProjGlobals.h" +#include "Web_RootPage.h" +#include "GrowController.h" +#include "Web_Resources.h" + +void HandleRootPage() { + if (server.hasArg("SW")) { + String newState = server.arg("SW"); + if (newState == "1") { + SetCircuit(CMD_On); + Serial.printf("SW 1\n"); + } else if (newState == "0") { + SetCircuit(CMD_Off); + Serial.printf("SW 0\n"); + } else if (newState == "2") { + SetCircuit(CMD_Toggle); + Serial.printf("SW 2\n"); + } else { + Serial.printf("SW %s ???\n", newState.c_str()); + ; // no action + } + } + String modeText = (isStationMode) ? "Station mode
" : "Access Point mode
"; + String status = GetCircuitStatus() ? "On
" : "Off
"; + String myIP = String(WiFi.localIP()[0]); + myIP += "." + String(WiFi.localIP()[1]); + myIP += "." + String(WiFi.localIP()[2]); + myIP += "." + String(WiFi.localIP()[3]); + server.send_P(200, "text/html", index_htm); +} diff --git a/Firmware/Web_RootPage.h b/Firmware/Web_RootPage.h new file mode 100644 index 0000000..89c471b --- /dev/null +++ b/Firmware/Web_RootPage.h @@ -0,0 +1,7 @@ + +#ifndef WEB_ROOTPAGE_H +#define WEB_ROOTPAGE_H + +void HandleRootPage(); + +#endif // WEB_ROOTPAGE_H diff --git a/Firmware/WiFiConfiguration.h b/Firmware/WiFiConfiguration.h new file mode 100644 index 0000000..6c37ea4 --- /dev/null +++ b/Firmware/WiFiConfiguration.h @@ -0,0 +1,55 @@ +/// +/// Simple WiFi Configuration features +/// +#ifndef WIFICONFIGURATION_H +#define WIFICONFIGURATION_H + +#include + +#define CFG_NAMESIZE 32 +#define CFG_SSIDSIZE 32 +#define CFG_PASSSIZE 64 +#define CFG_UURLSIZE 64 + +/// Provides a handy interface for WiFi configuration. +/// +/// @code +/// WiFiConfiguration config; +/// ... +/// config.load(); +/// ssid = config.getSSID(); +/// pass = config.getPassword(); +/// ... +/// WiFi.begin(ssid.c_str(), pass.c_str()); +/// +/// @endcode +/// +class ConfigManager { +public: + ConfigManager(); + void load(); + void save(); + void factoryReset(); + String getName(); + void setName(String _name); + String getSSID(); + void setSSID(String _ssid); + String getPassword(); + void setPassword(String _password); + String getURL(); + void setURL(String _url); + uint16_t getOnRef(); + void setOnRef(uint16 onR); + uint16_t getOffRef(); + void setOffRef(uint16 offR); + uint16_t getAutoOff(); + void setAutoOff(uint16 autoOff); + #if 0 + String getNTPServerName(); + void setNTPServerName(String _name); + #endif +private: +}; + + +#endif // !WIFICONFIGURATION_H diff --git a/Firmware/WifiConfiguration.cpp b/Firmware/WifiConfiguration.cpp new file mode 100644 index 0000000..9e13a04 --- /dev/null +++ b/Firmware/WifiConfiguration.cpp @@ -0,0 +1,157 @@ +// +// This file hosts all the non-volatile configuration options for this node +// +#include "WiFiConfiguration.h" +#include + +#define EEROM_SIZE 512 + +// Change this when it is required to force a reinitialization +// +#define EXPECTED_FMT 0x03 + +typedef struct { + uint8_t format[2]; // Format of this data structure, and ~format + struct info { + char name[CFG_NAMESIZE]; // Name of this node + char ssid[CFG_SSIDSIZE]; // SSID of the saved network [max length defined by standard] + char pass[CFG_PASSSIZE]; // PASScode of the saved network + char updateURL[CFG_UURLSIZE]; // URL of the trusted server with code updates + uint16_t onRef; // A/D reference above which the output is considered 'On' + uint16_t offRef; // A/D reference below which the output is considered 'Off' + uint16_t autoOff; // When non-zero, this is the # minutes until auto-turn off + //char NTPIP[64]; // Name or IP of the NTP Server + char Padding[10]; + } info; +} Config_t; +#define OFS_FORMAT (0) +#define OFS_NAME (OFS_FORMAT + 2) +#define OFS_SSID (OFS_NAME + CFG_NAMESIZE) +#define OFS_PASS (OFS_SSID + CFG_SSIDSIZE) +#define OFS_URL (OFS_PASS + CFG_PASSSIZE) +#define OFS_ONREF (OFS_URL + CFG_UURLSIZE) +#define OFS_OFFREF (OFS_ONREF + sizeof(uint16_t)) +#define OFS_AUTOOFF (OFS_OFFREF + sizeof(uint16_t)) +//#define OFS_NTPIP (OFS_OFFREF + 2) + +Config_t Configuration; + +ConfigManager::ConfigManager() { + +} + +void ConfigManager::factoryReset() { + Configuration.format[0] = EXPECTED_FMT; + Configuration.format[1] = ~EXPECTED_FMT; + strcpy(Configuration.info.name, "3-Way Switch"); + Configuration.info.ssid[0] = '\0'; + Configuration.info.pass[0] = '\0'; + //Configuration.info.updateURL[0] = '\0'; + strcpy(Configuration.info.updateURL, "https://192.168.1.201/mbed/ESP.php"); + Configuration.info.onRef = 150; + Configuration.info.offRef = 100; + Configuration.info.autoOff = 0; + //Configuration.info.NTPIP[0] = '\0'; +} + +void ConfigManager::load() { + EEPROM.begin(512); + + uint8_t * ptr = (uint8_t *) &Configuration; + uint8_t i = 0; + do { + *ptr++ = EEPROM.read(OFS_FORMAT + i++); + } while (i < sizeof(Configuration)); + if ((Configuration.format[0] & 0xFF) != (~Configuration.format[1] & 0xFF)) { + // Factory default + Serial.printf("Bad Configuration - reset to factory defaults\n"); + factoryReset(); + return; + } + Serial.printf("Loading from EEROM\n"); + Serial.printf("Node Name: %s\n", Configuration.info.name); + Serial.printf("SSID: %s\n", Configuration.info.ssid); + Serial.printf("PASS: %s\n", Configuration.info.pass); + Serial.printf("URL : %s\n", Configuration.info.updateURL); + Serial.printf("On Ref: %d\n", Configuration.info.onRef); + Serial.printf("Off Ref: %d\n", Configuration.info.offRef); + Serial.printf("Auto Off: %d\n", Configuration.info.autoOff); + //Serial.printf("NTP Svr: %s\n", Configuration.info.NTPIP); + delay(500); +} + +void ConfigManager::save(void) { + EEPROM.begin(512); + uint8_t * ptr = (uint8_t *) &Configuration; + uint8_t i = 0; + do { + EEPROM.write(OFS_FORMAT + i++, *ptr++); + } while (i < sizeof(Configuration)); + EEPROM.commit(); + delay(500); +} + +#if 0 +String ConfigManager::getNTPServerName() { + return String(Configuration.info.NTPIP); +} +void ConfigManager::setNTPServerName(String _name) { + strncpy(Configuration.info.NTPIP, _name.c_str(), sizeof(Configuration.info.NTPIP)); + Serial.printf("setNTPServerName(%s)\n", Configuration.info.NTPIP); +} +#endif + +String ConfigManager::getName() { + return String(Configuration.info.name); +} + +void ConfigManager::setName(String _name) { + strncpy(Configuration.info.name, _name.c_str(), sizeof(Configuration.info.name)); + Serial.printf("setName(%s)\n", Configuration.info.name); +} + +String ConfigManager::getSSID() { + return String(Configuration.info.ssid); +} + +void ConfigManager::setSSID(String _ssid) { + strncpy(Configuration.info.ssid, _ssid.c_str(), sizeof(Configuration.info.ssid)); + Serial.printf("setSSID(%s)\n", Configuration.info.ssid); +} + +String ConfigManager::getPassword() { + return String(Configuration.info.pass); +} + +void ConfigManager::setPassword(String _password) { + strncpy(Configuration.info.pass, _password.c_str(), sizeof(Configuration.info.pass)); + Serial.printf("setPass(%s)\n", Configuration.info.pass); +} + +String ConfigManager::getURL() { + return String(Configuration.info.updateURL); +} + +void ConfigManager::setURL(String _url) { + strncpy(Configuration.info.updateURL, _url.c_str(), sizeof(Configuration.info.updateURL)); + Serial.printf("setURL (%s)\n", Configuration.info.updateURL); +} + +uint16_t ConfigManager::getOnRef() { + return Configuration.info.onRef; +} +void ConfigManager::setOnRef(uint16 onR) { + Configuration.info.onRef = onR; +} +uint16_t ConfigManager::getOffRef() { + return Configuration.info.offRef; +} +void ConfigManager::setOffRef(uint16 offR) { + Configuration.info.offRef = offR; +} +uint16_t ConfigManager::getAutoOff() { + return Configuration.info.autoOff; +} +void ConfigManager::setAutoOff(uint16 autoOff) { + Configuration.info.autoOff = autoOff; +} diff --git a/Firmware/fauxmoESP.cpp b/Firmware/fauxmoESP.cpp new file mode 100644 index 0000000..a03820b --- /dev/null +++ b/Firmware/fauxmoESP.cpp @@ -0,0 +1,479 @@ +/* + +FAUXMO ESP 2.4.2 + +Copyright (C) 2016 by Xose Pérez + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#include + +#if defined(ESP32) + #include +#elif defined(ESP8266) + #include +#else + #error Platform not supported +#endif + +#include "fauxmoESP.h" +#include "Web_Resources.h" + +// ----------------------------------------------------------------------------- +// UDP +// ----------------------------------------------------------------------------- + +void fauxmoESP::_sendUDPResponse(unsigned int device_id) { + + fauxmoesp_device_t device = _devices[device_id]; + DEBUG_MSG_FAUXMO("[FAUXMO] UDP response for device #%d (%s)\n", _current, device.name); + + char buffer[16]; + IPAddress ip = WiFi.localIP(); + snprintf_P(buffer, sizeof(buffer), PSTR("%d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]); + + char response[strlen(UDP_TEMPLATE) + 128]; + snprintf_P(response, sizeof(response), UDP_TEMPLATE, + buffer, + _base_port + _current, + device.uuid, + _udpPattern == 1 ? UDP_DEVICE_PATTERN_1 : _udpPattern == 2 ? UDP_DEVICE_PATTERN_2 : _udpPattern == 3 ? UDP_DEVICE_PATTERN_3 : _udpPattern == 4 ? UDP_DEVICE_PATTERN_4 : _udpPattern == 5 ? UDP_DEVICE_PATTERN_5 : UDP_ROOT_DEVICE, + device.uuid, + _udpPattern == 1 ? UDP_DEVICE_PATTERN_1 : _udpPattern == 2 ? UDP_ROOT_DEVICE : _udpPattern == 3 ? UDP_ROOT_DEVICE : _udpPattern == 4 ? UDP_ROOT_DEVICE : _udpPattern == 5 ? UDP_ROOT_DEVICE : UDP_ROOT_DEVICE + ); + + _udp.beginPacket(_remoteIP, _remotePort); + #if defined(ESP32) + _udp.printf(response); + #else + _udp.write(response); + #endif + _udp.endPacket(); + DEBUG_MSG_FAUXMO("[FAUXMO] response:\n%s\n", response); +} + +void fauxmoESP::_nextUDPResponse() { + + while (_roundsLeft) { + if (_devices[_current].hit == false) break; + if (++_current == _devices.size()) { + --_roundsLeft; + _current = 0; + } + } + + if (_roundsLeft > 0) { + _sendUDPResponse(_current); + if (++_current == _devices.size()) { + --_roundsLeft; + _current = 0; + } + } +} + +void fauxmoESP::_onUDPData(IPAddress remoteIP, unsigned int remotePort, void *data, size_t len) { + + if (!_enabled) return; + + char * p = (char *) data; + p[len] = 0; + + if (strstr(p, UDP_SEARCH_PATTERN) == (char *) data) { + Serial.printf("onUDP: %s\n", p); + _udpPattern = 0; + if (strstr(p, UDP_DEVICE_PATTERN_1) != NULL) _udpPattern = 1; + if (strstr(p, UDP_DEVICE_PATTERN_2) != NULL) _udpPattern = 2; + if (strstr(p, UDP_DEVICE_PATTERN_3) != NULL) _udpPattern = 3; + if (strstr(p, UDP_DEVICE_PATTERN_4) != NULL) _udpPattern = 4; // ssdp:all + if (strstr(p, UDP_DEVICE_PATTERN_5) != NULL) _udpPattern = 5; // ssdpsearch:all + if (strstr(p, UDP_ROOT_DEVICE) != NULL) _udpPattern = 6; // upnp:rootdevice + if (_udpPattern) { + + #ifdef DEBUG_FAUXMO + char buffer[16]; + snprintf_P(buffer, sizeof(buffer), PSTR("%d.%d.%d.%d"), remoteIP[0], remoteIP[1], remoteIP[2], remoteIP[3]); + DEBUG_MSG_FAUXMO("[FAUXMO] Search request from %s\n", buffer); + #endif + + // Set hits to false + for (unsigned int i = 0; i < _devices.size(); i++) { + _devices[i].hit = false; + } + + // Send responses + _remoteIP = remoteIP; + _remotePort = remotePort; + _current = random(0, _devices.size()); + _roundsLeft = UDP_RESPONSES_TRIES; + + } + } + +} + +// ----------------------------------------------------------------------------- +// TCP +// ----------------------------------------------------------------------------- + +void fauxmoESP::_handleSetup(AsyncClient *client, unsigned int device_id, void *data, size_t len) { + (void) data; + (void) len; + + DEBUG_MSG_FAUXMO("[FAUXMO] Device #%d /setup.xml\n", device_id); + _devices[device_id].hit = true; + fauxmoesp_device_t device = _devices[device_id]; + + IPAddress myIP; + myIP = WiFi.localIP(); + char response[80 + strlen_P(SETUP_TEMPLATE) + strlen(device.name) + strlen(device.uuid) + strlen(device.serial) + 25]; + snprintf_P(response, sizeof(response), SETUP_TEMPLATE, + device.name, device.uuid, device.serial, + myIP.toString().c_str(), 80); + + char headers[strlen_P(HEADERS) + 10]; + snprintf_P(headers, sizeof(headers), HEADERS, strlen(response)); + + client->write(headers, strlen(headers)); + client->write(response, strlen(response)); + DEBUG_MSG_FAUXMO("[FAUXMO] end /setup.xml: %d, %d\n", strlen(headers), strlen(response)); +} + +void fauxmoESP::_handleEventService(AsyncClient *client, unsigned int device_id, void *data, size_t len) { + (void) device_id; + (void) data; + (void) len; + + DEBUG_MSG_FAUXMO("[FAUXMO] Device #%d /eventservice.xml\n", device_id); + + char response[strlen_P(EVENTSERVICE_TEMPLATE)]; + snprintf_P(response, sizeof(response), EVENTSERVICE_TEMPLATE); + + char headers[strlen_P(HEADERS) + 10]; + snprintf_P(headers, sizeof(headers), HEADERS, strlen(response)); + + client->write(headers, strlen(headers)); + client->write(response, strlen(response)); + DEBUG_MSG_FAUXMO("[FAUXMO] end /eventservice.xml\n"); +} + +void fauxmoESP::_handleMetaInfoService(AsyncClient *client, unsigned int device_id, void *data, size_t len) { + (void) device_id; + (void) data; + (void) len; + + DEBUG_MSG_FAUXMO("[FAUXMO] Device #%d /metainfoservice.xml\n", device_id); + + char response[strlen_P(METAINFO_TEMPLATE)]; + snprintf_P(response, sizeof(response), METAINFO_TEMPLATE); + + char headers[strlen_P(HEADERS) + 10]; + snprintf_P(headers, sizeof(headers), HEADERS, strlen(response)); + + client->write(headers, strlen(headers)); + client->write(response, strlen(response)); + DEBUG_MSG_FAUXMO("[FAUXMO] end /metainfoservice.xml\n"); +} + +void fauxmoESP::_handleControl(AsyncClient *client, unsigned int device_id, void *data, size_t len) { + + DEBUG_MSG_FAUXMO("[FAUXMO] Device #%d /upnp/control/basicevent1\n", device_id); + + char content[len+1]; + memcpy(content, data, len); + fauxmoesp_device_t device = _devices[device_id]; + + // The default template is the one for GetBinaryState queries + const char * response_template = GETSTATE_TEMPLATE; + + if (strstr(content, "SetBinaryState") != NULL) { + + if (strstr(content, "0") != NULL) { + if (_setCallback) _setCallback(device_id, device.name, false); + } + + if (strstr(content, "1") != NULL) { + if (_setCallback) _setCallback(device_id, device.name, true); + } + + // Use a specific response template for SetBinaryState action + response_template = SETSTATE_TEMPLATE; + + } + + // Update current state + if (_getCallback) device.state = _getCallback(device_id, device.name); + + // Send response + char response[strlen_P(response_template) + 10]; + snprintf_P(response, sizeof(response), response_template, device.state ? 1 : 0); + + char headers[strlen_P(HEADERS) + 10]; + snprintf_P(headers, sizeof(headers), HEADERS, strlen(response)); + + client->write(headers, strlen(headers)); + client->write(response, strlen(response)); + DEBUG_MSG_FAUXMO("[FAUXMO] end /upnp/control/basicevent1\n"); +} + +void fauxmoESP::_handleIcon(AsyncClient *client, unsigned int device_id, void *data, size_t len) { + (void) device_id; + (void) data; + (void) len; + + DEBUG_MSG_FAUXMO("[FAUXMO] Icon /icon.png\n"); + + char *buf = (char *) malloc(strlen(HEADERJPG) + 5); + if (buf) { + snprintf_P(buf, strlen_P(HEADERJPG) + 5, HEADERJPG, sizeof(icon_png)); + client->write(buf, strlen(buf)); + client->write(icon_png, sizeof(icon_png)); + DEBUG_MSG_FAUXMO("[FAUXMO] sent icon.png [%d bytes]\n", sizeof(icon_png)); + delay(100); + free(buf); + } + DEBUG_MSG_FAUXMO("[FAUXMO] end /icon.png\n"); +} + + + +void fauxmoESP::_onTCPData(AsyncClient *client, unsigned int device_id, void *data, size_t len) { + + if (!_enabled) return; + + #ifdef DEBUG_FAUXMO + char * p = (char *) data; + p[len] = 0; + Serial.printf("[FAUXMO] onTCPData(dev:%d,\n%s\n", device_id, p); + #endif + + { + char match[] = {"GET /setup.xml HTTP/1.1"}; + if (memcmp(data, match, strlen(match)-1) == 0) { + _handleSetup(client, device_id, data, len); + return; + } + } + + { + char match[] = {"GET /eventservice.xml HTTP/1.1"}; + if (memcmp(data, match, strlen(match)-1) == 0) { + _handleEventService(client, device_id, data, len); + return; + } + } + + { + char match[] = {"GET /metainfoservice.xml HTTP/1.1"}; + if (memcmp(data, match, strlen(match)-1) == 0) { + _handleMetaInfoService(client, device_id, data, len); + return; + } + } + + { + char match[] = {"POST /upnp/control/basicevent1 HTTP/1.1"}; + if (memcmp(data, match, strlen(match)-1) == 0) { + _handleControl(client, device_id, data, len); + return; + } + } + + { + char match[] = {"GET /icon.png HTTP/1.1"}; + if (memcmp(data, match, strlen(match)-1) == 0) { + _handleIcon(client, device_id, data, len); + return; + } + } +} + +void fauxmoESP::_onTCPClient(AsyncClient *client, unsigned int device_id) { + + for (unsigned char i = 0; i < TCP_MAX_CLIENTS; i++) { + + if (!_tcpClients[i] || !_tcpClients[i]->connected()) { + + _tcpClients[i] = client; + + client->onAck([i](void *s, AsyncClient *c, size_t len, uint32_t time) { + (void) s; + (void) c; + (void) len; + (void) time; + }, 0); + + client->onData([this, i, device_id](void *s, AsyncClient *c, void *data, size_t len) { + (void) s; + _onTCPData(c, device_id, data, len); + }, 0); + + client->onDisconnect([this, i](void *s, AsyncClient *c) { + (void) s; + _tcpClients[i]->free(); + _tcpClients[i] = NULL; + delete c; + DEBUG_MSG_FAUXMO("[FAUXMO] Client #%d disconnected\n", i); + }, 0); + + client->onError([i](void *s, AsyncClient *c, int8_t error) { + (void) s; + (void) c; + (void) error; + DEBUG_MSG_FAUXMO("[FAUXMO] Error %s (%d) on client #%d\n", c->errorToString(error), error, i); + }, 0); + + client->onTimeout([i](void *s, AsyncClient *c, uint32_t time) { + (void) s; + (void) time; + DEBUG_MSG_FAUXMO("[FAUXMO] Timeout on client #%d at %i\n", i, time); + c->close(); + }, 0); + + DEBUG_MSG_FAUXMO("[FAUXMO] Client #%d connected\n", i); + return; + + } + + } + + DEBUG_MSG_FAUXMO("[FAUXMO] Rejecting - Too many connections\n"); + client->onDisconnect([](void *s, AsyncClient *c) { + (void) s; + c->free(); + delete c; + }); + client->close(true); + +} + +// ----------------------------------------------------------------------------- +// Public API +// ----------------------------------------------------------------------------- + +unsigned char fauxmoESP::addDevice(const char * device_name) { + + fauxmoesp_device_t new_device; + unsigned int device_id = _devices.size(); + + // Copy name + new_device.name = strdup(device_name); + + // Chip ID + #if defined(ESP32) + unsigned long chip_id = (uint32_t) ESP.getEfuseMac(); + #else + unsigned long chip_id = ESP.getChipId(); + #endif + + // Create UUID + char uuid[15]; + snprintf_P(uuid, sizeof(uuid), PSTR("444556%06X%02X\0"), chip_id, device_id); // "DEV" + CHIPID + DEV_ID + new_device.uuid = strdup(uuid); + + // Create Serialnumber + char serial[15]; + sprintf(serial, "221703K0%06X", (uint32)chip_id); // "221703K0" + CHIPID + new_device.serial = strdup(serial); + + // TCP Server + new_device.server = new AsyncServer(_base_port + device_id); + new_device.server->onClient([this, device_id](void *s, AsyncClient* c) { + (void) s; + _onTCPClient(c, device_id); + }, 0); + new_device.server->begin(); + + // Attach + _devices.push_back(new_device); + + DEBUG_MSG_FAUXMO("[FAUXMO] Device '%s' added as #%d\n", device_name, device_id); + + return device_id; + +} + +bool fauxmoESP::renameDevice(unsigned char id, const char * device_name) { + if (id <= _devices.size()) { + free(_devices[id].name); + _devices[id].name = strdup(device_name); + DEBUG_MSG_FAUXMO("[FAUXMO] Device #%d renamed to '%s'\n", id, device_name); + return true; + } + return false; +} + +char * fauxmoESP::getDeviceName(unsigned char id, char * device_name, size_t len) { + if (id <= _devices.size()) { + strncpy(device_name, _devices[id].name, len); + } + return device_name; +} + +void fauxmoESP::setState(unsigned char id, bool state) { + if (id <= _devices.size()) { + _devices[id].state = state; + } +} + +void fauxmoESP::handle() { + + int len = _udp.parsePacket(); + if (len > 0) { + IPAddress remoteIP = _udp.remoteIP(); + unsigned int remotePort = _udp.remotePort(); + uint8_t data[len]; + _udp.read(data, len); + _onUDPData(remoteIP, remotePort, data, len); + } + + if (_roundsLeft > 0) { + if (millis() - _lastTick > UDP_RESPONSES_INTERVAL) { + _lastTick = millis(); + _nextUDPResponse(); + } + } + +} + +void fauxmoESP::enable(bool enable) { + DEBUG_MSG_FAUXMO("[FAUXMO] %s\n", enable ? "Enabled" : "Disabled"); + _enabled = enable; + #ifdef ESP32 + _udp.beginMulticast(UDP_MULTICAST_IP, UDP_MULTICAST_PORT); + #endif +} + +fauxmoESP::fauxmoESP(unsigned int port) { + + _base_port = port; + + #ifdef ESP8266 + // Start UDP server on STA connection + _handler = WiFi.onStationModeGotIP([this](WiFiEventStationModeGotIP ipInfo) { + (void) ipInfo; + _udp.beginMulticast(WiFi.localIP(), UDP_MULTICAST_IP, UDP_MULTICAST_PORT); + DEBUG_MSG_FAUXMO("[FAUXMO] UDP server started\n"); + }); + #endif + +} diff --git a/Firmware/fauxmoESP.h b/Firmware/fauxmoESP.h new file mode 100644 index 0000000..3d03ae9 --- /dev/null +++ b/Firmware/fauxmoESP.h @@ -0,0 +1,135 @@ +/* + +FAUXMO ESP 2.4.2 + +Copyright (C) 2016 by Xose Pérez + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +#pragma once + +#define DEFAULT_TCP_BASE_PORT 49152 +#define UDP_MULTICAST_IP IPAddress(239,255,255,250) +#define UDP_MULTICAST_PORT 1900 +#define TCP_MAX_CLIENTS 10 + +#define UDP_SEARCH_PATTERN "M-SEARCH" +#define UDP_DEVICE_PATTERN_1 "urn:Belkin:device:**" +#define UDP_DEVICE_PATTERN_2 "urn:Belkin:device:controllee:1" +#define UDP_DEVICE_PATTERN_3 "urn:Belkin:service:basicevent:1" +#define UDP_DEVICE_PATTERN_4 "ssdp:all" +#define UDP_DEVICE_PATTERN_5 "ssdpsearch:all" +#define UDP_ROOT_DEVICE "upnp:rootdevice" + +#define UDP_RESPONSES_INTERVAL 250 +#define UDP_RESPONSES_TRIES 5 + +// Here, or in the compiler configuration +//#define DEBUG_FAUXMO Serial +#ifdef DEBUG_FAUXMO + #define DEBUG_MSG_FAUXMO(...) DEBUG_FAUXMO.printf( __VA_ARGS__ ) +#else + #define DEBUG_MSG_FAUXMO(...) +#endif + +#include + +#if defined(ESP32) + #include + #include +#elif defined(ESP8266) + #include + #include +#else + #error Platform not supported +#endif + +#include +#include +#include +#include "WeMo.h" + +typedef std::function TSetStateCallback; +typedef std::function TGetStateCallback; + +typedef struct { + char * name; + char * uuid; + char * serial; + bool hit; + bool state; + AsyncServer * server; +} fauxmoesp_device_t; + +class fauxmoESP { + + public: + + fauxmoESP(unsigned int port = DEFAULT_TCP_BASE_PORT); + + unsigned char addDevice(const char * device_name); + bool renameDevice(unsigned char id, const char * device_name); + char * getDeviceName(unsigned char id, char * buffer, size_t len); + void onSetState(TSetStateCallback fn) { _setCallback = fn; } + void onGetState(TGetStateCallback fn) { _getCallback = fn; } + void enable(bool enable); + void handle(); + + // backwards compatibility DEPRECATED + void onMessage(TSetStateCallback fn) { onSetState(fn); } + void setState(unsigned char id, bool state); + + private: + + bool _enabled = true; + unsigned int _base_port = DEFAULT_TCP_BASE_PORT; + std::vector _devices; + #ifdef ESP8266 + WiFiEventHandler _handler; + #endif + WiFiUDP _udp; + AsyncClient * _tcpClients[TCP_MAX_CLIENTS]; + TSetStateCallback _setCallback = NULL; + TGetStateCallback _getCallback = NULL; + + unsigned int _roundsLeft = 0; + unsigned int _current = 0; + unsigned long _lastTick; + IPAddress _remoteIP; + unsigned int _remotePort; + unsigned int _udpPattern; + + void _sendUDPResponse(unsigned int device_id); + void _nextUDPResponse(); + + void _handleSetup(AsyncClient *client, unsigned int device_id, void *data, size_t len); + void _handleMetaInfoService(AsyncClient *client, unsigned int device_id, void *data, size_t len); + void _handleEventService(AsyncClient *client, unsigned int device_id, void *data, size_t len); + void _handleControl(AsyncClient *client, unsigned int device_id, void *data, size_t len); + void _handleIcon(AsyncClient *client, unsigned int device_id, void *data, size_t len); + + void _onUDPData(const IPAddress remoteIP, unsigned int remotePort, void *data, size_t len); + void _onTCPData(AsyncClient *client, unsigned int device_id, void *data, size_t len); + void _onTCPClient(AsyncClient *client, unsigned int device_id); + +}; diff --git a/Hardware/GrowController.sch b/Hardware/GrowController.sch new file mode 100644 index 0000000..d593e1d --- /dev/null +++ b/Hardware/GrowController.sch @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<b>Parts</b> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Date: +>LAST_DATE_TIME +Sheet: +>SHEET +Rev: +Document Title: +Part Number: +>DRAWING_NAME +Sheet Function: +>PART_NUMBER +>PART_REV +>COMPANY_NAME +>COMPANY_ADDR +Drawn: +>ENGINEER +>MODULE + + + + +<b>FRAME - A Landscape</b><br/> +Smartware Computing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tools/MakeByteArray.pl b/Tools/MakeByteArray.pl new file mode 100644 index 0000000..a5711e1 --- /dev/null +++ b/Tools/MakeByteArray.pl @@ -0,0 +1,244 @@ +# MakeByteArray +# +# +use strict; +use warnings; +use Cwd qw(cwd); + +my $maxCols = 16; +my $maxLines = 0; +my $ESP = 0; +my $DIR = 0; +my $file = ""; +my $ctrlC = 0; # User induced termination +my $lineT = 0; # Linecount induced termination + +$SIG{INT} = \&CtrlCHandler; +$SIG{QUIT} = \&CtrlCHandler; + +my %DirInfo; # Name and FileSize + +my $prg = $0; +$prg =~ s/^.*[\\\/](.*)/$1/; +$prg =~ s/(.*)\..*/$1/; + +my $VERSION = 1.0; + +# Extension in this list must be lower case. +my %FileType = ( + "htm" => "text/html", + "html" => "text/html", + "gif" => "image/gif", + "svg" => "image/svg+xml", + "css" => "text/css", + "ico" => "image/x-icon", + "png" => "image/png", + "jpg" => "image/jpeg", + "js" => "application/javascript", +); + + +if (!@ARGV) + { + print < [...]] [-n=##] [-l=##] [-ESP] [-DIR] [-o=outfile] + version $VERSION + + Dumps out the contents of the [file] as a c array. + + If the file is binary, it emits a hex char-array using + the -n and -l settings. + If the file is text, it emits as an ascii char-array + where each source line is one ascii quoted line. + + -ESP adds the PROGMEM attribte to the byte array data. + + -DIR adds a 'directory' at the end of the output, providing + a reference to each input file. Most useful for a set + of files. + + -o=outfile Writes the output to outfile. + + -n=## sets the byte count for each line, defaults 32. + -l=## sets a termination after ## lines have been printed. + + Example: MakeByteArray -ESP srcpath\\*.* -o=dstpath\\Web_Resources.h + +EOM + exit; + } + +my @files; +my $outfile = ""; + +#printf("ARGS: '%s'\n", join("|", @ARGV)); +foreach (@ARGV) + { + if (/-n=(\d+)/) + { $maxCols = $1; } + elsif (/-l=(\d+)/) + { $maxLines = $1; } + elsif (/-o=(.*)/) + { $outfile = $1; } + elsif (/-ESP/) + { $ESP = 1; } + elsif (/-DIR/) + { $DIR = 1; } + elsif (-e $_ ) + { push @files, $_; } + elsif (/[\*\?]/) + { + my @gFiles = glob($_); + foreach (@gFiles) + { + push @files, $_ if (-e $_); + } + } + else + { print "unrecognized command.\n"; exit; } + } + +if (!@files) + { + print "No files to process.\n"; + exit; + } + +my $oldHandle; +if ($outfile ne "") { + #printf("Open for write '%s'\n", $outfile); + open(FO, ">$outfile") || die("Can't write to $outfile"); + $oldHandle = select FO; +} else { + printf("No outfile, emitting to console.\n"); +} +printf("//\n"); +printf("// Command : %s %s\n", $prg, join(" ", @ARGV)); +printf("// version: %2.1f\n", $VERSION); +printf("// From cwd : %s\n", cwd); +printf("// Generated: %s\n", scalar localtime()); +printf("// Run script in command shell, not PowerShell\n"); +my @summary; +foreach my $file (@files) { + push @summary, Process($file); + last if ($ctrlC); +} +print "\n// Prototypes:\n// " . join("\n// ", @summary) . "\n"; + +if ($DIR) { + print < '%s'\n", $ext, $FileType{lc($ext)}); + printf("\t{ %-20s, %-20s, %24s, %6d },\n", $fn, $title, $ftype, $DirInfo{$file}{'size'}); + } + printf("\t{ %-20s, %-20s, %24s, %6d }\n", "\"\"", "NULL", "NULL", 0); + printf("};\n\n"); +} + +if ($outfile) { + close FO; + select($oldHandle); +} +print "\nTerminated by operator\n" if ($ctrlC == 1); +exit; + +# #################################### + +sub Process { + my $file = shift; + my $title = $file; + my $isText = 0; + my $prototype; + + $title =~ s/\./_/g; + $isText = 1 if (-T $file); + open(FH, "<$file") || die("Can't read $file.\n"); + binmode FH if ($isText); + my $cols = 0; + my $c; + my $ascii = ""; + my $address = 0; + my $lineCount = 0; + printf("\n"); + printf("// File: %s\n", $file); + printf("//\n"); + $prototype = sprintf("const char %s[]%s", $title, ($ESP) ? " PROGMEM" : ""); + printf("%s = {\n", $prototype); + + my $size = 0; + if ($isText) { + while () { + my $line = $_; + chomp $line; + $line =~ s/\t/ /g; + $line =~ s/\\"/"/g; + $line =~ s/\r//g; + $line =~ s/"/\\"/g; + printf("\t\"%s\\n\"\n", $line); + $size += length($line); + } + } else { + printf("\t"); + while (sysread(FH, $c, 1) && !$ctrlC && !$lineT) { + my $b = ord($c); + printf("0x%02X,", $b); + if ($b >= 0x20 && $b <= 0x7F) + { $ascii .= chr($b); } + else + { $ascii .= "."; } + ++$cols; + ++$address; + $cols %= $maxCols; + if ($cols == 0) { + #print " // $ascii"; + print "\n"; + $ascii = ""; + $lineCount++; + $lineT = 1 if ($maxLines && $lineCount >= $maxLines); + if (!$lineT) { + printf("\t"); + } + } + $size += 1; + } + if ($ascii ne "") { + print " " x ($maxCols - $cols); + } + printf("\n"); + } + printf("}; // %s, %d bytes\n", $title, $size); + close FH; + $DirInfo{$file}{'reference'} = $title; + $DirInfo{$file}{'size'} = $size; + return $prototype; +} + +# If the user presses Control-C, signal it. +# +sub CtrlCHandler { + $ctrlC = 1; +} + diff --git a/Tools/MakeResourceFiles.cmd b/Tools/MakeResourceFiles.cmd new file mode 100644 index 0000000..d83be73 --- /dev/null +++ b/Tools/MakeResourceFiles.cmd @@ -0,0 +1,55 @@ +@echo off +REM +REM "Compile" the web resources folder into code modules. +REM +REM Command : MakeByteArray -ESP *.* -o=..\Web_Resources.h +REM From cwd : C:/Projects/SmartSwitch/Firmware/Resources +REM Run script in command shell, not PowerShell +REM +REM External Dependency: +REM MakeByteArray - Converts 1 or more files into a .h file byte array. +REM +REM +------------------------------------------------+ +REM | MakeResourceFiles.cmd | +REM +------------------------------------------------+ +REM || +REM +----------+ +-----------+ +-----------+ +REM +----------+ | |Make | | | +REM |source | | |Byte | |Resources.h| +REM |.htm | | ==> |Array.pl | ==> | | +REM |.js | | | | | | +REM |.jpg | | | | | | +REM |etc... |-+ | | | | +REM +----------+ +-----------+ +-----------+ +setlocal + +REM ###################################################################### +REM +REM Configuration Options +REM + +set SRC=..\Firmware\Resources +set TARG=..\Web_Resources.h + +REM +REM End of Configuration +REM +REM ###################################################################### + +echo. +echo.Make Resource Files +echo.Change to %SRC% ... +pushd %SRC% + +echo.Show web resources +dir /b + +echo. +echo.Compiling the web resources into code modules... +MakeByteArray -ESP -DIR *.* -o=%TARG% + +echo. +echo.Done. %TARG% has been updated and returning to prior folder. +dir %TARG% +popd +endlocal diff --git a/Tools/MoveToServer.pl b/Tools/MoveToServer.pl new file mode 100644 index 0000000..e78e26d --- /dev/null +++ b/Tools/MoveToServer.pl @@ -0,0 +1,124 @@ +# +# Move to Server +# +# Monitor the debug and release folders for a new binary. +# If found, +# 1 Read the .ino file to find the current version string. +# 2 Rename the .bin to include the version string. +# 3 Move it to the server. +# +# Searches .ino file for: const String MyVer = "SmartSwitch v1.02.24"; +# +use strict; +use warnings; + +###################### Configuration ########################### +# +# Target Server Path +# +my $ServerPath = "\\\\server1\\web\\mbed\\ESPbin"; + +# Sleep Time between checks +# +my $SleepTime = 5; + +# Verbose mode +# 0 = off +# 1 = highlights +# 2 = detailed +# +my $Verbose = 1; + +##################### + +my $continue = 1; + +$SIG{INT} = sub { $continue = 0; }; +$SIG{TERM} = sub { $continue = 0; }; + +do { + printf("\n") if ($Verbose > 1); + printf("MoveToServer check at %s\n", scalar localtime()) if ($Verbose == 1); + chdir "../Firmware"; + Process(); + Pause($SleepTime); +} while ($continue); + +exit; + +#################################################################### + + +sub Process { + my $slnFile = ""; + + my @files = glob("*.sln"); + foreach (@files) { + $slnFile = $_; + printf(" Found: %s\n", $slnFile) if ($Verbose > 1); + } + + if ($slnFile eq "") { + printf(" *** No Solution Files found ...\n") if ($Verbose == 1); + return; + } + + my $inoFile = $slnFile; + $inoFile =~ s/(.*)\.sln/$1\.ino/; + if (!-e $inoFile) { + printf(" *** %s not found ...\n", $inoFile) if ($Verbose == 1); + return; + } + printf(" Search %s\n", $inoFile) if ($Verbose > 1); + my $verString = GetVerString($inoFile); + if ($verString eq "") { + printf(" *** No Version string in %s ...\n", $inoFile) if ($Verbose == 1); + return; + } + printf(" Version '%s'\n", $verString) if ($Verbose > 1); + + my $targBin = $slnFile; + $targBin =~ s/(.*)\.sln/$1\.bin/; + printf(" Target Bin file is %s\n", $targBin) if ($Verbose > 1); + + my @Folders = qw(Debug Release); + foreach my $f (@Folders) { + printf(" Scanning %s\n", $f) if ($Verbose > 1); + my $tF = "$f\\$targBin"; + if (-e $tF) { + printf(" Processing %s\n", $tF) if ($Verbose > 1); + my $srvrFile = "$ServerPath\\$verString.bin"; + my $cmd = sprintf("move /Y \"%s\" \"%s\"", $tF, $srvrFile); + printf(" > %s\n", $cmd); + `$cmd`; + } + } +} + + +sub Pause { + my $dly = shift; + my $count = 0; + + while ($count++ < $dly && $continue) { + sleep(1); + } +} + +sub GetVerString { + my $iF = shift; + my $ver = ""; + + open(IF, "<$iF") || return $ver; + #const String MyVer = "SmartSwitch v1.02.24"; + while () { + if (/String MyVer = \"(.*)\"/) { + $ver = $1; + last; + #close IF; + #return $ver; + } + } + close IF; + return $ver; +}