esp网页监控面板框架已成,通讯解决

This commit is contained in:
2025-10-29 00:05:05 +08:00
parent c1436f00f0
commit 3db2af8d2f
22 changed files with 13811 additions and 12266 deletions

View File

@@ -0,0 +1,46 @@
import gzip
import os
# 定义文件路径
web_folder = "web"
output_header = "esp8266/web.h"
files_to_compress = ["index.html", "styles.css", "script.js"]
# 压缩文件并生成 C 常量
def compress_file(input_path, output_path):
with open(input_path, 'rb') as f_in:
with gzip.open(output_path, 'wb') as f_out:
f_out.writelines(f_in)
with open(output_path, 'rb') as f: # 修复 os.open 为 open
compressed_data = f.read()
return compressed_data
# 生成 web.h 文件
def generate_header():
with open(output_header, 'w', encoding='utf-8') as header_file:
header_file.write("#ifndef WEB_H\n#define WEB_H\n\n")
for file_name in files_to_compress:
input_path = os.path.join(web_folder, file_name)
output_path = input_path + ".gz"
if os.path.exists(input_path):
compressed_data = compress_file(input_path, output_path)
constant_name = file_name.replace('.', '_').upper()
header_file.write(f"const char {constant_name}[] = {{\n")
header_file.write(",\n".join(
[
", ".join(f"0x{byte:02x}" for byte in compressed_data[i:i+16])
for i in range(0, len(compressed_data), 16)
]
))
header_file.write("\n};\n\n")
header_file.write("#endif // WEB_H\n")
if __name__ == "__main__":
generate_header()
print(f"Header file '{output_header}' generated successfully.")

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,8 @@
#include <LittleFS.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <string.h>
#include "web.h"
#define CONFIG_PIN 0
@@ -16,7 +17,24 @@ typedef struct {
char is_info_valid;
} Config;
uint8_t uart_rx_buffer[512];
typedef union
{
uint8_t send[4];
float data;
} float_data;
bool first_find_tail = false;
uint8_t float_parser_tail[4] = {0x00, 0x00, 0x80, 0x7f};
size_t float_parser_tail_index = 0;
float_data float_parser[101];
size_t float_parser_get_counter = 0;
float_data float_parser_tmp[101];
size_t float_parser_tmp_index = 0;
size_t float_parser_tmp_get_counter = 0;
uint8_t uart_rx_buffer[1024];
size_t uart_rx_buffer_index = 0;
uint8_t uart_tx_buffer[512];
@@ -27,6 +45,8 @@ uint8_t config_mode_counter = 0;
uint8_t config_buffer[1024];
size_t config_buffer_index = 0;
size_t counter_test = 0;
// static uint8_t test_buff[40960] = {0};
@@ -37,7 +57,6 @@ const char* host = "300w-esp";
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
void connectToServer(Config *config) {
if (!client.connect(config->ip, config->port)) {
return;
@@ -124,16 +143,56 @@ void setUpWebServer(){
MDNS.begin(host);
server.on("/", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/html", serverIndex);
server.sendHeader("Content-Encoding", "gzip");
server.send(200, "text/html", INDEX_HTML, sizeof(INDEX_HTML));
});
server.on("/styles.css", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.sendHeader("Content-Encoding", "gzip");
server.send(200, "text/css", STYLES_CSS, sizeof(STYLES_CSS));
});
server.on("/script.js", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.sendHeader("Content-Encoding", "gzip");
server.send(200, "application/javascript", SCRIPT_JS, sizeof(SCRIPT_JS));
});
server.onNotFound([]() {
server.sendHeader("Connection", "close");
server.send(404, "text/html", "Page Not Found");
});
server.on("/status", HTTP_GET, []() {
server.sendHeader("Connection", "close");
String tmp = "{\"data\":[";
for(size_t i=0;i<float_parser_get_counter-1;i++){
// tmp += String(float_parser[i].send[0],10) + ",";
// tmp += String(float_parser[i].send[1],10) + ",";
// tmp += String(float_parser[i].send[2],10) + ",";
// tmp += String(float_parser[i].send[3],10) + ",";
tmp += String(float_parser[i].data,10) + ",";
}
// for(size_t i=0;i<uart_rx_buffer_index;i++){
// tmp += String(uart_rx_buffer[i]) + ",";
// }
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-4]) + ",";
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-3]) + ",";
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-2]) + ",";
// tmp += String(uart_rx_buffer[uart_rx_buffer_index-1]) + ",";
tmp += String(float_parser_get_counter) + ",";
tmp += String(first_find_tail ? 1 : 0) + ",";
tmp += String(float_parser_tail_index) + ",";
tmp += String(1.234567,10);
// tmp.remove(tmp.length()-1);
tmp += "]}";
server.send(200, "application/json", tmp);
});
server.on(
"/update", HTTP_POST, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
server.send(200, "text/html", "finish");
// server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
delay(5000);
ESP.restart();
},
[]() {
@@ -172,9 +231,9 @@ void setUpWebServer(){
void setup() {
LittleFS.begin();
Serial.begin(115200);
Serial.begin(1152000);
Serial.setTimeout(1);
Serial.setRxBufferSize(512);
Serial.setRxBufferSize(1024);
loadConfig(&config);
while (!config.is_info_valid) {
@@ -193,12 +252,9 @@ void setup() {
}
void loop() {
server.handleClient();
MDNS.update();
uart_rx_buffer_index = Serial.readBytes(uart_rx_buffer,64);
// counter_test = 0;
uart_rx_buffer_index = Serial.readBytes(uart_rx_buffer,1024);
if (client.connected()) {
client.write(uart_rx_buffer,uart_rx_buffer_index);
}
@@ -206,11 +262,32 @@ void loop() {
connectToServer(&config);
}
for (size_t i = 0; i < uart_rx_buffer_index; i++) {
if(float_parser_tmp_index < 400 && first_find_tail) {
float_parser_tmp[float_parser_tmp_index/4].send[float_parser_tmp_index%4] = uart_rx_buffer[i];
float_parser_tmp_index++;
if(float_parser_tmp_index % 4 == 0) float_parser_tmp_get_counter++;
}
if(float_parser_tail[0] == uart_rx_buffer[i-3] &&
float_parser_tail[1] == uart_rx_buffer[i-2] &&
float_parser_tail[2] == uart_rx_buffer[i-1] &&
float_parser_tail[3] == uart_rx_buffer[i] && i > 2) {
float_parser_tmp_index = 0;
memcpy(float_parser, float_parser_tmp, sizeof(float_parser_tmp));
float_parser_get_counter = float_parser_tmp_get_counter;
float_parser_tmp_get_counter = 0;
// float_parser_tail_index = 0;
first_find_tail = true;
}
}
while (client.available()) {
uart_tx_buffer_index = client.read(uart_tx_buffer,32);
uart_tx_buffer_index = client.read(uart_tx_buffer,128);
Serial.write(uart_tx_buffer,uart_tx_buffer_index);
}
server.handleClient();
MDNS.update();
config_mode_counter++;
if (config_mode_counter >= 100) {

418
esp8266/esp8266/web.h Normal file
View File

@@ -0,0 +1,418 @@
#ifndef WEB_H
#define WEB_H
const char INDEX_HTML[] = {
0x1f, 0x8b, 0x08, 0x08, 0x9e, 0xe4, 0x00, 0x69, 0x02, 0xff, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e,
0x68, 0x74, 0x6d, 0x6c, 0x00, 0xed, 0x5d, 0xdb, 0x6e, 0xdb, 0xca, 0x15, 0x7d, 0x2f, 0xd0, 0x7f,
0x60, 0x59, 0xf4, 0xc9, 0x51, 0x28, 0x5f, 0x12, 0x3b, 0x8e, 0x24, 0x40, 0xbe, 0xc5, 0xb6, 0x94,
0xc6, 0x6e, 0x9c, 0x38, 0xce, 0xdb, 0x48, 0x1c, 0x51, 0xb4, 0x29, 0x92, 0x1e, 0x0e, 0x29, 0x5b,
0x4f, 0x69, 0xd1, 0x36, 0x69, 0x8c, 0xa6, 0x2d, 0x72, 0x39, 0xe8, 0x09, 0x0e, 0x4e, 0x5a, 0x24,
0x2d, 0xfa, 0x90, 0x20, 0x05, 0x9a, 0xe2, 0x34, 0x29, 0x4e, 0xff, 0x25, 0x88, 0xe4, 0xe4, 0xa9,
0xbf, 0xd0, 0xd9, 0x43, 0x49, 0xa1, 0x69, 0xc9, 0x77, 0xaa, 0x08, 0x39, 0x04, 0x6c, 0x79, 0xcd,
0x6d, 0x93, 0x8b, 0x6b, 0xf6, 0x0c, 0x67, 0xb6, 0xe8, 0xcc, 0x8f, 0x66, 0xae, 0x4d, 0xaf, 0xac,
0x2d, 0xcd, 0x4a, 0x55, 0x5a, 0x33, 0x72, 0x3f, 0xfc, 0x41, 0x06, 0x3e, 0x25, 0x03, 0x99, 0x5a,
0x56, 0xc6, 0xa6, 0xcc, 0x53, 0x30, 0x52, 0xd9, 0xa7, 0xc4, 0x8e, 0x4c, 0x0d, 0x53, 0x24, 0x95,
0xab, 0x88, 0x38, 0x98, 0x66, 0xe5, 0x1b, 0x2b, 0x73, 0xa9, 0x09, 0x79, 0x4f, 0x9e, 0x89, 0x6a,
0x38, 0x2b, 0x7b, 0x3a, 0xae, 0xdb, 0x16, 0xa1, 0xb2, 0x54, 0xb6, 0x4c, 0x8a, 0x4d, 0x56, 0xb6,
0xae, 0xab, 0xb4, 0x9a, 0x55, 0xb1, 0xa7, 0x97, 0x71, 0x8a, 0x83, 0x73, 0x92, 0x6e, 0xea, 0x54,
0x47, 0x46, 0xca, 0x29, 0x23, 0x03, 0x67, 0x87, 0xcf, 0xa7, 0xbb, 0x6d, 0x51, 0x9d, 0x1a, 0x38,
0x37, 0x9a, 0x4e, 0xaf, 0xee, 0x3e, 0x7a, 0xd3, 0x7a, 0xfb, 0x7b, 0x69, 0xf7, 0xe9, 0x1f, 0x5a,
0x0f, 0xfe, 0xfa, 0xe9, 0x9b, 0x3f, 0xb7, 0xbe, 0xf9, 0x4f, 0x46, 0xf1, 0xb3, 0xdb, 0x65, 0x0d,
0xdd, 0xdc, 0x90, 0x08, 0x36, 0xb2, 0xb2, 0xce, 0xac, 0xc9, 0x12, 0xdd, 0xb6, 0xd9, 0x29, 0xe8,
0x35, 0xa4, 0x61, 0x65, 0x2b, 0xe5, 0xa7, 0x55, 0x09, 0xae, 0x64, 0x65, 0x15, 0x51, 0x34, 0x19,
0xcc, 0xb8, 0x5c, 0x42, 0x0e, 0xbe, 0x38, 0x76, 0x2e, 0x9f, 0xcf, 0x4f, 0xe5, 0xf3, 0xb3, 0xf9,
0xe5, 0x59, 0xf6, 0x17, 0xfb, 0x5c, 0xc8, 0x4f, 0x69, 0xcb, 0x5a, 0x3e, 0x3f, 0xc7, 0x7e, 0xf2,
0xd3, 0x9a, 0x9f, 0xcd, 0x0e, 0x2d, 0xdf, 0xc9, 0x6f, 0x1f, 0xb3, 0xf9, 0x3e, 0xc7, 0x8c, 0xa2,
0x28, 0x13, 0x79, 0xf6, 0x4b, 0xc9, 0x2f, 0xb1, 0x5f, 0x75, 0x81, 0x05, 0x4e, 0x28, 0xbe, 0x76,
0x71, 0xf8, 0x86, 0xb6, 0xe4, 0xd2, 0x9b, 0x0b, 0x3f, 0x15, 0x7c, 0x9c, 0x2d, 0x1e, 0x27, 0x37,
0xaf, 0xaf, 0x02, 0xbf, 0x66, 0x43, 0xf0, 0x7b, 0xb6, 0x98, 0xf1, 0x59, 0x98, 0x07, 0x7e, 0xc7,
0x39, 0xbf, 0x15, 0xe0, 0xf7, 0xaa, 0xe0, 0xe7, 0xf4, 0x7a, 0xcd, 0x63, 0xc6, 0xe7, 0xe6, 0x0a,
0xe3, 0xb3, 0xa8, 0x00, 0xbe, 0x08, 0xd8, 0xe4, 0xfe, 0x61, 0x51, 0xf0, 0x75, 0x1a, 0xbd, 0x2e,
0x5c, 0x01, 0x3e, 0x3d, 0xe0, 0xd3, 0x53, 0xba, 0xfc, 0x5e, 0x18, 0x62, 0xb8, 0x06, 0x78, 0x61,
0x41, 0xf0, 0x75, 0xd2, 0xf1, 0x8b, 0xf3, 0xb9, 0x08, 0x7c, 0x2a, 0x43, 0x21, 0x7e, 0x21, 0xbf,
0x46, 0x38, 0xff, 0x82, 0xaf, 0xe3, 0xfb, 0x83, 0x39, 0xd0, 0x2b, 0xf5, 0xba, 0x7c, 0x86, 0xf9,
0x1d, 0x83, 0xfc, 0x5a, 0x09, 0xf8, 0x9d, 0x13, 0xfc, 0x1d, 0xcb, 0x1f, 0x6c, 0x70, 0xff, 0xea,
0xee, 0xe5, 0x33, 0xcc, 0xef, 0x28, 0xe4, 0xd7, 0xe6, 0xa1, 0xfc, 0xac, 0xe0, 0xef, 0x88, 0xfe,
0x60, 0x1d, 0xe6, 0x03, 0xc5, 0xe1, 0x5e, 0x7c, 0x86, 0xf1, 0x08, 0x60, 0x63, 0x14, 0xf8, 0x9d,
0x11, 0xfc, 0x1d, 0xee, 0x0f, 0x56, 0xb8, 0x5e, 0x1b, 0x7d, 0xf9, 0x0c, 0xe3, 0x61, 0xce, 0xaf,
0x09, 0xfc, 0x4e, 0x0b, 0x3e, 0x0f, 0xf2, 0x07, 0x8b, 0x25, 0xce, 0xdf, 0x21, 0xfe, 0x20, 0x8c,
0xd3, 0x9c, 0x5f, 0x98, 0xaf, 0x2d, 0x4c, 0x09, 0x3e, 0xfb, 0xf8, 0x03, 0x73, 0xfd, 0xc8, 0x7c,
0xee, 0xe3, 0x17, 0xc6, 0xb7, 0x0d, 0x45, 0xf0, 0xdb, 0xc7, 0x1f, 0x18, 0xc7, 0xd4, 0x6b, 0x18,
0x6f, 0x03, 0xde, 0x68, 0x08, 0x3e, 0xf7, 0xad, 0xc7, 0x14, 0xb6, 0x4e, 0xc2, 0xe7, 0x3e, 0x7e,
0xa1, 0xbd, 0x8d, 0x8a, 0xe0, 0xb7, 0xad, 0xd7, 0x69, 0xd0, 0xab, 0x53, 0x3c, 0x31, 0x9f, 0x61,
0xbc, 0xc5, 0xf9, 0x2d, 0x8a, 0xf1, 0xeb, 0xe6, 0xc2, 0x12, 0xf7, 0x97, 0xa7, 0xf4, 0x07, 0x61,
0x5c, 0xe7, 0xf3, 0xb9, 0xd1, 0x64, 0xfb, 0x83, 0x2a, 0x9f, 0x6f, 0xad, 0x9f, 0x05, 0x9f, 0x61,
0xec, 0x02, 0x5e, 0x27, 0x89, 0xf5, 0x07, 0x45, 0xbe, 0x1e, 0x33, 0x73, 0x66, 0x7c, 0x86, 0x31,
0xe5, 0xfc, 0xde, 0x4a, 0xe2, 0x7c, 0x76, 0x1a, 0xae, 0x7f, 0x08, 0x9f, 0x2d, 0x9f, 0x61, 0xec,
0x80, 0xbf, 0x59, 0x2f, 0x26, 0xcb, 0x1f, 0x18, 0xb0, 0x1e, 0x50, 0x9c, 0x88, 0x82, 0xcf, 0x00,
0x1e, 0x02, 0x4c, 0x80, 0x5f, 0x7d, 0x34, 0x31, 0xfe, 0x00, 0x45, 0xac, 0xd7, 0x00, 0xbe, 0x04,
0x78, 0x13, 0xf8, 0xad, 0xae, 0xc4, 0x77, 0x3f, 0x81, 0xaf, 0x5f, 0x15, 0x8f, 0xbc, 0x1e, 0x73,
0x5a, 0xdc, 0xe0, 0xf3, 0xb1, 0xf9, 0xd8, 0xf2, 0xb9, 0x0c, 0xd7, 0xe7, 0x8c, 0x0f, 0x42, 0x9f,
0x65, 0xbe, 0x7f, 0x09, 0xfd, 0x41, 0x9b, 0x8f, 0xed, 0xfa, 0x2b, 0x71, 0x07, 0xd0, 0xdf, 0x5d,
0x58, 0x3f, 0x5f, 0xac, 0x03, 0x9e, 0xf2, 0xe2, 0x38, 0x3f, 0x85, 0xf5, 0xa7, 0xc2, 0xf2, 0x20,
0xc6, 0xfb, 0x4b, 0x70, 0xbf, 0xac, 0x5b, 0x70, 0xff, 0x96, 0xe3, 0xd8, 0xbf, 0xa7, 0xdc, 0xce,
0x7e, 0x6b, 0xd1, 0x8b, 0xb8, 0x7f, 0xf3, 0xf9, 0x83, 0x09, 0xf7, 0xab, 0xea, 0xc5, 0xd6, 0x5f,
0xde, 0x38, 0x64, 0xff, 0xea, 0xec, 0x70, 0xa1, 0x01, 0xb8, 0xe0, 0xc5, 0xf6, 0xf9, 0x9e, 0xaf,
0x47, 0x79, 0x43, 0x03, 0xf0, 0x97, 0x0e, 0xac, 0xd7, 0x2e, 0xc6, 0xf8, 0x79, 0x1e, 0xc6, 0xef,
0x02, 0xe6, 0xd7, 0x1b, 0xb1, 0xbf, 0xf4, 0xf7, 0xb7, 0x4a, 0xb1, 0x5c, 0xbf, 0x86, 0xeb, 0x9b,
0x01, 0x3e, 0x2d, 0x1e, 0xaf, 0x32, 0x12, 0xb1, 0xbf, 0x24, 0xfc, 0xf9, 0x00, 0xb0, 0x56, 0x8a,
0x63, 0xff, 0xe6, 0xcf, 0xeb, 0x6b, 0x30, 0xfe, 0xb8, 0xa5, 0x88, 0xfd, 0x25, 0x5f, 0xdf, 0x9e,
0xe5, 0xf7, 0x2f, 0xbe, 0xeb, 0x1f, 0x5c, 0x9f, 0x8d, 0x88, 0xe7, 0x97, 0x43, 0x80, 0x6d, 0x1e,
0xdf, 0x72, 0x3b, 0xb6, 0xfe, 0x52, 0x87, 0xf1, 0xa0, 0xe0, 0x0e, 0xe2, 0xf9, 0x91, 0x00, 0xd6,
0x49, 0x6c, 0xe7, 0x43, 0x73, 0xc0, 0xa7, 0x0d, 0xf3, 0xe7, 0xe2, 0x78, 0xc4, 0x7c, 0xf2, 0xf8,
0xcc, 0xa5, 0x44, 0xec, 0x2f, 0x57, 0xa2, 0xf5, 0x97, 0x14, 0xe2, 0x27, 0x16, 0x7f, 0xc6, 0xd7,
0x53, 0x2a, 0x89, 0xd9, 0x4f, 0xd2, 0x4e, 0x12, 0x0f, 0x71, 0x24, 0xbc, 0x59, 0x4c, 0x6e, 0x3c,
0x15, 0x5f, 0x3f, 0x2a, 0x45, 0x36, 0x3f, 0xe2, 0x41, 0x80, 0xc9, 0x8c, 0xdf, 0xa1, 0x91, 0xf5,
0xff, 0xcd, 0xf1, 0xc4, 0xee, 0xcf, 0x5d, 0xb9, 0x76, 0xbc, 0x78, 0xb3, 0xe3, 0xe2, 0x55, 0x2f,
0xa9, 0x7a, 0x2d, 0x5c, 0x8c, 0x6e, 0xbd, 0x93, 0xc7, 0x53, 0xae, 0x25, 0x51, 0xaf, 0x6b, 0x11,
0xcf, 0xf7, 0x9d, 0x44, 0xc6, 0x3f, 0xf0, 0xfd, 0xf9, 0xb1, 0x68, 0xe7, 0xab, 0x8b, 0xe5, 0x24,
0xea, 0x35, 0xea, 0xfd, 0x8f, 0x71, 0xbe, 0xbe, 0x4c, 0x92, 0xa5, 0x57, 0xa3, 0x32, 0x88, 0xf5,
0xe6, 0xed, 0x84, 0xc5, 0x97, 0x15, 0xe0, 0xfa, 0x27, 0x06, 0xb1, 0x5f, 0x57, 0x4b, 0x98, 0x7f,
0x0d, 0x7c, 0xdf, 0x2f, 0xc2, 0xf5, 0x00, 0xbe, 0x7e, 0x73, 0xc5, 0x4b, 0xcc, 0xf3, 0x40, 0x71,
0x10, 0xeb, 0x55, 0x1c, 0x93, 0x52, 0x62, 0xc6, 0xab, 0x29, 0x18, 0x4f, 0xdc, 0xc6, 0x20, 0xf4,
0xca, 0xf1, 0x5a, 0x72, 0x9e, 0x07, 0x6e, 0x0f, 0x4c, 0xaf, 0x3c, 0xde, 0x72, 0xa1, 0x9c, 0x04,
0xbd, 0x2e, 0x0d, 0x0d, 0x2c, 0x9e, 0xec, 0x73, 0xbc, 0xa9, 0x36, 0x1f, 0xef, 0xf1, 0x4a, 0xe3,
0xf1, 0x64, 0xc6, 0xe0, 0xf4, 0xca, 0x9f, 0x0f, 0xd6, 0x93, 0xa0, 0xd7, 0x75, 0x3c, 0x58, 0xbd,
0x4e, 0xf8, 0xfb, 0xe1, 0x31, 0xff, 0x3e, 0xea, 0xca, 0xc0, 0xf8, 0x0c, 0x3c, 0x1f, 0x5c, 0x88,
0xfb, 0x7e, 0x41, 0x37, 0xbe, 0x61, 0x80, 0x7a, 0xf5, 0x9f, 0x0f, 0x6e, 0xc5, 0x5b, 0xaf, 0xd6,
0xfc, 0xff, 0x41, 0xaf, 0xc5, 0x6d, 0xc0, 0xf3, 0xf1, 0x8d, 0x9f, 0xb2, 0x07, 0xcc, 0x67, 0xe0,
0xf9, 0xc0, 0x8b, 0xef, 0xf7, 0x57, 0xb9, 0x5e, 0xcd, 0xee, 0xfc, 0xb5, 0x06, 0xe3, 0x97, 0xcd,
0xf1, 0x66, 0x37, 0xbe, 0x7e, 0x93, 0x44, 0x86, 0xaf, 0x26, 0x73, 0xff, 0x40, 0x60, 0x81, 0x05,
0x16, 0x58, 0x60, 0x81, 0xbb, 0x58, 0x1c, 0xe2, 0x48, 0xde, 0x91, 0xcd, 0xca, 0xfb, 0xdf, 0x75,
0xec, 0xd0, 0x6d, 0x03, 0x3b, 0x55, 0x8c, 0x69, 0xe7, 0xed, 0xc6, 0x7e, 0xca, 0xf9, 0xb2, 0xe3,
0xf0, 0xd7, 0x36, 0x2b, 0xed, 0xf7, 0x36, 0x67, 0x4a, 0x96, 0xba, 0xdd, 0xa9, 0xaf, 0xea, 0x9e,
0x54, 0x36, 0x90, 0xe3, 0x64, 0x65, 0x78, 0x33, 0x33, 0xd2, 0x4d, 0x4c, 0x3a, 0x8d, 0x77, 0x0b,
0xe8, 0x2a, 0x6b, 0x4c, 0x57, 0x71, 0xaa, 0xe4, 0x52, 0x0a, 0x6f, 0x4f, 0x6e, 0xd7, 0x70, 0xaa,
0x56, 0x3d, 0x85, 0x08, 0xb1, 0xea, 0xc1, 0x2a, 0xbc, 0x9a, 0x5f, 0x92, 0xd7, 0xa4, 0x96, 0xa6,
0x19, 0x38, 0x05, 0x0d, 0x94, 0x10, 0x6b, 0xfc, 0xfd, 0x57, 0x77, 0x32, 0x8a, 0x9f, 0x1f, 0x34,
0xa4, 0x30, 0x4b, 0x41, 0x8c, 0xa0, 0x42, 0xd7, 0x52, 0xa7, 0xf2, 0x5e, 0x33, 0x21, 0xa3, 0x26,
0xf2, 0x42, 0x05, 0x78, 0xb2, 0x6b, 0xf4, 0x48, 0x6d, 0xb3, 0x97, 0xcb, 0xa0, 0x36, 0x5b, 0x3f,
0x96, 0xf9, 0xd9, 0xda, 0x48, 0xc3, 0xc3, 0x29, 0xa0, 0x55, 0xce, 0xb5, 0x1e, 0xbf, 0x6e, 0xfd,
0xf6, 0x15, 0xbc, 0x69, 0xfa, 0xcd, 0x4e, 0x46, 0x41, 0xb9, 0x8c, 0xc2, 0x2a, 0x1c, 0xaf, 0xa9,
0x91, 0x76, 0x53, 0xcd, 0xa7, 0x6f, 0x3f, 0xbc, 0xfb, 0x67, 0xeb, 0xe9, 0x3f, 0x5a, 0x4f, 0x5e,
0x1f, 0xd0, 0x54, 0x46, 0xd9, 0x77, 0xb2, 0x19, 0x65, 0xef, 0x65, 0xb1, 0xda, 0xc0, 0xc6, 0xa1,
0x54, 0x49, 0xfc, 0xf6, 0xb3, 0xb3, 0xb0, 0x1c, 0x9d, 0xea, 0x96, 0x39, 0x09, 0x32, 0x41, 0x54,
0xf7, 0xf0, 0xe5, 0x46, 0x4a, 0x37, 0x55, 0xbc, 0x35, 0x29, 0xa5, 0x2f, 0x4b, 0x36, 0x52, 0x55,
0xdd, 0xd4, 0x52, 0x25, 0x8b, 0xdd, 0x90, 0x1a, 0x4f, 0xaa, 0x62, 0x5d, 0xab, 0xd2, 0x49, 0xe9,
0x52, 0xfa, 0x27, 0xfd, 0x09, 0xef, 0x71, 0x1a, 0x35, 0xa6, 0x9e, 0xa0, 0x98, 0xb0, 0x49, 0xf7,
0xe9, 0xa2, 0x23, 0x27, 0x4e, 0x73, 0x57, 0x48, 0x80, 0x24, 0x54, 0x86, 0x93, 0x93, 0x7b, 0xb1,
0x12, 0x50, 0x29, 0xb5, 0xec, 0x94, 0x46, 0x74, 0x55, 0xee, 0x77, 0x23, 0x02, 0x65, 0x1d, 0x8a,
0xa8, 0xeb, 0xa4, 0xca, 0x88, 0xf4, 0x2d, 0xce, 0xab, 0x54, 0x47, 0x72, 0xad, 0x3b, 0xef, 0x3e,
0x7e, 0xff, 0xb0, 0xf9, 0xab, 0x17, 0xac, 0x9b, 0x8c, 0x1c, 0x54, 0xb6, 0x77, 0xf3, 0x8c, 0xd0,
0x8a, 0x75, 0x90, 0x8d, 0x6e, 0xdd, 0xf6, 0x5d, 0x29, 0x5b, 0x86, 0x45, 0x26, 0xa5, 0x92, 0xe1,
0xe2, 0xcb, 0x72, 0x6e, 0xf7, 0xd1, 0x9b, 0xe6, 0x83, 0x9d, 0x49, 0x29, 0xe3, 0xd8, 0xa8, 0x4b,
0xa1, 0x67, 0x19, 0x94, 0xf1, 0x22, 0xe7, 0xd2, 0xe7, 0xd3, 0xe9, 0x8c, 0x02, 0x59, 0x39, 0xe9,
0x66, 0xb8, 0x9f, 0x1c, 0xd1, 0x90, 0x46, 0x30, 0x36, 0x7d, 0x4b, 0xad, 0x37, 0x3f, 0x0f, 0x59,
0x2a, 0xbb, 0x84, 0xf0, 0x9b, 0x15, 0xb4, 0x94, 0x3f, 0xa1, 0x25, 0x8b, 0x20, 0x53, 0x83, 0x8b,
0x6a, 0xde, 0xff, 0x76, 0xf7, 0xc1, 0xdd, 0x90, 0x29, 0xdb, 0xaa, 0x83, 0x83, 0x09, 0x1a, 0x5a,
0x3d, 0xa1, 0x21, 0x82, 0x55, 0x66, 0xe5, 0xe3, 0xcb, 0xbf, 0xb4, 0xee, 0xbf, 0x08, 0x59, 0x41,
0x06, 0x26, 0xec, 0x72, 0x5a, 0x5f, 0x3d, 0x6b, 0x1b, 0x39, 0xcc, 0xc4, 0xa1, 0xf9, 0x65, 0x64,
0x7a, 0xc8, 0xe9, 0x12, 0x56, 0x45, 0xf0, 0x2e, 0x7b, 0xff, 0x15, 0xf6, 0xf2, 0x68, 0x3a, 0x2d,
0xb7, 0x3b, 0x4d, 0x56, 0x1e, 0x66, 0x80, 0x99, 0xf3, 0xcb, 0x1f, 0x55, 0x48, 0x98, 0x52, 0xd6,
0x07, 0x1d, 0xff, 0xdd, 0xf4, 0xb9, 0xf7, 0x5f, 0xff, 0xf1, 0xbf, 0xdf, 0xfd, 0xee, 0xa0, 0x53,
0x3a, 0x30, 0xef, 0x84, 0x1d, 0x60, 0xe7, 0x61, 0xf3, 0xef, 0x8f, 0xa1, 0x0f, 0xdc, 0x7d, 0x2b,
0xfa, 0x80, 0xe8, 0x03, 0x5f, 0x6c, 0x1f, 0xe8, 0x9b, 0xbe, 0x5f, 0xb5, 0x11, 0x8c, 0x23, 0x37,
0xae, 0x4f, 0x49, 0xc3, 0xa2, 0xff, 0x88, 0xfe, 0x73, 0xaa, 0xfe, 0x73, 0xe1, 0xcb, 0x1c, 0x43,
0x40, 0xfc, 0x23, 0x42, 0xfc, 0x42, 0xfc, 0x49, 0x15, 0xff, 0xa8, 0x10, 0xbf, 0x10, 0x7f, 0x52,
0xc5, 0x3f, 0x26, 0xc4, 0x2f, 0xc4, 0x9f, 0x44, 0xf1, 0xcf, 0x4c, 0x8b, 0x29, 0xbf, 0xd0, 0x7e,
0x62, 0xb5, 0x2f, 0x66, 0xfc, 0x42, 0xfb, 0x49, 0xd5, 0xbe, 0x98, 0xf0, 0x0b, 0xed, 0x27, 0x55,
0xfb, 0x62, 0xbe, 0x2f, 0xb4, 0xff, 0xe5, 0x6a, 0xbf, 0x57, 0x7a, 0xcf, 0xb4, 0xe0, 0x8e, 0xf5,
0xc8, 0x9e, 0x1d, 0xeb, 0x9e, 0x5b, 0xd5, 0xd5, 0xe1, 0xdc, 0xaa, 0x3e, 0xa7, 0xef, 0xdd, 0xef,
0x67, 0x89, 0x3d, 0x8a, 0x56, 0x2c, 0x52, 0xe3, 0x4d, 0xbb, 0xb6, 0x61, 0x21, 0x35, 0x05, 0xf8,
0xc0, 0xed, 0x08, 0x28, 0xab, 0x12, 0xcb, 0x4e, 0x35, 0x2c, 0x93, 0x59, 0x6f, 0xbe, 0xfe, 0x75,
0xeb, 0xc9, 0x5d, 0x30, 0xb3, 0xf3, 0xa4, 0xf5, 0xe8, 0xfb, 0xe6, 0xbd, 0xd7, 0xad, 0x97, 0xcf,
0x9b, 0xcf, 0x7f, 0xd9, 0xba, 0xf7, 0x64, 0xf7, 0x17, 0xff, 0x6a, 0xde, 0x7d, 0xf7, 0xe9, 0xce,
0x6f, 0x5a, 0x3b, 0x7f, 0xf3, 0xcb, 0x1c, 0xc8, 0x91, 0x6e, 0xda, 0x2e, 0x6d, 0xff, 0x9f, 0xec,
0x8a, 0x6e, 0x60, 0x3f, 0x7e, 0xa1, 0xa2, 0x93, 0x5a, 0x1d, 0x11, 0x9c, 0xf2, 0x93, 0xfc, 0xff,
0xe4, 0xed, 0xda, 0x2a, 0xa2, 0x0c, 0x55, 0x75, 0x55, 0xc5, 0x26, 0x53, 0xd6, 0xa6, 0xab, 0x33,
0x79, 0xf5, 0x6b, 0xd9, 0x26, 0x16, 0xeb, 0x4f, 0x8e, 0x13, 0xbc, 0xce, 0x4e, 0x9a, 0x2c, 0x79,
0x88, 0x75, 0xea, 0xac, 0xcc, 0x34, 0x51, 0x43, 0x5b, 0xdd, 0x7d, 0xa3, 0x4e, 0x7e, 0xbf, 0x36,
0xdb, 0xb1, 0x25, 0xfe, 0xe9, 0x76, 0x42, 0x52, 0x02, 0xed, 0xb7, 0x93, 0x72, 0xbb, 0x7f, 0x7a,
0xf5, 0xf1, 0xd5, 0xf3, 0x0f, 0xdf, 0xdd, 0xff, 0xf0, 0xef, 0x67, 0x3d, 0x22, 0x4e, 0x3e, 0xdf,
0x75, 0x20, 0xfe, 0x10, 0x29, 0x64, 0x14, 0x88, 0x6e, 0xe8, 0x44, 0xcd, 0x04, 0x32, 0x33, 0x4e,
0x99, 0xe8, 0x36, 0x95, 0x1c, 0x52, 0x66, 0xea, 0xe4, 0x7f, 0x9f, 0x5f, 0x77, 0xe0, 0x32, 0x7c,
0xc0, 0x23, 0x6f, 0xda, 0x11, 0x37, 0x4c, 0x08, 0xf0, 0x4f, 0xd5, 0xff, 0x07, 0x74, 0x09, 0x69,
0x48, 0x64, 0x7d, 0x00, 0x00
};
const char STYLES_CSS[] = {
0x1f, 0x8b, 0x08, 0x08, 0x9e, 0xe4, 0x00, 0x69, 0x02, 0xff, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73,
0x2e, 0x63, 0x73, 0x73, 0x00, 0xbd, 0x58, 0xdd, 0x4f, 0xdb, 0xc8, 0x16, 0x7f, 0x47, 0xe2, 0x7f,
0xb0, 0x54, 0x55, 0x82, 0xaa, 0xa6, 0x4e, 0x20, 0xb4, 0xa5, 0x2f, 0xfb, 0x21, 0xed, 0xbe, 0xae,
0xee, 0x3e, 0xdd, 0xc7, 0x89, 0x3d, 0x49, 0x7c, 0xd7, 0xb1, 0x23, 0xdb, 0x01, 0xda, 0xab, 0x4a,
0x85, 0x2e, 0x9b, 0xf2, 0x5d, 0x55, 0xcb, 0xc2, 0x52, 0xda, 0x05, 0xd4, 0x6d, 0xab, 0xee, 0x36,
0x5d, 0x56, 0xd0, 0x06, 0x28, 0xed, 0x1f, 0x73, 0x33, 0x4e, 0x78, 0xda, 0x7f, 0xe1, 0x1e, 0x8f,
0xc7, 0xf6, 0xd8, 0x19, 0x07, 0xd8, 0x5e, 0x5d, 0x02, 0xc8, 0x19, 0xcf, 0x39, 0x73, 0x3e, 0x7e,
0xe7, 0x63, 0xce, 0xb5, 0x2b, 0xd2, 0xd7, 0xd8, 0xc4, 0x36, 0x32, 0x24, 0xc7, 0xbd, 0x6d, 0x60,
0x47, 0xba, 0x72, 0x6d, 0x70, 0xa0, 0x68, 0x69, 0xb7, 0xa5, 0x7f, 0x0f, 0x0e, 0x48, 0xf0, 0x53,
0xb2, 0x4c, 0x57, 0x2e, 0xa1, 0xaa, 0x6e, 0xdc, 0x9e, 0x90, 0x3e, 0xb7, 0x75, 0x64, 0x5c, 0x95,
0x1c, 0x64, 0x3a, 0xb2, 0x83, 0x6d, 0xbd, 0x74, 0x2b, 0xd8, 0x54, 0x45, 0x76, 0x59, 0x37, 0x27,
0x24, 0x85, 0x7d, 0xaf, 0x21, 0x4d, 0xd3, 0xcd, 0x72, 0xbc, 0xa0, 0xe9, 0x4e, 0xcd, 0x40, 0xc0,
0xa1, 0x64, 0xe0, 0x69, 0xb6, 0x56, 0xc1, 0x7a, 0xb9, 0xe2, 0x4e, 0x48, 0x39, 0x45, 0x99, 0xac,
0xc0, 0xda, 0xdd, 0xc1, 0x81, 0xc1, 0x81, 0x11, 0x15, 0xce, 0x43, 0x3a, 0x88, 0x14, 0x0a, 0x20,
0x22, 0x9d, 0xd2, 0x35, 0xb7, 0x42, 0x29, 0x2f, 0x87, 0x84, 0xd7, 0xae, 0x48, 0xdf, 0xea, 0x1a,
0x2e, 0x22, 0x9b, 0xd7, 0x64, 0xc4, 0x61, 0x6b, 0x8c, 0x59, 0xcd, 0x72, 0x74, 0x57, 0xb7, 0x40,
0xd4, 0x92, 0x3e, 0x8d, 0xb5, 0x5b, 0x12, 0x90, 0x91, 0xc7, 0x47, 0xa4, 0xb9, 0x49, 0xb6, 0x5e,
0x9e, 0xee, 0x1c, 0x9c, 0x3e, 0xd9, 0x25, 0xef, 0x9e, 0xb7, 0x3f, 0xbc, 0xa0, 0xd4, 0x3e, 0x85,
0x6b, 0xd5, 0x62, 0x35, 0x0c, 0x5c, 0x72, 0xe3, 0x6f, 0x9c, 0x02, 0x97, 0x03, 0x4e, 0xcb, 0xdb,
0xde, 0xf1, 0x4e, 0xc0, 0xe6, 0xf4, 0xb7, 0x0d, 0x72, 0xf4, 0x3c, 0x62, 0x63, 0x4d, 0x62, 0xbb,
0x64, 0x58, 0x53, 0x32, 0x28, 0x82, 0xea, 0xae, 0x15, 0xec, 0x7f, 0x3e, 0xeb, 0x3d, 0xdd, 0x22,
0x3f, 0xcc, 0x91, 0xe6, 0x61, 0xf7, 0x63, 0x83, 0x3c, 0xdb, 0xfc, 0xeb, 0xfd, 0x12, 0x99, 0x9b,
0xe9, 0x36, 0x5b, 0xde, 0xf1, 0x26, 0x59, 0x78, 0x19, 0x91, 0x33, 0x85, 0xf3, 0x8a, 0x52, 0x0b,
0x6d, 0x50, 0x44, 0xea, 0x77, 0x65, 0xdb, 0xaa, 0x9b, 0x9a, 0xac, 0x5a, 0x86, 0x65, 0x4f, 0x48,
0x97, 0x46, 0x47, 0x47, 0xd9, 0x4b, 0xb6, 0x32, 0x55, 0xd1, 0x5d, 0x9c, 0xf6, 0x49, 0xae, 0x10,
0xf1, 0x70, 0x6d, 0xf0, 0x24, 0x33, 0x08, 0x3d, 0x42, 0x52, 0x46, 0x46, 0x9d, 0xab, 0xe1, 0x5e,
0xfa, 0x8d, 0x6d, 0xbd, 0x23, 0xeb, 0xa6, 0x86, 0xa7, 0x81, 0x9c, 0x8a, 0xde, 0x6d, 0x7e, 0xe8,
0x9c, 0x34, 0xc1, 0x50, 0xdd, 0x0f, 0x87, 0xde, 0xf6, 0x2a, 0xd9, 0x9b, 0xed, 0x1c, 0xbd, 0x68,
0xb7, 0x8e, 0xa4, 0x1c, 0x95, 0x39, 0xf0, 0x65, 0x68, 0x7c, 0x13, 0x4d, 0x4a, 0x75, 0x23, 0xf4,
0x81, 0xa1, 0x3b, 0xae, 0x4c, 0x7d, 0x34, 0x21, 0x99, 0x96, 0x89, 0x45, 0x98, 0x11, 0xd2, 0x1b,
0x7a, 0xc8, 0x22, 0xc4, 0x5b, 0x0e, 0xcc, 0xd1, 0x77, 0x3f, 0x0a, 0x29, 0x04, 0x06, 0x71, 0xf1,
0xb4, 0x2b, 0x6b, 0x58, 0xb5, 0x6c, 0x14, 0x58, 0x80, 0x13, 0x26, 0x04, 0xd8, 0xf5, 0xc0, 0xde,
0x21, 0xc2, 0x44, 0x27, 0x4c, 0x54, 0x7c, 0xdf, 0x86, 0xe7, 0xf4, 0x30, 0x05, 0xff, 0x60, 0xdb,
0xd0, 0x29, 0xe7, 0xbb, 0xd4, 0x36, 0x9c, 0xa0, 0xa8, 0x07, 0xe4, 0x45, 0xc3, 0x52, 0xbf, 0xa3,
0x16, 0xf6, 0xd6, 0xf6, 0xbb, 0x3b, 0x4b, 0x64, 0xf5, 0x4d, 0x67, 0xf6, 0x90, 0x34, 0x8e, 0x23,
0x28, 0xc4, 0x7e, 0xf4, 0x95, 0xe7, 0x9d, 0x29, 0xd4, 0x87, 0xe2, 0x6c, 0xe5, 0xd8, 0x5b, 0x99,
0x6f, 0xb7, 0x16, 0xc9, 0x83, 0x47, 0x9d, 0xa3, 0x8f, 0x11, 0xab, 0x10, 0x37, 0x58, 0x2d, 0x29,
0xa5, 0xc0, 0xaf, 0xa7, 0xc7, 0x1b, 0xdd, 0xe6, 0x33, 0xef, 0xa7, 0x06, 0x79, 0xbd, 0x7e, 0xba,
0xbb, 0xd5, 0x9d, 0xff, 0x33, 0xda, 0x2d, 0x02, 0xdc, 0xd8, 0xd8, 0xcd, 0x02, 0xe6, 0x08, 0xbb,
0xf7, 0x97, 0xbc, 0x9f, 0xdf, 0xa4, 0x09, 0x2d, 0x1b, 0x6c, 0x20, 0xdb, 0x48, 0xd3, 0xeb, 0xce,
0x84, 0x24, 0x86, 0x5f, 0x9a, 0x3b, 0x43, 0x62, 0xfc, 0x1c, 0x18, 0xe5, 0xdd, 0x31, 0x59, 0xd8,
0x86, 0x58, 0xf1, 0x5a, 0x3b, 0xde, 0xda, 0x03, 0x88, 0x1e, 0x01, 0xdc, 0x52, 0x2e, 0x11, 0xc8,
0x9d, 0x43, 0x45, 0xf5, 0xa6, 0x1a, 0x70, 0x9c, 0xfd, 0x9d, 0xcc, 0x6c, 0x79, 0xeb, 0x6f, 0x85,
0xa2, 0x87, 0x04, 0x25, 0xfa, 0x93, 0x24, 0x10, 0x1a, 0x29, 0xdb, 0x09, 0x9d, 0x9d, 0x66, 0xfb,
0xe3, 0x93, 0x98, 0x7a, 0x7d, 0x5b, 0xe0, 0x90, 0xba, 0xed, 0xf8, 0xe7, 0xd5, 0x2c, 0xdd, 0x74,
0xb1, 0x1d, 0x38, 0x6f, 0x6e, 0xde, 0xdb, 0x6e, 0x90, 0xd5, 0x0d, 0x88, 0x2e, 0x6f, 0x7e, 0x91,
0x3c, 0x5d, 0xec, 0x55, 0x79, 0xa4, 0xa2, 0x6b, 0x1a, 0x36, 0x43, 0x8d, 0x19, 0x7a, 0x7d, 0xec,
0xfa, 0x1c, 0xe0, 0xd8, 0xce, 0xda, 0xcf, 0xe4, 0x41, 0xc3, 0x5b, 0xde, 0xf5, 0x96, 0xe6, 0x4f,
0x1f, 0x35, 0x3b, 0x9b, 0xdf, 0x93, 0xe6, 0x09, 0x9f, 0x9f, 0x18, 0xaa, 0x64, 0x96, 0xe1, 0x18,
0x65, 0x00, 0x1c, 0x48, 0x50, 0x10, 0xe5, 0xdd, 0x77, 0x4f, 0x7a, 0x76, 0xdb, 0x41, 0x02, 0x3c,
0x6b, 0x7b, 0x98, 0xfc, 0x26, 0xa4, 0x40, 0xce, 0x00, 0x30, 0x9b, 0x0f, 0xbb, 0xeb, 0xab, 0x64,
0xee, 0x6d, 0xfb, 0xf8, 0xa7, 0x20, 0x05, 0x46, 0xfb, 0xe1, 0x6d, 0x14, 0x10, 0x81, 0xfd, 0x22,
0x8d, 0xe1, 0xd5, 0x97, 0x50, 0x21, 0xb0, 0xe9, 0x26, 0xd2, 0xbc, 0xca, 0xd6, 0xc2, 0xa2, 0x05,
0xa5, 0x42, 0x06, 0x9f, 0x4f, 0xf9, 0xe9, 0x2a, 0x15, 0x36, 0x79, 0x2e, 0xa4, 0x47, 0x6a, 0xa8,
0x8c, 0x7b, 0x62, 0x90, 0xe5, 0x81, 0x78, 0xc7, 0x08, 0x52, 0x5d, 0x7d, 0x12, 0x67, 0x04, 0x6b,
0x2c, 0xd9, 0x37, 0x3e, 0xb7, 0x3c, 0x2f, 0xd8, 0x25, 0xcd, 0xb6, 0x6a, 0xf2, 0x1d, 0x60, 0x18,
0xa1, 0x91, 0x06, 0x03, 0x88, 0x01, 0xc1, 0xab, 0x21, 0xa7, 0x82, 0x35, 0xe9, 0x92, 0xaa, 0xaa,
0xb7, 0x84, 0xa1, 0x92, 0x8b, 0xd3, 0x7d, 0x5a, 0xfe, 0x08, 0x6c, 0xc8, 0xd0, 0xcb, 0x80, 0x33,
0x15, 0x53, 0xc4, 0x24, 0x61, 0x3b, 0x3e, 0x3e, 0x9e, 0xa8, 0xd0, 0x72, 0xd1, 0x72, 0x5d, 0xab,
0x9a, 0xa8, 0x01, 0x69, 0xcc, 0x9d, 0x33, 0x34, 0x43, 0xb5, 0x63, 0x0d, 0xcf, 0x8c, 0xba, 0xd2,
0x4d, 0xff, 0x13, 0x11, 0xd6, 0x6b, 0x86, 0x85, 0x34, 0xb9, 0x66, 0x5b, 0x65, 0x1b, 0x3b, 0x4e,
0x0a, 0xbc, 0xac, 0xb6, 0xf3, 0x75, 0x96, 0xd3, 0x5c, 0x5c, 0x00, 0x42, 0x96, 0xc5, 0x3a, 0x68,
0x69, 0x66, 0xba, 0x4b, 0x7c, 0x4a, 0x22, 0xaf, 0x66, 0xd7, 0x58, 0x45, 0xb9, 0xfe, 0xc5, 0x57,
0x5f, 0x65, 0x97, 0xd9, 0xd0, 0xbf, 0x5c, 0x31, 0xc9, 0xcc, 0x7f, 0x62, 0xd3, 0xd3, 0x8e, 0xcb,
0xd1, 0xef, 0x40, 0x79, 0xcc, 0x8d, 0x9f, 0x3f, 0x57, 0x8a, 0x8d, 0x70, 0xa6, 0x53, 0x14, 0xa5,
0x30, 0x5e, 0x1c, 0xe5, 0xbb, 0x28, 0x17, 0xb9, 0x75, 0x47, 0x2a, 0xdb, 0xba, 0x96, 0xec, 0xa4,
0xe8, 0xba, 0x4c, 0xd7, 0xd3, 0x96, 0xf5, 0x17, 0x99, 0x9c, 0xfe, 0xa3, 0xec, 0xe2, 0x2a, 0xbc,
0x70, 0xb1, 0x7f, 0x4a, 0xbd, 0x6a, 0x82, 0xd2, 0x36, 0xae, 0x61, 0xe4, 0x0e, 0x8d, 0x5d, 0x95,
0x72, 0x25, 0x7b, 0x98, 0x2f, 0x35, 0x6f, 0x56, 0xbd, 0x95, 0x47, 0xd2, 0x98, 0xd4, 0x6e, 0xbd,
0x22, 0xcb, 0x3b, 0x9d, 0xf9, 0x46, 0x94, 0x06, 0xca, 0xa8, 0x96, 0x70, 0xba, 0x30, 0x84, 0x07,
0x07, 0x3e, 0xab, 0x62, 0x4d, 0x47, 0x92, 0xa3, 0xda, 0x18, 0x52, 0x20, 0x32, 0x35, 0x69, 0xa8,
0x8a, 0xa6, 0xe5, 0xd0, 0xc3, 0xe3, 0x05, 0xd8, 0x3d, 0x1c, 0x8a, 0x2c, 0x52, 0xe3, 0x6c, 0xb1,
0xf3, 0x9c, 0xd8, 0x41, 0xe2, 0x24, 0x7f, 0xac, 0xb6, 0x8f, 0x56, 0x18, 0x77, 0xc9, 0xcf, 0xe7,
0x81, 0x1e, 0x79, 0x81, 0x1e, 0x77, 0x99, 0xa8, 0x67, 0x08, 0xaa, 0x28, 0x9f, 0x2e, 0x68, 0x2e,
0x53, 0x50, 0xca, 0x9d, 0x13, 0x34, 0xd7, 0x47, 0xd0, 0xf0, 0x6c, 0x40, 0x75, 0xb5, 0x5f, 0x1b,
0x4e, 0x53, 0x0f, 0xdd, 0xe5, 0xa4, 0x12, 0xd0, 0xbf, 0xea, 0x8e, 0xab, 0x97, 0x6e, 0xcb, 0x2c,
0x2f, 0xa7, 0xde, 0x8a, 0x72, 0x83, 0xe2, 0x7f, 0x52, 0x31, 0x94, 0x03, 0x89, 0x1d, 0xcb, 0xd0,
0xfb, 0xa5, 0xc8, 0x38, 0x9a, 0x32, 0xe2, 0x26, 0x2b, 0x47, 0x0a, 0xe3, 0xdd, 0x9a, 0x96, 0x9d,
0x0a, 0xd2, 0xfc, 0xc2, 0xa1, 0xd0, 0x14, 0x3d, 0x06, 0x7f, 0x76, 0xb9, 0x88, 0x86, 0x94, 0xab,
0x12, 0xfb, 0x1d, 0xc9, 0x0d, 0x73, 0xe1, 0xf2, 0x0f, 0xec, 0xd4, 0x2c, 0x88, 0x4c, 0x28, 0x0f,
0x1a, 0x76, 0xe0, 0x18, 0x6a, 0x4d, 0xe6, 0x6a, 0xde, 0xbf, 0xd7, 0xc7, 0x6f, 0x70, 0xee, 0xed,
0x2d, 0x0c, 0x69, 0x15, 0xc6, 0x22, 0xa9, 0xe8, 0x51, 0x94, 0x48, 0x98, 0xdf, 0xce, 0x41, 0x28,
0x72, 0x68, 0x5f, 0x32, 0x16, 0x5a, 0xfc, 0x45, 0x50, 0xd4, 0xfe, 0x69, 0xfe, 0x87, 0x35, 0x66,
0x7b, 0xd0, 0x06, 0x05, 0x3d, 0x54, 0xbf, 0xfe, 0xd2, 0x3b, 0x98, 0x83, 0x7d, 0x41, 0xeb, 0x14,
0xed, 0xfb, 0xf4, 0x3b, 0x66, 0x02, 0xb6, 0x2a, 0xb2, 0xb5, 0x3e, 0x52, 0xe3, 0x82, 0xff, 0xe1,
0xa4, 0x0e, 0xa2, 0x20, 0x25, 0x3b, 0x5f, 0xa7, 0x19, 0x06, 0xb9, 0xae, 0xb1, 0xf3, 0x6a, 0x86,
0x34, 0x8e, 0xa0, 0x8d, 0xf2, 0xaf, 0x3f, 0x3b, 0x3f, 0xa4, 0x9a, 0xc0, 0x2a, 0x54, 0xda, 0xf0,
0xc6, 0x56, 0xe0, 0xd1, 0x95, 0x55, 0xdc, 0x93, 0xb8, 0xf3, 0x31, 0x77, 0x43, 0x80, 0xbb, 0x3c,
0xcb, 0x9b, 0x1b, 0xfb, 0xe4, 0x64, 0x8f, 0xeb, 0x7e, 0x13, 0xd6, 0xe0, 0xaa, 0x4b, 0xd2, 0xfa,
0xbd, 0x65, 0x84, 0x3e, 0x97, 0x2c, 0xbb, 0xea, 0xf3, 0x86, 0x5e, 0x3b, 0x96, 0x82, 0x2e, 0x88,
0xcc, 0x9a, 0xba, 0xec, 0x84, 0x0c, 0x18, 0x2f, 0x3f, 0x25, 0xfd, 0x73, 0x48, 0x06, 0x11, 0x86,
0x93, 0xad, 0x72, 0xbb, 0xb5, 0xd0, 0x79, 0x71, 0x9c, 0x12, 0x39, 0xa9, 0xb4, 0xaf, 0xb0, 0x1f,
0xb6, 0x3d, 0x5a, 0x8f, 0xa5, 0x78, 0x79, 0x8f, 0xf7, 0xc1, 0x6d, 0x60, 0xfa, 0xc0, 0x0e, 0x7c,
0x33, 0xcc, 0xb9, 0xbf, 0x92, 0x4f, 0xde, 0x15, 0xe5, 0xc4, 0x3d, 0x5e, 0x74, 0x0f, 0xd8, 0x6e,
0x9c, 0xee, 0x6e, 0x70, 0x8e, 0x64, 0x3c, 0xb1, 0xeb, 0x82, 0x5d, 0x21, 0x74, 0xd4, 0x38, 0xe2,
0xf8, 0x9c, 0x42, 0x5b, 0x60, 0x41, 0x06, 0x1a, 0x29, 0xe0, 0x6a, 0x66, 0x99, 0x4f, 0xc8, 0x4b,
0x33, 0x7c, 0x42, 0x78, 0xfe, 0x0b, 0x5c, 0xbb, 0x4b, 0x56, 0xbf, 0x82, 0x9b, 0x9d, 0x84, 0x33,
0x53, 0xdf, 0xf9, 0x8b, 0x1d, 0x14, 0x0b, 0xb8, 0x84, 0x06, 0x55, 0x8d, 0xb3, 0x0a, 0x18, 0xf3,
0x13, 0x1b, 0x81, 0x7c, 0x56, 0x23, 0x90, 0xbf, 0x48, 0x23, 0x00, 0x48, 0xa3, 0xeb, 0xd1, 0xc3,
0xad, 0xbf, 0x55, 0x6a, 0xd3, 0xea, 0xfc, 0xdf, 0xea, 0x6c, 0x74, 0x70, 0x7f, 0xf7, 0x9f, 0xdb,
0xca, 0x70, 0xe3, 0x71, 0xd8, 0x7c, 0xe9, 0xa2, 0xdd, 0x58, 0xe7, 0xc7, 0x03, 0xb2, 0xb2, 0xf8,
0x9f, 0x7b, 0x33, 0xf0, 0xe0, 0x1d, 0xcc, 0xc0, 0x03, 0x59, 0xf8, 0xa5, 0xb3, 0xd2, 0x80, 0x87,
0xee, 0xeb, 0xe7, 0xde, 0xc2, 0xaf, 0x64, 0xeb, 0x25, 0x79, 0xb8, 0xd4, 0x6e, 0xdd, 0xf3, 0x01,
0x11, 0x6a, 0x72, 0x41, 0xf0, 0xdd, 0xbd, 0x78, 0xbf, 0x76, 0x31, 0x13, 0xf5, 0x33, 0x49, 0xfc,
0x8f, 0x43, 0x1d, 0x69, 0xdd, 0x27, 0x7b, 0xf7, 0x22, 0x7d, 0x3e, 0x31, 0x3a, 0x44, 0x4d, 0x14,
0x95, 0x57, 0x45, 0xe6, 0x24, 0x4a, 0x5f, 0x71, 0x6e, 0xb2, 0xb1, 0xa1, 0xb7, 0x7d, 0xe8, 0x2d,
0x37, 0x03, 0x8c, 0x04, 0x60, 0x82, 0xec, 0xe6, 0xbf, 0x95, 0xba, 0x8d, 0x57, 0x64, 0xe1, 0x65,
0xf7, 0x8f, 0xfb, 0xde, 0xda, 0x7e, 0x74, 0x80, 0xf0, 0x3e, 0x13, 0x55, 0x47, 0x6e, 0xba, 0xb8,
0x37, 0xd7, 0x6e, 0xbd, 0x26, 0x6f, 0x0e, 0x4f, 0x4f, 0x1e, 0x8a, 0x62, 0x37, 0x29, 0x53, 0x34,
0xcc, 0x1c, 0x8b, 0x6e, 0xf3, 0x74, 0x2e, 0xca, 0xcd, 0x31, 0x7b, 0xb3, 0x56, 0x06, 0x8b, 0xd1,
0xfe, 0x2c, 0x2e, 0xb9, 0x56, 0xb9, 0x6c, 0x60, 0x39, 0x35, 0x9b, 0x65, 0x56, 0x19, 0x8d, 0xe3,
0x3c, 0x64, 0x38, 0xda, 0xf7, 0x46, 0xc6, 0x92, 0xb8, 0x70, 0x60, 0x73, 0xee, 0x3b, 0x59, 0x74,
0x0d, 0xbc, 0xc8, 0x9d, 0x4c, 0xe8, 0x89, 0xbf, 0xdb, 0x14, 0x9f, 0x63, 0x18, 0xc6, 0x17, 0xec,
0x68, 0x30, 0x0b, 0x66, 0xee, 0x99, 0x6a, 0x73, 0x83, 0x14, 0x5a, 0xf7, 0x62, 0xf5, 0x92, 0x13,
0xec, 0xac, 0x02, 0xae, 0x5c, 0x1e, 0x8e, 0x99, 0x88, 0xbd, 0x76, 0xf6, 0x8c, 0x6d, 0x1c, 0x29,
0x37, 0x0a, 0xd1, 0xad, 0xd4, 0x27, 0x63, 0x8d, 0x6b, 0x9f, 0x59, 0x3c, 0x54, 0x79, 0xef, 0xa0,
0x09, 0x89, 0x34, 0x18, 0xa2, 0x27, 0xa7, 0xf0, 0x85, 0x70, 0xcc, 0xfe, 0x74, 0xb6, 0xf3, 0x78,
0x3f, 0x80, 0x77, 0xb4, 0x23, 0x50, 0xac, 0x90, 0x00, 0x5e, 0xe6, 0x4c, 0xbf, 0x9f, 0xda, 0xfe,
0x70, 0x9b, 0x06, 0x1c, 0x7f, 0x4c, 0xfb, 0x64, 0xb9, 0x73, 0xd2, 0x4c, 0x8f, 0xe3, 0xfb, 0x43,
0xf5, 0x7f, 0x79, 0x63, 0x8a, 0xa6, 0xef, 0x79, 0x6e, 0xfa, 0x1e, 0xcc, 0xf2, 0xe2, 0xd1, 0x7b,
0xfe, 0xaf, 0xf7, 0x4b, 0xc1, 0x94, 0x11, 0x14, 0x8f, 0x46, 0xf3, 0xed, 0xc3, 0x45, 0x68, 0xbf,
0xb8, 0x00, 0xae, 0xf8, 0x9e, 0x40, 0x36, 0x24, 0x46, 0x29, 0x23, 0x12, 0x39, 0xfb, 0xd8, 0x16,
0x84, 0x3b, 0x1e, 0xca, 0xdd, 0x50, 0x34, 0x5c, 0x66, 0x59, 0xef, 0xc7, 0xb7, 0xdd, 0x83, 0x77,
0x50, 0xe1, 0x3a, 0xcd, 0xd7, 0xe4, 0xd9, 0xbe, 0xb7, 0xbe, 0xd8, 0x3d, 0xf9, 0x9d, 0x4f, 0x10,
0x15, 0x6b, 0xea, 0xa2, 0xfc, 0x63, 0xee, 0x64, 0x6f, 0x8d, 0xbc, 0xbf, 0x17, 0x73, 0x9f, 0xd9,
0x25, 0xcf, 0x96, 0x03, 0xee, 0xff, 0x05, 0xda, 0x20, 0x35, 0xb2, 0xad, 0x1a, 0x00, 0x00
};
const char SCRIPT_JS[] = {
0x1f, 0x8b, 0x08, 0x08, 0x9e, 0xe4, 0x00, 0x69, 0x02, 0xff, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x2e, 0x6a, 0x73, 0x00, 0xed, 0x5a, 0x6b, 0x6f, 0xdb, 0xd6, 0x19, 0xfe, 0x6e, 0xc0, 0xff, 0xe1,
0xec, 0x13, 0xe9, 0x98, 0xa2, 0x65, 0xa5, 0xd9, 0xba, 0x7a, 0x19, 0xd0, 0x24, 0x76, 0x2f, 0x48,
0xd3, 0xa0, 0x76, 0xb3, 0x62, 0x82, 0x11, 0x1c, 0x4b, 0xc7, 0x12, 0x11, 0x8a, 0x54, 0x0f, 0x8f,
0x64, 0x7b, 0xad, 0x81, 0xb4, 0x40, 0xe2, 0x2e, 0xa9, 0x9b, 0x6e, 0x73, 0x93, 0x75, 0xed, 0x90,
0x74, 0x68, 0xd3, 0xb4, 0xd8, 0x92, 0x6c, 0xc8, 0x12, 0xc7, 0xf1, 0xd2, 0x1f, 0x33, 0x53, 0xb6,
0x3f, 0xe5, 0x2f, 0xec, 0x3d, 0x17, 0x52, 0x87, 0x14, 0x25, 0xd1, 0xce, 0xbe, 0x6c, 0xa8, 0x21,
0xc3, 0x22, 0xcf, 0x7b, 0x7b, 0xde, 0xdb, 0xb9, 0x79, 0x62, 0x02, 0xbd, 0x8e, 0xdb, 0x78, 0xb6,
0x42, 0x9d, 0x26, 0x43, 0x8b, 0x3e, 0x45, 0x4d, 0x5c, 0x23, 0xc8, 0xc3, 0x6d, 0xa7, 0x86, 0x99,
0xe3, 0x7b, 0xa3, 0x23, 0x15, 0xdf, 0x0b, 0x98, 0x78, 0x3d, 0x79, 0xda, 0xf1, 0x2e, 0xa0, 0xe3,
0xa8, 0xea, 0x57, 0x5a, 0x0d, 0xe2, 0x31, 0xbb, 0x46, 0xd8, 0xb4, 0x4b, 0xf8, 0xd7, 0x13, 0x2b,
0xaf, 0x55, 0x4d, 0x43, 0x10, 0x15, 0x5c, 0xa0, 0x32, 0xc6, 0xa6, 0x74, 0xce, 0x52, 0x1e, 0xce,
0x52, 0x16, 0xe7, 0xe4, 0x50, 0x7d, 0x69, 0x55, 0x43, 0xd5, 0x08, 0x86, 0xd1, 0x91, 0x18, 0x91,
0x8d, 0xab, 0xd5, 0xe9, 0x36, 0xd0, 0x9c, 0x76, 0x02, 0x46, 0x3c, 0x42, 0x4d, 0xa3, 0xe2, 0x3a,
0x95, 0x0b, 0x86, 0x85, 0xcc, 0x31, 0x74, 0xfc, 0x97, 0xe8, 0xbd, 0xd1, 0x11, 0x04, 0x3f, 0x82,
0xc1, 0xae, 0xb8, 0x38, 0x08, 0x38, 0x25, 0x67, 0x33, 0x0d, 0x5c, 0x61, 0x4e, 0x9b, 0x08, 0x91,
0x11, 0x4d, 0x49, 0xa3, 0xa1, 0xa4, 0xe1, 0xb7, 0x49, 0x82, 0x6c, 0xb5, 0xab, 0xbe, 0x74, 0x50,
0xf5, 0xa5, 0x1c, 0xea, 0x27, 0x73, 0xa9, 0x97, 0x0e, 0x6b, 0x35, 0x5d, 0x1f, 0x57, 0x4f, 0xb4,
0x18, 0xf3, 0xbd, 0x41, 0x7e, 0x93, 0x74, 0x85, 0x05, 0x41, 0xa8, 0x39, 0x7c, 0xd1, 0xa1, 0x8d,
0x25, 0x4c, 0xc9, 0x8c, 0xe3, 0x92, 0x41, 0xfc, 0x11, 0x5d, 0x61, 0x11, 0x08, 0x35, 0x7e, 0x29,
0x77, 0xc6, 0xa7, 0x8d, 0x1c, 0xda, 0x21, 0x3b, 0x1b, 0x1a, 0x6f, 0x95, 0xfa, 0xcd, 0x5f, 0xfb,
0xde, 0x40, 0xbd, 0x9c, 0xa6, 0xf0, 0x1b, 0x20, 0xd2, 0x93, 0x84, 0xfa, 0x35, 0x4a, 0x82, 0xe0,
0x04, 0xa6, 0x39, 0x94, 0x46, 0xd4, 0x2a, 0x69, 0x26, 0x26, 0xd0, 0xee, 0x87, 0x8f, 0xc3, 0xb5,
0x27, 0x9d, 0xab, 0xd7, 0x3b, 0x1b, 0x4f, 0xc3, 0x8f, 0xb7, 0xc2, 0x9b, 0x37, 0xf7, 0xbe, 0xbd,
0x1d, 0x5e, 0xfb, 0x5d, 0xe7, 0xfa, 0xda, 0xce, 0x93, 0x87, 0xfb, 0x17, 0x7f, 0xdb, 0xb9, 0xfa,
0xdd, 0xe8, 0x48, 0x64, 0x5d, 0xde, 0xe8, 0xea, 0x9e, 0xb4, 0x05, 0x85, 0xa9, 0x45, 0x0b, 0xd4,
0x4a, 0xf1, 0xa0, 0x36, 0xbc, 0xf4, 0x8d, 0xae, 0x7c, 0x74, 0xa4, 0x0c, 0x30, 0x21, 0xee, 0x1e,
0x23, 0x14, 0xa4, 0x8a, 0x07, 0x08, 0x3a, 0x35, 0xe6, 0x6d, 0xf0, 0xd8, 0x34, 0xae, 0xd4, 0x4d,
0xc2, 0x0d, 0x38, 0x83, 0x1b, 0x44, 0x53, 0xd8, 0xdf, 0xc0, 0x98, 0x1a, 0x4c, 0x24, 0xba, 0x8d,
0xfc, 0x87, 0xd8, 0x4d, 0x2a, 0x08, 0x4e, 0x91, 0x45, 0xdc, 0x72, 0x99, 0x19, 0xa5, 0x9e, 0x1c,
0x0c, 0x98, 0xdf, 0x3c, 0x0b, 0x92, 0xb1, 0xec, 0x1e, 0x89, 0xd1, 0x58, 0x63, 0x2a, 0x87, 0xeb,
0x4e, 0xad, 0xee, 0xc2, 0x2f, 0x8b, 0xd3, 0x78, 0xb5, 0x0f, 0xf4, 0xdd, 0xdb, 0x4f, 0xb2, 0xa0,
0xbb, 0x04, 0x43, 0x72, 0x0b, 0xe8, 0x7e, 0xf3, 0x7f, 0x01, 0x76, 0x54, 0x96, 0x79, 0x91, 0x03,
0xe0, 0x74, 0xd0, 0x07, 0xe4, 0x97, 0xf0, 0x42, 0x1a, 0x44, 0x54, 0xaf, 0x2e, 0x09, 0x20, 0xeb,
0x89, 0x5d, 0xc5, 0x0c, 0xcf, 0x51, 0xec, 0x05, 0x8b, 0x84, 0xda, 0xe2, 0xb5, 0xb2, 0xc0, 0x59,
0x44, 0xa6, 0x78, 0xb6, 0x5d, 0xe2, 0xd5, 0x58, 0x7d, 0x4c, 0x77, 0x43, 0x22, 0x4b, 0x23, 0x61,
0x3a, 0x77, 0x02, 0x30, 0x23, 0xcb, 0xec, 0xa4, 0x0f, 0x79, 0xe9, 0xb1, 0x88, 0xac, 0x5c, 0x9c,
0xb7, 0x3d, 0xf0, 0xf1, 0x14, 0xe2, 0xe8, 0xbe, 0x78, 0xd0, 0xb9, 0x7e, 0x1f, 0x30, 0x76, 0xbe,
0xfc, 0x6b, 0x78, 0xf9, 0x52, 0x78, 0xf7, 0xf1, 0xce, 0xe6, 0x96, 0x84, 0x1c, 0x7e, 0xba, 0xae,
0x1c, 0x92, 0x70, 0xc7, 0x10, 0x86, 0x84, 0x79, 0x19, 0x85, 0x57, 0xc7, 0x5e, 0x8d, 0xa4, 0x2b,
0x4f, 0x02, 0x4e, 0xe3, 0xca, 0x42, 0xdf, 0x17, 0x58, 0x9a, 0x39, 0x46, 0x99, 0x81, 0x61, 0x67,
0xf3, 0xca, 0xce, 0xf6, 0x2d, 0x65, 0xf4, 0xe3, 0x87, 0x9d, 0x3f, 0x3e, 0xdd, 0xfd, 0x7a, 0x6b,
0xef, 0x87, 0x2f, 0xc2, 0xad, 0xdb, 0xa3, 0x23, 0x7a, 0x3f, 0xce, 0xdb, 0x39, 0xba, 0x91, 0xed,
0x67, 0x8b, 0x16, 0xd9, 0x9f, 0xf0, 0x77, 0x09, 0x50, 0xd8, 0x25, 0x94, 0x99, 0xc6, 0xde, 0xbd,
0x47, 0xb2, 0x75, 0xed, 0x6c, 0x5e, 0xdc, 0xd9, 0xfc, 0x5e, 0xda, 0xf7, 0x6c, 0xfb, 0x03, 0x43,
0x4f, 0x65, 0x4a, 0x58, 0x8b, 0x7a, 0x5d, 0x54, 0x09, 0x03, 0xa0, 0x3b, 0x9f, 0x82, 0xa4, 0x02,
0x23, 0x3c, 0xb2, 0x84, 0x66, 0xd4, 0x63, 0x5c, 0x0a, 0xd1, 0xb8, 0x8d, 0x9b, 0x4d, 0xe2, 0x89,
0x06, 0x0b, 0x39, 0xc8, 0xa3, 0x21, 0x4c, 0x9a, 0x4a, 0x4a, 0x5b, 0xae, 0x53, 0x25, 0xe8, 0x9d,
0x37, 0x4e, 0xbf, 0xca, 0x58, 0xf3, 0x2d, 0xf2, 0x6e, 0x8b, 0x04, 0xdd, 0xba, 0x03, 0x02, 0xdb,
0x07, 0x41, 0xa6, 0x71, 0xf6, 0xcd, 0xd9, 0x39, 0x5e, 0xfc, 0x13, 0xb1, 0x40, 0x46, 0x5b, 0x9a,
0x40, 0x4e, 0x29, 0xfd, 0x6a, 0xfb, 0x5e, 0xd4, 0xce, 0xb9, 0xab, 0x5a, 0x5e, 0x85, 0x17, 0xab,
0x28, 0x14, 0xcd, 0x21, 0xdc, 0x4d, 0x44, 0x85, 0xff, 0xa4, 0xdf, 0x68, 0xb6, 0x18, 0x5e, 0x48,
0xf9, 0xac, 0x6b, 0x67, 0x93, 0xd0, 0x0a, 0x84, 0x88, 0xd3, 0xb9, 0x84, 0xf1, 0x08, 0x70, 0x5e,
0xd0, 0x45, 0xaa, 0x68, 0x02, 0xca, 0x8c, 0xf9, 0x0c, 0xbb, 0x63, 0xe8, 0x08, 0x9a, 0x2c, 0x16,
0xa7, 0x92, 0x02, 0xb4, 0x79, 0xc8, 0x6e, 0x63, 0xb7, 0xc5, 0x99, 0x53, 0xe2, 0x34, 0x8e, 0x55,
0xe5, 0xf4, 0x04, 0x2c, 0xdf, 0xe3, 0xaa, 0x12, 0x58, 0x7a, 0xa0, 0x70, 0xba, 0x80, 0x61, 0xd6,
0x02, 0xcc, 0xc7, 0x8f, 0xa3, 0x52, 0xb1, 0xd8, 0x03, 0x45, 0xa5, 0x80, 0xca, 0xcc, 0x8f, 0x3e,
0x0d, 0xaf, 0xdc, 0x4c, 0x47, 0x7e, 0x15, 0x11, 0x37, 0x20, 0x03, 0x19, 0xc3, 0xaf, 0xff, 0xbe,
0xf7, 0xe0, 0x9b, 0x67, 0xdb, 0x1f, 0xf3, 0x54, 0x5a, 0x5b, 0xdf, 0xbb, 0xf7, 0xd9, 0xbf, 0x2f,
0x7e, 0x98, 0x14, 0xd2, 0xfd, 0x9a, 0x05, 0x3e, 0x72, 0x50, 0x1a, 0x23, 0xa1, 0xd4, 0xa7, 0xfd,
0x41, 0x26, 0x8c, 0xd8, 0xfb, 0x61, 0x6d, 0xf7, 0xce, 0xd5, 0x9d, 0xcd, 0xbf, 0xc1, 0x84, 0xbc,
0xbb, 0x71, 0x73, 0x7f, 0xe3, 0xf3, 0xbd, 0x7b, 0xf7, 0xc0, 0x0e, 0xf9, 0x65, 0xf7, 0xd6, 0x07,
0xcf, 0xb6, 0xff, 0x64, 0xa0, 0x71, 0xd4, 0xf5, 0x8a, 0x6e, 0x60, 0x7e, 0xab, 0x98, 0xd3, 0x20,
0x7e, 0x8b, 0x57, 0x3f, 0x04, 0x16, 0x7e, 0x44, 0x3f, 0xdb, 0xbb, 0xfb, 0x74, 0xf7, 0x5f, 0x77,
0xf7, 0x1e, 0x5e, 0xea, 0xdc, 0x78, 0x08, 0x9f, 0xfd, 0x1b, 0x0f, 0xa0, 0x3d, 0xc1, 0xf8, 0xee,
0xb7, 0xbf, 0xd7, 0xf1, 0x74, 0x79, 0x07, 0x23, 0xea, 0x7c, 0xb9, 0x1e, 0x5e, 0xf9, 0x2a, 0xfc,
0xfc, 0x4e, 0xe7, 0xc6, 0xad, 0xf0, 0x0f, 0xeb, 0xe1, 0xd6, 0x06, 0x38, 0x77, 0xff, 0xab, 0x7f,
0xee, 0xff, 0xf9, 0x2f, 0xe1, 0xfd, 0xcb, 0xe1, 0x47, 0x8f, 0xa0, 0x17, 0xa6, 0x5d, 0xec, 0xfa,
0x15, 0x31, 0x03, 0xc1, 0x14, 0xc3, 0x53, 0x23, 0x2e, 0x97, 0xa4, 0xf5, 0x01, 0x2f, 0xc0, 0xa8,
0x20, 0xb5, 0x19, 0x67, 0x74, 0xa4, 0x0d, 0x8b, 0xa2, 0x3a, 0xf4, 0x1b, 0x9f, 0xae, 0x9c, 0xaf,
0xca, 0x6a, 0x2e, 0x4b, 0xbe, 0xf7, 0xda, 0xbe, 0xcb, 0x60, 0x99, 0xf1, 0xaa, 0x1c, 0x7d, 0x09,
0x95, 0xe7, 0x2d, 0x54, 0x69, 0x51, 0x0a, 0xf9, 0x9a, 0x78, 0xd7, 0xf4, 0x97, 0x08, 0xd5, 0xde,
0xac, 0x5a, 0x3f, 0x0a, 0xf8, 0x51, 0xc0, 0x7f, 0x43, 0xc0, 0xe8, 0xc8, 0xbc, 0x4a, 0xd3, 0xb8,
0x70, 0x60, 0x8e, 0x9c, 0xf3, 0x15, 0x8d, 0xe9, 0x78, 0x55, 0xb2, 0x6c, 0x21, 0x25, 0x3f, 0x16,
0xaa, 0x24, 0xc5, 0x25, 0xa6, 0xe7, 0x77, 0x59, 0xf0, 0xcc, 0xdb, 0x49, 0x9b, 0xec, 0x66, 0x2b,
0xa8, 0x9b, 0xea, 0x5d, 0x54, 0x42, 0x59, 0x6c, 0x49, 0xb3, 0x25, 0x9b, 0x7a, 0x37, 0x88, 0x4d,
0x47, 0x26, 0x99, 0xa4, 0x85, 0x71, 0x91, 0x0e, 0x37, 0x11, 0x0a, 0x33, 0x07, 0x8e, 0x00, 0x16,
0x0c, 0xc4, 0x2c, 0x1c, 0x83, 0xa6, 0x9f, 0x1b, 0x45, 0x1f, 0xc9, 0x29, 0xa8, 0xf9, 0x24, 0xeb,
0x40, 0xfb, 0xc8, 0x4d, 0xf8, 0x22, 0x29, 0x75, 0x35, 0x11, 0x6a, 0x39, 0xbd, 0xcf, 0x8a, 0xa6,
0xdd, 0xed, 0x97, 0x07, 0x5e, 0x2e, 0xbc, 0x32, 0x2d, 0x57, 0x0b, 0xb2, 0xfb, 0x67, 0xae, 0x16,
0x86, 0x4d, 0xab, 0x52, 0x67, 0x05, 0xd3, 0x6a, 0xa0, 0xef, 0x20, 0x41, 0x23, 0x5d, 0x99, 0x25,
0x2e, 0xa9, 0x00, 0x96, 0x97, 0x5d, 0xd7, 0x34, 0xd4, 0x14, 0x53, 0xe0, 0xa4, 0x46, 0x57, 0xc7,
0x01, 0xa6, 0x66, 0xde, 0x8f, 0x55, 0x1f, 0x7e, 0x7d, 0xf6, 0xcd, 0x33, 0x76, 0x13, 0xd3, 0x80,
0x08, 0x46, 0x98, 0xa7, 0x9a, 0x60, 0x07, 0x99, 0x83, 0xb5, 0xe8, 0x58, 0x6a, 0x69, 0xa1, 0x38,
0xf8, 0x1f, 0xb1, 0xd0, 0x9f, 0xca, 0x5a, 0xba, 0x2c, 0xb4, 0x16, 0x61, 0xed, 0xaf, 0xdc, 0xf6,
0x32, 0xa5, 0x78, 0xe5, 0x84, 0x78, 0x63, 0xbe, 0x30, 0x96, 0x49, 0xdf, 0x76, 0x80, 0x4e, 0x52,
0xf3, 0x69, 0xe3, 0x1c, 0x3c, 0x9a, 0x52, 0x46, 0x9a, 0x9e, 0x53, 0xc2, 0x1c, 0xc3, 0x66, 0xc0,
0x8d, 0xec, 0x68, 0xc9, 0x2c, 0x5a, 0xc2, 0x94, 0xf2, 0xb1, 0xe2, 0x7c, 0xd7, 0xdd, 0x69, 0x94,
0x62, 0xd2, 0x3b, 0xcf, 0x1a, 0x4d, 0xa5, 0xe3, 0x6d, 0xc7, 0x63, 0x2f, 0x0a, 0xb3, 0xfa, 0x69,
0x01, 0x26, 0x91, 0x43, 0xe7, 0xc1, 0x3e, 0xd8, 0xef, 0xf2, 0x09, 0xb5, 0xfc, 0xa2, 0xf5, 0x73,
0xab, 0x68, 0x4d, 0x5a, 0x25, 0xeb, 0xa8, 0xf5, 0x82, 0x75, 0xcc, 0xfa, 0xa9, 0xf5, 0xb3, 0xf9,
0x34, 0x1a, 0x1e, 0xb7, 0x78, 0x8f, 0x68, 0xf2, 0x47, 0x4b, 0x0a, 0x4a, 0x6f, 0xfa, 0x52, 0xf8,
0x65, 0x69, 0x81, 0x16, 0xce, 0x92, 0x8c, 0x36, 0x84, 0x5a, 0x0d, 0x1b, 0x69, 0x33, 0xb5, 0x84,
0x91, 0x15, 0xd4, 0x4f, 0x80, 0x1a, 0x1e, 0x20, 0x40, 0x94, 0x4a, 0x3f, 0x76, 0x31, 0x38, 0x80,
0x59, 0xf8, 0xb7, 0x1f, 0xb3, 0x18, 0x1c, 0x64, 0x3a, 0xf6, 0xda, 0x38, 0xe8, 0x6b, 0x79, 0x1d,
0x2b, 0xee, 0x5e, 0x7e, 0x58, 0x16, 0xbd, 0x2d, 0x0a, 0x17, 0xf1, 0x4d, 0x13, 0x17, 0xc7, 0x77,
0x4d, 0xbd, 0x74, 0xca, 0x7d, 0xa9, 0xad, 0x55, 0xb7, 0x51, 0x44, 0x41, 0x56, 0x6d, 0xe3, 0x48,
0x69, 0x1e, 0xd6, 0xd6, 0x33, 0xce, 0x32, 0xa9, 0x9a, 0xa5, 0x4c, 0xbb, 0xa5, 0x37, 0xf3, 0xcb,
0x1b, 0x9f, 0x1c, 0x22, 0x51, 0x38, 0x38, 0xb7, 0xbc, 0xa3, 0xe3, 0xa5, 0xe2, 0x10, 0x81, 0xe0,
0x1a, 0xe1, 0xf7, 0xbe, 0x32, 0x39, 0x48, 0x41, 0x91, 0xe9, 0xd9, 0xde, 0xa9, 0x2f, 0x65, 0x83,
0x35, 0xd0, 0x7d, 0xd6, 0x10, 0x67, 0x58, 0xc3, 0xc0, 0xf5, 0x8d, 0xf7, 0x29, 0x8a, 0x97, 0x90,
0xc8, 0x89, 0xde, 0xe1, 0x2a, 0x8c, 0x9d, 0xe4, 0x43, 0xa6, 0x4c, 0x29, 0x2b, 0x63, 0x4e, 0x48,
0x69, 0x9b, 0x4f, 0xfb, 0x6e, 0x75, 0xf8, 0xc6, 0x84, 0x67, 0xad, 0x0f, 0x3b, 0x60, 0xb1, 0x75,
0x30, 0x8d, 0x19, 0x0c, 0x5b, 0xcc, 0x2a, 0x62, 0x3e, 0x5a, 0x24, 0xac, 0x52, 0x47, 0xaa, 0xe9,
0x72, 0x95, 0x19, 0x69, 0x9b, 0xd1, 0x20, 0xfe, 0xaf, 0x3b, 0xc3, 0x73, 0x15, 0xf7, 0x29, 0x27,
0x68, 0xba, 0x78, 0x05, 0x9d, 0xc1, 0x67, 0xc4, 0xf5, 0xc1, 0x61, 0xaa, 0xdc, 0x00, 0x66, 0x23,
0x77, 0x0d, 0xf7, 0xa3, 0xce, 0xaa, 0xcf, 0x88, 0x36, 0x4f, 0xf5, 0x58, 0xa8, 0x28, 0x3f, 0x39,
0x12, 0x1b, 0x2d, 0x39, 0xac, 0x8e, 0x8a, 0x48, 0x6c, 0x12, 0x83, 0xc3, 0xa5, 0xf9, 0x90, 0xbc,
0x3e, 0xd4, 0x5e, 0x38, 0x95, 0xf7, 0xd3, 0x82, 0xba, 0xda, 0xa2, 0x8e, 0x57, 0x8b, 0x92, 0x5e,
0x2e, 0xa3, 0x10, 0x95, 0x0b, 0xa4, 0x54, 0x60, 0x0f, 0xbf, 0xb2, 0x39, 0x60, 0xf1, 0x3c, 0x57,
0xe1, 0x3c, 0x57, 0xd1, 0x1c, 0xba, 0x60, 0x9e, 0xa7, 0x58, 0x0e, 0x54, 0x28, 0xf9, 0x8b, 0x24,
0x7f, 0x81, 0xe4, 0x2f, 0x8e, 0x21, 0x85, 0x71, 0xa8, 0x92, 0x38, 0x70, 0x39, 0xac, 0x0e, 0x38,
0xb7, 0xe8, 0xdd, 0x19, 0xf4, 0x8a, 0xe7, 0x62, 0x53, 0x5b, 0x84, 0x0a, 0x5b, 0x16, 0x51, 0xe3,
0x04, 0xfc, 0xb2, 0x47, 0xf8, 0x61, 0x99, 0x99, 0x46, 0xa9, 0x9b, 0xc0, 0x40, 0x63, 0x57, 0x5c,
0x82, 0xe9, 0x5b, 0x10, 0x50, 0x53, 0xa2, 0x56, 0x1c, 0x4b, 0x4e, 0x95, 0xd5, 0xe3, 0xa7, 0x3a,
0xe1, 0xa7, 0xf6, 0xdd, 0x38, 0xf3, 0xc3, 0x9f, 0x4f, 0x1e, 0x85, 0xd7, 0xae, 0x87, 0x9f, 0x5c,
0x0e, 0xaf, 0xfd, 0xa3, 0xf3, 0xd9, 0xfd, 0xce, 0xfa, 0x5d, 0x5d, 0xbb, 0x8a, 0xe9, 0x29, 0x6d,
0x61, 0x9e, 0xda, 0xcf, 0xbd, 0xff, 0x3e, 0x2a, 0x17, 0x63, 0x57, 0xc3, 0x27, 0x5a, 0xb7, 0x26,
0xb2, 0x5d, 0x17, 0x90, 0xda, 0xb6, 0x0d, 0x11, 0x20, 0x32, 0x40, 0x67, 0x4f, 0xec, 0xcd, 0x32,
0x99, 0x75, 0x76, 0xec, 0xba, 0x8a, 0xb9, 0x6c, 0xdb, 0xb6, 0x06, 0xc7, 0x42, 0xf0, 0xac, 0x59,
0x27, 0x9e, 0x63, 0x65, 0x49, 0x1b, 0x1a, 0x78, 0xf9, 0x9c, 0x3a, 0x56, 0x7b, 0x03, 0xb3, 0xba,
0x0d, 0xcf, 0x26, 0x50, 0x2b, 0xd9, 0x63, 0x49, 0x5a, 0xc7, 0x4b, 0xd2, 0x3a, 0x5e, 0x8a, 0x36,
0xe1, 0x1e, 0xdf, 0xf5, 0x29, 0x2f, 0x4b, 0xad, 0xcf, 0x28, 0x23, 0x5f, 0x42, 0xc6, 0x02, 0xc8,
0x31, 0x2c, 0xad, 0x49, 0x49, 0x73, 0x61, 0xa4, 0x46, 0x09, 0xf1, 0xf4, 0x21, 0x61, 0x39, 0x0c,
0xf8, 0x54, 0xdc, 0x15, 0xa4, 0xb3, 0x30, 0xc6, 0x71, 0xd6, 0x87, 0xfd, 0x09, 0x57, 0xa8, 0xb9,
0x42, 0x1d, 0x1a, 0x27, 0x60, 0x88, 0xbc, 0xe9, 0x26, 0x9e, 0x78, 0x4c, 0x10, 0xc8, 0x54, 0xea,
0x52, 0xc8, 0xe7, 0x04, 0x49, 0xc0, 0x48, 0xf3, 0x1d, 0xa0, 0x90, 0xb2, 0x26, 0x90, 0xd9, 0xd5,
0x5f, 0x40, 0x93, 0x5d, 0x57, 0x24, 0x0a, 0xe2, 0xb4, 0xe3, 0x11, 0xb3, 0x2a, 0x02, 0x22, 0x9c,
0x93, 0x9c, 0x27, 0x20, 0xd1, 0x17, 0x48, 0xcd, 0xf1, 0xce, 0x82, 0x6b, 0x13, 0xb7, 0x55, 0x7c,
0x24, 0x60, 0xd4, 0xbf, 0x00, 0x3b, 0xed, 0x15, 0x71, 0xa5, 0x20, 0xb8, 0x53, 0x14, 0x2e, 0x08,
0xff, 0x95, 0x42, 0x56, 0xd2, 0xaf, 0x7e, 0xb8, 0x17, 0xe2, 0xe6, 0x2f, 0x5a, 0xc1, 0x80, 0xbd,
0x95, 0xda, 0xbb, 0x83, 0x0c, 0x41, 0x82, 0x8e, 0x48, 0xa4, 0x99, 0x7d, 0x57, 0x1c, 0x1f, 0x48,
0x57, 0x15, 0x90, 0x12, 0x0d, 0xdf, 0xa2, 0x2c, 0x19, 0x53, 0x6e, 0x39, 0x97, 0x7e, 0xcf, 0xcf,
0xde, 0x95, 0x4b, 0x45, 0x95, 0xae, 0x7d, 0x1f, 0x5e, 0xb9, 0xb3, 0xbb, 0xfd, 0x5d, 0x67, 0xe3,
0x69, 0x52, 0x0d, 0xdf, 0x90, 0x4b, 0x33, 0xf8, 0x5e, 0xbc, 0x77, 0x27, 0x1e, 0x41, 0xe7, 0x37,
0x77, 0x73, 0xbe, 0x09, 0x5d, 0x71, 0xa5, 0x67, 0x02, 0xcf, 0x5c, 0x8b, 0xea, 0x3e, 0xeb, 0xc7,
0x98, 0xd1, 0xf9, 0x92, 0xc1, 0xe8, 0x1e, 0xe4, 0x46, 0xc1, 0x8e, 0x63, 0x9c, 0xa8, 0x45, 0x59,
0x07, 0x76, 0xea, 0xe8, 0x2a, 0xa6, 0x4d, 0xd4, 0xa9, 0xa2, 0x4d, 0x9d, 0x57, 0xc5, 0xb4, 0x71,
0x0d, 0xc7, 0x94, 0xf1, 0x21, 0x95, 0x30, 0x02, 0x36, 0xf8, 0xaf, 0xf1, 0x3b, 0x67, 0x08, 0x85,
0xa9, 0x9f, 0xcd, 0x58, 0x48, 0x1d, 0xdf, 0x44, 0x17, 0xee, 0xcc, 0xaf, 0xd5, 0x5c, 0x32, 0xeb,
0x54, 0xc9, 0x02, 0xa6, 0xc3, 0xff, 0xd7, 0x40, 0x92, 0x17, 0x02, 0x49, 0xaf, 0x5d, 0xdc, 0xab,
0x37, 0xc3, 0x16, 0x26, 0x99, 0x7c, 0x52, 0x2d, 0xef, 0xf9, 0x18, 0xb0, 0x0d, 0xbc, 0xf8, 0xe7,
0xe4, 0xfa, 0x7f, 0x3a, 0x8c, 0x8e, 0x64, 0x00, 0xc8, 0x7d, 0xad, 0x0f, 0xcb, 0x02, 0x97, 0x30,
0xe4, 0x88, 0x9b, 0x04, 0xf8, 0xf3, 0x8b, 0x08, 0x46, 0xd4, 0x2c, 0x90, 0x33, 0x3e, 0x9e, 0x48,
0x36, 0x35, 0x5e, 0x76, 0xe6, 0xb5, 0x1b, 0x63, 0x69, 0x02, 0xbf, 0x31, 0xae, 0x56, 0x89, 0x67,
0x68, 0xd9, 0x10, 0xb1, 0xa4, 0x10, 0x66, 0xf3, 0x92, 0x02, 0x86, 0x25, 0xe1, 0x52, 0xcc, 0x9f,
0x8f, 0x31, 0xa8, 0xfb, 0x4b, 0x1a, 0x23, 0xa4, 0xe8, 0x7f, 0x00, 0xf7, 0xf7, 0xe0, 0x74, 0x37,
0x24, 0x00, 0x00
};
#endif // WEB_H

BIN
esp8266/ico.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
esp8266/ico.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

157
esp8266/web/index.html Normal file

File diff suppressed because one or more lines are too long

BIN
esp8266/web/index.html.gz Normal file

Binary file not shown.

267
esp8266/web/script.js Normal file
View File

@@ -0,0 +1,267 @@
// JavaScript for page navigation
const page1Link = document.getElementById('page1-link');
const page2Link = document.getElementById('page2-link');
const page1 = document.getElementById('page1');
const page2 = document.getElementById('page2');
page1Link.addEventListener('click', () => {
page1.classList.add('active');
page2.classList.remove('active');
});
page2Link.addEventListener('click', () => {
page2.classList.add('active');
page1.classList.remove('active');
});
const uploadButton = document.getElementById('upload-button');
const firmwareFile = document.getElementById('firmware-file');
const uploadForm = document.getElementById('upload-form');
const dropZone = document.getElementById('drop-zone');
const progressBar = document.getElementById('upload-progress');
// 点击拖放区域触发文件选择
dropZone.addEventListener('click', () => {
firmwareFile.click();
});
// 文件拖入拖放区域
['dragenter', 'dragover'].forEach(eventName => {
dropZone.addEventListener(eventName, (e) => {
e.preventDefault();
e.stopPropagation();
dropZone.classList.add('highlight');
});
});
// 文件拖离拖放区域
['dragleave', 'drop'].forEach(eventName => {
dropZone.addEventListener(eventName, (e) => {
e.preventDefault();
e.stopPropagation();
dropZone.classList.remove('highlight');
});
});
// 文件放入拖放区域
dropZone.addEventListener('drop', (e) => {
const files = e.dataTransfer.files;
if (files.length) {
firmwareFile.files = files;
dropZone.textContent = files[0].name; // 更新文本内容为文件名
}
});
// 更新文本内容为文件名
firmwareFile.addEventListener('change', () => {
if (firmwareFile.files.length) {
dropZone.textContent = firmwareFile.files[0].name;
}
});
// 上传文件并显示进度
uploadButton.addEventListener('click', () => {
const file = firmwareFile.files[0];
if (!file) {
alert('请选择一个文件!');
return;
}
const formData = new FormData();
formData.append('update', file);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/update', true);
xhr.upload.onprogress = function (e) {
if (e.lengthComputable) {
const percentComplete = (e.loaded / e.total) * 100;
progressBar.value = percentComplete;
}
};
xhr.onload = function () {
if (xhr.status === 200) {
alert('上传成功!');
} else {
alert('上传失败,请重试。');
}
progressBar.value = 0;
};
xhr.onerror = function () {
alert('上传过程中发生错误。错误码:' + xhr.status);
progressBar.value = 0;
};
xhr.timeout = 100000; // 设置超时时间为100秒
xhr.ontimeout = function () {
alert('服务器无响应,页面将刷新。');
location.reload();
};
xhr.send(formData);
});
var history_data = [
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []},
{voltageHistory: [], currentHistory: [], powerHistory: []}
];
function addToHistory(index, voltage, current, power) {
history_data[index].voltageHistory.push(voltage);
history_data[index].currentHistory.push(current);
history_data[index].powerHistory.push(power);
history_data[index].voltageHistory = history_data[index].voltageHistory.slice(-500);
history_data[index].currentHistory = history_data[index].currentHistory.slice(-500);
history_data[index].powerHistory = history_data[index].powerHistory.slice(-500);
}
function updateStatus() {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/status', true);
xhr.onload = function () {
const cards = document.querySelectorAll('.status-card');
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
data = data.data;
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);
view.setFloat32(0, data[50], true);
var alert_tmp = new Uint8Array(buffer);
var index_convert = [8,9,0,1,2,3,4,5,6,7];
cards.forEach((card, index) => {
const voltage = card.querySelector('.voltage');
const current = card.querySelector('.current');
const power = card.querySelector('.power');
const alert = card.querySelector('.alert');
const canvas = card.querySelector('.chart');
// Update text content
voltage.textContent = data[index_convert[index]*2].toFixed(2);
current.textContent = data[index_convert[index]*2+1].toFixed(2);
power.textContent = data[index_convert[index]*3+20].toFixed(2);
// alert.textContent = data[index*2].alert;
addToHistory(index_convert[index], data[index_convert[index]*2], data[index_convert[index]*2+1], data[index_convert[index]*3+20]);
// Draw chart
drawChart(canvas, history_data[index_convert[index]]);
});
} else {
console.error('Failed to fetch status data');
cards.forEach((card) => {
const voltage = card.querySelector('.voltage');
const current = card.querySelector('.current');
const power = card.querySelector('.power');
const canvas = card.querySelector('.chart');
// Display NaN for text content
voltage.textContent = 'NaN';
current.textContent = 'NaN';
power.textContent = 'NaN';
addToHistory(index, 0, 0, 0);
// Draw chart with 0 values
drawChart(canvas, history_data[index]);
});
}
};
xhr.onerror = function () {
console.error('Error during status update request');
const cards = document.querySelectorAll('.status-card');
cards.forEach((card) => {
const voltage = card.querySelector('.voltage');
const current = card.querySelector('.current');
const power = card.querySelector('.power');
const canvas = card.querySelector('.chart');
// Display NaN for text content
voltage.textContent = 'NaN';
current.textContent = 'NaN';
power.textContent = 'NaN';
addToHistory(index, 0, 0, 0);
// Draw chart with 0 values
drawChart(canvas, history_data[index]);
});
};
xhr.send();
}
function drawChart(canvas, data) {
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 获取历史数据
const voltageData = data.voltageHistory || [0, 0, 0, 0, 0];
const currentData = data.currentHistory || [0, 0, 0, 0, 0];
const powerData = data.powerHistory || [0, 0, 0, 0, 0];
const allData = [...voltageData, ...currentData, ...powerData];
const maxValue = Math.max(...allData);
const minValue = Math.min(...allData);
const colors = {
voltage: 'blue',
current: 'green',
power: 'orange'
};
const maxPoints = voltageData.length;
const width = canvas.width;
const height = canvas.height;
const stepX = width / (maxPoints - 1);
function drawLine(data, color) {
ctx.beginPath();
ctx.strokeStyle = color;
ctx.lineWidth = 2;
data.forEach((value, index) => {
const x = index * stepX;
const y = height - ((value - minValue) / (maxValue - minValue)) * height; // 自动缩放
if (index === 0) {
ctx.moveTo(x, y);
} else {
ctx.lineTo(x, y);
}
});
ctx.stroke();
}
drawLine(voltageData, colors.voltage);
drawLine(currentData, colors.current);
drawLine(powerData, colors.power);
}
setInterval(updateStatus, 500);
const toggleSidebarButton = document.getElementById('toggle-sidebar');
const sidebar = document.querySelectorAll('.sidebar');
const sideButtonContainer = document.getElementById('side-button');
toggleSidebarButton.addEventListener('click', () => {
for(let i = 0; i < sidebar.length; i++) {
sidebar[i].classList.toggle('hidden');
}
sideButtonContainer.classList.toggle('hide-arrow');
sideButtonContainer.classList.toggle('show-arrow');
});

BIN
esp8266/web/script.js.gz Normal file

Binary file not shown.

304
esp8266/web/styles.css Normal file
View File

@@ -0,0 +1,304 @@
/* General styles */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
display: flex;
height: 100vh;
}
.container {
display: flex;
width: 100%;
}
/* Sidebar styles */
.sidebar {
position: fixed; /* 固定在页面左侧 */
top: 0;
left: 0;
height: 100%; /* 占满页面高度 */
overflow-y: auto; /* 如果内容过多,允许滚动 */
width: 200px;
background-color: #333;
color: white;
padding: 15px;
transition: width 0.3s, padding 0.3s;
z-index: 1; /* 设置侧边栏层级为 1 */
}
.sidebar nav ul {
list-style: none;
padding: 0;
}
.sidebar nav ul li {
margin: 10px 0;
}
.sidebar nav ul li a {
color: white;
text-decoration: none;
width: 170px;
}
/* .sidebar nav ul li a:hover {
text-decoration: underline;
} */
.sidebar a {
display: block; /* 整行可点击 */
padding: 10px 15px;
text-decoration: none; /* 去掉下划线 */
color: #ecf0f1; /* 默认文字颜色 */
background-color: #34495e; /* 默认背景颜色 */
border-radius: 5px;
transition: background-color 0.3s, color 0.3s; /* 添加过渡效果 */
}
.sidebar a:hover {
background-color: #1abc9c; /* 悬停时背景颜色 */
color: #ffffff; /* 悬停时文字颜色 */
text-decoration: none; /* 确保悬停时无下划线 */
cursor: pointer; /* 光标变为手型 */
}
.sidebar.hidden {
width: 0px; /* 保留切换按钮的宽度 */
padding-left: 0px; /* 去掉内边距 */
padding-right: 0px; /* 去掉内边距 */
overflow: hidden; /* 隐藏其他内容 */
/* display: none; */
}
/* Content styles */
.content {
flex-grow: 1;
padding: 20px;
}
.page {
display: none;
}
.page.active {
display: block;
}
/* Page 2 styles */
#drop-zone {
border: 2px dashed #ccc;
border-radius: 10px;
padding: 20px;
text-align: center;
color: #666;
margin-bottom: 15px;
cursor: pointer;
transition: background-color 0.3s;
}
#drop-zone:hover {
background-color: #f9f9f9;
}
#upload-progress {
width: 100%;
height: 20px;
margin: 10px 0;
}
#upload-button {
display: block;
width: 100%;
padding: 10px;
background-color: #007BFF;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
#upload-button:hover {
background-color: #0056b3;
}
/* Status grid styles */
.status-grid {
display: grid;
grid-template-columns: repeat(4, 1fr); /* 默认每排 4 个卡片 */
gap: 20px;
padding: 20px;
}
@media screen and (max-width: 1650px) {
.status-grid {
grid-template-columns: repeat(2, 1fr); /* 宽度小于 1650px 时每排 2 个卡片 */
}
}
@media screen and (max-width: 1000px) {
.status-grid {
grid-template-columns: repeat(1, 1fr); /* 宽度小于 1000px 时每排 1 个卡片 */
}
}
.status-item {
display: flex;
align-items: center;
justify-content: center;
background-color: #f0f0f0;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
text-align: center;
padding: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* Responsive design */
@media (max-width: 768px) {
#drop-zone {
font-size: 14px;
}
#upload-button {
font-size: 14px;
}
.status-item {
font-size: 14px;
}
}
body {
background-color: #3d3d3d; /* 深色背景 */
color: #ecf0f1; /* 浅色文字 */
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
.status-card {
background-color: #e5e5e5; /* 深色卡片背景 */
border: 2px solid #1abc9c; /* 突出的边框颜色 */
min-width: 250px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* 阴影效果 */
padding: 5px;
color: #ecf0f1;
transition: transform 0.2s, box-shadow 0.2s;
}
.status-card:hover {
transform: translateY(-5px); /* 悬停时上移效果 */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4); /* 悬停时更深的阴影 */
}
.status-card h2 {
margin-top: 0;
color: #1abc9c; /* 标题颜色 */
}
.settings-icon {
text-align: right;
font-size: 1.5em;
cursor: pointer;
}
.status-grid .status-card .status-card-info {
display: grid;
align-items: center;
text-align: center;
grid-template-columns: repeat(2, 1fr); /* 每行 2 个 */
}
.top-grid {
display: grid;
grid-template-columns: repeat(2, 1fr); /* 默认每排 2 个卡片 */
gap: 20px;
padding: 5px 20px 5px 20px;
}
@media screen and (max-width: 1000px) {
.top-grid {
grid-template-columns: repeat(1, 1fr); /* 宽度小于 1000px 时每排 1 个卡片 */
}
}
.top-grid .status-card .status-card-info{
display: grid;
grid-template-rows: auto;
grid-template-columns: repeat(4, 1fr); /* 电压、电流、功率、警报在同一行 */
align-items: center;
text-align: center;
}
@media screen and (max-width: 1650px) {
.top-grid .status-card .status-card-info{
grid-template-rows: auto auto auto; /* 默认布局 */
grid-template-columns: repeat(2, 1fr); /* 每行 2 个 */
}
}
.status-card canvas {
width: 90%; /* 根据卡片宽度的 90% 自动调整 */
display: block;
margin: 0 auto; /* 居中对齐 */
}
.top-grid canvas {
height: 140px; /* 固定高度 */
}
.status-grid canvas {
height: 130px; /* 固定高度 */
}
#toggle-sidebar {
width: 30px;
height: 30px;
background-color: #1abc9c;
color: #ffffff;
border: none;
border-radius: 50%;
cursor: pointer;
font-size: 16px;
display: block;
align-items: center;
justify-content: center;
transition: background-color 0.3s, transform 0.3s;
/* position: fixed; */
/* top: 50%;
left: 0;
transform: translateY(-50%); */
}
#toggle-sidebar:hover {
background-color: #16a085;
}
#side-button{
position: fixed; /* 悬浮于页面 */
top: 50%; /* 垂直居中 */
left: 5px; /* 固定在页面左侧 */
transform: translateY(-50%); /* 调整垂直居中位置 */
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
z-index: 2; /* 设置按钮层级为 2确保在侧边栏之上 */
}
.hide-arrow #toggle-sidebar {
transform: rotate(180deg); /* 收起时箭头旋转 */
}
.show-arrow #toggle-sidebar {
transform: rotate(0deg); /* 展开时箭头恢复 */
}

BIN
esp8266/web/styles.css.gz Normal file

Binary file not shown.