diff --git a/README.md b/README.md index d6dd320..5cc2fc0 100644 --- a/README.md +++ b/README.md @@ -1509,7 +1509,7 @@ For Arduino IDE create/update `platform.local.txt`: Add/Update the following line: ``` - compiler.cpp.extra_flags=-DDASYNCWEBSERVER_REGEX + compiler.cpp.extra_flags=-DASYNCWEBSERVER_REGEX ``` For platformio modify `platformio.ini`: diff --git a/examples/SmartSwitch/PinOut_Notes.txt b/examples/SmartSwitch/PinOut_Notes.txt index c8c2a50..2634a19 100644 --- a/examples/SmartSwitch/PinOut_Notes.txt +++ b/examples/SmartSwitch/PinOut_Notes.txt @@ -1,13 +1,56 @@ -ESP12 +This application: +D2 = 4; // DHT DATA I/O +D3 = 0; // BUTTON - most modules have it populated on PCB +D4 = 2; // LED (RELAY) - most modules have it populated on PCB -static const uint8_t D0 = 16; -static const uint8_t D1 = 5; -static const uint8_t D2 = 4; // DHT DATA I/O -static const uint8_t D3 = 0; // BUTTON - most modules have it populated on PCB -static const uint8_t D4 = 2; // LED (RELAY) - most modules have it populated on PCB -static const uint8_t D5 = 14; -static const uint8_t D6 = 12; -static const uint8_t D7 = 13; -static const uint8_t D8 = 15; -static const uint8_t D9 = 3; -static const uint8_t D10 = 1; \ No newline at end of file + + +Pinout ESP12 (8266) +D GPIO In Out Notes + +D0 16 no interrupt no PWM or I2C support HIGH at boot used to wake up from deep sleep +D1 5 OK OK often used as SCL (I2C) +D2 4 OK OK often used as SDA (I2C) +D3 0 PU OK pulled up connected to FLASH button, boot fails if pulled LOW +D4 2 PU OK pulled up HIGH at boot connected to on-board LED, boot fails if pulled LOW +D5 14 OK OK SPI (SCLK) +D6 12 OK OK SPI (MISO) +D7 13 OK OK SPI (MOSI) +D8 15 pulled to GND OK SPI (CS) Boot fails if pulled HIGH +RX 3 OK RX pin HIGH at boot +TX 1 TX pin OK HIGH at boot debug output at boot, boot fails if pulled LOW +A0 ADC0 Analog Input + + +Pinout ESP32 +IO In Out Notes + +0 PU OK pulled-up input, outputs PWM signal at boot +1 TX OK debug output at boot +2 OK OK connected to on-board LED +3 OK RX pin HIGH at boot +4 OK OK +5 OK OK outputs PWM signal at boot + +6-11 x x connected to the integrated SPI flash + +12 OK OK boot fail if pulled high +13 OK OK +14 OK OK outputs PWM signal at boot +15 OK OK outputs PWM signal at boot +16 OK OK +17 OK OK +18 OK OK +19 OK OK +21 OK OK +22 OK OK +23 OK OK +25 OK OK +26 OK OK +27 OK OK +32 OK OK +33 OK OK +34 OK input only +35 OK input only +36 OK input only +39 OK input only \ No newline at end of file diff --git a/examples/SmartSwitch/README.md b/examples/SmartSwitch/README.md index 1d5171a..fd8cd40 100644 --- a/examples/SmartSwitch/README.md +++ b/examples/SmartSwitch/README.md @@ -1,16 +1,17 @@ -  -## -  - -## SmartSwitch -* Remote Temperature Control application with schedule (example car block heater or battery charger) -* Based on ESP_AsyncFSBrowser example -* Wide browser compatibility, no extra server-side needed. -* HTTP server and WebSocket, single port -* Standalone, no JS dependencies for the browser from Internet (I hope), ace editor included -* Added ESPAsyncWiFiManager -* Real Time (NTP) w/ Time Zones -* Memorized settings to EEPROM -* Multiple clients can be connected at same time, they see each other' requests -* Default credentials smart:switch -* Use latest ESP8266 core lib (from Github) +  +## +  + +## SmartSwitch +* Remote Temperature Control application with schedule (example car block heater or battery charger) +* Based on ESP_AsyncFSBrowser example +* Wide browser compatibility, no extra server-side needed +* HTTP server and WebSocket, single port +* Standalone, no JS dependencies for the browser from Internet (I hope), ace editor included +* Added ESPAsyncWiFiManager +* Fallback to an own WIFI_AP, no Internet to sync but by a browser the clock can be set once +* Real Time (NTP) w/ Time Zones +* Memorized settings to EEPROM +* Multiple clients can be connected at same time, they see each other' requests +* Default credentials smart:switch +* Use latest ESP8266 or ESP32 core(from GitHub) diff --git a/examples/SmartSwitch/SmartSwitch.ino b/examples/SmartSwitch/SmartSwitch.ino index 90aca030..3dbc61b 100644 --- a/examples/SmartSwitch/SmartSwitch.ino +++ b/examples/SmartSwitch/SmartSwitch.ino @@ -1,498 +1,529 @@ -/* -SmartSwitch application -Based on ESP_AsyncFSBrowser -Temperature Control for heater with schedule -Main purpose - for winter outside car block heater or battery charger -Wide browser compatibility, no other server-side needed. -HTTP server and WebSocket, single port -Standalone, no JS dependencies for the browser from Internet (I hope) -Based on ESP_AsyncFSBrowser -Real Time (NTP) w/ Time Zones -Memorized settings to EEPROM -Multiple clients can be connected at same time, they see each other requests -Use latest ESP core lib (from Github) -*/ - -#define USE_WFM // to use ESPAsyncWiFiManager -//#define DEL_WFM // delete Wifi credentials stored - //(use once then comment and flash again), also HTTP /erase-wifi can do the same live - -#define USE_AUTH // .setAuthentication for all static - -#include -#ifdef ESP32 - #include - #include - #include - #include - #include -#elif defined(ESP8266) - #include - #include - #include -#endif -#include -#ifdef USE_WFM - #include "ESPAsyncWiFiManager.h" -#endif -#include -#include -#include -#include -#include -#define MYTZ TZ_America_Toronto -#define RTC_UTC_TEST 1577836800 // Some Date - -#define EESC 100 // fixed eeprom address for sched choice -#define EECH 104 // fixed eeprom address to keep selected active channel, only for reference here -#define EEBEGIN EECH + 1 -#define EEMARK 0x5A -#define MEMMAX 2 // 0,1,2... last max index (only 3 channels) -#define EEALL 512 - -#define HYST 0.5 // C +/- hysteresis - -// DHT -#define DHTTYPE DHT22 // DHT 11 // DHT 22, AM2302, AM2321 // DHT 21, AM2301 -#define DHTPIN 4 //D2 - -DHT dht(DHTPIN, DHTTYPE); - -// SKETCH BEGIN MAIN DECLARATIONS -Ticker tim; -AsyncWebServer server(80); //single port - easy for forwarding -AsyncWebSocket ws("/ws"); - -#ifdef USE_WFM - #ifdef USE_EADNS - AsyncDNSServer dns; - #else - DNSServer dns; - #endif -#else - const char* ssid = "MYSSD"; - const char* password = "MYPASSWD"; -#endif -const char * hostName = "smartsw"; -const char* http_username = "smart"; // for SPIFFSEditor (and static html) -const char* http_password = "switch"; - -// RTC -static timeval tv; -static time_t now; - -// HW I/O -const int btnPin = 0; //D3 -const int ledPin = 2; //D4 -int btnState = HIGH; - -// Globals -uint8_t count = 0; -uint8_t sched = 0; // automatic schedule -byte memch = 0; // select memory "channel" to work with -float t = 0; -float h = 0; -bool udht = false; -bool heat_enabled_prev = false; -int ledState; - -struct EE_bl { - byte memid; //here goes the EEMARK stamp - uint8_t hstart; - uint8_t mstart; - uint8_t hstop; - uint8_t mstop; - float tempe; -}; - -EE_bl ee = {0,0,0,0,0,0.1}; //populate as initial - -// SUBS -void writeEE() { - ee.memid = EEMARK; - //EEPROM.put(EESC, sched); // only separately when needed with commit() - //EEPROM.put(EECH, memch); // not need to store and retrieve memch - EEPROM.put(EEBEGIN + memch*sizeof(ee), ee); - EEPROM.commit(); //needed for ESP8266? -} - -void readEE() { - byte ChkEE; - if (memch > MEMMAX) memch = 0; - EEPROM.get(EEBEGIN + memch*sizeof(ee), ChkEE); - if (ChkEE == EEMARK){ //otherwise stays with defaults - EEPROM.get(EEBEGIN + memch*sizeof(ee), ee); - EEPROM.get(EESC, sched); - if (sched > MEMMAX + 1) sched = 0; - } -} - -void showTime() -{ - byte tmpch = 0; - bool heat_enabled = false; - - gettimeofday(&tv, nullptr); - now = time(nullptr); - const tm* tm = localtime(&now); - ws.printfAll("Now,Clock,%02d:%02d,%d", tm->tm_hour, tm->tm_min, tm->tm_wday); - if ((2==tm->tm_hour )&&(2==tm->tm_min)) { - configTime(MYTZ, "pool.ntp.org"); - Serial.print(F("Sync Clock at 02:02\n")); - } - Serial.printf("RTC: %02d:%02d\n", tm->tm_hour, tm->tm_min); - - if (sched == 0) { // automatic - if ((tm->tm_wday > 0)&&(tm->tm_wday < 6)) tmpch = 0; //Mon - Fri - else if (tm->tm_wday == 6) tmpch = 1; //Sat - else if (tm->tm_wday == 0) tmpch = 2; //Sun - } else { // manual - tmpch = sched - 1; //and stays - } - - if (tmpch != memch) { // update if different - memch = tmpch; - readEE(); - ws.printfAll("Now,Setting,%02d:%02d,%02d:%02d,%+2.1f", ee.hstart, ee.mstart, ee.hstop, ee.mstop, ee.tempe); - } - - // process smart switch by time and temperature - uint16_t xmi = (uint16_t)(60*tm->tm_hour) + tm->tm_min; // max 24h = 1440min, current time - uint16_t bmi = (uint16_t)(60*ee.hstart) + ee.mstart; // begin in minutes - uint16_t emi = (uint16_t)(60*ee.hstop) + ee.mstop; // end in minutes - - if (bmi == emi) heat_enabled = false; - else { //enable smart if different - - if (((bmi < emi)&&(bmi <= xmi)&&(xmi < emi))|| - ((emi < bmi)&&((bmi <= xmi)||(xmi < emi)))) { - heat_enabled = true; - } else heat_enabled = false; - } - - if (heat_enabled_prev) { // smart control (delayed one cycle) - if (((t - HYST) < ee.tempe)&&(ledState == HIGH)) { // OFF->ON once - ledState = LOW; - digitalWrite(ledPin, ledState); // apply change - ws.textAll("led,ledon"); - } - if ((((t + HYST) > ee.tempe)&&(ledState == LOW))||(!heat_enabled)) { // ON->OFF once, also turn off at end of period. - ledState = HIGH; - digitalWrite(ledPin, ledState); // apply change - ws.textAll("led,ledoff"); - } - Serial.printf(ledState ? "LED OFF" : "LED ON"); - Serial.print(F(", Smart enabled\n")); - } - heat_enabled_prev = heat_enabled; //update -} - -void updateDHT(){ - h = dht.readHumidity(); - t = dht.readTemperature(); //Celsius or dht.readTemperature(true) for Fahrenheit - if (isnan(h) || isnan(t)) { - Serial.print(F("Failed to read from DHT sensor!")); - h = 0; // debug w/o sensor - t = 0; - } -} - -void analogSample() -{ - ws.printfAll("wpMeter,Arduino,%+2.1f,%2.1f,%d", t, h, heat_enabled_prev); - Serial.printf("T/H.: %+2.1f°C/%2.1f%%,%d\n", t, h, heat_enabled_prev); -} - -void checkPhysicalButton() -{ - if (digitalRead(btnPin) == LOW) { - if (btnState != LOW) { // btnState is used to avoid sequential toggles - ledState = !ledState; - digitalWrite(ledPin, ledState); - if (ledState) ws.textAll("led,ledoff"); - else ws.textAll("led,ledon"); - } - btnState = LOW; - } else { - btnState = HIGH; - } -} - -void mytimer() { - ++count; //200ms increments - checkPhysicalButton(); - if ((count % 25) == 1) { // update temp every 5 seconds - analogSample(); - udht = true; - } - if ((count % 50) == 0) { // update temp every 10 seconds - ws.cleanupClients(); - } - if (count >= 150) { // cycle every 30 sec - showTime(); - count = 0; - } -} - -// server -void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ - if(type == WS_EVT_CONNECT){ - Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); - //client->printf("Hello Client %u :)", client->id()); - //client->ping(); - - IPAddress ip = client->remoteIP(); - Serial.printf("[%u] Connected from %d.%d.%d.%d\n", client->id(), ip[0], ip[1], ip[2], ip[3]); - showTime(); - analogSample(); - if (ledState) ws.textAll("led,ledoff"); - else ws.textAll("led,ledon"); - - ws.printfAll("Now,Setting,%02d:%02d,%02d:%02d,%+2.1f", ee.hstart, ee.mstart, ee.hstop, ee.mstop, ee.tempe); - ws.printfAll("Now,sched,%d", sched); - - } else if(type == WS_EVT_DISCONNECT){ - Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); - ws.textAll("Now,remoff"); - - } else if(type == WS_EVT_ERROR){ - Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); - } else if(type == WS_EVT_PONG){ - Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); - } else if(type == WS_EVT_DATA){ - AwsFrameInfo * info = (AwsFrameInfo*)arg; - String msg = ""; - if(info->final && info->index == 0 && info->len == len){ - //the whole message is in a single frame and we got all of it's data - Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); - - if(info->opcode == WS_TEXT){ - for(size_t i=0; i < info->len; i++) { //debug - msg += (char) data[i]; - } - if(data[0] == 'L') { // LED - if(data[1] == '1') { - ledState = LOW; - ws.textAll("led,ledon"); // for others - } - else if(data[1] == '0') { - ledState = HIGH; - ws.textAll("led,ledoff"); - } - digitalWrite(ledPin, ledState); // apply change - - - } else if(data[0] == 'T') { // timeset - if (len > 11) { - data[3] = data[6] = data[9] = data[12] = 0; // cut strings - ee.hstart = (uint8_t) atoi((const char *) &data[1]); - ee.mstart = (uint8_t) atoi((const char *) &data[4]); - ee.hstop = (uint8_t) atoi((const char *) &data[7]); - ee.mstop = (uint8_t) atoi((const char *) &data[10]); - Serial.printf("[%u] Timer set %02d:%02d - %02d:%02d\n", client->id(), ee.hstart, ee.mstart, ee.hstop, ee.mstop); - writeEE(); - memch = 255; // to force showTime()to send Setting - showTime(); - } - } else if(data[0] == 'W') { // temperatureset - if (len > 3) { - if (ee.tempe != (float) atof((const char *) &data[1])){ - ee.tempe = (float) atof((const char *) &data[1]); - Serial.printf("[%u] Temp set %+2.1f\n", client->id(), ee.tempe); - writeEE(); - memch = 255; // to force showTime()to send Setting - showTime(); - } - } - } else if ((data[0] == 'Z')&&(len > 2)) { // sched - data[2] = 0; - if (sched != (uint8_t) atoi((const char *) &data[1])){ - sched = (uint8_t) atoi((const char *) &data[1]); - EEPROM.put(EESC, sched); //separately - EEPROM.commit(); //needed for ESP8266? - ws.printfAll("Now,sched,%d", sched); - showTime(); - } - } - - } else { - char buff[3]; - for(size_t i=0; i < info->len; i++) { - sprintf(buff, "%02x ", (uint8_t) data[i]); - msg += buff ; - } - } - Serial.printf("%s\n",msg.c_str()); - - if(info->opcode == WS_TEXT) - client->text("I got your text message"); - else - client->binary("I got your binary message"); - - } else { - //message is comprised of multiple frames or the frame is split into multiple packets - if(info->index == 0){ - if(info->num == 0) - Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); - Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); - } - - Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); - - if(info->opcode == WS_TEXT){ - for(size_t i=0; i < len; i++) { - msg += (char) data[i]; - } - } else { - char buff[3]; - for(size_t i=0; i < len; i++) { - sprintf(buff, "%02x ", (uint8_t) data[i]); - msg += buff ; - } - } - Serial.printf("%s\n",msg.c_str()); - - if((info->index + len) == info->len){ - Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); - if(info->final){ - Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); - if(info->message_opcode == WS_TEXT) - client->text("I got your text message"); - else - client->binary("I got your binary message"); - } - } - } - } -} - - -// setup ----------------------------------- - -void setup(){ - Serial.begin(115200); - Serial.setDebugOutput(true); - -//Wifi -#ifdef USE_WFM - AsyncWiFiManager wifiManager(&server,&dns); - #ifdef DEL_WFM - wifiManager.resetSettings(); - #endif - wifiManager.autoConnect(hostName); -#else - //WiFi.mode(WIFI_AP_STA); // Core SVN 5179 use STA as default interface in mDNS (#7042) - //WiFi.softAP(hostName); // Core SVN 5179 use STA as default interface in mDNS (#7042) - WiFi.mode(WIFI_STA); // Core SVN 5179 use STA as default interface in mDNS (#7042) - WiFi.begin(ssid, password); - if (WiFi.waitForConnectResult() != WL_CONNECTED) { - Serial.print(F("STA: Failed!\n")); - WiFi.disconnect(false); - delay(1000); - WiFi.begin(ssid, password); - } -#endif - - Serial.print(F("*CONNECTED*\n")); - -//DHT - dht.begin(); - updateDHT(); //first reading takes time, hold here than the loop; - -//Real Time - time_t rtc = RTC_UTC_TEST; - timeval tv = { rtc, 0 }; - //timezone tz = { 0, 0 }; //(insert) <#5194 - settimeofday(&tv, nullptr); //settimeofday(&tv, &tz); // <#5194 - configTime(MYTZ, "pool.ntp.org"); - -//MDNS (not needed) - // MDNS.begin(hostName); - // MDNS.addService("http","tcp",80); // Core SVN 5179 use STA as default interface in mDNS (#7042) - -//I/O & DHT - pinMode(ledPin, OUTPUT); - pinMode(btnPin, INPUT_PULLUP); - -//EE - EEPROM.begin(EEALL); - //EEPROM.get(EECH, memch); //current channel, no need - readEE(); // populate structure if healthy - digitalWrite(ledPin, ledState); - Serial.printf("Timer set %02d:%02d - %02d:%02d\n", ee.hstart, ee.mstart, ee.hstop, ee.mstop); - Serial.printf("Temp set %+2.1f\n", ee.tempe); - -//SPIFFS - SPIFFS.begin(); - - ws.onEvent(onWsEvent); - server.addHandler(&ws); - -#ifdef ESP32 - server.addHandler(new SPIFFSEditor(SPIFFS, http_username,http_password)); -#elif defined(ESP8266) - server.addHandler(new SPIFFSEditor(http_username,http_password)); -#endif - - server.on("/free-ram", HTTP_GET, [](AsyncWebServerRequest *request){ // direct request->answer - request->send(200, "text/plain", String(ESP.getFreeHeap())); - }); - - server.on("/hw-reset", HTTP_GET, [](AsyncWebServerRequest *request){ - request->onDisconnect([]() { -#ifdef ESP32 - ESP.restart(); -#elif defined(ESP8266) - ESP.reset(); -#endif - }); - request->send(200, "text/plain","Restarting ..."); - }); - - server.on("/erase-wifi", HTTP_GET, [](AsyncWebServerRequest *request){ - request->onDisconnect([]() { - WiFi.disconnect(true); -#ifdef ESP32 - ESP.restart(); -#elif defined(ESP8266) - ESP.reset(); -#endif - }); - request->send(200, "text/plain","Erasing WiFi data ..."); - }); - -#ifdef USE_AUTH - server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm").setAuthentication(http_username,http_password); -#else - server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); -#endif - - server.onNotFound([](AsyncWebServerRequest *request){ // nothing known - Serial.print(F("NOT_FOUND: ")); - if (request->method() == HTTP_OPTIONS) request->send(200); //CORS - else request->send(404); - }); - - DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");//CORS - server.begin(); - - //Timer tick - tim.attach(0.2, mytimer); //every 0.2s - - //OTA - ArduinoOTA.setHostname(hostName); - ArduinoOTA.onStart([]() { - Serial.print(F("OTA Started ...\n")); - ws.textAll("Now,OTA"); // for all clients - }); - ArduinoOTA.begin(); -} // setup end - -// loop ----------------------------------- -void loop(){ - if (udht){ // 5sec - updateDHT(); - udht = false; - } - ArduinoOTA.handle(); -} +/* +SmartSwitch application +Based on ESP_AsyncFSBrowser +Temperature Control for heater with schedule +Main purpose - for winter outside car block heater or battery charger +Wide browser compatibility, no other server-side needed. +HTTP server and WebSocket, single port +Standalone, no JS dependencies for the browser from Internet (I hope) +Based on ESP_AsyncFSBrowser +Real Time (NTP) w/ Time Zones +Memorized settings to EEPROM +Multiple clients can be connected at same time, they see each other requests +Use latest ESP core lib (from Github) +*/ + +#define USE_WFM // to use ESPAsyncWiFiManager +//#define DEL_WFM // delete Wifi credentials stored + //(use once then comment and flash again), also HTTP /erase-wifi can do the same live + +#define USE_AUTH // .setAuthentication for all static + +#include +#ifdef ESP32 + #include + #include + #include + #include + #include +#elif defined(ESP8266) + #include + #include + #include +#endif +#include +#ifdef USE_WFM + #include "ESPAsyncWiFiManager.h" +#endif +#include +#include +#include +#include + +#define RTC_UTC_TEST 1577836800 // Some Date +#ifdef ESP32 + #define MYTZ -5*3600,3600 +#elif defined(ESP8266) + #include + #define MYTZ TZ_America_Toronto +#endif + +#define EESC 100 // fixed eeprom address for sched choice +#define EECH 104 // fixed eeprom address to keep selected active channel, only for reference here +#define EEBEGIN EECH + 1 +#define EEMARK 0x5A +#define MEMMAX 2 // 0,1,2... last max index (only 3 channels) +#define EEALL 512 + +#define HYST 0.5 // C +/- hysteresis + +// DHT +#define DHTTYPE DHT22 // DHT 11 // DHT 22, AM2302, AM2321 // DHT 21, AM2301 +#define DHTPIN 4 //D2 + +DHT dht(DHTPIN, DHTTYPE); + +// SKETCH BEGIN MAIN DECLARATIONS +Ticker tim; +AsyncWebServer server(80); //single port - easy for forwarding +AsyncWebSocket ws("/ws"); + +#ifdef USE_WFM + #ifdef USE_EADNS + AsyncDNSServer dns; + #else + DNSServer dns; + #endif + +//Fallback timeout in seconds allowed to config or it creates an own AP, then serves 192.168.4.1 + #define FBTO 120 + const char* fbssid = "FBSSW"; + const char* fbpassword = "FBpassword4"; + +#else + const char* ssid = "MYROUTERSSD"; + const char* password = "MYROUTERPASSWD"; +#endif +const char* hostName = "smartsw"; +const char* http_username = "smart"; // for SPIFFSEditor (and static html) +const char* http_password = "switch"; + +// RTC +static timeval tv; +static time_t now; + +// HW I/O +const int btnPin = 0; //D3 +const int ledPin = 2; //D4 +int btnState = HIGH; + +// Globals +uint8_t count = 0; +uint8_t sched = 0; // automatic schedule +byte memch = 0; // select memory "channel" to work with +float t = 0; +float h = 0; +bool udht = false; +bool heat_enabled_prev = false; +int ledState; + +struct EE_bl { + byte memid; //here goes the EEMARK stamp + uint8_t hstart; + uint8_t mstart; + uint8_t hstop; + uint8_t mstop; + float tempe; +}; + +EE_bl ee = {0,0,0,0,0,0.1}; //populate as initial + +// SUBS +void writeEE() { + ee.memid = EEMARK; + //EEPROM.put(EESC, sched); // only separately when needed with commit() + //EEPROM.put(EECH, memch); // not need to store and retrieve memch + EEPROM.put(EEBEGIN + memch*sizeof(ee), ee); + EEPROM.commit(); //needed for ESP8266? +} + +void readEE() { + byte ChkEE; + if (memch > MEMMAX) memch = 0; + EEPROM.get(EEBEGIN + memch*sizeof(ee), ChkEE); + if (ChkEE == EEMARK){ //otherwise stays with defaults + EEPROM.get(EEBEGIN + memch*sizeof(ee), ee); + EEPROM.get(EESC, sched); + if (sched > MEMMAX + 1) sched = 0; + } +} + +void showTime() +{ + byte tmpch = 0; + bool heat_enabled = false; + + gettimeofday(&tv, nullptr); + now = time(nullptr); + const tm* tm = localtime(&now); + ws.printfAll("Now,Clock,%02d:%02d,%d", tm->tm_hour, tm->tm_min, tm->tm_wday); + if ((2==tm->tm_hour )&&(2==tm->tm_min)) { + configTime(MYTZ, "pool.ntp.org"); + Serial.print(F("Sync Clock at 02:02\n")); + } + Serial.printf("RTC: %02d:%02d\n", tm->tm_hour, tm->tm_min); + + if (sched == 0) { // automatic + if ((tm->tm_wday > 0)&&(tm->tm_wday < 6)) tmpch = 0; //Mon - Fri + else if (tm->tm_wday == 6) tmpch = 1; //Sat + else if (tm->tm_wday == 0) tmpch = 2; //Sun + } else { // manual + tmpch = sched - 1; //and stays + } + + if (tmpch != memch) { // update if different + memch = tmpch; + readEE(); + ws.printfAll("Now,Setting,%02d:%02d,%02d:%02d,%+2.1f", ee.hstart, ee.mstart, ee.hstop, ee.mstop, ee.tempe); + } + + // process smart switch by time and temperature + uint16_t xmi = (uint16_t)(60*tm->tm_hour) + tm->tm_min; // max 24h = 1440min, current time + uint16_t bmi = (uint16_t)(60*ee.hstart) + ee.mstart; // begin in minutes + uint16_t emi = (uint16_t)(60*ee.hstop) + ee.mstop; // end in minutes + + if (bmi == emi) heat_enabled = false; + else { //enable smart if different + + if (((bmi < emi)&&(bmi <= xmi)&&(xmi < emi))|| + ((emi < bmi)&&((bmi <= xmi)||(xmi < emi)))) { + heat_enabled = true; + } else heat_enabled = false; + } + + if (heat_enabled_prev) { // smart control (delayed one cycle) + if (((t - HYST) < ee.tempe)&&(ledState == HIGH)) { // OFF->ON once + ledState = LOW; + digitalWrite(ledPin, ledState); // apply change + ws.textAll("led,ledon"); + } + if ((((t + HYST) > ee.tempe)&&(ledState == LOW))||(!heat_enabled)) { // ON->OFF once, also turn off at end of period. + ledState = HIGH; + digitalWrite(ledPin, ledState); // apply change + ws.textAll("led,ledoff"); + } + Serial.printf(ledState ? "LED OFF" : "LED ON"); + Serial.print(F(", Smart enabled\n")); + } + heat_enabled_prev = heat_enabled; //update +} + +void updateDHT(){ + h = dht.readHumidity(); + t = dht.readTemperature(); //Celsius or dht.readTemperature(true) for Fahrenheit + if (isnan(h) || isnan(t)) { + Serial.print(F("Failed to read from DHT sensor!")); + h = 0; // debug w/o sensor + t = 0; + } +} + +void analogSample() +{ + ws.printfAll("wpMeter,Arduino,%+2.1f,%2.1f,%d", t, h, heat_enabled_prev); + Serial.printf("T/H.: %+2.1f°C/%2.1f%%,%d\n", t, h, heat_enabled_prev); +} + +void checkPhysicalButton() +{ + if (digitalRead(btnPin) == LOW) { + if (btnState != LOW) { // btnState is used to avoid sequential toggles + ledState = !ledState; + digitalWrite(ledPin, ledState); + if (ledState) ws.textAll("led,ledoff"); + else ws.textAll("led,ledon"); + } + btnState = LOW; + } else { + btnState = HIGH; + } +} + +void mytimer() { + ++count; //200ms increments + checkPhysicalButton(); + if ((count % 25) == 1) { // update temp every 5 seconds + analogSample(); + udht = true; + } + if ((count % 50) == 0) { // update temp every 10 seconds + ws.cleanupClients(); + } + if (count >= 150) { // cycle every 30 sec + showTime(); + count = 0; + } +} + +// server +void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ + if(type == WS_EVT_CONNECT){ + Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); + //client->printf("Hello Client %u :)", client->id()); + //client->ping(); + + IPAddress ip = client->remoteIP(); + Serial.printf("[%u] Connected from %d.%d.%d.%d\n", client->id(), ip[0], ip[1], ip[2], ip[3]); + showTime(); + analogSample(); + if (ledState) ws.textAll("led,ledoff"); + else ws.textAll("led,ledon"); + + ws.printfAll("Now,Setting,%02d:%02d,%02d:%02d,%+2.1f", ee.hstart, ee.mstart, ee.hstop, ee.mstop, ee.tempe); + ws.printfAll("Now,sched,%d", sched); + + } else if(type == WS_EVT_DISCONNECT){ + Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); + ws.textAll("Now,remoff"); + + } else if(type == WS_EVT_ERROR){ + Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); + } else if(type == WS_EVT_PONG){ + Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); + } else if(type == WS_EVT_DATA){ + AwsFrameInfo * info = (AwsFrameInfo*)arg; + String msg = ""; + if(info->final && info->index == 0 && info->len == len){ + //the whole message is in a single frame and we got all of it's data + Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); + + if(info->opcode == WS_TEXT){ + for(size_t i=0; i < info->len; i++) { //debug + msg += (char) data[i]; + } + if(data[0] == 'L') { // LED + if(data[1] == '1') { + ledState = LOW; + ws.textAll("led,ledon"); // for others + } + else if(data[1] == '0') { + ledState = HIGH; + ws.textAll("led,ledoff"); + } + digitalWrite(ledPin, ledState); // apply change + + + } else if(data[0] == 'T') { // timeset + if (len > 11) { + data[3] = data[6] = data[9] = data[12] = 0; // cut strings + ee.hstart = (uint8_t) atoi((const char *) &data[1]); + ee.mstart = (uint8_t) atoi((const char *) &data[4]); + ee.hstop = (uint8_t) atoi((const char *) &data[7]); + ee.mstop = (uint8_t) atoi((const char *) &data[10]); + Serial.printf("[%u] Timer set %02d:%02d - %02d:%02d\n", client->id(), ee.hstart, ee.mstart, ee.hstop, ee.mstop); + writeEE(); + memch = 255; // to force showTime()to send Setting + showTime(); + } + } else if(data[0] == 'W') { // temperatureset + if (len > 3) { + if (ee.tempe != (float) atof((const char *) &data[1])){ + ee.tempe = (float) atof((const char *) &data[1]); + Serial.printf("[%u] Temp set %+2.1f\n", client->id(), ee.tempe); + writeEE(); + memch = 255; // to force showTime()to send Setting + showTime(); + } + } + } else if ((data[0] == 'Z')&&(len > 2)) { // sched + data[2] = 0; + if (sched != (uint8_t) atoi((const char *) &data[1])){ + sched = (uint8_t) atoi((const char *) &data[1]); + EEPROM.put(EESC, sched); //separately + EEPROM.commit(); //needed for ESP8266? + ws.printfAll("Now,sched,%d", sched); + showTime(); + } + } + + } else { + char buff[3]; + for(size_t i=0; i < info->len; i++) { + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n",msg.c_str()); + + if(info->opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + + } else { + //message is comprised of multiple frames or the frame is split into multiple packets + if(info->index == 0){ + if(info->num == 0) + Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); + } + + Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); + + if(info->opcode == WS_TEXT){ + for(size_t i=0; i < len; i++) { + msg += (char) data[i]; + } + } else { + char buff[3]; + for(size_t i=0; i < len; i++) { + sprintf(buff, "%02x ", (uint8_t) data[i]); + msg += buff ; + } + } + Serial.printf("%s\n",msg.c_str()); + + if((info->index + len) == info->len){ + Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); + if(info->final){ + Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); + if(info->message_opcode == WS_TEXT) + client->text("I got your text message"); + else + client->binary("I got your binary message"); + } + } + } + } +} + + +// setup ----------------------------------- + +void setup(){ + Serial.begin(115200); + Serial.setDebugOutput(true); + +//Wifi +#ifdef USE_WFM + AsyncWiFiManager wifiManager(&server,&dns); + #ifdef DEL_WFM + wifiManager.resetSettings(); + #endif + wifiManager.setTimeout(FBTO); // seconds to config or it creates an own AP, then browse 192.168.4.1 + if (!wifiManager.autoConnect(hostName)){ + Serial.print(F("*FALLBACK AP*\n")); + WiFi.mode(WIFI_AP); + WiFi.softAP(fbssid, fbpassword); + // MDNS.begin(fbssid); + // MDNS.addService("http","tcp",80); // Core SVN 5179 use STA as default interface in mDNS (#7042) + } + +#else +// Manual simple STA mode to connect to known router + //WiFi.mode(WIFI_AP_STA); // Core SVN 5179 use STA as default interface in mDNS (#7042) + //WiFi.softAP(hostName); // Core SVN 5179 use STA as default interface in mDNS (#7042) + WiFi.mode(WIFI_STA); // Core SVN 5179 use STA as default interface in mDNS (#7042) + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() != WL_CONNECTED) { + Serial.print(F("STA: Failed!\n")); + WiFi.disconnect(false); + delay(1000); + WiFi.begin(ssid, password); + } +#endif + + Serial.print(F("*CONNECTED*\n")); + +//DHT + dht.begin(); + updateDHT(); //first reading takes time, hold here than the loop; + +//Real Time + time_t rtc = RTC_UTC_TEST; + timeval tv = { rtc, 0 }; + //timezone tz = { 0, 0 }; //(insert) <#5194 + settimeofday(&tv, nullptr); //settimeofday(&tv, &tz); // <#5194 + configTime(MYTZ, "pool.ntp.org"); + +//MDNS (not needed) + // MDNS.begin(hostName); + // MDNS.addService("http","tcp",80); // Core SVN 5179 use STA as default interface in mDNS (#7042) + +//I/O & DHT + pinMode(ledPin, OUTPUT); + pinMode(btnPin, INPUT_PULLUP); + +//EE + EEPROM.begin(EEALL); + //EEPROM.get(EECH, memch); //current channel, no need + readEE(); // populate structure if healthy + digitalWrite(ledPin, ledState); + Serial.printf("Timer set %02d:%02d - %02d:%02d\n", ee.hstart, ee.mstart, ee.hstop, ee.mstop); + Serial.printf("Temp set %+2.1f\n", ee.tempe); + +//SPIFFS + SPIFFS.begin(); + + ws.onEvent(onWsEvent); + server.addHandler(&ws); + +#ifdef ESP32 + server.addHandler(new SPIFFSEditor(SPIFFS, http_username,http_password)); +#elif defined(ESP8266) + server.addHandler(new SPIFFSEditor(http_username,http_password)); +#endif + + server.on("/free-ram", HTTP_GET, [](AsyncWebServerRequest *request){ // direct request->answer + request->send(200, "text/plain", String(ESP.getFreeHeap())); + }); + + + server.on("/get-time", HTTP_GET, [](AsyncWebServerRequest *request){ + if(request->hasParam("btime")){ + time_t rtc = (request->getParam("btime")->value()).toInt(); + timeval tv = { rtc, 0 }; + settimeofday(&tv, nullptr); + } + request->send(200, "text/plain","Got browser time ..."); + }); + + + server.on("/hw-reset", HTTP_GET, [](AsyncWebServerRequest *request){ + request->onDisconnect([]() { +#ifdef ESP32 + ESP.restart(); +#elif defined(ESP8266) + ESP.reset(); +#endif + }); + request->send(200, "text/plain","Restarting ..."); + }); + + server.on("/erase-wifi", HTTP_GET, [](AsyncWebServerRequest *request){ + request->onDisconnect([]() { + WiFi.disconnect(true); +#ifdef ESP32 + ESP.restart(); +#elif defined(ESP8266) + ESP.reset(); +#endif + }); + request->send(200, "text/plain","Erasing WiFi data ..."); + }); + +#ifdef USE_AUTH + server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm").setAuthentication(http_username,http_password); +#else + server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); +#endif + + server.onNotFound([](AsyncWebServerRequest *request){ // nothing known + Serial.print(F("NOT_FOUND: ")); + if (request->method() == HTTP_OPTIONS) request->send(200); //CORS + else request->send(404); + }); + + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");//CORS + server.begin(); + + //Timer tick + tim.attach(0.2, mytimer); //every 0.2s + + //OTA + ArduinoOTA.setHostname(hostName); + ArduinoOTA.onStart([]() { + Serial.print(F("OTA Started ...\n")); + ws.textAll("Now,OTA"); // for all clients + }); + ArduinoOTA.begin(); +} // setup end + +// loop ----------------------------------- +void loop(){ + if (udht){ // 5sec + updateDHT(); + udht = false; + } + ArduinoOTA.handle(); +} diff --git a/examples/SmartSwitch/data/ace.ico.gz b/examples/SmartSwitch/data/ace.ico.gz new file mode 100644 index 0000000..49e15bc Binary files /dev/null and b/examples/SmartSwitch/data/ace.ico.gz differ diff --git a/examples/SmartSwitch/data/acefull.js.gz b/examples/SmartSwitch/data/acefull.js.gz index 55e6039..0ff2a5f 100644 Binary files a/examples/SmartSwitch/data/acefull.js.gz and b/examples/SmartSwitch/data/acefull.js.gz differ diff --git a/examples/SmartSwitch/data/index.htm b/examples/SmartSwitch/data/index.htm index 65a7eaf..9f7da5b 100644 --- a/examples/SmartSwitch/data/index.htm +++ b/examples/SmartSwitch/data/index.htm @@ -1,6 +1,6 @@ + - Smart Switch @@ -54,6 +54,7 @@ appearance: none; } + .switch { position: relative; display: inline-block; @@ -116,6 +117,12 @@ .clk { font-size: 54px; color: #444; + cursor: pointer + } + + .clk2 { + font-size: 32px; + color: #444 } .clear:after, @@ -136,6 +143,7 @@ left: 0; margin: auto; max-width: 500px; + text-align: center; border: 0px solid #ccc } @@ -185,7 +193,7 @@ .container { display: inline-block; position: relative; - padding-left: 28px; + padding-left: 19px; padding-top: 4px; margin-top: 8px; margin-bottom: 8px; @@ -194,6 +202,9 @@ -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; + + width: 12.5%; + user-select: none } @@ -239,6 +250,7 @@ border-radius: 50%; background: white } + @@ -249,7 +261,7 @@ - Auto + Def M-F @@ -292,26 +304,22 @@ - + - - + + - - - + + + + - - - - - - + @@ -319,15 +327,14 @@ - - - + + - - - - - - - - - - - - - + + + + + + ESP Editor + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/edit.htm.gz.h b/src/edit.htm.gz.h index 21057ee..cbcacd5 100644 --- a/src/edit.htm.gz.h +++ b/src/edit.htm.gz.h @@ -1,219 +1,224 @@ -#define edit_htm_gz_len 4316 + +//File: edit.htm.gz, Size: 4365 +#define edit_htm_gz_len 4365 const uint8_t edit_htm_gz[] PROGMEM = { -0x1F,0x8B,0x08,0x08,0x33,0x95,0x87,0x5E,0x02,0x00,0x65,0x64,0x69,0x74,0x2E,0x68,0x74,0x6D,0x00,0xB5, -0x1A,0x0B,0x5B,0xDB,0x36,0xF0,0xAF,0x18,0x6F,0x63,0xF6,0xE2,0x38,0x0E,0x50,0xD6,0x39,0x18,0x16,0x1E, -0x2B,0x7D,0x01,0x25,0x49,0x3B,0xCA,0xD8,0x3E,0xC5,0x56,0x12,0x15,0x5B,0xF6,0x2C,0x99,0x40,0xB3,0xFC, -0xF7,0x9D,0x24,0x3F,0x43,0xE8,0x1E,0xDF,0xD6,0x07,0x91,0x74,0xBA,0xD3,0xDD,0xE9,0x9E,0x0A,0x7B,0x1B, -0xC7,0xE7,0x47,0xC3,0xAB,0x8B,0x13,0x6D,0xC6,0xA3,0x70,0x7F,0x4F,0xFC,0xD4,0x42,0x44,0xA7,0x9E,0x8E, -0xA9,0xBE,0xBF,0x17,0x61,0x8E,0x00,0xC4,0x93,0x36,0xFE,0x3D,0x23,0x77,0x9E,0x7E,0x14,0x53,0x8E,0x29, -0x6F,0xF3,0x87,0x04,0xEB,0x9A,0xAF,0x66,0x9E,0xCE,0xF1,0x3D,0xEF,0x08,0xE4,0x9E,0xE6,0xCF,0x50,0xCA, -0x30,0xF7,0x32,0x3E,0x69,0x3F,0x07,0x12,0x9C,0xF0,0x10,0xEF,0x9F,0x0C,0x2E,0xB4,0x93,0x80,0xF0,0x38, -0xDD,0xEB,0xA8,0x95,0x3D,0xC6,0x1F,0x42,0xAC,0x09,0x42,0x39,0xBE,0xCF,0x98,0xAE,0x45,0x38,0x20,0xC8, -0xD3,0x99,0x9F,0x62,0xC1,0x41,0x88,0xC6,0x38,0x5C,0x4C,0x62,0x38,0x92,0x91,0xCF,0xD8,0xED,0x6E,0x25, -0xF7,0x3D,0x39,0x9D,0xA0,0x88,0x84,0x0F,0x2E,0x43,0x94,0xB5,0x19,0x4E,0xC9,0x64,0x69,0xFB,0xD1,0xE2, -0x73,0x9B,0xD0,0x00,0xDF,0xBB,0xDB,0x8E,0xD3,0x4B,0x62,0x46,0x38,0x89,0xA9,0x8B,0xC6,0x2C,0x0E,0x33, -0x8E,0x7B,0x21,0x9E,0x70,0xF7,0x19,0x50,0x18,0xC7,0x69,0x80,0x53,0xB7,0x9B,0xDC,0x6B,0x00,0x22,0x81, -0xF6,0xD5,0xCE,0xCE,0x4E,0x6F,0x8C,0xFC,0xDB,0x69,0x1A,0x67,0x34,0x68,0xFB,0x71,0x18,0xA7,0xEE,0x57, -0x93,0x67,0xE2,0x6F,0x2F,0x20,0x2C,0x09,0xD1,0x83,0x4B,0x63,0x8A,0x01,0xF7,0xBE,0xCD,0x66,0x28,0x88, -0xE7,0xAE,0xA3,0x39,0x5A,0xD7,0x01,0x22,0xE9,0x74,0x8C,0x0C,0xC7,0x12,0x7F,0xED,0x1D,0xB3,0xF7,0xB7, -0xF8,0x55,0xCB,0x73,0x4C,0xA6,0x33,0xEE,0x7E,0xEF,0x38,0x82,0x7F,0x2D,0x0B,0x17,0x21,0x61,0xBC,0x2D, -0x95,0xA3,0xCE,0xE3,0x71,0xE2,0x3A,0x92,0x75,0xF8,0x88,0x50,0x3A,0x25,0x14,0x06,0x09,0x0A,0x02,0x42, -0xA7,0xAE,0x42,0x0B,0xC9,0xA2,0x94,0x36,0xC5,0x21,0xE2,0xE4,0x0E,0xF7,0x22,0x42,0xDB,0x73,0x12,0xF0, -0x99,0xBB,0xEB,0x00,0x17,0x7E,0x96,0x32,0x90,0x29,0x89,0x09,0xE5,0x38,0x95,0x68,0x2C,0x41,0x74,0xA1, -0x44,0x15,0x0A,0x28,0xE5,0x24,0x34,0x24,0x14,0xB7,0xC7,0x61,0xEC,0xDF,0x96,0x27,0xED,0x26,0xF7,0xF9, -0x59,0xEE,0x2C,0xBE,0xC3,0xE9,0xA2,0x52,0x97,0xC4,0x6E,0x00,0x1B,0xA4,0x31,0xC6,0x4B,0x9B,0xDF,0x65, -0x00,0xB5,0xE4,0x27,0x48,0x99,0x53,0xAD,0x8B,0xD4,0x14,0x3C,0x47,0x21,0x34,0xC9,0xF8,0xE2,0xF1,0x55, -0xC6,0x09,0xF2,0x09,0x7F,0x70,0x1D,0xB9,0x4D,0x5A,0x88,0xBB,0xE3,0x38,0x9A,0x50,0xB8,0xF6,0x1E,0xA7, -0x01,0xA2,0xC8,0xEA,0xA7,0x04,0x85,0xD6,0xA0,0x52,0x79,0x3B,0x8A,0x3F,0xB7,0x33,0x18,0xC3,0x3C,0xC4, -0x3E,0x57,0x1A,0x86,0x4B,0x18,0xDF,0x12,0xFE,0x18,0xF0,0x68,0xA1,0xA6,0x2B,0xA9,0xA1,0x99,0xBA,0xBD, -0x2E,0xE8,0x46,0xF2,0xA1,0xC4,0x56,0x12,0xB5,0xC7,0x31,0xE7,0x71,0x24,0xED,0xAD,0x94,0x56,0x93,0x26, -0xF3,0xFC,0xD1,0x75,0xAC,0x57,0x7D,0x8D,0x7C,0x0F,0x94,0xCA,0x89,0x8F,0xC2,0x36,0x0A,0xC9,0x94,0xBA, -0x11,0x09,0x82,0x10,0xD7,0x4C,0xD6,0xCD,0xD2,0xD0,0x08,0x10,0x47,0x2E,0x89,0xD0,0x14,0x77,0x12,0x3A, -0x05,0x28,0xC3,0xBB,0x3B,0x16,0x79,0x7F,0x78,0x7E,0x39,0x77,0x5E,0xBF,0x98,0xC6,0x7D,0xF8,0x73,0x36, -0x18,0xCD,0x4E,0x46,0x53,0x18,0x1D,0x8A,0x69,0xFF,0xDD,0x51,0xFF,0x1D,0x7C,0x1C,0x75,0x5B,0x9F,0x26, -0xBF,0xF7,0xC5,0xF2,0x8B,0xE0,0x70,0x38,0x3A,0xE9,0xF7,0x5F,0x77,0x5E,0x9E,0xCD,0x3F,0xBC,0xDE,0x15, -0xE0,0xC3,0xD0,0xB9,0x7C,0x3F,0x73,0x46,0x5B,0x3F,0x44,0xC1,0x69,0x30,0xF3,0xA3,0x51,0xFF,0xDD,0x87, -0xCB,0xBB,0xAB,0x68,0x34,0x1D,0x7C,0xE8,0xCE,0x3E,0x6E,0xBD,0x1F,0x7C,0xFC,0xF0,0xD3,0x2D,0xFE,0xF9, -0xF4,0xD5,0xC7,0xE1,0x1C,0x10,0x8E,0xE3,0xC1,0xE8,0xF2,0xF0,0xFD,0xE1,0xF4,0xE3,0xA1,0x7F,0x72,0x3F, -0x0E,0xCF,0x0E,0x5F,0xF4,0xC7,0xFD,0x2D,0x1F,0xE3,0xE9,0xF0,0xF2,0x30,0x7B,0xF9,0xFA,0x7C,0x4A,0xC8, -0x6C,0xF0,0xF1,0x6C,0xE8,0x1F,0x3D,0x7B,0x33,0x3A,0xED,0x93,0xD9,0xD9,0xAB,0x4B,0xE7,0xF6,0xC5,0xEB, -0xA3,0x63,0xFF,0xEA,0xD5,0xD5,0xEE,0xF1,0x76,0xE7,0xFB,0xEF,0xDF,0x06,0xE7,0x84,0x0E,0xEF,0x3E,0xF7, -0xA7,0x47,0xF3,0xE7,0x0F,0x6C,0x38,0x7B,0x79,0x47,0x3B,0xEF,0xE3,0x4F,0x2F,0x1F,0xDE,0xC2,0xFF,0x8B, -0x8B,0xD6,0x78,0xD0,0x65,0xA3,0x77,0x2F,0xDF,0x6F,0xB1,0x1F,0x9E,0x25,0x87,0xC7,0xC7,0x77,0xD1,0xF8, -0xA2,0x13,0x05,0xB7,0x13,0xFE,0x7C,0x9B,0x27,0x57,0xD3,0xEC,0xE3,0xEF,0xCF,0x5E,0xCD,0x3A,0xE7,0x18, -0x5D,0xCD,0x5A,0x0F,0x9F,0x1F,0x9E,0xCF,0x86,0xA7,0x77,0x67,0x21,0xBA,0x3F,0x3B,0xF3,0x3F,0x47,0xAD, -0x10,0xFD,0x70,0x3E,0x0C,0x51,0xDA,0x1D,0x05,0xFD,0x4E,0xEB,0x68,0xAB,0xBF,0xC3,0xD3,0xCB,0x23,0x7A, -0xBC,0xFD,0x69,0xF0,0xFC,0xF0,0xB0,0x1B,0x8F,0x7F,0xDF,0x7A,0x71,0xBB,0xFB,0x62,0xB4,0xFB,0x6E,0xFC, -0xAE,0x3F,0xD8,0x39,0x1C,0xA1,0xAB,0xC1,0xBB,0xFE,0x64,0x67,0x3C,0x9B,0xBD,0x7E,0x3D,0xFC,0x29,0xE8, -0x7F,0x4E,0xFB,0xE7,0xF3,0xFE,0xFD,0xC9,0xA8,0x7F,0xDA,0x7A,0x7D,0xF2,0xD6,0xE9,0x0E,0xAE,0xB6,0xA7, -0x6F,0x77,0xE7,0x87,0xEC,0xA4,0xFF,0xEE,0xD0,0x99,0xBE,0x6A,0x45,0xE8,0x63,0x7C,0xB4,0x3D,0x7D,0xB9, -0x4B,0x2E,0xAE,0x50,0xFF,0xE5,0xE1,0x2B,0x46,0x2E,0xA3,0xD3,0x91,0xD3,0xEF,0xBF,0x39,0xC7,0x3F,0x1D, -0x6D,0xA3,0xD7,0x5B,0xFE,0x07,0xD0,0xFF,0xE8,0x67,0xFC,0x7D,0xAB,0x3F,0x3F,0x77,0x42,0xFF,0x07,0x3C, -0x3C,0xBD,0x1A,0xCA,0xDB,0x39,0x09,0x7F,0x1A,0xDE,0x0E,0xB2,0x77,0xD1,0xD1,0x91,0xA9,0xD1,0xB8,0x9D, -0xE2,0x04,0x23,0x5E,0x8F,0x55,0xA5,0x73,0x80,0x6D,0x55,0x56,0x98,0x3B,0xA9,0x88,0xAC,0xED,0x00,0xFB, -0x71,0x8A,0xE4,0x1E,0x40,0xC0,0xA9,0x30,0xB1,0xE5,0x8F,0x32,0xD4,0x6A,0x2A,0xD2,0x6A,0x88,0x06,0x9A, -0x51,0x38,0x42,0x44,0x28,0xE0,0xDC,0x11,0x1F,0xB7,0x13,0x72,0x8F,0xC3,0xB6,0x44,0x76,0x1D,0x73,0x21, -0x9D,0xAD,0xD8,0x86,0x28,0x89,0x14,0xD5,0x62,0x21,0xF8,0x84,0x7C,0x91,0x1E,0xC0,0x65,0x22,0xF8,0xCC, -0x7D,0x27,0x4E,0xDB,0xE3,0x6C,0x3A,0x21,0xF7,0xE0,0xCD,0x13,0x42,0x09,0xC7,0x5A,0x97,0x2D,0x7F,0x2C, -0xC8,0xDC,0xE2,0x87,0x49,0x8A,0x22,0xCC,0xB4,0xBF,0x49,0x66,0x31,0x49,0xE3,0x68,0x51,0x45,0x40,0x1E, -0xD7,0x26,0xCB,0xE5,0x57,0x59,0x12,0xC6,0x08,0xC4,0x5C,0x13,0x36,0x54,0x30,0x4D,0x85,0x5B,0x95,0x41, -0xB5,0x70,0xB3,0x2D,0x70,0xCB,0x86,0x5B,0x6F,0xED,0x54,0xAE,0xDB,0x96,0x7B,0x45,0xB0,0xAF,0xAB,0xBE, -0x16,0x0F,0x6A,0xB1,0xEE,0x2B,0x0E,0x2A,0x5D,0x7F,0xB8,0x3A,0x44,0x45,0x86,0x8A,0x01,0x15,0xA5,0xBB, -0xBB,0x4E,0x2D,0x54,0xC0,0xBE,0xE5,0x57,0x58,0xA6,0x4C,0xEB,0xAB,0x24,0x85,0xDB,0xC0,0xF3,0x2F,0xD0, -0x2C,0x65,0x6A,0xD2,0x06,0x9A,0x65,0xBA,0x53,0x22,0x54,0x39,0x4F,0xF2,0x5A,0x92,0x7E,0x2C,0x15,0x80, -0x4B,0x6E,0x9E,0x09,0x6E,0xBE,0xA8,0xD5,0xED,0xDD,0x6F,0x72,0x1E,0x76,0x9C,0x6F,0x96,0xB6,0xDA,0x5B, -0xE6,0xE3,0xAE,0x03,0x7F,0x8A,0xB4,0xFB,0xBC,0x62,0x61,0xFC,0x4C,0xFC,0x2D,0x18,0x04,0x3A,0x75,0xE0, -0xF6,0xCE,0x0F,0xCF,0x83,0x71,0x01,0x54,0x82,0x3D,0x0D,0x4F,0x51,0x40,0x32,0xE6,0x3E,0x73,0xBE,0x51, -0xFA,0x84,0xEB,0x03,0xD9,0x8B,0xCB,0x55,0x93,0xCA,0x62,0x59,0x42,0xA8,0xB6,0xC5,0x34,0x71,0xDF,0x28, -0x2D,0x0D,0xB3,0x9E,0xEA,0xC1,0x45,0x2A,0xD3,0x14,0xFB,0x17,0xCE,0x37,0x0B,0x9E,0x22,0xCA,0x26,0x71, -0x1A,0xB9,0x69,0xCC,0x11,0xC7,0x86,0x63,0x2E,0xBB,0xCE,0x3A,0xC0,0xF6,0xAE,0x13,0xE0,0xA9,0xB9,0x5C, -0xEE,0x75,0x20,0xA9,0xC9,0x8A,0xC7,0x4F,0x49,0xC2,0xF7,0x27,0x19,0xF5,0x05,0x0F,0xDA,0x14,0x1B,0xD8, -0x5C,0xA4,0x98,0x67,0x29,0xD5,0x82,0xD8,0xCF,0x84,0xB1,0xDB,0x53,0xCC,0x4F,0x94,0xDD,0x1F,0x3E,0xBC, -0x0C,0x60,0xC7,0xB2,0x44,0xF0,0xD7,0x22,0x80,0x03,0xC3,0x79,0x39,0x4E,0x63,0x3F,0x24,0x18,0x20,0xF2, -0x1A,0x3F,0x18,0xD8,0xE2,0x25,0x22,0xB6,0xC5,0xBA,0x61,0x14,0xDB,0x00,0x48,0xCD,0xC5,0x1D,0x68,0x01, -0x79,0xF8,0x9A,0xDF,0x58,0xC4,0xA3,0xF0,0xD1,0xCB,0xB7,0x93,0x7D,0x74,0xD0,0xEE,0xBA,0x68,0x9F,0x1C, -0x74,0xC1,0xBF,0xCC,0x1A,0x7D,0x75,0xF2,0x4F,0x24,0xC4,0xA3,0xDC,0xE5,0xC4,0x41,0x15,0xB5,0x8E,0x41, -0x2E,0x66,0xA0,0x48,0xF3,0x3B,0xE3,0x7C,0xA0,0x19,0xD7,0xDF,0xB7,0x7F,0xB8,0xF9,0xA3,0x7B,0xED,0xB4, -0xBB,0x37,0xE6,0x6F,0x66,0x87,0xD8,0x1C,0x33,0x6E,0x50,0x74,0x47,0xA6,0x08,0xEC,0xDC,0x16,0xF9,0xB6, -0x3F,0x05,0x29,0xCC,0x5E,0x79,0x06,0x51,0xEC,0x6D,0x39,0xCE,0x86,0x87,0x0F,0x50,0x88,0x81,0x75,0xFD, -0xE4,0xF2,0xF2,0xFC,0xF2,0x5A,0x6F,0xE1,0x96,0x7E,0xE3,0x6A,0x7A,0x8B,0x9A,0x2E,0xB7,0x53,0x3C,0x49, -0x31,0x9B,0x5D,0x20,0x3E,0x33,0x02,0xFB,0x0E,0x85,0x19,0xE8,0x42,0x30,0x12,0x7B,0xA0,0x38,0x7D,0x9C, -0x81,0xFD,0x50,0xDD,0xEC,0xC5,0x36,0xA1,0x14,0xA7,0xA7,0xC3,0xB7,0x6F,0x3C,0xFD,0x52,0x21,0x69,0x6F, -0x08,0xE3,0xBA,0x25,0x6F,0xC4,0x46,0x49,0x82,0x69,0x70,0x34,0x23,0x61,0x60,0xC4,0x66,0x4F,0x90,0xF0, -0x25,0x09,0x59,0x8C,0x00,0x05,0xDF,0x56,0x65,0xEB,0x04,0x24,0xD7,0x2D,0xDF,0x8E,0xB2,0x90,0x93,0x24, -0xC4,0xDE,0x46,0x17,0x66,0x14,0x45,0x00,0x13,0xA9,0x58,0xC0,0x48,0xE0,0xE9,0x2A,0x20,0xA9,0x30,0xB6, -0xF6,0x14,0x5F,0x9D,0x12,0x34,0x4E,0x09,0xEA,0xB8,0x09,0x48,0xA5,0x5B,0x81,0x5D,0xD5,0xCB,0x30,0xCB, -0x8F,0x2A,0x60,0x01,0x9E,0x20,0xE0,0xE4,0x3D,0x48,0x0E,0xAB,0x9D,0x75,0x07,0x05,0xEA,0x20,0xD6,0xD4, -0x08,0xAB,0x6B,0x44,0x5D,0xE5,0x3A,0x64,0xA6,0x90,0xD3,0x26,0x72,0x5A,0x47,0x3E,0x92,0x16,0xB1,0x0E, -0x39,0x55,0xC8,0x61,0x43,0xC4,0x50,0x8A,0xA8,0xA2,0x5C,0x5B,0x68,0x13,0x04,0x02,0xEC,0xB0,0x2E,0x26, -0xCC,0xC0,0x29,0xD1,0x38,0xC4,0x81,0xB7,0xE1,0xC0,0x4C,0x14,0xD6,0xDE,0x96,0xB3,0xE6,0x8C,0x50,0x9D, -0x91,0x35,0xCE,0xC8,0xE4,0x19,0x24,0x01,0x25,0x42,0xEE,0xD0,0xAD,0x4C,0x6A,0xAD,0xB9,0xA2,0x8E,0xF3, -0x67,0xD8,0xBF,0x85,0xF2,0x7E,0x1D,0xFB,0x99,0x09,0xDB,0xE4,0x06,0xC1,0xC6,0x06,0x92,0x07,0x25,0xF2, -0x20,0xD9,0xA3,0xC0,0x41,0x89,0x0D,0xEE,0xEF,0x89,0xE3,0xAC,0xA4,0xAE,0x93,0xF3,0x30,0xD0,0x08,0xD8, -0xFF,0x3A,0xB2,0x89,0xE2,0x38,0x6A,0xAA,0x34,0xAA,0xA3,0x6B,0x03,0x74,0x87,0xD7,0x22,0x47,0xA6,0x95, -0xDA,0x31,0xF5,0x43,0xE2,0xDF,0x7A,0x95,0x37,0x9B,0x0B,0xA3,0x3E,0x11,0xF4,0xB9,0x47,0xF1,0x5C,0xFB, -0x09,0xA2,0xD3,0x31,0xE2,0xA8,0xC7,0x73,0x32,0x46,0x6E,0x3A,0x18,0x08,0x41,0x83,0x87,0x19,0x67,0x36, -0x0A,0x60,0xF9,0x62,0x34,0xD4,0x2D,0xBD,0x23,0x2E,0x46,0x07,0x87,0x26,0xE6,0xD2,0x2C,0x5D,0xCA,0xA2, -0x32,0xB8,0x8F,0xD2,0xB0,0x5A,0x82,0x41,0x61,0x74,0x4B,0x2B,0x5A,0xCB,0x13,0x99,0x18,0xA5,0x02,0x0B, -0xA6,0x90,0x8F,0x6D,0x71,0x86,0x91,0x9B,0x80,0x6E,0x42,0xF4,0x53,0xF6,0x6B,0x98,0x16,0x6A,0x32,0x8D, -0x4A,0xA6,0x53,0x34,0x2F,0xEC,0x44,0x9D,0xDF,0x53,0x5E,0xEE,0x40,0x12,0xA6,0x8C,0x6B,0xD8,0xDB,0x71, -0x7E,0xD8,0xED,0xC1,0x6D,0x18,0xCA,0x77,0x01,0xB0,0xC7,0x6D,0xB0,0xAE,0x29,0x9F,0xF5,0xFC,0x96,0x97, -0x6B,0x25,0xF0,0xB8,0xCD,0xB2,0x31,0xE3,0x29,0xA4,0x38,0xC3,0xB7,0xFC,0x16,0x36,0x9B,0xC7,0xE8,0xAD, -0xD8,0x0A,0x4C,0x2B,0x6E,0xB5,0x96,0x2B,0x0A,0x3A,0x1F,0xD4,0x34,0x84,0x84,0x86,0x70,0xC8,0xB0,0x46, -0x6D,0x7C,0x8F,0xFD,0xA3,0x38,0x8A,0x90,0x20,0xC1,0xE0,0xEA,0xF2,0x89,0x6E,0x2E,0xAD,0x78,0xAD,0x66, -0x9E,0x88,0x5C,0x16,0x7B,0x4A,0x8F,0x10,0x09,0x3D,0xDF,0x16,0xEE,0xC2,0x72,0xA1,0xBE,0x7C,0xCB,0x45, -0x2C,0x52,0x28,0xD7,0xCE,0x8D,0x55,0x5E,0xDC,0x7A,0xA9,0xAA,0x7B,0x17,0x56,0xD7,0x08,0x41,0x66,0x75, -0xD3,0x02,0xD6,0x0C,0x6D,0x15,0x54,0x5F,0x2E,0x2D,0x5F,0xF0,0x3F,0x43,0x74,0x8A,0xFF,0xBE,0x00,0x15, -0x8F,0xD2,0x4B,0x2D,0x0A,0x39,0xE4,0xC0,0xFD,0xC5,0x36,0xAE,0x7F,0xB5,0x6F,0x5A,0xA6,0x79,0xF0,0x75, -0x47,0x6A,0xD8,0xE0,0xE6,0x75,0xF7,0xC6,0x42,0x00,0xB6,0xBF,0x33,0x7F,0xB1,0x25,0xB8,0x01,0xEB,0xDD, -0xC5,0x24,0xD0,0xC4,0x49,0xC2,0xB9,0xE3,0x89,0x86,0x36,0x37,0x0D,0x30,0xB9,0x86,0xB1,0xB6,0x78,0x4B, -0xB7,0x21,0x7D,0x2C,0x97,0xAB,0x49,0x6D,0x98,0x62,0xAC,0xB2,0x66,0x09,0x90,0xDC,0x83,0xCC,0xAB,0xF1, -0xAA,0x94,0x1A,0x5B,0x15,0x14,0x16,0x65,0xD6,0xB7,0xF3,0x82,0xC2,0xD3,0x45,0x45,0x01,0xB1,0x66,0x75, -0x59,0x76,0x7A,0xB0,0x5E,0x73,0xF9,0x6F,0xF7,0x48,0x34,0xD5,0x58,0xEA,0x7B,0xEA,0x2A,0x0E,0xC4,0x0F, -0xEF,0x5B,0x91,0xED,0x36,0x7F,0xF3,0xC7,0x9E,0xDE,0x82,0xFB,0xC5,0x36,0x8D,0xE7,0x86,0xD9,0xFA,0x56, -0xD7,0x24,0x45,0x4F,0x8F,0xD0,0x7D,0xDE,0xEF,0x8B,0x82,0xA4,0xA7,0xC1,0xBC,0x6C,0x50,0xD5,0x82,0xEA, -0xB4,0x51,0xC6,0xE3,0x9E,0x56,0x14,0x3A,0xAA,0xD3,0xD4,0xB5,0xCE,0xFE,0xB7,0x95,0x0E,0x10,0x88,0x8E, -0xD4,0x9D,0x10,0x19,0x9A,0x32,0x11,0xE0,0x70,0x23,0xFA,0x90,0xDC,0xED,0x54,0x0C,0x24,0x00,0x27,0x2B, -0x99,0xD3,0x0A,0x0C,0x64,0x1E,0x18,0x8D,0x7C,0xBB,0x27,0x7A,0x93,0xFD,0x0B,0x55,0x74,0xEE,0x75,0xE4, -0x4C,0x5F,0xE7,0x18,0xA0,0x79,0x0A,0xE8,0x56,0x59,0xE6,0x8C,0xE3,0xE0,0xA1,0x56,0x1C,0xB1,0xC3,0x87, -0xA3,0x10,0x31,0x76,0x86,0x22,0x38,0xDF,0x8F,0x74,0x33,0x37,0xA5,0x7D,0x67,0x73,0xB3,0x89,0x94,0xE2, -0x08,0x7A,0x21,0xC5,0x15,0x86,0x50,0xE6,0xFA,0x40,0x78,0x73,0x73,0x1D,0x63,0xE2,0x8D,0xEA,0x4B,0x5C, -0x51,0x70,0xD7,0x22,0xFC,0xFD,0x4F,0xDC,0xA9,0x1C,0xFB,0x94,0x56,0x53,0xF0,0xD9,0xC7,0x6C,0x1F,0xC7, -0x73,0x2A,0xB8,0x2A,0x59,0x4F,0xD7,0x28,0xB4,0xCA,0x0B,0xA5,0x25,0x07,0x39,0x5E,0x7B,0x92,0x2A,0x43, -0xAE,0x19,0x5D,0x01,0x03,0x73,0xC3,0x4B,0xF3,0xFF,0x11,0x56,0x95,0x04,0x4F,0xC9,0x1A,0x9A,0x56,0xB8, -0x46,0x56,0x1C,0x62,0x8E,0x4B,0x49,0xC3,0xB5,0x92,0xB2,0xFF,0x87,0xDF,0xCA,0x43,0x88,0xAA,0x74,0xEB, -0x3E,0x12,0x90,0x3B,0x1D,0x72,0x85,0xD7,0xA4,0xC0,0xFC,0x34,0x0E,0xC3,0x61,0x9C,0x1C,0x3C,0xB1,0xEE, -0x96,0xEB,0xF9,0xA0,0x60,0xB3,0xDA,0x62,0xF9,0x6B,0x89,0xBE,0xC1,0x13,0x7E,0xF0,0x14,0xE0,0x69,0xB2, -0xD5,0x1E,0x2B,0xF0,0xB0,0x0D,0xCA,0x83,0xD5,0x9F,0x5B,0xBE,0xC5,0xCA,0xD9,0x55,0x2B,0x86,0xBB,0xF0, -0x0B,0x25,0x79,0x42,0x49,0x16,0x59,0x1B,0xBA,0xAA,0x75,0xD1,0x5E,0x7A,0x41,0x4B,0x4F,0xEE,0xAB,0x35, -0x1E,0x27,0x1E,0x53,0x4B,0xC8,0x20,0x16,0x5F,0xB9,0x94,0x75,0x01,0x25,0xF5,0x88,0x1D,0x4F,0x26,0x0C, -0xF3,0x0F,0x22,0x98,0x59,0x61,0x39,0x3F,0x95,0xC1,0xAC,0x07,0x53,0x1A,0xC5,0x19,0xC3,0x71,0xC6,0x9B, -0x65,0x4F,0x29,0xCC,0x5E,0xF0,0xC7,0x1F,0xE5,0x64,0x3F,0x68,0xA5,0xD5,0xF4,0x6A,0x8F,0xD5,0x26,0xFB, -0xAC,0x15,0x42,0x28,0xF8,0x8F,0x2D,0x85,0xD4,0x2D,0x25,0x16,0xB1,0xD4,0x8A,0x95,0xA5,0xB0,0xCA,0xD6, -0x99,0xA8,0x4B,0x51,0xCD,0xDB,0x85,0x41,0xEB,0x66,0xD1,0x76,0xD5,0xBD,0x1C,0x59,0x6C,0x35,0x08,0xAC, -0x2F,0x0E,0x7C,0x43,0x50,0x05,0xAD,0xBF,0x89,0xE7,0x38,0x3D,0x42,0x0C,0x1B,0x90,0x33,0xCB,0x88,0x25, -0xA1,0xA6,0x1B,0xAC,0xD9,0x05,0x4A,0xA0,0x0A,0x9C,0x17,0x1E,0x31,0x15,0xD5,0x37,0xC8,0x97,0x35,0x4E, -0xC0,0xB6,0x78,0x30,0x00,0xA9,0x8F,0x55,0xB3,0x01,0x75,0x1A,0xB6,0x19,0x5C,0xF3,0x45,0x1A,0x27,0x68, -0x2A,0x9B,0x6B,0x58,0x13,0xEE,0x51,0x50,0xAB,0xA5,0xD6,0xB2,0x1E,0x95,0x69,0xFD,0x71,0x56,0xC7,0x32, -0x73,0x43,0x85,0xB0,0x9A,0xBC,0xB9,0xC9,0xE6,0x84,0xFB,0x33,0xE1,0xDB,0x3E,0x30,0xAC,0x73,0xE8,0x0C, -0x5C,0x39,0x9A,0xF1,0xA8,0x1A,0x85,0xF9,0xF0,0x13,0xCB,0x07,0x3E,0x2B,0x46,0xF7,0x35,0x60,0x4C,0x0B, -0x70,0x4C,0x27,0xF9,0x90,0x50,0x52,0xD0,0x29,0x80,0xC5,0x67,0x92,0xE4,0xA3,0x64,0x56,0x8C,0x66,0xF8, -0xBE,0xC4,0x8B,0x0B,0x68,0x80,0x75,0x57,0x5D,0xDF,0x86,0xB3,0xCC,0x07,0xDD,0x4A,0xFC,0xE0,0xBF,0x13, -0x3F,0xA1,0xD3,0x42,0x98,0xA4,0x18,0x4D,0x49,0x21,0xCA,0x38,0x4A,0xBE,0xC8,0x08,0xFB,0xB7,0x7D,0xC1, -0xF1,0xC9,0x9B,0x93,0xE1,0x49,0xBD,0x44,0xAC,0xBF,0x22,0xF0,0xBF,0x6A,0xD3,0xB9,0xE9,0x1A,0x49,0xDD, -0x53,0x60,0xE6,0x8B,0xCF,0xB3,0x38,0x90,0x45,0x1F,0x04,0x7C,0x23,0x01,0xEA,0xBA,0x69,0x36,0x1E,0x1A, -0xD2,0xC6,0x03,0x46,0x15,0xE8,0xF3,0x97,0x01,0xD0,0xD3,0xE6,0x66,0x8D,0x11,0xB9,0x5E,0x3D,0x7E,0x50, -0x4B,0x57,0x75,0x9A,0x74,0x36,0xF4,0x54,0x41,0x83,0xCC,0xB2,0x65,0x20,0x1E,0xCD,0x1D,0xDD,0x12,0xDD, -0x03,0xD9,0xF7,0xA1,0x6D,0x68,0x99,0xAA,0xE1,0xF7,0x3C,0x8F,0x5E,0xFB,0x37,0xB2,0x69,0xDC,0xDC,0x44, -0xCD,0xA2,0xC7,0x70,0x2C,0x09,0x14,0x07,0xCA,0x91,0x6C,0x57,0x41,0x16,0x60,0xCB,0xB1,0x5E,0x0D,0xCE, -0xCF,0xEC,0x04,0xA5,0xE0,0x71,0xD4,0xAC,0x07,0x89,0x50,0x09,0xD8,0xD4,0xF6,0x8B,0x93,0x5A,0x35,0x2E, -0xBF,0x17,0x72,0xF9,0xD2,0x4A,0x0D,0x41,0x4E,0xF5,0xB9,0x22,0x87,0xE7,0x0F,0x78,0x90,0x7A,0x92,0x22, -0x0D,0x55,0x51,0x24,0xA9,0x07,0x71,0x7E,0x97,0xAD,0xEF,0x41,0x2D,0x3E,0x23,0xAC,0xDE,0x85,0x34,0x5C, -0xFE,0x6F,0xDE,0xD8,0xB2,0x18,0x29,0x72,0xAB,0x05,0xB5,0xFA,0xF6,0x4F,0x5D,0x8E,0x6C,0x98,0x16,0x55, -0x84,0xAC,0xCC,0x51,0x87,0xCC,0x42,0xA8,0x6E,0xD1,0x7F,0xEA,0x21,0xB4,0xF0,0x10,0xFA,0x38,0x40,0xE0, -0xFB,0x86,0xB7,0x97,0xA7,0xF4,0xC6,0xC0,0xD9,0x6D,0xAF,0x8C,0x22,0x00,0x91,0x31,0xA4,0x01,0xF8,0xC4, -0xE4,0xFA,0x27,0x74,0x87,0xD4,0xFB,0x5D,0x05,0x5D,0x1F,0x2A,0xE4,0x76,0xFF,0x37,0x18,0x95,0x3B,0x9B, -0x81,0x88,0xC1,0xF0,0x71,0x3C,0xE1,0x8D,0xF0,0x54,0xC5,0xAC,0x7A,0x74,0x02,0x77,0xCD,0xBD,0x59,0xE3, -0x35,0xFD,0xD6,0x5C,0x0F,0x0C,0xF2,0x49,0xDF,0xAB,0x05,0x22,0x85,0x51,0xB7,0x9E,0xF5,0xED,0x4A,0xB3, -0xA1,0x59,0x9F,0xFE,0xA5,0xFF,0xE1,0x03,0x66,0xB3,0xA2,0x75,0x07,0x37,0xAF,0xCD,0x74,0x5D,0x64,0x2B, -0x3F,0xC4,0x28,0x1D,0x88,0x2E,0x51,0x65,0x88,0xA5,0xBA,0x40,0x4F,0xBA,0xAE,0x01,0x1A,0xEB,0xC8,0x87, -0x62,0x5B,0xE8,0x01,0x10,0x4A,0x28,0x05,0x28,0xF5,0x62,0xA0,0x59,0x5B,0x44,0xB0,0x88,0xA0,0xE1,0x89, -0x69,0x7C,0x8B,0x48,0x7D,0x3B,0x01,0x08,0xC9,0xBF,0x4F,0x86,0xBE,0xCE,0xCA,0x2F,0x42,0x12,0xAA,0x20, -0xEA,0xFA,0xCD,0xFC,0x2D,0xAC,0x7A,0x86,0xC0,0x85,0xDF,0xE4,0x06,0xB2,0x21,0xD1,0x98,0x28,0x08,0x06, -0x98,0x31,0xC9,0xB8,0x10,0xEC,0x6D,0x1C,0x80,0x5C,0x80,0xD6,0x89,0x60,0x24,0x0E,0x02,0x11,0x05,0x60, -0x38,0xC3,0x51,0x0E,0xE1,0x30,0x14,0x20,0x24,0x40,0x5F,0x4B,0x5D,0x0D,0x64,0xE1,0x45,0xE8,0xD4,0xEB, -0x76,0x1C,0xEB,0x31,0xD9,0x11,0xC3,0x83,0x78,0xC2,0x87,0x68,0xCC,0x8C,0x0D,0xC7,0x5C,0xB3,0x03,0x40, -0x03,0x08,0x27,0xC6,0x96,0xB9,0x1E,0xFD,0x43,0x9C,0xDE,0xE2,0xD4,0xD8,0xE8,0xE6,0xFC,0x9C,0x42,0xC1, -0x14,0xC2,0x7F,0xDE,0x07,0xB5,0xDF,0xE1,0x37,0x84,0xE2,0x9C,0x32,0x03,0xE4,0x59,0x3C,0xBF,0x48,0x09, -0xE5,0x6F,0x65,0x5F,0x98,0x63,0xF9,0xEA,0xB9,0x42,0x86,0xA0,0xE2,0x1D,0x63,0x21,0xA2,0x99,0xDB,0x78, -0xCD,0xB0,0xC6,0x70,0x5F,0x10,0x5C,0xDD,0xC5,0x9C,0x50,0x57,0x3F,0xE2,0x69,0xD8,0x1E,0xE8,0x56,0x84, -0x7C,0x98,0xA8,0x3D,0x30,0x5F,0x5A,0xC2,0x6B,0xDD,0x7A,0x34,0xD9,0xA8,0x26,0x55,0x01,0xBD,0xF6,0xA9, -0xA7,0x7A,0xB9,0x10,0xC0,0xC3,0x30,0x1E,0x1B,0xE2,0x75,0x7A,0x21,0x3C,0xDE,0xA5,0x4B,0x53,0xA4,0xA7, -0x2F,0xBF,0xCA,0xF8,0x10,0x76,0xB9,0x85,0x6B,0x8F,0x4A,0x2D,0x5D,0x17,0x6F,0x35,0x80,0x87,0x82,0x73, -0x1A,0x3E,0xB8,0x90,0x16,0xFF,0x42,0xEA,0x8C,0x06,0xF1,0x97,0xA4,0xFE,0xB8,0x22,0xF5,0xC7,0x75,0x52, -0xE3,0xE6,0x6D,0xC1,0x64,0x04,0x64,0xDF,0x22,0x8A,0xA6,0x38,0x85,0x05,0x71,0x08,0x5C,0xC0,0x3F,0xE3, -0x2C,0xC5,0x5F,0xE6,0x6C,0x30,0x23,0x13,0xBE,0xCA,0x9F,0x5A,0xFD,0x77,0x5C,0xA6,0xF8,0x09,0x2E,0x8B, -0x02,0xB3,0xCC,0x1B,0x7F,0xFD,0x54,0x22,0x9D,0xDA,0x83,0x2B,0xAC,0xBB,0xEB,0xBF,0xF0,0xBB,0xEA,0xC4, -0x2F,0xA7,0x4F,0xF1,0xE1,0xE2,0xA5,0x15,0x08,0x9B,0x68,0x96,0xA5,0x31,0x3D,0x84,0x0A,0xFE,0x0D,0x88, -0x60,0x28,0x73,0xC4,0xDE,0x62,0x69,0x71,0xCF,0x00,0x55,0x42,0x17,0x0C,0xC2,0xF9,0xB2,0xAE,0xB5,0x67, -0x90,0x22,0x41,0x09,0xC0,0x24,0x24,0xDA,0xCE,0xF5,0xC1,0xE6,0x4D,0x0B,0x32,0x94,0x07,0x1F,0xA6,0x07, -0x83,0xCD,0x9B,0xEF,0xCC,0xCE,0x94,0xD4,0x6A,0x22,0x99,0xEB,0x40,0xAF,0xD7,0xF4,0xC6,0x43,0x4B,0x08, -0x61,0xF5,0x5C,0x58,0x46,0x56,0x0B,0xCB,0x57,0x2F,0xF8,0x08,0x11,0x9D,0xC2,0x87,0x8C,0x1D,0x10,0x9E, -0xD6,0x7C,0xBF,0xA2,0x67,0x6A,0x04,0x58,0xB5,0x87,0x2A,0x9D,0xC3,0x4F,0x5D,0xB4,0x57,0xBC,0x16,0x0C, -0x15,0x59,0x88,0x7B,0x6A,0x50,0x8F,0xB1,0x22,0x49,0x17,0x97,0x96,0x83,0xCD,0xA5,0x30,0x75,0x3C,0x21, -0x14,0x07,0x7A,0x99,0x57,0x7F,0x7E,0xFB,0xE6,0x94,0xF3,0xE4,0x52,0x69,0x16,0x68,0x35,0x17,0xAA,0x0B, -0x37,0x17,0x3C,0x7D,0x28,0x2A,0x34,0xE1,0xB0,0x2A,0xE4,0xFC,0x7C,0x3E,0xFE,0x84,0x7D,0xC8,0x47,0x6F, -0x19,0x24,0xB3,0x2D,0x5B,0xA0,0x0F,0x87,0x17,0xF6,0xAE,0xED,0x40,0xC9,0xE0,0x23,0x48,0xD9,0xE2,0xE6, -0x96,0xFF,0x08,0x79,0xFB,0x9F,0x21,0x13,0x88,0xBB,0x0C,0x02,0x6B,0x81,0xDF,0xC4,0x9D,0xA5,0xF1,0x5C, -0xA2,0x9D,0xA4,0xA9,0xB8,0x94,0xE1,0x8C,0x30,0x6D,0x0C,0x8B,0x0C,0xA7,0x5A,0x10,0x63,0xA6,0xD1,0x98, -0x6B,0x2C,0x4B,0x92,0x38,0xE5,0x2B,0xFA,0xB0,0xF5,0xE2,0xC1,0xE6,0x5D,0x86,0x33,0x1C,0xE4,0xCB,0x38, -0xAD,0xEB,0x45,0x16,0x57,0xB0,0x0E,0x66,0x7F,0x7D,0x93,0x97,0x5A,0x19,0xA5,0x22,0x0F,0x6C,0x74,0xD5, -0x1C,0xA4,0x9B,0x01,0x55,0x8F,0x66,0x61,0xB8,0xEC,0xAD,0xD0,0x82,0x8E,0x2B,0xE6,0xB1,0xFC,0x8A,0x62, -0xF1,0x5B,0x6E,0xE2,0xEE,0xCA,0x8B,0x6A,0x93,0xAA,0x63,0x6D,0x18,0x1B,0x58,0x23,0x94,0x71,0x44,0x7D, -0x71,0x8D,0x4A,0x17,0x66,0x51,0x66,0x89,0xED,0x3D,0xE1,0x9F,0xD2,0x96,0x9E,0xCC,0xED,0x52,0x32,0xEA, -0xE9,0xBA,0xA8,0xB8,0xB0,0x28,0x5C,0x51,0xC4,0x6A,0x64,0xCB,0x88,0x6D,0x52,0xAF,0x00,0xF7,0xE4,0x3B, -0x78,0x73,0xFF,0x2A,0x1B,0x45,0x99,0x8D,0x00,0xA6,0x15,0xFB,0x4C,0xDA,0xF2,0x74,0x99,0xA9,0x0F,0xA4, -0xEB,0x4A,0x03,0x8E,0x30,0x9F,0xC5,0xC1,0x81,0x7E,0xA0,0xBB,0x3A,0xFC,0xDB,0xD4,0x2D,0xD8,0x85,0xA9, -0x0F,0xEE,0x3F,0xBA,0x7C,0x09,0x21,0x2D,0x89,0x29,0xA6,0xDC,0x40,0x10,0xD9,0x3D,0xBD,0xB5,0x06,0x52, -0x90,0xBF,0x46,0x37,0x66,0xAF,0xA9,0x6C,0x3C,0x5F,0xB9,0xCE,0xC6,0x65,0xD8,0x31,0x15,0x51,0xEE,0x01, -0x98,0xE7,0xF8,0xD1,0x3B,0xB6,0x45,0x1F,0xB7,0x23,0xE6,0x62,0x47,0xF0,0x2C,0xB1,0x06,0x80,0x25,0x5C, -0xAF,0x52,0xF2,0x53,0x25,0x16,0xB5,0x7D,0x14,0x86,0xE2,0xEB,0x77,0xE0,0x55,0x1C,0x96,0x31,0x4B,0x10, -0x61,0x20,0x00,0xC3,0x43,0x7C,0x0F,0x2E,0x2D,0xEB,0x24,0x65,0x43,0x79,0x5F,0x02,0xA4,0x79,0xCD,0x8C, -0x4C,0xAB,0x9C,0x6D,0x6E,0x72,0xBB,0x30,0x13,0xA3,0x40,0x62,0x22,0xE8,0x1B,0xA6,0xE8,0x39,0x8C,0xBA, -0x90,0x22,0x87,0x3E,0xD2,0xB6,0xD1,0x54,0x43,0x82,0xA9,0x51,0xC0,0x80,0xB3,0x2C,0x0D,0x21,0x52,0x8B, -0x2A,0xA2,0xB1,0x8D,0x61,0x1A,0xC0,0x01,0xEE,0x5F,0x22,0x4B,0x54,0x5A,0xB7,0x8A,0x01,0x4F,0x15,0xDF, -0x4D,0x7A,0x3C,0xBF,0x95,0x53,0x2C,0x23,0x5F,0xF3,0x77,0x0F,0x2D,0x1D,0x25,0x49,0x48,0x54,0x60,0xEE, -0xC0,0xC3,0xF7,0x7C,0xDE,0x06,0xB3,0x8A,0xDA,0x70,0x82,0xB2,0x82,0x40,0x5F,0xC3,0xA1,0x6A,0xBB,0x2C, -0xF1,0x60,0xE1,0xAE,0xB8,0x68,0xA5,0x3F,0x63,0xC5,0x47,0x9B,0x74,0x9A,0x7C,0xD6,0x6E,0x7B,0x6F,0x67, -0x05,0x84,0xC6,0xE2,0x7B,0x76,0xC8,0x35,0x90,0x8E,0xCA,0xD3,0x8A,0x0E,0xA8,0x1E,0x17,0xEC,0x24,0x63, -0x33,0x63,0x01,0xAC,0xBB,0xDC,0x52,0xBA,0x72,0xB1,0xA5,0xEC,0xD6,0xA5,0x56,0x61,0x1F,0x2E,0xA4,0x90, -0x46,0xFC,0xF8,0xE3,0x0F,0x39,0xAB,0x6E,0x1B,0x66,0x2B,0x17,0xBE,0x54,0x6F,0xAC,0x45,0x66,0x14,0x46, -0xBF,0x1A,0xAB,0xF6,0x3A,0xAA,0xB1,0x29,0x7E,0x41,0x41,0x23,0x81,0x27,0x92,0xAC,0x9E,0x7F,0x05,0x01, -0xC3,0x09,0xC4,0x25,0x1B,0x3A,0xA1,0xF2,0xB7,0x3B,0xF5,0xFC,0xD7,0x3B,0x57,0x71,0xF7,0xCB,0xD6,0xCC, -0xF3,0xCA,0xBA,0x5A,0x45,0x1D,0xB5,0xC1,0x7B,0xE2,0xD7,0x16,0x74,0x05,0x86,0xCE,0x55,0x0D,0xEC,0xF2, -0x6C,0x71,0xAE,0x95,0x2F,0x22,0xF6,0x40,0x7D,0x11,0x35,0x4B,0x2A,0x33,0x50,0x7F,0xA3,0x9B,0x55,0x3B, -0xCD,0x65,0xC5,0x99,0x78,0x9E,0xD3,0xE2,0xFC,0x2D,0xBB,0x9E,0xEB,0x81,0x7D,0x68,0x96,0x85,0xB8,0x85, -0x8B,0x6A,0xB2,0x5B,0x2E,0xA7,0x20,0x1E,0x6C,0xA8,0x76,0x65,0xC9,0x7A,0x80,0x4A,0xBF,0xAB,0x8B,0x2A, -0xBB,0xAF,0x2E,0x17,0x1D,0x57,0xF9,0xB5,0x4D,0xED,0x37,0x4E,0x2A,0x1A,0x44,0x3E,0xC8,0xCB,0xFD,0xCD, -0x37,0xFA,0x27,0xD1,0x14,0xC6,0xFE,0x9F,0xFB,0x0C,0xD2,0xB3,0xD2,0x2B,0x00,0x00 +0x1F,0x8B,0x08,0x08,0xC6,0xC7,0xA5,0x5E,0x02,0x00,0x65,0x64,0x69,0x74,0x2E,0x68,0x74,0x6D,0x00,0xB5, +0x1A,0x0B,0x5B,0xDB,0x36,0xF0,0xAF,0x18,0x6F,0x63,0xF6,0xE2,0x38,0x0E,0xA5,0xAC,0x73,0x30,0x2C,0x50, +0x56,0xFA,0x02,0x4A,0x42,0x3B,0xCA,0xD8,0x3E,0xC5,0x56,0x62,0x15,0x5B,0xF2,0x6C,0x99,0x40,0xB3,0xFC, +0xF7,0x9D,0x24,0x3F,0x43,0xE8,0x1E,0xDF,0xB6,0xAE,0x8D,0xA4,0xD3,0x9D,0xEE,0xA1,0x7B,0x29,0xD9,0xDD, +0x78,0x7E,0x7A,0x38,0xBE,0x3C,0x3B,0xD2,0x42,0x1E,0x47,0x7B,0xBB,0xE2,0x5F,0x2D,0x42,0x74,0xE6,0xE9, +0x98,0xEA,0x7B,0xBB,0x31,0xE6,0x08,0x40,0x3C,0xE9,0xE2,0xDF,0x73,0x72,0xEB,0xE9,0x87,0x8C,0x72,0x4C, +0x79,0x97,0xDF,0x27,0x58,0xD7,0x7C,0x35,0xF3,0x74,0x8E,0xEF,0x78,0x4F,0x20,0x0F,0x34,0x3F,0x44,0x69, +0x86,0xB9,0x97,0xF3,0x69,0xF7,0x19,0x90,0xE0,0x84,0x47,0x78,0xEF,0x68,0x74,0xA6,0x1D,0x05,0x84,0xB3, +0x74,0xB7,0xA7,0x56,0x76,0x23,0x42,0x6F,0xB4,0x14,0x47,0x9E,0x8E,0x92,0x24,0xC2,0x5D,0xCE,0x72,0x3F, +0xEC,0x12,0xA0,0xA9,0x6B,0x61,0x8A,0xA7,0x9E,0xDE,0x43,0x3E,0xB6,0x61,0x41,0xD7,0xC4,0x71,0x9E,0x4E, +0x62,0x34,0xC3,0xBD,0x3B,0xB5,0xA7,0x49,0x20,0x0B,0x59,0xCA,0xFD,0x9C,0x6B,0xFF,0x0A,0xFB,0x1F,0x20, +0x65,0xFC,0x3E,0xC2,0x0A,0xA4,0x64,0xF6,0xB3,0x4C,0xD7,0x62,0x1C,0x10,0x04,0x5C,0xF8,0x29,0x16,0x5A, +0x8B,0xD0,0x04,0x47,0x8B,0x29,0x03,0x35,0x65,0xE4,0x33,0x76,0xFB,0x5B,0xC9,0xDD,0x40,0x4E,0xA7,0x28, +0x26,0xD1,0xBD,0x9B,0x21,0x9A,0x75,0x33,0x9C,0x92,0xE9,0xD2,0xF6,0xE3,0xC5,0xE7,0x2E,0xA1,0x01,0xBE, +0x73,0x9F,0x38,0xCE,0x20,0x61,0x19,0xE1,0x84,0x51,0x17,0x4D,0x32,0x16,0xE5,0x1C,0x0F,0x22,0x3C,0xE5, +0xEE,0x53,0xA0,0x30,0x61,0x69,0x80,0x53,0xB7,0x9F,0xDC,0x69,0x00,0x22,0x81,0xF6,0xD5,0xF6,0xF6,0xF6, +0x60,0x82,0xFC,0x9B,0x59,0xCA,0x72,0x1A,0x74,0x7D,0x16,0xB1,0xD4,0xFD,0x6A,0xFA,0x54,0xFC,0x19,0x04, +0x24,0x4B,0x22,0x74,0xEF,0x52,0x46,0x31,0xE0,0xDE,0x75,0xB3,0x10,0x05,0x6C,0xEE,0x3A,0x9A,0xA3,0xF5, +0x1D,0x20,0x92,0xCE,0x26,0xC8,0x70,0x2C,0xF1,0xC7,0xDE,0x36,0x07,0x7F,0x8B,0x5F,0xB5,0x3C,0xC7,0x64, +0x16,0x72,0xF7,0x7B,0xC7,0x11,0xFC,0x6B,0x79,0xB4,0x88,0x48,0xC6,0xBB,0x52,0x39,0xEA,0x3C,0xCE,0x12, +0xD7,0x91,0xAC,0xC3,0x47,0x8C,0xD2,0x19,0xA1,0x30,0x48,0x50,0x10,0x10,0x3A,0x73,0x15,0x5A,0x44,0x16, +0x95,0xB4,0x60,0x07,0xC4,0xC9,0x2D,0x1E,0xC4,0x84,0x76,0xE7,0x24,0xE0,0xA1,0xBB,0xE3,0x00,0x17,0x7E, +0x9E,0x66,0x20,0x53,0xC2,0x08,0xE5,0x38,0x95,0x68,0x59,0x82,0xE8,0x42,0x89,0x2A,0x14,0x50,0xC9,0x49, +0x28,0x58,0x14,0x77,0x27,0x11,0xF3,0x6F,0xAA,0x93,0x76,0x92,0xBB,0xE2,0x2C,0x37,0x64,0xB7,0x38,0x5D, +0xD4,0xEA,0x92,0xD8,0x2D,0x60,0x8B,0x34,0xC6,0x78,0x69,0xF3,0xDB,0x1C,0xA0,0x96,0xFC,0x04,0x29,0x0B, +0xAA,0x4D,0x91,0xDA,0x82,0x17,0x28,0x84,0x26,0x39,0x5F,0x3C,0x34,0x25,0x4B,0x90,0x4F,0xF8,0xBD,0xEB, +0xC8,0x6D,0xF2,0x86,0xB8,0xDB,0x8E,0xA3,0x09,0x85,0x6B,0xEF,0x71,0x1A,0x20,0x8A,0xAC,0x61,0x4A,0x50, +0x64,0x8D,0x6A,0x95,0x77,0x63,0xF6,0xB9,0x9B,0xC3,0x18,0xE6,0x11,0xF6,0xB9,0xD2,0x30,0x18,0x61,0x72, +0x43,0xF8,0x43,0xC0,0x83,0x85,0x86,0xAE,0xA4,0x86,0x42,0x65,0xBD,0x3E,0xE8,0x46,0xF2,0xA1,0xC4,0x56, +0x12,0x75,0x27,0x8C,0x73,0x16,0xCB,0xFB,0x56,0x49,0xAB,0xC9,0x2B,0xF3,0xEC,0x81,0x39,0xD6,0xAB,0xBE, +0x41,0x7E,0x00,0x4A,0xE5,0xC4,0x47,0x51,0x17,0x45,0x64,0x46,0xDD,0x98,0x04,0x41,0x84,0x07,0x0D,0x1B, +0xE4,0x69,0x64,0x04,0x88,0x23,0x57,0xF9,0x59,0x42,0x67,0x00,0xCD,0xF0,0xCE,0xB6,0x45,0xDE,0x1F,0x9C, +0x9E,0xCF,0x9D,0xD7,0x2F,0x66,0x6C,0x08,0xFF,0x9D,0x8C,0x2E,0xC2,0xA3,0x8B,0x19,0x8C,0x0E,0xC4,0x74, +0xF8,0xEE,0x70,0xF8,0x0E,0x3E,0x0E,0xFB,0x9D,0x4F,0xD3,0xDF,0x87,0x62,0xF9,0x45,0x70,0x30,0xBE,0x38, +0x1A,0x0E,0x5F,0xF7,0x5E,0x9E,0xCC,0x3F,0xBC,0xDE,0x11,0xE0,0x83,0xC8,0x39,0x7F,0x1F,0x3A,0x17,0x5B, +0x3F,0xC4,0xC1,0x71,0x10,0xFA,0xF1,0xC5,0xF0,0xDD,0x87,0xF3,0xDB,0xCB,0xF8,0x62,0x36,0xFA,0xD0,0x0F, +0x3F,0x6E,0xBD,0x1F,0x7D,0xFC,0xF0,0xD3,0x0D,0xFE,0xF9,0xF8,0xD5,0xC7,0xF1,0x1C,0x10,0x9E,0xB3,0xD1, +0xC5,0xF9,0xC1,0xFB,0x83,0xD9,0xC7,0x03,0xFF,0xE8,0x6E,0x12,0x9D,0x1C,0xBC,0x18,0x4E,0x86,0x5B,0x3E, +0xC6,0xB3,0xF1,0xF9,0x41,0xFE,0xF2,0xF5,0xE9,0x8C,0x90,0x70,0xF4,0xF1,0x64,0xEC,0x1F,0x3E,0x7D,0x73, +0x71,0x3C,0x24,0xE1,0xC9,0xAB,0x73,0xE7,0xE6,0xC5,0xEB,0xC3,0xE7,0xFE,0xE5,0xAB,0xCB,0x9D,0xE7,0x4F, +0x7A,0xDF,0x7F,0xFF,0x36,0x38,0x25,0x74,0x7C,0xFB,0x79,0x38,0x3B,0x9C,0x3F,0xBB,0xCF,0xC6,0xE1,0xCB, +0x5B,0xDA,0x7B,0xCF,0x3E,0xBD,0xBC,0x7F,0x0B,0x7F,0xCF,0xCE,0x3A,0x93,0x51,0x3F,0xBB,0x78,0xF7,0xF2, +0xFD,0x56,0xF6,0xC3,0xD3,0xE4,0xE0,0xF9,0xF3,0xDB,0x78,0x72,0xD6,0x8B,0x83,0x9B,0x29,0x7F,0xF6,0x84, +0x27,0x97,0xB3,0xFC,0xE3,0xEF,0x4F,0x5F,0x85,0xBD,0x53,0x8C,0x2E,0xC3,0xCE,0xFD,0xE7,0xFB,0x67,0xE1, +0xF8,0xF8,0xF6,0x24,0x42,0x77,0x27,0x27,0xFE,0xE7,0xB8,0x13,0xA1,0x1F,0x4E,0xC7,0x11,0x4A,0xFB,0x17, +0xC1,0xB0,0xD7,0x39,0xDC,0x1A,0x6E,0xF3,0xF4,0xFC,0x90,0x3E,0x7F,0xF2,0x69,0xF4,0xEC,0xE0,0xA0,0xCF, +0x26,0xBF,0x6F,0xBD,0xB8,0xD9,0x79,0x71,0xB1,0xF3,0x6E,0xF2,0x6E,0x38,0xDA,0x3E,0xB8,0x40,0x97,0xA3, +0x77,0xC3,0xE9,0xF6,0x24,0x0C,0x5F,0xBF,0x1E,0xFF,0x14,0x0C,0x3F,0xA7,0xC3,0xD3,0xF9,0xF0,0xEE,0xE8, +0x62,0x78,0xDC,0x79,0x7D,0xF4,0xD6,0xE9,0x8F,0x2E,0x9F,0xCC,0xDE,0xEE,0xCC,0x0F,0xB2,0xA3,0xE1,0xBB, +0x03,0x67,0xF6,0xAA,0x13,0xA3,0x8F,0xEC,0xF0,0xC9,0xEC,0xE5,0x0E,0x39,0xBB,0x44,0xC3,0x97,0x07,0xAF, +0x32,0x72,0x1E,0x1F,0x5F,0x38,0xC3,0xE1,0x9B,0x53,0xFC,0xD3,0xE1,0x13,0xF4,0x7A,0xCB,0xFF,0x00,0xFA, +0xBF,0xF8,0x19,0x7F,0xDF,0x19,0xCE,0x4F,0x9D,0xC8,0xFF,0x01,0x8F,0x8F,0x2F,0xC7,0xD2,0x3A,0x47,0xD1, +0x4F,0xE3,0x9B,0x51,0xFE,0x2E,0x3E,0x3C,0x34,0x35,0xCA,0xBA,0x29,0x4E,0x30,0xE2,0xCD,0x58,0x55,0x39, +0x07,0xDC,0xAD,0xFA,0x16,0x16,0x4E,0x2A,0x22,0x6B,0x37,0xC0,0x3E,0x4B,0x91,0xDC,0x03,0x08,0x38,0x15, +0x57,0x6C,0xF9,0xA3,0x0C,0xB5,0x9A,0x8A,0xB4,0x1A,0xA2,0x81,0x66,0x94,0x8E,0x10,0x13,0x0A,0x38,0xB7, +0xC4,0xC7,0xDD,0x84,0xDC,0xE1,0xA8,0x2B,0x91,0x5D,0xC7,0x5C,0x48,0x67,0x2B,0xB7,0x21,0x4A,0x62,0x45, +0xB5,0x5C,0x08,0x3E,0x21,0x5F,0xA4,0x34,0x70,0x99,0x18,0x3E,0x0B,0xDF,0x61,0x69,0x77,0x92,0xCF,0xA6, +0xE4,0x0E,0xBC,0x79,0x4A,0x28,0xE1,0x58,0xEB,0x67,0xCB,0x1F,0x4B,0x32,0x37,0xF8,0x7E,0x9A,0xA2,0x18, +0x67,0xDA,0xDF,0x24,0xB3,0x98,0xA6,0x2C,0x5E,0xD4,0x11,0x90,0xB3,0xC6,0x64,0xB9,0xFC,0x2A,0x4F,0x22, +0x86,0x40,0xCC,0x35,0x61,0x43,0x05,0xD3,0x54,0xB8,0x55,0x15,0x54,0x4B,0x37,0xDB,0x02,0xB7,0x6C,0xB9, +0xF5,0xD6,0x76,0xED,0xBA,0x5D,0xB9,0x57,0x04,0xFB,0xA6,0xEA,0x1B,0xF1,0xA0,0x11,0xEB,0xBE,0xE2,0xA0, +0xD2,0xF5,0x87,0xAB,0x43,0x54,0x64,0xA8,0x19,0x50,0x51,0xBA,0xBF,0xE3,0x34,0x42,0x05,0xEC,0x5B,0x7E, +0x85,0x65,0x9A,0xB7,0xBE,0x4A,0x52,0xB0,0x06,0x9E,0x7F,0x81,0x66,0x25,0x53,0x9B,0x36,0xD0,0xAC,0xD2, +0x9D,0x12,0xA1,0xCE,0x79,0x92,0xD7,0x8A,0xF4,0x43,0xA9,0x00,0x5C,0x71,0xF3,0x54,0x70,0xF3,0x45,0xAD, +0x3E,0xD9,0xF9,0xA6,0xE0,0x61,0xDB,0xF9,0x66,0x69,0xAB,0xBD,0x55,0x3E,0xEE,0x3B,0xF0,0x5F,0x99,0x76, +0x9F,0xD5,0x2C,0x4C,0x9E,0x8A,0x3F,0x25,0x83,0x40,0xA7,0x09,0x7C,0xB2,0xFD,0xC3,0xB3,0x60,0x52,0x02, +0x95,0x60,0x8F,0xC3,0x53,0x14,0x90,0x3C,0x73,0x9F,0x3A,0xDF,0x28,0x7D,0x82,0xF9,0x40,0xF6,0xD2,0xB8, +0x6A,0x52,0xDF,0xD8,0x2C,0x21,0x54,0xDB,0xCA,0x34,0x61,0x6F,0x94,0x56,0x17,0xB3,0x99,0xEA,0xC1,0x45, +0xEA,0xAB,0x29,0xF6,0x2F,0x9C,0x6F,0x16,0x3C,0x45,0x34,0x9B,0xB2,0x34,0x76,0x53,0xC6,0x11,0xC7,0x86, +0x63,0x2E,0xFB,0xCE,0x3A,0xC0,0x93,0x1D,0x27,0xC0,0x33,0x73,0xB9,0xDC,0xED,0xC9,0xA4,0x06,0x15,0x8F, +0x9F,0x92,0x84,0xEF,0x4D,0x73,0xEA,0x0B,0x1E,0xB4,0x19,0x36,0xB0,0xB9,0x48,0x31,0xCF,0x53,0xAA,0x05, +0xCC,0xCF,0xC5,0x65,0xB7,0x67,0x98,0x1F,0xA9,0x7B,0x7F,0x70,0xFF,0x32,0x80,0x1D,0xCB,0x0A,0xC1,0x5F, +0x8B,0x00,0x0E,0x0C,0xE7,0x15,0x38,0xAD,0xFD,0x90,0x60,0x80,0xC8,0x6B,0x7C,0x6F,0x60,0x8B,0x57,0x88, +0xD8,0x16,0xEB,0x86,0x51,0x6E,0x03,0x20,0x35,0x17,0xB7,0xA0,0x05,0xE4,0xE1,0x2B,0x7E,0x6D,0x11,0x8F, +0xC2,0xC7,0xA0,0xD8,0x4E,0xF6,0xD0,0x7E,0xB7,0xEF,0xA2,0x3D,0xB2,0xDF,0x07,0xFF,0x32,0x1B,0xF4,0xD5, +0xC9,0x3F,0x91,0x08,0x5F,0x14,0x2E,0x27,0x0E,0xAA,0xA9,0xF5,0x0C,0x72,0x16,0x82,0x22,0xCD,0xEF,0x8C, +0xD3,0x91,0x66,0x5C,0x7D,0xDF,0xFD,0xE1,0xFA,0x8F,0xFE,0x95,0xD3,0xED,0x5F,0x9B,0xBF,0x99,0x3D,0x62, +0x73,0x9C,0x71,0x83,0xA2,0x5B,0x32,0x43,0x9C,0xA5,0xB6,0xC8,0xB7,0xC3,0x19,0x48,0x61,0x0E,0xAA,0x33, +0x88,0x62,0x6F,0xCB,0x71,0x36,0x3C,0xBC,0x8F,0x22,0x0C,0xAC,0xEB,0x47,0xE7,0xE7,0xA7,0xE7,0x57,0x7A, +0x07,0x77,0xF4,0x6B,0x57,0xD3,0x3B,0xD4,0x74,0xB9,0x0D,0x45,0x67,0x8A,0xB3,0xF0,0x0C,0xF1,0xD0,0x08, +0xEC,0x5B,0x14,0xE5,0xA0,0x0B,0xC1,0x08,0xF3,0x40,0x71,0xFA,0x24,0xE7,0x9C,0x51,0xDD,0x1C,0x30,0x9B, +0x50,0x8A,0xD3,0xE3,0xF1,0xDB,0x37,0x9E,0x7E,0xAE,0x90,0xB4,0x37,0x24,0xE3,0xBA,0x25,0x2D,0x62,0xA3, +0x24,0xC1,0x34,0x38,0x0C,0x49,0x14,0x18,0xCC,0x1C,0x08,0x12,0xBE,0x24,0x21,0x8B,0x11,0xA0,0xE0,0xDB, +0xAA,0x6C,0x9D,0x82,0xE4,0xBA,0xE5,0xDB,0x71,0x1E,0x71,0x92,0x44,0xD8,0xDB,0xE8,0xC3,0x8C,0xA2,0x18, +0x60,0x22,0x15,0x0B,0x18,0x09,0x3C,0x5D,0x05,0x24,0x15,0xC6,0xD6,0x9E,0xE2,0xAB,0x53,0x82,0xD6,0x29, +0x41,0x13,0x37,0x01,0xA9,0x74,0x2B,0xB0,0xEB,0x7A,0x19,0x66,0xC5,0x51,0x25,0x2C,0xC0,0x53,0x04,0x9C, +0xBC,0x17,0x92,0x43,0xF9,0xBD,0xEE,0xA0,0x40,0x1D,0x94,0xB5,0x35,0x92,0x35,0x35,0xA2,0x4C,0xB9,0x0E, +0x39,0x53,0xC8,0x69,0x1B,0x39,0x6D,0x22,0x1F,0xCA,0x1B,0xB1,0x0E,0x39,0x55,0xC8,0x51,0x4B,0xC4,0x48, +0x8A,0xA8,0xA2,0x5C,0x57,0x68,0x13,0x04,0x02,0xEC,0xA8,0x29,0x26,0xCC,0xC0,0x29,0xD1,0x24,0xC2,0x81, +0xB7,0xE1,0xC0,0x4C,0x14,0xD6,0xDE,0x96,0xB3,0xE6,0x8C,0x48,0x9D,0x91,0xB7,0xCE,0xC8,0xE5,0x19,0x24, +0x01,0x25,0x42,0xEE,0xD0,0xAD,0x5C,0x6A,0xAD,0xBD,0xA2,0x8E,0xF3,0x43,0xEC,0xDF,0x4C,0x98,0x5C,0x91, +0x63,0x71,0xE2,0x06,0x92,0x34,0x13,0x49,0x53,0xB6,0x23,0x40,0x33,0xB1,0xC1,0xD3,0x3D,0x41,0xD9,0x4A, +0x9A,0xE2,0x6B,0xC3,0x88,0xDB,0xBA,0x44,0x88,0xDB,0x5A,0x8A,0x5B,0xDB,0x46,0xE8,0x16,0x6B,0xEB,0xB4, +0x14,0x9B,0x6B,0x16,0x93,0x75,0x8B,0xB9,0x69,0xA5,0x36,0xA3,0x7E,0x44,0xFC,0x1B,0xAF,0x76,0x65,0x73, +0x61,0x34,0x27,0x82,0x13,0xEE,0x51,0x3C,0xD7,0x7E,0x82,0xD0,0xF4,0x1C,0x71,0x34,0xE0,0x05,0x19,0xA3, +0xB8,0x37,0x18,0x08,0x41,0x47,0x0A,0x9E,0x98,0xD9,0x28,0x80,0xE5,0xB3,0x8B,0xB1,0x6E,0xE9,0x3D,0x61, +0x15,0x1D,0xBC,0x99,0x98,0x4B,0xB3,0xF2,0x27,0x8B,0xCA,0xC8,0x7E,0x91,0x46,0xF5,0x12,0x0C,0xCA,0x1B, +0xB7,0xB4,0xE2,0xB5,0x3C,0x91,0xA9,0x51,0xA9,0xB4,0x64,0x4A,0x74,0x87,0xE2,0x0C,0xA3,0xB0,0xBF,0x6E, +0x42,0xE8,0x53,0x97,0xD7,0x30,0x2D,0xD4,0x66,0x1A,0x55,0x4C,0xA7,0x68,0x5E,0x5E,0x12,0x75,0xFE,0x40, +0xB9,0xB8,0x03,0x19,0x98,0x66,0x5C,0xC3,0xDE,0xB6,0xF3,0xC3,0xCE,0x00,0xEC,0x63,0x28,0xC7,0x05,0xC0, +0x2E,0xB7,0x23,0x4C,0x67,0x3C,0x1C,0xF8,0x1D,0xAF,0xD0,0x4A,0xE0,0x71,0x3B,0xCB,0x27,0x19,0x4F,0x21, +0xBF,0x19,0xBE,0xE5,0x77,0xB0,0xD9,0x3E,0x46,0xEF,0x30,0x2B,0x30,0x2D,0xD6,0xE9,0x2C,0x57,0x14,0x74, +0x3A,0x6A,0x68,0x08,0x09,0x0D,0xE1,0x28,0xC3,0x1A,0xB5,0xF1,0x1D,0xF6,0x0F,0x59,0x1C,0x23,0x41,0x22, +0x03,0x23,0x17,0x13,0xDD,0x5C,0x5A,0x6C,0xAD,0x66,0x1E,0x09,0x5B,0x56,0xF6,0x98,0x1E,0x21,0x0C,0x7A, +0xBE,0x2D,0x7C,0x25,0x2B,0x84,0xFA,0xB2,0x95,0xCB,0x40,0xA4,0x50,0xAE,0x9C,0x6B,0xAB,0x32,0xDC,0x5A, +0xA9,0x6A,0xBB,0xCB,0x5B,0xD7,0x8A,0x3F,0x66,0x6D,0x69,0x01,0x6B,0xC7,0xB5,0x1A,0xAA,0x2F,0x97,0x96, +0x2F,0xF8,0x0F,0x11,0x9D,0xE1,0xBF,0x2F,0x40,0xCD,0xA3,0x74,0x51,0x8B,0x42,0x02,0xD9,0x77,0x7F,0xB1, +0x8D,0xAB,0x5F,0xED,0xEB,0x8E,0x69,0xEE,0x7F,0xDD,0x93,0x1A,0x36,0xB8,0x79,0xD5,0xBF,0xB6,0x10,0x80, +0xED,0xEF,0xCC,0x5F,0x6C,0x09,0x6E,0xC1,0x06,0xB7,0x8C,0x04,0x9A,0x38,0x49,0x78,0x36,0x9B,0x6A,0x68, +0x73,0xD3,0xE0,0x1E,0x6A,0x5D,0xD6,0x0E,0xEF,0xE8,0x36,0xE4,0x8E,0xE5,0x72,0x35,0xA3,0x8D,0x53,0x8C, +0x55,0xCA,0xAC,0x00,0x92,0x7B,0x90,0x79,0x35,0x58,0x55,0x52,0x63,0xAB,0x86,0xC2,0xA2,0x4C,0xF9,0x76, +0x51,0x4D,0x78,0xBA,0x28,0x27,0x20,0xAC,0xAC,0x2E,0xCB,0x36,0x0F,0xD6,0x1B,0xC1,0xE1,0xDB,0x5D,0x12, +0xCF,0xB4,0x2C,0xF5,0x3D,0x65,0x8A,0x7D,0xF1,0x8F,0xF7,0xAD,0x48,0x75,0x9B,0xBF,0xF9,0x13,0x4F,0xEF, +0x80,0x7D,0xB1,0x4D,0xD9,0xDC,0x30,0x3B,0xDF,0xEA,0x9A,0xA4,0xE8,0xE9,0x31,0xBA,0x2B,0x9A,0x7D,0x51, +0x8D,0x0C,0x34,0x98,0x57,0xDD,0xA9,0x5A,0x50,0x6D,0x36,0xCA,0x39,0x1B,0x68,0x65,0x95,0xA3,0xDA,0x4C, +0x5D,0xEB,0xED,0x7D,0x5B,0xEB,0x00,0x81,0xE8,0x48,0xD9,0x84,0xC8,0x20,0x96,0x8B,0x90,0x87,0x5B,0xD1, +0x87,0x14,0x6E,0xA7,0xA2,0x22,0x01,0x38,0x59,0x49,0x9B,0x56,0x60,0x20,0x73,0xDF,0x68,0x25,0xDB,0x5D, +0xD1,0x98,0xEC,0x9D,0xA9,0x8A,0x73,0xB7,0x27,0x67,0xFA,0x3A,0xC7,0x00,0xCD,0x53,0x40,0xB7,0xAA,0x1A, +0x67,0xC2,0x82,0xFB,0x46,0x65,0x94,0x1D,0xDC,0x1F,0x46,0x28,0xCB,0x4E,0x50,0x0C,0xE7,0xFB,0xB1,0x6E, +0x16,0x57,0x69,0xCF,0xD9,0xDC,0x6C,0x23,0xA5,0x38,0x86,0x46,0x48,0x71,0x85,0x21,0x94,0xB9,0x3E,0x10, +0xDE,0xDC,0x5C,0xC7,0x98,0x78,0x54,0xFB,0x12,0x57,0x14,0xDC,0xB5,0x0C,0x7F,0xFF,0x13,0x77,0x2A,0xC1, +0x3E,0xA6,0xD5,0x14,0x7C,0xF6,0x21,0xDB,0xCF,0xD9,0x9C,0x0A,0xAE,0x2A,0xD6,0xD3,0x35,0x0A,0xAD,0xF3, +0x42,0x75,0x93,0x83,0x02,0xAF,0x3B,0x4D,0xD5,0x45,0x6E,0x5C,0xBA,0x12,0x06,0xD7,0x0D,0x2F,0xCD,0xFF, +0x47,0x58,0x55,0x0F,0x3C,0x26,0x6B,0x64,0x5A,0xD1,0x1A,0x59,0x71,0x84,0x39,0xAE,0x24,0x8D,0xD6,0x4A, +0x9A,0xFD,0x3F,0xFC,0xD6,0x1E,0x42,0x54,0x99,0xDB,0xF4,0x91,0x80,0xDC,0xEA,0x90,0x2B,0xBC,0x36,0x05, +0xA8,0xF8,0x59,0x14,0x8D,0x59,0xB2,0xFF,0xC8,0xBA,0x5B,0xAD,0x17,0x83,0x92,0xCD,0x7A,0x8B,0xE5,0xAF, +0x25,0xFA,0x06,0x4F,0xF9,0xFE,0x63,0x80,0xC7,0xC9,0xD6,0x7B,0xAC,0xC0,0xC3,0x36,0x28,0x0F,0x56,0x7F, +0xEE,0xF8,0x56,0x56,0xCD,0x2E,0x3B,0x0C,0x6C,0xE1,0x97,0x4A,0xF2,0x84,0x92,0x2C,0xB2,0x36,0x74,0xD5, +0xEB,0xA2,0xB7,0xF4,0x82,0x8E,0x9E,0xDC,0xD5,0x6B,0x9C,0x25,0x5E,0xA6,0x96,0x90,0x41,0x2C,0xBE,0x62, +0x94,0x75,0x01,0x25,0xF5,0x88,0xCD,0xA6,0xD3,0x0C,0xF3,0x0F,0x22,0x98,0x59,0x51,0x35,0x3F,0x96,0xC1, +0x6C,0x00,0x53,0x1A,0xB3,0x3C,0xC3,0x2C,0xE7,0xED,0xB2,0xA7,0x12,0x66,0x37,0xF8,0xE3,0x8F,0x6A,0xB2, +0x17,0x74,0xD2,0x7A,0x7A,0xB9,0x9B,0x35,0x26,0x7B,0x59,0x27,0x82,0x50,0xF0,0x1F,0xDF,0x14,0xD2,0xBC, +0x29,0x4C,0xC4,0x52,0x8B,0xA9,0x9B,0x92,0xD5,0x77,0x3D,0x13,0x45,0x29,0x6A,0x78,0xBB,0xB8,0xD0,0xBA, +0x59,0xF6,0x5C,0x4D,0x2F,0x47,0x56,0xB6,0x1A,0x04,0xD6,0x17,0x07,0xBE,0x21,0xA8,0x82,0xD6,0xDF,0xB0, +0x39,0x4E,0x0F,0x51,0x86,0x0D,0xC8,0x99,0x55,0xC4,0x92,0x50,0xD3,0x0D,0xD6,0xEC,0x02,0x25,0x50,0x05, +0x2E,0x0A,0x0F,0x46,0x45,0xE9,0x0D,0xF2,0xE5,0xAD,0x13,0xB0,0x2D,0x5E,0x0B,0x40,0xEA,0xE7,0xAA,0xD3, +0x80,0x3A,0x0D,0x83,0xAD,0x59,0x72,0x96,0xB2,0x04,0xCD,0x64,0x67,0x0D,0x6B,0xC2,0x3D,0x4A,0x6A,0x8D, +0xD4,0x5A,0xD5,0xA3,0x32,0xAD,0x3F,0xCC,0xEA,0x58,0x66,0x6E,0xA8,0x10,0x56,0x93,0x37,0x37,0xB3,0x39, +0xE1,0x7E,0x28,0x7C,0xDB,0x07,0x86,0x75,0x0E,0x6D,0x81,0x2B,0x47,0x21,0x8F,0xEB,0x51,0x54,0x0C,0x3F, +0x65,0xC5,0xC0,0xCF,0xCA,0xD1,0x5D,0x03,0xC8,0x68,0x09,0x66,0x74,0x5A,0x0C,0x09,0x25,0x25,0x9D,0x12, +0x58,0x7E,0x26,0x49,0x31,0x4A,0xC2,0x72,0x14,0xE2,0xBB,0x0A,0x8F,0x95,0xD0,0x00,0xEB,0xAE,0x32,0xDF, +0x86,0xB3,0x2C,0x06,0xFD,0x5A,0xFC,0xE0,0xBF,0x13,0x3F,0xA1,0xB3,0x52,0x98,0xA4,0x1C,0xCD,0x48,0x29, +0xCA,0x24,0x4E,0xBE,0xC8,0x48,0xF6,0x6F,0xFB,0x82,0xE7,0x47,0x6F,0x8E,0xC6,0x47,0xCD,0x12,0xB1,0xF9, +0x84,0xC0,0xFF,0xAA,0x47,0xE7,0xA6,0x6B,0x24,0x4D,0x4F,0x81,0x99,0x2F,0x3E,0x4F,0x58,0x20,0x8B,0x3E, +0x08,0xF8,0x46,0x02,0xD4,0x75,0xD3,0x6C,0xBD,0x32,0xA4,0xAD,0xD7,0x8B,0x3A,0xD0,0x17,0xCF,0x02,0xA0, +0xA7,0xCD,0xCD,0x06,0x23,0x72,0xBD,0x7E,0xF9,0xA0,0x96,0xAE,0xEA,0x34,0xE9,0x6C,0xE8,0xB1,0x82,0x06, +0x99,0x55,0xCB,0x40,0x3C,0x5A,0x38,0xBA,0x25,0xBA,0x07,0xB2,0xE7,0x43,0xDB,0xD0,0x31,0x55,0xB7,0xEF, +0x79,0x1E,0xBD,0xF2,0xAF,0x65,0xC7,0xB8,0xB9,0x89,0xDA,0x45,0x8F,0xE1,0x58,0x12,0x28,0x0E,0x94,0x23, +0xD9,0xAB,0x82,0x2C,0xC0,0x96,0x63,0xBD,0x1A,0x9D,0x9E,0xD8,0x09,0x4A,0xC1,0xE3,0xA8,0xD9,0x0C,0x12, +0x91,0x12,0xB0,0xAD,0xED,0x17,0x47,0x8D,0x6A,0x5C,0x7E,0x29,0xE4,0xF2,0xA5,0x95,0x1A,0x82,0x9C,0x6A, +0x72,0x45,0x0E,0x2F,0x5E,0xEF,0x20,0xF5,0x24,0x65,0x1A,0xAA,0xA3,0x48,0xD2,0x0C,0xE2,0xFC,0x36,0xD7, +0xD7,0xF7,0x96,0x3C,0x24,0x59,0xB3,0x0B,0x69,0xB9,0xFC,0xDF,0xB4,0xD8,0xB2,0x1C,0x29,0x72,0xAB,0x05, +0xB5,0xFA,0xBA,0x52,0x19,0x47,0x36,0x4C,0x75,0x61,0xCD,0xEA,0xEB,0xA8,0x43,0x66,0x21,0x54,0xB7,0xE8, +0x3F,0xF5,0x10,0x5A,0x7A,0x08,0x7D,0x18,0x20,0xF0,0x5D,0xCB,0xDB,0xAB,0x53,0x06,0x13,0xE0,0xEC,0x66, +0x50,0x45,0x11,0x80,0xC8,0x18,0xD2,0x02,0x7C,0xCA,0xE4,0xFA,0x27,0x74,0x8B,0xD4,0xE3,0x5D,0x0D,0x5D, +0x1F,0x2A,0xE4,0x76,0xFF,0x37,0x18,0x55,0x3B,0xDB,0x81,0x28,0x83,0xE1,0xC3,0x78,0xC2,0x5B,0xE1,0xA9, +0x8E,0x59,0xCD,0xE8,0x04,0xEE,0xBA,0x2C,0x0C,0xCB,0x1B,0xFA,0x6D,0xBA,0xDE,0xE6,0xE6,0xA3,0xBE,0xD7, +0x08,0x44,0x0A,0xA3,0x79,0x7B,0xD6,0xB7,0x2B,0xED,0x86,0x66,0x7D,0xFA,0x97,0xFE,0x87,0xF7,0x33,0x3B, +0x2B,0x5B,0x77,0x70,0xF3,0xC6,0x4C,0xD7,0x45,0xB6,0xF2,0x23,0x8C,0xD2,0x91,0xE8,0x12,0x55,0x86,0x58, +0x2A,0x03,0x7A,0xD2,0x75,0x0D,0xD0,0x58,0x4F,0xBE,0x12,0xDB,0x42,0x0F,0x80,0x50,0x41,0x29,0x40,0xA9, +0xC7,0x80,0x66,0x63,0x11,0xC1,0x22,0x82,0x86,0x87,0x51,0x76,0x83,0x48,0x73,0x3B,0x01,0x08,0x29,0xBE, +0x4C,0x86,0xBE,0xCE,0x2A,0x0C,0x21,0x09,0xD5,0x10,0x65,0x7E,0xB3,0x78,0x08,0xAB,0x9F,0x21,0x70,0xE9, +0x37,0xC5,0x05,0xD9,0x90,0x68,0x99,0x28,0x08,0x46,0x38,0xCB,0x24,0xE3,0x42,0xB0,0xB7,0x2C,0x00,0xB9, +0x00,0xAD,0x17,0xC3,0x48,0x1C,0x04,0x22,0x0A,0xC0,0x38,0xC4,0x71,0x01,0xE1,0x30,0x14,0x20,0x24,0x40, +0x5F,0x4B,0x5D,0x8D,0x64,0xE1,0x45,0xE8,0xCC,0xEB,0xF7,0x1C,0xEB,0x21,0xD9,0x8B,0x0C,0x8F,0xD8,0x94, +0x8F,0xD1,0x24,0x33,0x36,0x1C,0x73,0xCD,0x0E,0x00,0x8D,0x20,0x9C,0x18,0x5B,0xE6,0x7A,0xF4,0x0F,0x2C, +0xBD,0xC1,0xA9,0xB1,0xD1,0x2F,0xF8,0x39,0x86,0x82,0x29,0x82,0xBF,0x7C,0x08,0x6A,0xBF,0xC5,0x6F,0x08, +0xC5,0x05,0xE5,0x0C,0x90,0x43,0x36,0x3F,0x4B,0x09,0xE5,0x6F,0x65,0x5F,0x58,0x60,0xF9,0xEA,0xB9,0x42, +0x86,0xA0,0xF2,0x1D,0x63,0x21,0xA2,0x99,0xDB,0x7A,0xCD,0xB0,0x26,0x60,0x2F,0x08,0xAE,0xEE,0x62,0x4E, +0xA8,0xAB,0x1F,0xF2,0x34,0xEA,0x8E,0x74,0x2B,0x46,0x3E,0x4C,0xD4,0x1E,0x98,0x2F,0x2D,0xE1,0xB5,0x6E, +0x33,0x9A,0x6C,0xD4,0x93,0xBA,0x80,0x5E,0xFB,0xD4,0x53,0xBF,0x5C,0x08,0xE0,0x41,0xC4,0x26,0x86,0x78, +0x9A,0x5E,0x08,0x8F,0x77,0xE9,0xD2,0x14,0xE9,0xE9,0xCB,0xAF,0x32,0x3E,0x84,0x5D,0x6E,0xE1,0xC6,0xA3, +0x52,0x47,0xD7,0xC5,0x5B,0x0D,0xE0,0xA1,0xE0,0x94,0x46,0xF7,0x2E,0xA4,0xC5,0xBF,0x90,0x3A,0xA7,0x01, +0xFB,0x92,0xD4,0x1F,0x57,0xA4,0xFE,0xB8,0x4E,0x6A,0xDC,0xB6,0x16,0x4C,0x2E,0x80,0xEC,0x5B,0x44,0xD1, +0x0C,0xA7,0xB0,0x20,0x0E,0x01,0x03,0xFC,0x33,0xCE,0x52,0xFC,0x65,0xCE,0x46,0x21,0x99,0xF2,0x55,0xFE, +0xD4,0xEA,0xBF,0xE3,0x32,0xC5,0x8F,0x70,0x59,0x16,0x98,0x55,0xDE,0xF8,0xEB,0xA7,0x12,0xE9,0xD4,0x1E, +0x98,0xB0,0xE9,0xAE,0xFF,0xC2,0xEF,0xEA,0x13,0xBF,0x9C,0x3E,0xC5,0x87,0x8B,0x97,0x56,0x20,0xEE,0x44, +0xBB,0x2C,0x65,0xF4,0x00,0x2A,0xF8,0x37,0x20,0x82,0xA1,0xAE,0x23,0xF6,0x16,0x4B,0x8B,0x7B,0x06,0xA8, +0x12,0xBA,0x60,0x10,0xCE,0x97,0x75,0xAD,0x1D,0x42,0x8A,0x04,0x25,0x00,0x93,0x90,0x68,0x7B,0x57,0xFB, +0x9B,0xD7,0x1D,0xC8,0x50,0x1E,0x7C,0x98,0x1E,0x0C,0x36,0xAF,0xBF,0x33,0x7B,0x33,0xD2,0xA8,0x89,0x64, +0xAE,0x03,0xBD,0x5E,0xD1,0x6B,0x0F,0x2D,0x21,0x84,0x35,0x73,0x61,0x15,0x59,0x2D,0x2C,0x5F,0xBD,0xE0, +0x23,0x42,0x74,0x06,0x1F,0x32,0x76,0x40,0x78,0x5A,0xF3,0xE5,0x8A,0x9E,0xAB,0x11,0x60,0x35,0x1E,0xAA, +0x74,0x0E,0xFF,0xEA,0xA2,0xBD,0xE2,0x8D,0x60,0xA8,0xC8,0x42,0xDC,0x53,0x83,0x66,0x8C,0x15,0x49,0xBA, +0x34,0x5A,0x01,0x36,0x97,0x7A,0x0E,0xE0,0x29,0xA1,0x38,0xD0,0xAB,0xBC,0xFA,0xF3,0xDB,0x37,0xC7,0x9C, +0x27,0xE7,0x4A,0xB3,0x40,0xAB,0xBD,0x50,0x1B,0xDC,0x5C,0xF0,0xF4,0xBE,0xAC,0xD0,0x84,0xC3,0xAA,0x90, +0xF3,0xF3,0xE9,0xE4,0x13,0xF6,0x21,0x1F,0xBD,0xCD,0x20,0x99,0x6D,0xD9,0x02,0x7D,0x3C,0x3E,0xB3,0x77, +0x6C,0x07,0x4A,0x06,0xD0,0xAB,0x1F,0x0A,0xCB,0x2D,0xFF,0x11,0xF2,0x93,0x7F,0x86,0x4C,0x20,0xEE,0x66, +0x10,0x58,0x4B,0xFC,0x36,0x6E,0x98,0xB2,0xB9,0x44,0x3B,0x4A,0x53,0x61,0x94,0x71,0x48,0x32,0x6D,0x02, +0x8B,0x19,0x4E,0xB5,0x80,0xE1,0x4C,0xA3,0x8C,0x6B,0x59,0x9E,0x24,0x2C,0xE5,0x2B,0xFA,0xB0,0xF5,0xF2, +0xC1,0xE6,0x5D,0x8E,0x73,0x1C,0x14,0xCB,0x38,0x6D,0xEA,0x45,0x16,0x57,0xBF,0x0B,0xB8,0x77,0x75,0x5D, +0x94,0x5A,0x39,0xA5,0x22,0x0F,0x6C,0xF4,0xD5,0x1C,0xA4,0x0B,0x81,0xAA,0x47,0xF3,0x28,0x5A,0x0E,0x56, +0x68,0x41,0xC7,0xC5,0x38,0x13,0xF6,0xF0,0x16,0xBF,0x15,0x57,0xDC,0x5D,0x79,0x51,0x6D,0x53,0x75,0xAC, +0x0D,0x63,0x03,0x6B,0x84,0x66,0x1C,0x51,0x5F,0x98,0x51,0xE9,0xC2,0x2C,0xCB,0x2C,0xB1,0x7D,0x20,0xFC, +0x53,0xDE,0xA5,0x47,0x73,0xBB,0x94,0x8C,0x7A,0xBA,0x2E,0x2A,0x2E,0x2C,0x0A,0x57,0x14,0x67,0x0D,0xB2, +0x55,0xC4,0x36,0xA9,0x57,0x82,0x07,0xF2,0x1D,0xBC,0xBD,0x7F,0x95,0x8D,0xB2,0xCC,0x46,0x00,0xD3,0xCA, +0x7D,0x26,0xED,0x78,0xBA,0xCC,0xD4,0xFB,0xD2,0x75,0xE5,0x05,0x8E,0x31,0x0F,0x59,0xB0,0xAF,0xEF,0xEB, +0xAE,0x0E,0xFF,0x6F,0xEA,0x16,0xEC,0xC2,0xD4,0x07,0xF7,0xBF,0x38,0x7F,0x09,0x21,0x2D,0x61,0x14,0x53, +0x6E,0x20,0x88,0xEC,0x9E,0xDE,0x59,0x03,0x29,0xC9,0x5F,0xA1,0x6B,0x73,0xD0,0x56,0x36,0x9E,0xAF,0x98, +0xB3,0x65,0x0C,0x9B,0x51,0x11,0xE5,0xEE,0x81,0x79,0x8E,0x1F,0xBC,0x63,0x5B,0xF4,0x61,0x3B,0x62,0x2E, +0xB6,0x05,0xCF,0x12,0x6B,0x04,0x58,0xC2,0xF5,0x6A,0x25,0x3F,0x56,0x62,0x51,0xDB,0x47,0x51,0x24,0xBE, +0x7B,0x07,0x5E,0xC5,0x61,0x79,0x66,0x09,0x22,0x19,0x08,0x90,0xE1,0x31,0xBE,0x03,0x97,0x96,0x75,0x92, +0xBA,0x43,0x45,0x5F,0x02,0xA4,0x79,0xE3,0x1A,0x99,0x56,0x35,0xDB,0xDC,0xE4,0x76,0x79,0x4D,0x8C,0x12, +0x29,0x13,0x41,0xDF,0x30,0x45,0xCF,0x61,0x34,0x85,0x14,0x39,0xF4,0x81,0xB6,0x8D,0xB6,0x1A,0x12,0x4C, +0x8D,0x12,0x06,0x9C,0xE5,0x69,0x04,0x91,0x5A,0x54,0x11,0xAD,0x6D,0x19,0xA6,0x01,0x1C,0xE0,0xFE,0x25, +0xB2,0x44,0xA5,0xCD,0x5B,0x31,0xE2,0xA9,0xE2,0xBB,0x4D,0x8F,0x17,0x56,0x39,0xC6,0x32,0xF2,0xB5,0x7F, +0x2C,0x69,0xC9,0x9F,0x39,0x12,0x15,0x98,0x7B,0xF0,0xF0,0x3D,0x9F,0x77,0xC5,0x57,0xEF,0x5D,0x38,0x41, +0xDD,0x82,0x40,0x5F,0xC3,0xA1,0x6A,0xBB,0x2C,0xF1,0x60,0xE1,0xAE,0xB8,0x68,0xAD,0x3F,0x63,0xC5,0x47, +0xDB,0x74,0xDA,0x7C,0x36,0xAC,0xBD,0xBB,0xBD,0x02,0x42,0x13,0x96,0x72,0x03,0x72,0x0D,0xA4,0xA3,0xEA, +0xB4,0xB2,0x03,0x6A,0xC6,0x05,0x3B,0xC9,0xB3,0xD0,0x58,0x00,0xEB,0x2E,0xB7,0x94,0xAE,0x5C,0x6C,0xA9, +0x7B,0xEB,0x52,0xAB,0xBC,0x1F,0x2E,0xA4,0x90,0x56,0xFC,0xF8,0xE3,0x0F,0x39,0xAB,0xAD,0x0D,0xB3,0x15, +0x83,0x2F,0xD5,0x1B,0x6B,0x99,0x19,0xC5,0xA5,0x5F,0x8D,0x55,0xBB,0x3D,0xD5,0xD8,0x94,0xBF,0x4E,0xD0, +0x48,0xE0,0x89,0x24,0xAB,0x17,0x5F,0x41,0xC0,0x70,0x0A,0x71,0xC9,0x86,0x4E,0xA8,0xFA,0x39,0xAA,0x5E, +0xFC,0x1E,0x75,0x15,0x77,0xAF,0x6A,0xCD,0x3C,0xAF,0xAA,0xAB,0x55,0xD4,0x51,0x1B,0xBC,0x47,0x7E,0xB3, +0xA0,0x2B,0x30,0x74,0xAE,0x6A,0x60,0x57,0x67,0x8B,0x73,0xAD,0x62,0x11,0x65,0xF7,0xD4,0x17,0x51,0xB3, +0xA2,0x12,0x82,0xFA,0x5B,0xDD,0xAC,0xDA,0x69,0x2E,0x6B,0xCE,0xC4,0xF3,0x9C,0xC6,0x8A,0xB7,0xEC,0x66, +0xAE,0x07,0xF6,0xA1,0x59,0x16,0xE2,0x96,0x2E,0xAA,0xC9,0x6E,0xB9,0x9A,0x82,0x78,0xB0,0xA1,0xDE,0x95, +0x27,0xEB,0x01,0x2A,0xFD,0xAE,0x2E,0xAA,0xEC,0xBE,0xBA,0x5C,0x76,0x5C,0xD5,0xD7,0x36,0x8D,0x9F,0x9B, +0xD4,0x34,0x88,0x7C,0x90,0x97,0xFB,0xDB,0x6F,0xF4,0x8F,0xA2,0x29,0x8C,0xBD,0x3F,0x01,0x2C,0xED,0xAE, +0xEF,0x83,0x2C,0x00,0x00 };