From 763d9ed96a1dce2456662b2c304e23ea272a0640 Mon Sep 17 00:00:00 2001 From: Holger Lembke Date: Sun, 10 Sep 2023 13:40:22 +0200 Subject: [PATCH] up --- .gitattributes | 5 +- README.md | 16 +- filemanager/fm.css | 475 ++++++++--------- filemanager/fm.html | 136 ++--- filemanager/fm.js | 298 +++++++---- keywords.txt | 2 +- library.properties | 2 +- src/ESPFMfGK.cpp | 178 +++++-- src/ESPFMfGK.h | 14 + src/ESPFMfGKGa.cpp | 32 +- src/ESPFMfGKGa.h | 10 +- src/ESPFMfGKWp.h | 910 ++++++++++++++++++-------------- src/ESPFMfGKWpDeflate.h | 1083 ++++++++++++++++++++------------------- 13 files changed, 1795 insertions(+), 1366 deletions(-) diff --git a/.gitattributes b/.gitattributes index 8305468..d0681b9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,7 @@ *.js linguist-language=JavaScript *.html linguist-language=html *.css linguist-language=CascadingStyleSheets -*.ino linguist-language=C++ \ No newline at end of file +*.ino linguist-language=C++ +*.c linguist-language=C++ +*.cpp linguist-language=C++ +*.h linguist-language=C++ \ No newline at end of file diff --git a/README.md b/README.md index a856584..b30f20d 100644 --- a/README.md +++ b/README.md @@ -59,23 +59,31 @@ Look into the examples. They are a good boiler plate to start from. They explain the security system around managing files visibility and operations. In most cases it will be a simple copy-paste-use thingy. -# define fileManagerServerStaticsInternally +# Defines + +Defines are used to configure some basic features of ESPFMfGK. + +## define fileManagerServerStaticsInternally By design concept ESPFMfGK is inteded as "drop it in and that is it" solution. To archive that it includes its own html/css/javascript files. They are stored in code space and eat something around 35k. -If you want to reduce the code footprint, undefine that define and put those files into the first added filesystem. No free lunch, either code space or file system. +If you want to reduce the code footprint, undefine that define and put the files from "filemanager" folder into the first added filesystem. No free lunch, either code space or file system. -# define fileManagerServerStaticsInternallyDeflate +## define fileManagerServerStaticsInternallyDeflate After reading that stuff in the chapter above there is an alternative version of storing the html/css/javascript files in code space: deflated data. That reduces the footprint to about 10k. -It is a tiny little bit http-protocol incompatible by ignoring whatever content the browser requests and always sending the deflated data. +It is a tiny little bit http-protocol incompatible by ignoring whatever content the browser requests and always sends the deflated data. So either define one of those defines or none. (All numbers are ballpark figures only and generous rounded up to include future code expansions.) +## ZipDownloadAll + +Comment this define if you do not need the "download all files" functionality. It will save about 4 to 5k code space. + # Stuff I used diff --git a/filemanager/fm.css b/filemanager/fm.css index e14e035..663eca8 100644 --- a/filemanager/fm.css +++ b/filemanager/fm.css @@ -1,414 +1,418 @@ .background { - background-color: black; + background-color: black; } div { - margin: 1px; - padding: 0; - font-family: 'Segoe UI', Verdana, sans-serif; + margin: 1px; + padding: 0; + font-family: 'Segoe UI', Verdana, sans-serif; } #gc { - display: grid; - grid-template-columns: 80px 25% auto 30px; - grid-template-rows: 25px 30px auto 30px 20px; - grid-template-areas: "o1 o2 o3 o4""m1 c c c""m2 c c c""m3 c c c""u1 u2 u3 u4"; + display: grid; + grid-template-columns: 80px 25% auto 30px; + grid-template-rows: 25px 30px auto 30px 20px; + grid-template-areas: "o1 o2 o3 o4""m1 c c c""m2 c c c""m3 c c c""u1 u2 u3 u4"; } #wait { - position: relative; - top: 10px; - left: 15px; - visibility: collapse; + position: relative; + top: 10px; + left: 15px; + visibility: collapse; } #ca, #ta, #ti, #pi, #fi { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } #ca {} #ti { - float: left; + float: left; } #fi {} #ei, #pv { - display: none; + display: none; } .o1 { - grid-area: o1; - background-color: #9999CC; - border-top-left-radius: 20px; - margin-bottom: 0px; + grid-area: o1; + background-color: #9999CC; + border-top-left-radius: 20px; + margin-bottom: 0px; } .o2 { - grid-area: o2; - background-color: #9999FF; - margin-bottom: 0px; - white-space: nowrap; - display: grid; - grid-auto-rows: 1fr; - grid-template-columns: 1fr 20px; - gap: 0px 0px; + grid-area: o2; + background-color: #9999FF; + margin-bottom: 0px; + white-space: nowrap; + display: grid; + grid-auto-rows: 1fr; + grid-template-columns: 1fr 20px; + gap: 0px 0px; } #o2i2 { - background-color: #BBB2FF; - margin: 0; - padding: 0; - cursor: default; - color: white; + background-color: #BBB2FF; + margin: 0; + padding: 0; + cursor: default; + color: white; } #o2i2:hover { - background-color: #D36669; - color: black; + background-color: #D36669; + color: black; } .o2 select { - border: 0px; - color: white; - font-weight: bold; - background-color: transparent; + border: 0px; + color: white; + font-weight: bold; + background-color: transparent; } .o2 option { - border: 0px; - color: black; - background-color: white; + border: 0px; + color: black; + background-color: white; } .o2 label { - color: white; + color: white; } .o3 { - grid-area: o3; - background-color: #CC99CC; - margin-bottom: 0px; - white-space: nowrap; + grid-area: o3; + background-color: #CC99CC; + margin-bottom: 0px; + white-space: nowrap; } .o4 { - grid-area: o4; - background-color: #CC6699; - border-radius: 0 10px 10px 0; - margin-bottom: 0px; + grid-area: o4; + background-color: #CC6699; + border-radius: 0 10px 10px 0; + margin-bottom: 0px; } .m1 { - grid-area: m1; - margin-top: 0px; - background-color: #9999CC; - display: grid; - grid-template-columns: 60px 20px; - grid-template-rows: 20px; - grid-template-areas: "s11 s12"; + grid-area: m1; + margin-top: 0px; + background-color: #9999CC; + display: grid; + grid-template-columns: 60px 20px; + grid-template-rows: 20px; + grid-template-areas: "s11 s12"; } .s12 { - margin: 0px; - background-color: #9999CC; + margin: 0px; + background-color: #9999CC; } .s13 { - margin: 0px; - border-top-left-radius: 20px; - height: 30px; + margin: 0px; + border-top-left-radius: 20px; + height: 30px; } .m2 { - display: flex; - justify-content: center; - align-items: center; - grid-area: m2; - background-color: #CC6699; - width: 60px; + display: flex; + justify-content: center; + align-items: center; + grid-area: m2; + background-color: #CC6699; + width: 60px; } .m3 { - grid-area: m3; - margin-bottom: 0px; - background-color: #9999CC; - display: grid; - grid-template-columns: 60px 20px; - grid-template-rows: 20px; - grid-template-areas: "s31 s32"; + grid-area: m3; + margin-bottom: 0px; + background-color: #9999CC; + display: grid; + grid-template-columns: 60px 20px; + grid-template-rows: 20px; + grid-template-areas: "s31 s32"; } .s32 { - margin: 0px; - background-color: #9999CC; + margin: 0px; + background-color: #9999CC; } .s33 { - margin: 0px; - border-bottom-left-radius: 20px; - height: 30px; + margin: 0px; + border-bottom-left-radius: 20px; + height: 30px; } .u1 { - grid-area: u1; - background-color: #9999CC; - border-bottom-left-radius: 20px; - margin-top: 0px; + grid-area: u1; + background-color: #9999CC; + border-bottom-left-radius: 20px; + margin-top: 0px; } .u2 { - grid-area: u2; - background-color: #CC6666; - margin-top: 0px; - padding-left: 10px; - vertical-align: middle; - font-size: 80%; + grid-area: u2; + background-color: #CC6666; + margin-top: 0px; + padding-left: 10px; + vertical-align: middle; + font-size: 80%; } -.u2 .s1, .u2 .s2 { - cursor: pointer; - height: 100%; - padding: 0 2px 0 2px; - display: inline-block; +.u2 .s1 { + cursor: pointer; + height: 100%; + padding: 0 4px 0 4px; + display: inline-block; } -.u2 .s1:hover, .u2 .s2:hover { - background-color: #9999FF; - border-radius: 2px; - color: white; +.u2 .s1:hover { + background-color: #9999FF; + border-radius: 2px; + color: white; } .u3 { - grid-area: u3; - padding-left: 10px; - background-color: #FF9966; - font-size: 80%; - margin-top: 0px; + grid-area: u3; + padding-left: 10px; + background-color: #FF9966; + font-size: 80%; + margin-top: 0px; } .u4 { - grid-area: u4; - background-color: #FF9900; - border-radius: 0 10px 10px 0; - margin-top: 0px; + grid-area: u4; + background-color: #FF9900; + border-radius: 0 10px 10px 0; + margin-top: 0px; } .c { - grid-area: c; + grid-area: c; } #fi button { - background-color: Transparent; - border: 1px solid #9999FF; - border-radius: 1px; - padding: 0px; - width: 30px; - cursor: pointer; + background-color: Transparent; + border: 1px solid #9999FF; + border-radius: 1px; + padding: 0px; + width: 30px; + cursor: pointer; } #fi button:hover { - background-color: #9999FF; - color: white; + background-color: #9999FF; + color: white; } .gc div { - padding: 1px; + padding: 1px; } .cc .uc { - background-color: green; - display: none; + background-color: green; + display: none; } .ccg, ccu { - height: 1.5em; + height: 1.5em; } .ccg { - background-color: #A5A5FF; + background-color: #A5A5FF; } .ccu { - background-color: #FE9A00; + background-color: #FE9A00; } .ccl { - border-radius: 5px 0 0 5px; - cursor: pointer; + border-radius: 5px 0 0 5px; + cursor: pointer; } .ccl:hover { - border-radius: 5px 0 0 5px; - color: white; - cursor: pointer; + border-radius: 5px 0 0 5px; + color: white; + cursor: pointer; } .ccr { - border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; } .cct { - text-align: right; + text-align: right; } .gc { - display: grid; - grid-template-columns: repeat(3, max-content); + display: grid; + grid-template-columns: repeat(3, max-content); } .fnecc { - width: min-content; - margin: 0 1px; - padding-top: 2px; - display: grid; - grid-auto-rows: 1fr; - grid-template-columns: 1fr 1fr; - gap: 0px 0px; + width: min-content; + margin: 0 1px; + padding-top: 2px; + display: grid; + grid-auto-rows: 1fr; + grid-template-columns: 1fr 1fr; + gap: 0px 0px; } .fnegc { - margin: 0; - display: grid; - grid-template-columns: repeat(1, max-content); + margin: 0; + display: grid; + grid-template-columns: repeat(1, max-content); } .fne { - margin: 1px 0px 2px 0px; - background-color: white; + margin: 1px 0px 2px 0px; + background-color: white; } .fnegc div { - padding: 1px; + padding: 1px; } .fnes { - padding: 0px 5px 0px 5px; - cursor: pointer; - border-radius: 5px; + padding: 0px 5px 0px 5px; + cursor: pointer; + border-radius: 5px; } .fnesl { - border: 1px solid #EDC315; - background-color: #EDC315; - color: black; + border: 1px solid #EDC315; + background-color: #EDC315; + color: black; } .fnesl:hover { - border: 1px solid #EDC315; - background-color: #EDC315; - color: white; + border: 1px solid #EDC315; + background-color: #EDC315; + color: white; } .fnesa { - border: 1px solid #F8FBDB; - background-color: #F8FBDB; - color: #white; + border: 1px solid #F8FBDB; + background-color: #F8FBDB; + color: white; } /* back button */ .fneba { - background-color: #EDC315; - border: 3px solid #EDC315; - border-radius: 4px; - padding: 0px 5px 0px 5px; - margin: 0; - font-size: 0.7em; - cursor: pointer; + background-color: #EDC315; + border: 3px solid #EDC315; + border-radius: 4px; + padding: 0px 5px 0px 5px; + margin: 0; + font-size: 0.7em; + cursor: pointer; } .fneba:hover { - color: white; - background-color: #9999FF; - border: 3px solid #9999FF; - border-radius: 4px; + color: white; + background-color: #9999FF; + border: 3px solid #9999FF; + border-radius: 4px; } -// EditorInsert +/* EditorInsert */ #ei button { - white-space: nowrap; - background-color: #F8FBDB; - border: 3px solid #F8FBDB; - border-radius: 4px; - padding: 5px 3px 5px 3px; - margin-bottom: 0.7em; - font-weight: bold; - cursor: pointer; + white-space: nowrap; + background-color: #F8FBDB; + border: 3px solid #F8FBDB; + border-radius: 4px; + padding: 5px 3px 5px 3px; + margin-bottom: 0.7em; + font-weight: bold; + cursor: pointer; } #ei button:hover { - background-color: #9999FF; - border-radius: 4px; - border: 3px solid #F8FBDB; - color: white; + background-color: #9999FF; + border-radius: 4px; + border: 3px solid #F8FBDB; + color: white; } /* pfad tabelle */ #pl { - display: inline-grid; - grid-template-columns: auto 20px 40px 1fr 40px 20px auto; - grid-template-rows: auto auto; - gap: 0px 0px; + display: inline-grid; + grid-template-columns: auto 20px 40px 1fr 40px 20px auto; + grid-template-rows: auto auto; + gap: 0px 0px; } #pl div { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } #pl .pu1 { - width: 1em; - border-radius: 0 0 0 1em; - background-color: #FF9966; - height: 100%; + width: 1em; + border-radius: 0 0 0 1em; + background-color: #FF9966; + height: 100%; } #pl .pu7 { - width: 1em; - border-radius: 0 0 1em 0; - background-color: #FF9966; - height: 100%; + width: 1em; + border-radius: 0 0 1em 0; + background-color: #FF9966; + height: 100%; } #pl .po2, #pl .po6 { - background-color: #FF9966; + background-color: #FF9966; } + #pl .po2 div { - width: 1em; - border-radius: 0 0 0 0.7em; - background-color: white; - height: 100%; - width: 100%; + width: 1em; + border-radius: 0 0 0 0.7em; + background-color: white; + height: 100%; + width: 100%; } #pl .po6 div { - width: 1em; - border-radius: 0 0 0.7em 0; - background-color: white; - height: 100%; - width: 100%; + width: 1em; + border-radius: 0 0 0.7em 0; + background-color: white; + height: 100%; + width: 100%; } -#pl .po1, #pl .po7, #pl .pu2, #pl .pu6 { - background-color: #FF9966; +#pl .po1, #pl .po7, #pl .pu2, #pl .pu6 { + background-color: #FF9966; } -#pl .pu3, #pl .pu5 { - background-color: #CC6666; + +#pl .pu3, #pl .pu5 { + background-color: #CC6666; } -#pl .pu4 { - background-color: #FFCC99; - font-size: 0.7em; + +#pl .pu4 { + background-color: #FFCC99; + font-size: 0.7em; } -#pl .po4 { - text-align: center; - height: 1.7em; + +#pl .po4 { + text-align: center; + height: 1.7em; } #pl .po4 > div { - margin-top: 0.1em; + margin-top: 0.1em; } /* Windows */ @@ -421,8 +425,8 @@ div { } .windowcontent { - overflow:scroll; - overflow-x:hidden; + overflow: scroll; + overflow-x: hidden; position: relative; margin: 0; padding: 0; @@ -431,22 +435,22 @@ div { } .windowtitle { - display: grid; + display: grid; margin: 0; - grid-auto-rows: 1fr; - grid-template-columns: 1fr 2px 20px; - gap: 0px 0px; -} - + grid-auto-rows: 1fr; + grid-template-columns: 1fr 2px 20px; + gap: 0px 0px; +} + .windowtitle .g { background-color: white; - margin:0; + margin: 0; } .windowtitle .t { padding-right: 10px; padding-left: 10px; - margin:0; + margin: 0; cursor: move; z-index: 12; background-color: #D8A570; @@ -468,7 +472,6 @@ div { background-color: #959FFE; } - .windowgrip { z-index: 12; margin: 0; @@ -481,3 +484,17 @@ div { cursor: nwse-resize; } +#windowform { + padding: 10px; +} + +dialog::backdrop { + backdrop-filter: blur(1px); +} + +#newname, #newname:focus, #newname:active { + width: 100%; + border: 1px solid gray; + border-radius: 2px; + outline: none; +} diff --git a/filemanager/fm.html b/filemanager/fm.html index a72396a..bbe70b0 100644 --- a/filemanager/fm.html +++ b/filemanager/fm.html @@ -2,72 +2,92 @@ - FileManager - - - + FileManager + + + -
-
- - - - - -
- -
-
 
-
 + 
-
-
 
-
 
- -
-
 
-
-
 
-
-
-
- File
- Drop
- Zone
-
-
-
 
-
-
 
-
-
+
+
+ + + + + +
+ +
+
 
+
 + 
+
+
 
+
 
-
 
-
Download all files this folder
-
Loading...
-
 
-
-
- Path name should appear here. -
-
-
- Tree List should appear here. +
+
 
+
+
 
+
-
- File list should appear here. +
+ File
+ Drop
+ Zone
-
- Editor should appear here. +
+
 
+
+
 
+
-
- Preview should appear here. + +
 
+
Download all files
+
Loading...
+
 
+
+
+ Path name should appear here. +
+
+
+ Tree List should appear here. +
+
+ File list should appear here. +
+
+ Editor should appear here. +
+
+ Preview should appear here. +
+
-
-
- + + + +
+
+
%t%
+
+
 
+
+
+ +
+ +   +
+ + +
+
+
+ - + \ No newline at end of file diff --git a/filemanager/fm.js b/filemanager/fm.js index 48a3713..101e381 100644 --- a/filemanager/fm.js +++ b/filemanager/fm.js @@ -8,25 +8,40 @@ var elementti = null; var elementpi = null; var elementws = null; -var sektionstrenner = String.fromCharCode(3, 1, 2); -var antworttrenner = String.fromCharCode(2, 1, 3); -var itemtrenner = String.fromCharCode(2, 1, 4); -var bootinfotrenner = String.fromCharCode(2, 1, 7); +const sektionstrenner = String.fromCharCode(3, 1, 2); +const antworttrenner = String.fromCharCode(2, 1, 3); +const itemtrenner = String.fromCharCode(2, 1, 4); +const bootinfotrenner = String.fromCharCode(2, 1, 7); var foldername = ""; var windowcounter = 0; +var filesysteminfos = ""; -var pathinsertintro = +const pathinsertintro = "
"; -var pathinsertextro = +const pathinsertextro = "
" + "
 
" + "
"; -var windowhtml = "
%t%
"+ -"
 
"+ -"
:::
"; +const folderdownloadinsert = + "
" + + "
" + + "
"; + +const filerenameinsert = + "New name:

" + + "Changing the path will move the file. Start with file system number to move to other device.
" + + "Active filesystems are: %f%.
" + + "Example: 1:/path/path/filename.extention

"; + +const filedeleteinsert = + "Delete file %f%?


Deleting files is final.

"; + +const windowhtml = "
%t%
" + + "
 
