├── LICENSE ├── README.md ├── minimalUploadAuthESP32.ino ├── upload.htm └── upload_htm.h /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Cellie 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # minimalUploadAuthESP32 2 | A simple Arduino IDE authorized upload example for ESP32 with `ESPAsyncWebServer`. 3 | 4 | ## Install 5 | - Install [AsyncTCP](https://github.com/me-no-dev/AsyncTCP) and [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer). 6 | - Change your network credentials in `minimalUploadAuthESP32.ino`. 7 | - Set a `MAX_FILESIZE` in `minimalUploadAuthESP32.ino`. 8 | - Flash your ESP and browse to the ESP web page. 9 | 10 | ## On the file size 11 | The standard `Content-Length` header gives a wrong filesize, so a custom `FileSize` header is used instead. 12 | -------------------------------------------------------------------------------- /minimalUploadAuthESP32.ino: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | 3 | POC to upload a file to esp32 with authorization 4 | 5 | Browse to your esp32 to upload files 6 | 7 | *****************************************************************************/ 8 | #include 9 | #include 10 | 11 | #include "upload_htm.h" 12 | 13 | const char* WIFI_SSID = "----------"; 14 | const char* WIFI_PASSWORD = "----------"; 15 | const char* HTTP_USERNAME = "admin"; 16 | const char* HTTP_PASSWORD = "admin"; 17 | const size_t MAX_FILESIZE = 1024 * 1024 * 15; 18 | 19 | /* format bytes as KB, MB or GB string */ 20 | String humanReadableSize(const size_t bytes) { 21 | if (bytes < 1024) return String(bytes) + " B"; 22 | else if (bytes < (1024 * 1024)) return String(bytes / 1024.0) + " KB"; 23 | else if (bytes < (1024 * 1024 * 1024)) return String(bytes / 1024.0 / 1024.0) + " MB"; 24 | else return String(bytes / 1024.0 / 1024.0 / 1024.0) + " GB"; 25 | } 26 | 27 | void setup() { 28 | Serial.begin(115200); 29 | 30 | WiFi.mode(WIFI_STA); 31 | WiFi.setSleep(false); 32 | WiFi.begin(WIFI_SSID, WIFI_PASSWORD); 33 | Serial.printf("Connecting to WIFI_SSID %s with PSK %s...\n", WIFI_SSID, WIFI_PASSWORD); 34 | if (WiFi.waitForConnectResult() != WL_CONNECTED) { 35 | Serial.printf("WiFi Failed!\n"); 36 | return; 37 | } 38 | 39 | static AsyncWebServer server(80); 40 | static const char* MIMETYPE_HTML{"text/html"}; 41 | 42 | server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) 43 | { 44 | AsyncWebServerResponse *response = request->beginResponse_P(200, MIMETYPE_HTML, upload_htm, upload_htm_len); 45 | response->addHeader("Server", "ESP Async Web Server"); 46 | request->send(response); 47 | }); 48 | 49 | // preflight cors check 50 | server.on("/", HTTP_OPTIONS, [](AsyncWebServerRequest * request) 51 | { 52 | AsyncWebServerResponse* response = request->beginResponse(204); 53 | response->addHeader("Access-Control-Allow-Methods", "PUT,POST,GET,OPTIONS"); 54 | response->addHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization, FileSize"); 55 | response->addHeader("Access-Control-Allow-Credentials", "true"); 56 | request->send(response); 57 | }); 58 | 59 | server.on("/", HTTP_POST, [](AsyncWebServerRequest * request) 60 | { 61 | if (request->authenticate(HTTP_USERNAME, HTTP_PASSWORD)) 62 | request->send(200); 63 | else { 64 | request->send(401); 65 | request->client()->close(); 66 | } 67 | }, 68 | [](AsyncWebServerRequest * request, String filename, size_t index, uint8_t *data, size_t len, bool final) 69 | { 70 | if (!request->authenticate(HTTP_USERNAME, HTTP_PASSWORD)) { 71 | request->send(401); 72 | request->client()->close(); 73 | return; 74 | } 75 | 76 | // https://javascript.info/formdata 77 | 78 | static unsigned long startTimer; 79 | if (!index) { 80 | startTimer = millis(); 81 | const char* FILESIZE_HEADER{"FileSize"}; 82 | 83 | Serial.printf("UPLOAD: Receiving: '%s'\n", filename.c_str()); 84 | 85 | if (!request->hasHeader(FILESIZE_HEADER)) { 86 | request->send(400, MIMETYPE_HTML, "No filesize header present!"); 87 | request->client()->close(); 88 | Serial.printf("UPLOAD: Aborted upload because missing filesize header.\n"); 89 | return; 90 | } 91 | 92 | Serial.printf("UPLOAD: fileSize: %s\n", request->header(FILESIZE_HEADER)); 93 | 94 | if (request->header(FILESIZE_HEADER).toInt() >= MAX_FILESIZE) { 95 | request->send(400, MIMETYPE_HTML, 96 | "Too large. (" + humanReadableSize(request->header(FILESIZE_HEADER).toInt()) + 97 | ") Max size is " + humanReadableSize(MAX_FILESIZE) + "."); 98 | 99 | request->client()->close(); 100 | Serial.printf("UPLOAD: Aborted upload because filesize limit.\n"); 101 | return; 102 | } 103 | } 104 | 105 | //Store or do something with the data... 106 | //Serial.printf("file: '%s' received %i bytes\ttotal: %i\n", filename.c_str(), len, index + len); 107 | 108 | if (final) 109 | Serial.printf("UPLOAD: Done. Received %i bytes in %.2fs which is %.2f kB/s.\n", 110 | index + len, 111 | (millis() - startTimer) / 1000.0, 112 | 1.0 * (index + len) / (millis() - startTimer)); 113 | }); 114 | 115 | server.onNotFound([](AsyncWebServerRequest * request) 116 | { 117 | Serial.printf("NOT_FOUND: "); 118 | if (request->method() == HTTP_GET) 119 | Serial.printf("GET"); 120 | else if (request->method() == HTTP_POST) 121 | Serial.printf("POST"); 122 | else if (request->method() == HTTP_DELETE) 123 | Serial.printf("DELETE"); 124 | else if (request->method() == HTTP_PUT) 125 | Serial.printf("PUT"); 126 | else if (request->method() == HTTP_PATCH) 127 | Serial.printf("PATCH"); 128 | else if (request->method() == HTTP_HEAD) 129 | Serial.printf("HEAD"); 130 | else if (request->method() == HTTP_OPTIONS) 131 | Serial.printf("OPTIONS"); 132 | else 133 | Serial.printf("UNKNOWN"); 134 | 135 | Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str()); 136 | request->send(404, MIMETYPE_HTML, "404 - Not found."); 137 | }); 138 | 139 | DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); 140 | 141 | server.begin(); 142 | 143 | Serial.print("Upload files at "); 144 | Serial.println(WiFi.localIP()); 145 | } 146 | 147 | void loop() { 148 | delay(1000); 149 | } 150 | -------------------------------------------------------------------------------- /upload.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ESP32 UPLOAD 5 | 6 | 7 | 8 | 45 | 46 | 47 |
48 |

