Skip to content

Commit

Permalink
[Rules] Fix rules handling of set 2...4 when using admin login (letsc…
Browse files Browse the repository at this point in the history
  • Loading branch information
TD-er committed Jun 28, 2020
1 parent ce317f7 commit db94b4c
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 81 deletions.
7 changes: 7 additions & 0 deletions src/WebServer.ino
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,13 @@ void getWebPageTemplateVar(const String& varName)
else if (varName == F("js"))
{
html_add_autosubmit_form();
html_add_script(false);
TXBuffer += jsToastMessageBegin;
// we can push custom messages here in future releases...
addHtml(F("Submitted"));
TXBuffer += jsToastMessageEnd;

html_add_script_end();
}

else if (varName == F("error"))
Expand Down
5 changes: 0 additions & 5 deletions src/WebServer_HTML_wrappers.ino
Original file line number Diff line number Diff line change
Expand Up @@ -257,11 +257,6 @@ void addHtmlError(const String& error) {
}
else
{
TXBuffer += jsToastMessageBegin;

// we can push custom messages here in future releases...
addHtml(F("Submitted"));
TXBuffer += jsToastMessageEnd;
}
}

Expand Down
95 changes: 30 additions & 65 deletions src/WebServer_Rules.ino
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ void handle_rules() {

if (!isLoggedIn() || !Settings.UseRules) { return; }
navMenuIndex = MENU_INDEX_RULES;
static byte currentSet = 1;

const byte rulesSet = getFormItemInt(F("set"), 1);

#if defined(ESP8266)
Expand All @@ -25,80 +23,46 @@ void handle_rules() {

String error;

if (web_server.args() > 0) {
String log = F("Rules : Save rulesSet: ");
log += rulesSet;
log += F(" currentSet: ");
log += currentSet;

if (currentSet == rulesSet) {
if (web_server.hasArg(F("rules"))) {
size_t rulesLength = web_server.arg(F("rules")).length();

// Reported length is with CRLF counted as a single byte.
// So rulesLength > reported_length is a valid situation.
size_t reported_length = getFormItemInt(F("rules_len"), 0);

if (rulesLength > RULES_MAX_SIZE) {
error = F("Error: Data was not saved, exceeds web editor limit!");
}

if (reported_length > rulesLength) {
error = F("Error: Data was not saved, not received all. (");
error += rulesLength;
error += '/';
error += reported_length;
error += ')';
} else {
// Save as soon as possible, as the webserver may already overwrite the args.
const byte *memAddress = reinterpret_cast<const byte *>(web_server.arg(F("rules")).c_str());
error = doSaveToFile(fileName.c_str(), 0, memAddress, rulesLength, "w");
}
} else {
error = F("Error: Data was not saved, rules argument missing or corrupted");
}
// Make sure file exists
if (!ESPEASY_FS.exists(fileName))
{
if (loglevelActiveFor(LOG_LEVEL_INFO)) {
String log = F("Rules : Create new file: ");
log += fileName;
addLog(LOG_LEVEL_INFO, log);
}
else // changed set, check if file exists and create new
{
if (!ESPEASY_FS.exists(fileName))
{
log += F(" Create new file: ");
log += fileName;
fs::File f = tryOpenFile(fileName, "w");
fs::File f = tryOpenFile(fileName, "w");

if (f) { f.close(); }
}
}
addLog(LOG_LEVEL_INFO, log);
if (f) { f.close(); }
}

TXBuffer.startStream();
sendHeadandTail_stdtemplate();
addHtmlError(error);

if (rulesSet != currentSet) {
currentSet = rulesSet;
}

html_table_class_normal();
html_TR();
html_table_header(F("Rules"));

byte choice = rulesSet;
String options[RULESETS_MAX];
int optionValues[RULESETS_MAX];

for (byte x = 0; x < RULESETS_MAX; x++)
{
options[x] = F("Rules Set ");
options[x] += x + 1;
optionValues[x] = x + 1;
}

html_TR_TD();
addHtml(F("<form name = 'frmselect'>"));
addSelector(F("set"), RULESETS_MAX, options, optionValues, NULL, choice, true, true);
addHelpButton(F("Tutorial_Rules"));
addRTDHelpButton(F("Rules/Rules.html"));
{
// Place combo box in its own scope to release these arrays as soon as possible
byte choice = rulesSet;
String options[RULESETS_MAX];
int optionValues[RULESETS_MAX];

for (byte x = 0; x < RULESETS_MAX; x++)
{
options[x] = F("Rules Set ");
options[x] += x + 1;
optionValues[x] = x + 1;
}

addSelector(F("set"), RULESETS_MAX, options, optionValues, NULL, choice, true, true);
addHelpButton(F("Tutorial_Rules"));
addRTDHelpButton(F("Rules/Rules.html"));
}

html_TR_TD();
Rule_showRuleTextArea(fileName);
Expand All @@ -108,12 +72,13 @@ void handle_rules() {
addHtml(F("<button id='save_button' class='button' onClick='saveRulesFile()'>Save</button>"));
addHtml(F("<div id='toastmessage'>Saved!</div>"));

addButton(fileName, F("Download to file"));
html_end_table();

html_add_script(true);
TXBuffer += jsSaveRules;
html_add_script_end();

addButton(fileName, F("Download to file"));
html_end_table();
sendHeadandTail_stdtemplate(true);
TXBuffer.endStream();

Expand Down
44 changes: 33 additions & 11 deletions src/src/Static/WebStaticData.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ static const char DATA_ESPEASY_DEFAULT_MIN_CSS[] PROGMEM = {0x2e,0x63,0x6c,0x6f,
static const char DATA_REBOOT_JS[] PROGMEM = {0x69,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x22,0x72,0x62,0x74,0x6d,0x73,0x67,0x22,0x29,0x2c,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x50,0x6c,0x65,0x61,0x73,0x65,0x20,0x72,0x65,0x62,0x6f,0x6f,0x74,0x3a,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x69,0x64,0x3d,0x27,0x72,0x65,0x62,0x6f,0x6f,0x74,0x27,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x27,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,0x6c,0x69,0x6e,0x6b,0x27,0x20,0x76,0x61,0x6c,0x75,0x65,0x3d,0x27,0x52,0x65,0x62,0x6f,0x6f,0x74,0x27,0x20,0x74,0x79,0x70,0x65,0x3d,0x27,0x73,0x75,0x62,0x6d,0x69,0x74,0x27,0x20,0x6f,0x6e,0x63,0x6c,0x69,0x63,0x6b,0x3d,0x27,0x72,0x28,0x29,0x27,0x3e,0x22,0x3b,0x76,0x61,0x72,0x20,0x78,0x3d,0x6e,0x65,0x77,0x20,0x58,0x4d,0x4c,0x48,0x74,0x74,0x70,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x3b,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x64,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x22,0x2c,0x63,0x6c,0x65,0x61,0x72,0x54,0x69,0x6d,0x65,0x6f,0x75,0x74,0x28,0x74,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x63,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x2e,0x22,0x2c,0x78,0x2e,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x64,0x2c,0x78,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x22,0x47,0x45,0x54,0x22,0x2c,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2e,0x6f,0x72,0x69,0x67,0x69,0x6e,0x29,0x2c,0x78,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x62,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x22,0x52,0x65,0x62,0x6f,0x6f,0x74,0x69,0x6e,0x67,0x2e,0x2e,0x22,0x2c,0x74,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x63,0x2c,0x32,0x65,0x33,0x29,0x7d,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x72,0x28,0x29,0x7b,0x69,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x2b,0x3d,0x22,0x20,0x28,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x29,0x22,0x2c,0x78,0x2e,0x6f,0x6e,0x6c,0x6f,0x61,0x64,0x3d,0x62,0x2c,0x78,0x2e,0x6f,0x70,0x65,0x6e,0x28,0x22,0x47,0x45,0x54,0x22,0x2c,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2e,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2e,0x6f,0x72,0x69,0x67,0x69,0x6e,0x2b,0x22,0x2f,0x3f,0x63,0x6d,0x64,0x3d,0x72,0x65,0x62,0x6f,0x6f,0x74,0x22,0x29,0x2c,0x78,0x2e,0x73,0x65,0x6e,0x64,0x28,0x29,0x7d, 0};

static const char jsToastMessageBegin[] PROGMEM = {
"<script>"
"function toasting() {"
"var x = document.getElementById('toastmessage');"
"x.innerHTML = '"
Expand All @@ -83,7 +82,7 @@ static const char jsToastMessageEnd[] PROGMEM = {
" setTimeout(function(){x.innerHTML = '';"
" x.className = x.className.replace('show', '');"
" }, 2000);"
"} </script>"
"} "
};

static const char jsClipboardCopyPart1[] PROGMEM = {
Expand Down Expand Up @@ -119,15 +118,38 @@ static const char jsClipboardCopyPart3[] PROGMEM = {


static const char jsSaveRules[] PROGMEM = {
"function saveRulesFile(){document.getElementById(\"save_button\");"
"let e=document.getElementById(\"size\"),t=document.getElementById(\"rules\").value;"
"t=t.replace(/\\r?\\n/g,\"\\r\\n\");"
"let n=document.getElementById(\"set\").value,l=new File([t],\"rules\"+n+\".txt\",{type:\"text/plain\"}),a=new FormData;"
"a.append(\"file\",l),a.append(\"enctype\",\"multipart/form-data\");"
"let o=\"/rules\"+n+\".txt?callback=\"+Date.now();"
"fetch(o).then(e=>e.text()).then(l=>{if(t===l)console.log(\"nothing to save...\");"
"else{fetch(\"/upload\",{method:\"POST\",body:a}).then(e=>e.text()).then(l=>{let a=\"/rules\"+n+\".txt?callback=\"+Date.now();"
"fetch(a).then(e=>e.text()).then(n=>{t===n?(toasting(),e.innerHTML=t.length):console.log(\"error when saving...\")})})}})}"
"function saveRulesFile() {"
"\"use strict\";"
"let e = document.getElementById(\"size\");"
"let t = document.getElementById(\"rules\").value;"
"t = t.replace(/\\r?\\n/g, \"\\r\\n\");"
"let n = document.getElementById(\"set\").value;"
"let l = new File([t],\"rules\" + n + \".txt\",{"
"type: \"text/plain\""
"});"
"let a = new FormData();"
"a.append(\"file\", l);"
"a.append(\"enctype\", \"multipart/form-data\");"
"let o = \"/rules\" + n + \".txt?callback=\" + Date.now();"
"fetch(o).then(e=>e.text()).then(l=>{"
"if (t === l)"
"console.log(\"nothing to save...\");"
"else {"
"fetch(\"/upload\", {"
"method: \"POST\","
"body: a"
"}).then(e=>e.text()).then(l=>{"
"let a = \"/rules\" + n + \".txt?callback=\" + Date.now();"
"fetch(a).then(e=>e.text()).then(n=>{"
"if (t === n) {"
"toasting();"
"e.innerHTML = t.length;"
"} else {"
"console.log(\"error when saving...\");"
"}});"
"});"
"}});"
"}"
};

static const char DATA_UPDATE_SENSOR_VALUES_DEVICE_PAGE_JS[] PROGMEM = {0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x20,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x73,0x29,0x7b,0x76,0x61,0x72,0x20,0x61,0x2c,0x6c,0x2c,0x6f,0x3d,0x30,0x3b,0x69,0x73,0x4e,0x61,0x4e,0x28,0x73,0x29,0x26,0x26,0x28,0x73,0x3d,0x31,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x3d,0x3d,0x65,0x26,0x26,0x28,0x65,0x3d,0x31,0x65,0x33,0x29,0x3b,0x76,0x61,0x72,0x20,0x6e,0x3d,0x73,0x65,0x74,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x29,0x7b,0x6f,0x3e,0x30,0x3f,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x3a,0x2b,0x2b,0x73,0x3e,0x31,0x3f,0x6f,0x3d,0x31,0x3a,0x28,0x66,0x65,0x74,0x63,0x68,0x28,0x22,0x2f,0x6a,0x73,0x6f,0x6e,0x3f,0x76,0x69,0x65,0x77,0x3d,0x73,0x65,0x6e,0x73,0x6f,0x72,0x75,0x70,0x64,0x61,0x74,0x65,0x22,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x76,0x61,0x72,0x20,0x6f,0x3b,0x32,0x30,0x30,0x3d,0x3d,0x3d,0x73,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x3f,0x73,0x2e,0x6a,0x73,0x6f,0x6e,0x28,0x29,0x2e,0x74,0x68,0x65,0x6e,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x66,0x6f,0x72,0x28,0x65,0x3d,0x73,0x2e,0x54,0x54,0x4c,0x2c,0x61,0x3d,0x30,0x3b,0x61,0x3c,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x61,0x2b,0x2b,0x29,0x69,0x66,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x68,0x61,0x73,0x4f,0x77,0x6e,0x50,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0x28,0x22,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x22,0x29,0x29,0x66,0x6f,0x72,0x28,0x6c,0x3d,0x30,0x3b,0x6c,0x3c,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x2e,0x6c,0x65,0x6e,0x67,0x74,0x68,0x3b,0x6c,0x2b,0x2b,0x29,0x74,0x72,0x79,0x7b,0x6f,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x7d,0x63,0x61,0x74,0x63,0x68,0x28,0x65,0x29,0x7b,0x6f,0x3d,0x65,0x2e,0x6e,0x61,0x6d,0x65,0x7d,0x66,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x7b,0x69,0x66,0x28,0x22,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x22,0x21,0x3d,0x3d,0x6f,0x29,0x7b,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x2c,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x56,0x61,0x6c,0x75,0x65,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x4e,0x72,0x44,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x2c,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x3d,0x70,0x61,0x72,0x73,0x65,0x46,0x6c,0x6f,0x61,0x74,0x28,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x29,0x2e,0x74,0x6f,0x46,0x69,0x78,0x65,0x64,0x28,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x73,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0x76,0x61,0x72,0x20,0x72,0x3d,0x22,0x76,0x61,0x6c,0x75,0x65,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2b,0x22,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2c,0x74,0x3d,0x22,0x76,0x61,0x6c,0x75,0x65,0x6e,0x61,0x6d,0x65,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2b,0x22,0x5f,0x22,0x2b,0x28,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x56,0x61,0x6c,0x75,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x2d,0x31,0x29,0x2c,0x75,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x72,0x29,0x2c,0x63,0x3d,0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0x2e,0x67,0x65,0x74,0x45,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x42,0x79,0x49,0x64,0x28,0x74,0x29,0x3b,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x3d,0x75,0x26,0x26,0x28,0x75,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x74,0x65,0x6d,0x70,0x56,0x61,0x6c,0x75,0x65,0x29,0x2c,0x6e,0x75,0x6c,0x6c,0x21,0x3d,0x3d,0x63,0x26,0x26,0x28,0x63,0x2e,0x69,0x6e,0x6e,0x65,0x72,0x48,0x54,0x4d,0x4c,0x3d,0x73,0x2e,0x53,0x65,0x6e,0x73,0x6f,0x72,0x73,0x5b,0x61,0x5d,0x2e,0x54,0x61,0x73,0x6b,0x56,0x61,0x6c,0x75,0x65,0x73,0x5b,0x6c,0x5d,0x2e,0x4e,0x61,0x6d,0x65,0x2b,0x22,0x3a,0x22,0x29,0x7d,0x7d,0x65,0x3d,0x73,0x2e,0x54,0x54,0x4c,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x3a,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x22,0x4c,0x6f,0x6f,0x6b,0x73,0x20,0x6c,0x69,0x6b,0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x77,0x61,0x73,0x20,0x61,0x20,0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0x2e,0x20,0x53,0x74,0x61,0x74,0x75,0x73,0x20,0x43,0x6f,0x64,0x65,0x3a,0x20,0x22,0x2b,0x73,0x2e,0x73,0x74,0x61,0x74,0x75,0x73,0x29,0x7d,0x29,0x2e,0x63,0x61,0x74,0x63,0x68,0x28,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x28,0x73,0x29,0x7b,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x6c,0x6f,0x67,0x28,0x73,0x2e,0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x29,0x2c,0x65,0x3d,0x35,0x65,0x33,0x2c,0x63,0x6c,0x65,0x61,0x72,0x49,0x6e,0x74,0x65,0x72,0x76,0x61,0x6c,0x28,0x6e,0x29,0x2c,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x65,0x2c,0x30,0x29,0x7d,0x29,0x2c,0x6f,0x3d,0x31,0x29,0x7d,0x2c,0x65,0x29,0x7d,0x6c,0x6f,0x6f,0x70,0x44,0x65,0x4c,0x6f,0x6f,0x70,0x28,0x31,0x65,0x33,0x2c,0x30,0x29,0x3b, 0};
Expand Down

0 comments on commit db94b4c

Please sign in to comment.