" + + "
:::
"; //000000000000000000000000000 function compressurlfile(source) { @@ -38,7 +53,7 @@ function compressurlfile(source) { msgline("Fetching file..."); var request = new XMLHttpRequest(); - request.onprogress = function (evt) { + request.onprogress = function(evt) { if (evt.lengthComputable) { var percentComplete = Math.round((evt.loaded / evt.total) * 100.0); if (lastpercentComplete != percentComplete) { @@ -47,7 +62,7 @@ function compressurlfile(source) { } } } - request.onreadystatechange = function () { + request.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { var data = this.responseText; @@ -62,7 +77,7 @@ function compressurlfile(source) { msgline("Sending compressed file..."); var sendback = new XMLHttpRequest(); - sendback.upload.onprogress = function (evt) { + sendback.upload.onprogress = function(evt) { if (evt.lengthComputable) { var percentComplete = Math.round((evt.loaded / evt.total) * 100.0); if (lastpercentComplete != percentComplete) { @@ -71,7 +86,7 @@ function compressurlfile(source) { } } } - sendback.onreadystatechange = function () { + sendback.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { getfileinsert(); @@ -105,7 +120,7 @@ function getFileSystemIndex() { //000000000000000000000000000 function executecommand(command) { var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = function () { + xhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { getfileinsert(); @@ -188,17 +203,17 @@ function AnswerProcessor() { p += "\u25B2  /"; skip = true; } else - if (level == -2) { // current folder name - fullpath = entry[1]; - var fp = ""; - for (var k=1;k"+ pathitems[k] +"/"; - } - skip = true; - } else { - s += "
"; + if (level == -2) { // current folder name + fullpath = entry[1]; + var fp = ""; + for (var k = 1; k < pathitems.length; k++) { + fp += "/" + pathitems[k]; + p += "" + pathitems[k] + "/"; } + skip = true; + } else { + s += "
"; + } if (!skip) { var level = parseInt(entry[0]); @@ -273,16 +288,16 @@ function AnswerProcessor() { // Makros aufloesen // Displayname ist umstaendlich, weil die Datenhaltung etwas umstaendlich ist - if (fullpath!="") { - var fdp = ""; - if (fullpath=="/") { - fdp = items[c + 1].substring(1); - } else { - fdp = items[c + 1].substring(fullpath.length+1); - } - s = s.replaceAll("%fd", fdp); - } else { - s = s.replaceAll("%fd", items[c + 1]); + if (fullpath != "") { + var fdp = ""; + if (fullpath == "/") { + fdp = items[c + 1].substring(1); + } else { + fdp = items[c + 1].substring(fullpath.length + 1); + } + s = s.replaceAll("%fd", fdp); + } else { + s = s.replaceAll("%fd", items[c + 1]); } s = s.replaceAll("%fn", items[c + 0]); s = s.replaceAll("%fs", items[c + 2]); @@ -320,21 +335,26 @@ function BootAnswerProcessor() { // console.log('Bootinfos: '+res.length); // ESPxWebFlMgr2::Backgroundcolor - if ((res.length>=1) && (res[0] != "")) { + if ((res.length >= 1) && (res[0] != "")) { var c = document.getElementsByClassName('background'); for (i = 0; i < c.length; i++) { c[i].style.backgroundColor = res[0]; } } // ESPxWebFlMgr2::ExtraHTMLfoot - if ((res.length>=2) && (res[1] != "")) { + if ((res.length >= 2) && (res[1] != "")) { var d = document.getElementById("foot"); d.innerHTML = res[1]; } // Seitentitle - if ((res.length>=3) && (res[2] != "")) { - document.title = res[2]; + if ((res.length >= 3) && (res[2] != "")) { + document.title = res[2]; + } + + // Filesysteminfo + if ((res.length >= 4) && (res[3] != "")) { + filesysteminfos = res[3]; } // und nun kann die Dateiliste geholt werden @@ -353,42 +373,25 @@ function downloadfile(filename) { window.location.href = "/job?fs=" + getFileSystemIndex() + "&job=download&fn=" + filename; } -//000000000000000000000000000 -function deletefile(filename) { - if (confirm("Really delete " + filename)) { - msgline("Please wait. Delete in progress..."); - executecommand("job=del&fn=" + filename); - } -} - //000000000000000000000000000 function makeemptyfile(filename) { msgline("Please wait. Create new empty file..."); executecommand("job=createnew&fn=" + foldername + "/newfile"); } -//000000000000000000000000000 -function renamefile(filename) { - var newname = prompt("new name for " + filename, filename); - if (newname != null) { - msgline("Please wait. Rename in progress..."); - executecommand("job=ren&fn=" + filename + "&new=" + newname); - } -} - //000000000000000000000000000 function previewfile(filename) { msgline("Please wait. Creating preview..."); var previewxhr = new XMLHttpRequest(); previewxhr.responseType = "blob"; - previewxhr.onreadystatechange = function () { + previewxhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { var newwin = windowhtml; - var winid = "win"+windowcounter; - newwin = newwin.replaceAll("%i%", "win"+windowcounter); + var winid = "win" + windowcounter; + newwin = newwin.replaceAll("%i%", "win" + windowcounter); newwin = newwin.replaceAll("%t%", filename); var elem = document.createRange().createContextualFragment(newwin); document.body.appendChild(elem); @@ -396,26 +399,26 @@ function previewfile(filename) { // console.log(previewxhr.getResponseHeader('content-type')); // alles furchtbar umständlich, weil bilder nur als BLOB funktionieren und Text daher wieder aus dem Blob gelesen werden muss... - var content = document.querySelector("#"+winid+" .windowcontent"); - var dragger = document.querySelector("#"+winid+" .windowtitle"); - var winid = '#'+"win"+windowcounter; + var content = document.querySelector("#" + winid + " .windowcontent"); + var dragger = document.querySelector("#" + winid + " .windowtitle"); + var winid = '#' + "win" + windowcounter; var node = document.querySelector(winid); if (previewxhr.getResponseHeader('content-type').startsWith("image/")) { - var image = new Image(); - image.src = URL.createObjectURL(previewxhr.response); - content.appendChild(image); - makeDraggable(node); - } else { - content.style.whiteSpace = "pre"; - const reader = new FileReader(); - reader.addEventListener('loadend', (e) => { - content.textContent = e.srcElement.result; - // Warten, bis Content vollständig ASYNC! + var image = new Image(); + image.src = URL.createObjectURL(previewxhr.response); + content.appendChild(image); makeDraggable(node); - }); - reader.readAsText(previewxhr.response); - } + } else { + content.style.whiteSpace = "pre"; + const reader = new FileReader(); + reader.addEventListener('loadend', (e) => { + content.textContent = e.srcElement.result; + // Warten, bis Content vollständig ASYNC! + makeDraggable(node); + }); + reader.readAsText(previewxhr.response); + } windowcounter++; msgline(""); @@ -433,7 +436,7 @@ function editfile(filename) { msgline("Please wait. Creating editor..."); var editxhr = new XMLHttpRequest(); - editxhr.onreadystatechange = function () { + editxhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { hidepathtree(); @@ -444,8 +447,8 @@ function editfile(filename) { elemento3.innerHTML = "Edit " + filename; var elem = document.getElementById("tect"); - elem.style.height = (window.innerHeight-120)+"px"; - elem.style.width = (window.innerWidth-150)+"px"; + elem.style.height = (window.innerHeight - 120) + "px"; + elem.style.width = (window.innerWidth - 150) + "px"; msgline(""); waitspinner(false); @@ -481,7 +484,7 @@ function sved(filename) { // ajax does not do xhr.setRequestHeader("Content-length", body.length); - xhr.onreadystatechange = function () { + xhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { elementei.innerHTML = ""; @@ -512,7 +515,7 @@ function uploadFile(file, islast) { var xhr = new XMLHttpRequest(); lastpercentComplete = -1; xhr.upload.onprogress = progressfunc; - xhr.onreadystatechange = function () { + xhr.onreadystatechange = function() { // console.log(xhr.status); var DONE = this.DONE || 4; if (this.readyState === DONE) { @@ -600,31 +603,23 @@ function msgline(msg) { elementmsg.innerHTML = msg; } -//000000000000000000000000000 -function downloadall(param) { - if (param==0) { - msgline("Sending this folder in one zip file."); - } else { - msgline("Sending all files in one zip file."); - } - window.location.href = "/job?fs=" + getFileSystemIndex() + "&job=dwnldll&fn=dummy&folder=" + foldername; - msgline(""); -} - //000000000000000000000000000 function makeDraggable(box) { - let cX = 0, cY = 0, pX = 0, pY = 0; + let cX = 0, + cY = 0, + pX = 0, + pY = 0; box.setAttribute("floater", "true"); box.classList.add("windowstyle"); let content = box.querySelector('.windowcontent'); if (content) { - if (content.clientHeight>window.innerHeight) { - content.style.height=window.innerHeight/2+"px"; - } - if (content.clientWidth>window.innerWidth) { - content.style.width=window.innerWidth/2+"px"; - } + if (content.clientHeight > window.innerHeight) { + content.style.height = window.innerHeight / 2 + "px"; + } + if (content.clientWidth > window.innerWidth) { + content.style.width = window.innerWidth / 2 + "px"; + } } let title = box.querySelector('.windowtitle'); @@ -707,8 +702,8 @@ function makeDraggable(box) { box.style.width = e.pageX - box.getBoundingClientRect().left + 'px'; box.style.height = e.pageY - box.getBoundingClientRect().top + 'px'; if (content) { - content.style.width = e.pageX - content.getBoundingClientRect().left + 'px'; - content.style.height = e.pageY - content.getBoundingClientRect().top + 'px'; + content.style.width = e.pageX - content.getBoundingClientRect().left + 'px'; + content.style.height = e.pageY - content.getBoundingClientRect().top + 'px'; } } @@ -718,6 +713,111 @@ function makeDraggable(box) { } } +//000000000000000000000000000 +//000000000000000000000000000 +function deletefile(filename) { + var fri = filedeleteinsert; + fri = fri.replaceAll("%f%", filename); + showdialog(deletefileinit, deletefileanalyzer, fri, "Delete file", filename); +} + +//000000000000000000000000000 +function deletefileinit(formdata) { + document.getElementById("filename").value = formdata; +} + +//000000000000000000000000000 +function deletefileanalyzer(formdata) { + var filename = document.getElementById("filename").value; + + msgline("Please wait. Delete in progress..."); + executecommand("job=del&fn=" + filename); +} + +//000000000000000000000000000 +//000000000000000000000000000 +function renamefile(filename) { + var fri = filerenameinsert; + fri = fri.replaceAll("%f%", filesysteminfos); + showdialog(renamefileinit, renamefileanalyzer, fri, "Rename/Move file", filename); +} + +//000000000000000000000000000 +function renamefileinit(formdata) { + document.getElementById("newname").value = formdata; + document.getElementById("oldname").value = formdata; +} + +//000000000000000000000000000 +function renamefileanalyzer(formdata) { + var filename = document.getElementById("finame").value; + + msgline("Please wait. Rename in progress..."); + executecommand("job=ren&fn=" + oldname + "&new=" + newname); +} + +//000000000000000000000000000 +//000000000000000000000000000 +function downloadmgrresanalyzer() { + var radios = document.getElementsByTagName('input'); + var value = 0; + for (var i = 0; i < radios.length; i++) { + if (radios[i].type === 'radio' && radios[i].checked) { + value = radios[i].value; + } + } + + if (value > 0) { + window.location.href = "/job?fs=" + getFileSystemIndex() + "&job=dwnldll&mode=" + value + "&fn=dummy&folder=" + foldername; + } +} + +//000000000000000000000000000 +function downloadmgr() { + showdialog(0, downloadmgrresanalyzer, folderdownloadinsert, "Download files"); +} + + +//000000000000000000000000000 +//000000000000000000000000000 +function showdialog(initcall, okcall, dialogitems, title, formdata) { + var dialog = document.getElementById("prompt"); + var result = document.getElementById("result"); + + var html = document.getElementById("windowform"); + html.innerHTML = dialogitems; + html = document.getElementById("wt"); + html.innerHTML = title; + + if (initcall) { + initcall(formdata); + } + + document.getElementById("dok") + .addEventListener("click", () => { + result.value = "ok"; + dialog.close(); + if (okcall) { + okcall(); + } + }); + + document.getElementById("dcancel") + .addEventListener("click", () => { + result.value = "cancel"; + dialog.close(); + }); + + document.getElementById("dclose") + .addEventListener("click", () => { + result.value = "cancel"; + dialog.close(); + }); + + // Async! + dialog.showModal(); +} + //000000000000000000000000000 function boot() { // Does lookup need time? diff --git a/keywords.txt b/keywords.txt index 6168c09..298f91e 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,2 +1,2 @@ -ESPxWebFlMgr2 KEYWORD1 +ESPFMfGK KEYWORD1 diff --git a/library.properties b/library.properties index 05e9498..e2adf77 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ESP32 File Manager for Generation Klick ESPFMfGK -version=2.0.8 +version=2.0.9 author=Holger Lembke maintainer=Holger Lembke sentence=Manage your ES32 file system content with a simple web based interface diff --git a/src/ESPFMfGK.cpp b/src/ESPFMfGK.cpp index 0cc811f..8ae5bc2 100644 --- a/src/ESPFMfGK.cpp +++ b/src/ESPFMfGK.cpp @@ -41,6 +41,14 @@ bool ESPFMfGK::begin() return false; } +#ifdef fileManagerServerStaticsInternallyDeflate + Serial.println("Flag: fileManagerServerStaticsInternallyDeflate"); +#endif + +#ifdef fileManagerServerStaticsInternally + Serial.println("Flag: fileManagerServerStaticsInternally"); +#endif + fileManager = new WebServer(_Port); #ifdef fileManagerServerStaticsInternally @@ -210,8 +218,10 @@ void ESPFMfGK::fileManagerNotFound(void) if (checkURLs) { int res = checkURLs(uri); + /** / Serial.print("CheckURLs res: "); Serial.println(res); + /**/ switch (res) { case 1: @@ -451,7 +461,9 @@ void ESPFMfGK::recurseFolderList(String foldername, int maxtiefe, int tiefe) //***************************************************************************************************** String ESPFMfGK::Folder1LevelUp(String foldername) { + /** / Serial.println(foldername); + /**/ int i = foldername.length(); while ((i > 0) && (foldername.charAt(i) != '/')) { @@ -459,7 +471,9 @@ String ESPFMfGK::Folder1LevelUp(String foldername) } if (i > 0) { + /** / Serial.println(foldername.substring(0, i)); + /**/ return foldername.substring(0, i); } else @@ -479,7 +493,7 @@ void ESPFMfGK::recurseFolder(String foldername, bool flatview, int maxtiefe, boo ordnerliste incl. der ebene des ordnernamens. */ int fsi = getFileSystemIndex(false); - /**/ + /** / Serial.print("fsi: "); Serial.print(fsi); Serial.println(); @@ -489,11 +503,11 @@ void ESPFMfGK::recurseFolder(String foldername, bool flatview, int maxtiefe, boo { if (foldername != "/") { - String collector = "-1:..:" + Folder1LevelUp(foldername); - collector += itemtrenner; - collector += "-2:" + foldername; - collector += itemtrenner; - fileManager->sendContent(collector); + String cache = "-1:..:" + Folder1LevelUp(foldername); + cache += itemtrenner; + cache += "-2:" + foldername; + cache += itemtrenner; + fileManager->sendContent(cache); /** / fileManager->sendContent("-1:..:" + Folder1LevelUp(foldername)); @@ -546,17 +560,17 @@ void ESPFMfGK::recurseFolder(String foldername, bool flatview, int maxtiefe, boo if (!(flags & ESPFMfGK::flagIsNotVisible)) { - String collector = String(file.path()); - collector += itemtrenner; - collector += DeUmlautFilename(String(file.path())); - collector += itemtrenner; - collector += dispFileString(file.size(), false); - collector += itemtrenner; - collector += colorline(linecounter); - collector += itemtrenner; - collector += String(flags); - collector += itemtrenner; - fileManager->sendContent(collector); + String cache = String(file.path()); + cache += itemtrenner; + cache += DeUmlautFilename(String(file.path())); + cache += itemtrenner; + cache += dispFileString(file.size(), false); + cache += itemtrenner; + cache += colorline(linecounter); + cache += itemtrenner; + cache += String(flags); + cache += itemtrenner; + fileManager->sendContent(cache); /** / fileManager->sendContent(String(file.path())); // .path() ist fqfn, .name() nur fn? @@ -621,42 +635,42 @@ void ESPFMfGK::fileManagerFileListInsert(void) int linecounter = 0; recurseFolder(path, !sit, maxtiefe, true, linecounter); - String collector = antworttrenner + "  Size: " + - dispFileString(totalBytes(fsinfo[fsi].filesystem), true) + - ", used: " + - dispFileString(usedBytes(fsinfo[fsi].filesystem), true) + - ""; + cache += "\">  Size: " + + dispFileString(totalBytes(fsinfo[fsi].filesystem), true) + + ", used: " + + dispFileString(usedBytes(fsinfo[fsi].filesystem), true) + + ""; - collector += antworttrenner; - collector += ""; for (int i = 0; i < maxfilesystem; i++) { if (i == fsi) { - collector += ""; } - collector += ""; + cache += ""; - collector += "Folders"; + cache += "/>"; - fileManager->sendContent(collector); + fileManager->sendContent(cache); // The End. fileManager->sendContent(""); } @@ -677,15 +691,22 @@ void ESPFMfGK::fileManagerBootinfo(void) // hier kann man die globalen Stati initialisieren, weil man weiß, dass die Webseite gerade frisch geladen wird. lastFileSystemIndex = -1; - String collector = // + String fsinfos = ""; + for (uint8_t i = 0; i < maxfilesystem; i++) + { + fsinfos += String(i) + ": " + fsinfo[i].fsname + " "; + } + + String cache = // BackgroundColor + // extrabootinfotrenner + // ExtraHTMLfoot + // extrabootinfotrenner + // WebPageTitle + // - extrabootinfotrenner; + extrabootinfotrenner + + fsinfos; - fileManager->send(200, F("text/html"), collector); + fileManager->send(200, F("text/html"), cache); } //***************************************************************************************************** @@ -696,6 +717,7 @@ String ESPFMfGK::getFileNameFromParam(uint32_t flag) job?fs=xx&fn=filename&job=jobtoken plus extra params for some jobs. */ + /** / Serial.println("Params"); for (int i = 0; i < fileManager->args(); i++) { @@ -704,17 +726,22 @@ String ESPFMfGK::getFileNameFromParam(uint32_t flag) Serial.print(fileManager->arg(i)); Serial.println(); } + /**/ // No flags, do nothing if (checkFileFlags == NULL) { + /** / Serial.println("CheckFileFlags==NULL"); + /**/ return ""; } if (fileManager->args() < 3) { + /** / Serial.println("Args < 3"); + /**/ return ""; } @@ -722,7 +749,9 @@ String ESPFMfGK::getFileNameFromParam(uint32_t flag) if (fn == "") { + /** / Serial.println("arg(fn) is empty"); + /**/ return ""; } @@ -739,7 +768,9 @@ String ESPFMfGK::getFileNameFromParam(uint32_t flag) { // file exists! if (checkFileFlags(*fsinfo[fsi].filesystem, fn, flagIsValidAction | flag) & flag == 0) { + /** / Serial.println("checkFileFlags fail."); + /**/ return ""; } @@ -748,7 +779,9 @@ String ESPFMfGK::getFileNameFromParam(uint32_t flag) } } + /** / Serial.println("Return nothing"); + /**/ return ""; } @@ -896,7 +929,7 @@ void ESPFMfGK::fileManagerJobber(void) if (jobname == "del") { String fn = getFileNameFromParam(flagCanDelete); - /**/ + /** / Serial.print("Delete: "); Serial.print(fn); Serial.println(); @@ -916,7 +949,7 @@ void ESPFMfGK::fileManagerJobber(void) { String fn = getFileNameFromParam(flagCanRename); String newfn = fileManager->arg("new"); - /**/ + /** / Serial.print("Rename: "); Serial.print(fn); Serial.print(" new: "); @@ -962,7 +995,7 @@ void ESPFMfGK::fileManagerJobber(void) else if (jobname == "edit") { String fn = getFileNameFromParam(flagCanEdit); - /**/ + /** / Serial.print("Edit: "); Serial.print(fn); Serial.println(); @@ -978,8 +1011,8 @@ void ESPFMfGK::fileManagerJobber(void) else if (jobname == "dwnldll") // downloadall { String fn = getFileNameFromParam(flagAllowInZip | flagCanDownload); - /**/ - Serial.print("Downloadall: "); + /** / + Serial.print("Download: "); Serial.print(fn); Serial.println(); /**/ @@ -989,18 +1022,39 @@ void ESPFMfGK::fileManagerJobber(void) return; } { - ESPFMfGKGa *z = new ESPFMfGKGa(); - z->fileManager = fileManager; - z->checkFileFlags = checkFileFlags; - z->getAllFilesInOneZIP(fsinfo[getFileSystemIndex()].filesystem, fileManager->arg("folder")); - delete z; +#ifdef ZipDownloadAll + int mode = fileManager->arg("mode").toInt(); + if (mode > 0) + { + ESPFMfGKGa *z = new ESPFMfGKGa(); + z->fileManager = fileManager; + z->checkFileFlags = checkFileFlags; + /** / + Serial.print("FSI: "); + Serial.print(getFileSystemIndex()); + Serial.print(" folder: "); + Serial.print(fileManager->arg("folder")); + Serial.print(" mode: "); + Serial.print(mode); + Serial.println(); + /**/ + z->getAllFilesInOneZIP(fsinfo[getFileSystemIndex()].filesystem, fileManager->arg("folder"), mode); + delete z; + } + else + { + Illegal404(); + } +#else + Illegal404(); +#endif } return; //<<========================== } else if ((jobname == "download") || (jobname == "preview")) { String fn = getFileNameFromParam(flagCanDownload); - /**/ + /** / Serial.print(F("Download: ")); Serial.print(fn); Serial.println(); @@ -1024,7 +1078,7 @@ void ESPFMfGK::fileManagerJobber(void) { String fn = getFileNameFromParam(flagCanCreateNew); // benötigt einen Filenamen-Fragment als Parameter, .txt wird hier angefügt - /**/ + /** / Serial.print(F("CreateNew: ")); Serial.print(fn); Serial.println(); @@ -1082,19 +1136,31 @@ void ESPFMfGK::fileManagerFileEditorInsert(String &filename) File f = fsinfo[getFileSystemIndex()].filesystem->open(filename, "r"); if (f) { + const int chuncksize = 2 * 1024; + String cache = ""; do { - String l = f.readStringUntil('\n') + '\n'; - l = escapeHTMLcontent(l); - fileManager->sendContent(l); + cache += f.readStringUntil('\n') + '\n'; + if (cache.length() >= chuncksize) + { + cache = escapeHTMLcontent(cache); + fileManager->sendContent(cache); + cache = ""; + } } while (f.available()); f.close(); + if (cache != "") + { + fileManager->sendContent(cache); + } } } else { + /** / Serial.println(filename); Serial.println(F("File not found")); + /**/ } fileManager->sendContent(ESPFMfGKWpFormExtro1); @@ -1149,7 +1215,7 @@ void ESPFMfGK::fileManagerReceiver(void) if (upload.status == UPLOAD_FILE_START) { - /**/ + /** / Serial.println("fileManagerReceiver: Start"); Serial.println("Params"); @@ -1199,11 +1265,13 @@ void ESPFMfGK::fileManagerReceiver(void) } else if (upload.status == UPLOAD_FILE_WRITE) { + /** / Serial.print("handleFileUpload Data: "); Serial.println(upload.currentSize); + /**/ if (fsUploadFile) { - /**/ + /** / Serial.println("fileManagerReceiver: Write"); /**/ fsUploadFile.write(upload.buf, upload.currentSize); @@ -1211,7 +1279,7 @@ void ESPFMfGK::fileManagerReceiver(void) } else if (upload.status == UPLOAD_FILE_END) { - /**/ + /** / Serial.println("fileManagerReceiver: End"); /**/ if (fsUploadFile) diff --git a/src/ESPFMfGK.h b/src/ESPFMfGK.h index fa3eb98..f37fc66 100644 --- a/src/ESPFMfGK.h +++ b/src/ESPFMfGK.h @@ -7,11 +7,21 @@ https://github.com/holgerlembke/ESPFMfGK lembke@gmail.com + Changes + V1.9 + + new design for "download-all", "rename/move" and "delete" dialog + + option to remove zipdownloadall-code, saves 4k + + deactivated lots of serial.prints... + + Arduino-release V2.0.9 + Changes V1.8 + Arduino-release V2.0.8 Changes + V1.8 + + Editorinsert schickt größere Datenchunks + V1.7 + preview-fenster-titel transparenz optimiert + Redesign ZIP-Schnittstelle, Verlagerung in eigenen .h/.cpp wg. Sourcecodeumfangsverminderung @@ -67,6 +77,10 @@ // #define fileManagerServerStaticsInternallyDeflate +// if you do not need the "download all files" function, commenting out this define saves about 4k code space +#define ZipDownloadAll + + // Callback for "foreign" URLs called to web server. If not set, all files will be served // Result: // 0: deny diff --git a/src/ESPFMfGKGa.cpp b/src/ESPFMfGKGa.cpp index c6752b1..73a7127 100644 --- a/src/ESPFMfGKGa.cpp +++ b/src/ESPFMfGKGa.cpp @@ -63,7 +63,7 @@ struct __attribute__((__packed__)) zipCentralDirectoryFileHeader }; //***************************************************************************************************** -void ESPFMfGKGa::deletefoldert(folder_t *root /**/) +void ESPFMfGKGa::deletefoldert(folder_t *root) { while (root) { @@ -74,7 +74,7 @@ void ESPFMfGKGa::deletefoldert(folder_t *root /**/) } //***************************************************************************************************** -void ESPFMfGKGa::displayfoldert(folder_t *root /**/) +void ESPFMfGKGa::displayfoldert(folder_t *root) { while (root) { @@ -84,7 +84,7 @@ void ESPFMfGKGa::displayfoldert(folder_t *root /**/) } //***************************************************************************************************** -ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfilelistrecurser(fs::FS &fs, String pfad, ESPFMfGKGa::folder_t *localroot /**/) +ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfolderlistrecurser(fs::FS &fs, String pfad, ESPFMfGKGa::folder_t *localroot) { File rootfile = fs.open(pfad); if (!rootfile) @@ -113,7 +113,7 @@ ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfilelistrecurser(fs::FS &fs, String pfad, localroot->foldername = file.path(); localroot->next = NULL; - localroot = buildfilelistrecurser(fs, file.path(), localroot); + localroot = buildfolderlistrecurser(fs, file.path(), localroot); } file = rootfile.openNextFile(); } @@ -121,7 +121,7 @@ ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfilelistrecurser(fs::FS &fs, String pfad, } //***************************************************************************************************** -ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfilelist(fs::FS &fs /**/, String rootfolder) +ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfolderlist(fs::FS &fs, String rootfolder, int mode) { /** / Serial.print("buildfilelist root: "); @@ -132,7 +132,10 @@ ESPFMfGKGa::folder_t *ESPFMfGKGa::buildfilelist(fs::FS &fs /**/, String rootfold root->next = NULL; root->foldername = rootfolder; - buildfilelistrecurser(fs, rootfolder, root); + if (mode != 2) + { + buildfolderlistrecurser(fs, rootfolder, root); + } return root; } @@ -158,13 +161,24 @@ int ESPFMfGKGa::WriteChunk(const char *b, size_t l) https://hexed.it/?hl=de HxD https://mh-nexus.de/de/ unzip -t + https://www.youtube.com/watch?v=0kadkQDc1Ts This code needs some memory: 4 * + copybuffersize Uses no compression, because, well, code size. Should be good for 4mb. + + rootfolder + empty ---> / + else ---> folder + + mode + 1 all files on device + 2 this folder + 3 this folder and subfolders + */ -void ESPFMfGKGa::getAllFilesInOneZIP(fs::FS *fs, String rootfolder) +void ESPFMfGKGa::getAllFilesInOneZIP(fs::FS *fs, String rootfolder, int mode) { const int copybuffersize = 4 * 512; // Any suggestion about optimal size? @@ -183,7 +197,7 @@ void ESPFMfGKGa::getAllFilesInOneZIP(fs::FS *fs, String rootfolder) } // Pass -1: get folder list - folder_t *folderlist = buildfilelist(*fs, rootfolder); + folder_t *folderlist = buildfolderlist(*fs, rootfolder, mode); /** / displayfoldert(folderlist); /**/ @@ -227,7 +241,7 @@ void ESPFMfGKGa::getAllFilesInOneZIP(fs::FS *fs, String rootfolder) // Pass 1: local headers + file { - uint8_t * copybuffer; + uint8_t *copybuffer; copybuffer = new uint8_t[copybuffersize]; zipFileHeader zip; diff --git a/src/ESPFMfGKGa.h b/src/ESPFMfGKGa.h index 65aaa48..fc0854c 100644 --- a/src/ESPFMfGKGa.h +++ b/src/ESPFMfGKGa.h @@ -32,10 +32,10 @@ class ESPFMfGKGa String foldername; }; - void deletefoldert(folder_t *root /**/); - void displayfoldert(folder_t *root /**/); - folder_t *buildfilelistrecurser(fs::FS &fs, String pfad, folder_t *localroot /**/); - folder_t *buildfilelist(fs::FS &fs, String rootfolder /**/); + void deletefoldert(folder_t *root); + void displayfoldert(folder_t *root); + folder_t *buildfolderlistrecurser(fs::FS &fs, String pfad, folder_t *localroot); + folder_t *buildfolderlist(fs::FS &fs, String rootfolder, int mode); int WriteChunk(const char *b, size_t l); @@ -43,7 +43,7 @@ class ESPFMfGKGa WebServer *fileManager = NULL; ESPxWebCallbackFlags_t checkFileFlags = NULL; - void getAllFilesInOneZIP(fs::FS *fs, String rootfolder); + void getAllFilesInOneZIP(fs::FS *fs, String rootfolder, int mode); }; #endif diff --git a/src/ESPFMfGKWp.h b/src/ESPFMfGKWp.h index d0a6123..61bcaaa 100644 --- a/src/ESPFMfGKWp.h +++ b/src/ESPFMfGKWp.h @@ -10,76 +10,95 @@ static const char ESPFMfGKWpindexpage[] PROGMEM = R"==x==( - FileManager - - - + FileManager + + + -
-
- - - - - -
- -
-
 
-
 + 
-
-
 
-
 
- -
-
 
-
-
 
-
-
-
- File
- Drop
- Zone
-
-
-
 
-
-
 
-
-
- -
 
-
Download all files this folder
-
Loading...
-
 
-
-
- Path name should appear here. -
-
-
- Tree List should appear here. +
+
+ + + + + +
+ +
+
 
+
 + 
-
- File list should appear here. +
 
+
 
+ +
+
 
+
+
 
+
-
- Editor should appear here. +
+ File
+ Drop
+ Zone
-
- Preview should appear here. +
+
 
+
+
 
+
+
+ +
 
+
Download all files
+
Loading...
+
 
+
+
+ Path name should appear here. +
+
+
+ Tree List should appear here. +
+
+ File list should appear here. +
+
+ Editor should appear here. +
+
+ Preview should appear here. +
+
-
-
- + + + +
+
+
%t%
+
+
 
+
+
+ +
+ +   +
+ + +
+
+
+ - )==x=="; static const char ESPFMfGKWpjavascript[] PROGMEM = R"==x==( @@ -94,25 +113,40 @@ var elementti = null; var elementpi = null; var elementws = null; -var sektionstrenner = String.fromCharCode(3, 1, 2); -var antworttrenner = String.fromCharCode(2, 1, 3); -var itemtrenner = String.fromCharCode(2, 1, 4); -var bootinfotrenner = String.fromCharCode(2, 1, 7); +const sektionstrenner = String.fromCharCode(3, 1, 2); +const antworttrenner = String.fromCharCode(2, 1, 3); +const itemtrenner = String.fromCharCode(2, 1, 4); +const bootinfotrenner = String.fromCharCode(2, 1, 7); var foldername = ""; var windowcounter = 0; +var filesysteminfos = ""; -var pathinsertintro = +const pathinsertintro = "
"; -var pathinsertextro = +const pathinsertextro = "
" + "
 
" + "
"; -var windowhtml = "
%t%
"+ -"
 
"+ -"
:::
"; +const folderdownloadinsert = + "
" + + "
" + + "
"; + +const filerenameinsert = + "New name:

" + + "Changing the path will move the file. Start with file system number to move to other device.
" + + "Active filesystems are: %f%.
" + + "Example: 1:/path/path/filename.extention

"; + +const filedeleteinsert = + "Delete file %f%?


Deleting files is final.

"; + +const windowhtml = "
%t%
" + + "
 
" + + "
:::
"; //000000000000000000000000000 function compressurlfile(source) { @@ -124,7 +158,7 @@ function compressurlfile(source) { msgline("Fetching file..."); var request = new XMLHttpRequest(); - request.onprogress = function (evt) { + request.onprogress = function(evt) { if (evt.lengthComputable) { var percentComplete = Math.round((evt.loaded / evt.total) * 100.0); if (lastpercentComplete != percentComplete) { @@ -133,7 +167,7 @@ function compressurlfile(source) { } } } - request.onreadystatechange = function () { + request.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { var data = this.responseText; @@ -148,7 +182,7 @@ function compressurlfile(source) { msgline("Sending compressed file..."); var sendback = new XMLHttpRequest(); - sendback.upload.onprogress = function (evt) { + sendback.upload.onprogress = function(evt) { if (evt.lengthComputable) { var percentComplete = Math.round((evt.loaded / evt.total) * 100.0); if (lastpercentComplete != percentComplete) { @@ -157,7 +191,7 @@ function compressurlfile(source) { } } } - sendback.onreadystatechange = function () { + sendback.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { getfileinsert(); @@ -191,7 +225,7 @@ function getFileSystemIndex() { //000000000000000000000000000 function executecommand(command) { var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = function () { + xhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { getfileinsert(); @@ -274,17 +308,17 @@ function AnswerProcessor() { p += "\u25B2  /"; skip = true; } else - if (level == -2) { // current folder name - fullpath = entry[1]; - var fp = ""; - for (var k=1;k"+ pathitems[k] +"/"; - } - skip = true; - } else { - s += "
"; + if (level == -2) { // current folder name + fullpath = entry[1]; + var fp = ""; + for (var k = 1; k < pathitems.length; k++) { + fp += "/" + pathitems[k]; + p += "" + pathitems[k] + "/"; } + skip = true; + } else { + s += "
"; + } if (!skip) { var level = parseInt(entry[0]); @@ -359,16 +393,16 @@ function AnswerProcessor() { // Makros aufloesen // Displayname ist umstaendlich, weil die Datenhaltung etwas umstaendlich ist - if (fullpath!="") { - var fdp = ""; - if (fullpath=="/") { - fdp = items[c + 1].substring(1); - } else { - fdp = items[c + 1].substring(fullpath.length+1); - } - s = s.replaceAll("%fd", fdp); - } else { - s = s.replaceAll("%fd", items[c + 1]); + if (fullpath != "") { + var fdp = ""; + if (fullpath == "/") { + fdp = items[c + 1].substring(1); + } else { + fdp = items[c + 1].substring(fullpath.length + 1); + } + s = s.replaceAll("%fd", fdp); + } else { + s = s.replaceAll("%fd", items[c + 1]); } s = s.replaceAll("%fn", items[c + 0]); s = s.replaceAll("%fs", items[c + 2]); @@ -406,21 +440,26 @@ function BootAnswerProcessor() { // console.log('Bootinfos: '+res.length); // ESPxWebFlMgr2::Backgroundcolor - if ((res.length>=1) && (res[0] != "")) { + if ((res.length >= 1) && (res[0] != "")) { var c = document.getElementsByClassName('background'); for (i = 0; i < c.length; i++) { c[i].style.backgroundColor = res[0]; } } // ESPxWebFlMgr2::ExtraHTMLfoot - if ((res.length>=2) && (res[1] != "")) { + if ((res.length >= 2) && (res[1] != "")) { var d = document.getElementById("foot"); d.innerHTML = res[1]; } // Seitentitle - if ((res.length>=3) && (res[2] != "")) { - document.title = res[2]; + if ((res.length >= 3) && (res[2] != "")) { + document.title = res[2]; + } + + // Filesysteminfo + if ((res.length >= 4) && (res[3] != "")) { + filesysteminfos = res[3]; } // und nun kann die Dateiliste geholt werden @@ -439,42 +478,25 @@ function downloadfile(filename) { window.location.href = "/job?fs=" + getFileSystemIndex() + "&job=download&fn=" + filename; } -//000000000000000000000000000 -function deletefile(filename) { - if (confirm("Really delete " + filename)) { - msgline("Please wait. Delete in progress..."); - executecommand("job=del&fn=" + filename); - } -} - //000000000000000000000000000 function makeemptyfile(filename) { msgline("Please wait. Create new empty file..."); executecommand("job=createnew&fn=" + foldername + "/newfile"); } -//000000000000000000000000000 -function renamefile(filename) { - var newname = prompt("new name for " + filename, filename); - if (newname != null) { - msgline("Please wait. Rename in progress..."); - executecommand("job=ren&fn=" + filename + "&new=" + newname); - } -} - //000000000000000000000000000 function previewfile(filename) { msgline("Please wait. Creating preview..."); var previewxhr = new XMLHttpRequest(); previewxhr.responseType = "blob"; - previewxhr.onreadystatechange = function () { + previewxhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { var newwin = windowhtml; - var winid = "win"+windowcounter; - newwin = newwin.replaceAll("%i%", "win"+windowcounter); + var winid = "win" + windowcounter; + newwin = newwin.replaceAll("%i%", "win" + windowcounter); newwin = newwin.replaceAll("%t%", filename); var elem = document.createRange().createContextualFragment(newwin); document.body.appendChild(elem); @@ -482,26 +504,26 @@ function previewfile(filename) { // console.log(previewxhr.getResponseHeader('content-type')); // alles furchtbar umständlich, weil bilder nur als BLOB funktionieren und Text daher wieder aus dem Blob gelesen werden muss... - var content = document.querySelector("#"+winid+" .windowcontent"); - var dragger = document.querySelector("#"+winid+" .windowtitle"); - var winid = '#'+"win"+windowcounter; + var content = document.querySelector("#" + winid + " .windowcontent"); + var dragger = document.querySelector("#" + winid + " .windowtitle"); + var winid = '#' + "win" + windowcounter; var node = document.querySelector(winid); if (previewxhr.getResponseHeader('content-type').startsWith("image/")) { - var image = new Image(); - image.src = URL.createObjectURL(previewxhr.response); - content.appendChild(image); - makeDraggable(node); - } else { - content.style.whiteSpace = "pre"; - const reader = new FileReader(); - reader.addEventListener('loadend', (e) => { - content.textContent = e.srcElement.result; - // Warten, bis Content vollständig ASYNC! + var image = new Image(); + image.src = URL.createObjectURL(previewxhr.response); + content.appendChild(image); makeDraggable(node); - }); - reader.readAsText(previewxhr.response); - } + } else { + content.style.whiteSpace = "pre"; + const reader = new FileReader(); + reader.addEventListener('loadend', (e) => { + content.textContent = e.srcElement.result; + // Warten, bis Content vollständig ASYNC! + makeDraggable(node); + }); + reader.readAsText(previewxhr.response); + } windowcounter++; msgline(""); @@ -519,7 +541,7 @@ function editfile(filename) { msgline("Please wait. Creating editor..."); var editxhr = new XMLHttpRequest(); - editxhr.onreadystatechange = function () { + editxhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { hidepathtree(); @@ -530,8 +552,8 @@ function editfile(filename) { elemento3.innerHTML = "Edit " + filename; var elem = document.getElementById("tect"); - elem.style.height = (window.innerHeight-120)+"px"; - elem.style.width = (window.innerWidth-150)+"px"; + elem.style.height = (window.innerHeight - 120) + "px"; + elem.style.width = (window.innerWidth - 150) + "px"; msgline(""); waitspinner(false); @@ -567,7 +589,7 @@ function sved(filename) { // ajax does not do xhr.setRequestHeader("Content-length", body.length); - xhr.onreadystatechange = function () { + xhr.onreadystatechange = function() { var DONE = this.DONE || 4; if (this.readyState === DONE) { elementei.innerHTML = ""; @@ -598,7 +620,7 @@ function uploadFile(file, islast) { var xhr = new XMLHttpRequest(); lastpercentComplete = -1; xhr.upload.onprogress = progressfunc; - xhr.onreadystatechange = function () { + xhr.onreadystatechange = function() { // console.log(xhr.status); var DONE = this.DONE || 4; if (this.readyState === DONE) { @@ -686,31 +708,23 @@ function msgline(msg) { elementmsg.innerHTML = msg; } -//000000000000000000000000000 -function downloadall(param) { - if (param==0) { - msgline("Sending this folder in one zip file."); - } else { - msgline("Sending all files in one zip file."); - } - window.location.href = "/job?fs=" + getFileSystemIndex() + "&job=dwnldll&fn=dummy&folder=" + foldername; - msgline(""); -} - //000000000000000000000000000 function makeDraggable(box) { - let cX = 0, cY = 0, pX = 0, pY = 0; + let cX = 0, + cY = 0, + pX = 0, + pY = 0; box.setAttribute("floater", "true"); box.classList.add("windowstyle"); let content = box.querySelector('.windowcontent'); if (content) { - if (content.clientHeight>window.innerHeight) { - content.style.height=window.innerHeight/2+"px"; - } - if (content.clientWidth>window.innerWidth) { - content.style.width=window.innerWidth/2+"px"; - } + if (content.clientHeight > window.innerHeight) { + content.style.height = window.innerHeight / 2 + "px"; + } + if (content.clientWidth > window.innerWidth) { + content.style.width = window.innerWidth / 2 + "px"; + } } let title = box.querySelector('.windowtitle'); @@ -793,8 +807,8 @@ function makeDraggable(box) { box.style.width = e.pageX - box.getBoundingClientRect().left + 'px'; box.style.height = e.pageY - box.getBoundingClientRect().top + 'px'; if (content) { - content.style.width = e.pageX - content.getBoundingClientRect().left + 'px'; - content.style.height = e.pageY - content.getBoundingClientRect().top + 'px'; + content.style.width = e.pageX - content.getBoundingClientRect().left + 'px'; + content.style.height = e.pageY - content.getBoundingClientRect().top + 'px'; } } @@ -804,6 +818,111 @@ function makeDraggable(box) { } } +//000000000000000000000000000 +//000000000000000000000000000 +function deletefile(filename) { + var fri = filedeleteinsert; + fri = fri.replaceAll("%f%", filename); + showdialog(deletefileinit, deletefileanalyzer, fri, "Delete file", filename); +} + +//000000000000000000000000000 +function deletefileinit(formdata) { + document.getElementById("filename").value = formdata; +} + +//000000000000000000000000000 +function deletefileanalyzer(formdata) { + var filename = document.getElementById("filename").value; + + msgline("Please wait. Delete in progress..."); + executecommand("job=del&fn=" + filename); +} + +//000000000000000000000000000 +//000000000000000000000000000 +function renamefile(filename) { + var fri = filerenameinsert; + fri = fri.replaceAll("%f%", filesysteminfos); + showdialog(renamefileinit, renamefileanalyzer, fri, "Rename/Move file", filename); +} + +//000000000000000000000000000 +function renamefileinit(formdata) { + document.getElementById("newname").value = formdata; + document.getElementById("oldname").value = formdata; +} + +//000000000000000000000000000 +function renamefileanalyzer(formdata) { + var filename = document.getElementById("finame").value; + + msgline("Please wait. Rename in progress..."); + executecommand("job=ren&fn=" + oldname + "&new=" + newname); +} + +//000000000000000000000000000 +//000000000000000000000000000 +function downloadmgrresanalyzer() { + var radios = document.getElementsByTagName('input'); + var value = 0; + for (var i = 0; i < radios.length; i++) { + if (radios[i].type === 'radio' && radios[i].checked) { + value = radios[i].value; + } + } + + if (value > 0) { + window.location.href = "/job?fs=" + getFileSystemIndex() + "&job=dwnldll&mode=" + value + "&fn=dummy&folder=" + foldername; + } +} + +//000000000000000000000000000 +function downloadmgr() { + showdialog(0, downloadmgrresanalyzer, folderdownloadinsert, "Download files"); +} + + +//000000000000000000000000000 +//000000000000000000000000000 +function showdialog(initcall, okcall, dialogitems, title, formdata) { + var dialog = document.getElementById("prompt"); + var result = document.getElementById("result"); + + var html = document.getElementById("windowform"); + html.innerHTML = dialogitems; + html = document.getElementById("wt"); + html.innerHTML = title; + + if (initcall) { + initcall(formdata); + } + + document.getElementById("dok") + .addEventListener("click", () => { + result.value = "ok"; + dialog.close(); + if (okcall) { + okcall(); + } + }); + + document.getElementById("dcancel") + .addEventListener("click", () => { + result.value = "cancel"; + dialog.close(); + }); + + document.getElementById("dclose") + .addEventListener("click", () => { + result.value = "cancel"; + dialog.close(); + }); + + // Async! + dialog.showModal(); +} + //000000000000000000000000000 function boot() { // Does lookup need time? @@ -829,416 +948,420 @@ window.onload = boot; static const char ESPFMfGKWpcss[] PROGMEM = R"==g==( .background { - background-color: black; + background-color: black; } div { - margin: 1px; - padding: 0; - font-family: 'Segoe UI', Verdana, sans-serif; + margin: 1px; + padding: 0; + font-family: 'Segoe UI', Verdana, sans-serif; } #gc { - display: grid; - grid-template-columns: 80px 25% auto 30px; - grid-template-rows: 25px 30px auto 30px 20px; - grid-template-areas: "o1 o2 o3 o4""m1 c c c""m2 c c c""m3 c c c""u1 u2 u3 u4"; + display: grid; + grid-template-columns: 80px 25% auto 30px; + grid-template-rows: 25px 30px auto 30px 20px; + grid-template-areas: "o1 o2 o3 o4""m1 c c c""m2 c c c""m3 c c c""u1 u2 u3 u4"; } #wait { - position: relative; - top: 10px; - left: 15px; - visibility: collapse; + position: relative; + top: 10px; + left: 15px; + visibility: collapse; } #ca, #ta, #ti, #pi, #fi { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } #ca {} #ti { - float: left; + float: left; } #fi {} #ei, #pv { - display: none; + display: none; } .o1 { - grid-area: o1; - background-color: #9999CC; - border-top-left-radius: 20px; - margin-bottom: 0px; + grid-area: o1; + background-color: #9999CC; + border-top-left-radius: 20px; + margin-bottom: 0px; } .o2 { - grid-area: o2; - background-color: #9999FF; - margin-bottom: 0px; - white-space: nowrap; - display: grid; - grid-auto-rows: 1fr; - grid-template-columns: 1fr 20px; - gap: 0px 0px; + grid-area: o2; + background-color: #9999FF; + margin-bottom: 0px; + white-space: nowrap; + display: grid; + grid-auto-rows: 1fr; + grid-template-columns: 1fr 20px; + gap: 0px 0px; } #o2i2 { - background-color: #BBB2FF; - margin: 0; - padding: 0; - cursor: default; - color: white; + background-color: #BBB2FF; + margin: 0; + padding: 0; + cursor: default; + color: white; } #o2i2:hover { - background-color: #D36669; - color: black; + background-color: #D36669; + color: black; } .o2 select { - border: 0px; - color: white; - font-weight: bold; - background-color: transparent; + border: 0px; + color: white; + font-weight: bold; + background-color: transparent; } .o2 option { - border: 0px; - color: black; - background-color: white; + border: 0px; + color: black; + background-color: white; } .o2 label { - color: white; + color: white; } .o3 { - grid-area: o3; - background-color: #CC99CC; - margin-bottom: 0px; - white-space: nowrap; + grid-area: o3; + background-color: #CC99CC; + margin-bottom: 0px; + white-space: nowrap; } .o4 { - grid-area: o4; - background-color: #CC6699; - border-radius: 0 10px 10px 0; - margin-bottom: 0px; + grid-area: o4; + background-color: #CC6699; + border-radius: 0 10px 10px 0; + margin-bottom: 0px; } .m1 { - grid-area: m1; - margin-top: 0px; - background-color: #9999CC; - display: grid; - grid-template-columns: 60px 20px; - grid-template-rows: 20px; - grid-template-areas: "s11 s12"; + grid-area: m1; + margin-top: 0px; + background-color: #9999CC; + display: grid; + grid-template-columns: 60px 20px; + grid-template-rows: 20px; + grid-template-areas: "s11 s12"; } .s12 { - margin: 0px; - background-color: #9999CC; + margin: 0px; + background-color: #9999CC; } .s13 { - margin: 0px; - border-top-left-radius: 20px; - height: 30px; + margin: 0px; + border-top-left-radius: 20px; + height: 30px; } .m2 { - display: flex; - justify-content: center; - align-items: center; - grid-area: m2; - background-color: #CC6699; - width: 60px; + display: flex; + justify-content: center; + align-items: center; + grid-area: m2; + background-color: #CC6699; + width: 60px; } .m3 { - grid-area: m3; - margin-bottom: 0px; - background-color: #9999CC; - display: grid; - grid-template-columns: 60px 20px; - grid-template-rows: 20px; - grid-template-areas: "s31 s32"; + grid-area: m3; + margin-bottom: 0px; + background-color: #9999CC; + display: grid; + grid-template-columns: 60px 20px; + grid-template-rows: 20px; + grid-template-areas: "s31 s32"; } .s32 { - margin: 0px; - background-color: #9999CC; + margin: 0px; + background-color: #9999CC; } .s33 { - margin: 0px; - border-bottom-left-radius: 20px; - height: 30px; + margin: 0px; + border-bottom-left-radius: 20px; + height: 30px; } .u1 { - grid-area: u1; - background-color: #9999CC; - border-bottom-left-radius: 20px; - margin-top: 0px; + grid-area: u1; + background-color: #9999CC; + border-bottom-left-radius: 20px; + margin-top: 0px; } .u2 { - grid-area: u2; - background-color: #CC6666; - margin-top: 0px; - padding-left: 10px; - vertical-align: middle; - font-size: 80%; + grid-area: u2; + background-color: #CC6666; + margin-top: 0px; + padding-left: 10px; + vertical-align: middle; + font-size: 80%; } -.u2 .s1, .u2 .s2 { - cursor: pointer; - height: 100%; - padding: 0 2px 0 2px; - display: inline-block; +.u2 .s1 { + cursor: pointer; + height: 100%; + padding: 0 4px 0 4px; + display: inline-block; } -.u2 .s1:hover, .u2 .s2:hover { - background-color: #9999FF; - border-radius: 2px; - color: white; +.u2 .s1:hover { + background-color: #9999FF; + border-radius: 2px; + color: white; } .u3 { - grid-area: u3; - padding-left: 10px; - background-color: #FF9966; - font-size: 80%; - margin-top: 0px; + grid-area: u3; + padding-left: 10px; + background-color: #FF9966; + font-size: 80%; + margin-top: 0px; } .u4 { - grid-area: u4; - background-color: #FF9900; - border-radius: 0 10px 10px 0; - margin-top: 0px; + grid-area: u4; + background-color: #FF9900; + border-radius: 0 10px 10px 0; + margin-top: 0px; } .c { - grid-area: c; + grid-area: c; } #fi button { - background-color: Transparent; - border: 1px solid #9999FF; - border-radius: 1px; - padding: 0px; - width: 30px; - cursor: pointer; + background-color: Transparent; + border: 1px solid #9999FF; + border-radius: 1px; + padding: 0px; + width: 30px; + cursor: pointer; } #fi button:hover { - background-color: #9999FF; - color: white; + background-color: #9999FF; + color: white; } .gc div { - padding: 1px; + padding: 1px; } .cc .uc { - background-color: green; - display: none; + background-color: green; + display: none; } .ccg, ccu { - height: 1.5em; + height: 1.5em; } .ccg { - background-color: #A5A5FF; + background-color: #A5A5FF; } .ccu { - background-color: #FE9A00; + background-color: #FE9A00; } .ccl { - border-radius: 5px 0 0 5px; - cursor: pointer; + border-radius: 5px 0 0 5px; + cursor: pointer; } .ccl:hover { - border-radius: 5px 0 0 5px; - color: white; - cursor: pointer; + border-radius: 5px 0 0 5px; + color: white; + cursor: pointer; } .ccr { - border-radius: 0 5px 5px 0; + border-radius: 0 5px 5px 0; } .cct { - text-align: right; + text-align: right; } .gc { - display: grid; - grid-template-columns: repeat(3, max-content); + display: grid; + grid-template-columns: repeat(3, max-content); } .fnecc { - width: min-content; - margin: 0 1px; - padding-top: 2px; - display: grid; - grid-auto-rows: 1fr; - grid-template-columns: 1fr 1fr; - gap: 0px 0px; + width: min-content; + margin: 0 1px; + padding-top: 2px; + display: grid; + grid-auto-rows: 1fr; + grid-template-columns: 1fr 1fr; + gap: 0px 0px; } .fnegc { - margin: 0; - display: grid; - grid-template-columns: repeat(1, max-content); + margin: 0; + display: grid; + grid-template-columns: repeat(1, max-content); } .fne { - margin: 1px 0px 2px 0px; - background-color: white; + margin: 1px 0px 2px 0px; + background-color: white; } .fnegc div { - padding: 1px; + padding: 1px; } .fnes { - padding: 0px 5px 0px 5px; - cursor: pointer; - border-radius: 5px; + padding: 0px 5px 0px 5px; + cursor: pointer; + border-radius: 5px; } .fnesl { - border: 1px solid #EDC315; - background-color: #EDC315; - color: black; + border: 1px solid #EDC315; + background-color: #EDC315; + color: black; } .fnesl:hover { - border: 1px solid #EDC315; - background-color: #EDC315; - color: white; + border: 1px solid #EDC315; + background-color: #EDC315; + color: white; } .fnesa { - border: 1px solid #F8FBDB; - background-color: #F8FBDB; - color: #white; + border: 1px solid #F8FBDB; + background-color: #F8FBDB; + color: white; } /* back button */ .fneba { - background-color: #EDC315; - border: 3px solid #EDC315; - border-radius: 4px; - padding: 0px 5px 0px 5px; - margin: 0; - font-size: 0.7em; - cursor: pointer; + background-color: #EDC315; + border: 3px solid #EDC315; + border-radius: 4px; + padding: 0px 5px 0px 5px; + margin: 0; + font-size: 0.7em; + cursor: pointer; } .fneba:hover { - color: white; - background-color: #9999FF; - border: 3px solid #9999FF; - border-radius: 4px; + color: white; + background-color: #9999FF; + border: 3px solid #9999FF; + border-radius: 4px; } -// EditorInsert +/* EditorInsert */ #ei button { - white-space: nowrap; - background-color: #F8FBDB; - border: 3px solid #F8FBDB; - border-radius: 4px; - padding: 5px 3px 5px 3px; - margin-bottom: 0.7em; - font-weight: bold; - cursor: pointer; + white-space: nowrap; + background-color: #F8FBDB; + border: 3px solid #F8FBDB; + border-radius: 4px; + padding: 5px 3px 5px 3px; + margin-bottom: 0.7em; + font-weight: bold; + cursor: pointer; } #ei button:hover { - background-color: #9999FF; - border-radius: 4px; - border: 3px solid #F8FBDB; - color: white; + background-color: #9999FF; + border-radius: 4px; + border: 3px solid #F8FBDB; + color: white; } /* pfad tabelle */ #pl { - display: inline-grid; - grid-template-columns: auto 20px 40px 1fr 40px 20px auto; - grid-template-rows: auto auto; - gap: 0px 0px; + display: inline-grid; + grid-template-columns: auto 20px 40px 1fr 40px 20px auto; + grid-template-rows: auto auto; + gap: 0px 0px; } #pl div { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } #pl .pu1 { - width: 1em; - border-radius: 0 0 0 1em; - background-color: #FF9966; - height: 100%; + width: 1em; + border-radius: 0 0 0 1em; + background-color: #FF9966; + height: 100%; } #pl .pu7 { - width: 1em; - border-radius: 0 0 1em 0; - background-color: #FF9966; - height: 100%; + width: 1em; + border-radius: 0 0 1em 0; + background-color: #FF9966; + height: 100%; } #pl .po2, #pl .po6 { - background-color: #FF9966; + background-color: #FF9966; } + #pl .po2 div { - width: 1em; - border-radius: 0 0 0 0.7em; - background-color: white; - height: 100%; - width: 100%; + width: 1em; + border-radius: 0 0 0 0.7em; + background-color: white; + height: 100%; + width: 100%; } #pl .po6 div { - width: 1em; - border-radius: 0 0 0.7em 0; - background-color: white; - height: 100%; - width: 100%; + width: 1em; + border-radius: 0 0 0.7em 0; + background-color: white; + height: 100%; + width: 100%; } -#pl .po1, #pl .po7, #pl .pu2, #pl .pu6 { - background-color: #FF9966; +#pl .po1, #pl .po7, #pl .pu2, #pl .pu6 { + background-color: #FF9966; } -#pl .pu3, #pl .pu5 { - background-color: #CC6666; + +#pl .pu3, #pl .pu5 { + background-color: #CC6666; } -#pl .pu4 { - background-color: #FFCC99; - font-size: 0.7em; + +#pl .pu4 { + background-color: #FFCC99; + font-size: 0.7em; } -#pl .po4 { - text-align: center; - height: 1.7em; + +#pl .po4 { + text-align: center; + height: 1.7em; } #pl .po4 > div { - margin-top: 0.1em; + margin-top: 0.1em; } /* Windows */ @@ -1251,8 +1374,8 @@ div { } .windowcontent { - overflow:scroll; - overflow-x:hidden; + overflow: scroll; + overflow-x: hidden; position: relative; margin: 0; padding: 0; @@ -1261,22 +1384,22 @@ div { } .windowtitle { - display: grid; + display: grid; margin: 0; - grid-auto-rows: 1fr; - grid-template-columns: 1fr 2px 20px; - gap: 0px 0px; -} - + grid-auto-rows: 1fr; + grid-template-columns: 1fr 2px 20px; + gap: 0px 0px; +} + .windowtitle .g { background-color: white; - margin:0; + margin: 0; } .windowtitle .t { padding-right: 10px; padding-left: 10px; - margin:0; + margin: 0; cursor: move; z-index: 12; background-color: #D8A570; @@ -1298,7 +1421,6 @@ div { background-color: #959FFE; } - .windowgrip { z-index: 12; margin: 0; @@ -1311,6 +1433,20 @@ div { cursor: nwse-resize; } +#windowform { + padding: 10px; +} + +dialog::backdrop { + backdrop-filter: blur(1px); +} + +#newname, #newname:focus, #newname:active { + width: 100%; + border: 1px solid gray; + border-radius: 2px; + outline: none; +} )==g=="; diff --git a/src/ESPFMfGKWpDeflate.h b/src/ESPFMfGKWpDeflate.h index 69ebb4a..356b5f5 100644 --- a/src/ESPFMfGKWpDeflate.h +++ b/src/ESPFMfGKWpDeflate.h @@ -6,528 +6,577 @@ //***************************************************************************************************** const char ESPFMfGKWpindexpageDeflate[] = { - 0x9D, 0x56, 0xC1, 0x72, 0xDA, 0x30, 0x10, 0xBD, 0xE7, 0x2B, 0x14, 0x65, 0x26, 0x93, 0x1E, 0xC0, -0x10, 0x1A, 0x5A, 0x2, 0xE6, 0x50, 0x12, 0xA6, 0x87, 0xB4, 0xC9, 0x21, 0x97, 0xF6, 0x26, 0xAC, -0xC5, 0x56, 0x91, 0x25, 0x8F, 0x24, 0x48, 0xF8, 0xFB, 0xAE, 0x6C, 0x41, 0x6C, 0x30, 0x99, 0x4C, -0x3C, 0x8C, 0x25, 0xEF, 0x3E, 0xBD, 0x7D, 0xDA, 0x5D, 0xCB, 0x4C, 0xCE, 0xEF, 0x1E, 0x67, 0xCF, -0x7F, 0x9E, 0xEE, 0x49, 0xE6, 0x72, 0x39, 0x3D, 0x9B, 0xF8, 0x81, 0x48, 0xA6, 0xD2, 0x98, 0x82, -0xA2, 0xD3, 0x33, 0xB4, 0x0, 0xE3, 0xD3, 0x33, 0x42, 0x26, 0x4E, 0x38, 0x9, 0xD3, 0xB9, 0x90, -0xF0, 0x8B, 0x29, 0x96, 0x82, 0x99, 0x44, 0x95, 0xC9, 0x3B, 0x73, 0x70, 0x8C, 0x24, 0x19, 0x33, -0x16, 0x5C, 0x4C, 0xD7, 0x6E, 0xD9, 0xF9, 0x4E, 0x49, 0x54, 0xBA, 0xA4, 0x50, 0x2B, 0x62, 0x40, -0xC6, 0xD4, 0xBA, 0xAD, 0x4, 0x9B, 0x1, 0x38, 0x4A, 0xDC, 0xB6, 0x80, 0x98, 0x3A, 0x78, 0x75, -0x51, 0x62, 0x2D, 0x25, 0x99, 0x81, 0x65, 0x4C, 0xA3, 0x65, 0xDE, 0xF5, 0x8F, 0xE5, 0x42, 0x9B, -0x18, 0x51, 0x38, 0x62, 0x4D, 0x52, 0x39, 0xFE, 0xA1, 0x7D, 0x12, 0x55, 0x56, 0x94, 0x1A, 0x55, -0xCA, 0xCE, 0x26, 0xB, 0xCD, 0xB7, 0x24, 0x91, 0xCC, 0xDA, 0x98, 0x2E, 0x58, 0xB2, 0x4A, 0x8D, -0x5E, 0x2B, 0x5E, 0x71, 0x70, 0xB1, 0x21, 0x82, 0xC7, 0x34, 0x4D, 0xCA, 0xE7, 0x60, 0x9, 0x60, -0xDD, 0xF, 0x46, 0x1F, 0x6C, 0x93, 0x96, 0xC0, 0x17, 0x26, 0x50, 0xDD, 0x8B, 0xE0, 0x2E, 0x8B, -0xE9, 0xA0, 0x87, 0xC2, 0x40, 0xA4, 0x99, 0xAB, 0xE6, 0xE5, 0x6, 0x30, 0x88, 0x36, 0x1C, 0xCC, -0x2D, 0xE9, 0x17, 0xAF, 0xC4, 0x6A, 0x29, 0x38, 0xB9, 0x18, 0xE1, 0x35, 0x9B, 0x8D, 0xC9, 0x5B, -0xFC, 0x4E, 0xA2, 0xA5, 0x36, 0xB7, 0x7B, 0xCF, 0x3E, 0x14, 0x6, 0x4B, 0x84, 0x49, 0x24, 0x20, -0x9D, 0xD1, 0x2B, 0xE4, 0xBB, 0x98, 0xCD, 0x86, 0xC3, 0xD1, 0x88, 0x6, 0x43, 0x27, 0x44, 0xEF, -0x53, 0x62, 0xF0, 0x8E, 0x71, 0x93, 0x57, 0x1C, 0x6F, 0x70, 0xDC, 0x56, 0xE3, 0x52, 0x48, 0x4C, -0x67, 0xA0, 0xE, 0x79, 0x6E, 0x52, 0xFB, 0xAD, 0x70, 0xED, 0x4A, 0x86, 0x9B, 0x8A, 0xE0, 0x5B, -0x37, 0x30, 0x94, 0x93, 0x40, 0x31, 0x9F, 0x8F, 0x46, 0xC3, 0x61, 0x93, 0x82, 0x29, 0x91, 0x33, -0x7, 0xCF, 0x86, 0x29, 0xBB, 0xD4, 0x26, 0xF, 0xB5, 0xB9, 0x28, 0xF9, 0x98, 0x73, 0x46, 0x2C, -0xD6, 0xE, 0x7E, 0xB3, 0xDC, 0x17, 0x70, 0x7, 0xDA, 0x55, 0xD4, 0x68, 0x87, 0x6B, 0x91, 0xDF, -0xE8, 0x3C, 0xA6, 0x3D, 0xD2, 0xBF, 0xC1, 0x1F, 0x3A, 0x35, 0x66, 0x70, 0xB8, 0x7F, 0xE4, 0x6B, -0xD4, 0x35, 0xC0, 0xB2, 0x1B, 0x28, 0x80, 0xB9, 0x19, 0x26, 0xC, 0x53, 0x2C, 0x14, 0x87, 0xA5, -0x50, 0xC2, 0xAF, 0xDF, 0xB, 0xC2, 0x8A, 0x6F, 0xD2, 0x50, 0xBB, 0x8, 0x8B, 0x17, 0xA6, 0xE7, -0x9D, 0x4E, 0xB3, 0x96, 0xD7, 0xB4, 0xDC, 0x34, 0x8E, 0xD3, 0x4B, 0xB5, 0xB0, 0xC5, 0xB8, 0x42, -0x93, 0x4E, 0xA7, 0xA5, 0xF0, 0x35, 0xF0, 0x2E, 0xCC, 0xAE, 0x53, 0xF4, 0xB5, 0xE8, 0x37, 0x29, -0x5A, 0x10, 0xB8, 0xBE, 0xEC, 0xFD, 0x98, 0xCE, 0xC, 0xEA, 0x7, 0xC2, 0x14, 0x81, 0xBC, 0x70, -0x5B, 0x9F, 0x57, 0x54, 0xAF, 0x55, 0x22, 0x45, 0xB2, 0x8A, 0x69, 0xCE, 0x56, 0x50, 0x3A, 0xBC, -0xFD, 0xEA, 0xCB, 0x78, 0xC7, 0x7C, 0x79, 0xF1, 0x3A, 0x9F, 0xF7, 0x7E, 0x8C, 0x1B, 0x52, 0xCB, -0xEB, 0x68, 0xA7, 0x75, 0xDD, 0x83, 0xA0, 0x7B, 0xD0, 0xA2, 0xB0, 0x1, 0xFC, 0x7A, 0x0, 0x38, -0x42, 0xE4, 0xB5, 0xDE, 0xAF, 0x99, 0x6D, 0xFF, 0x9D, 0xCD, 0xEF, 0x31, 0x6F, 0x69, 0x3B, 0xF4, -0xC, 0x6A, 0x6F, 0x40, 0x3B, 0x51, 0x4D, 0x70, 0xBB, 0xF6, 0x1C, 0x93, 0xAB, 0x15, 0x37, 0xBA, -0xC0, 0x16, 0xC6, 0xFB, 0x4F, 0xA6, 0xB8, 0x4, 0x73, 0x5, 0x1B, 0x50, 0xE, 0x33, 0x58, 0x3A, -0x59, 0xAA, 0x37, 0x80, 0x3D, 0xE4, 0x67, 0x8F, 0x38, 0x3B, 0x4, 0xED, 0xC2, 0xF9, 0xE3, 0x6A, -0xB2, 0x30, 0x6F, 0xED, 0x74, 0x87, 0x8C, 0xD, 0xC3, 0x5F, 0xAD, 0xEA, 0x88, 0x53, 0xA2, 0x30, -0xE3, 0x6D, 0xA9, 0x18, 0x7C, 0x20, 0x5D, 0x83, 0x93, 0xE9, 0x1A, 0x7C, 0x22, 0x5D, 0x47, 0xD2, -0xD6, 0x6D, 0x12, 0x1A, 0x0, 0x8C, 0x7F, 0xA7, 0x5F, 0x94, 0xD4, 0x8C, 0x7, 0xA0, 0x2D, 0xB0, -0x61, 0xF7, 0x45, 0xAB, 0xF5, 0x2B, 0xF, 0x38, 0x26, 0xE5, 0x55, 0xDF, 0xE7, 0x11, 0x27, 0x65, -0x4F, 0x5B, 0x7C, 0xF, 0x71, 0xD1, 0xB4, 0x8D, 0xE0, 0xFA, 0x4, 0x41, 0xCF, 0x13, 0xB8, 0x4C, -0x58, 0xB2, 0xD4, 0x12, 0x4F, 0xCC, 0x40, 0x71, 0x4A, 0x66, 0x68, 0xEE, 0xDC, 0xA6, 0x74, 0xFA, -0x80, 0x14, 0x42, 0xA5, 0xDD, 0x6E, 0xF7, 0x14, 0xFA, 0xB0, 0xC3, 0xF, 0x1, 0x49, 0xC5, 0x96, -0xB0, 0xE3, 0x57, 0xBC, 0x10, 0xB5, 0x82, 0x3C, 0x31, 0x97, 0x11, 0x85, 0x87, 0x19, 0xB1, 0x99, -0x5E, 0x4B, 0x4E, 0x58, 0x81, 0x47, 0x92, 0xC1, 0x73, 0xDF, 0x40, 0xF7, 0xB8, 0xA, 0x15, 0xCD, -0x41, 0x3D, 0x3D, 0xA9, 0xAB, 0x93, 0x12, 0xF2, 0x6C, 0x0, 0xC8, 0x83, 0xB0, 0xEE, 0x1D, 0xDA, -0x3, 0xE2, 0x1A, 0xD9, 0xB2, 0x49, 0xE6, 0xBB, 0x98, 0xC8, 0xCF, 0x92, 0x41, 0x93, 0xEC, 0x9E, -0xB, 0xA7, 0xCD, 0xA7, 0x98, 0x8A, 0x4D, 0x83, 0xE9, 0xC9, 0xC0, 0x46, 0xC0, 0xCB, 0xC7, 0xA9, -0xDA, 0x5E, 0xFE, 0xB7, 0xC9, 0x7E, 0xF3, 0x1A, 0x3F, 0x34, 0xBB, 0x2E, 0x99, 0x44, 0xFE, 0xF3, -0xEE, 0x3F, 0xF3, 0x51, 0xF5, 0x17, 0xE5, 0x3F }; + 0xAD, 0x56, 0xCD, 0x92, 0xDA, 0x38, 0x10, 0xBE, 0xCF, 0x53, 0x28, 0x9A, 0x4A, 0x2A, 0x7B, 0x0, +0xF, 0x21, 0x43, 0x42, 0x6, 0xFB, 0xB0, 0x4C, 0xA8, 0xAD, 0xDA, 0x64, 0x67, 0xE, 0x73, 0xC9, +0xDE, 0x84, 0xD4, 0xD8, 0x5A, 0x64, 0xC9, 0x25, 0x9, 0x18, 0xDE, 0x26, 0xCF, 0xB2, 0x4F, 0xB6, +0x6D, 0xD9, 0x10, 0xEC, 0xD8, 0x90, 0xDA, 0xC4, 0x45, 0xA1, 0x9F, 0xFE, 0xF9, 0x5A, 0x5F, 0xAB, +0x25, 0xCD, 0x5E, 0xDC, 0x3F, 0xCC, 0x9F, 0xBE, 0x3C, 0x7E, 0x24, 0x99, 0xCF, 0x55, 0x72, 0x35, +0x2B, 0x1B, 0xA2, 0x98, 0x4E, 0x63, 0xA, 0x9A, 0x26, 0x57, 0x38, 0x3, 0x4C, 0x24, 0x57, 0x4, +0xBF, 0x99, 0x97, 0x5E, 0x41, 0xB2, 0x90, 0xA, 0x3E, 0x33, 0xCD, 0x52, 0xB0, 0xB3, 0xA8, 0x9A, +0xAA, 0xC4, 0x39, 0x78, 0x46, 0x78, 0xC6, 0xAC, 0x3, 0x1F, 0xD3, 0x8D, 0x5F, 0xD, 0xDE, 0x53, +0x12, 0xD5, 0x42, 0x25, 0xF5, 0x9A, 0x58, 0x50, 0x31, 0x75, 0x7E, 0xAF, 0xC0, 0x65, 0x0, 0x9E, +0x12, 0xBF, 0x2F, 0x20, 0xA6, 0x1E, 0x9E, 0x7D, 0xC4, 0x9D, 0xA3, 0x24, 0xB3, 0xB0, 0x8A, 0x69, +0xB4, 0xCA, 0x87, 0xE5, 0xB0, 0x36, 0x75, 0xDC, 0xCA, 0xC2, 0x13, 0x67, 0x79, 0x25, 0xFA, 0x7, +0x25, 0xB3, 0xA8, 0x9A, 0xC5, 0x90, 0xA3, 0x2A, 0xC2, 0xAB, 0xD9, 0xD2, 0x88, 0x3D, 0xE1, 0x8A, +0x39, 0x17, 0xD3, 0x25, 0xE3, 0xEB, 0xD4, 0x9A, 0x8D, 0x16, 0x7, 0x2F, 0x42, 0x6E, 0x89, 0x14, +0x31, 0x4D, 0x79, 0x3D, 0x73, 0x9C, 0xAD, 0x4D, 0xCC, 0xE8, 0x44, 0x50, 0x1, 0x6F, 0xD3, 0x60, +0xB2, 0x63, 0x12, 0x63, 0xDD, 0x49, 0xE1, 0xB3, 0x98, 0x8E, 0x6F, 0x30, 0x4C, 0x90, 0x69, 0xE6, +0xAB, 0x7E, 0x58, 0xE, 0x2, 0x1A, 0x2B, 0xC0, 0x7E, 0x20, 0xA3, 0xE2, 0x99, 0x38, 0xA3, 0xA4, +0x20, 0xD7, 0x53, 0xFC, 0xE6, 0xF3, 0x3B, 0xF2, 0x2D, 0x96, 0x1, 0x37, 0xCA, 0xD8, 0xF, 0x47, +0x49, 0xB, 0x30, 0x80, 0x72, 0x69, 0xB9, 0x2, 0x74, 0x6B, 0xCD, 0x1A, 0xFD, 0x5E, 0xCF, 0xE7, +0x93, 0xC9, 0x74, 0x4A, 0xEB, 0x89, 0x41, 0x1D, 0xC5, 0x88, 0x12, 0x8B, 0xFF, 0x88, 0xCF, 0x9F, +0xB1, 0xBD, 0xC5, 0x76, 0x5F, 0xB5, 0x2B, 0xA9, 0x90, 0xE4, 0x1A, 0xE2, 0xC8, 0x7F, 0x17, 0x44, +0xB9, 0x34, 0x61, 0x7C, 0xF0, 0x74, 0x5B, 0x39, 0x7A, 0x37, 0xAC, 0x3D, 0x85, 0x4E, 0xED, 0x6A, +0xB1, 0x98, 0x4E, 0x27, 0x93, 0x6E, 0x57, 0x4C, 0xCB, 0x9C, 0x79, 0x78, 0xB2, 0x4C, 0xBB, 0x95, +0xB1, 0x79, 0x9D, 0xC1, 0xEB, 0xE0, 0x97, 0x79, 0x6F, 0xE5, 0x72, 0xE3, 0xE1, 0x2F, 0x96, 0x97, +0x69, 0x3E, 0x28, 0x1D, 0xF2, 0x6E, 0x8D, 0x47, 0x5B, 0xC4, 0xB1, 0x26, 0x8F, 0xE9, 0xD, 0x19, +0xDD, 0xE2, 0xF, 0x85, 0x6, 0x99, 0x9D, 0x1C, 0x87, 0x62, 0x83, 0xF1, 0x8D, 0x71, 0x73, 0x58, +0x28, 0x80, 0xF9, 0x39, 0x12, 0x89, 0xD4, 0x4B, 0x2D, 0x60, 0x25, 0xB5, 0x2C, 0xED, 0x5B, 0x81, +0xE1, 0xDE, 0xD8, 0xA6, 0x27, 0x39, 0x8E, 0x30, 0xC9, 0x27, 0xC3, 0x17, 0x83, 0x41, 0x33, 0xEF, +0x6F, 0x68, 0xA0, 0x2, 0xDB, 0xE4, 0x95, 0x5E, 0xBA, 0xE2, 0xAE, 0xB2, 0x20, 0x83, 0x41, 0xCF, +0x46, 0x39, 0x31, 0x68, 0x2, 0x1F, 0xF6, 0x98, 0x79, 0x23, 0x47, 0x4D, 0x67, 0xBD, 0x7A, 0xE8, +0x2B, 0xD4, 0x50, 0x4C, 0xE7, 0x16, 0x57, 0x7, 0x84, 0x69, 0x2, 0x79, 0xE1, 0xF7, 0x25, 0xFB, +0xB8, 0x36, 0xA3, 0xB9, 0x92, 0x7C, 0x1D, 0xD3, 0x9C, 0xAD, 0x21, 0x8, 0xCA, 0xF9, 0xD7, 0xBF, +0xDD, 0x1D, 0xFC, 0xBF, 0xBA, 0x7E, 0x5E, 0x2C, 0x6E, 0x7E, 0xBF, 0xEB, 0x44, 0x6B, 0xF, 0x4F, +0x57, 0x31, 0xAE, 0x57, 0x31, 0xEE, 0x89, 0xB4, 0xA1, 0xFC, 0xB6, 0xA5, 0xD4, 0xA9, 0x95, 0x7F, +0x57, 0x41, 0x27, 0x42, 0x37, 0xBA, 0x48, 0xC9, 0x51, 0xB3, 0x4D, 0xEC, 0xF7, 0x1A, 0xE3, 0x93, +0xAA, 0x3A, 0xE7, 0xF6, 0x87, 0xE9, 0xC8, 0x31, 0x11, 0x46, 0xB, 0x6B, 0xA, 0x2C, 0xA, 0xFC, +0xFF, 0x83, 0x69, 0xA1, 0xC0, 0xBE, 0x86, 0x2D, 0x68, 0x8F, 0x6C, 0x7, 0x21, 0x4B, 0xCD, 0x16, +0x70, 0x37, 0x96, 0xBD, 0x7, 0xEC, 0xB5, 0x95, 0x9A, 0xE0, 0xE5, 0x41, 0x39, 0x5B, 0xDA, 0xF6, +0xF6, 0xBC, 0x47, 0xEF, 0x1D, 0xD3, 0x7F, 0x1B, 0xDD, 0xD6, 0x3E, 0x17, 0x2E, 0x66, 0xAD, 0x9F, +0xC0, 0xF1, 0xF, 0x53, 0x3D, 0xBE, 0x48, 0xF5, 0xF8, 0xA7, 0xA8, 0xEE, 0xC, 0x7E, 0xD3, 0x17, +0x5E, 0x43, 0x9, 0x23, 0x9B, 0xB9, 0x2, 0xCB, 0xE1, 0x98, 0xF4, 0x93, 0x6A, 0x10, 0x66, 0xA7, +0x95, 0x61, 0x22, 0x4F, 0x6D, 0xA8, 0x85, 0xFB, 0x7A, 0x4C, 0x98, 0x52, 0xA1, 0x72, 0x1C, 0x9E, +0x2, 0x68, 0x9C, 0x9C, 0x43, 0xA8, 0x2B, 0x20, 0x77, 0x29, 0x4D, 0x3E, 0xA1, 0xB1, 0xD4, 0xE9, +0x70, 0x38, 0x3C, 0x67, 0xD1, 0x2E, 0x83, 0x2E, 0x25, 0x5E, 0x79, 0xE5, 0xAC, 0xEF, 0x74, 0x28, +0x64, 0x7, 0xE7, 0x8F, 0xCC, 0x67, 0x44, 0xE3, 0x39, 0x49, 0x5C, 0x66, 0x36, 0xA, 0x17, 0x52, +0xE0, 0x69, 0x67, 0xF1, 0xAA, 0xB1, 0x30, 0x3C, 0x47, 0xF4, 0xC1, 0x75, 0x4F, 0x1A, 0x4B, 0x40, +0xDF, 0x5, 0x58, 0x7E, 0x4F, 0x16, 0x80, 0x7C, 0x92, 0xCE, 0x5F, 0x4, 0xED, 0x1, 0x6E, 0xC0, +0xAC, 0xFA, 0x60, 0xCA, 0x42, 0x20, 0xEA, 0x57, 0xC1, 0x40, 0x1F, 0xCC, 0x47, 0x21, 0xBD, 0xB1, +0xBF, 0x4, 0xA3, 0xD8, 0xF6, 0x60, 0x3C, 0x5A, 0xD8, 0x4A, 0xD8, 0xFD, 0x5F, 0x90, 0xFE, 0xF3, +0xE8, 0xB4, 0x7B, 0x24, 0xD4, 0xE0, 0x2D, 0x7A, 0xD8, 0xC1, 0x7, 0x11, 0x53, 0xA6, 0x7A, 0x95, +0x14, 0x78, 0x6B, 0x16, 0x28, 0x6F, 0x6C, 0xC2, 0xFE, 0x52, 0xDF, 0xE1, 0x8D, 0x69, 0x76, 0xE1, +0xAE, 0xE9, 0x2B, 0xF9, 0xF0, 0xD6, 0xC1, 0x7B, 0xBB, 0xB6, 0x40, 0xDF, 0x2F, 0xFD, 0xCB, 0x73, +0x54, 0xD5, 0x8A, 0x58, 0x3E, 0x97, 0x8, 0x15, 0x5C, 0x19, 0x87, 0xD7, 0x59, 0x23, 0x98, 0x6A, +0x2E, 0xF9, 0xF7, 0xEB, 0x65, 0xA6, 0xBA, 0x57, 0xC3, 0x8D, 0xF6, 0x78, 0xF2, 0x96, 0xEF, 0xD4, +0xFE, 0x5, 0x5, 0xCD, 0xF0, 0xEC, 0x68, 0x50, 0xD9, 0x50, 0xC6, 0x47, 0x8A, 0x37, 0xBA, 0x7E, +0x11, 0xAD, 0x8F, 0x61, 0x2E, 0xB1, 0x9F, 0x3C, 0xFC, 0x39, 0x8B, 0x2A, 0x39, 0x46, 0x7A, 0xDE, +0x94, 0x33, 0xCD, 0x41, 0x7D, 0x33, 0xAF, 0xC7, 0xC9, 0x3C, 0xB4, 0x47, 0x37, 0x78, 0xCC, 0x77, +0x5, 0x21, 0x75, 0xB1, 0xF1, 0xF5, 0xD3, 0x28, 0x93, 0x42, 0xE0, 0x3, 0x3C, 0xB8, 0xB5, 0xE0, +0x36, 0xA, 0xD3, 0xB2, 0x65, 0x6A, 0x83, 0xA2, 0xF6, 0xB1, 0x72, 0x76, 0x4B, 0x95, 0xBB, 0xA5, +0x7C, 0x1B, 0x47, 0xE5, 0xE3, 0x38, 0x74, 0xC2, 0x43, 0xFF, 0x3F }; const char ESPFMfGKWpjavascriptDeflate[] = { - 0xC5, 0x5C, 0xFD, 0x72, 0xDB, 0x36, 0xB6, 0xFF, 0x3F, 0x4F, 0x81, 0x6A, 0x27, 0x91, 0x5C, 0xDB, -0x92, 0xED, 0xB4, 0xDD, 0xBD, 0x76, 0x94, 0x9D, 0xC4, 0x49, 0xB6, 0x99, 0x49, 0x9A, 0x4C, 0xDC, -0x4E, 0xDB, 0x49, 0xF2, 0x7, 0x45, 0x42, 0x12, 0x63, 0x8A, 0xE4, 0x92, 0x94, 0x3F, 0xB2, 0x9B, -0xB7, 0xB9, 0x6F, 0x72, 0x5F, 0xEC, 0xFE, 0xE, 0x3E, 0x48, 0x0, 0x4, 0x29, 0xC9, 0x4D, 0xA7, -0x9A, 0x49, 0x2C, 0x81, 0x7, 0x7, 0x7, 0x7, 0xE7, 0xB, 0x7, 0x7, 0xBC, 0xA, 0xA, 0xC6, -0x13, 0xBE, 0xE2, 0x69, 0x95, 0x9D, 0xC4, 0xC7, 0x6C, 0xCA, 0xD2, 0x75, 0x92, 0x9C, 0xDD, 0xBB, -0x32, 0xDA, 0x1F, 0xFA, 0x5A, 0x57, 0xE5, 0xC2, 0xD7, 0x3C, 0x8F, 0x7D, 0xAD, 0xDC, 0xDB, 0x9A, -0x5F, 0xF9, 0x5A, 0x2B, 0x3F, 0xAC, 0xB7, 0xF5, 0xBA, 0xAC, 0x5B, 0x45, 0x73, 0xC9, 0x2F, 0xAB, -0x38, 0x4B, 0xCB, 0xAA, 0xE0, 0x69, 0xCA, 0xB, 0x3C, 0xBC, 0xA8, 0x8A, 0x38, 0x5D, 0x8C, 0xE7, -0x45, 0xB6, 0x3A, 0x5F, 0x6, 0xC5, 0x79, 0x16, 0xF1, 0xD1, 0xC3, 0x3, 0x76, 0x7C, 0xC0, 0x4E, -0xF6, 0x24, 0xAA, 0x0, 0x68, 0xB2, 0xA2, 0xEA, 0xEF, 0x72, 0x22, 0xBA, 0x3C, 0x54, 0x5D, 0xE2, -0x8A, 0xAF, 0xB6, 0x81, 0xFF, 0x4E, 0xC1, 0xCF, 0xB2, 0xAC, 0x8A, 0xD3, 0x79, 0xB6, 0x4D, 0x9F, -0xBF, 0xA3, 0x8F, 0xE8, 0x34, 0xCF, 0x92, 0x88, 0x17, 0x69, 0xB0, 0xE2, 0x80, 0x1F, 0xC, 0x24, -0xA6, 0xEB, 0x38, 0x8D, 0xB2, 0xEB, 0x30, 0x5B, 0x83, 0xA7, 0x84, 0xE7, 0x48, 0x1, 0xE7, 0x41, -0xB5, 0x8C, 0xD3, 0x92, 0x17, 0x18, 0xA7, 0x2A, 0x32, 0x36, 0xBD, 0xC7, 0xF0, 0x19, 0x3C, 0x8A, -0xE2, 0x2B, 0x16, 0x47, 0xD3, 0xF, 0x83, 0x3C, 0xF9, 0x30, 0x78, 0x2C, 0x7E, 0x86, 0x49, 0x50, -0x96, 0xD4, 0x92, 0x1D, 0x53, 0xD3, 0x4, 0x6D, 0xEE, 0x83, 0x13, 0x5, 0xAB, 0x9F, 0xFA, 0x60, -0x1E, 0x76, 0x75, 0xFE, 0x4E, 0x77, 0x1E, 0xB4, 0x68, 0xE3, 0x37, 0x26, 0x6D, 0xDD, 0xB8, 0xBF, -0xEF, 0xC2, 0xFD, 0xC3, 0x16, 0x84, 0xFD, 0xBD, 0xEE, 0x3C, 0x60, 0xFB, 0x6, 0x1B, 0x6A, 0x88, -0x75, 0xD7, 0xBC, 0xD7, 0x62, 0xDE, 0xBE, 0x7, 0x5D, 0x93, 0x5D, 0xD3, 0x64, 0x1F, 0xA4, 0xB3, -0x32, 0x3F, 0xEB, 0x1F, 0xB2, 0x6B, 0x46, 0x6B, 0x31, 0x23, 0xDF, 0x83, 0x66, 0x1A, 0xA, 0xB3, -0xE2, 0xA6, 0x94, 0x80, 0x65, 0xB5, 0x4A, 0x48, 0x2C, 0x9A, 0x5, 0xBE, 0x1F, 0xDF, 0x77, 0x57, -0x58, 0x82, 0x56, 0x71, 0x95, 0x70, 0xF7, 0x51, 0x85, 0x86, 0xFB, 0xD5, 0x7D, 0xCF, 0xC8, 0x8B, -0x86, 0x7D, 0xFB, 0xF7, 0xEC, 0x69, 0x28, 0xE1, 0x4B, 0xB2, 0x92, 0x3B, 0xD3, 0xF6, 0xE0, 0xD1, -0x92, 0xA, 0x41, 0x4D, 0xAB, 0x4D, 0x38, 0x17, 0x45, 0x9C, 0x3, 0xE6, 0xF4, 0xF4, 0xD4, 0x9D, -0xF2, 0x64, 0x72, 0xD4, 0xFD, 0xB9, 0x37, 0x5F, 0xA7, 0x21, 0x29, 0x3C, 0xB, 0xB3, 0x55, 0x5E, -0xF0, 0xB2, 0x5C, 0x17, 0xC9, 0x3C, 0x4E, 0xF8, 0xA8, 0xCC, 0xD6, 0x45, 0xC8, 0xF7, 0xD8, 0x7F, -0xC4, 0x6A, 0x4C, 0x26, 0x2C, 0xBA, 0x85, 0x26, 0xC5, 0x21, 0xCB, 0xB3, 0xB2, 0x62, 0x49, 0x16, -0x44, 0xEC, 0x53, 0x49, 0x8F, 0xC4, 0x73, 0x69, 0x3A, 0xC0, 0xCF, 0x28, 0xB, 0xD7, 0x64, 0x57, -0xC6, 0x61, 0xC1, 0x83, 0x8A, 0x3F, 0x97, 0x56, 0x66, 0x34, 0x2C, 0x43, 0x10, 0x58, 0xD, 0xA1, -0x9A, 0x4, 0x5E, 0xF2, 0x71, 0x75, 0x9B, 0x13, 0xFC, 0x90, 0x44, 0x7A, 0xF2, 0x29, 0xB8, 0xA, -0x14, 0x44, 0xD, 0x50, 0x16, 0x21, 0xAD, 0xCF, 0x64, 0xF1, 0x39, 0xCE, 0x73, 0x5E, 0x8C, 0x3F, -0x95, 0x3, 0xF9, 0xAC, 0x1E, 0x62, 0xC9, 0x83, 0x68, 0x1C, 0xE0, 0x61, 0x1A, 0x9D, 0x2F, 0xE3, -0x24, 0x1A, 0x95, 0x9C, 0x54, 0x9F, 0x60, 0x60, 0x5B, 0x93, 0x38, 0xE5, 0xA3, 0xC1, 0xB, 0x5E, -0x85, 0xD0, 0x9D, 0x5, 0xA3, 0x49, 0x8D, 0xC7, 0xE3, 0x81, 0xA2, 0x80, 0x8, 0x2E, 0xF8, 0xBF, -0xD7, 0x1C, 0x93, 0x81, 0x1, 0xE4, 0xD7, 0xEC, 0xB7, 0xD7, 0xAF, 0x7E, 0xAC, 0xAA, 0xFC, 0x9D, -0x6C, 0x1C, 0x29, 0x38, 0x5, 0x33, 0xCE, 0xD2, 0xBC, 0xC8, 0x16, 0xC4, 0x20, 0x80, 0xD7, 0x4C, -0x1B, 0xF1, 0xAB, 0x4A, 0xB3, 0x88, 0x3E, 0xF1, 0x5C, 0x34, 0x8D, 0x13, 0x9E, 0x2E, 0xAA, 0xE5, -0x39, 0x58, 0xBA, 0xAE, 0x82, 0x59, 0x52, 0xB3, 0x51, 0x7F, 0x84, 0x52, 0x73, 0xF0, 0x37, 0xAD, -0x8, 0x28, 0xE1, 0x15, 0xF1, 0xE2, 0x35, 0xD4, 0x7C, 0x5C, 0xC0, 0x32, 0x45, 0x23, 0x89, 0x5, -0x4C, 0xE6, 0x11, 0x9B, 0x30, 0xFA, 0x51, 0x65, 0x55, 0x90, 0xEC, 0xB1, 0x6F, 0xD9, 0xF1, 0xD1, -0xD1, 0xF8, 0x48, 0x51, 0x67, 0x8E, 0xB, 0x71, 0xA8, 0x5C, 0x9C, 0xDF, 0x4C, 0xDD, 0x61, 0x5C, -0x4A, 0xE8, 0xE3, 0xEB, 0xD9, 0xEA, 0x68, 0xF, 0xD8, 0xCD, 0x63, 0x6, 0x5, 0x6E, 0xCD, 0x6D, -0x9F, 0xD, 0xEE, 0x1B, 0xCC, 0xD7, 0x9F, 0x2F, 0xF5, 0x2F, 0xF9, 0xED, 0x8B, 0xC3, 0x72, 0x88, -0x50, 0x74, 0x5B, 0x56, 0x90, 0xA3, 0x70, 0x19, 0xA4, 0xB, 0x6E, 0xB1, 0xDE, 0x9C, 0x9, 0xF1, -0xF3, 0xD9, 0x9B, 0x9F, 0x9E, 0x3, 0x0, 0x96, 0xB2, 0x1C, 0x8B, 0xEF, 0xFF, 0xFD, 0x2F, 0xFB, -0xAE, 0x19, 0x8F, 0x58, 0x24, 0x9E, 0x9, 0xA4, 0x17, 0x84, 0x94, 0x4D, 0xA7, 0x53, 0xD1, 0xCD, -0xB7, 0x3C, 0x51, 0x50, 0x5, 0x1A, 0x1D, 0x96, 0x3D, 0x87, 0x4F, 0xE4, 0x3F, 0x43, 0x56, 0xCF, -0x5A, 0x90, 0x24, 0xA0, 0x80, 0x24, 0xB2, 0xE3, 0x82, 0x8F, 0x86, 0xF4, 0xFB, 0xF0, 0x53, 0x39, -0xDC, 0x3B, 0x68, 0xB1, 0x2C, 0xCB, 0x85, 0x73, 0x5, 0x74, 0x7B, 0x15, 0xC4, 0x4A, 0xF0, 0x2B, -0x9E, 0x9C, 0xB2, 0xFF, 0x69, 0xF7, 0xA4, 0xF, 0x79, 0xB2, 0x53, 0x26, 0x15, 0xD3, 0xF, 0x51, -0xC5, 0x2B, 0x70, 0x2E, 0x58, 0xE5, 0xA7, 0xF0, 0x19, 0x45, 0xC9, 0x5F, 0x42, 0xF5, 0x9E, 0x61, -0xA6, 0xE3, 0x34, 0xBB, 0x6, 0xC3, 0x26, 0x24, 0x3C, 0x47, 0x70, 0x92, 0x47, 0x7B, 0xAD, 0xEE, -0x5F, 0xDA, 0x13, 0xCB, 0xD6, 0xA4, 0x1B, 0x34, 0x9D, 0x31, 0xFE, 0x8D, 0x88, 0x23, 0x7, 0x7A, -0xA, 0xCE, 0x4A, 0x4A, 0x1F, 0xBD, 0xD6, 0xBA, 0xF4, 0xB, 0x7C, 0xE8, 0x3F, 0x9E, 0x14, 0x45, -0x70, 0x3B, 0x42, 0xE3, 0xDE, 0x19, 0xD9, 0xF, 0x7A, 0x1A, 0x97, 0xEC, 0xF8, 0x7, 0x36, 0x8B, -0xAB, 0x12, 0xD2, 0x20, 0x35, 0xB5, 0x25, 0x4D, 0x17, 0x50, 0x67, 0x12, 0x26, 0x6D, 0x90, 0xA0, -0x1, 0x8E, 0xEE, 0x9A, 0x83, 0x96, 0x80, 0x9E, 0x5, 0xE1, 0x65, 0xAF, 0x12, 0xEB, 0x8F, 0x6, -0x1E, 0xAF, 0x73, 0xD2, 0xAD, 0x2D, 0x95, 0x7A, 0x57, 0xE5, 0xFE, 0xB3, 0x94, 0xFC, 0xEB, 0x28, -0xFB, 0x1F, 0x54, 0xFA, 0x6D, 0x97, 0x6B, 0x17, 0x33, 0xD0, 0x36, 0x7, 0xFE, 0x96, 0x2F, 0xFE, -0xC5, 0xDC, 0xC1, 0x4E, 0xEC, 0x60, 0x2F, 0xEE, 0x62, 0x37, 0xF4, 0x67, 0xC1, 0x11, 0xC5, 0x27, -0x5C, 0x86, 0x6C, 0xAE, 0x10, 0x7A, 0xE6, 0xD5, 0x21, 0xA5, 0x19, 0x3C, 0xDB, 0x68, 0xF8, 0xF6, -0xCD, 0xC5, 0xCF, 0xC3, 0x3, 0x36, 0x9C, 0x14, 0xFF, 0x9C, 0x97, 0xD3, 0x21, 0x98, 0x8, 0xF4, -0x2F, 0x80, 0xFE, 0x2, 0x53, 0xE6, 0xAB, 0x97, 0x69, 0xC4, 0x6F, 0x30, 0xC9, 0x7D, 0x36, 0x7C, -0x30, 0x4F, 0xC5, 0x73, 0x69, 0x21, 0xA8, 0x65, 0xBC, 0xF8, 0xAC, 0x5D, 0xAE, 0xFE, 0x4C, 0x26, -0x9D, 0xF8, 0x5D, 0x50, 0x19, 0x43, 0x17, 0x2B, 0x65, 0xA, 0x49, 0xBF, 0x5E, 0xE0, 0x27, 0xC, -0x4A, 0x30, 0xF2, 0xE9, 0x7F, 0x92, 0xCD, 0x14, 0xD8, 0x53, 0x7C, 0x1D, 0xBD, 0x27, 0x83, 0xF0, -0xF1, 0xC0, 0xC3, 0x23, 0xF2, 0xFD, 0xA7, 0x6C, 0x0, 0xD7, 0x9D, 0xC4, 0x61, 0x40, 0xCB, 0x34, -0xC9, 0xC2, 0x8A, 0x57, 0x87, 0xB3, 0x38, 0xD, 0x8A, 0xDB, 0x81, 0xCD, 0x1D, 0x67, 0x28, 0x4D, -0x91, 0xF2, 0xFC, 0x23, 0x7B, 0xB6, 0x7, 0x82, 0x8C, 0x83, 0x7E, 0x1E, 0xD4, 0x1C, 0xA0, 0x2F, -0x23, 0x8D, 0xD0, 0x0, 0x52, 0xEE, 0xC8, 0x9, 0x1, 0x4, 0xBB, 0xFE, 0xF5, 0x9C, 0xB8, 0x55, -0xA3, 0x1F, 0xD0, 0xA2, 0xC, 0x3A, 0x16, 0xE5, 0x80, 0x55, 0xC5, 0x9A, 0x62, 0x12, 0x13, 0x8D, -0x18, 0x93, 0x76, 0x5C, 0x68, 0xFF, 0xB2, 0x75, 0x78, 0xE6, 0x5D, 0x73, 0xC9, 0x59, 0x69, 0x6, -0x13, 0xE, 0xC0, 0x14, 0x26, 0xC9, 0xC, 0xC2, 0xD0, 0x4B, 0x45, 0x60, 0x4F, 0x6F, 0x5F, 0x46, -0xA3, 0xE1, 0x8A, 0xAF, 0xB2, 0xE2, 0x56, 0xB3, 0x83, 0x44, 0xDB, 0xEA, 0x28, 0x77, 0x82, 0xA6, -0x54, 0x23, 0xFA, 0x2C, 0x33, 0x18, 0xDF, 0x24, 0x5B, 0x8C, 0x86, 0x3F, 0xC2, 0xAA, 0x9F, 0x12, -0x25, 0x2C, 0xE2, 0xF3, 0x60, 0x9D, 0x54, 0x52, 0xD3, 0x4B, 0x41, 0x13, 0x43, 0x18, 0xCA, 0x6F, -0x4C, 0x4E, 0x17, 0xBC, 0x5A, 0x17, 0x29, 0x3B, 0x3C, 0x96, 0x4D, 0x5F, 0xB0, 0xE5, 0x44, 0x88, -0xF8, 0x1F, 0xF7, 0xB9, 0x41, 0xC1, 0x58, 0x7E, 0xE7, 0x91, 0x98, 0xA0, 0xEA, 0xB6, 0x3, 0x93, -0xF8, 0xD, 0xF, 0xD7, 0x30, 0x2, 0xD9, 0x6A, 0x15, 0x80, 0xC9, 0xEA, 0xAF, 0xC9, 0xA7, 0x9B, -0x65, 0xD1, 0xEB, 0x29, 0xF0, 0xFC, 0x2F, 0x8C, 0x3B, 0x3A, 0xED, 0x86, 0x25, 0x8F, 0x82, 0x46, -0x43, 0x16, 0x87, 0x93, 0x4F, 0xD9, 0x6C, 0x83, 0x6D, 0x18, 0x3C, 0x20, 0x19, 0x55, 0xC, 0xB1, -0xC4, 0x92, 0xB0, 0xDD, 0x4D, 0x24, 0xCB, 0x65, 0x76, 0x2D, 0xB7, 0xD8, 0x23, 0x11, 0xB7, 0x1C, -0xA8, 0xD, 0xB7, 0x9E, 0x95, 0xB5, 0xFD, 0x96, 0x3F, 0xE4, 0x90, 0xAD, 0x69, 0x6E, 0x3F, 0xA6, -0xF6, 0xD7, 0xD4, 0x60, 0xFA, 0xE9, 0xC9, 0xB7, 0x9A, 0x55, 0xF7, 0xFE, 0x2C, 0x7, 0x7C, 0x77, -0xB7, 0xBB, 0x83, 0xAB, 0xFD, 0x76, 0xD2, 0xB1, 0x7D, 0x21, 0x3, 0x5, 0x93, 0x89, 0x45, 0x34, -0x68, 0xC6, 0xBA, 0x32, 0xF6, 0x74, 0xB0, 0xAB, 0x21, 0x31, 0x99, 0x6F, 0xE8, 0x6, 0x22, 0xC6, -0x60, 0x45, 0x1, 0x9F, 0x47, 0x84, 0x9A, 0x4D, 0x53, 0x38, 0xEB, 0x31, 0x30, 0x3, 0xE4, 0x67, -0xF8, 0x55, 0xCC, 0xAF, 0xCD, 0x6D, 0xD6, 0x35, 0xF2, 0x43, 0x94, 0x4F, 0x12, 0x62, 0x10, 0xC0, -0x6, 0x34, 0xD6, 0x27, 0x9C, 0x99, 0xBC, 0x32, 0x1, 0xC3, 0xD9, 0x38, 0x5C, 0xF2, 0xF0, 0x92, -0x47, 0x1D, 0xD6, 0xA3, 0x95, 0xDC, 0x91, 0x7A, 0xD2, 0xB3, 0xFB, 0x2B, 0x61, 0xA2, 0xE6, 0x59, -0xF9, 0xB5, 0x36, 0x81, 0xA6, 0x28, 0xBA, 0x60, 0x1E, 0x3, 0xF2, 0x24, 0x2D, 0xAF, 0x79, 0xF1, -0xB6, 0xC8, 0x42, 0xF4, 0xC9, 0x8A, 0x6E, 0xD7, 0x32, 0x9C, 0xC4, 0x5A, 0x99, 0xE5, 0x8A, 0x90, -0x67, 0xAF, 0xC4, 0xEF, 0x86, 0x41, 0xD4, 0x96, 0x4B, 0x6F, 0xDF, 0x30, 0x62, 0xA3, 0xBB, 0x91, -0x4C, 0x46, 0xF4, 0x9D, 0xC7, 0x94, 0x45, 0x1B, 0x29, 0xF0, 0xED, 0x85, 0x67, 0x19, 0x47, 0x9C, -0x92, 0x51, 0x44, 0x43, 0x2D, 0x3B, 0x75, 0x7E, 0x71, 0x2C, 0xB0, 0xFE, 0xF8, 0xF3, 0xEB, 0x57, -0xC6, 0x92, 0xD4, 0x39, 0xC9, 0xBE, 0xA7, 0xE8, 0x5B, 0x56, 0xB7, 0xF0, 0x33, 0x57, 0x71, 0x19, -0xCF, 0xE2, 0x24, 0xAE, 0x6E, 0x9, 0x28, 0xCC, 0x92, 0x24, 0xC8, 0x4B, 0xDE, 0x42, 0xB5, 0x1, -0x78, 0xE3, 0x84, 0xB0, 0x1D, 0xF9, 0x11, 0x86, 0x10, 0xCE, 0xAB, 0x5A, 0x72, 0x5B, 0x25, 0x90, -0xCD, 0xA4, 0x85, 0x6A, 0xE6, 0xEC, 0x2C, 0x9C, 0xA5, 0x32, 0x3D, 0xB6, 0x7F, 0x5B, 0xBB, 0x4F, -0x68, 0xAA, 0xFE, 0x8D, 0xA6, 0x74, 0xF0, 0x82, 0x9A, 0xD2, 0x7, 0x39, 0x2E, 0x11, 0x47, 0x55, -0x23, 0x27, 0x75, 0xAB, 0x53, 0x21, 0xF4, 0xB1, 0xD7, 0xCD, 0x78, 0x0, 0x46, 0x5C, 0xC8, 0x6E, -0xEC, 0xE8, 0x94, 0x45, 0x31, 0x67, 0x6F, 0x8A, 0x8, 0x9D, 0x93, 0x18, 0xCA, 0xDF, 0xD8, 0x52, -0x11, 0x9, 0x42, 0x86, 0x8, 0x87, 0xB1, 0x7A, 0xFA, 0x11, 0x65, 0x73, 0x89, 0x32, 0x4D, 0xE4, -0xFB, 0xA3, 0x8F, 0x8A, 0x26, 0x23, 0xCF, 0x6B, 0x18, 0x53, 0xE2, 0x8D, 0x78, 0x54, 0xAA, 0xCD, -0x14, 0x7B, 0xCC, 0x8E, 0xF6, 0xD8, 0x83, 0x7, 0x4C, 0xB6, 0xA2, 0x3F, 0x99, 0xD5, 0xC1, 0x60, -0xCF, 0x35, 0xA5, 0xCB, 0xA0, 0x14, 0xF3, 0xC8, 0x68, 0xC7, 0x4D, 0xE2, 0xEB, 0xC4, 0x86, 0x6, -0x8D, 0x13, 0x83, 0xC8, 0xDA, 0x78, 0xC9, 0x84, 0xAF, 0xDB, 0x9C, 0x3B, 0x73, 0xAA, 0x99, 0x5E, -0x27, 0x8, 0x75, 0xB2, 0x6D, 0x9E, 0xF2, 0x30, 0x74, 0x53, 0x81, 0x68, 0x5C, 0x50, 0xA3, 0x83, -0xE1, 0x1A, 0x39, 0x29, 0xE, 0x1B, 0xC7, 0x1E, 0x31, 0x6B, 0xAE, 0x87, 0xEC, 0xB8, 0x6B, 0x4F, -0x2, 0xE9, 0x2E, 0x48, 0x98, 0x25, 0x17, 0x42, 0xCD, 0xC5, 0xC1, 0xA9, 0x6F, 0xCB, 0x44, 0x1D, -0x84, 0xE3, 0x25, 0x63, 0xA4, 0x77, 0xFB, 0x2, 0x3, 0xF8, 0xD7, 0x1, 0x2F, 0x32, 0xC9, 0x6A, -0xB5, 0x24, 0xE8, 0x71, 0x3D, 0xC8, 0xA4, 0x6B, 0x90, 0xF2, 0x52, 0x24, 0x38, 0xC, 0xDB, 0x6D, -0x7E, 0x48, 0x84, 0x32, 0x78, 0x89, 0xA2, 0xE0, 0xB, 0x9E, 0xA4, 0xDE, 0xD, 0x94, 0x22, 0x73, -0x8A, 0x60, 0x10, 0x53, 0xA7, 0x2E, 0xB2, 0x65, 0x9D, 0x2B, 0xF3, 0xE5, 0xDD, 0x46, 0xE5, 0x6C, -0x9F, 0xF8, 0x8F, 0x15, 0x4F, 0x4D, 0x5E, 0xCF, 0x82, 0xF, 0x3, 0x96, 0xA5, 0x21, 0xF6, 0xE, -0x97, 0x68, 0x31, 0xC2, 0x10, 0x72, 0x8F, 0x23, 0x1A, 0x2, 0x8E, 0xF1, 0x60, 0x38, 0x41, 0x30, -0x8A, 0x55, 0xF9, 0xB0, 0x3E, 0xF9, 0xFE, 0xE9, 0xC9, 0xA3, 0x9, 0xA1, 0x51, 0x29, 0x57, 0xF9, -0xBF, 0x2B, 0x20, 0xFA, 0xA3, 0xA6, 0xDB, 0x96, 0xAE, 0xC6, 0xF, 0x75, 0xEF, 0xCB, 0xEB, 0x89, -0x9E, 0xA8, 0x89, 0x86, 0x6B, 0x30, 0x26, 0x45, 0xA8, 0x2C, 0x48, 0x14, 0x39, 0x9C, 0xCE, 0x4D, -0xB5, 0x21, 0xBE, 0x7A, 0x71, 0xCE, 0xCC, 0x80, 0xC6, 0xFE, 0x8, 0xA5, 0xF4, 0x89, 0xAE, 0x85, -0x32, 0x2B, 0xD8, 0x88, 0x20, 0x2F, 0xA7, 0xC7, 0x67, 0x97, 0x8F, 0xEA, 0xF5, 0x57, 0xC2, 0x78, -0x76, 0xB9, 0xBF, 0xDF, 0x97, 0x25, 0x20, 0xC, 0x72, 0x19, 0x26, 0x83, 0xFD, 0xBA, 0xF3, 0xFB, -0xCB, 0x8F, 0xDD, 0x23, 0xFE, 0xF1, 0x85, 0xA3, 0x5F, 0x34, 0x2A, 0x1B, 0xC8, 0x15, 0x1C, 0x90, -0x27, 0x6C, 0x86, 0x66, 0xFB, 0x3, 0xB5, 0x9A, 0x5D, 0x2B, 0xE8, 0x4F, 0x26, 0x6C, 0xB5, 0xBE, -0xDE, 0x58, 0xA3, 0x85, 0x41, 0xCE, 0xCF, 0xB1, 0x1, 0xBD, 0x93, 0x93, 0x82, 0xB1, 0xCF, 0xCC, -0x39, 0xEA, 0x35, 0x36, 0x66, 0xDA, 0x95, 0x18, 0xF1, 0x6A, 0xD5, 0x37, 0x34, 0x93, 0xBE, 0xEC, -0xD3, 0x2E, 0xD6, 0xA1, 0x16, 0x16, 0x4, 0xA3, 0x8C, 0x8E, 0xA, 0x8F, 0xCE, 0xF0, 0xE7, 0x91, -0xC4, 0x81, 0xAF, 0xFD, 0x72, 0x22, 0x39, 0x62, 0x6A, 0x57, 0xE7, 0x54, 0x7A, 0x18, 0xEA, 0xA, -0x4C, 0xC9, 0xE8, 0x3F, 0x3A, 0x77, 0x13, 0xD9, 0xA4, 0x5A, 0x6, 0x5C, 0x29, 0x26, 0x93, 0x2A, -0xB8, 0xA8, 0xE4, 0xA2, 0x3E, 0xFC, 0xD8, 0x3C, 0x7A, 0xB8, 0xBF, 0xDF, 0x95, 0x93, 0x36, 0x8, -0xB3, 0x8F, 0x54, 0x4C, 0x0, 0x7F, 0x78, 0x53, 0xB6, 0xD3, 0xF3, 0xB9, 0xF2, 0x68, 0x1E, 0x26, -0xFA, 0x3, 0x28, 0xF7, 0x40, 0x12, 0xC, 0xD0, 0x4C, 0x68, 0x8E, 0x2, 0xDB, 0x53, 0xEC, 0x8F, -0xA8, 0xC4, 0xAF, 0x44, 0x7, 0x54, 0x1B, 0x5, 0x7E, 0xA7, 0xF0, 0xCC, 0xCF, 0xC1, 0xFE, 0xA0, -0xAD, 0x4D, 0xCF, 0x17, 0x6F, 0x70, 0x72, 0x2C, 0x83, 0x13, 0xCA, 0x65, 0xC7, 0x22, 0x36, 0xB1, -0xE2, 0xF, 0x4, 0x43, 0x66, 0xF4, 0x51, 0xBB, 0x34, 0xFB, 0x60, 0xDA, 0x8C, 0x7B, 0xEA, 0x83, -0x79, 0x8B, 0xE5, 0xC0, 0x43, 0x26, 0xB7, 0x5, 0x85, 0x63, 0xFD, 0x16, 0xDC, 0x9, 0xE0, 0xBC, -0x41, 0x10, 0x3D, 0xDC, 0x10, 0xFF, 0x68, 0x70, 0xEB, 0xC, 0x52, 0xCB, 0x7D, 0x3B, 0xBE, 0xD0, -0xC1, 0xC5, 0xBD, 0x9E, 0x50, 0xA6, 0x3B, 0xD8, 0x78, 0xE8, 0x3B, 0xDD, 0x10, 0x91, 0x8D, 0x89, -0x52, 0xF1, 0xFB, 0x45, 0x12, 0x2C, 0x4A, 0xA4, 0xB7, 0x6E, 0xD3, 0x10, 0xE7, 0xA4, 0xE8, 0x2F, -0x68, 0x60, 0xCF, 0x2F, 0xDE, 0xDE, 0xFC, 0xCA, 0x67, 0x2F, 0x92, 0xD7, 0x8B, 0xE2, 0xA4, 0x9D, -0x23, 0xA4, 0x4E, 0xA6, 0x99, 0x51, 0xE1, 0xB, 0xC4, 0xF5, 0x3B, 0xD7, 0xD4, 0x60, 0xC, 0xA1, -0x53, 0xA2, 0xF, 0xB6, 0xDB, 0xF2, 0x18, 0x7F, 0x44, 0xA5, 0x4, 0x2D, 0x95, 0x19, 0x49, 0xC4, -0x88, 0xA, 0x8F, 0xD9, 0xA3, 0x47, 0xEC, 0x7B, 0x44, 0x83, 0xD0, 0xA1, 0x23, 0xE5, 0x58, 0xE9, -0x61, 0x88, 0x20, 0x3E, 0xBB, 0x4E, 0x69, 0x3B, 0x7C, 0x6F, 0xB, 0x23, 0x1D, 0x86, 0x9, 0xBB, -0x4F, 0xFC, 0x35, 0xC, 0xB5, 0xEE, 0x2F, 0xE, 0x3D, 0x3F, 0xC, 0xEF, 0xCF, 0xD3, 0xF, 0xC3, -0x3D, 0x69, 0x71, 0xBC, 0xA6, 0x4A, 0x59, 0x29, 0x71, 0x26, 0x8C, 0xEE, 0xCF, 0x54, 0xF7, 0xBE, -0x1E, 0xA6, 0x59, 0xBC, 0x3F, 0x8F, 0x94, 0x7D, 0xEC, 0xC4, 0xDF, 0x63, 0xC3, 0x3A, 0x15, 0xB5, -0x6F, 0xB2, 0x56, 0xD0, 0x83, 0xF9, 0x59, 0xA7, 0xED, 0xAE, 0xEA, 0xDE, 0xDB, 0x88, 0xB5, 0xB2, -0xB0, 0xDE, 0x9F, 0x97, 0xE, 0xBE, 0xCD, 0x18, 0xA, 0xB, 0xC3, 0x60, 0xF3, 0xCA, 0x1F, 0xF9, -0x57, 0x1E, 0xEA, 0x69, 0x18, 0x2, 0x67, 0xC8, 0xD9, 0xBA, 0xAA, 0x32, 0x63, 0x9D, 0x4, 0xB0, -0xBD, 0xF2, 0xA2, 0x49, 0xAC, 0x3B, 0x2D, 0xBB, 0x58, 0xF5, 0x67, 0x8F, 0x26, 0xB2, 0x63, 0x9B, -0x33, 0x1B, 0x68, 0x3C, 0xF6, 0xD2, 0x8, 0xD5, 0xF7, 0x5, 0x7C, 0x7E, 0x1A, 0xDF, 0x9, 0xE0, -0xC9, 0xEB, 0xEC, 0x8A, 0x7F, 0x48, 0x9F, 0x5F, 0x71, 0x3C, 0xC9, 0x58, 0x0, 0xC3, 0x37, 0x9F, -0x73, 0x20, 0x42, 0xBE, 0x39, 0x42, 0x72, 0x25, 0xE4, 0x63, 0x6B, 0x1A, 0x72, 0x8, 0x7B, 0x1A, -0xEF, 0xEE, 0x3C, 0x8D, 0x13, 0xEF, 0x34, 0x78, 0x14, 0x57, 0x5B, 0x4E, 0xE2, 0x39, 0x40, 0x2D, -0xFA, 0xA8, 0xAF, 0x4D, 0xDD, 0xF3, 0x3B, 0x53, 0xF7, 0xD0, 0x4B, 0x1D, 0xCE, 0x9D, 0x28, 0xE7, -0xB4, 0x25, 0x81, 0x6F, 0x25, 0xB4, 0x45, 0xA3, 0xC2, 0x60, 0x93, 0xF9, 0xB6, 0x26, 0x93, 0xED, -0x4A, 0xE7, 0x77, 0x5E, 0x3A, 0xE9, 0x24, 0x75, 0x4B, 0x22, 0x29, 0x2B, 0x48, 0xC9, 0x25, 0x8B, -0x4A, 0xB7, 0x44, 0xA3, 0xA6, 0xF4, 0x7C, 0x7, 0x4A, 0x25, 0xA1, 0x8A, 0xB8, 0xE, 0x6A, 0xBC, -0x11, 0x9C, 0xDF, 0x36, 0x78, 0xB5, 0x1E, 0x53, 0x7E, 0x1D, 0x5C, 0x16, 0x59, 0xC9, 0x82, 0xF5, -0x3C, 0xC9, 0x38, 0x72, 0x50, 0xEE, 0xF3, 0x67, 0x31, 0x1C, 0x64, 0x40, 0x25, 0x25, 0x1C, 0xA7, -0xC2, 0x15, 0x5B, 0xAF, 0x90, 0x2E, 0x43, 0xAA, 0xA, 0x53, 0x5D, 0x1E, 0xB0, 0x6B, 0x78, 0xF9, -0xDA, 0xE1, 0xA7, 0xCB, 0x20, 0xA9, 0xD6, 0x48, 0xE2, 0xF1, 0xEA, 0x3A, 0x28, 0x2D, 0x48, 0xEA, -0xDA, 0x9E, 0xA1, 0xDA, 0x45, 0x7D, 0x33, 0xF5, 0x85, 0x5B, 0xC2, 0x61, 0x45, 0xFE, 0x6D, 0x93, -0xD9, 0x7B, 0x3A, 0xA5, 0xD, 0xB1, 0x87, 0x45, 0xB2, 0x73, 0xE3, 0xE2, 0x28, 0xDA, 0x58, 0xCF, -0x4A, 0xE9, 0xC7, 0x8E, 0x5B, 0x91, 0x75, 0xA7, 0xC9, 0xEE, 0xC5, 0xA3, 0xA9, 0x50, 0x6E, 0x7C, -0xDF, 0x83, 0xD7, 0xF9, 0x2D, 0x22, 0x20, 0xA4, 0x85, 0xC0, 0xD5, 0x90, 0x3F, 0x49, 0x92, 0xD1, -0x0, 0xAE, 0x66, 0x80, 0x9C, 0x7C, 0x94, 0xBB, 0x55, 0x17, 0x8A, 0x22, 0xFA, 0xBE, 0x25, 0x12, -0x93, 0xCA, 0xCE, 0x1A, 0x8E, 0x2E, 0x4, 0xA9, 0x85, 0xA0, 0xB5, 0xF9, 0xF0, 0x75, 0x29, 0xAD, -0x2E, 0x27, 0x5B, 0x74, 0x9, 0x43, 0xAB, 0xCB, 0x43, 0xEA, 0x62, 0xF5, 0x41, 0xEB, 0x94, 0x7D, -0xEF, 0xC4, 0xE5, 0x3A, 0x6, 0xDB, 0xB7, 0x42, 0x76, 0x43, 0xD2, 0x4D, 0x8, 0xBD, 0xD, 0x30, -0x9D, 0xD9, 0x9A, 0xFC, 0x98, 0xB2, 0x1E, 0x6E, 0xE1, 0x95, 0xC6, 0x51, 0xD7, 0x75, 0x5A, 0x31, -0xA4, 0xC6, 0x6C, 0x0, 0xD6, 0x69, 0x6B, 0x33, 0x11, 0x63, 0xE6, 0x6B, 0x45, 0x6, 0x66, 0x6F, -0xF7, 0x73, 0x31, 0x24, 0x38, 0x75, 0x1, 0x65, 0x9D, 0xBE, 0xAC, 0x7, 0xFB, 0x17, 0x9D, 0xE7, -0x49, 0x6D, 0xFC, 0x4B, 0x13, 0xE4, 0x4F, 0x41, 0xE1, 0xE, 0x49, 0xF2, 0xD9, 0xF0, 0x2B, 0x9E, -0xAE, 0x7A, 0xC6, 0xFE, 0x33, 0xF2, 0xBC, 0x72, 0x9F, 0xD2, 0x95, 0xBF, 0x75, 0x6A, 0x5C, 0x9D, -0x34, 0xAD, 0x75, 0x12, 0x4B, 0xF4, 0x8A, 0xB5, 0x3A, 0x65, 0xC3, 0x7D, 0xA0, 0x52, 0x66, 0xC2, -0xE9, 0x62, 0x45, 0xED, 0xA7, 0xA7, 0x4F, 0x71, 0xE2, 0xBD, 0x10, 0x7, 0x5F, 0xD8, 0xB8, 0x65, -0x4D, 0xCA, 0x4D, 0xF8, 0xAF, 0x6, 0xC9, 0xE3, 0xE9, 0xB1, 0x4C, 0xC5, 0xCA, 0x8D, 0x4C, 0x47, -0x22, 0x56, 0x6F, 0x41, 0x3C, 0x27, 0x41, 0xE5, 0xD3, 0xDB, 0x73, 0x52, 0x8F, 0x9F, 0x60, 0xDB, -0x47, 0xC3, 0x59, 0x3D, 0xAA, 0x7B, 0xA, 0x2F, 0xB2, 0xD, 0x46, 0xA6, 0x21, 0xD4, 0x39, 0xA9, -0xAE, 0x64, 0x43, 0xF8, 0x3E, 0xFE, 0xA8, 0x76, 0x91, 0xD, 0xD6, 0x73, 0x9A, 0x4B, 0xBD, 0xED, -0xEA, 0xAF, 0x2F, 0xF3, 0xF3, 0xE5, 0x39, 0x36, 0xD2, 0x1, 0x69, 0xE5, 0x1C, 0x5C, 0xED, 0xE6, -0xCA, 0x49, 0xC3, 0x95, 0xE3, 0x3E, 0xAE, 0x44, 0x7D, 0xE7, 0x63, 0x34, 0x84, 0x9B, 0x66, 0x8D, -0x7A, 0xF7, 0xA0, 0xEE, 0x7E, 0x18, 0x76, 0x23, 0x15, 0x51, 0x42, 0x37, 0xA5, 0xF, 0x1B, 0x4A, -0x4F, 0x3A, 0x28, 0xAD, 0x9, 0x14, 0xA8, 0x8C, 0x2D, 0xAD, 0x7F, 0x58, 0xF0, 0x19, 0xA5, 0x1, -0x29, 0xBB, 0xC, 0xD2, 0xD4, 0xD9, 0x88, 0xC3, 0xB8, 0x2C, 0x33, 0x94, 0x2, 0x40, 0x77, 0x22, -0xC3, 0xCD, 0x7B, 0x8F, 0xB2, 0x77, 0xB1, 0x59, 0xF3, 0x52, 0x16, 0x3, 0x20, 0xFC, 0x11, 0x16, -0xA2, 0xD6, 0x47, 0xEF, 0xC1, 0xDF, 0x1F, 0x38, 0x52, 0xB6, 0x36, 0x80, 0xF4, 0x1F, 0xA1, 0xD6, -0x83, 0xC9, 0xE2, 0x5A, 0x28, 0x9D, 0x2C, 0x53, 0x19, 0x2F, 0xB, 0x3E, 0x17, 0x87, 0xB, 0xEA, -0xC8, 0x7D, 0xD0, 0x77, 0xE4, 0xE, 0x98, 0xA9, 0xC6, 0x4E, 0xB5, 0x39, 0x22, 0xAF, 0xA9, 0x6, -0xD8, 0x89, 0xC2, 0x66, 0xA3, 0xE2, 0xD2, 0x27, 0xE, 0x51, 0xB3, 0x74, 0x1E, 0x17, 0xAB, 0x11, -0xF6, 0xF, 0x41, 0x92, 0xDC, 0x2A, 0x70, 0x71, 0x56, 0x5C, 0x83, 0x9B, 0xCB, 0x5F, 0x5B, 0xFE, -0xB7, 0x9, 0xF, 0x10, 0x8, 0x90, 0x87, 0x19, 0x33, 0xB9, 0x41, 0x82, 0x7, 0xA8, 0xED, 0xB6, -0x53, 0xA9, 0xE5, 0x14, 0x57, 0xC, 0xC4, 0xEC, 0x78, 0xE2, 0x4E, 0xEC, 0xE, 0x4B, 0xBD, 0xA, -0x2E, 0x39, 0x5F, 0xE5, 0xD5, 0xAD, 0x77, 0x8A, 0x7E, 0x72, 0xCF, 0x45, 0x79, 0xB1, 0x70, 0x49, -0xA2, 0xAB, 0x5B, 0x23, 0xE8, 0xA3, 0x56, 0x96, 0x24, 0xA3, 0x4B, 0x4D, 0x73, 0x23, 0x4A, 0x58, -0xAF, 0x9, 0x9E, 0x10, 0x96, 0xDD, 0xCE, 0xD3, 0x8D, 0xED, 0x97, 0x4B, 0x39, 0x59, 0x3, 0xE0, -0x54, 0xA2, 0xA, 0xB6, 0x82, 0xD0, 0xD1, 0x80, 0x48, 0x16, 0x4D, 0x64, 0xFF, 0x4C, 0xCE, 0x1D, -0xB8, 0x3C, 0xA4, 0xC5, 0xD5, 0xFD, 0xBF, 0x69, 0xD7, 0xE6, 0xF8, 0x19, 0x23, 0x37, 0x91, 0x3B, -0xAE, 0x23, 0x26, 0xE1, 0xAE, 0xA3, 0x90, 0x60, 0x8C, 0x2E, 0x1A, 0x15, 0x15, 0x77, 0x58, 0x5B, -0x73, 0x67, 0xB5, 0xC3, 0xCA, 0xD2, 0x99, 0xBD, 0xEA, 0xAA, 0xC8, 0xAF, 0x39, 0xAA, 0x9A, 0x37, -0x55, 0xF2, 0x34, 0x60, 0x8D, 0xAF, 0x95, 0x25, 0xE7, 0x3, 0xAA, 0x10, 0x1B, 0xB4, 0xA0, 0xFE, -0xDA, 0x72, 0x63, 0x4C, 0x4, 0xB6, 0x6, 0x8, 0x9B, 0xDB, 0x9, 0x4E, 0x0, 0xAB, 0xAE, 0x2E, -0xC4, 0xE4, 0x5F, 0xA8, 0xE8, 0x7F, 0xB0, 0x6F, 0x5D, 0x65, 0xB1, 0x7D, 0x4A, 0x8D, 0x4E, 0x7E, -0xB1, 0x63, 0xE5, 0xF8, 0x3E, 0x62, 0x65, 0xF, 0x8A, 0xBD, 0x1D, 0x70, 0x54, 0x84, 0xC3, 0x91, -0x57, 0x93, 0x52, 0xA, 0x7A, 0xDB, 0xD7, 0x1, 0xDE, 0x49, 0x4B, 0xAE, 0x7E, 0x9D, 0xD3, 0xD5, -0x86, 0x9B, 0x6A, 0x1D, 0x24, 0x2F, 0x8A, 0x60, 0x21, 0xEE, 0x9, 0xC8, 0xA1, 0x5C, 0x7, 0xA9, -0x91, 0xCC, 0xB2, 0xE8, 0xD6, 0x2A, 0xF8, 0xA7, 0x51, 0xDC, 0x40, 0xDF, 0x89, 0x95, 0x8C, 0x15, -0x86, 0xA1, 0x7E, 0xA7, 0x44, 0xE1, 0x47, 0xAC, 0xA, 0x2, 0xEA, 0xA1, 0xBA, 0x5D, 0x71, 0x48, -0x15, 0x89, 0xC3, 0xBD, 0x76, 0xAE, 0x12, 0x6, 0x95, 0x4E, 0x21, 0x50, 0xEC, 0xB7, 0xAC, 0x66, -0x98, 0x16, 0x6D, 0x3E, 0xFF, 0xEF, 0x7F, 0xAD, 0x6D, 0x2A, 0x92, 0xD9, 0xE2, 0x60, 0x6F, 0x5D, -0x0, 0xBA, 0x64, 0x4F, 0x5F, 0xBD, 0x79, 0x4A, 0x62, 0x23, 0xF2, 0xD6, 0x31, 0xE5, 0x6D, 0x84, -0xF7, 0xA4, 0x38, 0xF, 0x45, 0x3C, 0x4B, 0x40, 0x5E, 0xC7, 0x9C, 0x3A, 0x4, 0xEB, 0x12, 0xA6, -0x7A, 0x25, 0x6A, 0x25, 0xE1, 0x43, 0x30, 0xE, 0x40, 0xA5, 0x17, 0x65, 0xAB, 0xB5, 0x50, 0x5B, -0xD6, 0x96, 0x0, 0x45, 0xB0, 0xC9, 0x5A, 0x88, 0x7D, 0x71, 0x7B, 0x21, 0x9D, 0x25, 0x4E, 0x9B, -0xFE, 0x26, 0x56, 0x35, 0x8E, 0xF6, 0x7, 0x6C, 0x6C, 0x5D, 0x21, 0xF1, 0x95, 0x4F, 0x47, 0x60, -0xFC, 0x42, 0xDC, 0x83, 0xDA, 0x1E, 0x9D, 0x8, 0x19, 0x7C, 0xC8, 0xB4, 0x74, 0xE, 0xFF, 0x36, -0xDC, 0xDF, 0x28, 0xA1, 0x42, 0xE8, 0xB3, 0x88, 0x77, 0xF, 0x2D, 0xD0, 0xF9, 0xF2, 0xC2, 0xBB, -0x2C, 0x29, 0xE2, 0xC5, 0xA0, 0xA8, 0xCA, 0x5F, 0x91, 0xCB, 0x1E, 0xD, 0xE2, 0x55, 0xB0, 0xE0, -0xD8, 0xD5, 0xFB, 0xB3, 0x2, 0xE2, 0xA9, 0xB2, 0x29, 0x2F, 0xE9, 0x7B, 0xBB, 0x72, 0x57, 0x80, -0xA8, 0x9B, 0x29, 0xBF, 0xBC, 0x7B, 0xA5, 0xE4, 0xF8, 0xCD, 0xEC, 0x13, 0x28, 0xC6, 0xEF, 0x91, -0xC7, 0xE8, 0xB4, 0x70, 0x28, 0xFA, 0x2C, 0x39, 0x16, 0x78, 0x5B, 0x90, 0xE4, 0x17, 0x9F, 0xD1, -0x2, 0x51, 0x95, 0xF9, 0x88, 0x98, 0xD5, 0xB1, 0x93, 0xEF, 0x18, 0x41, 0x86, 0xCA, 0x38, 0x19, -0xA8, 0xF8, 0x45, 0xE, 0xCD, 0x25, 0xC3, 0x1, 0xA, 0x5B, 0x69, 0xF, 0x52, 0x97, 0xA, 0x8E, -0x8C, 0xF8, 0xA7, 0xEB, 0x7C, 0xA1, 0xD9, 0xEF, 0x24, 0x43, 0x5B, 0x64, 0x49, 0xC0, 0x71, 0x10, -0x45, 0x94, 0xA3, 0xAC, 0x5E, 0x51, 0x14, 0x48, 0xBB, 0xD3, 0xA1, 0xA8, 0x4A, 0x43, 0x9C, 0x7F, -0xC0, 0x46, 0xB0, 0xF1, 0xD3, 0xC7, 0xBE, 0x10, 0x5E, 0x91, 0x46, 0x7A, 0x7F, 0x5E, 0x8B, 0xB2, -0x60, 0xA9, 0x8A, 0x93, 0x89, 0x71, 0x28, 0x2D, 0xF5, 0xD6, 0x19, 0xFC, 0x8A, 0xA5, 0xE4, 0x29, -0x4A, 0x7C, 0xE3, 0x92, 0xE9, 0xDE, 0x57, 0x38, 0x84, 0x92, 0x3A, 0x19, 0x2F, 0xD8, 0x93, 0x8B, -0xDF, 0x7F, 0x3A, 0xFF, 0xA6, 0xD5, 0x75, 0x23, 0x23, 0xDB, 0x55, 0xC6, 0xF5, 0x34, 0xE9, 0xCF, -0x93, 0x92, 0xD4, 0x77, 0x8B, 0xD5, 0xFD, 0x62, 0x61, 0xB0, 0x25, 0xD7, 0xD2, 0x5, 0xF7, 0xD4, -0xD1, 0xBB, 0xF5, 0xEF, 0xDB, 0xFE, 0x8B, 0xD1, 0xA4, 0x37, 0xF6, 0x78, 0xB2, 0xDE, 0x5D, 0xB8, -0x9, 0x69, 0x6C, 0xA9, 0xB7, 0x8F, 0x69, 0x15, 0x2, 0x37, 0x62, 0xB0, 0xF6, 0xE3, 0xC6, 0x20, -0x5F, 0xB5, 0x2, 0xAD, 0xCE, 0x26, 0xEF, 0x18, 0x4C, 0x50, 0xBF, 0xAC, 0x70, 0x63, 0x9, 0x6A, -0xDD, 0x14, 0x48, 0x28, 0x98, 0xBF, 0x30, 0x3E, 0x70, 0xAB, 0xB7, 0xCC, 0x67, 0xFE, 0xE4, 0x92, -0x9B, 0xDA, 0x6C, 0xA0, 0x76, 0x38, 0xC7, 0xAD, 0x6F, 0x1E, 0x5B, 0xA8, 0x37, 0x5C, 0x88, 0x6A, -0x3A, 0xC9, 0x91, 0x74, 0x66, 0x49, 0x86, 0x5D, 0xE1, 0xA5, 0x7F, 0xC, 0xE7, 0x1C, 0x56, 0x1C, -0x22, 0x58, 0xB1, 0xB1, 0x27, 0x16, 0x72, 0x23, 0x8C, 0x56, 0x29, 0x2A, 0x6C, 0xB2, 0xAB, 0x4D, -0xD4, 0x47, 0x11, 0xB6, 0xE4, 0xF1, 0x62, 0x49, 0xC6, 0x67, 0xA4, 0xF6, 0x78, 0x92, 0x0, 0xD1, -0x7A, 0x78, 0x7C, 0x72, 0xB4, 0xB7, 0x3F, 0xC8, 0x6F, 0x3C, 0xD4, 0x6A, 0xAB, 0x1A, 0x47, 0xA2, -0x4E, 0xC7, 0xEA, 0xFD, 0x2B, 0x35, 0x1E, 0x1E, 0x7F, 0x5F, 0x77, 0xFE, 0xCA, 0x3A, 0xDE, 0x88, -0x62, 0xAF, 0x82, 0xD7, 0x60, 0x77, 0xD2, 0x6E, 0xEA, 0xDD, 0xAB, 0xDA, 0x1A, 0xFD, 0x57, 0xD5, -0xEB, 0xF2, 0x8A, 0x47, 0xDE, 0xD, 0x94, 0x27, 0xE0, 0x71, 0x6F, 0x35, 0xD0, 0x4A, 0xC3, 0xD3, -0x5F, 0x5, 0x89, 0xAE, 0xE8, 0xA1, 0x94, 0x45, 0x35, 0x3F, 0xFC, 0xC7, 0x81, 0x10, 0x57, 0xF4, -0x44, 0x10, 0x97, 0x66, 0x48, 0x52, 0x64, 0xC5, 0xE5, 0x58, 0x43, 0x34, 0x98, 0xD7, 0xA8, 0x32, -0x9, 0x83, 0x9C, 0xA3, 0x3E, 0x26, 0x84, 0x73, 0xF8, 0xE5, 0xDD, 0x4B, 0x3A, 0x7F, 0xC9, 0x52, -0x8A, 0x48, 0x15, 0x14, 0xC5, 0x86, 0x35, 0x4D, 0x7D, 0x26, 0x43, 0x0, 0x35, 0xDC, 0xDF, 0xFD, -0xF6, 0x8E, 0x11, 0x54, 0xD7, 0x3, 0xCE, 0x28, 0xD3, 0x15, 0x88, 0xD2, 0xC0, 0xE1, 0x21, 0x7D, -0xAE, 0x97, 0x30, 0x18, 0x57, 0xBC, 0x50, 0xD7, 0x65, 0xE5, 0x72, 0x54, 0x8A, 0xC, 0x15, 0x9, -0xE1, 0x10, 0x49, 0x46, 0x42, 0xB4, 0xEF, 0xA1, 0x88, 0x7F, 0x5, 0xBF, 0x1A, 0xE3, 0x90, 0xBE, -0x9A, 0xD0, 0x95, 0x97, 0x43, 0x2A, 0x29, 0x3F, 0xAB, 0x51, 0x8B, 0xF5, 0xD6, 0x3F, 0xEC, 0xB1, -0x23, 0xA1, 0xBE, 0xE6, 0x81, 0x35, 0x88, 0x20, 0x52, 0x6B, 0xB2, 0x40, 0xFE, 0x87, 0xE2, 0x43, -0x3A, 0x34, 0x41, 0xF4, 0xE8, 0x74, 0xD2, 0x93, 0x95, 0x31, 0xAD, 0xF2, 0x29, 0x33, 0x6, 0xA6, -0x39, 0x4E, 0x7, 0xF2, 0x26, 0x9E, 0xD8, 0x76, 0x9F, 0xD5, 0x53, 0x9F, 0xE, 0x4C, 0x46, 0x10, -0x76, 0xD1, 0xD0, 0x3D, 0x6, 0xCD, 0xF0, 0x94, 0x89, 0xAB, 0xC4, 0xB0, 0x36, 0x71, 0xEA, 0x87, -0xF6, 0xB6, 0x6A, 0x29, 0xF0, 0x75, 0x68, 0xCF, 0xF2, 0xF0, 0x50, 0x1, 0x91, 0x0, 0xD1, 0x57, -0x50, 0x79, 0x3, 0xE1, 0x92, 0xD3, 0xA0, 0xD4, 0x8B, 0xC8, 0xA2, 0x53, 0x8A, 0xF1, 0x1F, 0x27, -0x3F, 0xFC, 0x80, 0x2C, 0xE3, 0x5, 0x2F, 0xB0, 0x4E, 0x6, 0x11, 0x8A, 0xB5, 0xB4, 0xB9, 0xF8, -0x14, 0xDC, 0x34, 0xB2, 0x19, 0x65, 0x1B, 0x96, 0x51, 0xA6, 0xF7, 0xB0, 0x90, 0x62, 0x1B, 0x64, -0x67, 0x7C, 0xFF, 0x5A, 0x7, 0xE5, 0xF7, 0x14, 0x1D, 0x4E, 0xC8, 0xE7, 0x1A, 0x52, 0xE8, 0xDA, -0x4E, 0x2E, 0xCB, 0x5F, 0xC7, 0xB4, 0xE9, 0xFE, 0x8C, 0xC1, 0xAA, 0x4E, 0x3, 0x6A, 0xE8, 0x13, -0xCC, 0x1B, 0xB1, 0x7A, 0x27, 0x3B, 0x16, 0xCC, 0x60, 0xC7, 0x9C, 0xCA, 0xF8, 0xE, 0xBE, 0x6C, -0xC7, 0x8F, 0x5D, 0xF8, 0xE0, 0xCB, 0x82, 0xD2, 0x52, 0x4B, 0xE9, 0x8C, 0x80, 0x54, 0xD7, 0x3D, -0x92, 0xF8, 0x2D, 0x93, 0x5C, 0xDC, 0xEF, 0x63, 0xD2, 0x2E, 0x20, 0xD, 0x2C, 0xAE, 0x73, 0x49, -0xE0, 0x52, 0x74, 0xF4, 0xDF, 0x5C, 0xA1, 0x1B, 0x5D, 0xDB, 0xF2, 0x43, 0x62, 0x23, 0x83, 0x27, -0xAC, 0x3B, 0xCE, 0xE8, 0x4A, 0x42, 0xAA, 0x39, 0x64, 0x51, 0x66, 0x14, 0x18, 0x6F, 0x73, 0x57, -0xAB, 0x9B, 0x38, 0xBD, 0x84, 0xBE, 0x6B, 0xBE, 0x6D, 0x77, 0xB9, 0xA3, 0xEE, 0x38, 0xF9, 0x5, -0x21, 0x2A, 0xE8, 0xB6, 0x36, 0xAF, 0x44, 0x7F, 0x65, 0xFD, 0x22, 0x58, 0x9B, 0x6F, 0x5B, 0x49, -0xBD, 0xFE, 0x58, 0x47, 0x47, 0x84, 0x45, 0x2C, 0xF4, 0xB0, 0xF7, 0x20, 0xB7, 0x2D, 0x32, 0xFE, -0x90, 0xE4, 0xF, 0x79, 0x3A, 0x3B, 0xFD, 0xAA, 0x3, 0x8E, 0xB1, 0x91, 0x52, 0xDA, 0xE2, 0xA, -0xAA, 0x7B, 0x1F, 0x74, 0xD8, 0xB8, 0x14, 0x90, 0x43, 0x7F, 0x14, 0x20, 0x16, 0x8E, 0xEC, 0x2C, -0xCA, 0x27, 0xB0, 0x3B, 0x58, 0xDE, 0xC2, 0x8E, 0xAE, 0x2B, 0x59, 0xE4, 0x56, 0xC1, 0x9B, 0x8A, -0x9B, 0x20, 0xCA, 0x8C, 0xA3, 0xEC, 0x6, 0x1, 0xEE, 0xC3, 0x13, 0xBA, 0xAF, 0x8E, 0xB5, 0x85, -0x82, 0x8D, 0xFD, 0x43, 0x45, 0xEB, 0xD5, 0xEA, 0x96, 0x26, 0x2D, 0xBF, 0xB8, 0x57, 0xEA, 0x8C, -0x9B, 0xA5, 0x4A, 0x13, 0x17, 0x48, 0xF6, 0x4, 0x49, 0x54, 0x64, 0x39, 0x11, 0x46, 0x7, 0x28, -0x42, 0xB, 0xD5, 0x2B, 0x78, 0x88, 0x44, 0x12, 0x87, 0xC3, 0x2C, 0x4D, 0x6E, 0xF, 0xE9, 0xE9, -0x1, 0x48, 0x66, 0xE5, 0x32, 0x9E, 0x63, 0x61, 0x5, 0x2, 0x1C, 0x55, 0xA5, 0x25, 0xCA, 0x81, -0xE8, 0xF8, 0x58, 0x56, 0x0, 0x36, 0xA, 0x4E, 0xCC, 0xC6, 0xF9, 0xE5, 0x67, 0x71, 0x7E, 0xB9, -0x44, 0x92, 0xAA, 0x46, 0x7C, 0x7, 0x75, 0xAD, 0x11, 0xD5, 0xC2, 0x4F, 0x52, 0xD8, 0x88, 0x85, -0xFB, 0xDA, 0xB, 0x9B, 0xB0, 0x69, 0xC7, 0x4C, 0xB5, 0xDB, 0x72, 0xC4, 0x38, 0xC4, 0x9E, 0xAD, -0x40, 0xE5, 0x20, 0x7C, 0x65, 0x90, 0x8C, 0xBA, 0x66, 0x63, 0x1A, 0x74, 0x5F, 0xE6, 0x43, 0x8, -0xB, 0x99, 0xB0, 0xAE, 0xD1, 0xDF, 0x9B, 0x44, 0x3A, 0x67, 0x85, 0xFE, 0xFD, 0xE3, 0xCF, 0xAA, -0x3, 0x15, 0x65, 0x34, 0xF7, 0xDA, 0x6B, 0x29, 0x25, 0xB9, 0xF5, 0x5C, 0x68, 0xB7, 0x14, 0x2E, -0x97, 0x27, 0xCA, 0xB2, 0xF7, 0xD0, 0x23, 0xE3, 0xFA, 0x63, 0x12, 0xE7, 0xE6, 0x7, 0x5A, 0x66, -0x74, 0x37, 0x76, 0xB7, 0x3D, 0xE1, 0xE, 0xA7, 0x4F, 0xC0, 0x29, 0x2F, 0x4B, 0x15, 0x23, 0x7E, -0x55, 0x1F, 0x8C, 0xB5, 0x83, 0xFD, 0xD6, 0xCC, 0x5, 0xB9, 0xE5, 0x9E, 0xC0, 0x90, 0x73, 0x71, -0xFE, 0x2B, 0xDD, 0x54, 0x97, 0x12, 0xF0, 0xAB, 0x31, 0xA9, 0x8B, 0x66, 0xBA, 0x44, 0xD9, 0x96, -0xF8, 0x7B, 0x3B, 0xAC, 0x97, 0xB9, 0xE3, 0x87, 0x76, 0x51, 0xF1, 0x17, 0x45, 0x7B, 0xFA, 0x2, -0xF3, 0x8C, 0x2F, 0x83, 0xAB, 0x98, 0xE, 0xA2, 0xF5, 0x13, 0xB1, 0x4C, 0xF4, 0x56, 0x29, 0x3C, -0x23, 0x24, 0x64, 0xDC, 0x78, 0x24, 0xDF, 0x97, 0x1, 0xFA, 0x72, 0x9, 0xF6, 0x4C, 0xF6, 0xAF, -0x3, 0x7E, 0xF9, 0x6E, 0x8, 0x8B, 0xFA, 0xB1, 0xA8, 0x46, 0x71, 0xA3, 0x2E, 0x65, 0xC8, 0xBC, -0x33, 0xED, 0xE5, 0x8D, 0xB0, 0x3B, 0xE2, 0x1A, 0x63, 0x3, 0xDC, 0xA3, 0xF6, 0x8, 0x23, 0xFB, -0xF4, 0x89, 0xDE, 0x1, 0x72, 0x64, 0xDE, 0x6F, 0xB5, 0x16, 0xEE, 0x65, 0x8A, 0xED, 0xB7, 0xB2, -0x85, 0x44, 0xC2, 0x58, 0x5B, 0xB6, 0x96, 0xDA, 0x81, 0xA5, 0xBF, 0xA0, 0xE1, 0x99, 0x31, 0x17, -0x84, 0xBF, 0x18, 0x77, 0x4E, 0xF9, 0x46, 0x2A, 0x5F, 0xC, 0x85, 0xF0, 0x93, 0x71, 0x95, 0xAF, -0x15, 0x6A, 0xDE, 0x3C, 0x52, 0x5F, 0x4D, 0x31, 0x6A, 0x0, 0x5C, 0x1E, 0x8A, 0x9, 0xF7, 0xD5, -0x5, 0x58, 0x74, 0x8F, 0x4F, 0xC6, 0x62, 0x94, 0xF7, 0xA4, 0x66, 0x31, 0xB9, 0x9A, 0x8F, 0x52, -0x4D, 0xB1, 0x6D, 0x12, 0x37, 0x67, 0x3D, 0xC8, 0xA9, 0xA6, 0xC0, 0x51, 0xC6, 0xBB, 0xE8, 0x48, -0xB0, 0x78, 0x83, 0x30, 0xBF, 0xAD, 0x27, 0x5E, 0x85, 0xC0, 0x6, 0x81, 0x56, 0x98, 0x7D, 0x86, -0x1D, 0x1D, 0xFE, 0xB9, 0xD2, 0xB9, 0xFD, 0x1C, 0x4C, 0x8D, 0x8E, 0xCB, 0x2C, 0x35, 0xCD, 0xBE, -0xF9, 0x5B, 0xC, 0xA5, 0x5F, 0x1E, 0x37, 0x5E, 0xA7, 0x39, 0xE, 0x32, 0xF8, 0x93, 0x14, 0x29, -0x6C, 0x51, 0x7D, 0x6F, 0x6, 0x20, 0xD, 0xD8, 0xE6, 0xD8, 0xB5, 0x25, 0x5A, 0x4D, 0xE7, 0x3B, -0x8F, 0xE0, 0x24, 0xB6, 0x76, 0x3A, 0x93, 0x56, 0xE6, 0x5, 0x7F, 0x9D, 0x68, 0x1E, 0x2D, 0x56, -0x38, 0x8F, 0xDF, 0x77, 0x29, 0x37, 0xC0, 0xC9, 0xD2, 0x48, 0xDC, 0xEF, 0x35, 0xF9, 0x2C, 0x1A, -0xA6, 0x53, 0xA3, 0x34, 0xB3, 0xF5, 0x9E, 0x15, 0x91, 0xD0, 0x50, 0x97, 0xC9, 0x20, 0x47, 0x14, -0xA0, 0xD1, 0xFB, 0x87, 0x84, 0xAD, 0xD3, 0x7E, 0xC8, 0xE1, 0x65, 0xB, 0x7, 0xC6, 0xAE, 0x6F, -0x44, 0x77, 0x60, 0xF8, 0x4A, 0xD5, 0xF, 0x98, 0x6B, 0x94, 0x88, 0x1A, 0x1, 0x11, 0x21, 0x3D, -0x90, 0x84, 0x3B, 0x87, 0xEF, 0x72, 0x48, 0x2B, 0x3D, 0xB6, 0x5B, 0xF1, 0x40, 0x93, 0xDB, 0x9F, -0x65, 0x37, 0x9A, 0x77, 0x74, 0x8F, 0x29, 0xFC, 0x8D, 0x4C, 0xCB, 0x1, 0xB, 0x7F, 0x97, 0x7F, -0x73, 0xF5, 0x3B, 0x17, 0xBF, 0x95, 0xE2, 0xA1, 0xF, 0xED, 0xBA, 0x9F, 0x54, 0x28, 0xBD, 0x44, -0x48, 0x8, 0xA, 0x50, 0xB3, 0x8A, 0x70, 0xBC, 0xA0, 0x9C, 0x9, 0xF9, 0x36, 0xCD, 0x14, 0x2, -0x14, 0x85, 0x7F, 0x74, 0xE4, 0x41, 0xE7, 0x1F, 0x23, 0xF5, 0xF2, 0x35, 0x21, 0x7B, 0x1A, 0x4A, -0x8C, 0x5B, 0xA7, 0x96, 0xA8, 0x8F, 0x7D, 0xAC, 0x35, 0xB4, 0x4F, 0xE5, 0xCC, 0x97, 0x71, 0xE8, -0x5C, 0x53, 0xBD, 0x72, 0x46, 0x23, 0x46, 0x8E, 0xF1, 0x47, 0x26, 0x28, 0x1F, 0xB7, 0x73, 0x96, -0xCE, 0x5B, 0x3B, 0x8C, 0x3, 0x20, 0x99, 0xE9, 0x9C, 0xB6, 0xBB, 0x4C, 0x4E, 0xAC, 0x1C, 0xE7, -0x97, 0xCE, 0x41, 0x45, 0x5E, 0xD3, 0x1A, 0x53, 0xB4, 0x74, 0xF, 0x29, 0xB2, 0xA3, 0xD3, 0x56, -0x7, 0xEF, 0x80, 0xAA, 0xD2, 0x88, 0xD8, 0xA6, 0x8B, 0x91, 0xBA, 0x99, 0x26, 0x20, 0x4C, 0x96, -0x89, 0x6, 0x93, 0x10, 0xD1, 0xE0, 0x39, 0x9C, 0x5A, 0x65, 0x30, 0x22, 0xA4, 0x7C, 0xF4, 0xF6, -0x16, 0x3A, 0x13, 0x24, 0xA1, 0xB1, 0xA4, 0x9D, 0x28, 0xC0, 0xCE, 0x30, 0xFE, 0x2C, 0x4E, 0xC1, -0xBA, 0x69, 0xA0, 0x57, 0xED, 0x99, 0x24, 0xA8, 0x3E, 0x26, 0x11, 0xAA, 0x69, 0x1B, 0x32, 0xDE, -0x9, 0xD0, 0x16, 0x21, 0xE2, 0x1D, 0x81, 0xFD, 0x74, 0x8, 0x10, 0x4B, 0x7C, 0x44, 0x1F, 0x6B, -0x55, 0x44, 0x8B, 0x87, 0xC, 0x51, 0x52, 0xE, 0x12, 0x4, 0x80, 0x44, 0x67, 0x91, 0x30, 0xA3, -0x0, 0xA, 0x43, 0x9F, 0xC0, 0xD7, 0x20, 0x9, 0x6A, 0xF8, 0xA8, 0x73, 0xF4, 0xC0, 0x33, 0xB9, -0x1F, 0xAA, 0x5F, 0x1E, 0xD8, 0xA0, 0x19, 0x79, 0xC6, 0x2F, 0xF8, 0x2A, 0xBB, 0xE2, 0x5B, 0x93, -0x60, 0x72, 0xD0, 0xDB, 0xB5, 0x9F, 0x89, 0x8D, 0x14, 0x6C, 0xD7, 0xD9, 0x10, 0x4, 0xAD, 0xE5, -0x5D, 0x69, 0x2C, 0x61, 0x2A, 0x7A, 0x92, 0x35, 0x4A, 0x96, 0xA9, 0x50, 0xAF, 0x42, 0x85, 0x62, -0x8B, 0x4F, 0x2E, 0x5B, 0xD, 0x56, 0xD1, 0xA2, 0x93, 0x5D, 0xEE, 0x3A, 0xE, 0xA7, 0xB2, 0x8B, -0xE1, 0x7B, 0x65, 0x99, 0x3E, 0x9A, 0x9B, 0x77, 0xEA, 0xB9, 0xA, 0x6E, 0x3E, 0xEB, 0xCC, 0x4C, -0x5F, 0x7C, 0x85, 0x11, 0xFA, 0xA2, 0x29, 0x92, 0x22, 0x80, 0x20, 0x26, 0xA2, 0x82, 0x23, 0xC3, -0x98, 0x9A, 0x1F, 0x1A, 0xEF, 0x73, 0x6C, 0xDE, 0xF7, 0x52, 0x8A, 0xE, 0x57, 0x20, 0xDF, 0x8A, -0xC6, 0xA3, 0xB, 0x62, 0x92, 0x42, 0xB5, 0x37, 0xFE, 0x2C, 0xFC, 0x82, 0x27, 0x33, 0x21, 0x4A, -0x17, 0x81, 0xEB, 0xB1, 0x98, 0x80, 0xE7, 0x5C, 0x5E, 0x7E, 0xD4, 0xEC, 0x3E, 0xC7, 0x67, 0x5B, -0xBF, 0x21, 0xAC, 0xF9, 0x46, 0x63, 0x74, 0x11, 0x48, 0x33, 0x54, 0xD4, 0xB1, 0x47, 0x53, 0x49, -0x84, 0x43, 0x43, 0xB3, 0xE4, 0xA, 0x4E, 0x82, 0x51, 0x29, 0x7C, 0x3B, 0x62, 0xD4, 0xAB, 0x2F, -0xE5, 0xB1, 0xB5, 0xFC, 0xB5, 0xB8, 0xD1, 0xF9, 0x78, 0x33, 0x4C, 0x5B, 0xD9, 0xF4, 0x13, 0xEE, -0x89, 0xE8, 0xF4, 0x33, 0xE1, 0xCB, 0xB8, 0xB2, 0xD0, 0xBF, 0x19, 0xED, 0xBF, 0x1B, 0xED, 0xBF, -0x37, 0xED, 0xB5, 0x58, 0x75, 0x18, 0xA5, 0x75, 0xE, 0x85, 0x40, 0x80, 0xE0, 0xA8, 0xC3, 0xA6, -0x6E, 0xA4, 0x61, 0xE8, 0x48, 0x11, 0x70, 0x6D, 0x41, 0xEC, 0x59, 0x47, 0xAD, 0x9, 0xF7, 0x4D, -0x4B, 0xB8, 0x6C, 0xCC, 0xED, 0xD0, 0x37, 0x37, 0xE1, 0xC7, 0x31, 0xC1, 0x43, 0xDF, 0x4, 0x77, -0x65, 0x48, 0xB3, 0xB2, 0xF2, 0x75, 0x12, 0x24, 0xD, 0xE3, 0x6C, 0x3E, 0x47, 0x2C, 0xF0, 0x33, -0x1A, 0xE, 0x31, 0x9A, 0x48, 0x57, 0xE5, 0x37, 0x43, 0x5F, 0xA7, 0x84, 0xCF, 0x2B, 0xBB, 0xD7, -0x2B, 0x6A, 0x41, 0xB7, 0xDF, 0xEC, 0x6E, 0x2E, 0x3F, 0x14, 0x8F, 0x2D, 0xED, 0xAF, 0xB9, 0xDC, -0x6D, 0xB2, 0x36, 0xAD, 0x4F, 0x77, 0xCF, 0xCE, 0x25, 0xAA, 0x25, 0xD5, 0x23, 0xA6, 0xF2, 0xC1, -0xF6, 0xEB, 0xF6, 0x67, 0x89, 0x63, 0xCB, 0xB4, 0x6F, 0x29, 0x90, 0xD2, 0x81, 0x74, 0x88, 0x64, -0xB1, 0xE3, 0xE4, 0x9A, 0x55, 0xD7, 0xE7, 0xBE, 0x80, 0x46, 0xC9, 0xE, 0x89, 0x29, 0x3D, 0x83, -0x61, 0x79, 0x4A, 0xA7, 0x44, 0xD0, 0xE3, 0x73, 0x31, 0xD1, 0x77, 0xB0, 0xD9, 0xA8, 0x73, 0x13, -0x32, 0xD2, 0x2D, 0x42, 0xF5, 0x19, 0xB4, 0xC4, 0xF6, 0xFB, 0x6, 0x6C, 0x24, 0xA6, 0x2E, 0x32, -0x6F, 0xD8, 0xD8, 0x11, 0x90, 0x59, 0x64, 0xEB, 0xE7, 0x3B, 0x91, 0xEE, 0xF, 0x2D, 0xAD, 0x9, -0x6C, 0xC2, 0xEB, 0x9B, 0xC4, 0x97, 0x2E, 0x3D, 0x51, 0x42, 0x78, 0x47, 0x4D, 0xE9, 0x16, 0x9D, -0x8D, 0xBA, 0xE2, 0x48, 0xCF, 0xF6, 0xDB, 0x11, 0xBA, 0xC4, 0x51, 0xD3, 0x4B, 0xF7, 0xDC, 0xE8, -0x78, 0x2F, 0xC9, 0xB2, 0xCB, 0x75, 0x8E, 0xEC, 0x35, 0x8F, 0xC4, 0x2B, 0x5A, 0xFF, 0xA9, 0x2E, -0x5E, 0xD9, 0xAF, 0x8D, 0xEF, 0xAC, 0x64, 0xA0, 0xE7, 0x75, 0x5D, 0xB3, 0xF1, 0x46, 0xF9, 0xCE, -0x3, 0xF1, 0xEC, 0xA1, 0x8E, 0xF, 0xAC, 0x57, 0xCD, 0x77, 0xBF, 0x16, 0xB0, 0x5C, 0x38, 0x1D, -0xC4, 0x4B, 0xE8, 0xBB, 0x6F, 0x31, 0xC4, 0xE, 0x39, 0xBC, 0x17, 0x9C, 0xBB, 0xE0, 0xE2, 0xB5, -0xF5, 0x9D, 0xE0, 0xF9, 0x95, 0x3, 0x2E, 0xDE, 0x67, 0xDF, 0x5D, 0xE7, 0xD1, 0xC2, 0xDE, 0xB, -0x9E, 0xBB, 0xE0, 0xE2, 0xD, 0xF8, 0x9D, 0xE0, 0x94, 0x15, 0xA9, 0x13, 0x88, 0xD6, 0x3D, 0x2A, -0xB5, 0x49, 0x3D, 0x7C, 0x7C, 0x4F, 0x45, 0x17, 0x48, 0xDA, 0x53, 0xC2, 0x8C, 0xE2, 0xA6, 0xC, -0x55, 0x31, 0xFF, 0xF }; + 0xC5, 0x5D, 0xFD, 0x72, 0xDB, 0xB6, 0xB2, 0xFF, 0xDF, 0x4F, 0xC1, 0xEA, 0x8C, 0x23, 0xB9, 0xB6, +0x25, 0x7F, 0xA4, 0x3D, 0xBD, 0x8E, 0x9D, 0x4E, 0xE2, 0x24, 0xA7, 0x99, 0x49, 0x9A, 0x4C, 0x9C, +0x4E, 0xDB, 0x49, 0xFA, 0x7, 0x45, 0x42, 0x12, 0x63, 0x8A, 0xE4, 0x21, 0x29, 0x7F, 0xE4, 0x9C, +0xBC, 0xCD, 0x7D, 0x93, 0xFB, 0x62, 0xF7, 0xB7, 0xF8, 0x20, 0x1, 0x10, 0xA4, 0x28, 0xC7, 0x9D, +0x68, 0x26, 0xB1, 0x5, 0x2E, 0x16, 0x8B, 0xC5, 0xEE, 0x62, 0xB1, 0xBB, 0xA0, 0xAF, 0xFC, 0xDC, +0x63, 0x31, 0x5B, 0xB2, 0xA4, 0x4C, 0x8F, 0xA2, 0x43, 0xEF, 0xCC, 0x4B, 0x56, 0x71, 0xFC, 0x68, +0xEB, 0x4A, 0x6B, 0x3F, 0x76, 0xB5, 0x2E, 0x8B, 0xB9, 0xAB, 0x79, 0x16, 0xB9, 0x5A, 0x99, 0xB3, +0x35, 0xBB, 0x72, 0xB5, 0x96, 0x6E, 0x58, 0x67, 0xEB, 0x75, 0x51, 0xB5, 0x6E, 0x5, 0x69, 0x52, +0x94, 0x5E, 0xC1, 0x2E, 0xCB, 0x88, 0x7E, 0xCB, 0x59, 0x92, 0xB0, 0x1C, 0x8F, 0x2F, 0xCA, 0x3C, +0x4A, 0xE6, 0xE3, 0x59, 0x9E, 0x2E, 0xCF, 0x17, 0x7E, 0x7E, 0x9E, 0x86, 0x6C, 0x74, 0xBC, 0xE7, +0x1D, 0xEE, 0x79, 0x47, 0x3B, 0x8F, 0x64, 0x2F, 0x1F, 0xA8, 0xD2, 0xBC, 0xEC, 0xEE, 0x74, 0xC4, +0x3B, 0x1D, 0x57, 0x9D, 0xA2, 0x92, 0x2D, 0xFB, 0xF4, 0x78, 0x58, 0xF5, 0x98, 0xA6, 0x69, 0x19, +0x25, 0xB3, 0xB4, 0x4F, 0xAF, 0x7F, 0xA2, 0x17, 0x9F, 0xEA, 0x2C, 0x8D, 0x43, 0x96, 0x27, 0xFE, +0x92, 0x1, 0x7E, 0x30, 0x10, 0xF3, 0xBF, 0x8E, 0x92, 0x30, 0xBD, 0xE, 0xD2, 0x15, 0x78, 0x4B, +0x78, 0xE, 0x44, 0xF3, 0x2C, 0x8A, 0x59, 0x71, 0x5B, 0x80, 0x30, 0x1A, 0xA6, 0x90, 0x1D, 0xE4, +0xE8, 0x99, 0x5F, 0x2E, 0xA2, 0xA4, 0x60, 0x39, 0x68, 0x28, 0xF3, 0xD4, 0x3B, 0xDB, 0xF2, 0xF0, +0x19, 0x9C, 0x86, 0xD1, 0x95, 0x17, 0x85, 0x67, 0x1F, 0x7, 0x59, 0xFC, 0x71, 0xF0, 0x98, 0x7F, +0xD, 0x62, 0xBF, 0x28, 0xA8, 0x25, 0x3D, 0xA4, 0xA6, 0x9, 0xDA, 0xEC, 0x7, 0x47, 0x12, 0x56, +0x3D, 0x75, 0xC1, 0x1C, 0xB7, 0x75, 0x7E, 0xA8, 0x3A, 0xBB, 0xA8, 0x63, 0x37, 0x3A, 0x75, 0xED, +0xD8, 0x7F, 0x68, 0xC3, 0xFE, 0x63, 0xF, 0xD2, 0xFE, 0x59, 0x75, 0x1E, 0x78, 0xBB, 0x1A, 0x23, +0x2A, 0x88, 0x55, 0xDB, 0xCC, 0x57, 0x7C, 0xE6, 0xAE, 0x7, 0x6D, 0xD3, 0x5D, 0xD1, 0x74, 0x1F, +0x24, 0xD3, 0x22, 0x7B, 0xD4, 0x3D, 0x64, 0xDB, 0x8C, 0x56, 0x7C, 0x46, 0xAE, 0x7, 0xF5, 0x34, +0x24, 0xE6, 0x8A, 0x9F, 0x42, 0x6C, 0x20, 0x24, 0x49, 0x9C, 0xFA, 0xA1, 0xE0, 0x6C, 0xC5, 0xD4, +0xD8, 0x9F, 0xB2, 0xF8, 0xF1, 0x69, 0x94, 0x64, 0xAB, 0xD2, 0x2B, 0x6F, 0x33, 0x6, 0x64, 0x39, +0xA0, 0xD2, 0x8F, 0x3, 0x8F, 0x24, 0xD, 0x5F, 0x7D, 0xFC, 0x7A, 0xE5, 0xC7, 0x2B, 0xFA, 0x9D, +0x58, 0xE1, 0xF9, 0x71, 0x2C, 0xE4, 0xCB, 0x4B, 0x13, 0x2F, 0x64, 0x57, 0x51, 0xC0, 0x4E, 0x27, +0x12, 0xD1, 0x34, 0xD7, 0xE6, 0xB4, 0x21, 0x72, 0x62, 0xA7, 0x87, 0xB5, 0x2F, 0x24, 0xC9, 0xF7, +0x82, 0xF4, 0xD8, 0x42, 0xA, 0xD, 0xF, 0xBD, 0x62, 0x35, 0x15, 0xDF, 0xA, 0x63, 0x8C, 0x9A, +0x65, 0x98, 0x1D, 0x34, 0x13, 0xD8, 0x4C, 0x76, 0xFD, 0xCA, 0xAE, 0xF9, 0x18, 0x27, 0x4, 0x2E, +0x49, 0xE0, 0xA, 0x93, 0xB0, 0x6B, 0x6A, 0xC7, 0xB8, 0x31, 0x4B, 0xE6, 0xE5, 0x82, 0x66, 0x73, +0x70, 0x40, 0x4B, 0x92, 0x59, 0xA4, 0x2E, 0xA2, 0x30, 0x64, 0x9, 0x0, 0x79, 0x3F, 0x10, 0x21, +0xFA, 0xD5, 0x13, 0x84, 0xF6, 0x27, 0x73, 0x98, 0x2, 0x10, 0xCD, 0xB8, 0x2E, 0x40, 0xC5, 0xC1, +0xF0, 0x65, 0x7A, 0xC5, 0x78, 0x13, 0xD1, 0x36, 0x86, 0xB9, 0xF0, 0x41, 0xD6, 0x75, 0x84, 0xC7, +0xD4, 0xE0, 0x9, 0x5D, 0x87, 0x5, 0x5C, 0x4E, 0x31, 0xC7, 0x32, 0x95, 0xF0, 0xA9, 0x97, 0xA2, +0x4F, 0x2E, 0x57, 0x69, 0x6C, 0x70, 0xF2, 0x49, 0x50, 0x46, 0x80, 0xA9, 0x2D, 0x45, 0xE1, 0xF9, +0x39, 0x3B, 0xF1, 0xB6, 0x67, 0xDB, 0x26, 0xE0, 0xF3, 0x1B, 0x7F, 0x99, 0xC5, 0x78, 0x72, 0x78, +0x32, 0x21, 0x82, 0xC4, 0x7F, 0xD4, 0x8F, 0x68, 0x1F, 0x43, 0x4B, 0x61, 0x80, 0x61, 0x6A, 0x4F, +0x27, 0x99, 0xC5, 0xC3, 0x10, 0xD6, 0xB9, 0xB4, 0x78, 0xF8, 0x8C, 0xB7, 0x9, 0xAA, 0x4F, 0xA3, +0xC7, 0x18, 0xED, 0x74, 0x12, 0x3D, 0xFE, 0x59, 0xE3, 0xA8, 0x93, 0x53, 0x6A, 0x38, 0xC9, 0x53, +0x40, 0x73, 0x44, 0xC4, 0x28, 0x21, 0x8B, 0xB4, 0xC2, 0x51, 0xE2, 0xC7, 0x63, 0x93, 0xC, 0x61, +0x1F, 0x17, 0xE5, 0x32, 0x26, 0x1B, 0x58, 0x9B, 0xB8, 0xED, 0x68, 0xDB, 0xB6, 0x71, 0x2, 0xB4, +0x8C, 0xCA, 0x98, 0xD9, 0x8F, 0x4A, 0x34, 0x6C, 0x97, 0xDB, 0xE, 0xCD, 0x9B, 0xAF, 0x31, 0x1F, +0xD2, 0x3E, 0xC7, 0x69, 0xC1, 0x2C, 0xDD, 0x77, 0x20, 0x53, 0xC6, 0x1C, 0xB6, 0x3C, 0x29, 0x7B, +0x21, 0x9E, 0xE7, 0x51, 0x6, 0xC0, 0x93, 0x93, 0x13, 0x5B, 0xF9, 0x27, 0x93, 0x83, 0xF6, 0xCF, +0xD6, 0x6C, 0x95, 0x60, 0xF9, 0xA1, 0xBF, 0x41, 0xBA, 0xCC, 0x72, 0x56, 0x14, 0xAB, 0x3C, 0x26, +0x3E, 0x8E, 0x8A, 0x74, 0x95, 0x7, 0x6C, 0xC7, 0xFB, 0xF, 0x1F, 0x72, 0x32, 0xF1, 0xC2, 0x5B, +0xB0, 0x3D, 0xA, 0xBC, 0x2C, 0x5, 0x37, 0xC9, 0x82, 0x78, 0x9F, 0xA, 0x7A, 0xC4, 0x9F, 0xD3, +0x56, 0x53, 0xD0, 0x76, 0x14, 0xA6, 0xC1, 0x8A, 0xF6, 0xE1, 0x71, 0x90, 0x33, 0xBF, 0x64, 0xCF, +0xC5, 0xAE, 0x3C, 0x1A, 0x16, 0x1, 0x8, 0x2C, 0x87, 0xD8, 0xC2, 0x8, 0xBC, 0x60, 0x63, 0x5A, +0x5C, 0xC0, 0xF, 0xC9, 0xB8, 0x4F, 0x3E, 0xF9, 0x57, 0xBE, 0x84, 0xA8, 0x0, 0x8A, 0x3C, 0xA0, +0x95, 0x9A, 0xCC, 0x3F, 0x47, 0x59, 0xC6, 0xF2, 0xF1, 0xA7, 0x62, 0x20, 0x9E, 0x55, 0x43, 0x2C, +0x98, 0x1F, 0x8E, 0x7D, 0x3C, 0x4C, 0xC2, 0xF3, 0x45, 0x14, 0x87, 0xA3, 0x82, 0xD1, 0x16, 0x49, +0x30, 0xF0, 0x45, 0xE2, 0x28, 0x61, 0xA3, 0xC1, 0xB, 0x56, 0x6, 0xB, 0x25, 0x1C, 0xE3, 0xF1, +0x78, 0x20, 0x29, 0x20, 0x82, 0x73, 0xF6, 0xEF, 0x15, 0xC3, 0x64, 0xE0, 0x30, 0x40, 0x9F, 0xFF, +0x78, 0xFD, 0xEA, 0x97, 0xB2, 0xCC, 0xDE, 0x89, 0xC6, 0x91, 0x84, 0x93, 0x30, 0xE3, 0x34, 0xC9, +0xF2, 0x74, 0x4E, 0xC, 0x2, 0xB8, 0x62, 0xDA, 0x88, 0x5D, 0x95, 0x8A, 0x43, 0xF4, 0x89, 0x66, +0x1E, 0x35, 0x8D, 0x85, 0xEE, 0x9F, 0x83, 0xA3, 0xAB, 0xD2, 0x9F, 0xC6, 0x15, 0x17, 0xD5, 0x87, +0x6, 0xC7, 0x94, 0x2, 0x4C, 0x82, 0x80, 0xB8, 0x1E, 0x9C, 0x79, 0xAF, 0xA1, 0x4D, 0xE3, 0x1C, +0x1B, 0x78, 0x38, 0x12, 0x58, 0xC0, 0x63, 0x16, 0x7A, 0x13, 0x8F, 0xBE, 0x94, 0x69, 0xE9, 0xC7, +0x3B, 0xDE, 0xF7, 0xDE, 0xE1, 0xC1, 0xC1, 0xF8, 0x40, 0x12, 0xA7, 0x8F, 0xB, 0x69, 0x28, 0x6D, +0x9C, 0xDF, 0x9D, 0xD9, 0xC3, 0xD8, 0x94, 0xD0, 0xC7, 0xD5, 0xB3, 0xD1, 0xD1, 0x1C, 0xB0, 0x9D, +0xC5, 0x1E, 0x84, 0xB4, 0x31, 0xB7, 0x5D, 0x6F, 0xB0, 0xAD, 0xF1, 0x5E, 0x7D, 0xBE, 0x54, 0xDF, +0xC4, 0x6F, 0x5F, 0x2C, 0x8E, 0x43, 0x82, 0x42, 0x18, 0x24, 0x88, 0x51, 0x40, 0xB6, 0x90, 0xE9, +0x9C, 0xD7, 0x27, 0x42, 0xEC, 0x7C, 0xF6, 0xE6, 0xD7, 0xE7, 0x78, 0x4E, 0x6, 0x7E, 0xCC, 0x7F, +0xFF, 0xEF, 0x7F, 0xBD, 0x87, 0xF5, 0x70, 0xC4, 0x21, 0xFE, 0x8C, 0xE3, 0x84, 0xD1, 0xA4, 0x39, +0x9E, 0x9D, 0xF1, 0x6E, 0xAE, 0xD5, 0x9, 0xFD, 0xD2, 0x57, 0xE8, 0xB0, 0xE8, 0x19, 0x4C, 0x8, +0x7B, 0xF, 0x49, 0x7D, 0xD4, 0x80, 0x24, 0xF1, 0x4, 0x24, 0x51, 0x1D, 0xE5, 0x6C, 0x34, 0xA4, +0xEF, 0xFB, 0x9F, 0x8A, 0xE1, 0xCE, 0x5E, 0x83, 0x63, 0x69, 0xC6, 0x1D, 0x51, 0x40, 0x37, 0x17, +0x81, 0x2F, 0x4, 0xBB, 0x62, 0xF1, 0x89, 0xF7, 0x3F, 0xCD, 0x9E, 0xF4, 0xE1, 0xFB, 0x8D, 0x27, +0xD4, 0xD2, 0xD, 0x51, 0x46, 0x4B, 0x30, 0xE, 0x36, 0xFA, 0x4, 0xFB, 0x45, 0x5E, 0xB0, 0x97, +0x50, 0xBC, 0x67, 0x98, 0xE9, 0x38, 0x49, 0xAF, 0xC1, 0xB0, 0x9, 0xC9, 0xCE, 0x1, 0x5C, 0xC9, +0x83, 0x9D, 0x46, 0xF7, 0x2F, 0xCD, 0x89, 0xA5, 0xB0, 0xC0, 0x67, 0x7C, 0x7A, 0x63, 0xFC, 0x1B, +0x11, 0x47, 0xF6, 0xD4, 0x14, 0x76, 0x9A, 0xE0, 0x53, 0x1, 0x4F, 0x9A, 0xF4, 0x1B, 0xBC, 0xC9, +0x9F, 0x9E, 0xE4, 0xB9, 0x7F, 0x3B, 0x42, 0xE3, 0xCE, 0x23, 0xB2, 0x1E, 0xF4, 0x14, 0x96, 0xF9, +0xF0, 0x47, 0x6F, 0x1A, 0x95, 0x5, 0x84, 0x41, 0xE8, 0x69, 0x43, 0x98, 0x2E, 0xA0, 0xCC, 0x24, +0x4B, 0xCA, 0x1C, 0x41, 0x1, 0x2C, 0xCD, 0xD5, 0x7, 0x2D, 0x0, 0x3D, 0xF5, 0x83, 0xCB, 0x4E, +0x15, 0x56, 0x1F, 0x5, 0x3C, 0x5E, 0x65, 0xA4, 0x5A, 0xFD, 0x54, 0x7A, 0x53, 0xD5, 0xFE, 0xBB, +0x54, 0xFC, 0x7E, 0x54, 0xFD, 0x2B, 0x55, 0xBE, 0xEF, 0x6A, 0x6D, 0x62, 0x4, 0x9A, 0xC6, 0xC0, +0xDD, 0xF2, 0xC5, 0xBD, 0x96, 0xFD, 0xAD, 0xC4, 0x6, 0xD6, 0xE2, 0x2E, 0x56, 0x43, 0x7D, 0xE6, +0xC, 0x27, 0xDE, 0x58, 0xFA, 0x3A, 0xB6, 0x8, 0x3A, 0xA6, 0xD5, 0x22, 0xA3, 0x29, 0x76, 0xB5, +0xD1, 0xF0, 0xED, 0x9B, 0x8B, 0xF7, 0xC3, 0x3D, 0x6F, 0x38, 0xC9, 0x7F, 0x9E, 0x15, 0x67, 0x43, +0xF0, 0x10, 0xE8, 0x5F, 0x0, 0xFD, 0x5, 0x77, 0xD4, 0x5E, 0x26, 0x21, 0xBB, 0xC1, 0x24, 0x77, +0xBD, 0xE1, 0x83, 0x59, 0xC2, 0x9F, 0xB, 0xFB, 0x40, 0x2D, 0xE3, 0xF9, 0x67, 0xB5, 0xDD, 0xAA, +0xCF, 0x64, 0xD2, 0x8A, 0xDF, 0x6, 0x15, 0xE7, 0xCC, 0x7C, 0x29, 0xD, 0x21, 0x69, 0xD7, 0xB, +0x7C, 0x85, 0x39, 0xF1, 0x47, 0x2E, 0xED, 0x8F, 0xD3, 0xA9, 0x4, 0x7B, 0x8A, 0x5F, 0x47, 0x1F, +0xC8, 0x1C, 0xFC, 0xB5, 0xE7, 0xE0, 0x11, 0xED, 0xFB, 0x27, 0xDE, 0x0, 0xDB, 0x76, 0x1C, 0x5, +0x3E, 0xAD, 0xD2, 0x24, 0xD, 0x4A, 0x56, 0xEE, 0x4F, 0xE1, 0xB4, 0xE5, 0xB7, 0x3, 0x93, 0x3B, +0xD6, 0x50, 0x8A, 0x22, 0xB9, 0xEB, 0x8F, 0xCC, 0xD9, 0xEE, 0x71, 0x32, 0xF6, 0xBA, 0x79, 0x50, +0x71, 0x80, 0x7E, 0x19, 0x29, 0x84, 0x1A, 0x90, 0xDC, 0x8B, 0xAC, 0xED, 0x9F, 0xB3, 0xEB, 0x5F, +0xCF, 0x89, 0x5B, 0x15, 0xFA, 0x1, 0x2D, 0xCA, 0xA0, 0x65, 0x51, 0xF6, 0xBC, 0x32, 0x5F, 0x91, +0x3F, 0xA2, 0xA3, 0xE1, 0x63, 0x52, 0x74, 0x2, 0xED, 0x5F, 0x7A, 0xBB, 0x66, 0xCE, 0x35, 0x17, +0x9C, 0x15, 0x46, 0x30, 0x66, 0x0, 0xE4, 0x2E, 0xB3, 0xE6, 0x80, 0xA1, 0x97, 0xF4, 0xBE, 0x9E, +0xDE, 0xBE, 0xC, 0x47, 0xC3, 0x25, 0x5B, 0xA6, 0xF9, 0xAD, 0x62, 0x7, 0x89, 0xB6, 0xD1, 0x51, +0x44, 0x4D, 0x74, 0xA9, 0x26, 0xBF, 0x39, 0x85, 0xE9, 0x8D, 0xD3, 0xF9, 0x68, 0xF8, 0xB, 0x6C, +0xFA, 0x9, 0x51, 0x82, 0x23, 0xC4, 0xCC, 0x5F, 0xC5, 0xA5, 0x71, 0xDC, 0x80, 0xB, 0xCA, 0x6E, +0x74, 0x4E, 0xE7, 0xAC, 0x5C, 0xE5, 0x89, 0xB7, 0x7F, 0x28, 0x9A, 0xBE, 0x20, 0x3C, 0x3, 0xF7, +0xF0, 0x3F, 0xF6, 0x73, 0x8D, 0x82, 0xB1, 0xF8, 0x9D, 0x85, 0x7C, 0x82, 0xB2, 0xDB, 0x6, 0x4C, +0x62, 0x37, 0x2C, 0x58, 0xC1, 0x6, 0xA4, 0xCB, 0x25, 0x4E, 0x76, 0x23, 0xF9, 0x53, 0xE7, 0xD3, +0xCD, 0x22, 0xEF, 0xDC, 0x27, 0xF0, 0xFC, 0xDB, 0x39, 0x1D, 0xAD, 0x66, 0xC3, 0x10, 0x47, 0x4E, +0xA2, 0x26, 0x8A, 0xC3, 0xC9, 0xA7, 0x74, 0xBA, 0xC6, 0x34, 0xC, 0x1E, 0x90, 0x88, 0x4A, 0x7E, +0x18, 0x52, 0x49, 0xD8, 0xEE, 0x26, 0x91, 0xC5, 0x22, 0xBD, 0x16, 0x7, 0xE7, 0x11, 0x77, 0x5A, +0xF6, 0xE4, 0xA1, 0x5A, 0xCD, 0xCA, 0x88, 0x50, 0x89, 0x2F, 0x62, 0xC8, 0xC6, 0x34, 0xFB, 0x8F, +0xA9, 0x36, 0x6B, 0x6A, 0xD0, 0x77, 0xE9, 0xC9, 0xF7, 0x8A, 0x55, 0x5B, 0x7F, 0xD7, 0xF6, 0x7B, +0xF7, 0x4D, 0x77, 0x83, 0x8D, 0xF6, 0xFB, 0x49, 0xCB, 0xC9, 0x85, 0xEC, 0x13, 0x2C, 0x26, 0x16, +0x51, 0xA3, 0x19, 0xEB, 0xEA, 0x79, 0x4F, 0x7, 0x9B, 0xDA, 0x11, 0x9D, 0xF9, 0x9A, 0x6A, 0xC0, +0x5D, 0xF4, 0x97, 0xE4, 0xED, 0x39, 0x44, 0xA8, 0x3E, 0x2F, 0x5, 0xD3, 0xE, 0xFB, 0x32, 0x40, +0x8, 0x13, 0xC1, 0x5, 0x76, 0xAD, 0x9F, 0xB0, 0xAE, 0x11, 0x46, 0xA5, 0xC0, 0x2B, 0x17, 0x3, +0x1F, 0x26, 0xA0, 0x36, 0x3E, 0xC1, 0x54, 0xE7, 0x95, 0xE, 0x18, 0x4C, 0xC7, 0xC1, 0x82, 0x5, +0x97, 0x2C, 0x6C, 0x31, 0x1E, 0x8D, 0xF8, 0xA7, 0xD0, 0x93, 0x8E, 0x83, 0x1F, 0xA2, 0x2, 0x14, +0xFD, 0xBC, 0xAF, 0xF3, 0x9F, 0x2E, 0x8A, 0x36, 0x98, 0xC3, 0x7E, 0x3C, 0x49, 0x8A, 0x6B, 0x96, +0xBF, 0xCD, 0xD3, 0x0, 0x7D, 0xD2, 0xBC, 0x7D, 0x67, 0x19, 0x4E, 0x22, 0xA5, 0xCC, 0x62, 0x45, +0x68, 0x63, 0x2F, 0xF9, 0xF7, 0x9A, 0x41, 0xD4, 0x96, 0x89, 0xCD, 0xBE, 0x66, 0xC4, 0xDA, 0xDD, +0x46, 0x30, 0x19, 0xAE, 0x77, 0x16, 0x51, 0xA0, 0x79, 0x24, 0xC1, 0xFB, 0xB, 0xF, 0xA2, 0x30, +0x8C, 0xE2, 0x3D, 0x44, 0x43, 0x25, 0x3B, 0x55, 0x28, 0x7E, 0xCC, 0xB1, 0xFE, 0xF2, 0xFE, 0xF5, +0x2B, 0x6D, 0x49, 0xAA, 0xF0, 0x7D, 0xD7, 0x53, 0xF4, 0x2D, 0xCA, 0x5B, 0x6C, 0x33, 0x57, 0x51, +0x11, 0x4D, 0xA3, 0x38, 0x2A, 0x6F, 0x9, 0x28, 0x48, 0xE3, 0xD8, 0xCF, 0xA, 0xD6, 0x40, 0xB5, +0x6, 0x78, 0xED, 0x84, 0x70, 0x16, 0xF9, 0x5, 0x86, 0x30, 0x16, 0x41, 0x34, 0x43, 0x25, 0x10, +0x12, 0xA4, 0x85, 0xAA, 0xE7, 0x6C, 0x2D, 0x9C, 0xA1, 0x32, 0x1D, 0xB6, 0xBF, 0xAF, 0xDD, 0x27, +0x34, 0x65, 0xF7, 0x29, 0x53, 0xEC, 0xEF, 0x9C, 0x9A, 0xC2, 0x5, 0x39, 0x2E, 0xE0, 0x46, 0x95, +0x23, 0x2B, 0xC7, 0xA1, 0xA2, 0x20, 0xF4, 0x31, 0xD7, 0x4D, 0x7B, 0x0, 0x46, 0x5C, 0x88, 0x6E, +0xDE, 0xC1, 0x89, 0x17, 0x46, 0xCC, 0x7B, 0x93, 0x87, 0xE8, 0x1C, 0x47, 0x50, 0xFE, 0xDA, 0x96, +0x72, 0x47, 0x10, 0x32, 0xC4, 0x23, 0x90, 0xF5, 0xEA, 0xA9, 0x47, 0x94, 0xF2, 0x20, 0xCA, 0x14, +0x91, 0x1F, 0xE, 0xFE, 0x92, 0x34, 0x69, 0xC9, 0x10, 0xCD, 0x98, 0x12, 0x6F, 0xF8, 0xA3, 0x42, +0x1E, 0xA5, 0xBC, 0xC7, 0xDE, 0xC1, 0x8E, 0xF7, 0xE0, 0x81, 0x27, 0x5A, 0xD1, 0x9F, 0xCC, 0xEA, +0x60, 0xB0, 0x63, 0x9B, 0xD2, 0x85, 0x5F, 0xF0, 0x79, 0xA4, 0x74, 0xDC, 0x26, 0xF1, 0xB5, 0x5C, +0x43, 0x8D, 0xC6, 0x89, 0x46, 0x64, 0x65, 0xBC, 0x44, 0x4E, 0xC4, 0x6E, 0xCE, 0xAC, 0x39, 0x55, +0x4C, 0xAF, 0xA2, 0x84, 0x2A, 0xCE, 0x36, 0x4B, 0x58, 0x10, 0xD8, 0xF1, 0x40, 0x34, 0xCE, 0xA9, +0xD1, 0xC2, 0x70, 0x8D, 0x70, 0x14, 0x83, 0x8D, 0xF3, 0x4E, 0x3D, 0x63, 0xAE, 0xFB, 0xDE, 0x61, +0xDB, 0x91, 0x4, 0xD2, 0x9D, 0x93, 0x30, 0xB, 0x2E, 0x4, 0x8A, 0x8B, 0x83, 0x13, 0xD7, 0x81, +0x89, 0x3A, 0xF0, 0x8D, 0x97, 0x8C, 0x91, 0x3A, 0xEA, 0x73, 0xC, 0xE0, 0x5F, 0xB, 0x3C, 0x4F, +0xA7, 0xC8, 0xD5, 0x12, 0xA0, 0x87, 0xD5, 0x20, 0x93, 0xB6, 0x41, 0x8A, 0x4B, 0x1E, 0xDD, 0xD0, +0x6C, 0xB7, 0xFE, 0x21, 0x11, 0x4A, 0xB1, 0x4B, 0xE4, 0x39, 0x9B, 0xB3, 0x38, 0x71, 0x9E, 0x9F, +0x24, 0x99, 0x67, 0xF0, 0x5, 0x31, 0x75, 0xEA, 0x22, 0x5A, 0x56, 0x99, 0x34, 0x5F, 0xCE, 0x53, +0x54, 0xE6, 0xED, 0x12, 0xFF, 0xB1, 0xE2, 0x89, 0xCE, 0xEB, 0x29, 0x45, 0xF4, 0xD3, 0x24, 0xC0, +0xD1, 0xE1, 0x12, 0x2D, 0x9A, 0x1B, 0x42, 0xDB, 0xE3, 0x88, 0x86, 0xC0, 0xC6, 0xB8, 0x37, 0x9C, +0xC0, 0x17, 0xC5, 0xAA, 0x7C, 0x5C, 0x1D, 0xFD, 0xF0, 0xF4, 0xE8, 0x74, 0x42, 0x68, 0x64, 0xC8, +0x55, 0xFC, 0x6F, 0xB, 0x88, 0xFA, 0xC8, 0xE9, 0x36, 0xA5, 0xAB, 0xDE, 0x87, 0xD6, 0x4C, 0xF2, +0x48, 0x4E, 0x32, 0x58, 0x81, 0x29, 0x89, 0x4A, 0xBA, 0xF0, 0xE0, 0x8D, 0x73, 0x44, 0x4D, 0x6C, +0xD5, 0xA2, 0xB8, 0x49, 0xE3, 0x7A, 0xE8, 0x92, 0xD6, 0xA, 0x53, 0x9A, 0x7B, 0x23, 0x82, 0xA2, +0x68, 0xC8, 0xE1, 0x23, 0xFC, 0x38, 0xAD, 0xD7, 0x5C, 0xA, 0x20, 0x5A, 0x77, 0x77, 0xBB, 0x2, +0x3, 0x33, 0xC1, 0xF8, 0x9, 0x3F, 0xC0, 0xAB, 0xCE, 0x1F, 0x2E, 0x5B, 0x68, 0xBA, 0x87, 0x95, +0xA2, 0x6F, 0x34, 0xA8, 0x37, 0x10, 0x4B, 0x66, 0xF, 0x4C, 0x4F, 0xE4, 0x2, 0xB6, 0x2D, 0x5A, +0x33, 0x72, 0xD0, 0x73, 0x29, 0x5B, 0xF8, 0x50, 0x88, 0x19, 0x59, 0x6A, 0xDE, 0x39, 0x1D, 0xB1, +0xFE, 0xBB, 0x9E, 0x3E, 0x2B, 0xB5, 0x9C, 0xDA, 0xDC, 0x5C, 0xC1, 0x0, 0xA7, 0x3C, 0x7D, 0x47, +0xD4, 0x77, 0x85, 0x96, 0x36, 0x51, 0xFE, 0x4A, 0x38, 0xE0, 0x6B, 0x7A, 0x94, 0x34, 0x3F, 0x78, +0x84, 0x1F, 0xA7, 0x2, 0x7, 0x7E, 0xED, 0x96, 0x8, 0xC1, 0xD, 0x5D, 0x79, 0x36, 0x5B, 0x6, +0xB7, 0x78, 0x20, 0x47, 0x83, 0xFF, 0xE2, 0xC6, 0x82, 0xDB, 0x2, 0x4B, 0x16, 0x53, 0x97, 0x81, +0x2A, 0xAD, 0xB1, 0x7E, 0xF4, 0x60, 0x77, 0xB7, 0x2D, 0xDC, 0xAC, 0x11, 0x66, 0x26, 0x4B, 0x74, +0x0, 0xB7, 0xF7, 0x52, 0x34, 0x23, 0xEF, 0x99, 0xDC, 0xB0, 0x1C, 0x4C, 0x74, 0xFB, 0x47, 0x76, +0xDA, 0x1D, 0xC, 0x50, 0x4C, 0xA8, 0xD3, 0xDD, 0xCD, 0x29, 0x76, 0x3B, 0x4C, 0xFC, 0x5B, 0xAC, +0xFC, 0xA5, 0xB5, 0x82, 0xBE, 0x91, 0xF7, 0xE5, 0xE6, 0x60, 0xB7, 0x4F, 0xD6, 0xA4, 0xE7, 0x8B, +0xD3, 0xF7, 0x38, 0x14, 0xBE, 0x7, 0xC5, 0xA9, 0x23, 0xEE, 0x7A, 0x18, 0xEE, 0x5, 0x7C, 0x1D, +0xDD, 0xB9, 0xA8, 0x76, 0x2C, 0xB3, 0x3C, 0x43, 0x77, 0x6B, 0xAA, 0x12, 0x15, 0x83, 0xE5, 0xC0, +0x63, 0x58, 0x56, 0xAD, 0xC0, 0xA5, 0x1, 0x77, 0x4, 0x38, 0xA7, 0x8F, 0x43, 0xF, 0xD7, 0xB8, +0x37, 0xA, 0xDC, 0xC8, 0x33, 0x2A, 0xB9, 0x6F, 0xBA, 0xF, 0xCA, 0x77, 0xD8, 0xEA, 0xF0, 0x54, +0xDA, 0x7D, 0x89, 0x63, 0x57, 0xE6, 0xA2, 0x2A, 0xF1, 0xD0, 0x1F, 0x80, 0xDF, 0x2F, 0x62, 0x7F, +0x5E, 0x20, 0x78, 0x75, 0x9B, 0x4, 0x22, 0x5D, 0xCC, 0x69, 0xF0, 0x9E, 0x5F, 0xBC, 0xBD, 0xF9, +0x9D, 0x4D, 0x5F, 0xC4, 0xAF, 0xE7, 0xF9, 0x51, 0x33, 0x2, 0x48, 0x9D, 0x74, 0x33, 0x23, 0xBD, +0x13, 0x88, 0xEB, 0x43, 0xDB, 0xD4, 0x60, 0xC, 0xAE, 0x53, 0xBC, 0xF, 0x4E, 0xD3, 0xA2, 0x90, +0x65, 0x44, 0x25, 0x35, 0xD, 0x95, 0x19, 0x9, 0xC4, 0x70, 0xFA, 0xE, 0xBD, 0xD3, 0x53, 0xEF, +0x7, 0x38, 0x7B, 0xD0, 0xA1, 0x3, 0xB9, 0x77, 0xD2, 0xC3, 0x0, 0x3E, 0xBA, 0xAC, 0x54, 0xD8, +0xEA, 0x61, 0xA0, 0x83, 0x20, 0xF6, 0xB6, 0x89, 0xBF, 0x9A, 0x91, 0x56, 0xFD, 0x79, 0x3A, 0xF3, +0xE3, 0x70, 0x7B, 0x96, 0x7C, 0x1C, 0xEE, 0x68, 0x19, 0x76, 0xFB, 0x23, 0xAD, 0x14, 0xCF, 0xFB, +0xA2, 0xFB, 0x33, 0xD9, 0xBD, 0xAB, 0x87, 0x6E, 0x16, 0xB7, 0x67, 0xA1, 0xB4, 0x8F, 0xAD, 0xF8, +0x3B, 0x6C, 0x58, 0xAB, 0xA2, 0x76, 0x4D, 0xD6, 0xF0, 0x69, 0x30, 0x3F, 0xA3, 0xA2, 0xC4, 0x56, +0xDD, 0xAD, 0xB5, 0x58, 0x4B, 0x3, 0xEB, 0xF6, 0xAC, 0xB0, 0xF0, 0xAD, 0xC7, 0x90, 0x1B, 0x18, +0x6, 0xEB, 0x57, 0xFE, 0xC0, 0xBD, 0xF2, 0xBC, 0x34, 0xA0, 0x8D, 0x15, 0xD3, 0x55, 0x59, 0xA6, +0xDA, 0x3A, 0x71, 0x60, 0x73, 0xE5, 0x79, 0x13, 0x5F, 0x77, 0x5A, 0x76, 0xBE, 0xEA, 0xCF, 0x4E, +0x27, 0xA2, 0x63, 0x93, 0x33, 0x6B, 0x68, 0x3C, 0x74, 0xD2, 0x28, 0xCA, 0x42, 0x7A, 0xD2, 0xF8, +0x8E, 0x3, 0x4F, 0x5E, 0xA3, 0x16, 0xE3, 0x63, 0xF2, 0xFC, 0x8A, 0xE1, 0x49, 0xEA, 0xF9, 0x30, +0x7C, 0xB3, 0x19, 0xD5, 0x97, 0x20, 0x9A, 0x2C, 0xB, 0x33, 0x8C, 0x69, 0x88, 0x21, 0xCC, 0x69, +0xBC, 0xBB, 0xF3, 0x34, 0x8E, 0x9C, 0xD3, 0x60, 0x61, 0x54, 0xF6, 0x9C, 0xC4, 0x73, 0x80, 0x1A, +0xF4, 0x51, 0x5F, 0x93, 0xBA, 0xE7, 0x77, 0xA6, 0xEE, 0xD8, 0x49, 0x1D, 0x92, 0x4A, 0x14, 0x52, +0xEA, 0x49, 0xE0, 0x5B, 0x1, 0x6D, 0xD0, 0x28, 0x31, 0x98, 0x64, 0xBE, 0xAD, 0xC8, 0xF4, 0x36, +0xA5, 0xF3, 0xA1, 0x93, 0x4E, 0xCA, 0x92, 0xF6, 0x24, 0x92, 0x82, 0x7E, 0x14, 0x3B, 0x32, 0xA8, +0xB4, 0x8B, 0x2F, 0x2A, 0x4A, 0xCF, 0x37, 0xA0, 0x54, 0x10, 0x2A, 0x89, 0x6B, 0xA1, 0xC6, 0xE9, +0xC1, 0xB9, 0x6D, 0x83, 0x53, 0xEB, 0x31, 0xE5, 0xD7, 0xFE, 0x65, 0x8E, 0x42, 0x42, 0x7F, 0x35, +0x8B, 0x53, 0x86, 0x10, 0x93, 0xFD, 0xFC, 0x59, 0x84, 0xD, 0xD2, 0xA7, 0x62, 0x11, 0x86, 0x8C, +0x6F, 0xE9, 0xAD, 0x96, 0x88, 0x86, 0x21, 0x12, 0x85, 0xA9, 0x2E, 0xF6, 0xBC, 0x6B, 0xEC, 0xF2, +0xD5, 0x86, 0x9F, 0x2C, 0xFC, 0xB8, 0x5C, 0x21, 0x46, 0xC7, 0xCA, 0x6B, 0xBF, 0x30, 0x20, 0xA9, +0x6B, 0x73, 0x86, 0xEA, 0xB0, 0xD4, 0xEA, 0x70, 0xF1, 0x4D, 0x2B, 0x6C, 0x3B, 0x26, 0x19, 0x38, +0x70, 0x5A, 0xA3, 0x73, 0x6F, 0x8B, 0xEB, 0x2B, 0x90, 0xD4, 0xDB, 0x1D, 0x79, 0x1E, 0xAB, 0x69, +0x21, 0xF6, 0xB4, 0xC3, 0x9D, 0xD, 0x8F, 0x14, 0x9D, 0xD8, 0x14, 0x45, 0x6A, 0x63, 0xA7, 0x63, +0x44, 0x1F, 0x7, 0x97, 0x7B, 0x46, 0x88, 0x6, 0x81, 0xDB, 0x1, 0x7B, 0x12, 0xC7, 0xA3, 0x1, +0xB6, 0xA0, 0x1, 0x42, 0xF1, 0x61, 0xB6, 0xD3, 0x7B, 0x73, 0x71, 0xA3, 0xD0, 0x29, 0x6D, 0x2D, +0xDA, 0x68, 0x43, 0x90, 0x18, 0x8, 0x1A, 0x47, 0x12, 0x57, 0x97, 0xC2, 0xE8, 0x72, 0xD4, 0xA3, +0x4B, 0x10, 0x18, 0x5D, 0x8E, 0xA9, 0x8B, 0xD1, 0x7, 0xAD, 0x67, 0xDE, 0xF, 0x96, 0xB7, 0xAE, +0x3C, 0xB3, 0x5D, 0xC3, 0x91, 0xD7, 0xE4, 0x5F, 0x87, 0x50, 0x87, 0x3, 0x7D, 0x8B, 0x5B, 0xD1, +0xEE, 0x26, 0x6D, 0x8A, 0x5D, 0x68, 0xA5, 0x70, 0x54, 0x75, 0xCF, 0x86, 0x67, 0xA9, 0x30, 0x6B, +0x80, 0x55, 0xAC, 0x5A, 0x8F, 0xBE, 0xE8, 0x41, 0x5A, 0x1E, 0x76, 0xD9, 0xD9, 0x3C, 0x17, 0x86, +0xA8, 0xA6, 0x2A, 0x2C, 0xAE, 0x62, 0x96, 0xD5, 0x60, 0xFF, 0xA2, 0x1C, 0x9E, 0xD0, 0xD1, 0x6F, +0x1A, 0x15, 0x7F, 0xA, 0xA, 0x37, 0x88, 0x8C, 0x4F, 0x87, 0xF7, 0x98, 0x51, 0x75, 0x8C, 0xFD, +0x77, 0x4, 0x77, 0xC5, 0xE9, 0xA5, 0x2D, 0x68, 0x6B, 0xD5, 0x7E, 0x5B, 0xB1, 0x59, 0x23, 0xFB, +0x4A, 0xF4, 0xF2, 0xB5, 0x3A, 0xF1, 0x86, 0xBB, 0x40, 0x25, 0x4D, 0x85, 0xD5, 0xC5, 0xF0, 0xE5, +0x4F, 0x4E, 0x9E, 0x22, 0xCB, 0x3D, 0xE7, 0xD9, 0x2E, 0x1C, 0xE7, 0xD2, 0x3A, 0xCE, 0xC6, 0x77, +0xB5, 0x1A, 0x89, 0xF7, 0x18, 0xE1, 0x22, 0x11, 0x81, 0x15, 0x7, 0x9C, 0x96, 0xF8, 0xAB, 0x3A, +0x9A, 0x38, 0x12, 0x40, 0xC5, 0xD3, 0xDB, 0x73, 0x52, 0x90, 0x5F, 0x61, 0xF3, 0x47, 0xC3, 0x69, +0x35, 0xAE, 0x9D, 0x7B, 0xE7, 0x51, 0x8, 0x2D, 0x2, 0x11, 0x54, 0x61, 0xA9, 0x96, 0x20, 0x44, +0xF0, 0x21, 0xFA, 0x4B, 0x9E, 0x2E, 0x6B, 0xAC, 0xE7, 0x34, 0x9B, 0xEA, 0x38, 0xD6, 0x5D, 0x52, +0xE6, 0xE6, 0xCC, 0x73, 0x1C, 0xB0, 0x7D, 0xD2, 0xCB, 0x19, 0xF8, 0xDA, 0xC5, 0x97, 0xA3, 0x9A, +0x2F, 0x87, 0x5D, 0x7C, 0x9, 0xBB, 0x12, 0x63, 0x34, 0x88, 0x1D, 0x5F, 0xD, 0x3B, 0x4F, 0xA7, +0xF6, 0x49, 0x39, 0xE2, 0x85, 0xB5, 0xF0, 0x1F, 0xBA, 0x68, 0x3D, 0xAE, 0x69, 0x3D, 0x6A, 0xA3, +0xB5, 0xA2, 0x91, 0x63, 0xD3, 0xCE, 0xBB, 0xEE, 0x91, 0x5F, 0x18, 0x97, 0x7, 0xBA, 0x6, 0x7F, +0x58, 0xF, 0x7E, 0xDC, 0x36, 0x78, 0xF3, 0x2A, 0x82, 0x0, 0x6F, 0x1B, 0x1D, 0x4B, 0x8D, 0x9A, +0x84, 0xC4, 0xBB, 0xF4, 0x93, 0xC4, 0x8A, 0x11, 0xC0, 0xC2, 0x2D, 0x52, 0xD4, 0x20, 0x40, 0x81, +0x51, 0x1A, 0xBC, 0xD5, 0x99, 0x44, 0xDF, 0xC4, 0x70, 0xCE, 0xA, 0x51, 0x85, 0x0, 0xCF, 0x8C, +0x9B, 0xA9, 0xCA, 0x28, 0x38, 0x53, 0x8E, 0x5F, 0x91, 0xCC, 0x36, 0xCE, 0xA6, 0xAA, 0xA4, 0x59, +0xD, 0x26, 0x2A, 0x7A, 0xA1, 0xF9, 0xA2, 0x3E, 0x66, 0xBC, 0xC8, 0xD9, 0x8C, 0xA7, 0x35, 0x64, +0xB2, 0x7F, 0xD0, 0x95, 0xEC, 0x7, 0xCC, 0x99, 0xC2, 0x4E, 0x45, 0x41, 0x3C, 0xC0, 0x2A, 0x7, +0xD8, 0x84, 0xC2, 0xA5, 0x7F, 0xC9, 0xD8, 0x32, 0x2B, 0x6F, 0x9D, 0x24, 0x56, 0xBB, 0xC9, 0xDB, +0x98, 0xF9, 0x70, 0x2D, 0x68, 0xD7, 0x1A, 0x7B, 0xE7, 0xBC, 0xE6, 0x97, 0xEF, 0x1B, 0xBC, 0xAB, +0x5D, 0xBA, 0x67, 0xD5, 0x68, 0xC, 0x88, 0x56, 0x51, 0x27, 0x8C, 0x2E, 0x15, 0xB1, 0x35, 0xAB, +0x31, 0x9F, 0x9, 0x9E, 0x10, 0x96, 0xCD, 0x32, 0xDD, 0xBA, 0xD7, 0xBF, 0x1, 0xE9, 0x94, 0x2E, +0x96, 0x5D, 0x25, 0xD5, 0xD5, 0x8E, 0x20, 0x9B, 0xD7, 0xD5, 0x90, 0xD4, 0x60, 0xB5, 0xC5, 0x17, +0x85, 0xCE, 0x3, 0xAA, 0x4D, 0x1A, 0x34, 0xA0, 0xBE, 0x69, 0x95, 0x2B, 0xE6, 0x1, 0x59, 0x3, +0xC2, 0xBA, 0x38, 0xDE, 0xF2, 0xA2, 0xE4, 0xCD, 0xA2, 0x88, 0xC, 0x1C, 0x55, 0x9A, 0xD3, 0x2, +0x19, 0x37, 0x8D, 0x4C, 0xB3, 0x56, 0x21, 0x14, 0xBF, 0x98, 0x2E, 0x5B, 0xB4, 0xD, 0x97, 0xCD, +0x89, 0x64, 0x67, 0x3, 0x2C, 0x25, 0x61, 0xA9, 0xD6, 0xB4, 0x99, 0xB8, 0x23, 0xEF, 0xAB, 0x59, +0x87, 0xFE, 0x4E, 0x68, 0xB3, 0xFC, 0x76, 0x4E, 0x85, 0xF5, 0x37, 0xE5, 0xCA, 0x8F, 0x5F, 0xE4, +0xFE, 0x9C, 0x17, 0xA8, 0x8B, 0xA1, 0x6C, 0x2B, 0xAD, 0x90, 0x4C, 0xD3, 0xF0, 0xD6, 0xA8, 0x34, +0xA7, 0x51, 0x6C, 0x8F, 0xD3, 0xDA, 0xB4, 0xB5, 0x45, 0x86, 0xB2, 0xBE, 0x93, 0xD2, 0xF0, 0xB, +0x56, 0x6, 0x9E, 0xDD, 0x50, 0xD6, 0xF6, 0xEF, 0x53, 0x39, 0xDC, 0x70, 0xA7, 0x19, 0x4A, 0xF3, +0x63, 0xAA, 0x5A, 0x98, 0xA1, 0xD2, 0x6C, 0x51, 0x4E, 0x31, 0x2D, 0x3A, 0x1B, 0xFD, 0xDF, 0xFF, +0x1A, 0xA7, 0x28, 0xC4, 0x5A, 0x79, 0x6A, 0x69, 0x95, 0x3, 0xBA, 0xF0, 0x9E, 0xBE, 0x7A, 0xF3, +0x94, 0x24, 0x87, 0x87, 0x55, 0x23, 0xA, 0x2B, 0x70, 0xB, 0x4A, 0xE, 0x7, 0x4A, 0x48, 0xE8, +0xF2, 0xC7, 0x75, 0xC4, 0xF8, 0xC5, 0x97, 0x55, 0x81, 0x70, 0xC3, 0x92, 0x17, 0xEA, 0xC1, 0x8E, +0x60, 0x1C, 0x80, 0xA, 0x4B, 0xEA, 0x2D, 0x57, 0x5, 0xF9, 0x83, 0x5E, 0x53, 0xA, 0x24, 0xC1, +0x3A, 0x6B, 0x21, 0xF9, 0xF9, 0xED, 0x85, 0x30, 0x98, 0x48, 0x84, 0xFC, 0x43, 0xAE, 0x6B, 0x24, +0xAA, 0x53, 0xC6, 0xC6, 0x25, 0x6, 0x57, 0xF5, 0x6E, 0x8, 0xE6, 0xCF, 0xF9, 0x65, 0xB5, 0xCD, +0x50, 0xF2, 0xCD, 0xCB, 0x85, 0x50, 0x49, 0xEA, 0xF0, 0x1F, 0x54, 0x1D, 0xD1, 0x43, 0x5E, 0xB9, +0x12, 0xA4, 0x21, 0x6B, 0x27, 0x81, 0xA3, 0x74, 0x85, 0x30, 0x37, 0x59, 0x5E, 0xB8, 0x30, 0x7E, +0x5E, 0x16, 0xBF, 0x23, 0xEC, 0x3A, 0x1A, 0x44, 0x4B, 0x7F, 0xCE, 0x70, 0xF0, 0x6C, 0x3B, 0xBE, +0xF2, 0xE7, 0xD2, 0xC8, 0xBC, 0xA4, 0xDF, 0x5D, 0x45, 0xA4, 0x1C, 0x48, 0x5E, 0x91, 0xF8, 0xED, +0xDD, 0x2B, 0x29, 0xD7, 0x6F, 0xA6, 0x9F, 0x40, 0x35, 0xBE, 0x8F, 0x1C, 0x76, 0xC8, 0x81, 0x45, +0x52, 0x69, 0x48, 0x36, 0xC7, 0xEC, 0x80, 0xA5, 0xFD, 0xE0, 0x19, 0x2D, 0x18, 0x55, 0x3D, 0x8F, +0x88, 0x69, 0x7D, 0xF, 0x99, 0x6A, 0x14, 0xE1, 0xC7, 0x21, 0x9C, 0x5D, 0xB2, 0x8B, 0xC, 0xFA, +0x4C, 0x26, 0x5, 0x74, 0x3A, 0xCE, 0xE9, 0xE2, 0xC6, 0xE, 0x19, 0x31, 0x2E, 0x1D, 0xBC, 0xF8, +0x14, 0x1A, 0xFF, 0x4E, 0x30, 0xD7, 0x41, 0x9C, 0x0, 0x1D, 0xFB, 0x61, 0x48, 0xC1, 0xB5, 0xF2, +0x15, 0xF9, 0x8, 0x74, 0x80, 0x1A, 0xF2, 0x6A, 0x29, 0x38, 0xA2, 0x7B, 0xA8, 0xDE, 0xDE, 0xF1, +0xCE, 0x1E, 0xB7, 0x9C, 0xCF, 0x15, 0x89, 0x64, 0x15, 0xCE, 0x2B, 0x41, 0xE7, 0xC, 0x96, 0xAE, +0x1C, 0xB1, 0x11, 0x55, 0x8F, 0xEE, 0xD4, 0x17, 0xF4, 0xF5, 0x77, 0x2C, 0x30, 0x4B, 0x50, 0x81, +0x1A, 0x15, 0x9E, 0xC2, 0x70, 0x85, 0x2C, 0x8A, 0xD0, 0xDA, 0x68, 0xEE, 0x3D, 0xB9, 0xF8, 0xF3, +0xD7, 0xF3, 0xEF, 0x9C, 0xDD, 0xD7, 0xB2, 0x96, 0xB3, 0xB7, 0x7D, 0xDA, 0xF4, 0xE3, 0x49, 0x41, +0x8A, 0xDE, 0x63, 0xDD, 0xAD, 0x60, 0x8F, 0xA1, 0x1C, 0x76, 0xC6, 0xCC, 0x79, 0x40, 0xED, 0x3A, +0xA4, 0x8A, 0x1, 0xF8, 0xFF, 0x8E, 0x9D, 0xAE, 0xF3, 0xAC, 0xA8, 0x43, 0x6A, 0x7, 0xBF, 0xFE, +0x4E, 0x8F, 0x44, 0x60, 0xFB, 0x3C, 0xC6, 0xA9, 0x51, 0x1B, 0xE4, 0x5E, 0x8B, 0xA3, 0xAA, 0x48, +0xE8, 0x86, 0xCE, 0x6, 0xF5, 0x4B, 0x73, 0xDB, 0xD7, 0xA0, 0xD6, 0x75, 0x8E, 0x86, 0x84, 0xF9, +0x76, 0xFE, 0x83, 0x5D, 0x57, 0xA4, 0x3F, 0x73, 0x47, 0x40, 0xEC, 0x88, 0x5C, 0xD, 0xB5, 0x41, +0xA, 0xB2, 0xBA, 0x3E, 0x6E, 0xA0, 0x5E, 0x73, 0x4F, 0xA7, 0xEE, 0x24, 0x46, 0x52, 0xE1, 0xF, +0xE1, 0x95, 0x5, 0x97, 0xEE, 0x31, 0xAC, 0x14, 0x22, 0x8F, 0x7F, 0x7B, 0xA6, 0x3B, 0xBD, 0xD6, +0xFB, 0x68, 0x14, 0x49, 0xC2, 0x3E, 0xDB, 0xCA, 0x44, 0x7D, 0x24, 0x61, 0xB, 0x16, 0xCD, 0x17, +0x64, 0x7A, 0x46, 0xF2, 0xC, 0x20, 0x8, 0x10, 0xAD, 0x48, 0x85, 0x1F, 0x1D, 0x70, 0x79, 0xCF, +0x6E, 0x1C, 0x14, 0x2B, 0xFB, 0x1A, 0x85, 0xBC, 0x9A, 0xC4, 0xC0, 0xF0, 0x3B, 0x6F, 0x4, 0x82, +0x1F, 0x34, 0x4, 0xF7, 0xAC, 0xEA, 0xB5, 0x44, 0x76, 0xEA, 0x79, 0x5, 0x76, 0x27, 0x25, 0xA7, +0xDE, 0x9D, 0x1A, 0xAE, 0xD0, 0xDF, 0xAB, 0x7A, 0x17, 0x57, 0x2C, 0x6C, 0xA8, 0x76, 0x8B, 0x53, +0x64, 0x97, 0xDD, 0xD3, 0x8A, 0xC3, 0x3, 0xE0, 0xD7, 0x90, 0x5, 0x29, 0x74, 0xB4, 0x2D, 0x67, +0xFB, 0x3F, 0xED, 0x89, 0xEB, 0xC8, 0x21, 0xA2, 0xE8, 0x70, 0x42, 0x70, 0x98, 0x4D, 0xF3, 0xCB, +0xB1, 0x82, 0xA8, 0x31, 0xAF, 0x50, 0x28, 0x11, 0xF8, 0x19, 0x43, 0x89, 0x47, 0x80, 0xAD, 0xE1, +0xB7, 0x77, 0x2F, 0x29, 0x85, 0x90, 0x26, 0xE4, 0xB5, 0x4A, 0x28, 0xF2, 0x1F, 0x2B, 0x9A, 0xBA, +0x2C, 0x7, 0x7, 0xAA, 0xB9, 0xBF, 0xF9, 0xF5, 0x12, 0xCD, 0xF1, 0xAE, 0x6, 0x9C, 0x52, 0x50, +0xC6, 0xE7, 0xC5, 0x6B, 0xC3, 0x7D, 0xFA, 0x5C, 0x2F, 0x60, 0x38, 0xAE, 0x58, 0x2E, 0xEF, 0x72, +0x8A, 0xE5, 0x28, 0x25, 0x19, 0xD2, 0x43, 0x42, 0x1E, 0x44, 0x78, 0x48, 0x74, 0x3C, 0xA2, 0x73, +0xC1, 0x12, 0xBB, 0x6B, 0x84, 0x3C, 0x73, 0x39, 0xA1, 0x3B, 0x19, 0xFB, 0x54, 0xF4, 0xFC, 0xA8, +0x42, 0xCD, 0xD7, 0x5B, 0x7D, 0x31, 0xC7, 0xE, 0xB9, 0x1A, 0xEB, 0x39, 0x57, 0x10, 0x41, 0xA4, +0x56, 0x64, 0x81, 0xFC, 0x8F, 0xF9, 0xC7, 0x64, 0xA8, 0x83, 0xA8, 0xD1, 0x29, 0x59, 0x91, 0x16, +0x11, 0xAD, 0xF2, 0x89, 0xA7, 0xD, 0xCC, 0x2F, 0x90, 0xF, 0xC4, 0x45, 0x31, 0x7E, 0xFC, 0x7C, +0x54, 0x4D, 0xFD, 0x6C, 0xA0, 0x33, 0x82, 0xB0, 0xF3, 0x86, 0xF6, 0x31, 0x68, 0x86, 0x27, 0x1E, +0xBF, 0xE7, 0xA, 0xAB, 0x13, 0x25, 0x6E, 0x68, 0x67, 0xAB, 0x92, 0x2, 0x57, 0x87, 0xE6, 0x2C, +0xF7, 0xF7, 0x25, 0x10, 0x9, 0x10, 0xFD, 0xA, 0x2A, 0x6F, 0x20, 0x5C, 0x62, 0x1A, 0xF0, 0xF9, +0x45, 0xC8, 0x97, 0xA2, 0x61, 0x3F, 0x1D, 0xFD, 0xF8, 0x23, 0x2, 0x62, 0x17, 0x2C, 0xC7, 0x3A, +0x69, 0x44, 0x48, 0xD6, 0xD2, 0x1, 0xE4, 0x93, 0x7F, 0x53, 0xCB, 0x66, 0x98, 0xAE, 0x59, 0x46, +0x11, 0xA, 0xC2, 0x42, 0xF2, 0xA3, 0x92, 0x19, 0x9E, 0xFC, 0xA6, 0xFB, 0x94, 0x7B, 0xC3, 0x68, +0xD9, 0x8B, 0x5C, 0x3B, 0x44, 0x2, 0x55, 0xDB, 0x68, 0xE7, 0x72, 0x57, 0xE2, 0xAC, 0xBB, 0xE0, +0xA1, 0x71, 0xAA, 0xD5, 0x7E, 0x6A, 0xEA, 0x4, 0xEB, 0x46, 0x9C, 0xDE, 0xC8, 0x8C, 0xF9, 0x53, +0x98, 0x31, 0xAB, 0x74, 0xBB, 0x85, 0x2F, 0xFD, 0xF8, 0xB1, 0x9, 0x1F, 0x5C, 0xC1, 0x32, 0x5A, +0x6A, 0x21, 0x9C, 0x21, 0x90, 0xAA, 0x6A, 0x3D, 0x92, 0xBE, 0x45, 0x9C, 0xF1, 0xFB, 0x67, 0x9E, +0x30, 0xB, 0x88, 0x55, 0xF2, 0xEB, 0x46, 0x2, 0xB8, 0xE0, 0x1D, 0xDD, 0x57, 0x2B, 0xE8, 0xC6, +0x51, 0x5F, 0x7E, 0x8, 0x6C, 0x64, 0xEF, 0xB8, 0x71, 0x47, 0x3E, 0xA9, 0x20, 0xA4, 0x8A, 0x43, +0x6, 0x65, 0x5A, 0x5, 0x6C, 0x9F, 0xBB, 0x44, 0xED, 0xC4, 0xA9, 0x25, 0x74, 0x5D, 0x42, 0x6D, +0xEE, 0x96, 0x9B, 0xA9, 0x8E, 0x15, 0x81, 0xE0, 0x92, 0x82, 0x5E, 0x2B, 0xFD, 0xBE, 0xEE, 0x3D, +0xAB, 0x17, 0xC1, 0x9A, 0x6C, 0xEB, 0x25, 0xF4, 0xEA, 0x63, 0x64, 0x39, 0x8, 0xB, 0x5F, 0xE7, +0x61, 0x67, 0xCE, 0xB1, 0x29, 0x31, 0x6E, 0x87, 0xE4, 0xAB, 0xF6, 0x39, 0x33, 0x8, 0xA9, 0xDC, +0x8D, 0xB1, 0x16, 0x74, 0xEA, 0x71, 0x43, 0xD2, 0xBE, 0xAE, 0x38, 0xAC, 0x37, 0x14, 0x90, 0x43, +0x3F, 0x24, 0x20, 0x16, 0x8E, 0xAC, 0x2C, 0xF2, 0xFF, 0x38, 0x22, 0x2C, 0x6E, 0x61, 0x45, 0x57, +0xF2, 0xA5, 0x1E, 0x25, 0xF6, 0x52, 0x7E, 0x53, 0x41, 0x1A, 0x71, 0xD4, 0x8D, 0xC0, 0xCD, 0x3D, +0x3E, 0xA2, 0xCB, 0xD4, 0x58, 0x5B, 0xE8, 0xD7, 0xD8, 0x3D, 0x54, 0xB8, 0x5A, 0x2E, 0x6F, 0x69, +0xD2, 0xE2, 0x17, 0xFB, 0xCA, 0x97, 0x76, 0xF1, 0x51, 0x2A, 0xE2, 0x1C, 0xE1, 0x20, 0x3F, 0xE, +0xF3, 0x34, 0x23, 0xC2, 0x28, 0xCC, 0xCE, 0x95, 0x50, 0xBE, 0x4D, 0x89, 0x48, 0x24, 0x71, 0xD8, +0x4F, 0x93, 0xF8, 0x76, 0x9F, 0x9E, 0xEE, 0x81, 0x64, 0xAF, 0x58, 0x44, 0x33, 0x2C, 0x2C, 0x47, +0x80, 0x9C, 0x4A, 0x52, 0xA0, 0x9E, 0x85, 0x32, 0x9D, 0xA2, 0x84, 0xAD, 0xD6, 0x6F, 0x62, 0x36, +0x52, 0x6D, 0x9F, 0x79, 0xAA, 0x6D, 0x81, 0x30, 0x56, 0x85, 0xF8, 0xE, 0xDA, 0x5A, 0x21, 0xAA, +0x84, 0x9F, 0xA4, 0xB0, 0x16, 0xB, 0xFB, 0x95, 0xC, 0x26, 0x61, 0x67, 0x2D, 0x33, 0x55, 0x9B, +0x96, 0x25, 0xC6, 0x1, 0xE, 0x6E, 0x39, 0x4A, 0xDF, 0xB0, 0x53, 0xFA, 0xF1, 0xA8, 0x6D, 0x36, +0xBA, 0x3D, 0x77, 0xC5, 0x41, 0xD4, 0xAB, 0x98, 0xBC, 0xB6, 0xD1, 0x3F, 0xE8, 0x44, 0x5A, 0x49, +0x2D, 0xF7, 0x21, 0xF2, 0xBD, 0xEC, 0x40, 0x35, 0x4, 0xF5, 0xAD, 0xEB, 0x4A, 0x4A, 0x49, 0x6E, +0x1D, 0xD7, 0xAD, 0xD, 0x85, 0xCB, 0x44, 0xF2, 0x53, 0xF4, 0x1E, 0x3A, 0x64, 0x5C, 0x7D, 0x74, +0xE2, 0xEC, 0x20, 0x41, 0xC3, 0x8A, 0x6E, 0xC6, 0xEE, 0xE6, 0x46, 0xB8, 0x41, 0x16, 0x5, 0x38, +0xC5, 0x65, 0x9E, 0x7C, 0xC4, 0xAE, 0xAA, 0xF4, 0x49, 0xD3, 0xD5, 0x6F, 0xCC, 0x9C, 0x93, 0x5B, +0xEC, 0x70, 0xC, 0x19, 0xE3, 0x89, 0x4A, 0xB1, 0x4B, 0xB5, 0x29, 0x1, 0xBB, 0x1A, 0x93, 0xBA, +0x28, 0xA6, 0xB, 0x94, 0x4D, 0x89, 0xDF, 0xDA, 0x60, 0xBD, 0xF4, 0x63, 0x3F, 0xB4, 0x8B, 0xAA, +0x97, 0xC8, 0xD7, 0x53, 0xF7, 0x6B, 0xA7, 0x6C, 0xE1, 0x5F, 0x45, 0x94, 0x31, 0x55, 0x4F, 0xF8, +0x32, 0xD1, 0x8B, 0xC1, 0xF0, 0x8C, 0x90, 0x90, 0x71, 0x63, 0xA1, 0x78, 0x99, 0x3, 0xE8, 0xCB, +0x4, 0xD8, 0x33, 0xD1, 0xBF, 0x72, 0xF7, 0xC5, 0x9B, 0xB, 0xC, 0xEA, 0xC7, 0xBC, 0x70, 0xC2, +0x76, 0xBA, 0xA4, 0x21, 0x73, 0xCE, 0xB4, 0x93, 0x37, 0xDC, 0xEE, 0xF0, 0xEC, 0x5E, 0xD, 0xDC, +0xA1, 0xF6, 0x70, 0x22, 0xBB, 0xF4, 0x89, 0x5E, 0x50, 0x71, 0xA0, 0xDF, 0xBF, 0x34, 0x16, 0xEE, +0x65, 0x82, 0x43, 0xB8, 0xB4, 0x85, 0x44, 0xC2, 0x58, 0x59, 0xB6, 0x86, 0xDA, 0x81, 0xA5, 0xBF, +0xA1, 0xE1, 0x99, 0x36, 0x17, 0x38, 0xBF, 0x18, 0x77, 0x46, 0xB1, 0x47, 0xAA, 0xBF, 0xB, 0xB8, +0xF0, 0xAB, 0x77, 0x29, 0x41, 0x1C, 0xB6, 0x1A, 0x77, 0x29, 0xB4, 0x64, 0xB5, 0xCD, 0x43, 0x3E, +0xE1, 0xAE, 0x4, 0xB6, 0x41, 0xF7, 0xF8, 0x68, 0xCC, 0x47, 0xF9, 0x40, 0x6A, 0x16, 0xD1, 0x56, +0xF3, 0x97, 0x50, 0x53, 0x1C, 0x9A, 0xF8, 0xCD, 0x4E, 0x7, 0x72, 0x4A, 0x7E, 0x5B, 0xCA, 0x78, +0x17, 0x1D, 0xF1, 0xE7, 0x6F, 0xE0, 0xE4, 0x37, 0xF5, 0xC4, 0xA9, 0x10, 0x38, 0x1E, 0xD0, 0xA, +0x7B, 0x9F, 0x61, 0x47, 0x87, 0x7F, 0xAF, 0x74, 0xF6, 0x9F, 0x83, 0xAE, 0xD1, 0x51, 0x91, 0x26, +0xBA, 0xD9, 0xD7, 0xBF, 0xF3, 0xA1, 0xD4, 0x7B, 0x0, 0xC7, 0xAB, 0x24, 0x43, 0xAA, 0x83, 0x3D, +0x49, 0x10, 0xD2, 0xE6, 0xE5, 0xE3, 0xBA, 0x3, 0x52, 0x83, 0xAD, 0x77, 0x5D, 0x1B, 0xA2, 0x55, +0x77, 0xBE, 0xF3, 0x8, 0x56, 0x78, 0x6B, 0x93, 0x15, 0x55, 0xE6, 0x5, 0x3F, 0x2D, 0x67, 0x1E, +0x2D, 0x86, 0x37, 0x8F, 0xEF, 0x9B, 0xA6, 0x7C, 0xEB, 0x38, 0xF4, 0x34, 0xBD, 0x51, 0xE8, 0xE9, +0xE2, 0x48, 0xF0, 0x7, 0xA9, 0x42, 0xFD, 0xE2, 0x99, 0xE0, 0x4F, 0xF3, 0x7B, 0x66, 0x3D, 0xCF, +0xF8, 0x73, 0x29, 0x40, 0xC0, 0x45, 0x67, 0xC7, 0x27, 0x25, 0x2A, 0xDE, 0xE0, 0xDA, 0xC0, 0x34, +0xA2, 0x78, 0x10, 0x6E, 0x65, 0x4E, 0x27, 0x7F, 0xB2, 0xD1, 0x6A, 0x9B, 0x22, 0x40, 0x5E, 0x6B, +0x45, 0x21, 0x7C, 0x8A, 0xE7, 0x8F, 0xE4, 0xFB, 0xAD, 0x38, 0xF, 0x15, 0x14, 0xA7, 0xA7, 0xA, +0x90, 0x50, 0x1F, 0x33, 0x69, 0x33, 0x34, 0x73, 0x4F, 0xFA, 0x3B, 0xF, 0x54, 0xC4, 0xC4, 0x72, +0x11, 0x54, 0x2, 0x0, 0x5, 0x99, 0xF8, 0x21, 0x3, 0x6E, 0x8F, 0xBD, 0x66, 0x14, 0xCE, 0xA1, +0xE4, 0x5A, 0x72, 0xA3, 0x8A, 0xDF, 0x39, 0xC2, 0x77, 0x13, 0xEF, 0xA8, 0x11, 0xBB, 0xFB, 0xD2, +0x41, 0x84, 0x88, 0xD9, 0x99, 0x34, 0xF0, 0xB6, 0x6E, 0x12, 0x54, 0xFC, 0xAF, 0x19, 0xFE, 0x6B, +0x27, 0x40, 0xE6, 0x4, 0x88, 0xAD, 0xAA, 0x30, 0xA4, 0x9D, 0xA9, 0x1C, 0x42, 0x67, 0x29, 0x6F, +0xD0, 0x89, 0xE2, 0xD, 0x8E, 0x64, 0xCC, 0x32, 0x85, 0xB2, 0x50, 0x6D, 0x2, 0xBD, 0x44, 0x83, +0x32, 0x62, 0x24, 0x6C, 0x55, 0x95, 0x86, 0xA2, 0x0, 0x7, 0xA0, 0xE8, 0x33, 0xCF, 0xFB, 0xB4, +0xD3, 0x40, 0x6F, 0x3B, 0xD3, 0x49, 0x90, 0x7D, 0x74, 0x22, 0x64, 0x53, 0x1F, 0x32, 0xDE, 0x71, +0xD0, 0x6, 0x21, 0xFC, 0x5D, 0x6D, 0xDD, 0x74, 0x70, 0x10, 0x43, 0xBC, 0x78, 0x1F, 0xE3, 0x2D, +0x1A, 0xBC, 0xC5, 0x41, 0x6, 0xAF, 0xFD, 0x5, 0x9, 0x1C, 0x40, 0xA0, 0x33, 0x48, 0x98, 0x92, +0xA3, 0x80, 0xA1, 0x8F, 0x60, 0x53, 0x11, 0xEA, 0xD3, 0x6C, 0xF1, 0x39, 0x7A, 0xE0, 0x99, 0xF0, +0xFB, 0xAB, 0xF7, 0xB7, 0xD5, 0x68, 0x46, 0x8E, 0xF1, 0x73, 0x46, 0x2F, 0x2, 0xEC, 0x4D, 0x82, +0xCE, 0x41, 0x67, 0xD7, 0x6E, 0x26, 0xD6, 0x52, 0xD0, 0xAF, 0xB3, 0x26, 0x8, 0xCA, 0xA, 0xB4, +0x45, 0x6B, 0xB8, 0x29, 0xE9, 0x88, 0x49, 0x48, 0x59, 0xA6, 0xBA, 0xA9, 0x12, 0x25, 0x63, 0xD, +0x3E, 0xD9, 0x6C, 0xD5, 0x58, 0x45, 0x8B, 0x4E, 0xEF, 0xB4, 0x6C, 0x4B, 0x6, 0x53, 0x1, 0xC2, +0xF0, 0x83, 0xB4, 0x5C, 0x7F, 0xE9, 0x87, 0x54, 0xEA, 0xB9, 0xF4, 0x6F, 0x3E, 0xAB, 0x0, 0x44, +0x97, 0x1F, 0x81, 0x11, 0xBA, 0xBC, 0x6, 0x92, 0x22, 0x80, 0x60, 0xEF, 0xA7, 0x32, 0x2A, 0xCD, +0x8, 0xEB, 0x1F, 0x1A, 0xEF, 0x73, 0xA4, 0x5F, 0xCC, 0x91, 0xEA, 0x8E, 0x73, 0xAD, 0x78, 0x37, +0x15, 0xB, 0x2F, 0x88, 0x49, 0x12, 0xD5, 0xCE, 0xF8, 0x33, 0x3F, 0xE4, 0xBA, 0x32, 0xC9, 0x54, +0xCC, 0x5, 0x5C, 0x8F, 0xF9, 0x4, 0x9C, 0x59, 0x69, 0xFA, 0xC8, 0xD9, 0x7D, 0x8E, 0xD6, 0x55, +0x26, 0xBB, 0x2A, 0xF0, 0x68, 0x8C, 0x36, 0x2, 0x69, 0x86, 0x92, 0x3A, 0xEF, 0xF4, 0x4C, 0x10, +0x61, 0xD1, 0x50, 0x2F, 0xB9, 0x84, 0x13, 0x60, 0x54, 0x9D, 0xDC, 0x62, 0xC9, 0xB0, 0xFA, 0x42, +0x1E, 0x1B, 0xCB, 0x5F, 0x89, 0x1B, 0xE5, 0x83, 0xEB, 0x61, 0x9A, 0xCA, 0xA6, 0x9E, 0x30, 0x87, +0xE7, 0x62, 0xEC, 0x79, 0x4C, 0xDA, 0xEB, 0x3F, 0x1E, 0x99, 0x7B, 0x9F, 0x6A, 0xFF, 0xB3, 0x6E, +0xAF, 0xC4, 0xAA, 0xC5, 0x28, 0xAD, 0x32, 0x28, 0x4, 0x4E, 0xE7, 0x96, 0x3A, 0xAC, 0xEB, 0x46, +0x1A, 0x86, 0x8E, 0xE4, 0xE9, 0x55, 0x16, 0xC4, 0x9C, 0x75, 0xD8, 0x98, 0x70, 0xD7, 0xB4, 0xF8, +0x56, 0x8F, 0xB9, 0xED, 0xBB, 0xE6, 0xC6, 0xF7, 0x7D, 0x4C, 0x70, 0xDF, 0x35, 0xC1, 0x4D, 0x19, +0x52, 0xAF, 0xAC, 0xB8, 0xD6, 0x4F, 0xD2, 0x30, 0x4E, 0x67, 0x33, 0xF8, 0xA, 0xEF, 0xD1, 0xB0, +0x8F, 0xD1, 0x78, 0x58, 0x26, 0xBB, 0x19, 0xBA, 0x3A, 0xC5, 0x6C, 0x56, 0x9A, 0xBD, 0x5E, 0x51, +0xB, 0xBA, 0xFD, 0x61, 0x76, 0xB3, 0xF9, 0x21, 0x79, 0x6C, 0x68, 0x7F, 0xC5, 0xE5, 0x76, 0x93, +0xB5, 0x6E, 0x7D, 0xDA, 0x7B, 0xB6, 0x2E, 0x51, 0x25, 0xA9, 0xE, 0x31, 0x15, 0xF, 0xFA, 0xAF, +0xDB, 0xDF, 0x25, 0x8E, 0xD, 0xD3, 0xDE, 0x53, 0x20, 0xC5, 0x6, 0xD2, 0x22, 0x92, 0xF9, 0x86, +0x93, 0xAB, 0x57, 0x5D, 0x79, 0x38, 0x80, 0x46, 0xA9, 0xA, 0x89, 0x29, 0x3D, 0x83, 0x61, 0x79, +0x4A, 0xB9, 0x10, 0xE8, 0xF1, 0x39, 0x9F, 0xE8, 0x3B, 0xD8, 0x6C, 0x54, 0x7C, 0x71, 0x19, 0x69, +0x17, 0xA1, 0xCA, 0x63, 0x13, 0xD8, 0xFE, 0x5C, 0x83, 0x8D, 0xC4, 0xD4, 0x46, 0xD6, 0xE2, 0x56, +0xB6, 0xBB, 0x66, 0x35, 0xE1, 0xEA, 0xF9, 0x46, 0xC4, 0x37, 0x11, 0x3B, 0x26, 0xB1, 0xE, 0xB3, +0x6B, 0x22, 0x5F, 0xDA, 0x74, 0x45, 0xA, 0xE2, 0x1D, 0xB5, 0xA5, 0x5D, 0x7C, 0xD6, 0xEA, 0x8B, +0x25, 0x41, 0x3D, 0x5E, 0xEE, 0xD2, 0xEF, 0x4C, 0x5C, 0xDF, 0xF, 0x74, 0x65, 0x75, 0x67, 0x39, +0x6D, 0xAD, 0xF6, 0x7B, 0x8B, 0x65, 0x48, 0x57, 0x3C, 0xCB, 0x23, 0xEB, 0x6, 0x8B, 0xA3, 0x2A, +0x91, 0x5E, 0x12, 0x10, 0x46, 0x3E, 0x1D, 0xAF, 0xEB, 0x1, 0x51, 0x4E, 0x86, 0xC8, 0x69, 0xFD, +0xDD, 0x4F, 0xFC, 0xF8, 0x16, 0x5E, 0x16, 0x7A, 0xE7, 0xD1, 0x9E, 0xF1, 0x56, 0x64, 0x13, 0xE3, +0x6, 0x27, 0x7E, 0x63, 0xB0, 0x3A, 0xD2, 0x2B, 0x67, 0xD8, 0x5E, 0xA7, 0x2E, 0x7, 0x1B, 0xC8, +0x6C, 0x35, 0xCD, 0x53, 0xF6, 0xBD, 0xDB, 0xF0, 0x6A, 0x6E, 0xD, 0x12, 0x54, 0x34, 0x54, 0x6, +0x40, 0x7A, 0x53, 0xD4, 0x19, 0x5F, 0x93, 0x9C, 0x43, 0x0, 0x43, 0xA5, 0x51, 0xD6, 0x54, 0x1E, +0x83, 0x50, 0xBB, 0x94, 0xA0, 0xF, 0x9F, 0x7B, 0xB2, 0x41, 0xBB, 0xBC, 0xD9, 0x2D, 0x63, 0xFA, +0xFB, 0xC5, 0xFB, 0xC9, 0x98, 0x56, 0x44, 0xDF, 0x14, 0xB5, 0x7A, 0x5C, 0x21, 0x6A, 0xF5, 0x77, +0x5B, 0xD4, 0xB4, 0x4B, 0xA9, 0x5F, 0x25, 0x6F, 0xE6, 0x88, 0xFD, 0xE5, 0x4D, 0xBE, 0x2B, 0xDD, +0x29, 0x6E, 0x9D, 0x1D, 0xE5, 0xCB, 0xD2, 0xBF, 0x52, 0x4E, 0x9B, 0x8C, 0xF9, 0xA, 0x39, 0xED, +0x2D, 0xA5, 0x82, 0xE9, 0x1B, 0x48, 0x29, 0xC8, 0x54, 0x52, 0x2A, 0xE7, 0xCD, 0x8B, 0x61, 0xC0, +0x3C, 0xDE, 0x26, 0x99, 0x78, 0x8F, 0x82, 0xAB, 0x2E, 0xF, 0x2C, 0xE7, 0x39, 0xC8, 0xAB, 0x78, +0xA3, 0xF3, 0x84, 0xBF, 0x66, 0xBF, 0x68, 0xBD, 0xB, 0xF4, 0xDE, 0x9F, 0x8B, 0x9B, 0x40, 0xFC, +0xC5, 0x8E, 0xEA, 0x9C, 0x44, 0x1D, 0xD5, 0x7A, 0xC9, 0xD7, 0x1B, 0xB8, 0x8E, 0x47, 0x2, 0x77, +0xDB, 0x9, 0x89, 0x1F, 0xF6, 0x39, 0x4, 0x5, 0x47, 0xC5, 0x3B, 0xC4, 0x91, 0x62, 0x18, 0xF2, +0xB6, 0x21, 0xDD, 0x41, 0xA9, 0x9F, 0xCA, 0x97, 0xC8, 0x35, 0xB, 0xDF, 0x5, 0xD, 0x35, 0xA0, +0x56, 0x9B, 0xD3, 0xD8, 0x6, 0x69, 0x40, 0xD1, 0x83, 0xBF, 0xA7, 0x4A, 0x7B, 0x63, 0xDD, 0x57, +0x5F, 0xD2, 0x0, 0x9B, 0xC3, 0x38, 0x7E, 0xB0, 0x44, 0x51, 0xF, 0x87, 0x16, 0xC3, 0xD0, 0x63, +0xAC, 0x37, 0xCF, 0xDA, 0x3D, 0x10, 0x69, 0x48, 0xEB, 0x5A, 0xC4, 0xE6, 0x11, 0x43, 0x6D, 0x49, +0xAB, 0x75, 0xD4, 0x4C, 0xC6, 0xC1, 0x5E, 0xCB, 0xA2, 0xEF, 0x39, 0xFF, 0x66, 0x4, 0xED, 0x52, +0xB2, 0x41, 0x98, 0x23, 0x79, 0x37, 0xE3, 0x7E, 0xC4, 0x4F, 0xA3, 0x8B, 0xCC, 0x49, 0x80, 0x3, +0xEC, 0x9E, 0x97, 0x5E, 0x8A, 0x9F, 0xE2, 0x1, 0xCF, 0x5E, 0xEC, 0x89, 0x0, 0x3, 0x91, 0xD8, +0x54, 0x5A, 0x1, 0xD7, 0xA5, 0xB2, 0xD0, 0xBE, 0x65, 0x56, 0x95, 0xE2, 0xC9, 0xCB, 0x7A, 0x14, +0xD8, 0xEE, 0xE8, 0x23, 0x20, 0x8C, 0x52, 0x4D, 0xF9, 0x9E, 0x8F, 0xD6, 0x2E, 0x42, 0x4A, 0x88, +0x44, 0x35, 0x14, 0xF5, 0x30, 0x82, 0x1B, 0xDA, 0x9C, 0x6A, 0x88, 0x4E, 0x9C, 0x65, 0x2B, 0x2E, +0xCE, 0x12, 0x2D, 0xEF, 0xA3, 0x38, 0x68, 0xA8, 0x90, 0x6C, 0xB3, 0xDF, 0x7D, 0x2B, 0x5, 0xBE, +0x75, 0xD8, 0x30, 0xBD, 0x1C, 0xD4, 0x19, 0x92, 0xA6, 0xEB, 0x3F, 0xE0, 0xD1, 0x24, 0x6C, 0x22, +0x23, 0x47, 0xA1, 0xB5, 0x60, 0x5D, 0x65, 0xAF, 0x7, 0xC0, 0x65, 0x3A, 0xB4, 0x82, 0xB, 0x63, +0x1E, 0x89, 0xB2, 0xB, 0x5, 0x68, 0x26, 0x42, 0x2, 0x5C, 0xD1, 0x9, 0xF1, 0xC4, 0xEE, 0xA3, +0x85, 0x21, 0xD4, 0x7A, 0xB5, 0xCF, 0x2C, 0xF0, 0x93, 0x80, 0xC5, 0xF7, 0x37, 0x3B, 0x89, 0xAF, +0xDF, 0xC, 0xFB, 0xD0, 0x47, 0x7D, 0xBE, 0x35, 0x79, 0x38, 0xA9, 0x3E, 0xA1, 0xB7, 0xC7, 0x88, +0x1A, 0x76, 0x9, 0x4E, 0xDA, 0xFA, 0x3A, 0xD, 0x91, 0xC9, 0xDB, 0xC8, 0x65, 0xA0, 0xAB, 0xAF, +0x95, 0x25, 0xA2, 0x77, 0x6, 0x50, 0x9D, 0x59, 0x9C, 0xA6, 0x97, 0xAB, 0xC, 0x3B, 0x1A, 0xB, +0xF9, 0xAB, 0xEC, 0x7F, 0x96, 0x6F, 0x74, 0x35, 0xFF, 0x18, 0x55, 0xBB, 0x57, 0x80, 0xE7, 0xD5, +0x46, 0xAA, 0xFD, 0x9D, 0xAA, 0xD6, 0xCA, 0xCC, 0xF4, 0x58, 0x6D, 0x4D, 0xC6, 0x1F, 0xB0, 0x6A, +0x7F, 0x81, 0x72, 0x31, 0xB7, 0x3A, 0xF0, 0x3F, 0x6D, 0xD5, 0xE1, 0x15, 0x58, 0xE4, 0xB0, 0x4E, +0x70, 0x66, 0x83, 0xF3, 0x3F, 0x86, 0xD5, 0x6E, 0xC0, 0xAE, 0x2C, 0x70, 0xFE, 0x57, 0xB2, 0xDA, +0xB, 0x8F, 0x1B, 0xD8, 0x3B, 0xC1, 0x33, 0x1B, 0x9C, 0xFF, 0x5D, 0xAD, 0x76, 0x93, 0x4, 0xDF, +0xA6, 0xB2, 0x8B, 0xC6, 0xED, 0x73, 0x29, 0x15, 0xFB, 0x8F, 0xB7, 0xE4, 0x86, 0x89, 0xFA, 0x11, +0xDA, 0x38, 0x28, 0xB4, 0x99, 0xC2, 0xDF, 0xFD, 0x7F }; //***************************************************************************************************** const char ESPFMfGKWpcssDeflate[] = { - 0xCD, 0x19, 0xC9, 0x6E, 0xE3, 0x36, 0xF4, 0x9E, 0xAF, 0x20, 0x12, 0xC, 0xA6, 0x1D, 0x44, 0x1E, -0x2D, 0xB6, 0x93, 0xD8, 0x40, 0x81, 0xAC, 0xC0, 0x9C, 0xBB, 0x9D, 0x65, 0x89, 0x72, 0xD8, 0xCA, -0xA2, 0x20, 0x51, 0x71, 0xA6, 0x83, 0xF9, 0xF7, 0x3E, 0xAE, 0x5A, 0x48, 0x2A, 0xCE, 0xF4, 0xD2, -0x18, 0x90, 0x28, 0x2E, 0x6F, 0xDF, 0xF8, 0xB2, 0xD8, 0xA5, 0xD9, 0xDF, 0xFB, 0x86, 0x76, 0x55, -0x8E, 0xBE, 0x9D, 0x21, 0xD4, 0x7F, 0x6, 0x19, 0x2D, 0x69, 0xB3, 0x41, 0xBB, 0x12, 0xA6, 0xB6, -0x67, 0xDF, 0xCF, 0xCE, 0x72, 0xF2, 0x22, 0xF6, 0x1C, 0xD2, 0x66, 0x4F, 0xAA, 0xD, 0x8A, 0xEA, -0xD7, 0x2D, 0x7C, 0xD6, 0x69, 0x9E, 0x93, 0x6A, 0xBF, 0x41, 0x21, 0xFF, 0x2A, 0x68, 0xC5, 0x82, -0x22, 0x3D, 0x90, 0xF2, 0xEB, 0x6, 0x7D, 0xFC, 0x15, 0xEF, 0x29, 0x46, 0xBF, 0x7F, 0xF9, 0x78, -0x89, 0xFE, 0xC0, 0x4D, 0x9E, 0x56, 0xE9, 0x25, 0x6A, 0xD3, 0xAA, 0xD, 0x5A, 0xDC, 0x90, 0x42, -0x40, 0xBD, 0xD8, 0x67, 0x2, 0x6A, 0x4E, 0xDA, 0xBA, 0x4C, 0xE1, 0xD0, 0xBE, 0x21, 0x39, 0x87, -0xC4, 0xDF, 0x1, 0xC3, 0x7, 0x98, 0x65, 0x98, 0x53, 0xD3, 0x1D, 0xAA, 0x76, 0x83, 0xAE, 0xC3, -0xFA, 0x15, 0xC5, 0xAB, 0xF, 0x28, 0xED, 0x18, 0x45, 0x9, 0x7C, 0xD9, 0x9B, 0x1B, 0x7A, 0x84, -0x9D, 0xF1, 0xA, 0x76, 0xF2, 0xD, 0xFD, 0x56, 0x14, 0x3B, 0xF7, 0xA7, 0xD, 0x4E, 0xE1, 0xC0, -0x39, 0x8D, 0x10, 0x8D, 0x11, 0x4D, 0x10, 0x5D, 0x9E, 0x9F, 0x1F, 0x22, 0x94, 0xF1, 0x1F, 0x8C, -0x62, 0x33, 0x4A, 0xF4, 0xA8, 0x8B, 0x50, 0x17, 0xA3, 0x2E, 0x41, 0xDD, 0xF2, 0x5C, 0xF2, 0x71, -0x4C, 0x9, 0x13, 0x9C, 0xD4, 0xB4, 0x25, 0x8C, 0x50, 0x90, 0x50, 0x83, 0x1, 0x3C, 0x79, 0xC1, -0x1C, 0x23, 0xA3, 0x35, 0x88, 0x4C, 0xA1, 0x2F, 0x71, 0xC1, 0xE0, 0x6B, 0x25, 0xBF, 0x5E, 0x48, -0x4B, 0x76, 0xA4, 0x24, 0xC, 0xB8, 0x7, 0x3E, 0xCB, 0xB4, 0x6E, 0xB1, 0x84, 0x99, 0x81, 0xBC, -0x2E, 0x98, 0x78, 0x10, 0x78, 0xD4, 0xFC, 0x51, 0x90, 0x91, 0x16, 0xC2, 0xA9, 0xE, 0xE4, 0x39, -0xF4, 0x8D, 0xBF, 0x99, 0xDC, 0x5B, 0x94, 0x34, 0x5, 0x7C, 0x1C, 0xAB, 0x5C, 0xE7, 0x30, 0xF8, -0x1B, 0xB, 0xA8, 0x2F, 0x63, 0x5, 0x54, 0xB4, 0x92, 0xE8, 0x17, 0x20, 0x8F, 0x6F, 0x5A, 0x58, -0x5C, 0x46, 0x1B, 0x44, 0xA3, 0xAD, 0xD3, 0x4A, 0x2E, 0x6E, 0xE0, 0xEF, 0xFE, 0x5E, 0x2C, 0xD2, -0x26, 0xC7, 0x4D, 0x0, 0xFC, 0x6, 0x1C, 0x61, 0xD0, 0xA4, 0x39, 0xE9, 0xB8, 0x3A, 0x14, 0xEF, -0x92, 0xF0, 0x60, 0x47, 0x19, 0xA3, 0x7, 0xA0, 0x98, 0xCF, 0xA, 0x64, 0xB1, 0x85, 0x2C, 0x9E, -0x41, 0xF6, 0xF4, 0xE4, 0x3, 0x86, 0xD0, 0xF1, 0x99, 0x80, 0x56, 0xDB, 0x3A, 0xCD, 0x30, 0x67, -0xE7, 0xD8, 0xA4, 0xF5, 0xD6, 0x32, 0x31, 0x64, 0x90, 0x81, 0x75, 0x28, 0x93, 0x89, 0x8A, 0xA6, -0x9F, 0xB7, 0x6D, 0xF, 0x96, 0x25, 0x1B, 0x62, 0x4F, 0xA, 0xA, 0xE5, 0x36, 0x25, 0x27, 0xB8, -0x38, 0x69, 0x4C, 0x24, 0x13, 0xE, 0x9A, 0xEF, 0xEE, 0xEE, 0xE2, 0x21, 0xCD, 0xE, 0xCD, 0x21, -0x94, 0x75, 0x4D, 0xCB, 0x77, 0xE7, 0xB8, 0x48, 0xBB, 0x92, 0x89, 0x29, 0x79, 0x5E, 0xB0, 0xB4, -0x35, 0x58, 0x36, 0xCF, 0xF4, 0x5, 0x37, 0x3E, 0x5C, 0xF, 0xC9, 0x7A, 0xBD, 0xBE, 0x19, 0x9C, -0xEE, 0x9D, 0x98, 0x8B, 0xB9, 0xC5, 0x25, 0xCE, 0xA4, 0xAD, 0x4A, 0x65, 0x19, 0xC1, 0x8D, 0x91, -0x29, 0x6F, 0x3E, 0x62, 0xB2, 0x7F, 0x6, 0xF3, 0xD9, 0xD1, 0x52, 0x38, 0xA6, 0x8D, 0x90, 0x35, -0xE0, 0xD3, 0x35, 0x28, 0xAD, 0x62, 0x6, 0x9, 0xAD, 0xB9, 0xF, 0xCC, 0x20, 0x51, 0x34, 0xB9, -0xE0, 0xF5, 0xCC, 0x72, 0x48, 0x65, 0xBA, 0xC3, 0xA5, 0x0, 0xE4, 0x58, 0x4E, 0x2C, 0xA3, 0x49, -0x3C, 0x46, 0x73, 0x7F, 0xAF, 0x2D, 0xF4, 0x1D, 0x46, 0x23, 0x70, 0x2C, 0x2D, 0x1C, 0x4B, 0x2F, -0xE, 0x90, 0xFB, 0xCD, 0xC0, 0xB, 0xB4, 0xF1, 0x87, 0xC2, 0xF5, 0xE5, 0x23, 0x9C, 0xF3, 0x2, -0x88, 0x3A, 0x13, 0x64, 0x87, 0x68, 0xB0, 0x5F, 0x44, 0x11, 0x45, 0xF0, 0xAC, 0x17, 0x9E, 0x1A, -0x4E, 0xD7, 0xFE, 0xA8, 0xA8, 0xA2, 0xE8, 0x6C, 0xC4, 0x6C, 0xA3, 0x8, 0xB5, 0x51, 0x2C, 0x43, -0xE0, 0x2, 0x46, 0xE3, 0xD8, 0xF4, 0x26, 0xA1, 0xF2, 0x54, 0xE2, 0x3C, 0xF5, 0x46, 0x1C, 0x79, -0x56, 0x66, 0x99, 0xF4, 0xB2, 0x93, 0xD8, 0xD, 0xEB, 0x45, 0x89, 0xC5, 0xCE, 0xBF, 0xBA, 0x96, -0x91, 0xE2, 0x2B, 0x20, 0xAF, 0x18, 0x98, 0x28, 0x4, 0x59, 0x78, 0xE2, 0x86, 0x2F, 0xA5, 0x25, -0xD9, 0x57, 0x1, 0x28, 0xFE, 0xD0, 0xE, 0xA7, 0x87, 0xE2, 0x8F, 0xDF, 0xD4, 0xF5, 0x91, 0xE4, -0xEC, 0x59, 0x8A, 0x52, 0x11, 0x62, 0x59, 0xE5, 0x21, 0xF1, 0x1B, 0xDE, 0xFF, 0x42, 0x8F, 0x9, -0xE8, 0x31, 0x31, 0x7A, 0x4C, 0x7E, 0x48, 0x8F, 0xC9, 0x9C, 0x1E, 0x25, 0xD3, 0xA7, 0xAA, 0x12, -0xD2, 0xEB, 0x44, 0x82, 0xDD, 0xC9, 0x99, 0x67, 0xE, 0x93, 0xE5, 0x46, 0x2, 0x99, 0x95, 0x79, -0xBA, 0x39, 0xA5, 0xAF, 0xD7, 0x1E, 0x87, 0x54, 0xB1, 0x5C, 0x60, 0xEE, 0x73, 0x3D, 0xC4, 0x69, -0x46, 0xB2, 0xB4, 0xC, 0x84, 0xAD, 0x81, 0x29, 0x90, 0x3C, 0x2F, 0xFB, 0xE8, 0xDA, 0x92, 0x7F, -0x20, 0xDE, 0x5C, 0x87, 0x1F, 0xC, 0x2D, 0xE0, 0x10, 0x97, 0x48, 0xE, 0x24, 0x61, 0x3A, 0x2B, -0xD4, 0x94, 0x68, 0x3, 0xD5, 0x12, 0x8B, 0x42, 0x7E, 0x70, 0x98, 0x46, 0x50, 0xCC, 0x43, 0xC, -0x7F, 0x8E, 0xCC, 0x87, 0x54, 0x25, 0xA9, 0x70, 0xB0, 0x2B, 0xA9, 0x4E, 0x4, 0x12, 0x93, 0x4C, -0x24, 0x6, 0xDF, 0x7C, 0x5E, 0xE9, 0xF3, 0xEE, 0x24, 0xBC, 0x29, 0x6C, 0x76, 0x7C, 0x86, 0x2, -0x69, 0x2A, 0xDA, 0xC4, 0x2F, 0x2A, 0x7, 0xCA, 0xA7, 0xA7, 0x9B, 0x1B, 0x29, 0xF0, 0xA9, 0xB4, -0x7C, 0xCA, 0xB4, 0xA2, 0x75, 0xB7, 0x9C, 0x81, 0x1D, 0x86, 0xEF, 0x88, 0xD6, 0x63, 0x4C, 0xD9, -0x14, 0x51, 0x66, 0x8A, 0xAB, 0x5D, 0x7, 0x26, 0xA8, 0x92, 0x9F, 0x85, 0xF7, 0xB7, 0x61, 0xB6, -0xEC, 0xB3, 0x23, 0x94, 0xD3, 0xA8, 0xA5, 0x25, 0xC9, 0x67, 0xE4, 0x6C, 0x95, 0xDC, 0x2A, 0x75, -0xC9, 0x0, 0xA4, 0x8B, 0x61, 0xCB, 0x5E, 0x46, 0x54, 0x9D, 0xAA, 0x62, 0x5B, 0x99, 0x50, 0xA9, -0xEB, 0x3B, 0x80, 0xA1, 0x20, 0x32, 0xD2, 0xC8, 0xC0, 0x86, 0x32, 0xF, 0xD8, 0x7D, 0x83, 0x71, -0xB5, 0x75, 0x17, 0x99, 0x59, 0xB6, 0xBF, 0x44, 0x59, 0xD6, 0x89, 0xA3, 0xC6, 0xAE, 0x17, 0x2B, -0x7C, 0x30, 0xEB, 0x3E, 0x62, 0x6F, 0x57, 0xB7, 0x2B, 0x4E, 0xAC, 0xDC, 0x26, 0x21, 0xB8, 0xF4, -0xFC, 0x78, 0x73, 0xCB, 0xF5, 0x2C, 0xB7, 0xC9, 0x52, 0x62, 0x22, 0x58, 0x7E, 0x55, 0x8, 0xE1, -0xB7, 0xF2, 0x4B, 0x90, 0x1F, 0x1D, 0xCA, 0x6E, 0x1E, 0xC0, 0xA4, 0x90, 0xF2, 0x0, 0x74, 0x82, -0x12, 0x40, 0x24, 0x40, 0xBD, 0x4F, 0x16, 0x6B, 0xC, 0xBF, 0x32, 0x1D, 0x45, 0x1A, 0x2E, 0x27, -0xA3, 0x96, 0xF7, 0x5C, 0xA0, 0x1A, 0x5C, 0xE3, 0x94, 0xFD, 0x94, 0x5C, 0x82, 0x55, 0xBF, 0xEA, -0x9C, 0xF8, 0xB3, 0x4, 0x55, 0x54, 0x38, 0x93, 0xD0, 0x94, 0x49, 0x1D, 0xC0, 0xEA, 0xD5, 0x96, -0x51, 0xE9, 0x3A, 0xB1, 0x44, 0xE9, 0x19, 0xD3, 0x98, 0x33, 0x22, 0x64, 0x52, 0x65, 0xCF, 0x17, -0xD9, 0x7A, 0xC7, 0xB0, 0xC4, 0xD6, 0x4, 0x2A, 0x76, 0x47, 0x55, 0xF4, 0x3B, 0x79, 0x8F, 0x3C, -0xBC, 0x4F, 0xAF, 0xB7, 0x2, 0xB7, 0x88, 0xA7, 0xBE, 0xF8, 0x34, 0xF0, 0xE, 0x49, 0x9A, 0xDF, -0x41, 0x60, 0xBD, 0x1D, 0x2F, 0x85, 0x5A, 0xCD, 0xF2, 0xED, 0xB4, 0x13, 0x97, 0xA1, 0xF5, 0xF0, -0x86, 0xB6, 0x3C, 0x8A, 0x20, 0x8F, 0xF, 0xF7, 0x49, 0xB4, 0xF2, 0xC4, 0xBD, 0x7E, 0xD1, 0xBE, -0x1E, 0x8, 0xA8, 0x96, 0x99, 0xFF, 0x7, 0xD8, 0x63, 0x9, 0xB5, 0xA9, 0xF, 0xEA, 0xD3, 0xF5, -0xD3, 0xDD, 0xC3, 0x9D, 0x2F, 0x52, 0x9B, 0x45, 0x3D, 0xD3, 0x83, 0xFD, 0xFC, 0x49, 0x9C, 0xD0, -0x31, 0xF7, 0xD3, 0x67, 0x81, 0x68, 0xA7, 0x10, 0xCD, 0x51, 0xA8, 0xA9, 0x48, 0x9C, 0xBC, 0x8D, -0xC5, 0xBE, 0xB4, 0x23, 0xEF, 0x54, 0x77, 0x23, 0x8B, 0x1C, 0x64, 0xAB, 0x70, 0x71, 0xC5, 0x63, -0x99, 0x27, 0x8, 0x8, 0x5A, 0x7, 0x2, 0x9F, 0x46, 0x8E, 0x13, 0xD2, 0xF0, 0x88, 0x3, 0x6F, -0xEE, 0x10, 0x1C, 0x70, 0x79, 0x7D, 0x46, 0x8F, 0x39, 0x61, 0xB4, 0xF9, 0x52, 0x41, 0x17, 0x86, -0xF1, 0x26, 0xC0, 0x30, 0x5F, 0xB9, 0xAE, 0x41, 0xE8, 0x2D, 0xAD, 0x38, 0xE8, 0x98, 0x2E, 0x7A, -0x25, 0x29, 0xBA, 0x34, 0x4A, 0x9A, 0xF0, 0x76, 0xD5, 0xC9, 0x5A, 0x80, 0xCE, 0xEB, 0xA8, 0x33, -0xDB, 0x19, 0x9E, 0x7E, 0xB0, 0xA0, 0x51, 0x44, 0xCE, 0xF2, 0x65, 0x19, 0x38, 0x37, 0xC5, 0xBA, -0x48, 0x73, 0xC4, 0xF8, 0x8D, 0xB5, 0xC4, 0xDC, 0x16, 0x2F, 0x6A, 0xE9, 0xA3, 0xD3, 0x42, 0x6C, -0xDC, 0x82, 0xB0, 0x23, 0x95, 0x68, 0x59, 0xF1, 0xAA, 0x15, 0x2D, 0x45, 0x29, 0x2, 0x41, 0x51, -0xC, 0xC4, 0x14, 0x5F, 0x74, 0x1C, 0x96, 0xD1, 0x55, 0x9C, 0xEC, 0x77, 0xD8, 0x5D, 0xA, 0xA0, -0x68, 0xDA, 0xCA, 0x73, 0x36, 0x91, 0x60, 0xDF, 0xA2, 0x56, 0x85, 0xB8, 0x4A, 0x7, 0x91, 0xD4, -0x83, 0x95, 0xB0, 0xF8, 0x4F, 0xAF, 0xCD, 0xD5, 0x70, 0xE3, 0xB2, 0xB5, 0x47, 0x72, 0x75, 0x1A, -0x12, 0x58, 0x91, 0xA4, 0xFE, 0x8, 0x12, 0x1A, 0xF3, 0x5E, 0x97, 0x18, 0xAD, 0xBD, 0x95, 0x82, -0x2, 0xF2, 0xDD, 0x9C, 0x31, 0xA2, 0x3A, 0x41, 0x2, 0xC6, 0x4E, 0xBD, 0x79, 0xC2, 0x2E, 0xDC, -0x35, 0xD8, 0x9, 0xAD, 0xEB, 0x77, 0xE0, 0xE5, 0x58, 0x7D, 0x62, 0x79, 0x2F, 0x5E, 0xC8, 0x8C, -0x6A, 0x74, 0xA5, 0x47, 0x9D, 0x91, 0x5B, 0xB7, 0x46, 0xA7, 0xA, 0xAE, 0x83, 0xF2, 0x42, 0x8D, -0x56, 0xDE, 0x43, 0xFA, 0x32, 0x65, 0xE, 0x2D, 0x67, 0xE0, 0xF3, 0xF6, 0x8D, 0x3B, 0xB0, 0x1A, -0x65, 0xA9, 0xE3, 0xC3, 0x32, 0xA9, 0xBF, 0xD2, 0xF7, 0x95, 0xA5, 0x3A, 0xD4, 0x9F, 0xFA, 0x65, -0xE2, 0xF, 0xAA, 0xCE, 0x5F, 0x8, 0x99, 0xCB, 0xC, 0xF3, 0x27, 0xA9, 0x72, 0xF0, 0x2E, 0x91, -0x5D, 0x8E, 0x72, 0xCC, 0xBE, 0x82, 0x87, 0xF3, 0x43, 0x13, 0x37, 0x9A, 0xF6, 0xF4, 0x86, 0xD, -0xE1, 0x74, 0x7, 0x51, 0xA4, 0x93, 0x1A, 0x41, 0xE8, 0x9F, 0x0, 0x20, 0xE1, 0xD7, 0xD, 0x12, -0x8C, 0x9D, 0xD4, 0x58, 0x93, 0xB8, 0x55, 0xE1, 0xA2, 0xB0, 0xF3, 0x0, 0x7, 0x1D, 0xDE, 0xE3, -0xA6, 0xCD, 0x1A, 0xE8, 0x1E, 0x6F, 0x47, 0x93, 0xC1, 0xEB, 0xE6, 0x19, 0x2E, 0x9C, 0xB2, 0xFA, -0xF6, 0xF5, 0xA6, 0xDF, 0xE4, 0xC0, 0xA1, 0x91, 0x22, 0xE2, 0x3F, 0xB5, 0x2C, 0xAD, 0x52, 0x5E, -0xE6, 0xE2, 0x3E, 0x56, 0x3E, 0x5C, 0xDF, 0xAE, 0xAE, 0xC2, 0x21, 0xE5, 0x8C, 0x30, 0x23, 0x35, -0xBB, 0x1D, 0x6B, 0xD1, 0xE1, 0xEB, 0xCF, 0xCE, 0x77, 0x68, 0x75, 0x27, 0x44, 0xED, 0x9C, 0x44, -0x40, 0x3E, 0x77, 0x86, 0xC6, 0x4, 0x2D, 0xE4, 0x15, 0x63, 0xD6, 0x83, 0xC, 0x71, 0xE, 0x86, -0x16, 0x5A, 0x17, 0xBA, 0x1E, 0x16, 0xE5, 0x79, 0x7F, 0xB1, 0xF5, 0x5D, 0x78, 0x87, 0x30, 0xF9, -0x97, 0xCE, 0x65, 0x7, 0x50, 0xDF, 0xC4, 0x46, 0x22, 0xD1, 0x92, 0x70, 0xB7, 0x7B, 0x95, 0x98, -0x7, 0xAA, 0xB0, 0xBA, 0x66, 0x3D, 0x46, 0xA3, 0xC0, 0xA2, 0x18, 0xD9, 0x54, 0x49, 0x5B, 0xAD, -0x19, 0x47, 0x1B, 0xDA, 0xB6, 0x89, 0x89, 0xAA, 0x46, 0x7E, 0xA9, 0xA2, 0xD5, 0x88, 0x1C, 0x21, -0x12, 0x7, 0x3D, 0xE3, 0xAE, 0x8D, 0x77, 0x97, 0xA3, 0xA3, 0xBE, 0xBE, 0xBA, 0x7F, 0x18, 0x29, -0x43, 0xF0, 0x30, 0xC8, 0xF8, 0xEE, 0x9C, 0xBF, 0x82, 0x94, 0xFF, 0x28, 0x13, 0xB6, 0x3A, 0x7, -0xC6, 0x54, 0xAB, 0x3, 0x96, 0xBC, 0xDF, 0xF0, 0xC, 0xF5, 0xAF, 0x15, 0x75, 0x1D, 0x9B, 0xF3, -0x76, 0x53, 0xCD, 0xC8, 0x4F, 0xCB, 0x42, 0xC6, 0x81, 0xBE, 0x57, 0x42, 0x75, 0x6C, 0x21, 0xB5, -0x63, 0x2E, 0x5A, 0x41, 0xF4, 0xBF }; + 0xCD, 0x59, 0x59, 0x6F, 0xDB, 0x38, 0x10, 0x7E, 0xCF, 0xAF, 0x20, 0x12, 0x14, 0xED, 0x16, 0xB1, +0x6B, 0x49, 0xB6, 0x13, 0x3B, 0xC0, 0x2, 0x39, 0x81, 0x3E, 0xEF, 0xF5, 0x4C, 0x4B, 0x94, 0xC3, +0x5D, 0x59, 0x14, 0x24, 0x2A, 0x4E, 0x5A, 0xF4, 0xBF, 0xEF, 0xF0, 0xD4, 0x41, 0x51, 0xB6, 0xD3, +0x7D, 0x58, 0x1B, 0x90, 0x29, 0x89, 0x9C, 0x19, 0x7E, 0x33, 0x9C, 0xCB, 0xD3, 0xD, 0x8E, 0xFF, +0xD9, 0x96, 0xAC, 0xCE, 0x13, 0xF4, 0xFD, 0xC, 0xC1, 0xA7, 0x79, 0x30, 0x89, 0x59, 0xC6, 0xCA, +0x35, 0xDA, 0x64, 0xF0, 0xE8, 0xE6, 0xEC, 0xC7, 0xD9, 0x59, 0x42, 0x5F, 0xF4, 0xAC, 0x1D, 0x2E, +0xB7, 0x34, 0x5F, 0xA3, 0xA0, 0x78, 0xBD, 0x91, 0xF, 0xA, 0x9C, 0x24, 0x34, 0xDF, 0xAE, 0xD1, +0x4C, 0xDD, 0xA7, 0x2C, 0xE7, 0x93, 0x14, 0xEF, 0x68, 0xF6, 0xB6, 0x46, 0x1F, 0x7F, 0x23, 0x5B, +0x46, 0xD0, 0x1F, 0x5F, 0x3F, 0x5E, 0xA2, 0x3F, 0x49, 0x99, 0xE0, 0x1C, 0x5F, 0xA2, 0xA, 0xE7, +0xD5, 0xA4, 0x22, 0x25, 0x4D, 0x25, 0xED, 0x8B, 0x6D, 0xAC, 0x69, 0x27, 0xB4, 0x2A, 0x32, 0xC, +0xCB, 0xB6, 0x25, 0x4D, 0x14, 0x35, 0x31, 0x9A, 0x70, 0xB2, 0x83, 0xE7, 0x9C, 0x8, 0xB9, 0xEA, +0x5D, 0x5E, 0xAD, 0xD1, 0xF5, 0xAC, 0x78, 0x45, 0xE1, 0xE2, 0x3, 0xC2, 0x35, 0x67, 0x28, 0x82, +0xBB, 0xA1, 0xE9, 0x25, 0xDB, 0xC3, 0xDC, 0x70, 0x1, 0x73, 0xC5, 0x94, 0x66, 0x32, 0xA, 0x3D, +0x2B, 0x70, 0x49, 0x30, 0x2C, 0x39, 0x67, 0x1, 0x62, 0x21, 0x62, 0x11, 0x62, 0xF3, 0xF3, 0xF3, +0x5D, 0x80, 0x62, 0xF1, 0x85, 0x51, 0x68, 0x47, 0x91, 0x19, 0xD5, 0x1, 0xAA, 0x43, 0x54, 0x47, +0xA8, 0x9E, 0x9F, 0xAB, 0xFD, 0xEC, 0x31, 0xE5, 0x7A, 0x47, 0x5, 0xAB, 0x28, 0xA7, 0xC, 0xF0, +0x2A, 0x9, 0x30, 0xA0, 0x2F, 0x44, 0x71, 0xE5, 0xAC, 0x0, 0x8, 0xAD, 0x10, 0x19, 0x49, 0x39, +0xDC, 0x2F, 0xCC, 0xFD, 0xB, 0xAD, 0xE8, 0x86, 0x66, 0x94, 0x3, 0x16, 0xB0, 0xE7, 0xC, 0x17, +0x15, 0x51, 0xB4, 0x63, 0xC0, 0xEF, 0x82, 0xCB, 0xB, 0x85, 0x4B, 0x21, 0x2E, 0x29, 0xED, 0xE9, +0x66, 0xE6, 0x6A, 0x46, 0xAD, 0x45, 0xDF, 0xC5, 0x2F, 0x37, 0xF3, 0xD3, 0x8C, 0x61, 0xE0, 0x2B, +0xB8, 0xAB, 0x19, 0x82, 0x92, 0xF8, 0x25, 0x92, 0xF6, 0x4B, 0x5F, 0x2D, 0x39, 0xCB, 0x95, 0x18, +0x53, 0xC0, 0xE7, 0x7B, 0x3, 0x9F, 0x40, 0x6D, 0x8D, 0x58, 0x70, 0xE3, 0xB1, 0xA3, 0x8B, 0x15, +0x7C, 0xEE, 0xEF, 0xF5, 0x6B, 0x56, 0x26, 0xA4, 0x9C, 0x0, 0x2, 0x13, 0xC1, 0x78, 0x52, 0xE2, +0x84, 0xD6, 0x42, 0x4D, 0x16, 0xD, 0xB5, 0x8D, 0xC9, 0x86, 0x71, 0xCE, 0x76, 0x20, 0xBD, 0x78, +0x2E, 0x99, 0x86, 0x3, 0x4C, 0xC3, 0x51, 0xA6, 0x4F, 0x4F, 0x7E, 0x92, 0xE2, 0xF9, 0xFE, 0x99, +0x82, 0xD6, 0xAB, 0x2, 0xC7, 0x44, 0x6C, 0x6F, 0x5F, 0xE2, 0xE2, 0x66, 0xD4, 0x14, 0x85, 0x9, +0x69, 0xBB, 0xA, 0xD2, 0x72, 0xD4, 0x46, 0xE1, 0x7D, 0xDB, 0xCE, 0x30, 0x68, 0x5C, 0x98, 0x9E, +0xD9, 0xCE, 0x5, 0xB, 0xA9, 0xD9, 0xD0, 0x80, 0xF4, 0x77, 0x77, 0x77, 0x61, 0x57, 0xFA, 0x41, +0xBD, 0x8A, 0xFB, 0xB8, 0x2E, 0x2B, 0xB1, 0x26, 0x21, 0x29, 0xAE, 0x33, 0xAE, 0x1F, 0x2A, 0x3A, +0x72, 0x83, 0xD, 0xBF, 0xF5, 0x33, 0x7B, 0x21, 0xA5, 0x9F, 0xEB, 0x43, 0xB4, 0x5C, 0x2E, 0x57, +0x1D, 0xA, 0x8D, 0x13, 0x10, 0xA, 0xA8, 0x48, 0x46, 0x62, 0x63, 0xDD, 0x4A, 0x95, 0x2D, 0x38, +0xBB, 0x4C, 0xAD, 0x37, 0xD8, 0x13, 0xBA, 0x7D, 0x6, 0x43, 0xDB, 0xB0, 0x4C, 0x63, 0xE9, 0xB2, +0xE6, 0x25, 0x78, 0x85, 0x2, 0x94, 0x9A, 0x73, 0xCB, 0x8C, 0x15, 0xE2, 0xEC, 0x1C, 0x60, 0xA6, +0xE5, 0x1B, 0xA6, 0xDA, 0x6C, 0x5F, 0xD0, 0xCB, 0xF0, 0x86, 0x64, 0x9A, 0xDC, 0xC0, 0x84, 0x68, +0xC0, 0xBC, 0x22, 0xAF, 0x79, 0xDD, 0xDF, 0x37, 0x36, 0x7D, 0x92, 0x79, 0x49, 0x5E, 0xF3, 0x1, +0x5E, 0xF3, 0x11, 0x5E, 0xA0, 0x95, 0x55, 0xE7, 0xFC, 0x98, 0x63, 0x33, 0x93, 0x6E, 0x44, 0x5D, +0x66, 0xE3, 0xE7, 0x7, 0xFC, 0x98, 0xC3, 0x74, 0x17, 0x74, 0xD6, 0x48, 0xBF, 0x64, 0xC5, 0x3F, +0x70, 0x92, 0x8F, 0x77, 0xD7, 0xCB, 0x31, 0x9F, 0xAB, 0xBD, 0xF4, 0x1, 0x8F, 0x5C, 0x5, 0x1, +0xAA, 0x82, 0x50, 0xB9, 0xD8, 0x29, 0x8C, 0xFA, 0x3E, 0xEF, 0x8, 0xA1, 0xD5, 0xCA, 0xC8, 0xBB, +0xF2, 0xA0, 0x67, 0x7A, 0xD6, 0x86, 0x1C, 0x35, 0x98, 0x1A, 0x39, 0x2C, 0x18, 0x69, 0x46, 0xF4, +0xEC, 0xBF, 0xEB, 0x8A, 0xD3, 0xF4, 0xD, 0xC4, 0xC8, 0x39, 0x98, 0x35, 0xB8, 0x72, 0xB8, 0x12, +0xED, 0x34, 0x70, 0x46, 0xB7, 0xF9, 0x4, 0xCC, 0x63, 0x57, 0x75, 0x5F, 0xB4, 0x95, 0x13, 0x1E, +0x65, 0x11, 0x7B, 0x9A, 0xF0, 0x67, 0x5, 0xB2, 0x16, 0x6A, 0xC0, 0x92, 0x77, 0xD1, 0xB8, 0xA9, +0xFE, 0xAF, 0x74, 0x1D, 0x81, 0xAE, 0x23, 0xAB, 0xEB, 0xE8, 0xDD, 0xBA, 0x8E, 0xE, 0xE9, 0x5A, +0xC1, 0x70, 0xBC, 0xBA, 0x21, 0xD8, 0x3B, 0xC8, 0xD6, 0x27, 0xC5, 0xBD, 0x71, 0x8E, 0xCE, 0x31, +0x94, 0x4C, 0x7, 0xE2, 0x5E, 0x3D, 0x6E, 0x1A, 0xCB, 0xE5, 0xC8, 0xB1, 0xD6, 0xF1, 0x43, 0xCA, +0xD0, 0xCE, 0x42, 0x20, 0x32, 0x70, 0x1A, 0xE3, 0x6C, 0x22, 0x6D, 0x13, 0x4C, 0x86, 0x26, 0x49, +0xD6, 0xF6, 0xE3, 0x15, 0xFD, 0x6, 0x7E, 0xEC, 0x7A, 0xF6, 0xC1, 0xCA, 0x5, 0xC7, 0xC9, 0xF8, +0x53, 0x1D, 0x84, 0xA, 0x46, 0x1B, 0x5B, 0x36, 0x0, 0x6, 0x33, 0xB1, 0xA6, 0x1B, 0xBB, 0xD0, +0x5C, 0x78, 0x2C, 0x71, 0xED, 0x59, 0x18, 0xCD, 0x33, 0x9A, 0x93, 0xC9, 0x26, 0x63, 0x26, 0xEE, +0x28, 0x46, 0x87, 0x62, 0x57, 0x3B, 0xDE, 0xF7, 0x9C, 0x64, 0x38, 0x1C, 0xA0, 0x24, 0xED, 0x81, +0xB3, 0x52, 0x47, 0xE3, 0x40, 0xD, 0x30, 0x7F, 0x7A, 0x5A, 0xAD, 0xC, 0xE8, 0x7D, 0xAC, 0xFC, +0x8A, 0x1D, 0x88, 0x2, 0xF5, 0x7C, 0x94, 0xC7, 0x6C, 0x76, 0x62, 0x14, 0xE8, 0x72, 0x8C, 0x5D, +0x86, 0xB1, 0x4D, 0xFD, 0x36, 0x35, 0x98, 0xA6, 0xD, 0xB7, 0xE, 0xFF, 0xDF, 0xDB, 0x11, 0xBA, +0x91, 0x41, 0x96, 0x2, 0xA8, 0x62, 0x19, 0x4D, 0x46, 0x75, 0x30, 0x50, 0x30, 0xD8, 0x30, 0xA9, +0x1C, 0x58, 0x93, 0xC6, 0x3B, 0xC6, 0xD4, 0x91, 0xF0, 0x14, 0x43, 0x70, 0x15, 0xE, 0xD5, 0x46, +0x53, 0xCD, 0x58, 0x59, 0x2, 0x8B, 0x50, 0x8C, 0xA6, 0x75, 0xEC, 0x25, 0xBE, 0x2D, 0x9, 0xC9, +0x6F, 0x7C, 0x69, 0x71, 0x1C, 0x6F, 0x2F, 0x51, 0x1C, 0xD7, 0x7A, 0xB9, 0x35, 0xFF, 0xE9, 0x82, +0xEC, 0xEC, 0xC, 0xBF, 0xE0, 0xB7, 0x8B, 0xDB, 0x85, 0x10, 0x5C, 0x4D, 0x34, 0x54, 0x86, 0x2C, +0xE1, 0x71, 0x75, 0x2B, 0x2C, 0x41, 0x4D, 0x34, 0x29, 0x4D, 0xF, 0x70, 0x51, 0xF6, 0xCC, 0xE0, +0xBB, 0x18, 0x43, 0x55, 0x2C, 0xEF, 0xE2, 0x79, 0x88, 0x88, 0x93, 0xE2, 0x79, 0xC8, 0x7A, 0x8, +0x4A, 0x52, 0x8A, 0xAC, 0x99, 0x69, 0xD2, 0x49, 0x4E, 0x5E, 0xB9, 0xF1, 0x3D, 0xA5, 0x40, 0xCE, +0x2A, 0xEC, 0xD4, 0xF2, 0xB0, 0x24, 0x5, 0xC1, 0xFC, 0x53, 0x74, 0x9, 0xA7, 0xE0, 0xD5, 0xC4, +0xDF, 0x5F, 0x14, 0xB9, 0x34, 0x27, 0xB1, 0xA1, 0xA8, 0xD, 0x6F, 0x7, 0xE7, 0x44, 0x4F, 0xEA, +0x25, 0xDC, 0x8E, 0xD5, 0xAA, 0xF3, 0x64, 0xFD, 0xC9, 0x7F, 0x54, 0x26, 0x34, 0x73, 0xFA, 0x55, +0x82, 0x10, 0xD7, 0x2, 0xD0, 0xAB, 0x3, 0x4E, 0xC6, 0x23, 0xF0, 0xE0, 0xE1, 0x96, 0xF6, 0x52, +0x6, 0xD8, 0xE5, 0x58, 0xA8, 0x6D, 0x9D, 0x29, 0x25, 0xE4, 0xD8, 0xB1, 0x82, 0x19, 0x55, 0xFF, +0xE5, 0xCC, 0x18, 0x82, 0xFA, 0xF5, 0x58, 0xD3, 0xB0, 0x51, 0x36, 0x54, 0xBB, 0xD6, 0xDF, 0xF1, +0x46, 0x8F, 0xF, 0xF7, 0x51, 0xB0, 0xF0, 0xFA, 0xD3, 0xF6, 0x6B, 0xB7, 0xD8, 0x91, 0xB4, 0x7, +0x8E, 0xC6, 0x4F, 0x72, 0xE8, 0xA2, 0x56, 0x61, 0x3F, 0xED, 0xA7, 0xEB, 0xA7, 0xBB, 0x87, 0x3B, +0x7F, 0x34, 0x68, 0xBD, 0x76, 0x68, 0x7F, 0xF9, 0x2C, 0x97, 0x18, 0x97, 0xFE, 0xF9, 0x8B, 0xE4, +0xB6, 0xB1, 0xDC, 0xC6, 0x45, 0x35, 0xC2, 0x44, 0x9E, 0x8D, 0x76, 0xB5, 0x61, 0x23, 0xF8, 0xB8, +0x62, 0x7B, 0xC6, 0xDB, 0xA, 0x92, 0xB3, 0xE9, 0x95, 0x70, 0x8F, 0x5E, 0x5F, 0x22, 0x25, 0xEF, +0x68, 0xC2, 0x75, 0x42, 0x47, 0xE5, 0x3, 0x9D, 0x1D, 0x8D, 0x84, 0x2A, 0xB9, 0x23, 0x85, 0xE2, +0x63, 0x42, 0x39, 0x2B, 0xBF, 0xE6, 0xD0, 0xAE, 0xE2, 0x2, 0x46, 0x68, 0x8D, 0x74, 0xE3, 0xA4, +0xB7, 0x83, 0x70, 0x40, 0x65, 0x3, 0x12, 0xB9, 0xAF, 0x47, 0x30, 0x96, 0x4D, 0x2D, 0x8D, 0x33, +0xFC, 0xE, 0x27, 0xF7, 0xD, 0xB0, 0x9E, 0x3A, 0x7C, 0x30, 0xD0, 0xDA, 0x2D, 0xFE, 0x44, 0xC6, +0x65, 0x5, 0x3E, 0xB0, 0x4F, 0xC7, 0x72, 0x5, 0xE8, 0x45, 0x8A, 0x13, 0xC4, 0x45, 0xB1, 0x9E, +0x11, 0x9, 0x7A, 0x61, 0xE, 0x79, 0x3F, 0x49, 0x3C, 0xE8, 0xF9, 0x64, 0xCB, 0x4F, 0xE4, 0xD7, +0x68, 0x2E, 0x13, 0x24, 0x70, 0xB6, 0x72, 0x20, 0x1F, 0x89, 0x97, 0xFE, 0x2A, 0x45, 0x2E, 0x6D, +0x4D, 0x71, 0x1A, 0x38, 0x20, 0x95, 0xDB, 0x17, 0xF5, 0xF4, 0xDE, 0x60, 0xEE, 0xB4, 0xB0, 0xD5, +0x83, 0x8E, 0x3B, 0x81, 0xD1, 0x8E, 0x13, 0x23, 0xC5, 0xB7, 0x79, 0x3B, 0x9E, 0x6E, 0x76, 0x93, +0xEC, 0x86, 0xD9, 0xD5, 0xF1, 0xCC, 0xE0, 0x9D, 0x11, 0xFC, 0x7D, 0xCC, 0x58, 0x28, 0x1A, 0x86, +0x72, 0xB4, 0x1C, 0x49, 0x5B, 0x34, 0xA1, 0xD6, 0xB2, 0x16, 0x82, 0x47, 0x81, 0xD2, 0x32, 0x69, +0x6F, 0x44, 0x72, 0xE5, 0x6C, 0x93, 0xEF, 0x9, 0xBE, 0x3C, 0x51, 0x2, 0xC1, 0xDF, 0x8F, 0xD5, +0x7B, 0x24, 0x80, 0xA8, 0xAC, 0x47, 0x57, 0x66, 0x54, 0x5B, 0x38, 0xEB, 0x53, 0xE0, 0xAC, 0x21, +0xE1, 0xD1, 0xA3, 0x85, 0x7F, 0x99, 0xA9, 0xF, 0x9B, 0x65, 0xF3, 0x31, 0x1E, 0xA2, 0xCF, 0xE5, +0x73, 0xD9, 0xCD, 0x26, 0xE6, 0x3, 0x39, 0x5C, 0xBB, 0xAB, 0xD1, 0xA4, 0xC2, 0xCE, 0xC2, 0x5F, +0x9D, 0x53, 0xA4, 0x8B, 0x96, 0xA9, 0x54, 0x84, 0xF2, 0xC3, 0x7F, 0xD1, 0x3C, 0x81, 0x53, 0x29, +0x23, 0xD9, 0x5E, 0x8D, 0xF9, 0x1B, 0x78, 0x87, 0x83, 0x87, 0xAF, 0xDB, 0x85, 0xC7, 0x1B, 0xF0, +0x41, 0xB5, 0x51, 0xD1, 0xB7, 0x9, 0x50, 0x22, 0xAF, 0x6B, 0xB4, 0x3A, 0xBA, 0x2B, 0xA9, 0x78, +0xEB, 0xC, 0x4A, 0x73, 0x17, 0x4E, 0x12, 0x5A, 0xE9, 0xFB, 0x35, 0xAA, 0xE2, 0x12, 0xBA, 0xF5, +0x37, 0x9D, 0xA7, 0x13, 0xA0, 0xFF, 0xC, 0x95, 0xB4, 0x29, 0x1B, 0x7C, 0x7F, 0x9, 0x1C, 0xD8, +0xC3, 0x80, 0x6E, 0xD2, 0x40, 0x7C, 0x3B, 0xA6, 0xAA, 0x2A, 0xD5, 0xB0, 0xF1, 0xB5, 0xF, 0xD7, +0xB7, 0x8B, 0xAB, 0x59, 0x5B, 0x76, 0x4E, 0xB9, 0xC5, 0x6D, 0x20, 0x83, 0xEC, 0x89, 0xF1, 0xAE, +0xA6, 0x77, 0xB7, 0x1, 0xE4, 0xA4, 0xB4, 0x6D, 0x39, 0xA6, 0xFE, 0x72, 0xA8, 0x75, 0x96, 0x5A, +0x42, 0x39, 0x4, 0xEC, 0x5F, 0x2D, 0x3A, 0x41, 0x97, 0x95, 0x43, 0xBB, 0x5A, 0xF7, 0x55, 0xF1, +0xBD, 0x9D, 0x9A, 0x50, 0xB8, 0x3, 0xC5, 0xF5, 0xCC, 0x23, 0xF0, 0x37, 0x5B, 0xC, 0xBE, 0x63, +0xFD, 0xC3, 0x86, 0xA5, 0xD5, 0x5C, 0x9A, 0x76, 0xCC, 0x29, 0x63, 0x95, 0x51, 0xC9, 0x60, 0x33, +0xBF, 0x6F, 0xC, 0x63, 0xB9, 0x54, 0xDF, 0x7B, 0x9, 0x71, 0x24, 0x26, 0x3, 0xF2, 0x74, 0x7B, +0x52, 0xDE, 0x59, 0x3, 0xFF, 0x4E, 0x2C, 0xAF, 0xEE, 0x1F, 0x66, 0xCE, 0x1E, 0xE, 0x26, 0xC, +0xB, 0xC8, 0x17, 0x1E, 0xDB, 0xCB, 0xC0, 0x8C, 0xA, 0x3D, 0xDF, 0x81, 0xFB, 0xC0, 0x89, 0xD0, +0xFF, 0x5E, 0xE9, 0x4A, 0x71, 0xEC, 0x9C, 0xDB, 0x7C, 0x48, 0xDD, 0x3A, 0x16, 0xD2, 0xF7, 0xFB, +0xB1, 0xD6, 0x41, 0xBE, 0xAF, 0x20, 0x19, 0x20, 0x2, 0x59, 0xFD, 0xCF, 0x9E, 0x94, 0x39, 0x65, +0xE5, 0xCE, 0x29, 0x74, 0x8C, 0x75, 0x27, 0x14, 0x67, 0x6C, 0xBB, 0x5E, 0x8B, 0xDD, 0x27, 0x25, +0x33, 0x9B, 0x33, 0xB7, 0x93, 0x94, 0x66, 0xE0, 0x14, 0x45, 0xA5, 0x51, 0x97, 0x9F, 0x20, 0xDB, +0x57, 0x55, 0xD8, 0x45, 0x4E, 0xF6, 0x39, 0xDE, 0x11, 0xF0, 0xDF, 0x7A, 0xB4, 0x4E, 0x59, 0x5C, +0x57, 0xAD, 0x7B, 0x1C, 0xB, 0x5F, 0xD1, 0x8B, 0x54, 0x36, 0xB6, 0xB8, 0xF5, 0xC3, 0xB6, 0xC4, +0x6F, 0xE3, 0xCD, 0x30, 0x56, 0x73, 0x91, 0x44, 0x35, 0xD, 0x8C, 0x7F, 0x1 }; #endif