Simple authenticated upload example
for ESP32 and ESPAsyncWebServer

49 |

50 | 51 | 52 |

53 | 54 | 55 |

 

56 | 57 |
58 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /upload_htm.h: -------------------------------------------------------------------------------- 1 | unsigned char upload_htm[] = { 2 | 0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x48, 0x54, 3 | 0x4d, 0x4c, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x6c, 0x61, 4 | 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x65, 5 | 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x45, 6 | 0x53, 0x50, 0x33, 0x32, 0x20, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x3c, 7 | 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 8 | 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 9 | 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 10 | 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 11 | 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 12 | 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 13 | 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 14 | 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 15 | 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 16 | 0x65, 0x6c, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 17 | 0x65, 0x66, 0x3d, 0x22, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x3b, 0x62, 0x61, 18 | 0x73, 0x65, 0x36, 0x34, 0x2c, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 19 | 0x4b, 0x47, 0x67, 0x6f, 0x3d, 0x22, 0x3e, 0x20, 0x20, 0x3c, 0x21, 0x2d, 20 | 0x2d, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x76, 21 | 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 22 | 0x73, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 23 | 0x0a, 0x23, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 24 | 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 25 | 0x3a, 0x33, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 26 | 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x20, 0x61, 0x75, 0x74, 27 | 0x6f, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 28 | 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 29 | 0x62, 0x65, 0x69, 0x67, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 30 | 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x63, 0x65, 31 | 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 32 | 0x72, 0x64, 0x65, 0x72, 0x3a, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x31, 33 | 0x70, 0x78, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3b, 0x0a, 0x7d, 0x0a, 34 | 0x23, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 35 | 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x63, 36 | 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 37 | 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 38 | 0x0a, 0x23, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 39 | 0x69, 0x6f, 0x6e, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 40 | 0x67, 0x68, 0x74, 0x3a, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 41 | 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x73, 0x6f, 0x6c, 42 | 0x69, 0x64, 0x20, 0x31, 0x70, 0x78, 0x20, 0x62, 0x6c, 0x61, 0x63, 0x6b, 43 | 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 44 | 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x72, 0x7b, 0x0a, 45 | 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x31, 46 | 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x70, 0x6c, 0x6f, 47 | 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 48 | 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 49 | 0x31, 0x30, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 50 | 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x0a, 51 | 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x31, 52 | 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x73, 0x74, 0x61, 0x74, 53 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 54 | 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x0a, 55 | 0x7d, 0x0a, 0x23, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 56 | 0x6c, 0x73, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 57 | 0x69, 0x6e, 0x3a, 0x32, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 58 | 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x66, 0x6c, 0x65, 0x78, 59 | 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 60 | 0x65, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 61 | 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 62 | 0x3a, 0x34, 0x38, 0x25, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 63 | 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x35, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20, 64 | 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 65 | 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x3c, 66 | 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 67 | 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x20, 68 | 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x64, 0x3d, 69 | 0x22, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x22, 70 | 0x20, 0x65, 0x6e, 0x63, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x6d, 0x75, 71 | 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 72 | 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 73 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 74 | 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 75 | 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 76 | 0x65, 0x64, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x65, 0x78, 77 | 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3c, 0x62, 0x72, 0x3e, 0x66, 0x6f, 0x72, 78 | 0x20, 0x45, 0x53, 0x50, 0x33, 0x32, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x45, 79 | 0x53, 0x50, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x57, 0x65, 0x62, 0x53, 0x65, 80 | 0x72, 0x76, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 81 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 82 | 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 83 | 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 84 | 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 85 | 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 86 | 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x6e, 87 | 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 88 | 0x65, 0x22, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 89 | 0x65, 0x72, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 90 | 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 91 | 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 92 | 0x70, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 93 | 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 94 | 0x72, 0x64, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x61, 95 | 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x70, 0x6c, 0x61, 0x63, 96 | 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x70, 0x61, 0x73, 97 | 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 98 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 99 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 100 | 0x69, 0x64, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 101 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 102 | 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 103 | 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 104 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x72, 0x6f, 0x67, 0x72, 105 | 0x65, 0x73, 0x73, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x70, 0x6c, 0x6f, 106 | 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 107 | 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x30, 0x22, 108 | 0x20, 0x6d, 0x61, 0x78, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0x3c, 0x2f, 0x70, 109 | 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3e, 0x0a, 0x20, 0x20, 0x20, 110 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x20, 0x69, 0x64, 0x3d, 0x22, 111 | 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x22, 0x3e, 112 | 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 113 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 114 | 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 115 | 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 116 | 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 117 | 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x55, 0x70, 0x6c, 118 | 0x6f, 0x61, 0x64, 0x22, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 119 | 0x64, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 120 | 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 121 | 0x6d, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 122 | 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 123 | 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x3e, 0x0a, 0x0a, 124 | 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 125 | 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x20, 0x7b, 126 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x71, 127 | 0x75, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x58, 128 | 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 129 | 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 130 | 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 131 | 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 132 | 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 133 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 134 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 135 | 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x45, 0x52, 0x52, 0x4f, 136 | 0x52, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x20, 0x72, 0x65, 0x71, 0x75, 137 | 0x65, 0x73, 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, 0x27, 138 | 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 139 | 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x6f, 0x6e, 0x74, 140 | 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 141 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 142 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 143 | 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 144 | 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 145 | 0x27, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 146 | 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 147 | 0x75, 0x74, 0x21, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 148 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 149 | 0x2e, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74, 150 | 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 151 | 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 152 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 153 | 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 154 | 0x3d, 0x20, 0x34, 0x30, 0x34, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 155 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 156 | 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 157 | 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 158 | 0x20, 0x3d, 0x20, 0x27, 0x34, 0x30, 0x34, 0x20, 0x2d, 0x20, 0x55, 0x70, 159 | 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6e, 0x6f, 0x74, 160 | 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x65, 161 | 0x72, 0x76, 0x65, 0x72, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 162 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 163 | 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 164 | 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 165 | 0x27, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 166 | 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 167 | 0x66, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 168 | 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x29, 169 | 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 170 | 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x28, 0x74, 171 | 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x20, 172 | 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 173 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 174 | 0x30, 0x30, 0x20, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 175 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 176 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 177 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 178 | 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x55, 0x70, 0x6c, 0x6f, 179 | 0x61, 0x64, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x21, 0x27, 0x3b, 180 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 181 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 182 | 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 183 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 184 | 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 185 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 186 | 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 187 | 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 188 | 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 189 | 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 190 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 191 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 0x70, 0x6c, 0x6f, 192 | 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 193 | 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 194 | 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 195 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 196 | 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 197 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 198 | 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x30, 0x30, 0x20, 0x3a, 0x0a, 199 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 200 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 201 | 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 202 | 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 203 | 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x73, 0x70, 0x6f, 204 | 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 205 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 206 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 207 | 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 208 | 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 209 | 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 210 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 211 | 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 212 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 213 | 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x30, 0x31, 0x20, 214 | 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 215 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 216 | 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 217 | 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 218 | 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x76, 219 | 0x61, 0x6c, 0x69, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 220 | 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 221 | 0x72, 0x64, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 222 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 223 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 224 | 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 0x69, 225 | 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 226 | 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 227 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 228 | 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 229 | 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2e, 230 | 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 231 | 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 232 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 233 | 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 234 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 235 | 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x3a, 0x20, 0x63, 236 | 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 237 | 0x68, 0x74, 0x74, 0x70, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 238 | 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x74, 0x68, 239 | 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x3b, 0x0a, 240 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 241 | 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 242 | 0x20, 0x20, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 243 | 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x75, 0x70, 0x6c, 0x6f, 244 | 0x61, 0x64, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 245 | 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x70, 0x72, 0x6f, 246 | 0x67, 0x72, 0x65, 0x73, 0x73, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 247 | 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 248 | 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 249 | 0x6e, 0x73, 0x74, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 250 | 0x3d, 0x20, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x61, 251 | 0x64, 0x65, 0x64, 0x20, 0x2f, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 252 | 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x30, 253 | 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 254 | 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 255 | 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 256 | 0x4c, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x6f, 0x75, 257 | 0x6e, 0x64, 0x28, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x29, 0x20, 258 | 0x2b, 0x20, 0x27, 0x25, 0x20, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 259 | 0x64, 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x77, 0x61, 260 | 0x69, 0x74, 0x2e, 0x2e, 0x2e, 0x27, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 261 | 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 262 | 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 263 | 0x77, 0x2e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 264 | 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 265 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 266 | 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 267 | 0x74, 0x65, 0x28, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x20, 268 | 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 269 | 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 270 | 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 271 | 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x6d, 0x61, 272 | 0x78, 0x27, 0x2c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x6f, 273 | 0x74, 0x61, 0x6c, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 274 | 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 275 | 0x73, 0x74, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 276 | 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x6c, 0x6f, 0x61, 277 | 0x64, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 278 | 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 279 | 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 280 | 0x73, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 281 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 282 | 0x73, 0x42, 0x61, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 283 | 0x20, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x73, 284 | 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 285 | 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x2c, 0x20, 0x30, 0x29, 0x3b, 286 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 287 | 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 288 | 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x27, 0x6d, 0x61, 0x78, 0x27, 289 | 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 290 | 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 291 | 0x73, 0x74, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x27, 0x50, 0x4f, 0x53, 292 | 0x54, 0x27, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x3b, 0x0a, 0x20, 0x20, 293 | 0x20, 0x20, 0x2f, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 294 | 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x2c, 295 | 0x20, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32, 296 | 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x37, 0x2f, 0x27, 297 | 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x72, 298 | 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 299 | 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 300 | 0x67, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 301 | 0x65, 0x73, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 302 | 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x27, 0x41, 0x75, 303 | 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 304 | 0x2c, 0x20, 0x27, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x27, 0x20, 0x2b, 305 | 0x20, 0x62, 0x74, 0x6f, 0x61, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 306 | 0x2e, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x76, 0x61, 307 | 0x6c, 0x75, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20, 308 | 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x70, 0x61, 0x73, 0x73, 0x77, 309 | 0x6f, 0x72, 0x64, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x3b, 310 | 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 311 | 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 312 | 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 313 | 0x69, 0x6f, 0x6e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5b, 0x30, 0x5d, 314 | 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 315 | 0x74, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 316 | 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x27, 0x46, 0x69, 0x6c, 0x65, 317 | 0x53, 0x69, 0x7a, 0x65, 0x27, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 318 | 0x73, 0x69, 0x7a, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 319 | 0x6c, 0x65, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6e, 320 | 0x65, 0x77, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x28, 321 | 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 322 | 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x27, 0x66, 0x69, 0x6c, 0x65, 323 | 0x27, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 324 | 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 325 | 0x61, 0x74, 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 326 | 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x49, 0x6e, 327 | 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x20, 0x75, 328 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x2e, 0x2e, 0x27, 0x3b, 0x0a, 0x0a, 329 | 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 330 | 0x73, 0x65, 0x6e, 0x64, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x0a, 331 | 0x7d, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 332 | 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 333 | 0x49, 0x64, 0x28, 0x27, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x6c, 0x65, 334 | 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x61, 0x64, 0x64, 0x45, 335 | 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 336 | 0x28, 0x27, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x27, 0x2c, 0x20, 0x66, 337 | 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, 338 | 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 339 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 340 | 0x74, 0x6f, 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 341 | 0x20, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x65, 342 | 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3f, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 343 | 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 344 | 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x74, 345 | 0x75, 0x73, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 346 | 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x26, 0x6e, 0x62, 0x73, 347 | 0x70, 0x3b, 0x27, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 0x0a, 0x64, 0x6f, 348 | 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 349 | 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x75, 350 | 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x75, 0x74, 351 | 0x74, 0x6f, 0x6e, 0x27, 0x29, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 352 | 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 353 | 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 354 | 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x7b, 355 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 356 | 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 357 | 0x74, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 358 | 0x73, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 359 | 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 360 | 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65, 361 | 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x64, 0x69, 0x73, 0x61, 362 | 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 363 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 364 | 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, 0x0a, 365 | 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 366 | 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 367 | 0x6c, 0x3e, 0x0a 368 | }; 369 | unsigned int upload_htm_len = 4383; 370 | --------------------------------------------------------------------------------