From 8cd8f58b37ff403367d1b993b0de232b335ba4bf Mon Sep 17 00:00:00 2001 From: Ewoud Date: Sat, 22 Jul 2023 23:27:35 +0200 Subject: [PATCH] Use LazyJsonRDWS for ledFix(Gen): make 3D fixture preview work + extras app.js: add jsonValues for preview3D index.js: processUpdate: add file type, add fetchAndExecute (from WLEDMM) AppModLeds: - split in NUM_LEDS_Fastled and NUM_LEDS_preview - ledFix: use LazyJsonRDWS instead of ArduinoJson - ledFixGen: use filewrite (LazyJsonRDWS later) - ledFixGen add M888h, HSC and globe (wip) SysModFiles: - deleteLedFixes to deleteFiles - removeFiles: reverse filter - add LazyJsonRDWS class - remove overloading by postfixing setValue with C, B and I (temporary) SysModUI - Add check before uiFunctions vector function is called !!! (cause of crashes!!!) SysModWeb - add addFileServer to send full jsonfiles as text to ui --- data/app.js | 33 ++- data/index.js | 53 ++++- src/AppModLeds.h | 327 +++++++++++++++++--------- src/SysModFiles.cpp | 19 +- src/SysModFiles.h | 171 +++++++++++++- src/SysModModel.cpp | 14 +- src/SysModModel.h | 6 +- src/SysModNetwork.cpp | 4 +- src/SysModPrint.cpp | 5 +- src/SysModPrint.h | 3 + src/SysModSystem.cpp | 6 +- src/SysModUI.cpp | 16 +- src/SysModWeb.cpp | 21 +- src/SysModWeb.h | 1 + src/html_ui.h | 528 ++++++++++++++++++++++-------------------- 15 files changed, 793 insertions(+), 414 deletions(-) diff --git a/data/app.js b/data/app.js index 491ae9e3..3c66c51c 100644 --- a/data/app.js +++ b/data/app.js @@ -102,12 +102,34 @@ function preview3D(node, leds) { scene = new THREE.Scene(); scene.background = null; //new THREE.Color( 0xff0000 ); - var d = 5; //distanceLED; - var offset_x = -d*(mW-1)/2; - var offset_y = -d*(mH-1)/2; - var offset_z = -d*(mD-1)/2; + if (jsonValues.pview) { // && jsonValues.pview.leds + var d = 5; //distanceLED; + var offset_x = -d*(jsonValues.pview.width-1)/2; + var offset_y = -d*(jsonValues.pview.height-1)/2; + var offset_z = -d*(jsonValues.pview.depth-1)/2; - for (var x = 0; x < mW; x++) { + console.log("3D jsonValues", jsonValues.pview); + + if (jsonValues.pview.leds) { + console.log(jsonValues.pview.leds); + for (var led of jsonValues.pview.leds) { + const geometry = new THREE.SphereGeometry( 1, 32, 16 ); + const material = new THREE.MeshBasicMaterial({transparent: true, opacity: 0.5}); + // material.color = new THREE.Color(`${x/mW}`, `${y/mH}`, `${z/mD}`); + const sphere = new THREE.Mesh( geometry, material ); + sphere.position.set(offset_x + d*led[0], offset_y + d*led[1], offset_z + d*led[2]); + scene.add( sphere ); + } + } + } + else + { + var d = 5; //distanceLED; + var offset_x = -d*(mW-1)/2; + var offset_y = -d*(mH-1)/2; + var offset_z = -d*(mD-1)/2; + + for (var x = 0; x < mW; x++) { for (var y = 0; y < mH; y++) { for (var z = 0; z < mD; z++) { const geometry = new THREE.SphereGeometry( 1, 32, 16 ); @@ -118,6 +140,7 @@ function preview3D(node, leds) { scene.add( sphere ); } } + } } } //new diff --git a/data/index.js b/data/index.js index 0baca40c..80b37c5d 100644 --- a/data/index.js +++ b/data/index.js @@ -186,7 +186,7 @@ function generateHTML(parentNode, json) { //call ui Functionality, if defined (to set label, comment, lov etc) if (json.uiFun >= 0) { //>=0 as element in object var command = {}; - command["uiFun"] = json.id; //ask for uiFun (to add the options) + command["uiFun"] = json.id; //ask to run uiFun for object (to add the options) requestJson(command); } @@ -278,6 +278,18 @@ function processUpdate(json) { console.log("processUpdate json", key, json[key].json, gId(key)); jsonValues[key] = json[key].json; } + if (json[key].file) { //json send html nodes cannot process, store in jsonValues array + console.log("processUpdate file", key, json[key].file, gId(key)); + + //we need to send a request which the server can handle using request variable + let url = `http://${window.location.hostname}/file`; + fetchAndExecute(url, json[key].file, jsonValues, function(jsonValues,text) { + var ledmapJson = JSON.parse(text); + jsonValues[key] = ledmapJson; + // console.log(jsonValues); + }); + + } } else console.log("Id not found", key); @@ -288,14 +300,15 @@ function processUpdate(json) { function requestJson(command) { gId('connind').style.backgroundColor = "var(--c-y)"; if (!ws) return; - let url = `http://${window.location.hostname}/json`; let req = JSON.stringify(command); - - console.log("requestJson", url, command); - + + console.log("requestJson", command); + ws.send(req?req:'{"v":true}'); - return; + return; + + let url = `http://${window.location.hostname}/json`; //not used at the moment as WebSockets only fetch(url, { method: 'post', @@ -462,3 +475,31 @@ function handleDrop(e) { return false; } + +//WLEDMM: utility function to load contents of file from FS (used in draw) +function fetchAndExecute(url, name, parms, callback, callError = null) +{ + fetch + (url+name, { + method: 'get' + }) + .then(res => { + if (!res.ok) { + callError("File " + name + " not found"); + return ""; + } + // console.log("res", res, res.text(), res.text().result); + return res.text(); + }) + .then(text => { + // console.log("text", text); + callback(parms, text); + }) + .catch(function (error) { + if (callError) callError(parms, "Error getting " + name); + console.log(error); + }) + .finally(() => { + // if (callback) setTimeout(callback,99); + }); +} diff --git a/src/AppModLeds.h b/src/AppModLeds.h index 918ee2b9..7f34c34f 100644 --- a/src/AppModLeds.h +++ b/src/AppModLeds.h @@ -1,13 +1,14 @@ #include "FastLED.h" #define DATA_PIN 16 -#define NUM_LEDS 1024 +#define NUM_LEDS_Fastled 1024 +#define NUM_LEDS_preview 2000 //https://github.com/FastLED/FastLED/blob/master/examples/DemoReel100/DemoReel100.ino //https://blog.ja-ke.tech/2019/06/02/neopixel-performance.html // CRGB *leds = nullptr; -CRGB leds[NUM_LEDS]; +CRGB leds[NUM_LEDS_preview]; static uint8_t gHue = 0; // rotating "base color" used by many of the patterns static uint16_t nrOfLeds = 0; static uint16_t width = 8; @@ -269,34 +270,36 @@ class AppModLeds:public Module { files->dirToJson2(lov, "lf"); //only files containing lf }, [](JsonObject object) { //chFun print->print("%s Change %s to %d\n", "initDropdown chFun", object["id"].as(), object["value"].as()); - DynamicJsonDocument lmJson (8192); + char fileName[30] = "/"; //add root prefix - strcat(fileName, files->seqNrToName(object["value"].as())); - if (files->readFile(fileName)) { - files->readObjectFromFile(fileName, &lmJson); - print->printJDocInfo("ledFix", lmJson); - print->printJson("ledFix", lmJson); - - width = lmJson["pview"]["json"]["width"]; - height = lmJson["pview"]["json"]["height"]; - depth = lmJson["pview"]["json"]["depth"]; - - //change the setup based on the json file - nrOfLeds = lmJson["pview"]["json"]["leds"].size() / (depth>1?3:2); - if (nrOfLeds == 0) { //avoid div/0 in %nrOfLeds - print->print("ledFix could not find nrofleds"); - nrOfLeds = 30; - } - // mdl->setValue("nrOfLeds", nrOfLeds); //done by width/height and depth already - mdl->setValue("width", width); - mdl->setValue("height", height); - mdl->setValue("depth", depth); - - //send the json to pview... - // JsonVariant responseVariant = (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) != 0?web->responseDoc0:web->responseDoc1)->as(); - // (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) != 0?web->responseDoc0:web->responseDoc1)->clear(); - // responseVariant["pview"]["json"] = lmJson; - web->sendDataWs(lmJson); + const char * fname = files->seqNrToName(object["value"].as()); + if (!fname) { + print->print("ledFix file %d does not exist\n", object["value"].as()); + //due to delete files + return; + } + strcat(fileName, fname); + + LazyJsonRDWS ljrdws(fileName); //open fileName for deserialize + + //what to deserialize + ljrdws.lookFor("width", &width); + ljrdws.lookFor("height", &height); + ljrdws.lookFor("depth", &depth); + + if (ljrdws.deserialize()) { + print->print("ljrdws whd %d %d %d\n", width, height, depth); + + // mdl->setValueI("nrOfLeds", nrOfLeds); //done by width/height and depth already + mdl->setValueI("width", width); + mdl->setValueI("height", height); + mdl->setValueI("depth", depth); + + //send to pview a message to get file filename + JsonVariant responseVariant = (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) != 0?web->responseDoc0:web->responseDoc1)->as(); + (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) != 0?web->responseDoc0:web->responseDoc1)->clear(); + responseVariant["pview"]["file"] = fileName; + web->sendDataWs(responseVariant); print->print("ledfix send ws done\n"); } }); @@ -305,7 +308,7 @@ class AppModLeds:public Module { web->addResponseV(object, "comment", "Max %d", 256); }, [](JsonObject object) { //chFun width = object["value"]; - if (width>256) {width = 256;mdl->setValue("width", 256);}; + if (width>256) {width = 256;mdl->setValueI("width", 256);}; changeDimensions(); fadeToBlackBy( leds, nrOfLeds, 100); }); @@ -314,7 +317,7 @@ class AppModLeds:public Module { web->addResponseV(object, "comment", "Max %d", 64); }, [](JsonObject object) { //chFun height = object["value"]; - if (height>64) {height = 64;mdl->setValue("height", 64);}; + if (height>64) {height = 64;mdl->setValueI("height", 64);}; changeDimensions(); fadeToBlackBy( leds, nrOfLeds, 100); }); @@ -323,7 +326,7 @@ class AppModLeds:public Module { web->addResponseV(object, "comment", "Max %d", 16); }, [](JsonObject object) { //chFun depth = object["value"]; - if (depth>16) {depth = 16;mdl->setValue("depth", 16);}; + if (depth>16) {depth = 16;mdl->setValueI("depth", 16);}; changeDimensions(); fadeToBlackBy( leds, nrOfLeds, 100); }); @@ -338,9 +341,9 @@ class AppModLeds:public Module { ui->initDisplay(parentObject, "realFps"); ui->initDisplay(parentObject, "nrOfLeds", nullptr, [](JsonObject object) { //uiFun - web->addResponseV(object, "comment", "Max %d", NUM_LEDS); + web->addResponseV(object, "comment", "Max %d", NUM_LEDS_preview); }); - mdl->setValue("nrOfLeds", nrOfLeds); //set here as changeDimensions already called for width/height/depth + mdl->setValueI("nrOfLeds", nrOfLeds); //set here as changeDimensions already called for width/height/depth ui->initNumber(parentObject, "dataPin", dataPin, [](JsonObject object) { //uiFun web->addResponseV(object, "comment", "Not implemented yet (fixed to %d)", DATA_PIN); @@ -354,10 +357,11 @@ class AppModLeds:public Module { lov.add("R24"); //0 lov.add("R35"); //1 lov.add("M88"); //2 - lov.add("M885"); //3 + lov.add("M888"); //3 + lov.add("M888h"); //4 + lov.add("HSC"); //5 + lov.add("Globe"); //6 }, [](JsonObject object) { //chFun - DynamicJsonDocument lmJson (8192); - JsonObject lmObject = lmJson.to(); const char * name = "TT"; uint16_t nrOfLeds = 30; //default @@ -370,105 +374,204 @@ class AppModLeds:public Module { size_t fix = object["value"]; switch (fix) { case 0: //R24 + name = "R24"; + nrOfLeds = 24; + break; case 1: //R35 - diameter = 100; //in mm + name = "R35"; + nrOfLeds = 35; + break; + case 2: //M88 + name = "M88"; + nrOfLeds = 64; + break; + case 3: //M888 + name = "M888"; + nrOfLeds = 512; + break; + case 4: //M888h + name = "M888h"; + nrOfLeds = 512; + break; + case 5: //HSC + name = "HSC"; + nrOfLeds = 2000; + break; + case 6: //Globe + name = "Globe"; + nrOfLeds = 512; + break; + } - if (fix == 0) { - name = "R24"; - nrOfLeds = 24; - } - else { - name = "R35"; - nrOfLeds = 35; - } + char fileName[30] = "/lf"; + strcat(fileName, name); + strcat(fileName, ".json"); - lmObject["pview"]["json"]["name"] = name; + File f = files->open(fileName, "w"); + if (f) { + f.print("{"); //{\"pview\":{\"json\": + } + else + print->print("ledFixGen Could not open file %s for writing\n", fileName); + + char sep[3]=""; - lmObject["pview"]["json"]["scale"] = "mm"; - lmObject["pview"]["json"]["size"] = diameter; - lmObject["pview"]["json"]["pin"] = 16; - lmObject["pview"]["json"]["leds"] = lmJson.createNestedArray(); + f.printf("\"name\":\"%s\"", name); + f.printf(",\"pin\":%d",16); + switch (fix) { + case 0: //R24 + case 1: //R35 + diameter = 100; //in mm + + f.printf(",\"scale\":\"%s\"", "mm"); + f.printf(",\"size\":%d", diameter); + + width = 10; + height = 10; + depth = 1; + f.printf(",\"width\":%d", width); + f.printf(",\"height\":%d", height); + f.printf(",\"depth\":%d", depth); + f.printf(",\"leds\":["); + strcpy(sep, ""); for (int i=0; iprintJDocInfo("ledFixGen", lmJson); - files->writeObjectToFile(fileName, &lmJson); - print->printJson(fileName, lmJson); + files->filesChange(); //reload ledfix dropdown ui->processUiFun("ledFix"); @@ -513,8 +616,8 @@ class AppModLeds:public Module { } static void changeDimensions() { //static because of lambda functions - nrOfLeds = min(width * height * depth, NUM_LEDS); //not highter then 4K leds - mdl->setValue("nrOfLeds", nrOfLeds); + nrOfLeds = min(width * height * depth, NUM_LEDS_preview); //not highter then 4K leds + mdl->setValueI("nrOfLeds", nrOfLeds); print->print("changeDimensions %d x %d x %d = %d\n", width, height, depth, nrOfLeds); // if (!leds) // leds = (CRGB*)calloc(nrOfLeds, sizeof(CRGB)); @@ -524,7 +627,7 @@ class AppModLeds:public Module { // leds = (CRGB*)malloc(nrOfLeds * sizeof(CRGB)); // leds = (CRGB*)reallocarray // FastLED.addLeds(leds, 1); - FastLED.addLeds(leds, NUM_LEDS); + FastLED.addLeds(leds, NUM_LEDS_Fastled); } }; diff --git a/src/SysModFiles.cpp b/src/SysModFiles.cpp index d4b192a4..940a32f6 100644 --- a/src/SysModFiles.cpp +++ b/src/SysModFiles.cpp @@ -42,16 +42,17 @@ void SysModFiles::setup() { web->addResponse(object, "label", "Total FS size"); }); - ui->initButton(parentObject, "deleteLedFixes", "deleteLedFixes", [](JsonObject object) { //uiFun - web->addResponse(object, "comment", "temporary"); + ui->initButton(parentObject, "deleteFiles", "deleteFiles", [](JsonObject object) { //uiFun + web->addResponse(object, "comment", "All but model.json, temporary"); }, [](JsonObject object) { - print->print("delete deleteLedFixes json\n"); - files->removeFiles("lm1"); - files->removeFiles("lf"); + print->print("delete files\n"); + files->removeFiles("model.json", true); //all but model.json }); web->addUpload("/upload"); + web->addFileServer("/file"); + } void SysModFiles::loop(){ @@ -73,7 +74,7 @@ void SysModFiles::loop(){ } bool SysModFiles::remove(const char * path) { - filesChanged = true; + filesChange(); print->print("File remove %s\n", path); return LittleFS.remove(path); } @@ -184,7 +185,7 @@ bool SysModFiles::writeObjectToFile(const char* path, JsonDocument* dest) { print->println(F(" success")); serializeJson(*dest, f); f.close(); - filesChanged = true; + filesChange(); return true; } else { print->println(F(" fail")); @@ -192,12 +193,12 @@ bool SysModFiles::writeObjectToFile(const char* path, JsonDocument* dest) { } } -void SysModFiles::removeFiles(const char * filter) { +void SysModFiles::removeFiles(const char * filter, bool reverse) { File root = LittleFS.open("/"); File file = root.openNextFile(); while (file) { - if (filter == nullptr || strstr(file.name(), filter) != nullptr) { + if (filter == nullptr || reverse?strstr(file.name(), filter) == nullptr: strstr(file.name(), filter) != nullptr) { char fileName[30] = "/"; strcat(fileName, file.name()); file.close(); //close otherwise not removeable diff --git a/src/SysModFiles.h b/src/SysModFiles.h index c98b2570..5ea63379 100644 --- a/src/SysModFiles.h +++ b/src/SysModFiles.h @@ -2,11 +2,12 @@ #include "Module.h" #include "LittleFS.h" +#include "SysModPrint.h" +#include + class SysModFiles:public Module { public: - - SysModFiles(); void setup(); void loop(); @@ -40,7 +41,8 @@ class SysModFiles:public Module { //name is copied from WLED but better to call it readJsonFrom file bool writeObjectToFile(const char* path, JsonDocument* dest); - void removeFiles(const char * filter = nullptr); + //remove files meeting filter condition, if no filter, all, if reverse then all but filter + void removeFiles(const char * filter = nullptr, bool reverse = false); bool readFile(const char * path); @@ -49,4 +51,165 @@ class SysModFiles:public Module { }; -static SysModFiles *files; \ No newline at end of file +static SysModFiles *files; + +//Lazy Json Read Deserialize Write Serialize (write / serialize not implemented yet) +//ArduinoJson won't work on very large LedFix.json, this does +//only support what is currently needed: read / deserialize uint8/16/char object elements (arrays not yet) +class LazyJsonRDWS { + + public: + bool foundAll = false; + + LazyJsonRDWS(const char * path) { + f = files->open(path, "r"); + } + + ~LazyJsonRDWS() { + print->print("LazyJsonRDWS destructing\n"); + f.close(); + } + + //look for uint8 object + void lookFor(const char * id, uint8_t * value) { + // const char *p = (const char*)&value; //pointer trick + uint8List.push_back(value); + addToObjects(id, "uint8", uint8List.size()-1); + } + + //look for uint16 object + void lookFor(const char * id, uint16_t * value) { + // const char *p = (const char*)&value; //pointer trick + uint16List.push_back(value); + addToObjects(id, "uint16", uint16List.size()-1); + } + + //look for char object + void lookFor(const char * id, char * value) { + // const char *p = (const char*)&value; //pointer trick + charList.push_back(value); + addToObjects(id, "char", charList.size()-1); + } + + //reads from file until all objects have been found (then stops reading) + //returns false if not all objects to look for are found + bool deserialize() { + f.read(&character, sizeof(byte)); + while (f.available() && !foundAll) + next(); + if (!foundAll) + print->print("LazyJsonRDWS Not all objects looked for where found\n"); + return foundAll; + } + +private: + struct ObjectDetails { + const char * id; + const char * type; + size_t index; + }; + + File f; + uint8_t character; + std::vector objects; + std::vector uint8List; + std::vector uint16List; + std::vector charList; + char lastObject[100] = ""; + size_t foundNumber = 0; + + void addToObjects(const char * id, const char * type, size_t index) { + ObjectDetails object; + object.id = id; + object.type = type; + object.index = index; + objects.push_back(object); + } + + void next() { + if (character=='{') { + // print->print("Object %c\n", character); + print->print("Object [%s]\n", lastObject); + strcpy(lastObject, ""); + f.read(&character, sizeof(byte)); + } + else if (character=='[') { + // print->print("Array %c\n", character); + print->print("Array [%s]\n", lastObject); + strcpy(lastObject, ""); + f.read(&character, sizeof(byte)); + } + else if (character=='"') { //parse String + char value[100] = ""; + f.readBytesUntil('"', value, sizeof(value)); + + if (strcmp(lastObject, "") == 0) { + // print->print("Element [%s]\n", value); + strcpy(lastObject, value); + } + else { + print->print("String %s: [%s]\n", lastObject, value); + check(value); + strcpy(lastObject, ""); + } + + f.read(&character, sizeof(byte)); + } + else if (isDigit(character)) { //parse number + char value[100] = ""; + + size_t len = 0; + //readuntil not number + while (isDigit(character)) { + // print->print("%c", character); + value[len++] = character; + f.read(&character, sizeof(byte)); + } + value[len++] = '\0'; + + print->print("Number %s: [%s]\n", lastObject, value); + + check(value); + + strcpy(lastObject, ""); + } + else if (character==':') { + // print->print("semicolon %c\n", character); + f.read(&character, sizeof(byte)); + } + else if (character==',') { + // print->print("sep %c\n", character); + f.read(&character, sizeof(byte)); + } + else if (character==']') { + // print->print("close %c\n", character); + f.read(&character, sizeof(byte)); + } + else if (character=='}') { + print->print("close %c\n", character); + f.read(&character, sizeof(byte)); + } + else if (character=='\n') { //skip new lines + // print->print("skip newline \n"); + f.read(&character, sizeof(byte)); + } + else + print->print("Element don't know %c\n", character); + } //next + + void check(char *value) { + for (std::vector::iterator object=objects.begin(); object!=objects.end(); ++object) { + if (strcmp(object->id, lastObject)==0) { + print->print("LazyJsonRDWS found %s: %s\n", lastObject, value); + if (strcmp(object->type, "uint8") ==0) *uint8List[object->index] = atoi(value); + if (strcmp(object->type, "uint16") ==0) *uint16List[object->index] = atoi(value); + if (strcmp(object->type, "char") ==0) strcpy(charList[object->index], value); + foundNumber++; + } + } + foundAll = foundNumber == objects.size(); + if (foundAll) + print->print("Hooray, LazyJsonRDWS found all what we were looking for, no further search needed\n"); + } + +}; \ No newline at end of file diff --git a/src/SysModModel.cpp b/src/SysModModel.cpp index b1d2922e..54d03565 100644 --- a/src/SysModModel.cpp +++ b/src/SysModModel.cpp @@ -36,7 +36,9 @@ void SysModModel::setup() { web->addResponse(object, "label", "Size"); }); - ui->initButton(parentObject, "saveModel", "SaveModel", nullptr, [](JsonObject object) { + ui->initButton(parentObject, "saveModel", "SaveModel", [](JsonObject object) { + web->addResponse(object, "comment", "Write to model.json (manual save only currently)"); + }, [](JsonObject object) { doWriteModel = true; }); @@ -113,7 +115,7 @@ void SysModModel::cleanUpModel(JsonArray objects) { } //setValue char -JsonObject SysModModel::setValue(const char * id, const char * value) { +JsonObject SysModModel::setValueC(const char * id, const char * value) { JsonObject object = findObject(id); if (!object.isNull()) { if (object["value"].isNull() || object["value"] != value) { @@ -132,7 +134,7 @@ JsonObject SysModModel::setValue(const char * id, const char * value) { } //setValue int -JsonObject SysModModel::setValue(const char * id, int value) { +JsonObject SysModModel::setValueI(const char * id, int value) { JsonObject object = findObject(id); if (!object.isNull()) { if (object["value"].isNull() || object["value"] != value) { @@ -147,7 +149,7 @@ JsonObject SysModModel::setValue(const char * id, int value) { return object; } -JsonObject SysModModel::setValue(const char * id, bool value) { +JsonObject SysModModel::setValueB(const char * id, bool value) { JsonObject object = findObject(id); if (!object.isNull()) { if (object["value"].isNull() || object["value"] != value) { @@ -172,7 +174,7 @@ JsonObject SysModModel::setValueV(const char * id, const char * format, ...) { / va_end(args); - return setValue(id, value); + return setValueC(id, value); } JsonObject SysModModel::setValueP(const char * id, const char * format, ...) { @@ -186,7 +188,7 @@ JsonObject SysModModel::setValueP(const char * id, const char * format, ...) { va_end(args); - return setValue(id, value); + return setValueC(id, value); } JsonVariant SysModModel::getValue(const char * id) { diff --git a/src/SysModModel.h b/src/SysModModel.h index 46ef238c..bf6dcefd 100644 --- a/src/SysModModel.h +++ b/src/SysModModel.h @@ -18,13 +18,13 @@ class SysModModel:public Module { void cleanUpModel(JsonArray objects); //sets the value of object with id - static JsonObject setValue(const char * id, const char * value); + static JsonObject setValueC(const char * id, const char * value); //setValue int - static JsonObject setValue(const char * id, int value); + static JsonObject setValueI(const char * id, int value); //setValue bool - static JsonObject setValue(const char * id, bool value); + static JsonObject setValueB(const char * id, bool value); //Set value with argument list static JsonObject setValueV(const char * id, const char * format, ...); diff --git a/src/SysModNetwork.cpp b/src/SysModNetwork.cpp index e76130a8..be771c35 100644 --- a/src/SysModNetwork.cpp +++ b/src/SysModNetwork.cpp @@ -23,7 +23,9 @@ void SysModNetwork::setup() { ui->initPassword(parentObject, "pw", "", [](JsonObject object) { //uiFun web->addResponse(object, "label", "Password"); }); - ui->initButton(parentObject, "connect", "Connect", nullptr, [](JsonObject object) { + ui->initButton(parentObject, "connect", "Connect", [](JsonObject object) { + web->addResponse(object, "comment", "Force reconnect (you loose current connection)"); + }, [](JsonObject object) { forceReconnect = true; }); ui->initDisplay(parentObject, "nwstatus", nullptr, [](JsonObject object) { //uiFun diff --git a/src/SysModPrint.cpp b/src/SysModPrint.cpp index b7091638..a0f82102 100644 --- a/src/SysModPrint.cpp +++ b/src/SysModPrint.cpp @@ -1,6 +1,7 @@ #include "Module.h" #include "SysModPrint.h" #include "SysModUI.h" +#include "SysModModel.h" SysModPrint::SysModPrint() :Module("Print") { print("%s %s\n", __PRETTY_FUNCTION__, name); @@ -25,6 +26,7 @@ void SysModPrint::setup() { void SysModPrint::loop() { // Module::loop(); + if (!setupsDone) setupsDone = true; } size_t SysModPrint::print(const char * format, ...) { @@ -35,7 +37,8 @@ size_t SysModPrint::print(const char * format, ...) { va_end(args); - // mdl->setValueV("log", "%lu", millis()); + // if (setupsDone) mdl->setValueI("log", (int)millis()/1000); + //this function looks very sensitive, any chance causes crashes! return len; } diff --git a/src/SysModPrint.h b/src/SysModPrint.h index 0eb5ae8b..880d1187 100644 --- a/src/SysModPrint.h +++ b/src/SysModPrint.h @@ -22,6 +22,9 @@ class SysModPrint:public Module { char * fFormat(const char * format, ...); void printJDocInfo(const char * text, DynamicJsonDocument source); + +private: + bool setupsDone = false; }; static SysModPrint *print; \ No newline at end of file diff --git a/src/SysModSystem.cpp b/src/SysModSystem.cpp index 72568191..e93380b3 100644 --- a/src/SysModSystem.cpp +++ b/src/SysModSystem.cpp @@ -31,16 +31,16 @@ void SysModSystem::setup() { }); ui->initDropdown(parentObject, "reset0", (int)rtc_get_reset_reason(0), [](JsonObject object) { //uiFun - web->addResponse(object, "comment", "Reset reason core 0"); + web->addResponse(object, "comment", "Reset reason core 0 (to do readonly)"); sys->addResetReasonsLov(web->addResponseArray(object, "lov")); }); if (ESP.getChipCores() > 1) ui->initDropdown(parentObject, "reset1", (int)rtc_get_reset_reason(1), [](JsonObject object) { //uiFun - web->addResponse(object, "comment", "Reset reason core 1"); + web->addResponse(object, "comment", "Reset reason core 1 (to do readonly)"); sys->addResetReasonsLov(web->addResponseArray(object, "lov")); }); ui->initDropdown(parentObject, "restartReason", (int)esp_reset_reason(), [](JsonObject object) { //uiFun - web->addResponse(object, "comment", "Restart reason"); + web->addResponse(object, "comment", "Restart reason (to do readonly)"); JsonArray lov = web->addResponseArray(object, "lov"); lov.add("ESP_RST_UNKNOWN");// //!< Reset reason can not be determined lov.add("ESP_RST_POWERON");// //!< Reset due to power-on event diff --git a/src/SysModUI.cpp b/src/SysModUI.cpp index c55027db..8d9986b5 100644 --- a/src/SysModUI.cpp +++ b/src/SysModUI.cpp @@ -261,7 +261,10 @@ void SysModUI::setChFunAndWs(JsonObject object, const char * value) { //value: b if (!object["chFun"].isNull()) {//isNull needed here! size_t funNr = object["chFun"]; - uiFunctions[funNr](object); + if (funNr < uiFunctions.size()) + uiFunctions[funNr](object); + else + print->print("setChFunAndWs function nr %s outside bounds %d >= %d\n", object["id"].as(), funNr, uiFunctions.size()); } JsonVariant responseVariant = (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) != 0?web->responseDoc0:web->responseDoc1)->as(); @@ -303,7 +306,10 @@ const char * SysModUI::processJson(JsonVariant &json) { //static for setupJsonHa //call ui function... if (!object["uiFun"].isNull()) {//isnull needed here! size_t funNr = object["uiFun"]; - uiFunctions[funNr](object); + if (funNr < uiFunctions.size()) + uiFunctions[funNr](object); + else + print->print("processJson function nr %s outside bounds %d >= %d\n", object["id"].as(), funNr, uiFunctions.size()); if (object["type"] == "dropdown") web->addResponseInt(object, "value", object["value"]); //temp assume int only @@ -323,11 +329,11 @@ const char * SysModUI::processJson(JsonVariant &json) { //static for setupJsonHa //set new value if (value.is()) - mdl->setValue(key, value.as()); + mdl->setValueC(key, value.as()); else if (value.is()) - mdl->setValue(key, value.as()); + mdl->setValueB(key, value.as()); else if (value.is()) - mdl->setValue(key, value.as()); + mdl->setValueI(key, value.as()); else { print->print("processJson %s %s->%s not a supported type yet\n", key, object["value"].as().c_str(), value.as().c_str()); } diff --git a/src/SysModWeb.cpp b/src/SysModWeb.cpp index bcb0e792..2fb68b35 100644 --- a/src/SysModWeb.cpp +++ b/src/SysModWeb.cpp @@ -87,8 +87,8 @@ void SysModWeb::loop() { } for (auto client:web->ws->getClients()) { - mdl->setValue("clIsFull", client->queueIsFull()); - mdl->setValue("clStatus", client->status()); + mdl->setValueB("clIsFull", client->queueIsFull()); + mdl->setValueI("clStatus", client->status()); } } @@ -341,6 +341,23 @@ bool SysModWeb::addUpload(const char * uri) { return true; } +bool SysModWeb::addFileServer(const char * uri) { + + // AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/json", [](AsyncWebServerRequest *request) { + // }); + // server->addHandler(handler); + + server->on(uri, HTTP_GET, [uri](AsyncWebServerRequest *request){ + const char * ddd = request->url().c_str(); + const char * path = ddd + strlen(uri); //remove the uri from the path (skip their positions) + print->print("fileServer request %s %s %s\n", uri, request->url().c_str(), path); + if(LittleFS.exists(path)) { + request->send(LittleFS, path, "text/plain");//"application/json"); + } + }); + return true; +} + //processJsonUrl handles requests send in javascript using fetch and from a browser or curl //try this !!!: curl -X POST "http://192.168.121.196/json" -d '{"Pin2":false}' -H "Content-Type: application/json" //curl -X POST "http://4.3.2.1/json" -d '{"Pin2":false}' -H "Content-Type: application/json" diff --git a/src/SysModWeb.h b/src/SysModWeb.h index 89e2f068..cbc05b3c 100644 --- a/src/SysModWeb.h +++ b/src/SysModWeb.h @@ -40,6 +40,7 @@ class SysModWeb:public Module { // curl -F 'data=@ledfix1.json' 192.168.8.213/upload bool addUpload(const char * uri); + bool addFileServer(const char * uri); //processJsonUrl handles requests send in javascript using fetch and from a browser or curl //try this !!!: curl -X POST "http://192.168.121.196/json" -d '{"Pin2":false}' -H "Content-Type: application/json" diff --git a/src/html_ui.h b/src/html_ui.h index e06ab168..366d5658 100644 --- a/src/html_ui.h +++ b/src/html_ui.h @@ -7,262 +7,276 @@ */ // Autogenerated from data/index.htm, do not edit!! -const uint16_t PAGE_index_L = 4087; +const uint16_t PAGE_index_L = 4305; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x5a, 0xeb, 0x72, 0xdb, 0x38, - 0x96, 0xfe, 0xef, 0xa7, 0xa0, 0xe9, 0x19, 0x0f, 0x69, 0xd1, 0x14, 0x25, 0x5f, 0xe2, 0x50, 0xa6, - 0x53, 0x89, 0xe3, 0xed, 0xce, 0x54, 0xd2, 0x49, 0xb5, 0xd3, 0xd3, 0xb5, 0xe5, 0xf6, 0x6e, 0x43, - 0x24, 0x24, 0xb1, 0x43, 0x01, 0x1c, 0x10, 0xb2, 0xad, 0x96, 0xf5, 0x73, 0x1f, 0x60, 0x7f, 0xef, - 0x56, 0xed, 0xbb, 0xed, 0x13, 0xec, 0x23, 0xec, 0x39, 0x00, 0x78, 0xd3, 0xc5, 0x89, 0x67, 0x76, - 0x6b, 0xb7, 0x52, 0x91, 0x41, 0xe0, 0xe0, 0x9c, 0x83, 0x0f, 0xe7, 0x06, 0x90, 0xe7, 0xbb, 0x6f, - 0x3f, 0x5e, 0x7e, 0xfe, 0xc7, 0x4f, 0x57, 0xd6, 0x44, 0x4e, 0xb3, 0x0b, 0xeb, 0xbc, 0xfc, 0x43, - 0x49, 0x02, 0x7f, 0x64, 0x2a, 0x33, 0x7a, 0x71, 0x2d, 0x89, 0xf8, 0xc0, 0x13, 0x6b, 0x38, 0xb7, - 0x3e, 0x70, 0xce, 0xa0, 0x39, 0xcb, 0x68, 0x71, 0xde, 0xd5, 0xa3, 0xd6, 0xf9, 0x94, 0x4a, 0x62, - 0xed, 0xc4, 0x13, 0x22, 0x0a, 0x2a, 0x23, 0x7b, 0x26, 0x47, 0x87, 0x67, 0x36, 0xf4, 0x17, 0x72, - 0x0e, 0xe3, 0x3b, 0x19, 0x19, 0xd2, 0x6c, 0x31, 0x25, 0x62, 0x9c, 0xb2, 0x43, 0x91, 0x8e, 0x27, - 0x32, 0x3c, 0xcd, 0x1f, 0x96, 0x31, 0x9f, 0x4e, 0x29, 0x93, 0x8b, 0x11, 0x67, 0xf2, 0xb0, 0x48, - 0x7f, 0xa7, 0x61, 0x2f, 0xc8, 0x1f, 0x06, 0xfa, 0x11, 0x67, 0x86, 0xa9, 0x24, 0x59, 0x1a, 0x0f, - 0xcc, 0xcc, 0x8c, 0x8e, 0xf4, 0x44, 0x49, 0x1f, 0x56, 0x67, 0x2d, 0x7d, 0x49, 0x86, 0x19, 0xd5, - 0xf3, 0xf4, 0xd8, 0x88, 0x4c, 0xd3, 0x6c, 0x1e, 0xbe, 0x16, 0x29, 0xc9, 0xbc, 0xef, 0x69, 0x76, - 0x47, 0x65, 0x1a, 0x13, 0xaf, 0x20, 0xac, 0x38, 0x2c, 0xa8, 0x48, 0x47, 0x83, 0x21, 0x17, 0x09, - 0x15, 0x87, 0x31, 0xcf, 0x32, 0x92, 0x17, 0x34, 0x2c, 0x1b, 0x83, 0xfb, 0x34, 0x91, 0x13, 0xe0, - 0x1b, 0xfc, 0xb1, 0xa4, 0x11, 0x24, 0x49, 0x67, 0x45, 0xe8, 0x9f, 0xd0, 0x69, 0x4b, 0x94, 0x25, - 0x13, 0xaf, 0xfd, 0x3c, 0x59, 0xe8, 0x29, 0x61, 0x2f, 0x7f, 0xb0, 0x0a, 0x9e, 0xa5, 0x89, 0xb5, - 0x17, 0x04, 0xc1, 0x20, 0x27, 0x49, 0x92, 0xb2, 0xb1, 0x5a, 0x40, 0x7b, 0x86, 0x08, 0x99, 0x9c, - 0x1c, 0xc6, 0x93, 0x34, 0x4b, 0x1c, 0x7a, 0x47, 0x99, 0xbb, 0x18, 0x92, 0xf8, 0xcb, 0x58, 0xf0, - 0x19, 0x4b, 0x50, 0x39, 0x2e, 0xc2, 0xbd, 0x51, 0x1f, 0xff, 0xad, 0x4d, 0x9c, 0xf0, 0x3b, 0x2a, - 0x36, 0x90, 0x27, 0x49, 0xb2, 0x5c, 0x55, 0x0b, 0x51, 0x3b, 0x04, 0x3c, 0xc7, 0x2c, 0x44, 0x24, - 0x07, 0xeb, 0xb3, 0x4e, 0x5f, 0xe0, 0xbf, 0x41, 0x29, 0x72, 0x34, 0x5a, 0xfa, 0x31, 0x20, 0x49, - 0x52, 0x06, 0x42, 0x92, 0xb4, 0xc8, 0x33, 0x32, 0x0f, 0xc7, 0x22, 0x4d, 0x06, 0xf8, 0x73, 0x28, - 0xe9, 0x14, 0x7a, 0x24, 0xc5, 0xe9, 0xb3, 0x29, 0x2b, 0x42, 0x41, 0x73, 0x4a, 0xa4, 0x73, 0xec, - 0xf5, 0x46, 0xc2, 0x5d, 0xfa, 0x43, 0xfe, 0x50, 0x62, 0x71, 0x54, 0x63, 0x71, 0x7a, 0x7a, 0x3a, - 0xd8, 0xa8, 0xf0, 0x06, 0xa8, 0x2b, 0xd0, 0x94, 0x61, 0x68, 0x33, 0xd0, 0xed, 0x78, 0x26, 0x0a, - 0x98, 0x37, 0x85, 0xf5, 0x2b, 0x41, 0x5b, 0x91, 0x08, 0x82, 0xa1, 0x59, 0x08, 0xea, 0xb8, 0x4d, - 0x9f, 0xaf, 0x48, 0x5e, 0x95, 0xe6, 0xa3, 0x30, 0xcf, 0xf0, 0xf4, 0xb5, 0xe4, 0x9a, 0x71, 0xc2, - 0xa5, 0xa4, 0x9a, 0xf3, 0x32, 0x14, 0x9c, 0xcb, 0xc5, 0xe1, 0x61, 0x7c, 0xd8, 0x0b, 0xf7, 0x7a, - 0xbd, 0xde, 0x00, 0x9b, 0x23, 0x05, 0xae, 0x6a, 0xf6, 0xc3, 0xbd, 0x7e, 0xbf, 0xaf, 0x9a, 0x47, - 0xe1, 0xde, 0xd1, 0xd1, 0x91, 0x6a, 0x1e, 0x87, 0x7b, 0xc7, 0xc7, 0xc7, 0xaa, 0x79, 0x12, 0xee, - 0x9d, 0x9c, 0x9c, 0xa8, 0xe6, 0x69, 0xa8, 0x94, 0xc5, 0xe6, 0x59, 0xb8, 0x77, 0x76, 0x76, 0xa6, - 0x9a, 0xc3, 0x70, 0x6f, 0x38, 0x1c, 0xaa, 0x66, 0x1c, 0xee, 0xc5, 0x71, 0xac, 0x9a, 0x34, 0xdc, - 0xa3, 0x94, 0xaa, 0x66, 0xa2, 0xd1, 0xc5, 0x26, 0xe0, 0x11, 0x1f, 0x69, 0x69, 0x63, 0x10, 0x1c, - 0x6b, 0x75, 0x32, 0x90, 0x76, 0x46, 0x54, 0x73, 0x1e, 0xee, 0x91, 0x97, 0x01, 0x34, 0x25, 0xf0, - 0x0d, 0x7c, 0x2d, 0x97, 0x87, 0x62, 0x3c, 0x24, 0xce, 0xd1, 0xb1, 0x67, 0x95, 0xff, 0x03, 0xff, - 0xa5, 0xab, 0xc6, 0xe4, 0x70, 0x7d, 0xf0, 0x8e, 0x08, 0x47, 0x71, 0x70, 0x4b, 0x1a, 0xa2, 0x89, - 0x7a, 0x41, 0xdf, 0xb3, 0xea, 0x9f, 0x75, 0xba, 0x89, 0xa6, 0x3b, 0xe9, 0x79, 0x56, 0xf9, 0xbf, - 0x4d, 0x04, 0x5e, 0xf9, 0x02, 0x37, 0x04, 0x5a, 0x79, 0xd9, 0x82, 0x59, 0xa7, 0x47, 0xba, 0x6f, - 0x98, 0x87, 0xbd, 0x63, 0xd8, 0x01, 0xfd, 0x13, 0x98, 0x16, 0xd2, 0xc0, 0xc8, 0x4b, 0x78, 0x0c, - 0xac, 0x17, 0xf8, 0xab, 0x66, 0x25, 0x21, 0xe3, 0x0c, 0x21, 0x2a, 0xc6, 0x79, 0x68, 0x0f, 0x33, - 0x1e, 0x7f, 0xb1, 0x71, 0x60, 0x2a, 0x43, 0x0c, 0x28, 0x7b, 0x60, 0xfa, 0x2c, 0x65, 0xc9, 0x22, - 0xe7, 0x45, 0x2a, 0x53, 0xce, 0xc2, 0x51, 0xfa, 0x40, 0xd1, 0x4a, 0xa5, 0xe4, 0xd3, 0x30, 0x26, - 0x59, 0xec, 0x68, 0xe5, 0x86, 0x13, 0xd7, 0xea, 0x58, 0x27, 0xf9, 0x83, 0x3b, 0x50, 0x21, 0x0a, - 0x45, 0x96, 0xe6, 0x03, 0xbd, 0x2b, 0xd6, 0xa5, 0x7a, 0xd6, 0xcc, 0x14, 0x51, 0xff, 0xfd, 0x10, - 0xc4, 0xd1, 0x87, 0xf0, 0xb0, 0xbf, 0xdc, 0x39, 0xef, 0xea, 0xd8, 0x09, 0x31, 0x34, 0x16, 0x69, - 0x2e, 0x2f, 0x76, 0x40, 0x96, 0x95, 0x0b, 0x7a, 0x97, 0xf2, 0x59, 0xf1, 0x0f, 0x33, 0x16, 0xa3, - 0x4a, 0x9e, 0xa0, 0x30, 0x43, 0x50, 0x11, 0xb1, 0x59, 0x96, 0x79, 0x45, 0x4c, 0x19, 0xd5, 0xcd, - 0x98, 0x4c, 0xa9, 0x20, 0xaa, 0x3d, 0x18, 0x19, 0x6a, 0x6b, 0x06, 0x61, 0x0f, 0xa6, 0x3a, 0xd4, - 0x13, 0xee, 0x22, 0x1d, 0x39, 0x76, 0x7e, 0x97, 0xd2, 0x7b, 0x3b, 0x8a, 0xa8, 0xbb, 0xc8, 0xa8, - 0xb4, 0x60, 0x2e, 0xbd, 0xb7, 0x7e, 0x4a, 0x99, 0x3c, 0x7b, 0x2d, 0x04, 0x99, 0x3b, 0xc2, 0xf5, - 0xd2, 0x68, 0xfc, 0x2e, 0x29, 0x29, 0x5d, 0x8f, 0x45, 0xa9, 0x9f, 0x13, 0x10, 0x2b, 0x7f, 0xe0, - 0x09, 0xf5, 0xff, 0x3a, 0xa3, 0x62, 0x7e, 0x4d, 0x33, 0x1a, 0x4b, 0x2e, 0x1c, 0x7b, 0x4f, 0x91, - 0x1d, 0xbd, 0xb5, 0xdd, 0x81, 0xa0, 0x72, 0x26, 0x98, 0xd5, 0x03, 0xe6, 0x37, 0xfd, 0xdb, 0x57, - 0x0e, 0xdb, 0xdf, 0x77, 0x98, 0x3f, 0x49, 0x93, 0x84, 0xb2, 0x68, 0x37, 0x00, 0xc6, 0xd5, 0x43, - 0xcf, 0x53, 0xeb, 0xa2, 0xf7, 0xfd, 0xb7, 0x4e, 0xea, 0x51, 0xd7, 0x0d, 0x9d, 0x7a, 0x30, 0xf0, - 0xd8, 0xe3, 0xa3, 0xc3, 0xa2, 0xf8, 0xca, 0xb1, 0x63, 0xc2, 0xee, 0x48, 0x81, 0x5a, 0xf8, 0x69, - 0x12, 0xd9, 0xa5, 0x30, 0xaf, 0xa5, 0x52, 0xca, 0x60, 0x95, 0xf2, 0x0d, 0x1d, 0x71, 0x41, 0x1d, - 0x06, 0x63, 0x0c, 0xe2, 0xde, 0x75, 0x3a, 0xcc, 0x60, 0x3b, 0x5c, 0x98, 0xda, 0xd2, 0xa3, 0xe7, - 0x96, 0xb2, 0x8f, 0xde, 0x02, 0x31, 0xc8, 0xf6, 0x76, 0x83, 0x25, 0x42, 0x33, 0xe4, 0x44, 0x24, - 0x4f, 0x42, 0x33, 0x30, 0x33, 0xdf, 0x20, 0xa5, 0xa3, 0x50, 0xd2, 0x93, 0x5c, 0xe0, 0xb3, 0xd4, - 0xeb, 0xdf, 0xed, 0x2d, 0x2b, 0xf4, 0xeb, 0x45, 0x2a, 0xfc, 0x91, 0x6b, 0x1a, 0x51, 0x7f, 0x4c, - 0xe5, 0x25, 0x04, 0x59, 0x50, 0xd2, 0xb1, 0xfb, 0x89, 0x82, 0xf8, 0x78, 0x00, 0x1a, 0xa4, 0x7e, - 0x9c, 0x51, 0x22, 0x7e, 0x04, 0x68, 0x9d, 0xc0, 0x0b, 0x3c, 0xea, 0xab, 0xac, 0x04, 0x7f, 0x27, - 0x14, 0x53, 0xa8, 0xeb, 0xfd, 0x56, 0x70, 0xf6, 0x17, 0x92, 0xcd, 0x68, 0xe1, 0x2b, 0x28, 0x34, - 0x4f, 0x12, 0x7d, 0x20, 0x72, 0xe2, 0x4f, 0x53, 0xd8, 0x67, 0x3d, 0xa5, 0xbb, 0x4a, 0xb8, 0xc2, - 0x69, 0x7d, 0xbc, 0x94, 0x90, 0x69, 0x5e, 0xa3, 0x8c, 0xc3, 0xee, 0x96, 0xec, 0x0e, 0xc9, 0xc1, - 0x66, 0x86, 0x6e, 0xb7, 0xef, 0xa2, 0xe6, 0x6b, 0xa3, 0x19, 0x4d, 0x0a, 0x17, 0xf6, 0x03, 0xfd, - 0xc5, 0x92, 0x16, 0x1f, 0x59, 0x9b, 0x49, 0xc4, 0x0d, 0xbb, 0xed, 0xc0, 0x4f, 0xa7, 0xa7, 0xff, - 0xf4, 0x6f, 0x2f, 0xfa, 0x01, 0xec, 0x57, 0xea, 0x8f, 0xd2, 0x2c, 0xbb, 0x46, 0x87, 0x88, 0x7e, - 0x85, 0x08, 0xe1, 0xfc, 0x61, 0x81, 0xa4, 0x4b, 0x4f, 0xfd, 0x05, 0xea, 0xb2, 0xd5, 0xbf, 0x5d, - 0xba, 0xbf, 0xc2, 0x96, 0x0f, 0x29, 0x24, 0x8a, 0x4f, 0xa0, 0xba, 0x83, 0x76, 0x46, 0x44, 0xec, - 0xc8, 0x9b, 0xe0, 0xf6, 0x60, 0x9b, 0xe2, 0xeb, 0x00, 0x60, 0x5d, 0xd1, 0xc9, 0x3c, 0x79, 0xd3, - 0xdb, 0x38, 0x6b, 0x1b, 0x6e, 0x38, 0xcd, 0xf3, 0x8f, 0x0f, 0x08, 0xec, 0x57, 0xff, 0x40, 0x61, - 0xf7, 0xe9, 0x1d, 0xaa, 0x80, 0xfa, 0x3b, 0x68, 0x7d, 0x9d, 0xe8, 0x68, 0x40, 0xb3, 0x82, 0x5a, - 0x10, 0x5d, 0x20, 0x01, 0x51, 0x3f, 0xe3, 0x63, 0xf0, 0xae, 0xd2, 0x34, 0xac, 0x19, 0xfb, 0xc2, - 0xf8, 0x3d, 0x53, 0x00, 0xd9, 0xeb, 0x3b, 0xbc, 0xd6, 0xa3, 0x3c, 0x7c, 0x89, 0x1c, 0xd5, 0xe6, - 0xcb, 0x48, 0xc0, 0x42, 0x3d, 0x02, 0x7f, 0x7a, 0xb7, 0xe5, 0xf6, 0x35, 0x4d, 0x41, 0xd6, 0xbb, - 0x4e, 0x5c, 0x8f, 0x6f, 0xdc, 0xdf, 0xec, 0x40, 0xaa, 0xad, 0xc4, 0x1d, 0x9b, 0x47, 0x90, 0x04, - 0xe6, 0xe7, 0x64, 0x30, 0xef, 0x74, 0xd4, 0x16, 0x3e, 0x60, 0xc7, 0xc3, 0xb9, 0x1c, 0x3c, 0x40, - 0xc7, 0xff, 0xe2, 0x86, 0x3d, 0x1c, 0x64, 0x1d, 0xee, 0xcd, 0x0f, 0x32, 0xc4, 0x33, 0x7b, 0x0a, - 0xcf, 0xe5, 0x9a, 0x8b, 0x1d, 0xb5, 0x5c, 0x4c, 0x21, 0xc2, 0x34, 0x22, 0x88, 0x4f, 0xff, 0x16, - 0x8d, 0x74, 0xb7, 0x0c, 0x9d, 0xee, 0xc2, 0xa9, 0xa3, 0x28, 0xf8, 0xf8, 0xe7, 0xef, 0x7f, 0xbc, - 0xba, 0xf2, 0x7f, 0xa6, 0xc3, 0xef, 0xde, 0xff, 0x68, 0xfa, 0x9d, 0x85, 0x8e, 0x3c, 0x21, 0xf5, - 0x08, 0x93, 0x50, 0x4e, 0xa6, 0xd0, 0x86, 0xc8, 0x44, 0xb2, 0x7c, 0x42, 0xa0, 0xb1, 0x74, 0x5d, - 0x1f, 0x0a, 0xdf, 0x4b, 0xf4, 0xd7, 0xd7, 0xd8, 0xe7, 0x40, 0x7c, 0x2b, 0x99, 0x56, 0x23, 0x97, - 0x18, 0xe9, 0xd1, 0x95, 0xdb, 0x63, 0xd7, 0x60, 0x33, 0xce, 0x51, 0x10, 0x78, 0xbd, 0x13, 0x18, - 0x71, 0xca, 0xc0, 0x5d, 0x69, 0xf2, 0x89, 0x8a, 0x22, 0x87, 0x20, 0x90, 0xde, 0xd1, 0x4b, 0x35, - 0xe6, 0x1c, 0x9f, 0x78, 0x7d, 0xaf, 0xe7, 0x9d, 0x04, 0x01, 0xc8, 0x2d, 0xb3, 0x13, 0xb2, 0x52, - 0x71, 0xe2, 0xc5, 0x89, 0x6b, 0xa2, 0x3f, 0xd8, 0x16, 0xff, 0xf2, 0x5a, 0xf7, 0x22, 0x6b, 0x93, - 0x1e, 0x2a, 0xce, 0xd7, 0xf8, 0xec, 0xfa, 0x75, 0x32, 0x32, 0xe9, 0xc2, 0x38, 0x2a, 0x89, 0x0e, - 0x4f, 0x0e, 0x9c, 0xf4, 0xb0, 0x07, 0xc6, 0x00, 0xa6, 0x84, 0x0f, 0x4c, 0x3f, 0x70, 0xf5, 0x20, - 0xf5, 0x43, 0x11, 0x05, 0x83, 0xe2, 0x3c, 0x1d, 0x14, 0xc6, 0x40, 0x70, 0xea, 0x04, 0xfa, 0x26, - 0xe7, 0x6c, 0x30, 0x69, 0xf4, 0x25, 0xd0, 0x97, 0x80, 0xdd, 0x24, 0xd0, 0xb7, 0x40, 0xeb, 0x2f, - 0x83, 0xaa, 0x51, 0x26, 0x9f, 0x00, 0x22, 0xdf, 0x51, 0x0e, 0x67, 0x09, 0x31, 0x77, 0x7a, 0xde, - 0x11, 0xac, 0xf1, 0x14, 0xa0, 0x6a, 0xd0, 0x7c, 0xa0, 0xc5, 0xe4, 0x0d, 0x29, 0xd2, 0x18, 0x2c, - 0x81, 0x62, 0x59, 0xef, 0x2c, 0xa4, 0x80, 0x72, 0x5e, 0x47, 0x7f, 0xdc, 0x11, 0x9e, 0x93, 0x38, - 0x95, 0x73, 0x28, 0xe1, 0x96, 0x98, 0xba, 0xda, 0x53, 0x95, 0x51, 0x0c, 0xd2, 0x36, 0x64, 0xa4, - 0x73, 0x72, 0x50, 0x78, 0x19, 0xfc, 0x4e, 0x3c, 0x0e, 0xbf, 0x89, 0xab, 0xd3, 0xa8, 0x0f, 0x09, - 0xdc, 0x49, 0xdd, 0xe5, 0x12, 0x75, 0xbf, 0x8f, 0x7a, 0x0a, 0x96, 0xd5, 0xb5, 0xae, 0xae, 0xb3, - 0xb9, 0xc6, 0xfb, 0x73, 0xcd, 0x47, 0xd5, 0xf5, 0xa0, 0x1f, 0x84, 0x38, 0x36, 0x96, 0x13, 0xf0, - 0x8e, 0x76, 0xff, 0xcd, 0xfd, 0xad, 0x7f, 0x97, 0x16, 0x90, 0xa0, 0x28, 0x18, 0xe7, 0xd1, 0xc1, - 0x7d, 0xe7, 0x18, 0x9d, 0x49, 0x35, 0xb4, 0x5f, 0xe9, 0x26, 0xf8, 0x56, 0x2f, 0xf0, 0xb6, 0xce, - 0xdd, 0xc8, 0x77, 0x6a, 0x70, 0xf2, 0x55, 0x95, 0xd1, 0x80, 0x43, 0xdb, 0xa2, 0x6d, 0x97, 0xdc, - 0x6f, 0xbb, 0xfd, 0x93, 0x13, 0xaf, 0x7e, 0x06, 0xc1, 0xab, 0x3d, 0x7d, 0xd5, 0xe3, 0x82, 0xd3, - 0xdd, 0x77, 0x3a, 0x03, 0x2d, 0x4b, 0x70, 0x49, 0x14, 0x92, 0x0f, 0x9d, 0xc8, 0x0f, 0x7a, 0xde, - 0x4a, 0xef, 0x5c, 0xf7, 0x56, 0xd6, 0xae, 0x1b, 0x5a, 0x4f, 0x63, 0xa3, 0xee, 0x9a, 0xf3, 0xea, - 0x74, 0xfa, 0xb5, 0x14, 0xa9, 0x9c, 0x5a, 0x6a, 0xa7, 0xde, 0x90, 0xf1, 0x58, 0x1d, 0xe6, 0x9e, - 0x48, 0x63, 0x0c, 0xc3, 0x1c, 0x58, 0xf3, 0xb1, 0xda, 0xdc, 0xaf, 0x27, 0x5c, 0x13, 0x0c, 0xe5, - 0x6a, 0x30, 0x64, 0x26, 0x18, 0x72, 0xdc, 0x2d, 0xae, 0x37, 0x8d, 0x3f, 0x1d, 0x0c, 0xb9, 0x09, - 0x81, 0xbc, 0x0a, 0x86, 0xfc, 0xc9, 0x60, 0x48, 0x20, 0x1b, 0xcd, 0x21, 0xaf, 0x3c, 0x95, 0x5c, - 0x38, 0x06, 0x43, 0xac, 0x1c, 0x75, 0xc5, 0x58, 0x97, 0x8e, 0x88, 0x63, 0x12, 0x25, 0x3c, 0x9e, - 0xe1, 0x79, 0xdb, 0xbb, 0x2f, 0x4c, 0x8d, 0xa8, 0x8e, 0x2f, 0x3f, 0x88, 0x08, 0x6a, 0x2c, 0xf1, - 0x71, 0x74, 0xa9, 0x4f, 0x71, 0xd1, 0xb1, 0x67, 0xea, 0xc4, 0x77, 0x50, 0x63, 0xd9, 0x1e, 0xde, - 0x07, 0x7c, 0x07, 0x1b, 0x26, 0xc0, 0x96, 0x12, 0x2c, 0xd6, 0xea, 0x14, 0x14, 0x2d, 0x96, 0x75, - 0x71, 0x89, 0x05, 0x10, 0x14, 0x4b, 0xa6, 0xee, 0x4b, 0x70, 0xd3, 0xae, 0x32, 0x8a, 0x02, 0xdf, - 0xcc, 0xd5, 0x50, 0xbd, 0xd3, 0x50, 0xcb, 0x35, 0x29, 0x63, 0x01, 0xa7, 0x46, 0x6a, 0x88, 0x5b, - 0x84, 0x13, 0xc2, 0x92, 0x8c, 0xfe, 0x05, 0x2d, 0x3c, 0xcd, 0xc0, 0xaf, 0x2f, 0xa1, 0x63, 0x4c, - 0x1d, 0x1d, 0x3f, 0xaa, 0xec, 0xb9, 0x99, 0xca, 0x6e, 0xf0, 0xe1, 0xec, 0x3d, 0x27, 0x09, 0xcc, - 0x9b, 0x92, 0x2f, 0xf4, 0xe7, 0x6b, 0xc4, 0x95, 0xa5, 0xd2, 0x2c, 0x18, 0x9e, 0x12, 0xf4, 0xf6, - 0x2b, 0x38, 0x7a, 0xcb, 0xf7, 0x69, 0x21, 0x71, 0xb1, 0x8e, 0x7d, 0x57, 0xf1, 0x8b, 0x35, 0x3f, - 0x6f, 0xb3, 0x1c, 0x0f, 0x8a, 0xc8, 0x5a, 0x52, 0x29, 0x00, 0xcb, 0xeb, 0x7b, 0xa8, 0x68, 0xd4, - 0x1a, 0x07, 0xba, 0x82, 0x04, 0x4d, 0xa5, 0xcc, 0x8b, 0x10, 0xaa, 0xca, 0x7b, 0xa8, 0xf4, 0x39, - 0x54, 0x3d, 0x3c, 0xd6, 0x9e, 0x92, 0x83, 0xcf, 0x70, 0xd8, 0x8f, 0x57, 0xf6, 0x7d, 0x51, 0xd8, - 0x21, 0xfc, 0xda, 0x6e, 0xc7, 0x0e, 0xbb, 0x5d, 0xbb, 0xb3, 0x4a, 0x3a, 0xe1, 0x85, 0x64, 0xe0, - 0x3b, 0x1d, 0xbb, 0x0b, 0x54, 0x83, 0x16, 0x12, 0x5a, 0xba, 0x35, 0x13, 0x99, 0x0d, 0x35, 0xa8, - 0xda, 0x68, 0x70, 0x79, 0xc8, 0x65, 0xd7, 0x70, 0xb8, 0xa1, 0x88, 0x2d, 0xf4, 0xf9, 0xc3, 0x94, - 0x11, 0x31, 0xff, 0x3c, 0xcf, 0x69, 0x64, 0x13, 0x2c, 0x66, 0x87, 0xb3, 0xd1, 0x88, 0x0a, 0x1b, - 0xc7, 0x38, 0x9b, 0xd2, 0xa2, 0x20, 0x63, 0x1a, 0xd1, 0xe8, 0x02, 0x17, 0x41, 0xfd, 0x84, 0x48, - 0x62, 0x41, 0x55, 0x2d, 0x09, 0x8b, 0x29, 0xd4, 0x6e, 0xaa, 0xfe, 0x7d, 0xa3, 0xa6, 0xb8, 0xe5, - 0x89, 0xa2, 0xb2, 0x18, 0x4f, 0xd3, 0xbb, 0x60, 0xf7, 0x4d, 0x2b, 0x72, 0x55, 0xd1, 0xb3, 0x50, - 0x45, 0xb2, 0x39, 0x57, 0xd9, 0x90, 0x33, 0xd1, 0x27, 0x1a, 0xf9, 0x47, 0x45, 0xa5, 0xc8, 0xd6, - 0xa7, 0x2a, 0x38, 0x97, 0xba, 0xb6, 0x42, 0x8e, 0x45, 0x7f, 0xbe, 0xfe, 0xf8, 0x03, 0xd6, 0xf8, - 0x05, 0x35, 0xfa, 0xb8, 0x83, 0x96, 0x59, 0xbe, 0x02, 0xfc, 0x62, 0xd0, 0xfb, 0xa7, 0x1c, 0x06, - 0xa1, 0xea, 0x77, 0x43, 0xa5, 0xa4, 0x9f, 0x16, 0xba, 0x58, 0x67, 0xee, 0x2b, 0xa7, 0x05, 0x14, - 0x80, 0x24, 0x68, 0x4c, 0x21, 0xa7, 0x5a, 0x63, 0xc3, 0xe4, 0xfb, 0xcf, 0x1f, 0xde, 0xdb, 0x1e, - 0x73, 0xbd, 0x66, 0x87, 0xa3, 0x1c, 0x05, 0x3a, 0x57, 0xbc, 0x20, 0x70, 0xc3, 0x16, 0xbf, 0x2b, - 0x21, 0xe0, 0x14, 0x67, 0x31, 0x6e, 0x29, 0x40, 0x91, 0xcf, 0x72, 0xa9, 0xf1, 0x8c, 0x33, 0x5e, - 0x68, 0x34, 0x57, 0x35, 0x50, 0x23, 0x16, 0x18, 0x15, 0xe8, 0x02, 0x39, 0x4f, 0x6d, 0xd9, 0xf3, - 0x10, 0x12, 0xae, 0xed, 0x41, 0x12, 0xfb, 0x9c, 0x4e, 0x29, 0x9f, 0x49, 0x47, 0x6f, 0x3f, 0x16, - 0x12, 0x81, 0x5b, 0x7a, 0xb9, 0xd1, 0x82, 0xe7, 0x70, 0xdc, 0xd9, 0xa4, 0x04, 0x0e, 0xa0, 0xe4, - 0x46, 0x15, 0xd5, 0x02, 0x80, 0xc2, 0x52, 0xd0, 0x0e, 0x56, 0x01, 0x6d, 0xd5, 0xf3, 0x70, 0xa2, - 0x2a, 0xb8, 0x90, 0x8e, 0x53, 0xf2, 0xd0, 0xd3, 0x8c, 0x87, 0x53, 0x9f, 0x1f, 0x32, 0x9f, 0x2f, - 0xb1, 0x5e, 0x73, 0xdd, 0x15, 0xee, 0xd2, 0x98, 0x06, 0xea, 0x0a, 0xa7, 0x2d, 0xb0, 0x1b, 0x1a, - 0x19, 0x10, 0xd0, 0x3b, 0xed, 0x4e, 0x19, 0xa5, 0xdc, 0x3a, 0x5e, 0x39, 0x65, 0xab, 0xd3, 0x73, - 0xff, 0xd8, 0x08, 0x5d, 0xee, 0x00, 0x15, 0xe2, 0xba, 0x8c, 0xd1, 0xe5, 0x30, 0x1e, 0x1b, 0xd5, - 0xf5, 0xa3, 0xad, 0x8e, 0x26, 0x12, 0x8e, 0x87, 0x20, 0x1e, 0x65, 0x47, 0x2a, 0x04, 0x90, 0xdc, - 0xc1, 0xc3, 0xa4, 0xeb, 0xd9, 0x08, 0x70, 0x0e, 0xae, 0xc9, 0x7c, 0x09, 0x9e, 0x01, 0x55, 0x21, - 0x57, 0x93, 0x93, 0xf4, 0xce, 0x86, 0x32, 0x0b, 0xce, 0x9b, 0x48, 0xe7, 0x71, 0x3f, 0x11, 0x64, - 0x3c, 0xc6, 0x9b, 0x35, 0x3c, 0x9b, 0x72, 0xc8, 0x19, 0xa4, 0x28, 0x7e, 0x00, 0x7f, 0x8c, 0xe0, - 0xf4, 0xf7, 0x60, 0x1b, 0x57, 0xc7, 0x99, 0x93, 0x3e, 0x9a, 0xfd, 0x56, 0x81, 0xdc, 0x27, 0x39, - 0x60, 0x9f, 0x5c, 0xea, 0x7b, 0x3f, 0x17, 0x37, 0x72, 0x96, 0xbf, 0xe1, 0x0f, 0x0e, 0x77, 0x55, - 0x41, 0x6f, 0xe1, 0x31, 0x74, 0x4a, 0xd8, 0xbc, 0xa1, 0x94, 0x3e, 0xe0, 0x21, 0xf7, 0x1c, 0x98, - 0x93, 0x16, 0x0b, 0x48, 0x50, 0xb4, 0xd5, 0x01, 0x05, 0xbe, 0x59, 0x84, 0xba, 0x09, 0x6c, 0x2f, - 0xa3, 0xa1, 0x77, 0xe3, 0x9e, 0x50, 0xeb, 0x9f, 0xe9, 0x49, 0x78, 0x05, 0x6c, 0x63, 0x05, 0xa6, - 0x9e, 0x04, 0x08, 0xcc, 0x5a, 0xfc, 0xc5, 0xea, 0x22, 0xb2, 0xd5, 0x0e, 0x35, 0x71, 0xc8, 0x93, - 0x39, 0xc8, 0xae, 0xd7, 0x64, 0x6e, 0x12, 0xeb, 0x65, 0x61, 0xa7, 0x56, 0x11, 0x2c, 0xc0, 0x67, - 0x70, 0x8a, 0x47, 0xc5, 0x7c, 0xc9, 0xdf, 0x43, 0xd0, 0xcb, 0xe8, 0x7b, 0x7e, 0x4f, 0xc5, 0x25, - 0x01, 0xe7, 0x77, 0xdd, 0x45, 0xbd, 0xad, 0x72, 0x02, 0x1a, 0xc9, 0x6a, 0x49, 0xdb, 0xb7, 0x96, - 0x42, 0x86, 0x14, 0x85, 0x54, 0x2a, 0x35, 0x9b, 0x6d, 0xf0, 0xf4, 0x21, 0xca, 0x00, 0x96, 0x23, - 0x58, 0xed, 0xf1, 0xc6, 0xce, 0x42, 0xc1, 0xc9, 0xf4, 0xde, 0x1a, 0xd9, 0xcc, 0xbf, 0xc3, 0x84, - 0x88, 0xc6, 0xdb, 0xd0, 0xc2, 0xf4, 0xae, 0x6f, 0x75, 0x03, 0x0a, 0xc1, 0x73, 0x88, 0xee, 0x6c, - 0xdd, 0xee, 0xbe, 0xa2, 0x81, 0xba, 0x72, 0x69, 0xe9, 0x40, 0x37, 0xe4, 0xb0, 0x32, 0x73, 0xad, - 0x39, 0x7e, 0x29, 0xd7, 0xaa, 0x28, 0x94, 0xfd, 0xbd, 0x35, 0xdd, 0xb0, 0x0c, 0x49, 0x04, 0x64, - 0x70, 0x77, 0xf9, 0x94, 0xf6, 0xe6, 0x3e, 0xa6, 0xd6, 0x5d, 0x1f, 0x1b, 0x9e, 0x6d, 0x9e, 0xe5, - 0xbd, 0x4e, 0x65, 0x9f, 0x7a, 0x2f, 0x2a, 0x20, 0xcc, 0xc2, 0x55, 0x2c, 0x36, 0x77, 0x5a, 0xf6, - 0x70, 0x26, 0x25, 0x1c, 0x91, 0x77, 0x8d, 0xec, 0xfd, 0x7d, 0xbe, 0x09, 0x2d, 0x6d, 0xc9, 0x29, - 0xcb, 0x67, 0x52, 0x99, 0x6f, 0x09, 0x56, 0xa6, 0x26, 0x99, 0xb9, 0x1e, 0xe0, 0x44, 0xe3, 0x2f, - 0xe8, 0xbe, 0xe5, 0x52, 0x5e, 0x39, 0xf5, 0x96, 0x42, 0xf5, 0x8c, 0xc3, 0x34, 0xa9, 0x37, 0x34, - 0x7b, 0x06, 0xd6, 0x9a, 0x61, 0xc7, 0x5e, 0x81, 0xfa, 0xd2, 0x88, 0x6c, 0x42, 0xed, 0x86, 0xe5, - 0xb2, 0x36, 0xeb, 0xa1, 0x5a, 0x5f, 0xd1, 0x22, 0x4b, 0xe3, 0x2f, 0x4f, 0x29, 0x61, 0xc6, 0x95, - 0x0e, 0x6f, 0x94, 0xb0, 0xb6, 0x06, 0xcf, 0x16, 0xf8, 0xbc, 0x65, 0xbf, 0xc3, 0xad, 0x68, 0x99, - 0xd7, 0x8d, 0xd9, 0x1e, 0xcf, 0xce, 0x21, 0x22, 0xdd, 0x73, 0x91, 0x40, 0x93, 0xcd, 0xa6, 0x43, - 0xa8, 0x48, 0x6e, 0xc1, 0x9b, 0xe2, 0x6c, 0x96, 0xd0, 0xc2, 0xf0, 0x73, 0x55, 0x7e, 0x50, 0xde, - 0x0f, 0xa7, 0x01, 0xbc, 0x69, 0x6b, 0xf8, 0x9b, 0xfd, 0x9f, 0xff, 0xfe, 0x2f, 0xf6, 0x66, 0x3f, - 0xf8, 0x56, 0x54, 0x40, 0x1f, 0xd2, 0x64, 0x4f, 0x9a, 0xec, 0xff, 0xeb, 0x3f, 0xfe, 0xed, 0x5f, - 0x6d, 0xe8, 0xfa, 0xbb, 0xf8, 0xbb, 0xd5, 0xe2, 0xa2, 0xca, 0x74, 0x01, 0x69, 0x80, 0xe6, 0xb5, - 0x94, 0x22, 0x85, 0xfd, 0xa7, 0xe0, 0xde, 0xe9, 0xef, 0x80, 0x98, 0x7d, 0x6c, 0x23, 0xe6, 0x53, - 0xf2, 0xa0, 0x8f, 0x8e, 0xd1, 0xb1, 0xbb, 0x21, 0xe2, 0xae, 0x99, 0x3e, 0x00, 0x4d, 0x56, 0xfb, - 0xe0, 0x9c, 0x05, 0x0e, 0xcb, 0xf7, 0xf7, 0xdb, 0x2e, 0xc8, 0xf1, 0x2a, 0x75, 0x96, 0x42, 0x95, - 0x76, 0x11, 0x05, 0xda, 0x7d, 0x33, 0x2c, 0xea, 0x33, 0xdd, 0xa9, 0x7d, 0x45, 0xd0, 0xbf, 0x42, - 0xad, 0x2f, 0xff, 0x0c, 0x65, 0x3f, 0xc8, 0x5b, 0x32, 0x9f, 0xed, 0xef, 0xb7, 0x92, 0x38, 0x07, - 0x26, 0xcc, 0x6d, 0x5d, 0xc3, 0x34, 0xab, 0x31, 0x88, 0x0b, 0x65, 0xad, 0xc0, 0xf0, 0xee, 0xef, - 0xe3, 0xf0, 0x37, 0x88, 0x5d, 0xfe, 0x17, 0x3a, 0x2f, 0x60, 0x4c, 0x05, 0x7f, 0x25, 0x0d, 0x7d, - 0x19, 0x9f, 0x30, 0xfb, 0x43, 0x9d, 0xa0, 0x8a, 0xcf, 0x1b, 0x76, 0xeb, 0xab, 0xf4, 0x6d, 0x02, - 0xff, 0x60, 0xe5, 0xda, 0xac, 0x21, 0xc7, 0xd2, 0x69, 0xde, 0x83, 0xa3, 0x5f, 0x3d, 0x0b, 0x8e, - 0x88, 0x75, 0x94, 0xd2, 0x8c, 0x9f, 0xcc, 0x2f, 0x8f, 0x8f, 0x55, 0x22, 0xfa, 0x06, 0xea, 0x57, - 0x86, 0xa6, 0xbc, 0x96, 0x37, 0xb7, 0xcc, 0x8d, 0x1c, 0x13, 0x62, 0x96, 0x7a, 0x0e, 0xaf, 0xb0, - 0x64, 0x59, 0x5f, 0x68, 0xd7, 0xdc, 0x5a, 0x39, 0xae, 0x5e, 0xe5, 0xb2, 0x44, 0xca, 0xbc, 0x50, - 0xfd, 0x06, 0xac, 0x0c, 0x65, 0x85, 0x56, 0x39, 0xf3, 0xff, 0x04, 0xaf, 0xf5, 0x35, 0xab, 0xd8, - 0xcd, 0x23, 0xb9, 0xfa, 0x7e, 0xa1, 0x54, 0xdb, 0x1d, 0xf0, 0xc7, 0xc7, 0x32, 0x79, 0x94, 0x7d, - 0x80, 0x4e, 0xdb, 0xb6, 0xd1, 0x59, 0x56, 0xf0, 0x32, 0xc4, 0x15, 0x62, 0x19, 0xbf, 0x5b, 0x39, - 0x4c, 0xae, 0xd8, 0x14, 0xbf, 0xab, 0x2d, 0x0a, 0x68, 0xab, 0xcb, 0x31, 0x19, 0x05, 0x03, 0xa3, - 0x36, 0xcf, 0xd1, 0xe8, 0x0b, 0x73, 0xbf, 0x73, 0x11, 0x0c, 0x5c, 0x33, 0x20, 0x28, 0xbe, 0x30, - 0x74, 0x82, 0x7a, 0x16, 0x47, 0xfb, 0xaf, 0x05, 0xd7, 0xf9, 0x5c, 0xf3, 0x50, 0xf9, 0x5c, 0xc7, - 0x5c, 0xbc, 0xa7, 0xc5, 0x18, 0x14, 0x71, 0xcf, 0x70, 0x5b, 0x71, 0x71, 0xd9, 0xe9, 0x2c, 0xab, - 0x65, 0x60, 0x95, 0xf8, 0xe4, 0x3a, 0x54, 0x19, 0x59, 0x2e, 0x44, 0x51, 0x37, 0xea, 0x63, 0x53, - 0xa1, 0xd5, 0x17, 0x7f, 0x95, 0x96, 0x9a, 0x6f, 0xad, 0xa6, 0x2a, 0x02, 0x4b, 0xb2, 0x0c, 0xc9, - 0x88, 0x1e, 0xd6, 0xef, 0x67, 0x24, 0x94, 0x8b, 0x03, 0xd6, 0xc0, 0x3c, 0x5b, 0x49, 0xf9, 0x10, - 0x25, 0xe4, 0x6a, 0x35, 0x51, 0x81, 0x05, 0x35, 0x61, 0x4c, 0x4d, 0xf6, 0x2e, 0x17, 0x0d, 0x45, - 0xaa, 0x36, 0x7d, 0xa8, 0x3a, 0x50, 0xa1, 0x32, 0x35, 0xe9, 0x12, 0xec, 0x59, 0x46, 0x87, 0x68, - 0xaa, 0x5b, 0x24, 0x26, 0xa3, 0x9a, 0x57, 0xf8, 0x2c, 0x73, 0x7f, 0x55, 0x9f, 0x69, 0x59, 0xd8, - 0xac, 0x1a, 0x4a, 0x19, 0x98, 0xb2, 0x4d, 0xbb, 0x2c, 0x1a, 0x1a, 0xb2, 0xcc, 0x88, 0xde, 0xe1, - 0xba, 0xdf, 0xd5, 0xdb, 0x82, 0xf7, 0x2a, 0xb0, 0xb4, 0x27, 0x76, 0x51, 0xbf, 0x14, 0x60, 0x35, - 0xb9, 0x81, 0xa9, 0xf9, 0x5a, 0x00, 0x86, 0xa2, 0x6a, 0xdc, 0xd4, 0x6a, 0x2d, 0x96, 0xef, 0x12, - 0x38, 0xa6, 0x4a, 0x6b, 0x84, 0xc7, 0x49, 0x75, 0x4e, 0xad, 0xc2, 0x76, 0x33, 0xd0, 0x53, 0x15, - 0x7f, 0x9f, 0x77, 0x1a, 0x9d, 0xc3, 0x69, 0x74, 0xb7, 0x7d, 0xe9, 0xc1, 0xa2, 0x5f, 0xf1, 0xce, - 0x23, 0xec, 0x76, 0xff, 0xb0, 0xd8, 0x76, 0x91, 0xb1, 0x54, 0xef, 0x51, 0x7e, 0x85, 0xd0, 0xa3, - 0x8e, 0xf9, 0x05, 0x64, 0x41, 0x36, 0x4e, 0x47, 0x73, 0xd0, 0xa1, 0x1d, 0xc2, 0x1a, 0xfa, 0x29, - 0x14, 0xd4, 0x65, 0x46, 0x01, 0xb6, 0xe4, 0xc8, 0xc7, 0xc7, 0x3f, 0x2d, 0xec, 0x3b, 0x3b, 0x94, - 0x62, 0x46, 0x97, 0x7f, 0x6a, 0xac, 0xa9, 0x2e, 0x39, 0x74, 0x7a, 0x63, 0x98, 0xde, 0xd8, 0x0d, - 0x96, 0xcd, 0x80, 0x93, 0xc6, 0xbf, 0x95, 0xe1, 0x58, 0x7b, 0x72, 0x5d, 0xa6, 0x6d, 0x9c, 0x6f, - 0x36, 0xf9, 0x29, 0x0e, 0x65, 0x91, 0xf5, 0xb7, 0xc9, 0xaf, 0x2b, 0xf2, 0xbf, 0x61, 0x7e, 0x79, - 0x0c, 0xaa, 0x2e, 0xdb, 0x6c, 0x0d, 0x2e, 0x64, 0x5a, 0xb4, 0x54, 0xf4, 0xf2, 0x57, 0xb6, 0x1d, - 0xd2, 0xd2, 0xf9, 0x9c, 0xee, 0xcd, 0x2f, 0x3f, 0xff, 0xf3, 0x6d, 0x77, 0xec, 0xd9, 0x96, 0xed, - 0xd6, 0xbd, 0xce, 0x3f, 0xfd, 0x72, 0xbf, 0xe8, 0x2d, 0xdd, 0x47, 0xe7, 0x97, 0xa2, 0xa3, 0x9b, - 0x40, 0x03, 0xd5, 0x0e, 0x3a, 0xc9, 0x4f, 0xe0, 0xce, 0xe5, 0xe9, 0x4c, 0x5d, 0x96, 0xe3, 0x01, - 0xf9, 0x5a, 0xc4, 0x57, 0x8d, 0x17, 0xcf, 0xad, 0xdb, 0xb6, 0x45, 0x79, 0x11, 0xd9, 0x8e, 0xee, - 0xaf, 0xb3, 0xcc, 0xb1, 0xeb, 0xef, 0x4d, 0x2c, 0xf3, 0x75, 0x05, 0xe8, 0x01, 0x01, 0xe7, 0x8a, - 0xc4, 0x93, 0xe6, 0xed, 0x82, 0xbb, 0xd8, 0x54, 0xe6, 0xa1, 0x64, 0xfc, 0x18, 0xa3, 0xbc, 0xaa, - 0x7b, 0x0b, 0xcf, 0x1f, 0xe1, 0xd9, 0xf5, 0xb6, 0x51, 0x43, 0x47, 0x9b, 0xfc, 0x0a, 0x3b, 0xb6, - 0xd3, 0x67, 0x94, 0xdc, 0xd1, 0x26, 0xfd, 0x7b, 0xec, 0xd8, 0x46, 0xcf, 0xf3, 0x9a, 0x94, 0xe7, - 0xaa, 0xf8, 0x2b, 0x0f, 0xf9, 0x50, 0xd1, 0xb6, 0x37, 0xba, 0xea, 0xfd, 0x56, 0x78, 0x30, 0xf0, - 0x6c, 0xc1, 0xa6, 0xba, 0x49, 0x50, 0x05, 0xe7, 0xba, 0x98, 0xa7, 0xf0, 0x2b, 0xa0, 0x32, 0x97, - 0xcd, 0x15, 0xe2, 0xb7, 0x5f, 0x72, 0x3b, 0x22, 0xff, 0x9f, 0xf0, 0x46, 0xfe, 0x49, 0x9b, 0x7b, - 0xf2, 0xad, 0x7b, 0xb3, 0x72, 0xe7, 0x5c, 0xad, 0x1c, 0xb1, 0x92, 0x93, 0xb4, 0x30, 0xc1, 0xcf, - 0xbc, 0x60, 0x8a, 0xec, 0xc0, 0x3f, 0xb6, 0xbd, 0xca, 0xd4, 0x23, 0x24, 0x31, 0x77, 0x9f, 0x9f, - 0xf1, 0x95, 0xd4, 0x88, 0x0a, 0x9f, 0x8e, 0x46, 0xb0, 0x75, 0xb0, 0x71, 0x90, 0x40, 0x92, 0xc8, - 0xc6, 0x62, 0xc0, 0x5e, 0xa5, 0x41, 0x17, 0x87, 0x67, 0x7d, 0xe0, 0xe8, 0xe2, 0x2d, 0xa3, 0xed, - 0x29, 0x71, 0x55, 0x12, 0xc5, 0x7b, 0xaf, 0xb5, 0xcb, 0xee, 0x4a, 0x3d, 0x4d, 0xed, 0xd1, 0x15, - 0xbe, 0xee, 0xd3, 0x72, 0xc0, 0xaf, 0x53, 0x56, 0x0a, 0x4a, 0x5a, 0x29, 0x00, 0xb5, 0xd4, 0xdc, - 0x61, 0xb9, 0xda, 0x50, 0x56, 0x56, 0xde, 0x83, 0x75, 0xff, 0xdd, 0x26, 0x4a, 0xf5, 0x05, 0x14, - 0xee, 0x48, 0x59, 0x27, 0xd9, 0xca, 0x94, 0x94, 0x97, 0xfc, 0x0f, 0x45, 0x88, 0x27, 0x44, 0x6c, - 0xda, 0x6f, 0xb0, 0x16, 0x9c, 0xb7, 0x05, 0xee, 0x2b, 0x34, 0x2d, 0x0d, 0x36, 0xbe, 0xc0, 0x6d, - 0xe3, 0x84, 0xfd, 0x1b, 0x79, 0xa2, 0x3b, 0x34, 0x5e, 0x76, 0x50, 0x55, 0xfb, 0xc2, 0xca, 0xde, - 0xd2, 0x11, 0x99, 0x65, 0xd2, 0x71, 0xbd, 0xe6, 0x27, 0x22, 0x2b, 0x7e, 0x51, 0xd9, 0x5e, 0xbd, - 0x10, 0x7c, 0x2b, 0x59, 0xae, 0x62, 0xc3, 0x34, 0xe5, 0x1e, 0x1b, 0xa6, 0xad, 0xac, 0x7f, 0x6d, - 0x26, 0xcf, 0x4d, 0xc6, 0xc7, 0xdd, 0xe6, 0xf9, 0x27, 0xe8, 0x20, 0x63, 0x95, 0xa6, 0xf1, 0xed, - 0x48, 0x69, 0xe5, 0xbb, 0x91, 0xb2, 0xf3, 0x2d, 0x10, 0xa1, 0x47, 0x55, 0xa4, 0x5b, 0xcc, 0x72, - 0xa0, 0x5f, 0xfc, 0xb2, 0xa8, 0x22, 0x04, 0x25, 0x39, 0xa3, 0x58, 0xf4, 0x3b, 0xbb, 0x50, 0x29, - 0x57, 0x21, 0x8a, 0xad, 0x83, 0x0c, 0x5d, 0xc6, 0x62, 0xeb, 0x6b, 0x81, 0xf2, 0x9a, 0x78, 0xf5, - 0x82, 0x1f, 0xba, 0x01, 0x2a, 0xdb, 0xcc, 0x68, 0xd7, 0xa0, 0x6e, 0xa8, 0x3a, 0xb7, 0x7f, 0x33, - 0xa4, 0x86, 0x9b, 0x9f, 0x0d, 0xd5, 0xeb, 0x2a, 0x91, 0x6c, 0x7c, 0xe0, 0xb3, 0xfe, 0xc6, 0xcd, - 0xda, 0x29, 0x44, 0x1c, 0x99, 0xb7, 0x3d, 0xdd, 0x6e, 0x9c, 0xb0, 0xdf, 0x70, 0x33, 0xf8, 0x2c, - 0x19, 0x65, 0x20, 0x14, 0x4f, 0x21, 0x5d, 0xf2, 0x1b, 0x79, 0xe8, 0x66, 0xe9, 0xb0, 0xe8, 0xca, - 0x89, 0xa0, 0x14, 0xca, 0xb5, 0xae, 0xe8, 0xf5, 0xcf, 0xcc, 0xd3, 0x34, 0x65, 0xd0, 0x63, 0x5b, - 0x3b, 0x70, 0xf8, 0x3f, 0xc4, 0xb7, 0x31, 0xf6, 0xd9, 0xe9, 0x71, 0x10, 0xd8, 0x17, 0x0d, 0x59, - 0x5d, 0xf3, 0x89, 0x2e, 0x56, 0xef, 0x16, 0x67, 0x19, 0x27, 0x10, 0x64, 0xca, 0x37, 0x5d, 0xf8, - 0xf5, 0xed, 0xa4, 0x77, 0xb1, 0xb3, 0xed, 0xcb, 0x5d, 0x18, 0xb3, 0xce, 0x93, 0xf4, 0xce, 0x52, - 0x36, 0x12, 0xd9, 0x95, 0x57, 0xd9, 0xa6, 0x1f, 0x3f, 0xb0, 0xd2, 0xd8, 0x06, 0xa0, 0x46, 0x45, - 0xa5, 0xc0, 0x46, 0xe1, 0x40, 0xb3, 0x46, 0xd9, 0xb3, 0xad, 0xa7, 0x08, 0x77, 0x6a, 0xca, 0xfe, - 0xd3, 0x94, 0x35, 0xe1, 0xd1, 0x56, 0xc2, 0x9d, 0xf5, 0x09, 0xba, 0x4e, 0xbd, 0xd8, 0xdf, 0x7b, - 0xf9, 0xe2, 0x65, 0x30, 0x28, 0xc7, 0xbb, 0x08, 0x90, 0xc2, 0x0b, 0xbf, 0x6c, 0xfe, 0x6f, 0x49, - 0xc0, 0x81, 0xe0, 0xf0, 0x2c, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x3b, 0xed, 0x72, 0xdb, 0x38, + 0x92, 0xff, 0xf3, 0x14, 0x0c, 0xbd, 0xeb, 0x25, 0x2d, 0x8a, 0xa2, 0x64, 0x3b, 0x1f, 0x94, 0xe9, + 0x54, 0xe2, 0x78, 0x67, 0xb2, 0x95, 0x4c, 0x52, 0xe3, 0xcc, 0x4e, 0x5d, 0x79, 0x7c, 0x37, 0x10, + 0x09, 0x49, 0x9c, 0x50, 0x00, 0x17, 0x84, 0x6c, 0x6b, 0x14, 0xfd, 0xbc, 0x07, 0xb8, 0xdf, 0xbb, + 0x55, 0xf7, 0x6e, 0xf7, 0x04, 0xf7, 0x08, 0xd7, 0x0d, 0x80, 0x9f, 0x92, 0x3c, 0xc9, 0xee, 0x5d, + 0xdd, 0xd6, 0x54, 0x64, 0x10, 0x68, 0x74, 0x37, 0xfa, 0xbb, 0x41, 0xce, 0xd9, 0xe3, 0xd7, 0xef, + 0x2f, 0x3e, 0xfe, 0xcb, 0x87, 0x4b, 0x6b, 0x2e, 0x17, 0xd9, 0xb9, 0x75, 0x56, 0xfe, 0xa1, 0x24, + 0x81, 0x3f, 0x32, 0x95, 0x19, 0x3d, 0xbf, 0x92, 0x44, 0xbc, 0xe3, 0x89, 0x35, 0x59, 0x59, 0xef, + 0x38, 0x67, 0x30, 0x5c, 0x66, 0xb4, 0x38, 0x1b, 0xe8, 0x55, 0xeb, 0x6c, 0x41, 0x25, 0xb1, 0x1e, + 0xc5, 0x73, 0x22, 0x0a, 0x2a, 0x23, 0x7b, 0x29, 0xa7, 0xfd, 0x67, 0x36, 0xcc, 0x17, 0x72, 0x05, + 0xeb, 0x8f, 0x32, 0x32, 0xa1, 0xd9, 0x7a, 0x41, 0xc4, 0x2c, 0x65, 0x7d, 0x91, 0xce, 0xe6, 0x32, + 0x7c, 0x92, 0xdf, 0x6f, 0x62, 0xbe, 0x58, 0x50, 0x26, 0xd7, 0x53, 0xce, 0x64, 0xbf, 0x48, 0x7f, + 0xa5, 0xe1, 0x30, 0xc8, 0xef, 0xc7, 0xfa, 0x11, 0x77, 0x86, 0xa9, 0x24, 0x59, 0x1a, 0x8f, 0xcd, + 0xce, 0x8c, 0x4e, 0xf5, 0x46, 0x49, 0xef, 0xbb, 0xbb, 0x36, 0xbe, 0x24, 0x93, 0x8c, 0xea, 0x7d, + 0x7a, 0x6d, 0x4a, 0x16, 0x69, 0xb6, 0x0a, 0x5f, 0x8a, 0x94, 0x64, 0xde, 0xb7, 0x34, 0xbb, 0xa5, + 0x32, 0x8d, 0x89, 0x57, 0x10, 0x56, 0xf4, 0x0b, 0x2a, 0xd2, 0xe9, 0x78, 0xc2, 0x45, 0x42, 0x45, + 0x3f, 0xe6, 0x59, 0x46, 0xf2, 0x82, 0x86, 0xe5, 0x60, 0x7c, 0x97, 0x26, 0x72, 0x0e, 0x78, 0x83, + 0xdf, 0x97, 0x30, 0x82, 0x24, 0xe9, 0xb2, 0x08, 0xfd, 0x53, 0xba, 0x68, 0x91, 0xb2, 0x64, 0xe2, + 0xb5, 0x9f, 0xe7, 0x6b, 0xbd, 0x25, 0x1c, 0xe6, 0xf7, 0x56, 0xc1, 0xb3, 0x34, 0xb1, 0x0e, 0x82, + 0x20, 0x18, 0xe7, 0x24, 0x49, 0x52, 0x36, 0x53, 0x07, 0x68, 0xef, 0x10, 0x21, 0x93, 0xf3, 0x7e, + 0x3c, 0x4f, 0xb3, 0xc4, 0xa1, 0xb7, 0x94, 0xb9, 0xeb, 0x09, 0x89, 0x3f, 0xcd, 0x04, 0x5f, 0xb2, + 0x04, 0x99, 0xe3, 0x22, 0x3c, 0x98, 0x8e, 0xf0, 0xbf, 0xad, 0x8d, 0x73, 0x7e, 0x4b, 0xc5, 0x0e, + 0xf0, 0x24, 0x49, 0x36, 0x5d, 0xb6, 0x50, 0x6a, 0x7d, 0x90, 0xe7, 0x8c, 0x85, 0x28, 0xc9, 0xf1, + 0xf6, 0xae, 0x27, 0x4f, 0xf1, 0xbf, 0x71, 0x49, 0x72, 0x3a, 0xdd, 0xf8, 0x31, 0x48, 0x92, 0xa4, + 0x0c, 0x88, 0x24, 0x69, 0x91, 0x67, 0x64, 0x15, 0xce, 0x44, 0x9a, 0x8c, 0xf1, 0xa7, 0x2f, 0xe9, + 0x02, 0x66, 0x24, 0xc5, 0xed, 0xcb, 0x05, 0x2b, 0x42, 0x41, 0x73, 0x4a, 0xa4, 0x73, 0xe2, 0x0d, + 0xa7, 0xc2, 0xdd, 0xf8, 0x13, 0x7e, 0x5f, 0xca, 0xe2, 0xb8, 0x96, 0xc5, 0x93, 0x27, 0x4f, 0xc6, + 0x3b, 0x19, 0xde, 0x21, 0xea, 0x4a, 0x68, 0xca, 0x30, 0xb4, 0x19, 0xe8, 0x71, 0xbc, 0x14, 0x05, + 0xec, 0x5b, 0xc0, 0xf9, 0x15, 0xa1, 0xbd, 0x92, 0x08, 0x82, 0x89, 0x39, 0x08, 0xf2, 0xb8, 0x8f, + 0x9f, 0xdf, 0xa0, 0xdc, 0xa5, 0xe6, 0x23, 0x31, 0xcf, 0xe0, 0xf4, 0x35, 0xe5, 0x1a, 0x71, 0xc2, + 0xa5, 0xa4, 0x1a, 0xf3, 0x26, 0x14, 0x9c, 0xcb, 0x75, 0xbf, 0x1f, 0xf7, 0x87, 0xe1, 0xc1, 0x70, + 0x38, 0x1c, 0xe3, 0x70, 0xaa, 0x84, 0xab, 0x86, 0xa3, 0xf0, 0x60, 0x34, 0x1a, 0xa9, 0xe1, 0x71, + 0x78, 0x70, 0x7c, 0x7c, 0xac, 0x86, 0x27, 0xe1, 0xc1, 0xc9, 0xc9, 0x89, 0x1a, 0x9e, 0x86, 0x07, + 0xa7, 0xa7, 0xa7, 0x6a, 0xf8, 0x24, 0x54, 0xcc, 0xe2, 0xf0, 0x59, 0x78, 0xf0, 0xec, 0xd9, 0x33, + 0x35, 0x9c, 0x84, 0x07, 0x93, 0xc9, 0x44, 0x0d, 0xe3, 0xf0, 0x20, 0x8e, 0x63, 0x35, 0xa4, 0xe1, + 0x01, 0xa5, 0x54, 0x0d, 0x13, 0x2d, 0x5d, 0x1c, 0x82, 0x3c, 0xe2, 0x63, 0x4d, 0x6d, 0x06, 0x84, + 0x63, 0xcd, 0x4e, 0x06, 0xd4, 0x9e, 0x11, 0x35, 0x5c, 0x85, 0x07, 0xe4, 0x79, 0x00, 0x43, 0x09, + 0x78, 0x03, 0x5f, 0xd3, 0xe5, 0xa1, 0x98, 0x4d, 0x88, 0x73, 0x7c, 0xe2, 0x59, 0xe5, 0xbf, 0xc0, + 0x7f, 0xee, 0xaa, 0x35, 0x39, 0xd9, 0x5e, 0xbc, 0x25, 0xc2, 0x51, 0x18, 0xdc, 0x12, 0x86, 0x68, + 0xa0, 0x61, 0x30, 0xf2, 0xac, 0xfa, 0x67, 0x1b, 0x6e, 0xae, 0xe1, 0x4e, 0x87, 0x9e, 0x55, 0xfe, + 0x6b, 0x03, 0x81, 0x57, 0x3e, 0x45, 0x85, 0xc0, 0x28, 0x2f, 0x47, 0xb0, 0xeb, 0xc9, 0xb1, 0x9e, + 0x9b, 0xe4, 0xe1, 0xf0, 0x04, 0x34, 0xa0, 0x7f, 0x02, 0x33, 0x42, 0x18, 0x58, 0x79, 0x0e, 0x8f, + 0x81, 0xf5, 0x14, 0x7f, 0xd5, 0xae, 0x24, 0x64, 0x9c, 0xa1, 0x88, 0x8a, 0x59, 0x1e, 0xda, 0x93, + 0x8c, 0xc7, 0x9f, 0x6c, 0x5c, 0x58, 0xc8, 0x10, 0x03, 0xca, 0x01, 0x98, 0x3e, 0x4b, 0x59, 0xb2, + 0xce, 0x79, 0x91, 0xca, 0x94, 0xb3, 0x70, 0x9a, 0xde, 0x53, 0xb4, 0x52, 0x29, 0xf9, 0x22, 0x8c, + 0x49, 0x16, 0x3b, 0x9a, 0xb9, 0xc9, 0xdc, 0xb5, 0x7a, 0xd6, 0x69, 0x7e, 0xef, 0x8e, 0x55, 0x88, + 0x42, 0x92, 0xa5, 0xf9, 0xc0, 0x6c, 0xc7, 0xba, 0xd4, 0xcc, 0x96, 0x99, 0xa2, 0xd4, 0x7f, 0xed, + 0x03, 0x39, 0x7a, 0x1f, 0xf6, 0x47, 0x9b, 0x47, 0x67, 0x03, 0x1d, 0x3b, 0x21, 0x86, 0xc6, 0x22, + 0xcd, 0xe5, 0xf9, 0x23, 0xa0, 0x65, 0xe5, 0x82, 0xde, 0xa6, 0x7c, 0x59, 0xfc, 0x71, 0xc9, 0x62, + 0x64, 0xc9, 0x13, 0x14, 0x76, 0x08, 0x2a, 0x22, 0xb6, 0xcc, 0x32, 0xaf, 0x88, 0x29, 0xa3, 0x7a, + 0x18, 0x93, 0x05, 0x15, 0x44, 0x8d, 0xc7, 0x53, 0x03, 0x6d, 0x2d, 0x21, 0xec, 0xc1, 0x56, 0x87, + 0x7a, 0x10, 0x63, 0xd2, 0xa9, 0x63, 0xe7, 0xb7, 0x29, 0xbd, 0xb3, 0xa3, 0x88, 0xba, 0xeb, 0x8c, + 0x4a, 0x0b, 0xf6, 0xd2, 0x3b, 0xeb, 0x87, 0x94, 0xc9, 0x67, 0x2f, 0x85, 0x20, 0x2b, 0x87, 0xb9, + 0x5e, 0x1a, 0xcd, 0xde, 0x24, 0x25, 0xa4, 0xeb, 0x89, 0x28, 0xf5, 0x73, 0x02, 0x64, 0xe5, 0x77, + 0x3c, 0xa1, 0xfe, 0x5f, 0x96, 0x54, 0xac, 0xae, 0x68, 0x46, 0x63, 0xc9, 0x85, 0x63, 0x1f, 0x28, + 0xb0, 0xe3, 0xd7, 0xb6, 0x3b, 0x16, 0x54, 0x2e, 0x05, 0xb3, 0x86, 0x80, 0xfc, 0x7a, 0x74, 0xf3, + 0xc2, 0x11, 0x87, 0x87, 0x8e, 0xf0, 0xe7, 0x69, 0x92, 0x50, 0x16, 0x3d, 0x0e, 0x00, 0x71, 0xf5, + 0x30, 0xf4, 0xd4, 0xb9, 0xe8, 0xdd, 0xe8, 0xb5, 0x93, 0x7a, 0xd4, 0x75, 0x43, 0xa7, 0x5e, 0x0c, + 0x3c, 0xf1, 0xf9, 0xb3, 0x23, 0xa2, 0xf8, 0xd2, 0xb1, 0x63, 0xc2, 0x6e, 0x49, 0x81, 0x5c, 0xf8, + 0x69, 0x12, 0xd9, 0x25, 0x31, 0xaf, 0xc5, 0x52, 0xca, 0xe0, 0x94, 0xf2, 0x15, 0x9d, 0x72, 0x41, + 0x1d, 0x01, 0x6b, 0x0c, 0xe2, 0xde, 0x55, 0x3a, 0xc9, 0x40, 0x1d, 0x2e, 0x6c, 0x6d, 0xf1, 0x31, + 0x74, 0x4b, 0xda, 0xc7, 0xaf, 0x01, 0x18, 0x68, 0x7b, 0x8f, 0x83, 0x0d, 0x8a, 0x66, 0xc2, 0x89, + 0x48, 0x1e, 0x14, 0xcd, 0xd8, 0xec, 0x7c, 0x85, 0x90, 0x8e, 0x92, 0x92, 0xde, 0xe4, 0x02, 0x9e, + 0x8d, 0x3e, 0xff, 0xe3, 0xe1, 0xa6, 0x92, 0x7e, 0x7d, 0x48, 0x25, 0x7f, 0xc4, 0x9a, 0x46, 0xd4, + 0x9f, 0x51, 0x79, 0x01, 0x41, 0x16, 0x98, 0x74, 0xec, 0x51, 0xa2, 0x44, 0x7c, 0x32, 0x06, 0x0e, + 0x52, 0x3f, 0xce, 0x28, 0x11, 0xdf, 0x83, 0x68, 0x9d, 0xc0, 0x0b, 0x3c, 0xea, 0xab, 0xac, 0x04, + 0x7f, 0xe7, 0x14, 0x53, 0xa8, 0xeb, 0xfd, 0x52, 0x70, 0xf6, 0x67, 0x92, 0x2d, 0x69, 0xe1, 0x2b, + 0x51, 0x68, 0x9c, 0x45, 0xf4, 0x8e, 0xc8, 0xb9, 0xbf, 0x48, 0x41, 0xcf, 0x7a, 0xcb, 0xa0, 0x0b, + 0xd8, 0xc1, 0xb4, 0xbd, 0x5e, 0x52, 0x90, 0x1a, 0xd7, 0x34, 0xe3, 0xa0, 0xdd, 0x12, 0x5d, 0xbf, + 0x38, 0xda, 0x8d, 0xd0, 0x1d, 0x8c, 0x5c, 0xe4, 0x7c, 0x6b, 0x35, 0xa3, 0x49, 0xe1, 0x82, 0x3e, + 0xd0, 0x5f, 0x2c, 0x62, 0xf1, 0xa9, 0xb5, 0x1b, 0x84, 0x5d, 0x8b, 0x9b, 0x1e, 0xfc, 0xf4, 0x86, + 0xfa, 0xcf, 0xe8, 0xe6, 0x7c, 0x14, 0x80, 0xbe, 0x52, 0x7f, 0x9a, 0x66, 0xd9, 0x15, 0x3a, 0x44, + 0xf4, 0x33, 0x44, 0x08, 0xe7, 0x77, 0x6b, 0x04, 0xdd, 0x78, 0xea, 0x2f, 0x40, 0x97, 0xa3, 0xd1, + 0xcd, 0xc6, 0xfd, 0x19, 0x54, 0x3e, 0xa1, 0x90, 0x28, 0x3e, 0x00, 0xeb, 0x0e, 0xda, 0x19, 0x11, + 0xb1, 0x43, 0xae, 0x83, 0x9b, 0xa3, 0x7d, 0x8c, 0x6f, 0x0b, 0x00, 0xeb, 0x8a, 0x9e, 0xf4, 0xc8, + 0xf5, 0x70, 0xe7, 0xae, 0x7d, 0x72, 0xc3, 0x6d, 0x9e, 0x7f, 0x72, 0x54, 0x80, 0xbe, 0x46, 0x47, + 0x4a, 0x76, 0x1f, 0xde, 0x20, 0x0b, 0xc8, 0xbf, 0x83, 0xd6, 0xd7, 0x8b, 0x8e, 0xc7, 0x34, 0x2b, + 0xa8, 0x05, 0xd1, 0x05, 0x12, 0x10, 0xf5, 0x33, 0x3e, 0x03, 0xef, 0x2a, 0x4d, 0xc3, 0x5a, 0xb2, + 0x4f, 0x8c, 0xdf, 0x31, 0x25, 0x20, 0x7b, 0x5b, 0xc3, 0x5b, 0x33, 0xca, 0xc3, 0x37, 0x88, 0x51, + 0x29, 0x1f, 0x3c, 0x1e, 0x0e, 0xea, 0x15, 0xf0, 0x67, 0x78, 0x53, 0xaa, 0xaf, 0x69, 0x0a, 0xa4, + 0xd6, 0x7a, 0xe1, 0x7a, 0xd9, 0x4e, 0xfd, 0xca, 0x23, 0xa2, 0x54, 0x89, 0x1a, 0x5b, 0x45, 0x90, + 0x04, 0x56, 0x67, 0xc5, 0x78, 0xd5, 0xeb, 0x29, 0x15, 0xde, 0xe3, 0xc4, 0xfd, 0x19, 0x19, 0xdf, + 0xc3, 0xc4, 0xff, 0xa1, 0xc2, 0xee, 0x8f, 0x64, 0x2f, 0xf3, 0x56, 0x47, 0x12, 0xe5, 0x29, 0x1f, + 0x92, 0xe7, 0x66, 0xcb, 0xc5, 0x8e, 0x5b, 0x2e, 0xa6, 0x24, 0x22, 0xb4, 0x44, 0x50, 0x3e, 0xa3, + 0x1b, 0x34, 0xd2, 0xc7, 0x65, 0xe8, 0x74, 0xe1, 0xc1, 0xa9, 0xe3, 0x28, 0x78, 0xf9, 0xc7, 0x6f, + 0xbf, 0xbf, 0xbc, 0xf4, 0x7f, 0xa4, 0x93, 0x6f, 0xde, 0x7e, 0x6f, 0xe6, 0x9d, 0xb5, 0x8e, 0x3d, + 0x21, 0xf5, 0x08, 0x93, 0x50, 0x50, 0xa6, 0x30, 0x86, 0xd8, 0x44, 0xb2, 0x7c, 0x4e, 0x60, 0xb0, + 0x71, 0x5d, 0x1f, 0x4a, 0xdf, 0x0b, 0xf4, 0xd8, 0x97, 0x38, 0xe7, 0x40, 0x84, 0x2b, 0x91, 0x56, + 0x2b, 0x17, 0x18, 0xeb, 0xd1, 0x99, 0xdb, 0x6b, 0x57, 0x60, 0x35, 0xce, 0x71, 0x10, 0x78, 0xc3, + 0x53, 0x58, 0x71, 0xca, 0xd0, 0x5d, 0x71, 0xf2, 0x81, 0x8a, 0x22, 0x87, 0x30, 0x90, 0xde, 0xd2, + 0x0b, 0xb5, 0xe6, 0x9c, 0x9c, 0x7a, 0x23, 0x6f, 0xe8, 0x9d, 0x06, 0x01, 0xd0, 0x2d, 0xf3, 0x13, + 0xa2, 0x52, 0x91, 0xe2, 0xe9, 0xa9, 0x6b, 0xe2, 0x3f, 0x58, 0x17, 0xff, 0xf4, 0x52, 0xcf, 0x22, + 0x6a, 0x93, 0x20, 0x2a, 0xcc, 0x57, 0xf8, 0xec, 0xfa, 0x75, 0x3a, 0xd2, 0xc9, 0x63, 0x3b, 0xb0, + 0xa0, 0xe3, 0x16, 0x51, 0xdf, 0x99, 0x47, 0xa7, 0xee, 0x91, 0xb3, 0xdb, 0x8b, 0xfa, 0x43, 0xb0, + 0x1a, 0xb0, 0xb9, 0xfe, 0x7c, 0x07, 0x84, 0xb6, 0x39, 0x0d, 0x92, 0xed, 0x06, 0x49, 0x68, 0x6e, + 0x90, 0xa0, 0x7e, 0x5a, 0xfe, 0x71, 0xfc, 0xba, 0x11, 0x31, 0xbe, 0xc4, 0x2d, 0xda, 0x21, 0x87, + 0x43, 0xc8, 0x69, 0x21, 0xdc, 0x0d, 0xbe, 0x07, 0x8b, 0xbb, 0xc6, 0xad, 0x65, 0x0a, 0x30, 0x82, + 0xcb, 0xe7, 0xa0, 0xbd, 0x6f, 0x28, 0x87, 0xce, 0x47, 0xac, 0x9c, 0xa1, 0x77, 0x0c, 0xfa, 0x78, + 0xe2, 0x7a, 0xac, 0x01, 0xf3, 0x8e, 0x16, 0xf3, 0x57, 0xa4, 0x48, 0x63, 0xb0, 0x5b, 0x8a, 0x4d, + 0x88, 0xb3, 0x96, 0x02, 0x9a, 0x0f, 0x9d, 0xab, 0xd0, 0x7a, 0x78, 0x4e, 0xe2, 0x54, 0xae, 0xa0, + 0xe0, 0xdc, 0x60, 0xa2, 0x6d, 0x6f, 0x55, 0x26, 0x3c, 0x4e, 0xdb, 0xea, 0x2d, 0x7a, 0xf3, 0x23, + 0x8e, 0xf6, 0x2c, 0xd5, 0x00, 0x2c, 0x3a, 0x53, 0x83, 0xd1, 0x8d, 0xab, 0xb3, 0xbf, 0x0f, 0x75, + 0x87, 0x93, 0xba, 0x1b, 0x1d, 0x12, 0x6a, 0x95, 0xa5, 0x4d, 0xed, 0x88, 0xa6, 0x1e, 0x88, 0x16, + 0x79, 0x29, 0xab, 0xb9, 0x77, 0x17, 0x05, 0xe3, 0xbb, 0xb3, 0x74, 0x7c, 0x67, 0x3c, 0x1e, 0x67, + 0x13, 0x98, 0x4b, 0xce, 0xc4, 0x38, 0x69, 0xcc, 0xc5, 0x30, 0x17, 0x43, 0x20, 0x88, 0x61, 0xee, + 0x9f, 0x4c, 0x44, 0x77, 0x4a, 0x3e, 0x89, 0x12, 0x4e, 0xdc, 0x95, 0x8c, 0x2a, 0xa4, 0xa2, 0xa1, + 0x3a, 0x71, 0xf7, 0xac, 0xdd, 0x73, 0x36, 0xcf, 0x98, 0x9f, 0x69, 0x3c, 0xaa, 0x51, 0x03, 0xfe, + 0xc0, 0x3a, 0xd8, 0x4c, 0xce, 0x21, 0xdc, 0xb5, 0xe7, 0xaf, 0xf3, 0x1b, 0xff, 0x36, 0x2d, 0xa0, + 0xe2, 0x00, 0x71, 0x5c, 0x1f, 0x1f, 0xe5, 0xbd, 0x13, 0x8c, 0x8e, 0x6a, 0xa0, 0x03, 0xa5, 0x1e, + 0x42, 0xb0, 0x1c, 0x06, 0xde, 0xde, 0xbd, 0x3b, 0xf1, 0x2e, 0x8c, 0x9c, 0x7c, 0x55, 0x36, 0x36, + 0xc4, 0xa1, 0x43, 0x8b, 0x6d, 0x97, 0xd8, 0x6f, 0x06, 0xa3, 0xd3, 0x53, 0xaf, 0x7e, 0x06, 0xc2, + 0xdd, 0x99, 0x91, 0x9a, 0x71, 0x21, 0x8a, 0xe6, 0xbd, 0xde, 0x58, 0xd3, 0x12, 0x5c, 0x12, 0x25, + 0xc9, 0xfb, 0x5e, 0xe4, 0x07, 0x43, 0xaf, 0x33, 0xbb, 0xd2, 0xb3, 0x55, 0xf0, 0xd2, 0x03, 0xcd, + 0xa7, 0x09, 0x39, 0xee, 0x56, 0x34, 0xd6, 0xf5, 0xd1, 0x6f, 0xd5, 0x3c, 0x2a, 0x4a, 0x13, 0x1d, + 0xa5, 0x77, 0x94, 0x30, 0xa2, 0xce, 0x5b, 0x64, 0x7f, 0x5d, 0x22, 0x30, 0x6f, 0x81, 0x5d, 0x9f, + 0x28, 0xe5, 0xfe, 0x76, 0x05, 0x65, 0xb2, 0x1b, 0xe9, 0x66, 0x37, 0x61, 0xb2, 0x5b, 0x86, 0xda, + 0xca, 0xb4, 0xd2, 0xb2, 0x87, 0xb3, 0x5b, 0x66, 0x72, 0x5a, 0x56, 0x65, 0xb7, 0xec, 0xc1, 0xec, + 0x56, 0x40, 0x79, 0xb1, 0x82, 0x42, 0xe1, 0xa1, 0x6a, 0x21, 0xc3, 0xec, 0x86, 0xad, 0x80, 0x6e, + 0x01, 0xea, 0x5e, 0x00, 0xe5, 0x98, 0x44, 0x09, 0x8f, 0x97, 0x78, 0x81, 0xe2, 0xdd, 0x15, 0xa6, + 0xe8, 0x57, 0xfd, 0xe8, 0x77, 0x22, 0x0a, 0x3c, 0x26, 0xde, 0x4f, 0x2f, 0x74, 0x5b, 0x1e, 0x9d, + 0x78, 0xa6, 0xf0, 0x7f, 0x03, 0x45, 0xb3, 0xed, 0xe1, 0x05, 0xcf, 0x37, 0xa0, 0x30, 0x01, 0xb6, + 0x94, 0x60, 0xf5, 0x5d, 0x87, 0xbd, 0x68, 0xbd, 0xa9, 0xbb, 0x05, 0xac, 0x68, 0xa1, 0xfa, 0x35, + 0x85, 0x7c, 0x82, 0x4a, 0xbb, 0xcc, 0x28, 0x12, 0x7c, 0xb5, 0x52, 0x4b, 0xb5, 0xa6, 0xa1, 0x38, + 0x6f, 0x42, 0xc6, 0x82, 0x02, 0x6e, 0x03, 0xdc, 0x02, 0x9c, 0x13, 0x96, 0x64, 0xf4, 0xcf, 0x68, + 0xe1, 0x69, 0x06, 0x7e, 0x7d, 0x01, 0x13, 0x33, 0xea, 0xe8, 0xf8, 0x51, 0x85, 0xfb, 0xdd, 0x50, + 0x76, 0x03, 0x0f, 0x67, 0x6f, 0x39, 0x49, 0x60, 0xdf, 0x82, 0x7c, 0xa2, 0x3f, 0x5e, 0xa1, 0x5c, + 0x59, 0x2a, 0xcd, 0x81, 0xe1, 0x29, 0x41, 0x6f, 0xbf, 0xbc, 0x05, 0xf2, 0x6f, 0xd3, 0x42, 0xe2, + 0x61, 0x1d, 0xfb, 0xb6, 0xc2, 0x17, 0x6b, 0x7c, 0xde, 0x6e, 0x3a, 0x1e, 0x74, 0x05, 0x35, 0xa5, + 0x92, 0x00, 0xf6, 0x4b, 0x77, 0x85, 0xab, 0xcf, 0x38, 0xd6, 0x2d, 0x01, 0x70, 0x2a, 0x65, 0x5e, + 0x84, 0xd0, 0x26, 0xdc, 0x41, 0xeb, 0xc6, 0x21, 0x61, 0xf0, 0x58, 0x7b, 0x4a, 0x0e, 0x3e, 0xc3, + 0x41, 0x1f, 0x2f, 0xec, 0xbb, 0xa2, 0xb0, 0x43, 0xf8, 0xb5, 0xdd, 0x9e, 0x1d, 0x0e, 0x06, 0x76, + 0xaf, 0x0b, 0x3a, 0xe7, 0x85, 0x64, 0xe0, 0x3b, 0x3d, 0x7b, 0x00, 0x50, 0xe3, 0x96, 0x24, 0x34, + 0x75, 0x6b, 0x29, 0x32, 0x1b, 0x9a, 0x0a, 0xa5, 0x68, 0x70, 0x79, 0x28, 0x4d, 0xae, 0xa0, 0x5b, + 0xa5, 0x28, 0x5b, 0x98, 0xf3, 0x27, 0x29, 0x23, 0x62, 0xf5, 0x71, 0x95, 0xd3, 0xc8, 0x26, 0xd8, + 0x9d, 0x4c, 0x96, 0xd3, 0x29, 0x15, 0x36, 0xae, 0x71, 0xb6, 0xa0, 0x45, 0x41, 0x66, 0x34, 0xa2, + 0xd1, 0x39, 0x1e, 0x82, 0xfa, 0x09, 0x91, 0xc4, 0x82, 0x36, 0x49, 0x12, 0x16, 0x53, 0x28, 0xc6, + 0x55, 0x43, 0xf3, 0x4a, 0x6d, 0x71, 0xcb, 0x16, 0xb1, 0xb2, 0x18, 0x4f, 0xc3, 0xbb, 0x60, 0xf7, + 0x4d, 0x2b, 0x72, 0x55, 0x15, 0xbb, 0x56, 0x5d, 0x8f, 0x69, 0x94, 0x6d, 0x28, 0x81, 0xd0, 0x27, + 0x1a, 0xe5, 0x84, 0x8a, 0x4a, 0x91, 0xad, 0xdb, 0xe4, 0xb8, 0x9f, 0xb9, 0xb6, 0x92, 0x1c, 0x8b, + 0xfe, 0x74, 0xf5, 0xfe, 0x3b, 0x6c, 0xda, 0x0a, 0x6a, 0xf8, 0x71, 0xc7, 0x2d, 0xb3, 0x7c, 0x01, + 0xf2, 0x8b, 0x81, 0xef, 0x1f, 0x72, 0x58, 0xa4, 0xd0, 0x6c, 0x85, 0x8a, 0x49, 0x3f, 0x2d, 0xca, + 0xee, 0xeb, 0x45, 0xbb, 0x42, 0x00, 0x21, 0x09, 0x1a, 0x53, 0x28, 0x91, 0xac, 0x99, 0x41, 0xf2, + 0xed, 0xc7, 0x77, 0x6f, 0x6d, 0x88, 0x3a, 0x5e, 0x73, 0xc2, 0x51, 0x8e, 0x02, 0x93, 0x1d, 0x2f, + 0x08, 0xdc, 0xb0, 0x85, 0xef, 0x52, 0x08, 0x68, 0xcb, 0x2d, 0xc6, 0x2d, 0x25, 0x50, 0xc4, 0xb3, + 0xd9, 0x68, 0x79, 0xc6, 0x19, 0x2f, 0xb4, 0x34, 0xbb, 0x1c, 0xa8, 0x15, 0x0b, 0x8c, 0x0a, 0x78, + 0x81, 0x9c, 0xa7, 0x54, 0xf6, 0x75, 0x12, 0x12, 0xae, 0xed, 0x41, 0x12, 0xfb, 0x98, 0x2e, 0x28, + 0x5f, 0x4a, 0x47, 0xab, 0x1f, 0xeb, 0xc2, 0xc0, 0x2d, 0xbd, 0xdc, 0x70, 0xc1, 0x73, 0xe8, 0x5f, + 0x77, 0x31, 0x81, 0x0b, 0x48, 0xb9, 0x51, 0x16, 0xb7, 0x04, 0x50, 0x36, 0xff, 0x5d, 0x81, 0x56, + 0x79, 0x5d, 0x62, 0xb5, 0x04, 0xb9, 0x94, 0x0b, 0xe9, 0x38, 0x25, 0x0e, 0xbd, 0xcd, 0x78, 0x38, + 0xf5, 0x79, 0x9f, 0xf9, 0x1c, 0x8a, 0x5e, 0x98, 0x74, 0x3b, 0xd8, 0xa5, 0x31, 0x0d, 0xe4, 0x15, + 0xda, 0x67, 0xb0, 0x1b, 0x1a, 0x19, 0x21, 0xa0, 0x77, 0xda, 0xbd, 0x32, 0x4a, 0xb9, 0x75, 0xbc, + 0x72, 0xca, 0x51, 0x6f, 0xe8, 0xfe, 0xbe, 0x11, 0xba, 0xdc, 0xb1, 0x2a, 0xdf, 0xf4, 0x35, 0x06, + 0x5a, 0x8e, 0x54, 0xf7, 0x00, 0xea, 0x3e, 0xd9, 0x56, 0xbd, 0xa6, 0x84, 0x7e, 0x1f, 0xc8, 0x23, + 0xed, 0x48, 0x85, 0x00, 0x92, 0x03, 0xef, 0x69, 0xe2, 0x7a, 0x36, 0x0a, 0x38, 0x07, 0xd7, 0x64, + 0xbe, 0x04, 0xcf, 0x70, 0xd7, 0x0e, 0x57, 0x9b, 0x93, 0xf4, 0xd6, 0x86, 0xaa, 0x39, 0x85, 0x5a, + 0x17, 0x7e, 0x3c, 0xee, 0x27, 0x82, 0xcc, 0x66, 0x78, 0x55, 0x8a, 0x97, 0x0d, 0x1c, 0x72, 0x06, + 0x29, 0x8a, 0xef, 0xc0, 0x1f, 0x23, 0x68, 0xe7, 0xef, 0x6d, 0xe3, 0xea, 0xb8, 0x73, 0x3e, 0x42, + 0xb3, 0xdf, 0x4b, 0x90, 0xfb, 0x24, 0x07, 0xd9, 0x27, 0x17, 0xfa, 0x22, 0xd7, 0x45, 0x45, 0x2e, + 0xf3, 0x57, 0xfc, 0xde, 0xe1, 0xae, 0x2a, 0xc7, 0x2c, 0xbc, 0x57, 0x58, 0x10, 0xb6, 0x6a, 0x30, + 0xa5, 0x9b, 0x36, 0xc4, 0x9e, 0x03, 0x72, 0xd2, 0x42, 0x01, 0x09, 0x8a, 0xb6, 0x26, 0x20, 0xf3, + 0x99, 0x43, 0xa8, 0xab, 0xdd, 0xf6, 0x31, 0x1a, 0x7c, 0x37, 0x2e, 0x7e, 0x35, 0xff, 0x99, 0xde, + 0x84, 0x77, 0xfa, 0x2a, 0xd9, 0xaa, 0x27, 0x01, 0x04, 0xb3, 0x16, 0x7e, 0xd1, 0x3d, 0x44, 0xd6, + 0x9d, 0x50, 0x1b, 0x27, 0x3c, 0x59, 0x01, 0xed, 0xfa, 0x4c, 0xe6, 0x6a, 0xb8, 0x3e, 0x16, 0x4e, + 0x6a, 0x16, 0xc1, 0x02, 0x7c, 0xc6, 0x13, 0x8a, 0x8c, 0xf9, 0x92, 0xbf, 0x85, 0xa0, 0x97, 0xd1, + 0xb7, 0xfc, 0x8e, 0x8a, 0x0b, 0x02, 0xce, 0xef, 0x6a, 0x09, 0x48, 0xc3, 0x1f, 0x70, 0x24, 0xab, + 0x23, 0xed, 0x57, 0x2d, 0x85, 0x0c, 0x29, 0x0a, 0xa9, 0x58, 0x6a, 0x0e, 0xdb, 0xc2, 0xd3, 0x25, + 0xb0, 0x11, 0x58, 0x8e, 0xc2, 0x6a, 0xaf, 0x37, 0x34, 0x0b, 0x05, 0x27, 0xd3, 0xba, 0x35, 0xb4, + 0x99, 0x7f, 0x8b, 0x09, 0x11, 0x8d, 0xb7, 0xc1, 0x85, 0x99, 0xdd, 0x56, 0x75, 0x43, 0x14, 0x82, + 0xe7, 0x10, 0xdd, 0xd9, 0xb6, 0xdd, 0xfd, 0x06, 0x07, 0xea, 0x0e, 0xad, 0xc5, 0x03, 0xdd, 0x91, + 0xc3, 0xca, 0xcc, 0xb5, 0xe5, 0xf8, 0x25, 0x5d, 0xab, 0x82, 0x50, 0xf6, 0xf7, 0xda, 0x4c, 0xc3, + 0x31, 0x24, 0x11, 0x90, 0xc1, 0xdd, 0xcd, 0x43, 0xdc, 0x9b, 0x0b, 0xb6, 0x9a, 0x77, 0x75, 0x61, + 0xf3, 0xf5, 0xe6, 0x59, 0x5e, 0xd4, 0x55, 0xf6, 0xa9, 0x75, 0x51, 0x09, 0xc2, 0x1c, 0x5c, 0xc5, + 0x62, 0x73, 0x49, 0x69, 0x4f, 0x96, 0x52, 0x72, 0x66, 0x3f, 0x36, 0xb4, 0x0f, 0x0f, 0xf9, 0x2e, + 0x69, 0x69, 0x4b, 0x4e, 0x59, 0xbe, 0x94, 0xca, 0x7c, 0x4b, 0x61, 0x65, 0x6a, 0x93, 0xd9, 0xeb, + 0x81, 0x9c, 0x68, 0xfc, 0x09, 0xdd, 0xb7, 0x3c, 0xca, 0x0b, 0xa7, 0x56, 0x29, 0x54, 0xcf, 0xb8, + 0x4c, 0x93, 0x5a, 0xa1, 0xd9, 0x57, 0xc8, 0x5a, 0x23, 0xec, 0xd9, 0x1d, 0x51, 0x5f, 0x18, 0x92, + 0x4d, 0x51, 0xbb, 0x61, 0x79, 0xac, 0xdd, 0x7c, 0xa8, 0xd1, 0x6f, 0x70, 0x91, 0xa5, 0xf1, 0xa7, + 0x87, 0x98, 0x30, 0xeb, 0x8a, 0x87, 0x57, 0x8a, 0x58, 0x9b, 0x83, 0xaf, 0x26, 0xf8, 0x75, 0xc7, + 0x7e, 0x83, 0xaa, 0x68, 0x99, 0xd7, 0xb5, 0x51, 0x8f, 0x67, 0xe7, 0x10, 0x91, 0xee, 0xb8, 0x48, + 0x60, 0xc8, 0x96, 0x8b, 0x09, 0x54, 0x24, 0x37, 0xe0, 0x4d, 0x71, 0xb6, 0x4c, 0x68, 0x61, 0xf0, + 0xb9, 0x2a, 0x3f, 0x28, 0xef, 0x87, 0x6e, 0x00, 0xaf, 0x4e, 0x1b, 0xfe, 0x66, 0xff, 0xd7, 0xdf, + 0xfe, 0xdd, 0xde, 0xed, 0x07, 0x5f, 0x2a, 0x15, 0xe0, 0x87, 0x34, 0xd1, 0x93, 0x26, 0xfa, 0xff, + 0xfe, 0xcf, 0xbf, 0xfe, 0x87, 0x0d, 0x53, 0xff, 0x10, 0x7e, 0xb7, 0x3a, 0x5c, 0x54, 0x99, 0x2e, + 0x48, 0x1a, 0x44, 0xf3, 0x52, 0x4a, 0x91, 0x82, 0xfe, 0x29, 0xb8, 0x77, 0xfa, 0x2b, 0x48, 0xcc, + 0x3e, 0xb1, 0x51, 0xe6, 0x0b, 0x72, 0xaf, 0x5b, 0xc7, 0xe8, 0xc4, 0xdd, 0x11, 0x71, 0xb7, 0x4c, + 0x1f, 0x04, 0x4d, 0xba, 0x73, 0xd0, 0x67, 0x81, 0xc3, 0xf2, 0xc3, 0xc3, 0xb6, 0x0b, 0x72, 0xc8, + 0xc8, 0xfe, 0x32, 0x85, 0x2a, 0xed, 0x3c, 0x0a, 0xb4, 0xfb, 0x66, 0x58, 0xd4, 0x67, 0x7a, 0x52, + 0xfb, 0x8a, 0xa0, 0x7f, 0x81, 0x5a, 0x5f, 0xfe, 0x09, 0xca, 0x7e, 0xa0, 0xb7, 0x61, 0x3e, 0x3b, + 0x3c, 0x6c, 0x25, 0x71, 0x0e, 0x48, 0x98, 0xdb, 0xba, 0x57, 0x6b, 0x56, 0x63, 0x10, 0x17, 0xca, + 0x5a, 0x81, 0xe1, 0x65, 0xee, 0xfb, 0xc9, 0x2f, 0x10, 0xbb, 0xfc, 0x4f, 0x74, 0x55, 0xc0, 0x9a, + 0x0a, 0xfe, 0x8a, 0x1a, 0xfa, 0x32, 0x3e, 0x61, 0xf6, 0x87, 0x3a, 0x41, 0x15, 0x9f, 0xd7, 0xec, + 0xc6, 0x57, 0xe9, 0xdb, 0x04, 0xfe, 0x71, 0xe7, 0x1e, 0xb4, 0x41, 0xc7, 0xd2, 0x69, 0xde, 0x63, + 0x5e, 0x63, 0x17, 0xb4, 0x7e, 0x75, 0x94, 0xd2, 0x88, 0x1f, 0xcc, 0x2f, 0x9f, 0x3f, 0x57, 0x89, + 0xe8, 0x0b, 0xa0, 0x5f, 0x18, 0x98, 0xf2, 0x3d, 0x8b, 0x79, 0x6d, 0xd0, 0xc8, 0x31, 0x21, 0x66, + 0xa9, 0xaf, 0xc1, 0x15, 0x96, 0x28, 0xeb, 0x37, 0x14, 0x35, 0xb6, 0x56, 0x8e, 0xab, 0x4f, 0xb9, + 0x29, 0x25, 0x65, 0xde, 0x90, 0x7f, 0x81, 0xac, 0x0c, 0x64, 0x25, 0xad, 0x72, 0xe7, 0xff, 0x8b, + 0xbc, 0xb6, 0xcf, 0xac, 0x62, 0x37, 0x8f, 0x64, 0xf7, 0x85, 0x51, 0xc9, 0xb6, 0x3b, 0xe6, 0x9f, + 0x3f, 0x97, 0xc9, 0xa3, 0x9c, 0x03, 0xe9, 0xb4, 0x6d, 0x1b, 0x9d, 0xa5, 0x23, 0x2f, 0x03, 0x5c, + 0x49, 0x2c, 0xe3, 0xb7, 0x9d, 0x66, 0xb2, 0x63, 0x53, 0xfc, 0xb6, 0xb6, 0x28, 0x80, 0xad, 0xee, + 0xbd, 0x64, 0x14, 0x8c, 0x0d, 0xdb, 0x3c, 0x47, 0xa3, 0x2f, 0xcc, 0xfd, 0xce, 0x79, 0x30, 0x76, + 0xcd, 0x82, 0xa0, 0xf8, 0x06, 0xd8, 0x09, 0xea, 0x5d, 0x78, 0xb3, 0x68, 0xd5, 0x84, 0xeb, 0x7c, + 0xae, 0x71, 0xa8, 0x7c, 0xae, 0x63, 0xae, 0x84, 0x38, 0x86, 0x31, 0x28, 0xe2, 0x9e, 0xc1, 0xd6, + 0x71, 0x71, 0xd9, 0xeb, 0x6d, 0xaa, 0x63, 0x60, 0x95, 0xf8, 0xe0, 0x39, 0x54, 0x19, 0x59, 0x1e, + 0x44, 0x41, 0x37, 0xea, 0x63, 0x53, 0xa1, 0x8d, 0x5b, 0xaf, 0x5c, 0x1a, 0x78, 0x6b, 0x36, 0x55, + 0x11, 0x58, 0x82, 0x65, 0x08, 0x46, 0xf4, 0x32, 0xd3, 0xcb, 0x50, 0x2e, 0x8e, 0x59, 0x43, 0xe6, + 0x59, 0x27, 0xe5, 0x43, 0x94, 0x90, 0xdd, 0x6a, 0xa2, 0x12, 0x16, 0xd4, 0x84, 0x31, 0x35, 0xd9, + 0xbb, 0x3c, 0x34, 0x14, 0xa9, 0xda, 0xf4, 0xdd, 0xea, 0xac, 0x65, 0x76, 0xd2, 0x55, 0xd8, 0x57, + 0xd9, 0x1d, 0x0a, 0x54, 0x5d, 0x24, 0x31, 0x19, 0xd5, 0xb8, 0xc2, 0xaf, 0xb2, 0xf8, 0x17, 0x75, + 0x5b, 0xcb, 0xc2, 0x66, 0xe1, 0x50, 0xd2, 0xc0, 0xac, 0x6d, 0xc6, 0x65, 0xdd, 0xd0, 0xa0, 0x65, + 0x56, 0xb4, 0x92, 0xeb, 0x79, 0x57, 0x6b, 0x06, 0xaf, 0x56, 0xe0, 0x68, 0x0f, 0x28, 0x52, 0xbf, + 0xe8, 0x61, 0x35, 0xb8, 0x91, 0x54, 0xf3, 0x36, 0x1a, 0x96, 0xa2, 0x6a, 0xdd, 0x60, 0x9e, 0xa6, + 0x19, 0x7d, 0xd0, 0x42, 0x10, 0xa0, 0x42, 0x8c, 0x0f, 0x15, 0xe2, 0x29, 0x95, 0xf1, 0xfc, 0x25, + 0x4b, 0x2e, 0xef, 0x69, 0x8c, 0xd9, 0xe9, 0x67, 0xbc, 0xc5, 0x08, 0x07, 0x83, 0xdf, 0xad, 0xf7, + 0x5d, 0x4d, 0x6c, 0x06, 0x88, 0xe0, 0xe7, 0x06, 0xae, 0x9a, 0x39, 0xaf, 0xd9, 0x23, 0x4a, 0x9d, + 0x73, 0x78, 0xb3, 0xc1, 0xc7, 0x86, 0x10, 0x4f, 0x80, 0xfd, 0xa2, 0xbe, 0x97, 0x6e, 0xbf, 0xfc, + 0x7a, 0x93, 0x40, 0x9b, 0x2d, 0xad, 0x29, 0xb6, 0xc3, 0xaa, 0xcf, 0xae, 0xd2, 0x4e, 0x33, 0x51, + 0x51, 0x95, 0x3f, 0xbe, 0xae, 0x9b, 0x5e, 0x41, 0x37, 0xfd, 0xb8, 0x7d, 0x69, 0x63, 0xae, 0x1e, + 0x0a, 0xc8, 0xcc, 0x6c, 0x96, 0x4e, 0x57, 0x80, 0xb7, 0x1d, 0x56, 0x1b, 0x34, 0xcd, 0x95, 0x0b, + 0xa4, 0x72, 0x06, 0x82, 0xfb, 0xfc, 0xf9, 0x0f, 0x6b, 0xfb, 0xd6, 0x0e, 0xa5, 0x58, 0xd2, 0xcd, + 0x1f, 0x1a, 0x5c, 0xd6, 0x45, 0x90, 0x3e, 0x3c, 0xc3, 0x84, 0xcb, 0xae, 0xb1, 0x90, 0x07, 0xb5, + 0x69, 0x73, 0x68, 0xe5, 0x5c, 0xd6, 0xde, 0x5c, 0x17, 0x8e, 0x3b, 0xf7, 0x1b, 0x9b, 0x7b, 0x08, + 0x43, 0x59, 0xf6, 0xfd, 0x7d, 0xf4, 0xeb, 0x1e, 0xe1, 0xef, 0xd8, 0x5f, 0x36, 0x66, 0xd5, 0xf5, + 0x9f, 0xad, 0x45, 0x0b, 0xb9, 0x1f, 0x1d, 0x07, 0xe3, 0xce, 0x0b, 0xdb, 0x0e, 0x69, 0x19, 0x0e, + 0x9c, 0xc1, 0xf5, 0x4f, 0x3f, 0xfe, 0xdb, 0xcd, 0x60, 0xe6, 0xd9, 0x96, 0xed, 0xd6, 0xb3, 0xce, + 0xbf, 0xfe, 0x74, 0xb7, 0x1e, 0x6e, 0xdc, 0xcf, 0xce, 0x4f, 0x45, 0x4f, 0x0f, 0x01, 0x06, 0xea, + 0x2f, 0xf4, 0xd9, 0x1f, 0x20, 0xc0, 0x94, 0xfd, 0xa2, 0xba, 0xbe, 0xc7, 0x96, 0xfd, 0x4a, 0xc4, + 0x97, 0x8d, 0x6f, 0x1b, 0x5a, 0xf7, 0x7f, 0xeb, 0xf2, 0x6a, 0xb4, 0x9d, 0x6f, 0x5e, 0x66, 0x99, + 0x63, 0xd7, 0x9f, 0x34, 0x59, 0xe6, 0x03, 0x1e, 0xe0, 0x03, 0x42, 0xe0, 0x25, 0x89, 0xe7, 0xcd, + 0xfb, 0x0e, 0x77, 0xbd, 0xab, 0xf0, 0x44, 0xca, 0xf8, 0xbd, 0x4f, 0x79, 0x79, 0xf8, 0x1a, 0x9e, + 0xdf, 0xc3, 0xb3, 0xeb, 0xed, 0x83, 0x86, 0x89, 0x36, 0xf8, 0x25, 0x4e, 0xec, 0x87, 0xcf, 0x28, + 0xb9, 0xa5, 0x4d, 0xf8, 0xb7, 0x38, 0xb1, 0x0f, 0x9e, 0xe7, 0x35, 0x28, 0xcf, 0x55, 0x39, 0x5a, + 0x5e, 0x3b, 0x40, 0x8d, 0xdd, 0x56, 0x74, 0x35, 0xfb, 0xa5, 0xe2, 0xc1, 0x38, 0xb8, 0x47, 0x36, + 0xd5, 0xdd, 0x86, 0x2a, 0x81, 0xb7, 0xc9, 0x3c, 0x24, 0xbf, 0x02, 0x7a, 0x05, 0xd9, 0x3c, 0x21, + 0x7e, 0x5e, 0x28, 0xf7, 0x4b, 0xe4, 0x9f, 0x49, 0xde, 0x88, 0x3f, 0x69, 0x63, 0x4f, 0xbe, 0x54, + 0x37, 0x9d, 0x5b, 0xf0, 0xea, 0xe4, 0x28, 0x2b, 0x39, 0x4f, 0x0b, 0x13, 0xce, 0xcc, 0x2b, 0xaf, + 0xc8, 0x0e, 0xfc, 0x13, 0xdb, 0xab, 0x4c, 0x3d, 0x42, 0x10, 0x73, 0x1b, 0xfb, 0x11, 0x5f, 0x92, + 0x4d, 0xa9, 0xf0, 0xe9, 0x74, 0x0a, 0xaa, 0x03, 0xc5, 0x41, 0x3e, 0x4b, 0x22, 0x1b, 0xcb, 0x13, + 0xbb, 0x0b, 0x83, 0x2e, 0x0e, 0xcf, 0xba, 0x05, 0x1a, 0xe0, 0xbd, 0xa7, 0xed, 0x29, 0x72, 0x55, + 0x5a, 0xc7, 0x9b, 0xb8, 0xad, 0xeb, 0xf7, 0x8a, 0x3d, 0x0d, 0xed, 0xd1, 0x0e, 0x5e, 0xf7, 0x61, + 0x3a, 0xe0, 0xd7, 0x29, 0x2b, 0x09, 0x25, 0xad, 0xa0, 0x8e, 0x5c, 0x6a, 0xec, 0x70, 0x5c, 0x6d, + 0x28, 0x9d, 0x93, 0x0f, 0xe1, 0xdc, 0xff, 0xb0, 0x89, 0x52, 0x7d, 0x25, 0x86, 0x1a, 0x29, 0x2b, + 0x37, 0x5b, 0x99, 0x92, 0xf2, 0x92, 0xff, 0xa5, 0x08, 0xf1, 0x00, 0x89, 0x5d, 0xfa, 0x06, 0x6b, + 0x71, 0xe8, 0xce, 0xb7, 0x1d, 0x66, 0xb5, 0x14, 0x36, 0x7e, 0x21, 0xd0, 0x96, 0x13, 0xce, 0xef, + 0xc4, 0x89, 0xee, 0xd0, 0x78, 0xfd, 0x42, 0x55, 0x35, 0x0e, 0x27, 0x7b, 0x4d, 0xa7, 0x64, 0x99, + 0x49, 0xc7, 0xf5, 0x9a, 0x5f, 0x21, 0x75, 0xfc, 0xa2, 0xb2, 0xbd, 0xfa, 0x20, 0xf8, 0x9e, 0xb4, + 0x3c, 0xc5, 0x8e, 0x6d, 0xca, 0x3d, 0x76, 0x6c, 0xeb, 0x9c, 0x7f, 0x6b, 0x27, 0xcf, 0x4d, 0x0e, + 0x47, 0x6d, 0xf3, 0xfc, 0x03, 0x4c, 0x90, 0x99, 0x2a, 0x33, 0xf0, 0x7d, 0x4d, 0x69, 0xe5, 0x8f, + 0x23, 0x65, 0xe7, 0x7b, 0x44, 0x84, 0x1e, 0x55, 0x81, 0xee, 0x31, 0xcb, 0xb1, 0x7e, 0x15, 0xcd, + 0xa2, 0x0a, 0x10, 0x98, 0xe4, 0x8c, 0x62, 0x1b, 0xe2, 0x3c, 0x86, 0xda, 0xbd, 0x0a, 0x51, 0x6c, + 0x5b, 0xc8, 0x30, 0x65, 0x2c, 0xb6, 0xbe, 0xa8, 0x28, 0x2f, 0xae, 0xbb, 0xaf, 0x1c, 0x60, 0x1a, + 0x44, 0x65, 0x9b, 0x1d, 0xed, 0xaa, 0xd8, 0x0d, 0xd5, 0xe4, 0xbe, 0xcf, 0xd2, 0x98, 0xde, 0xd3, + 0xfc, 0x32, 0xad, 0x3e, 0x57, 0x29, 0xc9, 0x5d, 0xdf, 0x90, 0x75, 0x4b, 0x37, 0x0a, 0x05, 0x9e, + 0xf4, 0xb8, 0xb9, 0x44, 0x83, 0xbe, 0x1c, 0xd7, 0x1d, 0xda, 0x63, 0xde, 0x7a, 0x41, 0xe5, 0x9c, + 0x43, 0xbf, 0x3a, 0xa3, 0xd2, 0xde, 0x40, 0x19, 0x3b, 0xa7, 0x60, 0xb2, 0x98, 0x4f, 0xf9, 0xa7, + 0x17, 0xba, 0x15, 0x71, 0xdc, 0xd0, 0x01, 0x77, 0xfd, 0x23, 0xd4, 0x73, 0x96, 0xdd, 0x63, 0x3d, + 0xbb, 0x51, 0x87, 0xb9, 0x9e, 0x8d, 0xd7, 0x77, 0xe5, 0xae, 0x35, 0x87, 0x12, 0x1e, 0x43, 0xbd, + 0x0f, 0x95, 0x61, 0xd7, 0x0b, 0xc8, 0xe1, 0x21, 0x81, 0x65, 0xfd, 0xce, 0xc4, 0x02, 0x7a, 0x12, + 0x0e, 0x84, 0x18, 0xdb, 0x71, 0x45, 0x65, 0x0a, 0xa8, 0x1e, 0x19, 0xc9, 0xb2, 0x95, 0xe3, 0xb8, + 0x80, 0x75, 0xe3, 0xee, 0x78, 0xbd, 0x69, 0x3d, 0x2a, 0x44, 0x1c, 0x99, 0x57, 0x6b, 0x83, 0x41, + 0x9c, 0xb0, 0x5f, 0xd0, 0xce, 0xf8, 0x32, 0x99, 0x66, 0x20, 0x4f, 0x6c, 0xf9, 0x06, 0xe4, 0x17, + 0x72, 0x3f, 0xc8, 0xd2, 0x49, 0x31, 0x90, 0x73, 0x41, 0x29, 0x14, 0xc6, 0x03, 0x31, 0x1c, 0x3d, + 0x33, 0x4f, 0x8b, 0x94, 0xc1, 0x8c, 0x6d, 0x3d, 0x5a, 0x90, 0xfb, 0x3e, 0xbe, 0xfa, 0xb2, 0x9f, + 0x3d, 0x39, 0x09, 0x02, 0xfb, 0xbc, 0x41, 0x6b, 0x60, 0x3e, 0x70, 0xc7, 0x56, 0xc9, 0xe2, 0x2c, + 0xe3, 0x04, 0xe2, 0x67, 0xf9, 0x5a, 0x11, 0xbf, 0x5d, 0x9f, 0x0f, 0xcf, 0x1f, 0xed, 0xfb, 0xee, + 0x1d, 0xd6, 0xac, 0xb3, 0x24, 0xbd, 0xb5, 0x94, 0xf9, 0x47, 0x76, 0x15, 0x30, 0x6c, 0x33, 0x8f, + 0x9f, 0x27, 0x6a, 0xb3, 0x09, 0x80, 0x8d, 0x0a, 0x4a, 0xd9, 0x11, 0x12, 0x07, 0x98, 0x2d, 0xc8, + 0xa1, 0x6d, 0x3d, 0x04, 0xf8, 0xa8, 0x86, 0x1c, 0x3d, 0x0c, 0x59, 0x03, 0x1e, 0xef, 0x05, 0x7c, + 0xb4, 0xbd, 0x41, 0x17, 0xd5, 0xe7, 0x87, 0x07, 0xcf, 0x9f, 0x3e, 0x0f, 0xc6, 0xe5, 0xfa, 0x00, + 0x05, 0xa4, 0xe4, 0x85, 0xff, 0x5f, 0xc0, 0xff, 0x00, 0x92, 0xb4, 0x15, 0x49, 0x2e, 0x30, 0x00, + 0x00 };