From bf7b122ceac748dc36b412a61ee9ac6812222cd6 Mon Sep 17 00:00:00 2001 From: vendetta Date: Mon, 17 Jul 2023 19:52:24 +0200 Subject: [PATCH 01/42] added warning to detect unreachable NRF chip; added basic interrupt handler;added missing exception on timeout # Conflicts: # tools/rpi/hoymiles/__init__.py --- tools/rpi/hoymiles/__init__.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tools/rpi/hoymiles/__init__.py b/tools/rpi/hoymiles/__init__.py index dbe564cc..46a9275c 100644 --- a/tools/rpi/hoymiles/__init__.py +++ b/tools/rpi/hoymiles/__init__.py @@ -344,6 +344,9 @@ class HoymilesNRF: if not radio.begin(): raise RuntimeError('Can\'t open radio') + + if not radio.isChipConnected(): + logging.warning("could not connect to NRF24 radio") self.txpower = radio_config.get('txpower', 'max') @@ -411,7 +414,7 @@ class HoymilesNRF: self.radio.startListening() fragments = [] - + received_sth=False # Receive: Loop t_end = time.monotonic_ns()+timeout while time.monotonic_ns() < t_end: @@ -431,7 +434,7 @@ class HoymilesNRF: ch_rx=self.rx_channel, ch_tx=self.tx_channel, time_rx=datetime.now() ) - + received_sth=True yield fragment else: @@ -447,7 +450,11 @@ class HoymilesNRF: self.radio.setChannel(self.rx_channel) self.radio.startListening() - time.sleep(0.004) + time.sleep(0.005) + + if not received_sth: + raise TimeoutError + def next_rx_channel(self): """ From ba7d3e8b8b4e5eb39588a4d0dfc06012e33805cc Mon Sep 17 00:00:00 2001 From: vendetta Date: Mon, 27 Mar 2023 20:23:04 +0200 Subject: [PATCH 02/42] fixed mqtt client usage with sun timings; fixed null pointer when sun times are disabled --- tools/rpi/hoymiles/__main__.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/rpi/hoymiles/__main__.py b/tools/rpi/hoymiles/__main__.py index fef496f7..377bc946 100644 --- a/tools/rpi/hoymiles/__main__.py +++ b/tools/rpi/hoymiles/__main__.py @@ -103,10 +103,11 @@ class SunsetHandler: def sun_status2mqtt(self, dtu_ser, dtu_name): if not mqtt_client or not self.suntimes: return - local_sunrise = self.suntimes.riselocal(datetime.now()).strftime("%d.%m.%YT%H:%M") - local_sunset = self.suntimes.setlocal(datetime.now()).strftime("%d.%m.%YT%H:%M") - local_zone = self.suntimes.setlocal(datetime.now()).tzinfo._key + if self.suntimes: + local_sunrise = self.suntimes.riselocal(datetime.now()).strftime("%d.%m.%YT%H:%M") + local_sunset = self.suntimes.setlocal(datetime.now()).strftime("%d.%m.%YT%H:%M") + local_zone = self.suntimes.setlocal(datetime.now()).tzinfo._key mqtt_client.info2mqtt({'topic' : f'{dtu_name}/{dtu_ser}'}, \ {'dis_night_comm' : 'True', \ 'local_sunrise' : local_sunrise, \ @@ -409,7 +410,7 @@ if __name__ == '__main__': str(g_inverter_ser), g_inverter.get('mqtt', {}).get('topic', f'hoymiles/{g_inverter_ser}') + '/command' ) - mqtt_client.subscribe(topic_item[1]) + mqtt_client.client.subscribe(topic_item[1]) mqtt_command_topic_subs.append(topic_item) # start main-loop From a8343fdbb8301499da9161e2ec58714627d192a7 Mon Sep 17 00:00:00 2001 From: vendetta Date: Thu, 30 Mar 2023 19:46:01 +0200 Subject: [PATCH 03/42] added venv to ignore # Conflicts: # .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2ee4b679..21ae2a57 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ src/web/html/tmp/* *.suo *.ipch src/output.map + +/.venv From a269edc03c18b1c4bc8ecb5a35e6fb5800e4fc44 Mon Sep 17 00:00:00 2001 From: vendetta Date: Mon, 17 Jul 2023 19:31:42 +0200 Subject: [PATCH 04/42] fixed change in dependency --- tools/rpi/hoymiles/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/rpi/hoymiles/__main__.py b/tools/rpi/hoymiles/__main__.py index 377bc946..3ca840da 100644 --- a/tools/rpi/hoymiles/__main__.py +++ b/tools/rpi/hoymiles/__main__.py @@ -107,7 +107,7 @@ class SunsetHandler: if self.suntimes: local_sunrise = self.suntimes.riselocal(datetime.now()).strftime("%d.%m.%YT%H:%M") local_sunset = self.suntimes.setlocal(datetime.now()).strftime("%d.%m.%YT%H:%M") - local_zone = self.suntimes.setlocal(datetime.now()).tzinfo._key + local_zone = self.suntimes.setlocal(datetime.now()).tzinfo.key mqtt_client.info2mqtt({'topic' : f'{dtu_name}/{dtu_ser}'}, \ {'dis_night_comm' : 'True', \ 'local_sunrise' : local_sunrise, \ From b475c34878e55bf89e77b7dfc9da830d15c2fa16 Mon Sep 17 00:00:00 2001 From: vendetta Date: Mon, 17 Jul 2023 19:32:11 +0200 Subject: [PATCH 05/42] fixed NoneType access --- tools/rpi/hoymiles/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/rpi/hoymiles/__main__.py b/tools/rpi/hoymiles/__main__.py index 3ca840da..581b5acb 100644 --- a/tools/rpi/hoymiles/__main__.py +++ b/tools/rpi/hoymiles/__main__.py @@ -236,14 +236,14 @@ def poll_inverter(inverter, dtu_ser, do_init, retries): if isinstance(result, hoymiles.decoders.StatusResponse): data = result.__dict__() - if 'event_count' in data: + if data is not None and 'event_count' in data: if event_message_index[inv_str] < data['event_count']: event_message_index[inv_str] = data['event_count'] command_queue[inv_str].append(hoymiles.compose_send_time_payload(InfoCommands.AlarmData, alarm_id=event_message_index[inv_str])) if mqtt_client: mqtt_client.store_status(result, topic=inverter.get('mqtt', {}).get('topic', None)) - + if influx_client: influx_client.store_status(result) From 921506d543ca5dc2cd6bb2ebe06e3f69deecd345 Mon Sep 17 00:00:00 2001 From: vendetta Date: Thu, 21 Sep 2023 20:23:56 +0200 Subject: [PATCH 06/42] fixed None access --- tools/rpi/hoymiles/outputs.py | 73 ++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/tools/rpi/hoymiles/outputs.py b/tools/rpi/hoymiles/outputs.py index 11971a85..aa574f2d 100644 --- a/tools/rpi/hoymiles/outputs.py +++ b/tools/rpi/hoymiles/outputs.py @@ -227,6 +227,11 @@ class MqttOutputPlugin(OutputPluginFactory): """ data = response.__dict__() + + if data is None: + logging.warn("received data object is empty") + return + topic = params.get('topic', None) if not topic: topic = f'{data.get("inverter_name", "hoymiles")}/{data.get("inverter_ser", None)}' @@ -243,31 +248,33 @@ class MqttOutputPlugin(OutputPluginFactory): # AC Data phase_id = 0 phase_sum_power = 0 - for phase in data['phases']: - self.client.publish(f'{topic}/emeter/{phase_id}/voltage', phase['voltage'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter/{phase_id}/current', phase['current'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter/{phase_id}/power', phase['power'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter/{phase_id}/Q_AC', phase['reactive_power'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter/{phase_id}/frequency', phase['frequency'], self.qos, self.ret) - phase_id = phase_id + 1 - phase_sum_power += phase['power'] + if data['phases'] is not None: + for phase in data['phases']: + self.client.publish(f'{topic}/emeter/{phase_id}/voltage', phase['voltage'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter/{phase_id}/current', phase['current'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter/{phase_id}/power', phase['power'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter/{phase_id}/Q_AC', phase['reactive_power'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter/{phase_id}/frequency', phase['frequency'], self.qos, self.ret) + phase_id = phase_id + 1 + phase_sum_power += phase['power'] # DC Data string_id = 0 string_sum_power = 0 - for string in data['strings']: - if 'name' in string: - string_name = string['name'].replace(" ","_") - else: - string_name = string_id - self.client.publish(f'{topic}/emeter-dc/{string_name}/voltage', string['voltage'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter-dc/{string_name}/current', string['current'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter-dc/{string_name}/power', string['power'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter-dc/{string_name}/YieldDay', string['energy_daily'], self.qos, self.ret) - self.client.publish(f'{topic}/emeter-dc/{string_name}/YieldTotal', string['energy_total']/1000, self.qos, self.ret) - self.client.publish(f'{topic}/emeter-dc/{string_name}/Irradiation', string['irradiation'], self.qos, self.ret) - string_id = string_id + 1 - string_sum_power += string['power'] + if data['strings'] is not None: + for string in data['strings']: + if 'name' in string: + string_name = string['name'].replace(" ","_") + else: + string_name = string_id + self.client.publish(f'{topic}/emeter-dc/{string_name}/voltage', string['voltage'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter-dc/{string_name}/current', string['current'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter-dc/{string_name}/power', string['power'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter-dc/{string_name}/YieldDay', string['energy_daily'], self.qos, self.ret) + self.client.publish(f'{topic}/emeter-dc/{string_name}/YieldTotal', string['energy_total']/1000, self.qos, self.ret) + self.client.publish(f'{topic}/emeter-dc/{string_name}/Irradiation', string['irradiation'], self.qos, self.ret) + string_id = string_id + 1 + string_sum_power += string['power'] # Global if data['event_count'] is not None: @@ -279,19 +286,23 @@ class MqttOutputPlugin(OutputPluginFactory): self.client.publish(f'{topic}/YieldTotal', data['yield_total']/1000, self.qos, self.ret) if data['yield_today'] is not None: self.client.publish(f'{topic}/YieldToday', data['yield_today']/1000, self.qos, self.ret) - self.client.publish(f'{topic}/Efficiency', data['efficiency'], self.qos, self.ret) + if data['efficiency'] is not None: + self.client.publish(f'{topic}/Efficiency', data['efficiency'], self.qos, self.ret) elif isinstance(response, HardwareInfoResponse): - self.client.publish(f'{topic}/Firmware/Version',\ - f'{data["FW_ver_maj"]}.{data["FW_ver_min"]}.{data["FW_ver_pat"]}', self.qos, self.ret) - - self.client.publish(f'{topic}/Firmware/Build_at',\ - f'{data["FW_build_dd"]}/{data["FW_build_mm"]}/{data["FW_build_yy"]}T{data["FW_build_HH"]}:{data["FW_build_MM"]}',\ - self.qos, self.ret) - - self.client.publish(f'{topic}/Firmware/HWPartId',\ - f'{data["FW_HW_ID"]}', self.qos, self.ret) + if data["FW_ver_maj"] is not None and data["FW_ver_min"] is not None and data["FW_ver_pat"] is not None: + self.client.publish(f'{topic}/Firmware/Version',\ + f'{data["FW_ver_maj"]}.{data["FW_ver_min"]}.{data["FW_ver_pat"]}', self.qos, self.ret) + + if data["FW_build_dd"] is not None and data["FW_build_mm"] is not None and data["FW_build_yy"] is not None and data["FW_build_HH"] is not None and data["FW_build_MM"] is not None: + self.client.publish(f'{topic}/Firmware/Build_at',\ + f'{data["FW_build_dd"]}/{data["FW_build_mm"]}/{data["FW_build_yy"]}T{data["FW_build_HH"]}:{data["FW_build_MM"]}',\ + self.qos, self.ret) + + if data["FW_HW_ID"] is not None: + self.client.publish(f'{topic}/Firmware/HWPartId',\ + f'{data["FW_HW_ID"]}', self.qos, self.ret) else: raise ValueError('Data needs to be instance of StatusResponse or a instance of HardwareInfoResponse') From 3e9d6b89003e9032d473f89434d75a9506d2c2a4 Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 4 Oct 2023 22:16:32 +0200 Subject: [PATCH 07/42] 0.7.66 - 2023-10-04 * prepared PA-Level for CMT * removed settings for number of retransmits, its fixed to `5` now * added parentheses to have a excactly defined behaviour --- src/CHANGES.md | 5 ++++ src/app.cpp | 4 +-- src/config/config.h | 5 +--- src/config/settings.h | 4 --- src/defines.h | 2 +- src/hm/hmPayload.h | 4 +-- src/hm/miPayload.h | 4 +-- src/hm/radio.h | 4 +-- src/hms/cmt2300a.h | 64 +++++++++++++++++++++++++++++++++++++++-- src/web/RestApi.h | 1 - src/web/html/setup.html | 6 ++-- src/web/web.h | 2 -- 12 files changed, 80 insertions(+), 25 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 1b6ec262..2afb1ece 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,10 @@ # Development Changes +## 0.7.66 - 2023-10-04 +* prepared PA-Level for CMT +* removed settings for number of retransmits, its fixed to `5` now +* added parentheses to have a excactly defined behaviour + ## 0.7.65 - 2023-10-02 * MI control command review #1197 diff --git a/src/app.cpp b/src/app.cpp index 478cd1e5..84423d4c 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -71,11 +71,11 @@ void app::setup() { }); } - mPayload.setup(this, &mSys, mConfig->nrf.maxRetransPerPyld, &mTimestamp); + mPayload.setup(this, &mSys, &mTimestamp); mPayload.enableSerialDebug(mConfig->serial.debug); mPayload.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); if (mConfig->nrf.enabled) { - mMiPayload.setup(this, &mSys, mConfig->nrf.maxRetransPerPyld, &mTimestamp); + mMiPayload.setup(this, &mSys, &mTimestamp); mMiPayload.enableSerialDebug(mConfig->serial.debug); mMiPayload.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); } diff --git a/src/config/config.h b/src/config/config.h index 445fe35e..da027fd6 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -149,7 +149,7 @@ #define SERIAL_INTERVAL 5 // default send interval -#define SEND_INTERVAL 30 +#define SEND_INTERVAL 15 // maximum human readable inverter name length #define MAX_NAME_LENGTH 16 @@ -160,9 +160,6 @@ // maximum total payload buffers (must be greater than the number of received frame fragments) #define MAX_PAYLOAD_ENTRIES 10 -// maximum requests for retransmits per payload (per inverter) -#define DEF_MAX_RETRANS_PER_PYLD 5 - // number of seconds since last successful response, before inverter is marked inactive #define INVERTER_INACT_THRES_SEC 5*60 diff --git a/src/config/settings.h b/src/config/settings.h index a6100d99..0771c148 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -82,7 +82,6 @@ typedef struct { typedef struct { bool enabled; uint16_t sendInterval; - uint8_t maxRetransPerPyld; uint8_t pinCs; uint8_t pinCe; uint8_t pinIrq; @@ -385,7 +384,6 @@ class settings { snprintf(mCfg.sys.deviceName, DEVNAME_LEN, DEF_DEVICE_NAME); mCfg.nrf.sendInterval = SEND_INTERVAL; - mCfg.nrf.maxRetransPerPyld = DEF_MAX_RETRANS_PER_PYLD; mCfg.nrf.pinCs = DEF_NRF_CS_PIN; mCfg.nrf.pinCe = DEF_NRF_CE_PIN; mCfg.nrf.pinIrq = DEF_NRF_IRQ_PIN; @@ -502,7 +500,6 @@ class settings { void jsonNrf(JsonObject obj, bool set = false) { if(set) { obj[F("intvl")] = mCfg.nrf.sendInterval; - obj[F("maxRetry")] = mCfg.nrf.maxRetransPerPyld; obj[F("cs")] = mCfg.nrf.pinCs; obj[F("ce")] = mCfg.nrf.pinCe; obj[F("irq")] = mCfg.nrf.pinIrq; @@ -513,7 +510,6 @@ class settings { obj[F("en")] = (bool) mCfg.nrf.enabled; } else { getVal(obj, F("intvl"), &mCfg.nrf.sendInterval); - getVal(obj, F("maxRetry"), &mCfg.nrf.maxRetransPerPyld); getVal(obj, F("cs"), &mCfg.nrf.pinCs); getVal(obj, F("ce"), &mCfg.nrf.pinCe); getVal(obj, F("irq"), &mCfg.nrf.pinIrq); diff --git a/src/defines.h b/src/defines.h index f5543752..c7d5700a 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 7 -#define VERSION_PATCH 65 +#define VERSION_PATCH 66 //------------------------------------- typedef struct { diff --git a/src/hm/hmPayload.h b/src/hm/hmPayload.h index 0efa28a4..13f4edd5 100644 --- a/src/hm/hmPayload.h +++ b/src/hm/hmPayload.h @@ -44,10 +44,10 @@ class HmPayload { public: HmPayload() {} - void setup(IApp *app, HMSYSTEM *sys, uint8_t maxRetransmits, uint32_t *timestamp) { + void setup(IApp *app, HMSYSTEM *sys, uint32_t *timestamp) { mApp = app; mSys = sys; - mMaxRetrans = maxRetransmits; + mMaxRetrans = 5; mTimestamp = timestamp; for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { reset(i); diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index 32b16696..94f7a9b3 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -44,10 +44,10 @@ class MiPayload { public: MiPayload() {} - void setup(IApp *app, HMSYSTEM *sys, uint8_t maxRetransmits, uint32_t *timestamp) { + void setup(IApp *app, HMSYSTEM *sys, uint32_t *timestamp) { mApp = app; mSys = sys; - mMaxRetrans = maxRetransmits; + mMaxRetrans = 5; mTimestamp = timestamp; for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { reset(i, false, true); diff --git a/src/hm/radio.h b/src/hm/radio.h index 5f95fc8a..e2112586 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -66,9 +66,9 @@ class Radio { void updateCrcs(uint8_t *len, bool appendCrc16=true) { // append crc's - if (appendCrc16 && (*len > 10)) { + if (appendCrc16 && ((*len) > 10)) { // crc control data - uint16_t crc = ah::crc16(&mTxBuf[10], *len - 10); + uint16_t crc = ah::crc16(&mTxBuf[10], (*len) - 10); mTxBuf[(*len)++] = (crc >> 8) & 0xff; mTxBuf[(*len)++] = (crc ) & 0xff; } diff --git a/src/hms/cmt2300a.h b/src/hms/cmt2300a.h index a4308519..9d00ba20 100644 --- a/src/hms/cmt2300a.h +++ b/src/hms/cmt2300a.h @@ -25,6 +25,10 @@ #define CMT2300A_MASK_CHIP_MODE_STA 0x0F #define CMT2300A_CUS_CMT10 0x09 +#define CMT2300A_CUS_TX5 0x59 +#define CMT2300A_CUS_TX8 0x5C +#define CMT2300A_CUS_TX9 0x5D +#define CMT2300A_CUS_TX10 0x5E #define CMT2300A_CUS_MODE_CTL 0x60 // [7] go_switch // [6] go_tx @@ -153,6 +157,42 @@ #define CMT2300A_MASK_TX_DONE_FLG 0x08 #define CMT2300A_MASK_PKT_OK_FLG 0x01 +// this list and the TX5, TX10 registers were compiled from the output of +// HopeRF RFPDK Tool v1.54 +static uint8_t paLevelList[31][2] PROGMEM = { + {0x17, 0x01}, // -10dBm + {0x1a, 0x01}, // -09dBm + {0x1d, 0x01}, // -08dBm + {0x21, 0x01}, // -07dBm + {0x25, 0x01}, // -06dBm + {0x29, 0x01}, // -05dBm + {0x2d, 0x01}, // -04dBm + {0x33, 0x01}, // -03dBm + {0x39, 0x02}, // -02dBm + {0x41, 0x02}, // -01dBm + {0x4b, 0x02}, // 00dBm + {0x56, 0x03}, // 01dBm + {0x63, 0x03}, // 02dBm + {0x71, 0x04}, // 03dBm + {0x80, 0x04}, // 04dBm + {0x22, 0x01}, // 05dBm + {0x27, 0x04}, // 06dBm + {0x2c, 0x05}, // 07dBm + {0x31, 0x06}, // 08dBm + {0x38, 0x06}, // 09dBm + {0x3f, 0x07}, // 10dBm + {0x48, 0x08}, // 11dBm + {0x52, 0x09}, // 12dBm + {0x5d, 0x0b}, // 13dBm + {0x6a, 0x0c}, // 14dBm + {0x79, 0x0d}, // 15dBm + {0x46, 0x10}, // 16dBm + {0x51, 0x10}, // 17dBm + {0x60, 0x12}, // 18dBm + {0x71, 0x14}, // 19dBm + {0x8c, 0x1c} // 20dBm +}; + // default CMT parameters static uint8_t cmtConfig[0x60] PROGMEM { // 0x00 - 0x0f -- RSSI offset +- 0 and 13dBm @@ -168,11 +208,11 @@ static uint8_t cmtConfig[0x60] PROGMEM { 0x10, 0x00, 0xB4, 0x00, 0x00, 0x01, 0x00, 0x00, 0x12, 0x1E, 0x00, 0xAA, 0x06, 0x00, 0x00, 0x00, // 0x40 - 0x4f - 0x00, 0x48, 0x5A, 0x48, 0x4D, 0x01, 0x1D, 0x00, + 0x00, 0x48, 0x5A, 0x48, 0x4D, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x60, // 0x50 - 0x5f 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x70, 0x4D, 0x06, - 0x00, 0x07, 0x50, 0x00, 0x42, 0x0C, 0x3F, 0x7F // - TX 13dBm + 0x00, 0x07, 0x50, 0x00, 0x5D, 0x0B, 0x3F, 0x7F // - TX 13dBm }; @@ -391,6 +431,26 @@ class Cmt2300a { return HOY_BASE_FREQ_KHZ + (mCurCh * FREQ_STEP_KHZ); } + void setPaLevel(int8_t level) { + if(level < -10) + level = -10; + if(level > 20) + level = 20; + + level += 10; // unsigned value + + if(level >= 15) { + mSpi.writeReg(CMT2300A_CUS_TX5, 0x07); + mSpi.writeReg(CMT2300A_CUS_TX10, 0x3f); + } else { + mSpi.writeReg(CMT2300A_CUS_TX5, 0x13); + mSpi.writeReg(CMT2300A_CUS_TX10, 0x18); + } + + mSpi.writeReg(CMT2300A_CUS_TX8, paLevelList[level][0]); + mSpi.writeReg(CMT2300A_CUS_TX9, paLevelList[level][1]); + } + private: void init() { mTxPending = false; diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 39c97532..225c26c8 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -356,7 +356,6 @@ class RestApi { } } obj[F("interval")] = String(mConfig->nrf.sendInterval); - obj[F("retries")] = String(mConfig->nrf.maxRetransPerPyld); obj[F("max_num_inverters")] = MAX_NUM_INVERTERS; obj[F("rstMid")] = (bool)mConfig->inst.rstYieldMidNight; obj[F("rstNotAvail")] = (bool)mConfig->inst.rstValsNotAvail; diff --git a/src/web/html/setup.html b/src/web/html/setup.html index d58aa226..b9697141 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -30,7 +30,7 @@
System Config -

Pinout

+

Status LEDs

Radio (NRF24L01+)

@@ -736,11 +736,11 @@ function parsePinout(obj, type, system) { var e = document.getElementById("pinout"); - pins = [['led0', 'pinLed0'], ['led1', 'pinLed1']]; + pins = [['led0', 'pinLed0', 'At least one inverter is producing'], ['led1', 'pinLed1', 'MqTT connected']]; for(p of pins) { e.append( ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-12 col-sm-3 my-2"}, p[0].toUpperCase()), + ml("div", {class: "col-12 col-sm-3 my-2"}, p[2]), ml("div", {class: "col-12 col-sm-9"}, sel(p[1], ("ESP8266" == type) ? esp8266pins : ("ESP32-S3" == system["chip_model"]) ? esp32s3pins : esp32pins, obj[p[0]]) ) diff --git a/src/web/web.h b/src/web/web.h index 99dd5924..fabbd604 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -527,8 +527,6 @@ class Web { if (request->arg("invInterval") != "") mConfig->nrf.sendInterval = request->arg("invInterval").toInt(); - if (request->arg("invRetry") != "") - mConfig->nrf.maxRetransPerPyld = request->arg("invRetry").toInt(); mConfig->inst.rstYieldMidNight = (request->arg("invRstMid") == "on"); mConfig->inst.rstValsCommStop = (request->arg("invRstComStop") == "on"); mConfig->inst.rstValsNotAvail = (request->arg("invRstNotAvail") == "on"); From 5a81a54738b3f1ec1231e4130520e256b843eeb7 Mon Sep 17 00:00:00 2001 From: lumapu Date: Mon, 9 Oct 2023 23:59:04 +0200 Subject: [PATCH 08/42] started to improve communication (from scratch) --- src/app.cpp | 25 +++++--- src/app.h | 8 +++ src/defines.h | 1 + src/hm/CommQueue.h | 87 +++++++++++++++++++++++++++ src/hm/Communication.h | 129 +++++++++++++++++++++++++++++++++++++++++ src/hm/hmRadio.h | 2 - src/hm/radio.h | 4 ++ src/hms/hmsRadio.h | 2 - 8 files changed, 246 insertions(+), 12 deletions(-) create mode 100644 src/hm/CommQueue.h create mode 100644 src/hm/Communication.h diff --git a/src/app.cpp b/src/app.cpp index 84423d4c..a834d091 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -59,26 +59,29 @@ void app::setup() { #endif #endif /* defined(ETHERNET) */ + mCommunication.setup(&mTimestamp); mSys.setup(&mTimestamp, &mConfig->inst); for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { mSys.addInverter(i, [this](Inverter<> *iv) { + // will be only called for valid inverters if((IV_MI == iv->ivGen) || (IV_HM == iv->ivGen)) iv->radio = &mNrfRadio; #if defined(ESP32) else if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) iv->radio = &mCmtRadio; #endif + mCommunication.add(iv, 0x01, false); }); } - mPayload.setup(this, &mSys, &mTimestamp); + /*mPayload.setup(this, &mSys, &mTimestamp); mPayload.enableSerialDebug(mConfig->serial.debug); mPayload.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); if (mConfig->nrf.enabled) { mMiPayload.setup(this, &mSys, &mTimestamp); mMiPayload.enableSerialDebug(mConfig->serial.debug); mMiPayload.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); - } + }*/ if(mConfig->nrf.enabled) { if (!mNrfRadio.isChipConnected()) @@ -91,8 +94,8 @@ void app::setup() { if (mMqttEnabled) { mMqtt.setup(&mConfig->mqtt, mConfig->sys.deviceName, mVersion, &mSys, &mTimestamp, &mUptime); mMqtt.setSubscriptionCb(std::bind(&app::mqttSubRxCb, this, std::placeholders::_1)); - mPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); - mMiPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); + //mPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); + //mMiPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); } #endif setupLed(); @@ -103,8 +106,10 @@ void app::setup() { mApi.setup(this, &mSys, mWeb.getWebSrvPtr(), mConfig); // Plugins + #if defined(PLUGIN_DISPLAY) if (mConfig->plugin.display.type != 0) mDisplay.setup(this, &mConfig->plugin.display, &mSys, &mNrfRadio, &mTimestamp); + #endif mPubSerial.setup(mConfig, &mSys, &mTimestamp); @@ -120,7 +125,9 @@ void app::loop(void) { ah::Scheduler::loop(); bool processPayload = false; - if (mNrfRadio.loop() && mConfig->nrf.enabled) { + mCommunication.loop(); + + /*if (mNrfRadio.loop() && mConfig->nrf.enabled) { while (!mNrfRadio.mBufCtrl.empty()) { packet_t *p = &mNrfRadio.mBufCtrl.front(); if (mConfig->serial.debug) { @@ -178,7 +185,7 @@ void app::loop(void) { mPayload.process(true); mPayload.loop(); - mMiPayload.loop(); + mMiPayload.loop();*/ if (mMqttEnabled && mNetworkConnected) mMqtt.loop(); @@ -208,8 +215,10 @@ void app::regularTickers(void) { DPRINTLN(DBG_DEBUG, F("regularTickers")); everySec(std::bind(&WebType::tickSecond, &mWeb), "webSc"); // Plugins + #if defined(PLUGIN_DISPLAY) if (mConfig->plugin.display.type != 0) everySec(std::bind(&DisplayType::tickerSecond, &mDisplay), "disp"); + #endif every(std::bind(&PubSerialType::tick, &mPubSerial), mConfig->serial.interval, "uart"); #if !defined(ETHERNET) //everySec([this]() { mImprov.tickSerial(); }, "impro"); @@ -391,7 +400,7 @@ void app::tickMidnight(void) { //----------------------------------------------------------------------------- void app::tickSend(void) { - if(mConfig->nrf.enabled) { + /*if(mConfig->nrf.enabled) { if(!mNrfRadio.isChipConnected()) { DPRINTLN(DBG_WARN, F("NRF24 not connected!")); } @@ -437,7 +446,7 @@ void app::tickSend(void) { if (mConfig->serial.debug) DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); } - yield(); + yield();*/ updateLed(); } diff --git a/src/app.h b/src/app.h index ac516302..9cc90100 100644 --- a/src/app.h +++ b/src/app.h @@ -25,6 +25,7 @@ #include "utils/scheduler.h" #include "web/RestApi.h" #include "web/web.h" +#include "hm/Communication.h" #if defined(ETHERNET) #include "eth/ahoyeth.h" #else /* defined(ETHERNET) */ @@ -52,9 +53,11 @@ typedef PubMqtt PubMqttType; typedef PubSerial PubSerialType; // PLUGINS +#if defined(PLUGIN_DISPLAY) #include "plugins/Display/Display.h" #include "plugins/Display/Display_data.h" typedef Display> DisplayType; +#endif class app : public IApp, public ah::Scheduler { public: @@ -258,8 +261,10 @@ class app : public IApp, public ah::Scheduler { if (mMqttEnabled) mMqtt.payloadEventListener(cmd, iv); #endif + #if defined(PLUGIN_DISPLAY) if(mConfig->plugin.display.type != 0) mDisplay.payloadEventListener(cmd); + #endif updateLed(); } @@ -302,6 +307,7 @@ class app : public IApp, public ah::Scheduler { HmSystemType mSys; HmRadio<> mNrfRadio; + Communication mCommunication; bool mShowRebootRequest; bool mIVCommunicationOn; @@ -344,8 +350,10 @@ class app : public IApp, public ah::Scheduler { uint32_t mSunrise, mSunset; // plugins + #if defined(PLUGIN_DISPLAY) DisplayType mDisplay; DisplayData mDispData; + #endif }; #endif /*__APP_H__*/ diff --git a/src/defines.h b/src/defines.h index c7d5700a..860231ba 100644 --- a/src/defines.h +++ b/src/defines.h @@ -21,6 +21,7 @@ typedef struct { uint8_t len; int8_t rssi; uint8_t packet[MAX_RF_PAYLOAD_SIZE]; + //uint32_t millis; } packet_t; typedef enum { diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h new file mode 100644 index 00000000..3f0e2da8 --- /dev/null +++ b/src/hm/CommQueue.h @@ -0,0 +1,87 @@ +//----------------------------------------------------------------------------- +// 2023 Ahoy, https://github.com/lumpapu/ahoy +// Creative Commons - http://creativecommons.org/licenses/by-nc-sa/4.0/deed +//----------------------------------------------------------------------------- + +#ifndef __COMM_QUEUE_H__ +#define __COMM_QUEUE_H__ + +#include +#include +#include "hmInverter.h" + +template +class CommQueue { + public: + CommQueue() {} + + void addImportant(Inverter<> *iv, uint8_t cmd, bool delIfFailed = true) { + dec(&mRdPtr); + mQueue[mRdPtr] = queue_s(iv, cmd, delIfFailed); + } + + void add(Inverter<> *iv, uint8_t cmd, bool delIfFailed = true) { + mQueue[mWrPtr] = queue_s(iv, cmd, delIfFailed); + inc(&mWrPtr); + } + + protected: + struct queue_s { + Inverter<> *iv; + uint8_t cmd; + uint8_t attempts; + bool delIfFailed; + bool done; + uint32_t ts; + queue_s() {} + queue_s(Inverter<> *i, uint8_t c, bool d) : + iv(i), cmd(c), attempts(5), done(false), ts(0), delIfFailed(d) {} + }; + + protected: + void add(queue_s q) { + mQueue[mWrPtr] = q; + inc(&mWrPtr); + } + + void get(std::function cb) { + if(mRdPtr == mWrPtr) { + cb(false, &mQueue[mRdPtr]); // empty + return; + } + cb(true, &mQueue[mRdPtr]); + } + + void pop(void) { + if(!mQueue[mRdPtr].delIfFailed) + add(mQueue[mRdPtr]); // add to the end again + inc(&mRdPtr); + } + + void setTs(uint32_t *ts) { + mQueue[mRdPtr].ts = *ts; + } + + void setDone(void) { + mQueue[mRdPtr].done = true; + } + + void inc(uint8_t *ptr) { + if(++(*ptr) >= N) + *ptr = 0; + } + void dec(uint8_t *ptr) { + if((*ptr) == 0) + *ptr = N-1; + else + --(*ptr); + } + + protected: + std::array mQueue; + uint8_t mWrPtr = 0; + uint8_t mRdPtr = 0; +}; + + +#endif /*__COMM_QUEUE_H__*/ diff --git a/src/hm/Communication.h b/src/hm/Communication.h new file mode 100644 index 00000000..1d165186 --- /dev/null +++ b/src/hm/Communication.h @@ -0,0 +1,129 @@ +//----------------------------------------------------------------------------- +// 2023 Ahoy, https://github.com/lumpapu/ahoy +// Creative Commons - http://creativecommons.org/licenses/by-nc-sa/4.0/deed +//----------------------------------------------------------------------------- + +#ifndef __COMMUNICATION_H__ +#define __COMMUNICATION_H__ + +#include "CommQueue.h" +#include +#include "../utils/crc.h" + +class Communication : public CommQueue<> { + public: + void setup(uint32_t *timestamp) { + mTimestamp = timestamp; + } + + void loop() { + get([this](bool valid, const queue_s *q) { + if(!valid) + return; // empty + + switch(mState) { + case States::IDLE: + setTs(mTimestamp); + q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); + lastMillis = millis(); + lastFound = false; + mState = States::WAIT; + break; + + case States::WAIT: + if((millis()-lastMillis) < 500) + return; + mState = States::CHECK_FRAMES; + break; + + case States::CHECK_FRAMES: + if(!q->iv->radio->loop()) + break; // radio buffer empty + + while(!q->iv->radio->mBufCtrl.empty()) { + packet_t *p = &q->iv->radio->mBufCtrl.front(); + q->iv->radio->mBufCtrl.pop(); + + if(!checkIvSerial(&p->packet[1], q->iv)) + continue; // inverter ID incorrect + + q->iv->radioStatistics.frmCnt++; + + if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) // response from get information command + parseFrame(p); + else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command + parseDevCtrl(p); + + yield(); + } + break; + } + }); + } + + void gotData() { + setDone(); + } + + private: + inline bool checkIvSerial(uint8_t buf[], Inverter<> *iv) { + uint8_t tmp[4]; + CP_U32_BigEndian(tmp, iv->radioId.u64 >> 8); + for(uint8_t i = 0; i < 4; i++) { + if(tmp[i] != buf[i]) + return false; + } + return true; + } + + inline bool checkFrameCrc(uint8_t buf[], uint8_t len) { + return (ah::crc8(buf, len - 1) == buf[len-1]); + } + + inline void parseFrame(packet_t *p) { + uint8_t *frameId = &p->packet[9]; + if(0x00 == *frameId) + return; // skip current packet + if((*frameId & 0x7f) > MAX_PAYLOAD_ENTRIES) + return; // local storage is to small for id + + if(!checkFrameCrc(p->packet, p->len)) + return; // CRC8 is wrong, frame invalid + + if((*frameId & ALL_FRAMES) == ALL_FRAMES) { + maxFrameId = (*frameId & 0x7f); + if(*frameId > 0x81) + lastFound = true; + } + + frame_t *f = &mLocalBuf[(*frameId & 0x7f) - 1]; + memcpy(f->buf, &p->packet[10], p->len-11); + f->len = p->len - 11; + f->rssi = p->rssi; + } + + inline void parseDevCtrl(packet_t *p) { + //if((p->packet[12] == ActivePowerContr) && (p->packet[13] == 0x00)) + } + + private: + enum class States : uint8_t { + IDLE, WAIT, CHECK_FRAMES + }; + + typedef struct { + uint8_t buf[MAX_RF_PAYLOAD_SIZE]; + uint8_t len; + int8_t rssi; + } frame_t; + + private: + States mState = States::IDLE; + uint32_t *mTimestamp; + uint32_t lastMillis; + std::array mLocalBuf; + bool lastFound; + uint8_t maxFrameId; +}; + +#endif /*__COMMUNICATION_H__*/ diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index a3368c0f..45278e6b 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -238,8 +238,6 @@ class HmRadio : public Radio { return mNrf24.isPVariant(); } - std::queue mBufCtrl; - private: inline bool getReceived(void) { bool tx_ok, tx_fail, rx_ready; diff --git a/src/hm/radio.h b/src/hm/radio.h index e2112586..8e9f5ef4 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -23,6 +23,7 @@ class Radio { public: virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) = 0; virtual bool switchFrequency(Inverter<> *iv, uint32_t fromkHz, uint32_t tokHz) { return true; } + virtual bool loop(void) = 0; void handleIntr(void) { mIrqRcvd = true; @@ -52,6 +53,9 @@ class Radio { sendPacket(iv, 24, isRetransmit); } + public: + std::queue mBufCtrl; + protected: virtual void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) = 0; virtual uint64_t getIvId(Inverter<> *iv) = 0; diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index 42eee1bc..5cee324b 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -78,8 +78,6 @@ class CmtRadio : public Radio { return true; } - std::queue mBufCtrl; - private: void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) { updateCrcs(&len, appendCrc16); From c7f3f21469869bee4ec8d74854952eeaf29d4452 Mon Sep 17 00:00:00 2001 From: lumapu Date: Tue, 10 Oct 2023 23:53:59 +0200 Subject: [PATCH 09/42] further improved new communication model --- src/app.cpp | 4 +- src/hm/CommQueue.h | 24 ++++--- src/hm/Communication.h | 149 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 147 insertions(+), 30 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index a834d091..684914e2 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -70,7 +70,9 @@ void app::setup() { else if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) iv->radio = &mCmtRadio; #endif - mCommunication.add(iv, 0x01, false); + mCommunication.add(iv, 0x01); + mCommunication.add(iv, 0x05); + mCommunication.add(iv, 0x0b); }); } diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 3f0e2da8..d9745eb1 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -15,13 +15,13 @@ class CommQueue { public: CommQueue() {} - void addImportant(Inverter<> *iv, uint8_t cmd, bool delIfFailed = true) { + void addImportant(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { dec(&mRdPtr); - mQueue[mRdPtr] = queue_s(iv, cmd, delIfFailed); + mQueue[mRdPtr] = queue_s(iv, cmd, delOnPop); } - void add(Inverter<> *iv, uint8_t cmd, bool delIfFailed = true) { - mQueue[mWrPtr] = queue_s(iv, cmd, delIfFailed); + void add(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { + mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop); inc(&mWrPtr); } @@ -30,12 +30,11 @@ class CommQueue { Inverter<> *iv; uint8_t cmd; uint8_t attempts; - bool delIfFailed; - bool done; + bool delOnPop; uint32_t ts; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d) : - iv(i), cmd(c), attempts(5), done(false), ts(0), delIfFailed(d) {} + iv(i), cmd(c), attempts(5), ts(0), delOnPop(d) {} }; protected: @@ -52,9 +51,11 @@ class CommQueue { cb(true, &mQueue[mRdPtr]); } - void pop(void) { - if(!mQueue[mRdPtr].delIfFailed) + void pop(bool force = false) { + if(!mQueue[mRdPtr].delOnPop && !force) { + mQueue[mRdPtr].attempts = 5; add(mQueue[mRdPtr]); // add to the end again + } inc(&mRdPtr); } @@ -62,8 +63,9 @@ class CommQueue { mQueue[mRdPtr].ts = *ts; } - void setDone(void) { - mQueue[mRdPtr].done = true; + void setAttempt(void) { + if(mQueue[mRdPtr].attempts) + mQueue[mRdPtr].attempts--; } void inc(uint8_t *ptr) { diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 1d165186..65dd2d5c 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -22,49 +22,106 @@ class Communication : public CommQueue<> { return; // empty switch(mState) { - case States::IDLE: + case States::RESET: + lastFound = false; + for(uint8_t i = 0; i < MAX_PAYLOAD_ENTRIES; i++) { + mLocalBuf[i].len = 0; + } + mState = States::START; + break; + + case States::START: setTs(mTimestamp); q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); - lastMillis = millis(); - lastFound = false; + mWaitTimeout = millis() + 500; + setAttempt(); mState = States::WAIT; break; case States::WAIT: - if((millis()-lastMillis) < 500) + if(millis() < mWaitTimeout) return; mState = States::CHECK_FRAMES; break; - case States::CHECK_FRAMES: - if(!q->iv->radio->loop()) + case States::CHECK_FRAMES: { + if(!q->iv->radio->loop()) { + pop(); + q->iv->radioStatistics.rxFailNoAnser++; // got nothing + mState = States::RESET; break; // radio buffer empty + } + States nextState = States::RESET; while(!q->iv->radio->mBufCtrl.empty()) { packet_t *p = &q->iv->radio->mBufCtrl.front(); q->iv->radio->mBufCtrl.pop(); + DPRINT_IVID(DBG_INFO, q->iv->id); + DPRINT(DBG_INFO, F("RX ")); + DBGPRINT(String(p->len)); + DBGPRINT(F(" CH")); + DBGPRINT(String(p->ch)); + DBGPRINT(F(", ")); + DBGPRINT(String(p->rssi)); + DBGPRINT(F("dBm | ")); + ah::dumpBuf(p->packet, p->len); + if(!checkIvSerial(&p->packet[1], q->iv)) continue; // inverter ID incorrect q->iv->radioStatistics.frmCnt++; - if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) // response from get information command + if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command parseFrame(p); - else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command + nextState = States::CHECK_PACKAGE; + } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command parseDevCtrl(p); yield(); } + mState = nextState; + } + break; + + case States::CHECK_PACKAGE: + if(!lastFound) { + DPRINT_IVID(DBG_WARN, q->iv->id); + DBGPRINT(F("last frame ")); + DBGPRINT(String(mMaxFrameId+1)); + DBGPRINTLN(F(" missing: Request Retransmit")); + + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + mMaxFrameId + 1), true); + setAttempt(); + mWaitTimeout = millis() + 100; + mState = States::WAIT; + break; + } + + for(uint8_t i = 0; i < mMaxFrameId; i++) { + if(mLocalBuf[i].len == 0) { + DPRINT_IVID(DBG_WARN, q->iv->id); + DBGPRINT(F("frame ")); + DBGPRINT(String(i + 1)); + DBGPRINTLN(F(" missing: Request Retransmit")); + + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); + setAttempt(); + mWaitTimeout = millis() + 100; + mState = States::WAIT; + return; + } + } + + compilePayload(q); + + pop(true); // remove done request + mState = States::RESET; // everything ok, next request break; } }); } - void gotData() { - setDone(); - } - private: inline bool checkIvSerial(uint8_t buf[], Inverter<> *iv) { uint8_t tmp[4]; @@ -84,14 +141,16 @@ class Communication : public CommQueue<> { uint8_t *frameId = &p->packet[9]; if(0x00 == *frameId) return; // skip current packet - if((*frameId & 0x7f) > MAX_PAYLOAD_ENTRIES) + if((*frameId & 0x7f) > MAX_PAYLOAD_ENTRIES) { + DPRINTLN(DBG_WARN, F("local buffer to small for payload fragments!")); return; // local storage is to small for id + } if(!checkFrameCrc(p->packet, p->len)) return; // CRC8 is wrong, frame invalid if((*frameId & ALL_FRAMES) == ALL_FRAMES) { - maxFrameId = (*frameId & 0x7f); + mMaxFrameId = (*frameId & 0x7f); if(*frameId > 0x81) lastFound = true; } @@ -106,9 +165,62 @@ class Communication : public CommQueue<> { //if((p->packet[12] == ActivePowerContr) && (p->packet[13] == 0x00)) } + inline void compilePayload(const queue_s *q) { + uint16_t crc = 0xffff, crcRcv = 0x0000; + for(uint8_t i = 0; i < mMaxFrameId; i++) { + if(i == (mMaxFrameId - 1)) { + crc = ah::crc16(mLocalBuf[i].buf, mLocalBuf[i].len - 2, crc); + crcRcv = (mLocalBuf[i].buf[mLocalBuf[i].len-2] << 8); + crcRcv |= mLocalBuf[i].buf[mLocalBuf[i].len-1]; + } else + crc = ah::crc16(mLocalBuf[i].buf, mLocalBuf[i].len, crc); + } + + if(crc != crcRcv) { + DPRINT_IVID(DBG_WARN, q->iv->id); + DBGPRINT(F("CRC Error ")); + if(q->attempts == 0) { + DBGPRINTLN(F("-> Fail")); + q->iv->radioStatistics.rxFail++; // got fragments but not complete response + pop(); + } else + DBGPRINTLN(F("-> complete retransmit")); + mState = States::RESET; + return; + } + + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("procPyld: cmd: 0x")); + DBGHEXLN(q->cmd); + + memset(mPayload, 0, 150); + int8_t rssi = -127; + uint8_t len = 0; + + for(uint8_t i = 0; i < mMaxFrameId; i++) { + if(mLocalBuf[i].len + len > 150) { + DPRINTLN(DBG_ERROR, F("payload buffer to small!")); + return; + } + memcpy(&mPayload[len], mLocalBuf[i].buf, mLocalBuf[i].len); + len += mLocalBuf[i].len; + // get worst RSSI + if(mLocalBuf[i].rssi > rssi) + rssi = mLocalBuf[i].rssi; + } + + len -= 2; + + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("Payload (")); + DBGPRINT(String(len)); + DBGPRINT(F("): ")); + ah::dumpBuf(mPayload, len); + } + private: enum class States : uint8_t { - IDLE, WAIT, CHECK_FRAMES + RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE }; typedef struct { @@ -118,12 +230,13 @@ class Communication : public CommQueue<> { } frame_t; private: - States mState = States::IDLE; + States mState = States::RESET; uint32_t *mTimestamp; - uint32_t lastMillis; + uint32_t mWaitTimeout; std::array mLocalBuf; bool lastFound; - uint8_t maxFrameId; + uint8_t mMaxFrameId; + uint8_t mPayload[150]; }; #endif /*__COMMUNICATION_H__*/ From b34e5a7416d0dde8764434b8f7afa9f8ef108556 Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 11 Oct 2023 21:07:03 +0200 Subject: [PATCH 10/42] added millis to each packet for radio analysis fixed several issue regarding communication --- src/app.cpp | 27 +++++++++++---- src/app.h | 6 ++-- src/defines.h | 2 +- src/hm/CommQueue.h | 2 +- src/hm/Communication.h | 79 ++++++++++++++++++++++++------------------ src/hm/hmRadio.h | 11 +++--- src/hm/radio.h | 6 +++- src/hms/hmsRadio.h | 12 +++---- 8 files changed, 89 insertions(+), 56 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index 684914e2..2255aa14 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -70,9 +70,6 @@ void app::setup() { else if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) iv->radio = &mCmtRadio; #endif - mCommunication.add(iv, 0x01); - mCommunication.add(iv, 0x05); - mCommunication.add(iv, 0x0b); }); } @@ -127,6 +124,10 @@ void app::loop(void) { ah::Scheduler::loop(); bool processPayload = false; + mNrfRadio.loop(); + #if defined(ESP32) + mCmtRadio.loop(); + #endif mCommunication.loop(); /*if (mNrfRadio.loop() && mConfig->nrf.enabled) { @@ -199,7 +200,8 @@ void app::onNetwork(bool gotIp) { mNetworkConnected = gotIp; ah::Scheduler::resetTicker(); regularTickers(); //reinstall regular tickers - every(std::bind(&app::tickSend, this), mConfig->nrf.sendInterval, "tSend"); + //every(std::bind(&app::tickSend, this), mConfig->nrf.sendInterval, "tSend"); + once(std::bind(&app::tickSend, this), 20, "tSend"); mMqttReconnect = true; mSunrise = 0; // needs to be set to 0, to reinstall sunrise and ivComm tickers! //once(std::bind(&app::tickNtpUpdate, this), 2, "ntp2"); @@ -290,7 +292,7 @@ void app::tickNtpUpdate(void) { // immediately start communicating if (isOK && mSendFirst) { mSendFirst = false; - once(std::bind(&app::tickSend, this), 2, "senOn"); + //once(std::bind(&app::tickSend, this), 2, "senOn"); } mMqttReconnect = false; @@ -402,6 +404,17 @@ void app::tickMidnight(void) { //----------------------------------------------------------------------------- void app::tickSend(void) { + DPRINTLN(DBG_INFO, "tickSend"); + + for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { + Inverter<> *iv = mSys.getInverterByPos(i); + if(NULL != iv) { + mCommunication.add(iv, 0x01); + mCommunication.add(iv, 0x05); + mCommunication.add(iv, 0x0b, false); + }; + } + /*if(mConfig->nrf.enabled) { if(!mNrfRadio.isChipConnected()) { DPRINTLN(DBG_WARN, F("NRF24 not connected!")); @@ -448,9 +461,9 @@ void app::tickSend(void) { if (mConfig->serial.debug) DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); } - yield();*/ + yield(); - updateLed(); + updateLed();*/ } //----------------------------------------------------------------------------- diff --git a/src/app.h b/src/app.h index 9cc90100..d1a13a6a 100644 --- a/src/app.h +++ b/src/app.h @@ -176,8 +176,8 @@ class app : public IApp, public ah::Scheduler { if(mIVCommunicationOn) { // only send commands if communication is enabled if (iv->ivGen == IV_MI) mMiPayload.ivSendHighPrio(iv); - else - mPayload.ivSendHighPrio(iv); + //else + // mPayload.ivSendHighPrio(iv); } } @@ -319,7 +319,7 @@ class app : public IApp, public ah::Scheduler { #endif /* defined(ETHERNET) */ WebType mWeb; RestApiType mApi; - PayloadType mPayload; + //PayloadType mPayload; MiPayloadType mMiPayload; PubSerialType mPubSerial; #if !defined(ETHERNET) diff --git a/src/defines.h b/src/defines.h index 860231ba..80ecf9c0 100644 --- a/src/defines.h +++ b/src/defines.h @@ -21,7 +21,7 @@ typedef struct { uint8_t len; int8_t rssi; uint8_t packet[MAX_RF_PAYLOAD_SIZE]; - //uint32_t millis; + uint16_t millis; } packet_t; typedef enum { diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index d9745eb1..5f13d03d 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -51,7 +51,7 @@ class CommQueue { cb(true, &mQueue[mRdPtr]); } - void pop(bool force = false) { + void cmdDone(bool force = false) { if(!mQueue[mRdPtr].delOnPop && !force) { mQueue[mRdPtr].attempts = 5; add(mQueue[mRdPtr]); // add to the end again diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 65dd2d5c..ecb28ce0 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -23,7 +23,7 @@ class Communication : public CommQueue<> { switch(mState) { case States::RESET: - lastFound = false; + mMaxFrameId = 0; for(uint8_t i = 0; i < MAX_PAYLOAD_ENTRIES; i++) { mLocalBuf[i].len = 0; } @@ -33,7 +33,7 @@ class Communication : public CommQueue<> { case States::START: setTs(mTimestamp); q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); - mWaitTimeout = millis() + 500; + mWaitTimeout = millis() + 1500; setAttempt(); mState = States::WAIT; break; @@ -45,20 +45,29 @@ class Communication : public CommQueue<> { break; case States::CHECK_FRAMES: { - if(!q->iv->radio->loop()) { - pop(); + if(!q->iv->radio->get()) { // radio buffer empty + cmdDone(); + DBGPRINTLN(F("request timeout")); q->iv->radioStatistics.rxFailNoAnser++; // got nothing - mState = States::RESET; - break; // radio buffer empty + if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { + q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); + mWaitTimeout = millis() + 2000; + mState = States::GAP; + break; + } else { + mState = States::RESET; + break; + } } States nextState = States::RESET; while(!q->iv->radio->mBufCtrl.empty()) { packet_t *p = &q->iv->radio->mBufCtrl.front(); - q->iv->radio->mBufCtrl.pop(); DPRINT_IVID(DBG_INFO, q->iv->id); DPRINT(DBG_INFO, F("RX ")); + DBGPRINT(String(p->millis)); + DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); DBGPRINT(F(" CH")); DBGPRINT(String(p->ch)); @@ -67,29 +76,33 @@ class Communication : public CommQueue<> { DBGPRINT(F("dBm | ")); ah::dumpBuf(p->packet, p->len); - if(!checkIvSerial(&p->packet[1], q->iv)) - continue; // inverter ID incorrect - - q->iv->radioStatistics.frmCnt++; + if(checkIvSerial(&p->packet[1], q->iv)) { + q->iv->radioStatistics.frmCnt++; - if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command - parseFrame(p); - nextState = States::CHECK_PACKAGE; - } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command - parseDevCtrl(p); + if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command + parseFrame(p); + nextState = States::CHECK_PACKAGE; + } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command + parseDevCtrl(p); + } + q->iv->radio->mBufCtrl.pop(); yield(); } mState = nextState; } break; + case States::GAP: + if(millis() < mWaitTimeout) + return; + mState = States::RESET; + break; + case States::CHECK_PACKAGE: - if(!lastFound) { + if(0 == mMaxFrameId) { DPRINT_IVID(DBG_WARN, q->iv->id); - DBGPRINT(F("last frame ")); - DBGPRINT(String(mMaxFrameId+1)); - DBGPRINTLN(F(" missing: Request Retransmit")); + DBGPRINT(F("last frame missing: request retransmit")); q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + mMaxFrameId + 1), true); setAttempt(); @@ -103,9 +116,9 @@ class Communication : public CommQueue<> { DPRINT_IVID(DBG_WARN, q->iv->id); DBGPRINT(F("frame ")); DBGPRINT(String(i + 1)); - DBGPRINTLN(F(" missing: Request Retransmit")); + DBGPRINTLN(F(" missing: request retransmit")); - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); setAttempt(); mWaitTimeout = millis() + 100; mState = States::WAIT; @@ -115,7 +128,7 @@ class Communication : public CommQueue<> { compilePayload(q); - pop(true); // remove done request + cmdDone(true); // remove done request mState = States::RESET; // everything ok, next request break; } @@ -139,21 +152,22 @@ class Communication : public CommQueue<> { inline void parseFrame(packet_t *p) { uint8_t *frameId = &p->packet[9]; - if(0x00 == *frameId) + if(0x00 == *frameId) { + DPRINTLN(DBG_WARN, F("invalid frameId 0x00")); return; // skip current packet + } if((*frameId & 0x7f) > MAX_PAYLOAD_ENTRIES) { - DPRINTLN(DBG_WARN, F("local buffer to small for payload fragments!")); + DPRINTLN(DBG_WARN, F("local buffer to small for payload fragments")); return; // local storage is to small for id } - if(!checkFrameCrc(p->packet, p->len)) + if(!checkFrameCrc(p->packet, p->len)) { + DPRINTLN(DBG_WARN, F("frame CRC is wrong")); return; // CRC8 is wrong, frame invalid + } - if((*frameId & ALL_FRAMES) == ALL_FRAMES) { + if((*frameId & ALL_FRAMES) == ALL_FRAMES) mMaxFrameId = (*frameId & 0x7f); - if(*frameId > 0x81) - lastFound = true; - } frame_t *f = &mLocalBuf[(*frameId & 0x7f) - 1]; memcpy(f->buf, &p->packet[10], p->len-11); @@ -182,7 +196,7 @@ class Communication : public CommQueue<> { if(q->attempts == 0) { DBGPRINTLN(F("-> Fail")); q->iv->radioStatistics.rxFail++; // got fragments but not complete response - pop(); + cmdDone(); } else DBGPRINTLN(F("-> complete retransmit")); mState = States::RESET; @@ -220,7 +234,7 @@ class Communication : public CommQueue<> { private: enum class States : uint8_t { - RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE + RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE, GAP }; typedef struct { @@ -234,7 +248,6 @@ class Communication : public CommQueue<> { uint32_t *mTimestamp; uint32_t mWaitTimeout; std::array mLocalBuf; - bool lastFound; uint8_t mMaxFrameId; uint8_t mPayload[150]; }; diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index 45278e6b..7e76644d 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -105,9 +105,9 @@ class HmRadio : public Radio { DPRINTLN(DBG_WARN, F("WARNING! your NRF24 module can't be reached, check the wiring")); } - bool loop(void) { + void loop(void) { if (!mIrqRcvd) - return false; // nothing to do + return; // nothing to do mIrqRcvd = false; bool tx_ok, tx_fail, rx_ready; mNrf24.whatHappened(tx_ok, tx_fail, rx_ready); // resets the IRQ pin to HIGH @@ -124,7 +124,7 @@ class HmRadio : public Radio { if (mIrqRcvd) { mIrqRcvd = false; if (getReceived()) { // everything received - return true; + return; } } yield(); @@ -137,7 +137,7 @@ class HmRadio : public Radio { yield(); } // not finished but time is over - return true; + return; } bool isChipConnected(void) { @@ -252,6 +252,7 @@ class HmRadio : public Radio { p.ch = mRfChLst[mRxChIdx]; p.len = (len > MAX_RF_PAYLOAD_SIZE) ? MAX_RF_PAYLOAD_SIZE : len; p.rssi = mNrf24.testRPD() ? -64 : -75; + p.millis = millis() - mMillis; mNrf24.read(p.packet, p.len); if (p.packet[0] != 0x00) { mBufCtrl.push(p); @@ -288,6 +289,7 @@ class HmRadio : public Radio { mNrf24.setChannel(mRfChLst[mTxChIdx]); mNrf24.openWritingPipe(reinterpret_cast(&iv->radioId.u64)); mNrf24.startWrite(mTxBuf, len, false); // false = request ACK response + mMillis = millis(); if(isRetransmit) iv->radioStatistics.retransmits++; @@ -303,6 +305,7 @@ class HmRadio : public Radio { uint8_t mRfChLst[RF_CHANNELS]; uint8_t mTxChIdx; uint8_t mRxChIdx; + uint32_t mMillis; SPIClass* mSpi; RF24 mNrf24; diff --git a/src/hm/radio.h b/src/hm/radio.h index 8e9f5ef4..2096f108 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -23,7 +23,11 @@ class Radio { public: virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) = 0; virtual bool switchFrequency(Inverter<> *iv, uint32_t fromkHz, uint32_t tokHz) { return true; } - virtual bool loop(void) = 0; + virtual void loop(void) {}; + + bool get() { + return !mBufCtrl.empty(); + } void handleIntr(void) { mIrqRcvd = true; diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index 5cee324b..c01a95bc 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -29,18 +29,15 @@ class CmtRadio : public Radio { reset(genDtuSn); } - bool loop() { + void loop() { mCmt.loop(); - if((!mIrqRcvd) && (!mRqstGetRx)) - return false; + return; getRx(); if(CMT_SUCCESS == mCmt.goRx()) { mIrqRcvd = false; mRqstGetRx = false; - return true; - } else - return false; + } } bool isConnected() { @@ -90,6 +87,7 @@ class CmtRadio : public Radio { } uint8_t status = mCmt.tx(mTxBuf, len); + mMillis = millis(); if(CMT_SUCCESS != status) { DPRINT(DBG_WARN, F("CMT TX failed, code: ")); DBGPRINTLN(String(status)); @@ -144,6 +142,7 @@ class CmtRadio : public Radio { inline void getRx(void) { packet_t p; + p.millis = millis() - mMillis; uint8_t status = mCmt.getRx(p.packet, &p.len, 28, &p.rssi); if(CMT_SUCCESS == status) mBufCtrl.push(p); @@ -152,6 +151,7 @@ class CmtRadio : public Radio { CmtType mCmt; bool mRqstGetRx; bool mCmtAvail; + uint32_t mMillis; }; #endif /*__HMS_RADIO_H__*/ From 5b39d38d8644b67b492741da21b81fbbe17a1466 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 12 Oct 2023 07:56:49 +0200 Subject: [PATCH 11/42] included dev-control again --- src/app.cpp | 14 +++++++---- src/hm/CommQueue.h | 9 ++++--- src/hm/Communication.h | 55 +++++++++++++++++++++++++++--------------- src/hm/hmInverter.h | 12 +++++++++ 4 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index 2255aa14..0e0aec5f 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -200,8 +200,7 @@ void app::onNetwork(bool gotIp) { mNetworkConnected = gotIp; ah::Scheduler::resetTicker(); regularTickers(); //reinstall regular tickers - //every(std::bind(&app::tickSend, this), mConfig->nrf.sendInterval, "tSend"); - once(std::bind(&app::tickSend, this), 20, "tSend"); + every(std::bind(&app::tickSend, this), mConfig->nrf.sendInterval, "tSend"); mMqttReconnect = true; mSunrise = 0; // needs to be set to 0, to reinstall sunrise and ivComm tickers! //once(std::bind(&app::tickNtpUpdate, this), 2, "ntp2"); @@ -406,12 +405,17 @@ void app::tickMidnight(void) { void app::tickSend(void) { DPRINTLN(DBG_INFO, "tickSend"); + if(!mIVCommunicationOn) { + DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); + return; + } + for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { Inverter<> *iv = mSys.getInverterByPos(i); if(NULL != iv) { - mCommunication.add(iv, 0x01); - mCommunication.add(iv, 0x05); - mCommunication.add(iv, 0x0b, false); + iv->tickSend([this, iv](uint8_t cmd) { + mCommunication.add(iv, cmd); + }); }; } diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 5f13d03d..9c9da707 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -17,11 +17,11 @@ class CommQueue { void addImportant(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { dec(&mRdPtr); - mQueue[mRdPtr] = queue_s(iv, cmd, delOnPop); + mQueue[mRdPtr] = queue_s(iv, cmd, delOnPop, true); } void add(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { - mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop); + mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop, false); inc(&mWrPtr); } @@ -31,10 +31,11 @@ class CommQueue { uint8_t cmd; uint8_t attempts; bool delOnPop; + bool isDevControl; uint32_t ts; queue_s() {} - queue_s(Inverter<> *i, uint8_t c, bool d) : - iv(i), cmd(c), attempts(5), ts(0), delOnPop(d) {} + queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : + iv(i), cmd(c), attempts(5), ts(0), delOnPop(d), isDevControl(dev) {} }; protected: diff --git a/src/hm/Communication.h b/src/hm/Communication.h index ecb28ce0..e65484e7 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -16,6 +16,11 @@ class Communication : public CommQueue<> { mTimestamp = timestamp; } + void addImportant(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { + mState = States::RESET; // cancel current operation + CommQueue::addImportant(iv, cmd, delOnPop); + } + void loop() { get([this](bool valid, const queue_s *q) { if(!valid) @@ -23,6 +28,8 @@ class Communication : public CommQueue<> { switch(mState) { case States::RESET: + if(millis() < mWaitTimeout) + return; mMaxFrameId = 0; for(uint8_t i = 0; i < MAX_PAYLOAD_ENTRIES; i++) { mLocalBuf[i].len = 0; @@ -32,8 +39,13 @@ class Communication : public CommQueue<> { case States::START: setTs(mTimestamp); - q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); - mWaitTimeout = millis() + 1500; + if(q->isDevControl) { + if(ActivePowerContr == q->cmd) + q->iv->powerLimitAck = false; + q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); + } else + q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); + mWaitTimeout = millis() + 500; setAttempt(); mState = States::WAIT; break; @@ -51,13 +63,10 @@ class Communication : public CommQueue<> { q->iv->radioStatistics.rxFailNoAnser++; // got nothing if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); - mWaitTimeout = millis() + 2000; - mState = States::GAP; - break; - } else { - mState = States::RESET; - break; + mWaitTimeout = millis() + 1000; } + mState = States::RESET; + break; } States nextState = States::RESET; @@ -83,7 +92,7 @@ class Communication : public CommQueue<> { parseFrame(p); nextState = States::CHECK_PACKAGE; } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command - parseDevCtrl(p); + parseDevCtrl(p, q); } q->iv->radio->mBufCtrl.pop(); @@ -93,12 +102,6 @@ class Communication : public CommQueue<> { } break; - case States::GAP: - if(millis() < mWaitTimeout) - return; - mState = States::RESET; - break; - case States::CHECK_PACKAGE: if(0 == mMaxFrameId) { DPRINT_IVID(DBG_WARN, q->iv->id); @@ -175,8 +178,22 @@ class Communication : public CommQueue<> { f->rssi = p->rssi; } - inline void parseDevCtrl(packet_t *p) { - //if((p->packet[12] == ActivePowerContr) && (p->packet[13] == 0x00)) + inline void parseDevCtrl(packet_t *p, const queue_s *q) { + if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) + return; + bool accepted = true; + if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) + q->iv->powerLimitAck = true; + else + accepted = false; + + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F(" has ")); + if(!accepted) DBGPRINT(F("not ")); + DBGPRINT(F("accepted power limit set point ")); + DBGPRINT(String(q->iv->powerLimit[0])); + DBGPRINT(F(" with PowerLimitControl ")); + DBGPRINTLN(String(q->iv->powerLimit[1])); } inline void compilePayload(const queue_s *q) { @@ -234,7 +251,7 @@ class Communication : public CommQueue<> { private: enum class States : uint8_t { - RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE, GAP + RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE }; typedef struct { @@ -246,7 +263,7 @@ class Communication : public CommQueue<> { private: States mState = States::RESET; uint32_t *mTimestamp; - uint32_t mWaitTimeout; + uint32_t mWaitTimeout = 0; std::array mLocalBuf; uint8_t mMaxFrameId; uint8_t mPayload[150]; diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 238e80e4..8dfb5156 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -15,6 +15,7 @@ #include "../hms/hmsDefines.h" #include #include +#include #include "../config/settings.h" #include "radio.h" @@ -180,6 +181,17 @@ class Inverter { // TODO: cleanup } + void tickSend(std::function cb) { + if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) + cb(AlarmData); // get last alarms + else if(0 == getFwVersion()) + cb(InverterDevInform_All); // get firmware version + else if(0 == getHwVersion()) + cb(InverterDevInform_Simple); // get hardware version + else + cb(RealTimeRunData_Debug); // get live data + } + template void enqueCommand(uint8_t cmd) { _commandQueue.push(std::make_shared(cmd)); From bf772756ed60879b4e93e0869fe087dbbd9586ed Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 12 Oct 2023 17:22:56 +0200 Subject: [PATCH 12/42] improved set limit and radio statistics communication with HMS / HMT is fine - for HM it tries to receive on the same channel which does not work for 4-ch inverter --- src/app.cpp | 13 +++-- src/app.h | 15 +++--- src/defines.h | 4 +- src/hm/Communication.h | 101 +++++++++++++++++++++++++++++++++------ src/hm/hmDefines.h | 9 ++++ src/hm/hmInverter.h | 29 +++++------ src/hm/hmRadio.h | 12 ++--- src/hms/cmt2300a.h | 9 ---- src/hms/hmsRadio.h | 8 +--- src/web/RestApi.h | 2 +- src/web/html/serial.html | 6 +-- src/web/html/style.css | 5 ++ 12 files changed, 143 insertions(+), 70 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index 0e0aec5f..44d8ab30 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -60,6 +60,7 @@ void app::setup() { #endif /* defined(ETHERNET) */ mCommunication.setup(&mTimestamp); + mCommunication.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); mSys.setup(&mTimestamp, &mConfig->inst); for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { mSys.addInverter(i, [this](Inverter<> *iv) { @@ -93,6 +94,7 @@ void app::setup() { if (mMqttEnabled) { mMqtt.setup(&mConfig->mqtt, mConfig->sys.deviceName, mVersion, &mSys, &mTimestamp, &mUptime); mMqtt.setSubscriptionCb(std::bind(&app::mqttSubRxCb, this, std::placeholders::_1)); + mCommunication.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); //mPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); //mMiPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); } @@ -122,7 +124,7 @@ void app::setup() { //----------------------------------------------------------------------------- void app::loop(void) { ah::Scheduler::loop(); - bool processPayload = false; + //bool processPayload = false; mNrfRadio.loop(); #if defined(ESP32) @@ -403,8 +405,6 @@ void app::tickMidnight(void) { //----------------------------------------------------------------------------- void app::tickSend(void) { - DPRINTLN(DBG_INFO, "tickSend"); - if(!mIVCommunicationOn) { DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); return; @@ -413,8 +413,11 @@ void app::tickSend(void) { for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { Inverter<> *iv = mSys.getInverterByPos(i); if(NULL != iv) { - iv->tickSend([this, iv](uint8_t cmd) { - mCommunication.add(iv, cmd); + iv->tickSend([this, iv](uint8_t cmd, bool isDevControl) { + if(isDevControl) + mCommunication.addImportant(iv, cmd); + else + mCommunication.add(iv, cmd); }); }; } diff --git a/src/app.h b/src/app.h index d1a13a6a..d28c3bf6 100644 --- a/src/app.h +++ b/src/app.h @@ -12,12 +12,11 @@ #include "config/settings.h" #include "defines.h" #include "appInterface.h" -#include "hm/hmPayload.h" #include "hm/hmSystem.h" #include "hm/hmRadio.h" #include "hms/hmsRadio.h" -#include "hm/hmPayload.h" -#include "hm/miPayload.h" +//#include "hm/hmPayload.h" +//#include "hm/miPayload.h" #include "publisher/pubMqtt.h" #include "publisher/pubSerial.h" #include "utils/crc.h" @@ -42,8 +41,8 @@ #define ACOS(x) (degrees(acos(x))) typedef HmSystem HmSystemType; -typedef HmPayload PayloadType; -typedef MiPayload MiPayloadType; +//typedef HmPayload PayloadType; +//typedef MiPayload MiPayloadType; #ifdef ESP32 typedef CmtRadio CmtRadioType; #endif @@ -174,8 +173,8 @@ class app : public IApp, public ah::Scheduler { void ivSendHighPrio(Inverter<> *iv) { if(mIVCommunicationOn) { // only send commands if communication is enabled - if (iv->ivGen == IV_MI) - mMiPayload.ivSendHighPrio(iv); + //if (iv->ivGen == IV_MI) + // mMiPayload.ivSendHighPrio(iv); //else // mPayload.ivSendHighPrio(iv); } @@ -320,7 +319,7 @@ class app : public IApp, public ah::Scheduler { WebType mWeb; RestApiType mApi; //PayloadType mPayload; - MiPayloadType mMiPayload; + //MiPayloadType mMiPayload; PubSerialType mPubSerial; #if !defined(ETHERNET) //Improv mImprov; diff --git a/src/defines.h b/src/defines.h index 80ecf9c0..be59fb4f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -12,8 +12,8 @@ // VERSION //------------------------------------- #define VERSION_MAJOR 0 -#define VERSION_MINOR 7 -#define VERSION_PATCH 66 +#define VERSION_MINOR 8 +#define VERSION_PATCH 0 //------------------------------------- typedef struct { diff --git a/src/hm/Communication.h b/src/hm/Communication.h index e65484e7..4cdf0beb 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -10,6 +10,9 @@ #include #include "../utils/crc.h" +typedef std::function *)> payloadListenerType; +typedef std::function *)> alarmListenerType; + class Communication : public CommQueue<> { public: void setup(uint32_t *timestamp) { @@ -21,6 +24,14 @@ class Communication : public CommQueue<> { CommQueue::addImportant(iv, cmd, delOnPop); } + void addPayloadListener(payloadListenerType cb) { + mCbPayload = cb; + } + + void addAlarmListener(alarmListenerType cb) { + mCbAlarm = cb; + } + void loop() { get([this](bool valid, const queue_s *q) { if(!valid) @@ -45,6 +56,7 @@ class Communication : public CommQueue<> { q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); } else q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); + q->iv->radioStatistics.txCnt++; mWaitTimeout = millis() + 500; setAttempt(); mState = States::WAIT; @@ -59,7 +71,10 @@ class Communication : public CommQueue<> { case States::CHECK_FRAMES: { if(!q->iv->radio->get()) { // radio buffer empty cmdDone(); - DBGPRINTLN(F("request timeout")); + DPRINT(DBG_INFO, F("request timeout: ")); + DBGPRINT(String(millis() - mWaitTimeout + 500)); + DBGPRINTLN(F("ms")); + q->iv->radioStatistics.rxFailNoAnser++; // got nothing if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); @@ -74,12 +89,14 @@ class Communication : public CommQueue<> { packet_t *p = &q->iv->radio->mBufCtrl.front(); DPRINT_IVID(DBG_INFO, q->iv->id); - DPRINT(DBG_INFO, F("RX ")); + DBGPRINT(F("RX ")); DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); - DBGPRINT(F(" CH")); - DBGPRINT(String(p->ch)); + if(IV_HM == q->iv->ivGen) { + DBGPRINT(F(" CH")); + DBGPRINT(String(p->ch)); + } DBGPRINT(F(", ")); DBGPRINT(String(p->rssi)); DBGPRINT(F("dBm | ")); @@ -91,8 +108,10 @@ class Communication : public CommQueue<> { if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command parseFrame(p); nextState = States::CHECK_PACKAGE; - } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command + } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) { // response from dev control command parseDevCtrl(p, q); + cmdDone(true); // remove done request + } } q->iv->radio->mBufCtrl.pop(); @@ -104,26 +123,40 @@ class Communication : public CommQueue<> { case States::CHECK_PACKAGE: if(0 == mMaxFrameId) { + setAttempt(); + DPRINT_IVID(DBG_WARN, q->iv->id); - DBGPRINT(F("last frame missing: request retransmit")); + DBGPRINT(F("last frame missing: request retransmit (")); + DBGPRINT(String(q->attempts)); + DBGPRINTLN(F(" attempts left)")); + + uint8_t i = 0; + while(i < MAX_PAYLOAD_ENTRIES) { + if(mLocalBuf[i++].len == 0) + break; + } - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + mMaxFrameId + 1), true); - setAttempt(); - mWaitTimeout = millis() + 100; + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + 500; mState = States::WAIT; break; } for(uint8_t i = 0; i < mMaxFrameId; i++) { if(mLocalBuf[i].len == 0) { + setAttempt(); + DPRINT_IVID(DBG_WARN, q->iv->id); DBGPRINT(F("frame ")); DBGPRINT(String(i + 1)); - DBGPRINTLN(F(" missing: request retransmit")); + DBGPRINT(F(" missing: request retransmit (")); + DBGPRINT(String(q->attempts)); + DBGPRINTLN(F(" attempts left)")); q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); - setAttempt(); - mWaitTimeout = millis() + 100; + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + 500; mState = States::WAIT; return; } @@ -131,6 +164,9 @@ class Communication : public CommQueue<> { compilePayload(q); + if(NULL != mCbPayload) + (mCbPayload)(q->cmd, q->iv); + cmdDone(true); // remove done request mState = States::RESET; // everything ok, next request break; @@ -194,6 +230,7 @@ class Communication : public CommQueue<> { DBGPRINT(String(q->iv->powerLimit[0])); DBGPRINT(F(" with PowerLimitControl ")); DBGPRINTLN(String(q->iv->powerLimit[1])); + q->iv->actPowerLimit = 0xffff; // unknown, readback current value } inline void compilePayload(const queue_s *q) { @@ -220,9 +257,9 @@ class Communication : public CommQueue<> { return; } - DPRINT_IVID(DBG_INFO, q->iv->id); + /*DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("procPyld: cmd: 0x")); - DBGHEXLN(q->cmd); + DBGHEXLN(q->cmd);*/ memset(mPayload, 0, 150); int8_t rssi = -127; @@ -247,6 +284,40 @@ class Communication : public CommQueue<> { DBGPRINT(String(len)); DBGPRINT(F("): ")); ah::dumpBuf(mPayload, len); + + record_t<> *rec = q->iv->getRecordStruct(q->cmd); + if(NULL == rec) { + DPRINTLN(DBG_ERROR, F("record is NULL!")); + return; + } + if((rec->pyldLen != len) && (0 != rec->pyldLen)) { + DPRINT(DBG_ERROR, F("plausibility check failed, expected ")); + DBGPRINT(String(rec->pyldLen)); + DBGPRINTLN(F(" bytes")); + q->iv->radioStatistics.rxFail++; + return; + } + + q->iv->radioStatistics.rxSuccess++; + + rec->ts = q->ts; + for (uint8_t i = 0; i < rec->length; i++) { + q->iv->addValue(i, mPayload, rec); + } + + q->iv->rssi = rssi; + q->iv->doCalculations(); + + if(AlarmData == q->cmd) { + uint8_t i = 0; + while(1) { + if(0 == q->iv->parseAlarmLog(i++, mPayload, len)) + break; + if (NULL != mCbAlarm) + (mCbAlarm)(q->iv); + yield(); + } + } } private: @@ -267,6 +338,8 @@ class Communication : public CommQueue<> { std::array mLocalBuf; uint8_t mMaxFrameId; uint8_t mPayload[150]; + payloadListenerType mCbPayload = NULL; + alarmListenerType mCbAlarm = NULL; }; #endif /*__COMMUNICATION_H__*/ diff --git a/src/hm/hmDefines.h b/src/hm/hmDefines.h index 72ab5c4c..acd81541 100644 --- a/src/hm/hmDefines.h +++ b/src/hm/hmDefines.h @@ -77,6 +77,15 @@ enum {CH0 = 0, CH1, CH2, CH3, CH4, CH5, CH6}; enum {INV_TYPE_1CH = 0, INV_TYPE_2CH, INV_TYPE_4CH, INV_TYPE_6CH}; +#define WORK_FREQ_KHZ 865000 // desired work frequency between DTU and + // inverter in kHz +#define HOY_BASE_FREQ_KHZ 860000 // in kHz +#define HOY_MAX_FREQ_KHZ 923500 // 0xFE * 250kHz + Base_freq +#define HOY_BOOT_FREQ_KHZ 868000 // Hoymiles boot/init frequency after power up inverter +#define FREQ_STEP_KHZ 250 // channel step size in kHz +#define FREQ_WARN_MIN_KHZ 863000 // for EU 863 - 870 MHz is allowed +#define FREQ_WARN_MAX_KHZ 870000 // for EU 863 - 870 MHz is allowed + typedef struct { uint8_t fieldId; // field id diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 8dfb5156..5e3e4266 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -181,18 +181,23 @@ class Inverter { // TODO: cleanup } - void tickSend(std::function cb) { - if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) - cb(AlarmData); // get last alarms + void tickSend(std::function cb) { + if(mDevControlRequest) { + cb(devControlCmd, true); + mDevControlRequest = false; + } else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) + cb(AlarmData, false); // get last alarms else if(0 == getFwVersion()) - cb(InverterDevInform_All); // get firmware version + cb(InverterDevInform_All, false); // get firmware version else if(0 == getHwVersion()) - cb(InverterDevInform_Simple); // get hardware version + cb(InverterDevInform_Simple, false); // get hardware version + else if(actPowerLimit == 0xffff) + cb(SystemConfigPara, false); // power limit info else - cb(RealTimeRunData_Debug); // get live data + cb(RealTimeRunData_Debug, false); // get live data } - template + /*template void enqueCommand(uint8_t cmd) { _commandQueue.push(std::make_shared(cmd)); DPRINT_IVID(DBG_INFO, id); @@ -240,7 +245,7 @@ class Inverter { enqueCommand(SystemConfigPara); // power limit info } return _commandQueue.front().get()->getCmd(); - } + }*/ void init(void) { @@ -305,10 +310,6 @@ class Inverter { mDevControlRequest = false; } - inline bool getDevControlRequest() { - return mDevControlRequest; - } - void addValue(uint8_t pos, uint8_t buf[], record_t<> *rec) { DPRINTLN(DBG_VERBOSE, F("hmInverter.h:addValue")); if(NULL != rec) { @@ -350,7 +351,7 @@ class Inverter { DPRINT(DBG_INFO, "alarm ID incremented to "); DBGPRINTLN(String(alarmMesIndex)); - enqueCommand(AlarmData); + //enqueCommand(AlarmData); } } } @@ -727,7 +728,7 @@ class Inverter { radioId.b[0] = 0x01; } - std::queue> _commandQueue; + //std::queue> _commandQueue; bool mDevControlRequest; // true if change needed }; diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index 7e76644d..461fd08e 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -118,8 +118,8 @@ class HmRadio : public Radio { mNrf24.startListening(); uint32_t startMicros = micros(); - uint32_t loopMillis = millis(); - while (millis()-loopMillis < 400) { + uint32_t loopMillis = millis() + 400; + while (millis() < loopMillis) { while (micros()-startMicros < 5110) { // listen (4088us or?) 5110us to each channel if (mIrqRcvd) { mIrqRcvd = false; @@ -277,7 +277,8 @@ class HmRadio : public Radio { mRxChIdx = (mTxChIdx + 2) % RF_CHANNELS; if(mSerialDebug) { - DPRINT(DBG_INFO, F("TX ")); + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINT(F("TX ")); DBGPRINT(String(len)); DBGPRINT(" CH"); DBGPRINT(String(mRfChLst[mTxChIdx])); @@ -290,11 +291,6 @@ class HmRadio : public Radio { mNrf24.openWritingPipe(reinterpret_cast(&iv->radioId.u64)); mNrf24.startWrite(mTxBuf, len, false); // false = request ACK response mMillis = millis(); - - if(isRetransmit) - iv->radioStatistics.retransmits++; - else - iv->radioStatistics.txCnt++; } uint64_t getIvId(Inverter<> *iv) { diff --git a/src/hms/cmt2300a.h b/src/hms/cmt2300a.h index 9d00ba20..ab54617d 100644 --- a/src/hms/cmt2300a.h +++ b/src/hms/cmt2300a.h @@ -8,15 +8,6 @@ #include "esp32_3wSpi.h" -#define WORK_FREQ_KHZ 865000 // desired work frequency between DTU and - // inverter in kHz -#define HOY_BASE_FREQ_KHZ 860000 // in kHz -#define HOY_MAX_FREQ_KHZ 923500 // 0xFE * 250kHz + Base_freq -#define HOY_BOOT_FREQ_KHZ 868000 // Hoymiles boot/init frequency after power up inverter -#define FREQ_STEP_KHZ 250 // channel step size in kHz -#define FREQ_WARN_MIN_KHZ 863000 // for EU 863 - 870 MHz is allowed -#define FREQ_WARN_MAX_KHZ 870000 // for EU 863 - 870 MHz is allowed - // detailed register infos from AN142_CMT2300AW_Quick_Start_Guide-Rev0.8.pdf #define CMT2300A_MASK_CFG_RETAIN 0x10 diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index c01a95bc..24c3c7cd 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -80,7 +80,8 @@ class CmtRadio : public Radio { updateCrcs(&len, appendCrc16); if(mSerialDebug) { - DPRINT(DBG_INFO, F("TX ")); + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINT(F("TX ")); DBGPRINT(String(mCmt.getFreqKhz()/1000.0f)); DBGPRINT(F("Mhz | ")); ah::dumpBuf(mTxBuf, len); @@ -94,11 +95,6 @@ class CmtRadio : public Radio { if(CMT_ERR_RX_IN_FIFO == status) mIrqRcvd = true; } - - if(isRetransmit) - iv->radioStatistics.retransmits++; - else - iv->radioStatistics.txCnt++; } uint64_t getIvId(Inverter<> *iv) { diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 225c26c8..e53c91da 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -683,7 +683,7 @@ class RestApi { } else if(F("dev") == jsonIn[F("cmd")]) { DPRINTLN(DBG_INFO, F("dev cmd")); - iv->enqueCommand(jsonIn[F("val")].as()); + //iv->enqueCommand(jsonIn[F("val")].as()); } else { jsonOut[F("error")] = F("unknown cmd: '") + jsonIn["cmd"].as() + "'"; diff --git a/src/web/html/serial.html b/src/web/html/serial.html index 10d1769e..3f9b4d94 100644 --- a/src/web/html/serial.html +++ b/src/web/html/serial.html @@ -7,9 +7,9 @@ {#HTML_NAV}
-
+
- +
console active:
@@ -42,7 +42,7 @@ if(true == exeOnce) { parseNav(obj); parseESP(obj); - window.setInterval("getAjax('/api/generic', parseGeneric)", 10000); + window.setInterval("getAjax('/api/generic', parseGeneric)", 5000); exeOnce = false; setTimeOffset(); } diff --git a/src/web/html/style.css b/src/web/html/style.css index cca955eb..95cbff3b 100644 --- a/src/web/html/style.css +++ b/src/web/html/style.css @@ -24,6 +24,11 @@ input[type=file] { width: 100%; } +textarea { + color: var(--fg); + background-color: var(--bg); +} + #live span { color: var(--fg2); } From 0e7874935d47b4e76f2b8e7845bc43823c3a0822 Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Wed, 18 Oct 2023 12:51:29 +0200 Subject: [PATCH 13/42] Add files via upload --- src/hm/Communication.h | 37 +- src/hm/hmDefines.h | 4 + src/hm/hmInverter.h | 42 +- src/hm/miPayload.h | 2 +- src/hm/radio.h | 2 +- src/web/html/h/about_html.h | 82 +++ src/web/html/h/api_js.h | 216 ++++++ src/web/html/h/colorBright_css.h | 22 + src/web/html/h/colorDark_css.h | 21 + src/web/html/h/favicon_ico.h | 101 +++ src/web/html/h/index_html.h | 191 +++++ src/web/html/h/login_html.h | 47 ++ src/web/html/h/save_html.h | 86 +++ src/web/html/h/serial_html.h | 113 +++ src/web/html/h/setup_html.h | 545 +++++++++++++++ src/web/html/h/style_css.h | 188 +++++ src/web/html/h/system_html.h | 139 ++++ src/web/html/h/update_html.h | 74 ++ src/web/html/h/visualization_html.h | 275 ++++++++ src/web/html/tmp/about.html | 100 +++ src/web/html/tmp/index.html | 263 +++++++ src/web/html/tmp/login.html | 43 ++ src/web/html/tmp/save.html | 102 +++ src/web/html/tmp/serial.html | 132 ++++ src/web/html/tmp/setup.html | 1000 +++++++++++++++++++++++++++ src/web/html/tmp/style.css | 781 +++++++++++++++++++++ src/web/html/tmp/system.html | 188 +++++ src/web/html/tmp/update.html | 80 +++ src/web/html/tmp/visualization.html | 479 +++++++++++++ 29 files changed, 5332 insertions(+), 23 deletions(-) create mode 100644 src/web/html/h/about_html.h create mode 100644 src/web/html/h/api_js.h create mode 100644 src/web/html/h/colorBright_css.h create mode 100644 src/web/html/h/colorDark_css.h create mode 100644 src/web/html/h/favicon_ico.h create mode 100644 src/web/html/h/index_html.h create mode 100644 src/web/html/h/login_html.h create mode 100644 src/web/html/h/save_html.h create mode 100644 src/web/html/h/serial_html.h create mode 100644 src/web/html/h/setup_html.h create mode 100644 src/web/html/h/style_css.h create mode 100644 src/web/html/h/system_html.h create mode 100644 src/web/html/h/update_html.h create mode 100644 src/web/html/h/visualization_html.h create mode 100644 src/web/html/tmp/about.html create mode 100644 src/web/html/tmp/index.html create mode 100644 src/web/html/tmp/login.html create mode 100644 src/web/html/tmp/save.html create mode 100644 src/web/html/tmp/serial.html create mode 100644 src/web/html/tmp/setup.html create mode 100644 src/web/html/tmp/style.css create mode 100644 src/web/html/tmp/system.html create mode 100644 src/web/html/tmp/update.html create mode 100644 src/web/html/tmp/visualization.html diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 4cdf0beb..c14bd4f0 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -50,12 +50,32 @@ class Communication : public CommQueue<> { case States::START: setTs(mTimestamp); - if(q->isDevControl) { - if(ActivePowerContr == q->cmd) - q->iv->powerLimitAck = false; - q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); - } else - q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); + if (q->iv->ivGen != IV_MI) { + if(q->isDevControl) { + if(ActivePowerContr == q->cmd) + q->iv->powerLimitAck = false; + q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); + } else + q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); + } else { // IV_MI + if(q->isDevControl) { + if(ActivePowerContr == q->cmd) + q->iv->powerLimitAck = false; + q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false, false, (q->iv->powerLimit[1] == RelativNonPersistent) ? 0 : q->iv->getMaxPower()); + } else { + //uint8_t cmd = q->iv->type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1; + //q->iv->radio->sendCmdPacket(q->iv, cmd, cmd, false, false); + q->iv->radio->sendCmdPacket(q->iv, q->cmd, q->cmd, false, false); + //if (q->iv->radio->mSerialDebug) { + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("legacy cmd 0x")); + DBGHEXLN(q->cmd); + //} + //mPayload[q->iv->id]. = cmd; + } + + } + q->iv->radioStatistics.txCnt++; mWaitTimeout = millis() + 500; setAttempt(); @@ -71,7 +91,8 @@ class Communication : public CommQueue<> { case States::CHECK_FRAMES: { if(!q->iv->radio->get()) { // radio buffer empty cmdDone(); - DPRINT(DBG_INFO, F("request timeout: ")); + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("request timeout: ")); DBGPRINT(String(millis() - mWaitTimeout + 500)); DBGPRINTLN(F("ms")); @@ -93,7 +114,7 @@ class Communication : public CommQueue<> { DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); - if(IV_HM == q->iv->ivGen) { + if((IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen)) { DBGPRINT(F(" CH")); DBGPRINT(String(p->ch)); } diff --git a/src/hm/hmDefines.h b/src/hm/hmDefines.h index acd81541..c00f4940 100644 --- a/src/hm/hmDefines.h +++ b/src/hm/hmDefines.h @@ -346,4 +346,8 @@ const devInfo_t devInfo[] = { { 0x103331, 2250 } }; +#define MI_REQ_CH1 0x09 +#define MI_REQ_CH2 0x11 +#define MI_REQ_4CH 0x36 + #endif /*__HM_DEFINES_H__*/ diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 5e3e4266..04aca4d2 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -182,19 +182,35 @@ class Inverter { } void tickSend(std::function cb) { - if(mDevControlRequest) { - cb(devControlCmd, true); - mDevControlRequest = false; - } else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) - cb(AlarmData, false); // get last alarms - else if(0 == getFwVersion()) - cb(InverterDevInform_All, false); // get firmware version - else if(0 == getHwVersion()) - cb(InverterDevInform_Simple, false); // get hardware version - else if(actPowerLimit == 0xffff) - cb(SystemConfigPara, false); // power limit info - else - cb(RealTimeRunData_Debug, false); // get live data + if (ivGen != IV_MI) { + if(mDevControlRequest) { + cb(devControlCmd, true); + mDevControlRequest = false; + } else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) + cb(AlarmData, false); // get last alarms + else if(0 == getFwVersion()) + cb(InverterDevInform_All, false); // get firmware version + else if(0 == getHwVersion()) + cb(InverterDevInform_Simple, false); // get hardware version + else if(actPowerLimit == 0xffff) + cb(SystemConfigPara, false); // power limit info + else + cb(RealTimeRunData_Debug, false); // get live data + } else { + if(mDevControlRequest) { + cb(devControlCmd, true); + mDevControlRequest = false; + } + else if(0 == getFwVersion()) + cb(InverterDevInform_All, false); // get firmware version + else { + record_t<> *rec = getRecordStruct(InverterDevInform_Simple); + if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) + cb(InverterDevInform_All, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 + else + cb(type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1, false); + } + } } /*template diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index 94f7a9b3..892dc0a8 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -36,7 +36,7 @@ typedef struct { } miPayload_t; -typedef std::function *)> miPayloadListenerType; +//typedef std::function *)> miPayloadListenerType; template diff --git a/src/hm/radio.h b/src/hm/radio.h index 2096f108..46c05d99 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -42,7 +42,7 @@ class Radio { sendPacket(iv, 10, isRetransmit, appendCrc16); } - void prepareDevInformCmd(Inverter<> *iv, uint8_t cmd, uint32_t ts, uint16_t alarmMesId, bool isRetransmit, uint8_t reqfld=TX_REQ_INFO) { // might not be necessary to add additional arg. + void prepareDevInformCmd(Inverter<> *iv, uint8_t cmd, uint32_t ts, uint16_t alarmMesId, bool isRetransmit, uint8_t reqfld=TX_REQ_INFO) { if(mSerialDebug) { DPRINT(DBG_DEBUG, F("prepareDevInformCmd 0x")); DPRINTLN(DBG_DEBUG,String(cmd, HEX)); diff --git a/src/web/html/h/about_html.h b/src/web/html/h/about_html.h new file mode 100644 index 00000000..1e486394 --- /dev/null +++ b/src/web/html/h/about_html.h @@ -0,0 +1,82 @@ +#ifndef __ABOUT_HTML_H__ +#define __ABOUT_HTML_H__ +#define about_html_len 1227 +const uint8_t about_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xc5, 0x58, 0x6d, 0x6f, 0xdb, 0x36, +0x10, 0xfe, 0xbe, 0x5f, 0xc1, 0xea, 0xc3, 0x90, 0x00, 0x91, 0xe9, 0x38, 0x49, 0x93, 0xba, 0xb6, +0x37, 0xd7, 0x49, 0xb3, 0x0c, 0x6d, 0x11, 0xc4, 0x09, 0x8a, 0x62, 0x18, 0x0a, 0x8a, 0xa2, 0x24, +0x26, 0x14, 0xa9, 0x92, 0x94, 0x63, 0x77, 0xe8, 0x7f, 0x1f, 0x29, 0xf9, 0x45, 0xaf, 0x4e, 0xba, +0xba, 0x58, 0x3e, 0x44, 0xd6, 0xf1, 0x5e, 0x9e, 0x3b, 0xde, 0x9d, 0x8e, 0x1c, 0xbc, 0xf0, 0x05, +0xd6, 0x8b, 0x84, 0x80, 0x48, 0xc7, 0x6c, 0xf4, 0xcb, 0x20, 0x7f, 0x00, 0xf3, 0x37, 0x88, 0x08, +0xf2, 0xf3, 0x9f, 0xd9, 0xab, 0xa6, 0x9a, 0x91, 0xd1, 0xd8, 0x13, 0xa9, 0x1e, 0xc0, 0xfc, 0x65, +0xb3, 0xc8, 0x28, 0x7f, 0x00, 0x92, 0xb0, 0xa1, 0xa3, 0xf4, 0x82, 0x11, 0x15, 0x11, 0xa2, 0x1d, +0x60, 0x15, 0x0f, 0x1d, 0x4d, 0xe6, 0x1a, 0x62, 0xa5, 0x1c, 0x10, 0x49, 0x12, 0x2c, 0x39, 0x3a, +0x86, 0xf0, 0xdb, 0x6c, 0xd8, 0xed, 0x9c, 0x75, 0xba, 0xdd, 0xee, 0xa1, 0x03, 0x8d, 0xed, 0x98, +0x68, 0x04, 0x38, 0x8a, 0x8d, 0xcc, 0x8c, 0x92, 0xc7, 0x44, 0x48, 0xa3, 0x03, 0x0b, 0xae, 0x09, +0xd7, 0x43, 0xe7, 0x91, 0xfa, 0x3a, 0x1a, 0xfa, 0x64, 0x46, 0x31, 0x71, 0xb3, 0x97, 0x03, 0x40, +0x39, 0xd5, 0x14, 0x31, 0x57, 0x61, 0xc4, 0xc8, 0xf0, 0xd0, 0x59, 0x29, 0xc1, 0x11, 0x92, 0x8a, +0x18, 0xa1, 0xbb, 0xdb, 0xb7, 0xee, 0x99, 0x25, 0x2b, 0x2c, 0x69, 0xa2, 0x8b, 0x88, 0xee, 0xd1, +0x0c, 0xe5, 0x54, 0x07, 0x28, 0x89, 0x87, 0x0e, 0x4a, 0x68, 0xe7, 0xbe, 0x04, 0x6a, 0x34, 0x80, +0x39, 0x87, 0x51, 0xf0, 0x3d, 0x1e, 0x62, 0xc1, 0x84, 0x54, 0x4f, 0xb8, 0x28, 0x85, 0x27, 0xb4, +0x2a, 0x38, 0xc8, 0x05, 0xe5, 0x3e, 0x99, 0x1f, 0x00, 0x2e, 0x02, 0xc1, 0x98, 0x78, 0x74, 0x00, +0x5c, 0x6e, 0x05, 0xdc, 0xec, 0xc5, 0xc0, 0x13, 0xfe, 0xa2, 0x10, 0x79, 0x9f, 0xce, 0x00, 0x66, +0x48, 0x29, 0x03, 0x43, 0x24, 0x1c, 0xcd, 0x9c, 0x25, 0x1f, 0x5a, 0x82, 0x81, 0x45, 0x0c, 0x6b, +0x56, 0xbb, 0x7f, 0xce, 0x68, 0x1c, 0x89, 0xc5, 0xf9, 0xed, 0xdd, 0x00, 0xa2, 0x8a, 0xd0, 0x26, +0x38, 0xfd, 0x99, 0xa0, 0xfe, 0x5e, 0x77, 0xff, 0xf5, 0x5a, 0x96, 0x1a, 0xc4, 0x0e, 0x10, 0x1c, +0x33, 0x8a, 0x1f, 0x56, 0x56, 0xf7, 0xf6, 0x9d, 0x02, 0x28, 0x95, 0x20, 0x6e, 0x83, 0x67, 0x1f, +0xdf, 0x4d, 0xdd, 0xa0, 0xb1, 0xbe, 0x51, 0x7f, 0xed, 0xd8, 0x0a, 0x40, 0x2c, 0x3c, 0x6a, 0xd1, +0x6f, 0x74, 0xa0, 0x8c, 0xcd, 0xf0, 0x1c, 0xad, 0x99, 0x22, 0xea, 0x93, 0xd5, 0x7e, 0x40, 0x46, +0x67, 0xa4, 0xb4, 0xb1, 0xef, 0x0c, 0x61, 0x6d, 0xa7, 0xac, 0xe2, 0xb8, 0x59, 0x85, 0x22, 0xd2, +0x64, 0x5a, 0x49, 0xc9, 0x47, 0xe2, 0xe5, 0xd4, 0x16, 0x4d, 0x27, 0x6d, 0x9a, 0x74, 0x9a, 0x94, +0x14, 0x4d, 0x89, 0xd6, 0x94, 0x87, 0xaa, 0xac, 0xc7, 0x46, 0x64, 0xa5, 0x40, 0x91, 0x84, 0x48, +0xa4, 0x85, 0x74, 0xea, 0x01, 0x5c, 0xdb, 0x7b, 0xd9, 0x6c, 0x2f, 0x4d, 0x7c, 0xa4, 0xcb, 0xee, +0xdf, 0x65, 0xa4, 0x16, 0xd8, 0xa7, 0x2d, 0xb0, 0x17, 0x4a, 0x93, 0xb8, 0x8c, 0x3b, 0x23, 0xfd, +0x20, 0xea, 0xb3, 0xb5, 0x05, 0x53, 0x80, 0xa6, 0xa2, 0x90, 0x0c, 0x6d, 0xe5, 0x7e, 0xf6, 0x18, +0xe2, 0x0f, 0xce, 0xe8, 0xe6, 0x62, 0x7a, 0x0b, 0xc6, 0xd7, 0x57, 0x2d, 0x60, 0x5f, 0xad, 0xa4, +0x23, 0xad, 0x13, 0xd5, 0x87, 0x10, 0x99, 0x94, 0xf6, 0x75, 0xda, 0xb1, 0xc8, 0xab, 0xba, 0xce, +0x05, 0x4e, 0x63, 0x53, 0x6b, 0x48, 0x53, 0xc1, 0x5b, 0x14, 0x1e, 0x76, 0x37, 0x78, 0x6c, 0xaf, +0x2b, 0x39, 0xbc, 0xec, 0x7e, 0x3f, 0xe4, 0x6f, 0xb7, 0x25, 0x45, 0x45, 0x48, 0xb9, 0x49, 0x4c, +0xfb, 0x68, 0x83, 0xd6, 0x2a, 0x69, 0x50, 0x65, 0xa2, 0x45, 0x74, 0x03, 0x68, 0xca, 0xa7, 0x52, +0x48, 0x8f, 0x34, 0xa0, 0x79, 0xf9, 0xae, 0x6a, 0x99, 0x07, 0xc2, 0x82, 0xcd, 0x58, 0x0b, 0x12, +0x65, 0x29, 0x89, 0x12, 0xe3, 0x58, 0xa1, 0xe0, 0x4a, 0xcb, 0xcb, 0x06, 0x56, 0x59, 0xae, 0x36, +0xa7, 0x78, 0xe1, 0x1e, 0x19, 0x4b, 0x51, 0x2f, 0x0f, 0x22, 0x58, 0xb7, 0x1e, 0x43, 0xa9, 0x18, +0x6e, 0x17, 0xaf, 0xb1, 0x54, 0xd9, 0xa4, 0x78, 0x04, 0x96, 0x15, 0xd8, 0x86, 0xd9, 0xc2, 0x5f, +0x95, 0x49, 0xdc, 0x9e, 0xa9, 0x08, 0x45, 0x7c, 0xf0, 0x8e, 0x7a, 0x12, 0x49, 0x4a, 0x54, 0x0b, +0xa0, 0x4a, 0x58, 0x9f, 0x00, 0x62, 0xbc, 0x45, 0x95, 0xe4, 0x0c, 0xa9, 0x8e, 0x52, 0xaf, 0x83, +0x45, 0x0c, 0x3d, 0x22, 0x75, 0x4c, 0x18, 0x55, 0x90, 0xa8, 0xe4, 0xfd, 0x17, 0xad, 0x27, 0x8c, +0xda, 0x28, 0xd6, 0x92, 0xb6, 0x85, 0xd1, 0xee, 0xf3, 0xae, 0xb0, 0x2c, 0x52, 0x4f, 0xcc, 0x5d, +0x2e, 0x7c, 0xe2, 0x0a, 0x19, 0xc2, 0x8b, 0xe9, 0xf5, 0x58, 0x2d, 0x38, 0x36, 0xfd, 0x6d, 0x4a, +0xe4, 0xcc, 0xec, 0x7c, 0x0d, 0xd4, 0x53, 0x12, 0xbb, 0x44, 0xe7, 0x59, 0x9b, 0x38, 0x12, 0x1c, +0x8e, 0xa5, 0x9f, 0x52, 0x2e, 0xfe, 0x54, 0x36, 0x83, 0x6b, 0x71, 0x6a, 0x62, 0xdb, 0x25, 0x0e, +0x2e, 0x83, 0xde, 0x31, 0xbc, 0x79, 0xdb, 0x3b, 0xae, 0x1b, 0xdf, 0xac, 0xed, 0xd2, 0x62, 0x82, +0x52, 0xa6, 0xb4, 0x08, 0x02, 0x49, 0x42, 0xc2, 0xe1, 0x2d, 0x8d, 0x1b, 0x9a, 0x5a, 0x03, 0xd3, +0x2e, 0x31, 0x08, 0x46, 0x1f, 0x24, 0x4a, 0x15, 0xbc, 0x3b, 0x0b, 0x7b, 0x75, 0xeb, 0xa5, 0xe5, +0x5d, 0xda, 0xfd, 0x6a, 0x3e, 0x88, 0xe1, 0x7d, 0x0c, 0x2f, 0xe7, 0x17, 0xd7, 0xe7, 0x0d, 0x86, +0xcb, 0xeb, 0x05, 0xcb, 0x3f, 0xaf, 0x47, 0x4c, 0x4c, 0xa3, 0x43, 0x58, 0x83, 0x2b, 0xd3, 0x34, +0x65, 0xbc, 0xfc, 0x88, 0xec, 0xa4, 0x51, 0x3c, 0x0b, 0x83, 0x99, 0x2a, 0xdd, 0x13, 0x60, 0xff, +0xab, 0xd8, 0x36, 0xc3, 0xcb, 0x2c, 0x58, 0xe0, 0x86, 0x24, 0x42, 0x51, 0xf3, 0xd1, 0x59, 0x6c, +0xb1, 0xd8, 0xa4, 0xeb, 0x74, 0xa5, 0xeb, 0xd5, 0xf6, 0x9d, 0x60, 0x69, 0x8c, 0x92, 0x34, 0xfb, +0xb0, 0x3a, 0xa3, 0xed, 0xeb, 0x4f, 0x25, 0xc0, 0xcf, 0x0e, 0xc9, 0x39, 0x55, 0x58, 0x48, 0x1f, +0x4c, 0x22, 0xa4, 0x77, 0x19, 0x0d, 0x3f, 0xd7, 0xdb, 0x09, 0x43, 0xf8, 0xf1, 0x6b, 0x34, 0xbf, +0xf8, 0xf4, 0xb2, 0x17, 0xbf, 0x69, 0x98, 0x2f, 0x72, 0xb6, 0xff, 0x3b, 0x0a, 0x17, 0xee, 0x7b, +0x44, 0xd9, 0x2e, 0xfc, 0x8f, 0x8d, 0x1e, 0x2d, 0xfa, 0x38, 0x4f, 0xfc, 0xdf, 0x0b, 0xb3, 0xd5, +0xa8, 0x4e, 0xfb, 0x6f, 0x6e, 0x37, 0x90, 0xab, 0x73, 0x48, 0xcb, 0x58, 0x12, 0x08, 0xa1, 0x4b, +0x53, 0x49, 0xd1, 0x25, 0x46, 0x02, 0x5d, 0x3e, 0x21, 0x3c, 0x7f, 0x4c, 0x5c, 0x8e, 0x26, 0xe0, +0x57, 0x2c, 0x92, 0x05, 0xe8, 0x75, 0x7b, 0x47, 0xe5, 0x81, 0x2c, 0x65, 0x15, 0xbc, 0x8c, 0xee, +0x26, 0x65, 0x8c, 0x9e, 0xa7, 0x15, 0xb7, 0x54, 0x66, 0x4d, 0x73, 0xde, 0x1e, 0xea, 0x8a, 0x07, +0x70, 0x85, 0xbf, 0x3a, 0x21, 0xae, 0x12, 0x8f, 0x86, 0x51, 0x29, 0x76, 0x2d, 0xfe, 0x56, 0x0c, +0x3e, 0x0b, 0x26, 0x34, 0xef, 0x31, 0xd5, 0x0a, 0x7a, 0xc1, 0xe9, 0x69, 0xef, 0xf4, 0xc4, 0xc0, +0xbc, 0xba, 0x05, 0xd3, 0x3f, 0xc6, 0x7d, 0xb0, 0xa4, 0x80, 0x7e, 0x1f, 0xac, 0x06, 0xee, 0xd6, +0xa8, 0x64, 0xfb, 0x6f, 0xc6, 0xa1, 0xcf, 0xf6, 0xfc, 0xed, 0x3c, 0x37, 0x72, 0x58, 0x12, 0xd3, +0xb4, 0x67, 0xc4, 0x62, 0x10, 0x5c, 0x75, 0xec, 0xe4, 0x62, 0xce, 0xb0, 0x84, 0x2b, 0x62, 0x00, +0x2d, 0x5c, 0x8e, 0x5d, 0x85, 0xe0, 0x71, 0xa7, 0x0b, 0x7d, 0x42, 0xfc, 0x5a, 0x44, 0xc1, 0x68, +0x32, 0x01, 0x6f, 0x3e, 0xb9, 0x1f, 0x26, 0xee, 0x74, 0x0c, 0x0c, 0xdb, 0x33, 0x62, 0x5b, 0xcd, +0xdd, 0xad, 0xd7, 0x10, 0x65, 0x17, 0x82, 0x94, 0x63, 0xfb, 0x89, 0x01, 0x89, 0xbd, 0xcb, 0xb8, +0x24, 0xdc, 0x1c, 0x35, 0xf1, 0x9e, 0xf0, 0xee, 0xf7, 0xc1, 0x3f, 0xb5, 0x2a, 0xca, 0x78, 0x3e, +0x98, 0x63, 0xb8, 0x5d, 0x7f, 0xdd, 0xbc, 0x6c, 0x86, 0xb4, 0x6d, 0xcb, 0x37, 0x4a, 0xd1, 0x86, +0xf5, 0x6f, 0x5b, 0x40, 0xb5, 0xa1, 0xa1, 0xc1, 0x1e, 0x4f, 0x19, 0x03, 0x2f, 0x86, 0xa0, 0x85, +0x63, 0x6d, 0xb5, 0xe0, 0xd7, 0x5f, 0x4e, 0x98, 0xbf, 0x38, 0x7f, 0x37, 0x60, 0xfc, 0xb6, 0x05, +0x95, 0xd9, 0xa5, 0xf1, 0x3d, 0x9a, 0xef, 0x65, 0x47, 0x48, 0x68, 0xaf, 0xb0, 0xa0, 0x42, 0x33, +0xe2, 0x1c, 0xe4, 0x36, 0x0a, 0xda, 0x36, 0x17, 0x3a, 0xf9, 0x5b, 0x7e, 0x99, 0x32, 0x80, 0xf9, +0xb5, 0xd7, 0xbf, 0x27, 0x09, 0x59, 0x3f, 0x0e, 0x13, 0x00, 0x00}; +#endif /*__ABOUT_HTML_H__*/ diff --git a/src/web/html/h/api_js.h b/src/web/html/h/api_js.h new file mode 100644 index 00000000..d9bf93cb --- /dev/null +++ b/src/web/html/h/api_js.h @@ -0,0 +1,216 @@ +#ifndef __API_JS_H__ +#define __API_JS_H__ +#define api_js_len 3363 +const uint8_t api_js[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xdd, 0x59, 0x79, 0x6f, 0xdb, 0x46, +0x16, 0xff, 0xdf, 0x9f, 0x62, 0x42, 0x60, 0x63, 0x2a, 0x91, 0x46, 0xbc, 0x8f, 0xb8, 0xea, 0x42, +0x75, 0x9d, 0xc4, 0x0b, 0xc7, 0x2e, 0x62, 0xb7, 0xbb, 0x80, 0x61, 0x04, 0xb4, 0x34, 0xb6, 0xd8, +0x50, 0xa4, 0x96, 0xa4, 0xec, 0xc4, 0x85, 0xbf, 0xfb, 0xfe, 0xde, 0x90, 0x94, 0x78, 0xc9, 0xf1, +0x9e, 0x2d, 0x56, 0x31, 0xaf, 0x99, 0x77, 0x5f, 0xf3, 0x66, 0x32, 0x7e, 0xf5, 0x6a, 0x8f, 0xbd, +0x62, 0xe7, 0xbf, 0xbc, 0x63, 0xc7, 0x87, 0x67, 0xa7, 0xe7, 0xf8, 0x18, 0xef, 0xed, 0x85, 0xb3, +0x24, 0xfe, 0x6b, 0x78, 0x13, 0xea, 0x6c, 0xc2, 0x2e, 0xf7, 0x18, 0x7e, 0xca, 0x07, 0x5d, 0xe7, +0x9a, 0xe5, 0x30, 0x5d, 0xe3, 0x96, 0x6d, 0xcd, 0xb8, 0x61, 0x38, 0x23, 0xba, 0x71, 0xdd, 0xb3, +0x47, 0xdc, 0xd1, 0x70, 0xd3, 0x47, 0xdc, 0xb5, 0xa7, 0x0e, 0xb7, 0x5c, 0x93, 0x15, 0x77, 0x4d, +0xfe, 0xf3, 0x98, 0x3f, 0x1b, 0x01, 0xdb, 0x61, 0xda, 0xc8, 0xc0, 0xc3, 0xe0, 0x86, 0x6d, 0xe1, +0xcd, 0xb7, 0x1c, 0xee, 0x6a, 0x16, 0xc8, 0x78, 0x36, 0xd7, 0x2d, 0x50, 0x30, 0x41, 0xcf, 0x36, +0x30, 0xa2, 0x83, 0x52, 0xc4, 0x35, 0xdd, 0xa6, 0x6b, 0xc6, 0x75, 0x87, 0xfe, 0x2c, 0xcd, 0xe5, +0xba, 0xcf, 0x1d, 0x92, 0xc4, 0x9f, 0xda, 0xe0, 0xe0, 0xb1, 0xe2, 0x4e, 0x5c, 0x74, 0xf0, 0xd1, +0xb5, 0x19, 0xf7, 0x1c, 0xfa, 0xd6, 0xb9, 0xe3, 0x73, 0x43, 0xd3, 0x99, 0xc1, 0x2d, 0x83, 0xdb, +0x0e, 0xde, 0x4d, 0x50, 0xb5, 0x40, 0xd0, 0x25, 0x0a, 0x23, 0x90, 0xd0, 0x25, 0x87, 0x11, 0xdd, +0x1e, 0x3e, 0xf8, 0x24, 0x9f, 0x0e, 0x68, 0xe8, 0xa6, 0xfb, 0xd0, 0x0d, 0x37, 0x5c, 0xde, 0x08, +0x02, 0x01, 0x04, 0x32, 0x39, 0xce, 0x54, 0xe7, 0xbe, 0xcf, 0xe4, 0xad, 0xd2, 0x0c, 0xb2, 0xd8, +0x41, 0x6b, 0x98, 0x74, 0x85, 0x8e, 0xde, 0x0c, 0x9a, 0x99, 0x1e, 0x34, 0xa3, 0x27, 0xc4, 0x77, +0x2c, 0x22, 0x04, 0x3a, 0x11, 0xd4, 0x26, 0xd5, 0x9d, 0x80, 0xdb, 0xdc, 0x2e, 0x69, 0xe1, 0xdb, +0x65, 0x1a, 0x4d, 0x81, 0x27, 0xde, 0x1f, 0x94, 0xbd, 0xab, 0x83, 0xad, 0x2b, 0x8c, 0xba, 0x2b, +0x4c, 0x58, 0xde, 0x67, 0x1e, 0x37, 0x5c, 0x1d, 0x9e, 0xd0, 0xc9, 0x13, 0x64, 0x22, 0x1f, 0x0c, +0x6c, 0x17, 0xe8, 0x9a, 0x63, 0x82, 0x86, 0x65, 0x4f, 0x7d, 0x68, 0xec, 0xb0, 0xe2, 0x5e, 0x89, +0xec, 0x90, 0x33, 0x7c, 0x0d, 0x7c, 0x47, 0x26, 0x77, 0x3c, 0x18, 0x67, 0x04, 0xf3, 0x3b, 0xd0, +0x1e, 0xaa, 0x42, 0x24, 0xcb, 0xc3, 0x5f, 0xa9, 0x09, 0x51, 0x22, 0x42, 0x98, 0x91, 0x57, 0x25, +0xab, 0x63, 0x93, 0x23, 0xed, 0x29, 0x40, 0x1d, 0x26, 0x6f, 0x95, 0x0b, 0xdc, 0xa0, 0x3d, 0x66, +0x41, 0x26, 0x17, 0xc4, 0x4d, 0xd3, 0x81, 0xb0, 0x1a, 0x78, 0x99, 0x06, 0x31, 0xd1, 0x35, 0x8f, +0xe8, 0x10, 0x0f, 0xfb, 0x61, 0x89, 0x78, 0xd0, 0x3d, 0x93, 0xc9, 0xfb, 0xef, 0x14, 0x5d, 0xde, +0xff, 0x77, 0x74, 0x79, 0x45, 0x74, 0xb9, 0x7d, 0xd1, 0x65, 0xd6, 0xa3, 0xcb, 0xe6, 0xa6, 0x67, +0xc1, 0xc6, 0xba, 0x6e, 0x53, 0x34, 0xd8, 0x74, 0x6d, 0xe2, 0xc1, 0x22, 0x7c, 0x13, 0xc2, 0x92, +0x32, 0x16, 0x2b, 0x1f, 0x95, 0xc0, 0xe6, 0xa1, 0x0d, 0xf3, 0xfb, 0x8c, 0x1c, 0xe9, 0x1a, 0x26, +0x33, 0xb9, 0xe7, 0x19, 0x90, 0xc9, 0x84, 0x29, 0x4d, 0xd7, 0xef, 0x21, 0xe7, 0x11, 0x35, 0x6e, +0xeb, 0x1e, 0x5d, 0x9b, 0xf0, 0x42, 0x58, 0x6a, 0xf6, 0x14, 0xea, 0x5b, 0x96, 0xb4, 0x82, 0x65, +0x6d, 0xdd, 0x60, 0xcd, 0x60, 0x72, 0xca, 0x15, 0x44, 0x96, 0x67, 0xb8, 0xdc, 0xd3, 0x0c, 0x08, +0xeb, 0xea, 0x0e, 0x05, 0x8f, 0x63, 0x15, 0x21, 0x46, 0x41, 0xec, 0x23, 0xd2, 0x88, 0x14, 0xb1, +0xf1, 0x1f, 0x94, 0x61, 0x4f, 0xf6, 0x90, 0x40, 0x14, 0x8c, 0x46, 0x2d, 0xde, 0xb7, 0x99, 0x63, +0xb3, 0xe2, 0xfe, 0x7b, 0x66, 0x8e, 0xb3, 0xcd, 0x1c, 0xa7, 0x99, 0x39, 0xe6, 0x1f, 0x27, 0x73, +0xfe, 0x63, 0x75, 0x79, 0x93, 0x38, 0xce, 0x1f, 0xaf, 0x2c, 0x77, 0x13, 0x27, 0x48, 0xe3, 0x5a, +0xde, 0xb8, 0xdc, 0x37, 0x3d, 0xe8, 0x05, 0xe1, 0xa7, 0x14, 0x79, 0xba, 0x59, 0xe9, 0xcf, 0x35, +0x84, 0xa8, 0x11, 0x34, 0x06, 0x65, 0x7c, 0x68, 0x64, 0x40, 0x4b, 0x5e, 0x9b, 0x61, 0xdb, 0xc2, +0xe5, 0x46, 0x0e, 0xf7, 0x6c, 0x97, 0xf4, 0x70, 0x1c, 0x77, 0xc6, 0x35, 0x08, 0x0a, 0xd9, 0x34, +0x13, 0x0e, 0x31, 0x2c, 0xa2, 0x47, 0xde, 0x06, 0x45, 0x10, 0xc1, 0x55, 0x20, 0x8f, 0x0a, 0x64, +0x4a, 0x5c, 0x79, 0x6d, 0x46, 0x1d, 0x60, 0xea, 0xee, 0x7b, 0x9d, 0xf8, 0x04, 0x94, 0xd6, 0x74, +0xd5, 0x66, 0xc9, 0xd6, 0x6e, 0x0f, 0xad, 0x91, 0x24, 0xe6, 0xca, 0x6b, 0x23, 0x9f, 0x06, 0xbb, +0x83, 0xf7, 0x09, 0x12, 0x0f, 0x55, 0x02, 0xea, 0xba, 0x24, 0x87, 0xe5, 0xd2, 0x55, 0x53, 0x82, +0x08, 0xb8, 0x0f, 0x4b, 0x6a, 0x1a, 0xf0, 0x6e, 0x91, 0x37, 0xa0, 0xbb, 0x5e, 0x19, 0x80, 0xbc, +0xe1, 0x83, 0xe8, 0x09, 0x58, 0xda, 0x8c, 0x52, 0xd2, 0x34, 0x67, 0x04, 0xe7, 0x72, 0xd7, 0xf5, +0x28, 0x0a, 0x00, 0xeb, 0x3a, 0xb0, 0xa9, 0x57, 0xbc, 0x2c, 0x00, 0xe3, 0xea, 0x08, 0x70, 0xcf, +0xf3, 0x65, 0x1c, 0x59, 0x26, 0x82, 0xc0, 0xf7, 0x01, 0x30, 0x92, 0x00, 0x27, 0x1e, 0x5e, 0x0d, +0x4a, 0x45, 0xc7, 0xd9, 0x26, 0xbb, 0x2b, 0x6d, 0xaf, 0x1b, 0x01, 0xe8, 0x49, 0xd9, 0x10, 0x79, +0xe5, 0xb3, 0xd0, 0x13, 0x5f, 0x0f, 0x80, 0xd2, 0x11, 0xb1, 0xbe, 0x8f, 0x7a, 0x87, 0xf4, 0x2e, +0x52, 0x5c, 0xc2, 0xe8, 0x9c, 0xaa, 0x26, 0x12, 0xc0, 0x46, 0x29, 0x43, 0xd1, 0x41, 0x64, 0x20, +0x7f, 0x71, 0x95, 0xd8, 0xd0, 0x07, 0x3a, 0x6c, 0xd0, 0x6b, 0xc1, 0x71, 0x1c, 0xdf, 0x24, 0xb5, +0xe0, 0x80, 0x16, 0xf6, 0xd4, 0x65, 0x6e, 0x49, 0x17, 0x9f, 0x41, 0xf1, 0xa5, 0x15, 0x72, 0x59, +0x0f, 0x4b, 0xdc, 0xa7, 0x1e, 0xf3, 0xca, 0x11, 0x3c, 0x83, 0xe2, 0xab, 0xf8, 0xa7, 0x6f, 0x95, +0x5a, 0x42, 0x53, 0xca, 0x64, 0xdb, 0xf3, 0x90, 0xad, 0x06, 0xf2, 0xc9, 0x43, 0x6c, 0x6a, 0x28, +0x64, 0x08, 0x6b, 0xca, 0x24, 0x59, 0x07, 0x7c, 0x8b, 0x52, 0xca, 0x84, 0xb8, 0xe4, 0x41, 0xc3, +0xa3, 0xba, 0xe2, 0x47, 0x54, 0xbc, 0x51, 0xa6, 0xf1, 0x4e, 0x79, 0x80, 0x8e, 0x81, 0x7b, 0x3e, +0xc4, 0x87, 0xc2, 0x28, 0x33, 0x48, 0x62, 0x4f, 0xf3, 0xca, 0x37, 0xdb, 0x92, 0x46, 0x00, 0x36, +0xec, 0x6c, 0xd8, 0x64, 0x59, 0xcb, 0x41, 0x2d, 0xb0, 0x7d, 0x0f, 0x09, 0x0a, 0xd6, 0xdc, 0xd2, +0x1d, 0xca, 0x25, 0xa2, 0x8f, 0x0f, 0x1f, 0xa2, 0x58, 0x78, 0x71, 0x3c, 0xa7, 0x78, 0x31, 0x5c, +0x2a, 0x94, 0x28, 0xfb, 0x54, 0x82, 0x7c, 0x54, 0x2b, 0x93, 0xd2, 0xd5, 0x36, 0xcd, 0x93, 0xad, +0xfc, 0x48, 0x70, 0xaa, 0x72, 0x5b, 0xef, 0x8c, 0x1a, 0xde, 0x21, 0x5f, 0xd5, 0x6c, 0x7a, 0xbe, +0x9e, 0xcd, 0x44, 0x96, 0xfd, 0x97, 0xcc, 0xfa, 0x01, 0xad, 0xad, 0xef, 0x42, 0x1c, 0x1f, 0x6e, +0x36, 0x90, 0x69, 0xb8, 0x36, 0xc5, 0x1c, 0x71, 0x6e, 0x18, 0x70, 0xb4, 0x85, 0x56, 0x06, 0x8b, +0x82, 0xee, 0xb2, 0x62, 0x95, 0x84, 0x85, 0x0d, 0xc4, 0xbf, 0x6b, 0x73, 0xd7, 0xde, 0x96, 0x19, +0x2a, 0xda, 0x9a, 0x73, 0xe2, 0x10, 0x3d, 0xaa, 0x8a, 0x4d, 0x08, 0x9a, 0x74, 0x7d, 0x22, 0x1a, +0x99, 0x88, 0x1a, 0x63, 0x04, 0x96, 0x7e, 0x87, 0x86, 0x4b, 0xd1, 0xa5, 0xd9, 0x5d, 0xf5, 0xdf, +0xae, 0xa3, 0xa8, 0xbe, 0x5c, 0x63, 0xc9, 0xd8, 0x28, 0x28, 0x55, 0xdc, 0x28, 0x88, 0x6f, 0xa4, +0x18, 0x56, 0x08, 0xb0, 0x71, 0x71, 0xd3, 0xba, 0x92, 0x7a, 0xff, 0x5b, 0xbd, 0x50, 0x68, 0xea, +0x5a, 0xb1, 0x71, 0xb1, 0xfd, 0x78, 0x77, 0x74, 0x7a, 0xf4, 0xf1, 0xf8, 0x90, 0xbd, 0xfd, 0xf9, +0xf4, 0xf0, 0xe2, 0xb8, 0xda, 0x86, 0xdc, 0xac, 0xe3, 0x59, 0x1e, 0x26, 0x31, 0x5b, 0x46, 0x6a, +0x1e, 0xdc, 0x9e, 0x06, 0x4b, 0x31, 0x64, 0x9c, 0xf3, 0x20, 0xbd, 0xcd, 0x06, 0xec, 0x37, 0xa9, +0xff, 0x5d, 0x90, 0x32, 0x41, 0xe6, 0x98, 0x27, 0xb3, 0xf5, 0x52, 0xc4, 0x39, 0x9f, 0xa5, 0x22, +0xc8, 0xc5, 0x51, 0x24, 0xe8, 0xab, 0xc2, 0x1b, 0x1c, 0x48, 0xe8, 0xf0, 0x46, 0x25, 0xe4, 0x4b, +0xed, 0xaa, 0xc2, 0xa7, 0xdf, 0x4d, 0x92, 0xaa, 0x44, 0x27, 0x06, 0x20, 0x0b, 0x63, 0xd6, 0x03, +0x52, 0x22, 0x13, 0x04, 0x0f, 0xe3, 0xb9, 0xf8, 0x72, 0x76, 0xa3, 0x2a, 0x49, 0xac, 0x0c, 0xd8, +0x64, 0x32, 0x61, 0x5a, 0x1b, 0x94, 0x7e, 0x22, 0xe2, 0xc1, 0x7c, 0x7e, 0x74, 0x07, 0x29, 0x4e, +0xc2, 0x2c, 0x17, 0xb1, 0x48, 0x0b, 0xfc, 0x6c, 0x7d, 0x9d, 0xe5, 0xa9, 0x6a, 0x0c, 0x78, 0x9e, +0x9c, 0x24, 0xf7, 0x22, 0x3d, 0x0c, 0x32, 0xa1, 0x0e, 0x86, 0x15, 0xdf, 0x4b, 0x82, 0xba, 0x1a, +0xb2, 0x9b, 0x20, 0xca, 0xc4, 0xa0, 0x41, 0xf7, 0x11, 0x54, 0x33, 0xd1, 0xcf, 0x2c, 0x13, 0xf9, +0x34, 0xcf, 0xd3, 0xf0, 0x7a, 0x9d, 0x0b, 0xc9, 0xa8, 0x45, 0xb0, 0x34, 0xc1, 0x86, 0xd4, 0x5e, +0xf3, 0xed, 0xb1, 0x34, 0x10, 0x53, 0x5f, 0x48, 0x34, 0xbd, 0xa1, 0x7f, 0x2a, 0xf2, 0x35, 0x16, +0x3b, 0x11, 0x1d, 0xd4, 0x80, 0xcb, 0xc1, 0x58, 0x40, 0xbb, 0x54, 0x15, 0x51, 0xc9, 0x10, 0x98, +0x7b, 0x8f, 0x7b, 0x5b, 0xef, 0xd5, 0xe6, 0xe3, 0x8a, 0x26, 0xf1, 0xc9, 0xbf, 0xae, 0x44, 0x72, +0xc3, 0x62, 0x69, 0x42, 0x05, 0x26, 0x09, 0xe3, 0x5b, 0xa5, 0xce, 0x14, 0x4a, 0x85, 0x31, 0xcc, +0xf6, 0xfe, 0xe2, 0xc3, 0x09, 0x3c, 0x1c, 0x97, 0xbc, 0x0b, 0x1b, 0x10, 0x85, 0x18, 0xde, 0xca, +0xf2, 0x20, 0x9e, 0x11, 0x9d, 0x69, 0x9a, 0x06, 0x5f, 0xfb, 0xdc, 0x1a, 0x02, 0x57, 0x3b, 0xc0, +0xe3, 0x3b, 0x16, 0xf3, 0x48, 0xc4, 0xb7, 0xf9, 0x02, 0x5f, 0xaf, 0x5f, 0x77, 0xfd, 0xbb, 0x95, +0xe9, 0x32, 0xbc, 0xda, 0x29, 0x56, 0xf5, 0x23, 0xda, 0x79, 0x37, 0xf2, 0x2e, 0xc4, 0x97, 0xfc, +0x34, 0x99, 0xc3, 0x07, 0x20, 0xd2, 0x32, 0x7a, 0x15, 0x17, 0xab, 0x95, 0x88, 0xe7, 0x87, 0x8b, +0x30, 0x9a, 0xab, 0x79, 0xdb, 0x2f, 0x35, 0xf5, 0x48, 0x8a, 0x9a, 0x86, 0x44, 0x75, 0xf0, 0xdb, +0xb7, 0x08, 0xf6, 0xb0, 0xed, 0xf8, 0x7a, 0x87, 0x09, 0x5b, 0x0c, 0xda, 0x84, 0x07, 0x5d, 0xdf, +0x53, 0x40, 0xd4, 0x7d, 0x9d, 0x27, 0xab, 0x38, 0xb8, 0x53, 0x2b, 0x73, 0xe5, 0xc9, 0xed, 0x6d, +0x24, 0x54, 0xa5, 0x18, 0x56, 0x86, 0x58, 0xbb, 0x92, 0xeb, 0x30, 0x12, 0xca, 0xa0, 0x89, 0xb6, +0x0a, 0xd2, 0x4c, 0x9c, 0x02, 0x31, 0xb9, 0xfe, 0xb5, 0xc2, 0x25, 0xf7, 0xd5, 0x5c, 0xa7, 0xeb, +0x1d, 0xa7, 0x21, 0x21, 0x01, 0x30, 0x61, 0x46, 0x33, 0x49, 0x50, 0x29, 0xf3, 0x30, 0x5e, 0x8b, +0xad, 0x0d, 0xc8, 0x53, 0x8d, 0x1a, 0x71, 0x2b, 0xf2, 0xb2, 0x40, 0xfc, 0xf0, 0xf5, 0x78, 0xae, +0x2a, 0x24, 0xdc, 0xeb, 0xb0, 0x66, 0x35, 0x90, 0xbe, 0x47, 0x9e, 0x27, 0xf7, 0x3c, 0x4a, 0x66, +0x01, 0xc9, 0xc8, 0x57, 0x41, 0xbe, 0x90, 0x15, 0x82, 0xc2, 0x62, 0xac, 0xb0, 0xd7, 0x2c, 0xe2, +0x8b, 0x54, 0xdc, 0x94, 0xf9, 0x8c, 0x28, 0x51, 0xb5, 0x61, 0x35, 0xb6, 0xa9, 0x11, 0x7f, 0x56, +0x06, 0x03, 0x9e, 0xad, 0xa2, 0x30, 0x57, 0xf7, 0xc7, 0xfb, 0x03, 0xbe, 0x4a, 0x56, 0xea, 0xa0, +0xa7, 0xb2, 0x40, 0x93, 0x17, 0x13, 0x94, 0xed, 0xc1, 0xcb, 0x97, 0xac, 0x78, 0xf7, 0x07, 0x83, +0x8e, 0xab, 0x23, 0x3e, 0x8b, 0x82, 0x2c, 0xa3, 0x7a, 0x42, 0xc5, 0x45, 0x55, 0x02, 0xd8, 0xef, +0x4e, 0x9a, 0x73, 0xeb, 0xe1, 0xba, 0x12, 0xb0, 0xe7, 0xa5, 0x02, 0x3d, 0xd7, 0x9f, 0x56, 0x69, +0x92, 0x1f, 0xc5, 0x4a, 0x5f, 0x55, 0x6b, 0x02, 0x75, 0x41, 0x4a, 0x30, 0x8d, 0x34, 0x0f, 0xbb, +0x42, 0xb5, 0x05, 0x4b, 0xc5, 0x32, 0xb9, 0x83, 0xd3, 0x17, 0xe1, 0xbc, 0x21, 0xd9, 0x36, 0xac, +0x64, 0xec, 0x41, 0xcb, 0xef, 0xe1, 0xba, 0x1e, 0x5e, 0x95, 0x49, 0x6a, 0x82, 0x2d, 0x83, 0xec, +0xb3, 0x72, 0xc5, 0xbe, 0xff, 0x1e, 0xc6, 0x19, 0x19, 0x30, 0xe0, 0x4b, 0xa6, 0x7d, 0xd1, 0x74, +0x2a, 0xbf, 0xf4, 0xa2, 0xf5, 0x4b, 0xf5, 0xcf, 0x4a, 0xf6, 0xd8, 0x9f, 0x89, 0xd0, 0xfc, 0x45, +0xaf, 0xe6, 0xcf, 0xa1, 0xfd, 0xd8, 0xd0, 0x57, 0x6f, 0x12, 0xf9, 0x16, 0x81, 0xc7, 0x6e, 0x96, +0xfc, 0x22, 0xd2, 0x0c, 0x1f, 0xf5, 0x4c, 0xd9, 0x19, 0xd6, 0x77, 0x05, 0xac, 0x32, 0x68, 0xe4, +0xf1, 0x46, 0x82, 0x28, 0x8c, 0x3f, 0x83, 0x5f, 0x9e, 0xaf, 0xb2, 0x37, 0xe3, 0xf1, 0x6d, 0x98, +0x2f, 0xd6, 0xd7, 0x7c, 0x96, 0x2c, 0xc7, 0xd1, 0x7a, 0x19, 0xac, 0xd6, 0xe3, 0x60, 0x91, 0x7c, +0x1d, 0xe3, 0x7b, 0x19, 0xe6, 0x99, 0x0c, 0x78, 0xe9, 0x8f, 0xeb, 0x35, 0x88, 0x28, 0x58, 0x9f, +0x94, 0x77, 0x61, 0xce, 0xce, 0xdf, 0x4f, 0xdf, 0xb0, 0xf6, 0x1c, 0x3e, 0x15, 0xf6, 0xa6, 0x36, +0x5e, 0x09, 0x42, 0x58, 0x9f, 0xae, 0xa3, 0x20, 0xfe, 0xac, 0x14, 0x86, 0xe8, 0xab, 0x03, 0x47, +0xe7, 0x3f, 0x3d, 0x4b, 0x3b, 0x91, 0xad, 0x3e, 0x51, 0xbd, 0x86, 0x7a, 0xa9, 0x58, 0x45, 0xc1, +0x4c, 0x48, 0xfd, 0x52, 0x11, 0x6f, 0x55, 0xdc, 0x55, 0x9b, 0x95, 0x1f, 0x92, 0x20, 0x9d, 0xd7, +0x24, 0xdc, 0x10, 0xbb, 0xda, 0x2d, 0xd8, 0xc7, 0x2c, 0x0b, 0xeb, 0x92, 0xc9, 0xc5, 0x05, 0xd5, +0x06, 0x95, 0x65, 0x73, 0x8e, 0xb2, 0xe9, 0x33, 0x24, 0xd5, 0x7b, 0x0c, 0x7d, 0x4a, 0x81, 0x06, +0x9b, 0x7c, 0x37, 0x61, 0x23, 0xaf, 0x16, 0xa8, 0x2d, 0x4c, 0xbd, 0xc0, 0xac, 0x82, 0xa5, 0x17, +0xdd, 0xdd, 0x8d, 0x6e, 0x1c, 0x3c, 0x6d, 0x2c, 0x22, 0x45, 0xb0, 0x3d, 0xc6, 0xca, 0xee, 0x6e, +0x55, 0x9a, 0x1a, 0x32, 0xd3, 0x28, 0x2e, 0x09, 0x8d, 0x6a, 0xdd, 0x16, 0x62, 0x30, 0x68, 0x57, +0xfb, 0xe3, 0x2c, 0xf9, 0x11, 0x76, 0x3d, 0x47, 0x3f, 0x33, 0xaf, 0xcc, 0xb2, 0x69, 0x0b, 0xee, +0x19, 0xcd, 0xa9, 0x73, 0x12, 0xe6, 0x22, 0x5c, 0xa2, 0xc7, 0x81, 0xb5, 0xb7, 0x9f, 0x0f, 0x49, +0x2c, 0xce, 0x6e, 0x6e, 0xd0, 0xb7, 0x60, 0xe2, 0x15, 0x1b, 0x39, 0x1a, 0x7e, 0x03, 0xea, 0x8a, +0x8e, 0xcf, 0xcf, 0xce, 0x8b, 0x8a, 0x3a, 0x68, 0x56, 0x57, 0xdd, 0xdf, 0x88, 0xaf, 0xee, 0x5f, +0xec, 0x0f, 0x19, 0xfd, 0xf5, 0x09, 0x45, 0xf4, 0x2b, 0xa1, 0xd8, 0x78, 0xcc, 0x7e, 0xbe, 0x38, +0x7c, 0xf1, 0x2d, 0xe1, 0x76, 0x73, 0xd6, 0xf5, 0xe7, 0xb1, 0x86, 0x2a, 0xef, 0x91, 0xbd, 0x6a, +0x38, 0x1f, 0x32, 0x4a, 0xe3, 0x66, 0x93, 0xba, 0x7c, 0x62, 0x05, 0x0a, 0xe7, 0xdb, 0x0e, 0x35, +0x96, 0xfd, 0xfd, 0x84, 0x30, 0x06, 0xad, 0x06, 0x6c, 0x03, 0x53, 0xa7, 0x5e, 0x0e, 0xbd, 0x00, +0x7c, 0xad, 0x9c, 0xd0, 0x2a, 0x18, 0x60, 0x6d, 0xaf, 0x0a, 0x4a, 0xb3, 0xf0, 0x34, 0x61, 0xe5, +0x52, 0xd2, 0xa8, 0x3b, 0x32, 0x0e, 0xf7, 0xfa, 0xa1, 0xcb, 0x42, 0xb5, 0x4f, 0x08, 0x5d, 0xe3, +0xcb, 0x05, 0x9f, 0x0c, 0x30, 0x8b, 0x26, 0x25, 0xcd, 0xba, 0x15, 0x9e, 0x69, 0x83, 0x17, 0xa2, +0x4f, 0x95, 0x59, 0x54, 0x53, 0x43, 0xb4, 0x14, 0xc0, 0xe4, 0x36, 0x85, 0x7a, 0xa1, 0x4a, 0xc1, +0x25, 0x60, 0x5d, 0x68, 0xc8, 0x31, 0xfd, 0x35, 0xf8, 0xa2, 0xae, 0x53, 0xb4, 0xa8, 0xab, 0x3c, +0x1d, 0xb2, 0xa5, 0xc8, 0x17, 0xc9, 0x7c, 0xa2, 0xbc, 0x3b, 0xba, 0x40, 0x1a, 0xfc, 0x9a, 0x25, +0xf1, 0x84, 0xbc, 0x52, 0xd7, 0xe4, 0xcb, 0x22, 0xa5, 0x9e, 0x14, 0x71, 0xf4, 0xb7, 0x0f, 0x27, +0xef, 0x51, 0x43, 0x3f, 0x8a, 0xbf, 0xaf, 0xd1, 0xe9, 0xaa, 0x5b, 0x25, 0x08, 0x04, 0x0b, 0x47, +0x1d, 0x13, 0x3f, 0x8c, 0xf2, 0x04, 0xd5, 0x58, 0x2d, 0x98, 0x0c, 0x99, 0x64, 0x9b, 0xa7, 0x6b, +0xb1, 0x5d, 0x35, 0x24, 0x4c, 0x8c, 0x92, 0x35, 0xff, 0x8a, 0xe6, 0x2c, 0x17, 0xb3, 0x45, 0x10, +0xdf, 0x92, 0xed, 0x56, 0x1b, 0x10, 0xd0, 0x57, 0x7e, 0x3a, 0x3b, 0xbf, 0x50, 0x28, 0x54, 0x0a, +0x52, 0x4d, 0x17, 0x13, 0x0d, 0x04, 0x64, 0x29, 0xd6, 0x7b, 0xd0, 0x42, 0x13, 0xae, 0x1c, 0xc2, +0x96, 0x30, 0xf8, 0xe8, 0x82, 0x6a, 0x1d, 0x32, 0x1d, 0x0b, 0x43, 0x14, 0x16, 0x1d, 0xce, 0x98, +0xf4, 0x3c, 0x00, 0x2b, 0x94, 0xba, 0x7c, 0xf2, 0xf3, 0xc5, 0xdb, 0x91, 0xa7, 0x34, 0x45, 0xca, +0xb0, 0x86, 0xa8, 0x04, 0x35, 0xa8, 0x6f, 0x03, 0xb6, 0x45, 0x52, 0x6d, 0x85, 0x24, 0xe1, 0x48, +0x25, 0xce, 0x49, 0x09, 0x12, 0xd4, 0xea, 0xdb, 0x54, 0x51, 0xbc, 0xc3, 0x4e, 0x05, 0x74, 0xb6, +0x4a, 0xe2, 0x4c, 0x16, 0xea, 0x1d, 0x6d, 0x48, 0x05, 0x0e, 0x47, 0xf5, 0xaf, 0xfa, 0x98, 0x50, +0xff, 0x72, 0x7e, 0x76, 0xca, 0x65, 0xd1, 0x56, 0x3b, 0x64, 0xbf, 0xb9, 0x11, 0x42, 0x6c, 0x94, +0xfb, 0xd2, 0xc3, 0x8f, 0x47, 0xd3, 0x8b, 0x23, 0xf6, 0xe3, 0xd9, 0x87, 0xd6, 0xd6, 0xb4, 0x16, +0xf1, 0xb4, 0xc9, 0x88, 0x50, 0x20, 0x70, 0x37, 0xb6, 0xdb, 0x9b, 0x6a, 0x27, 0x41, 0xa3, 0xb2, +0x63, 0x8c, 0xd7, 0xcb, 0x6b, 0x91, 0x2a, 0x83, 0x5a, 0x53, 0x4a, 0x33, 0xac, 0x2c, 0x37, 0x12, +0xfb, 0xa0, 0x5e, 0xa2, 0xb0, 0xe9, 0x55, 0xf2, 0x14, 0x3e, 0xfa, 0xed, 0x71, 0x58, 0x6e, 0xf6, +0xe9, 0x27, 0x87, 0x17, 0x34, 0x9c, 0xe5, 0x5f, 0x23, 0xf1, 0x86, 0x8a, 0xf5, 0x3c, 0x5f, 0xbc, +0x61, 0xb6, 0xf6, 0x27, 0xe5, 0x51, 0x8a, 0xa1, 0x0f, 0x86, 0x4d, 0xf0, 0x79, 0x49, 0x45, 0x32, +0x91, 0x53, 0x57, 0xad, 0x14, 0x98, 0x8b, 0x8c, 0x44, 0xa8, 0xe4, 0x17, 0xbb, 0x37, 0xd4, 0xfb, +0xab, 0xfd, 0x2a, 0xcf, 0xda, 0x15, 0x04, 0x05, 0x13, 0x74, 0x94, 0xcd, 0x74, 0x7d, 0xf3, 0x06, +0xe2, 0x0d, 0xed, 0x44, 0x93, 0x7f, 0x74, 0x1d, 0xa9, 0x8b, 0x7c, 0x19, 0xa1, 0xe9, 0x97, 0x62, +0xca, 0xf2, 0x41, 0x9e, 0x1e, 0xb2, 0x70, 0xde, 0xc8, 0xbd, 0xa7, 0x44, 0x8b, 0x82, 0x6b, 0x11, +0x6d, 0xc5, 0x23, 0x82, 0x6f, 0x13, 0x4a, 0xd3, 0x92, 0xf4, 0x93, 0x82, 0xd5, 0x42, 0x0b, 0x15, +0xa2, 0xa3, 0x1d, 0xe7, 0x7c, 0x53, 0x61, 0x6a, 0xa0, 0x28, 0x5a, 0x44, 0x70, 0x4e, 0x4b, 0xf1, +0xfc, 0x29, 0x0d, 0xc3, 0x78, 0x55, 0xee, 0xca, 0xa5, 0x7a, 0xcb, 0xe0, 0xcb, 0x84, 0x96, 0x5a, +0xa8, 0x79, 0xa9, 0xe4, 0x08, 0x4b, 0xea, 0x8d, 0x4a, 0x55, 0x51, 0x0d, 0x10, 0x3c, 0xe5, 0x2b, +0xb6, 0x1d, 0xd8, 0x3d, 0xc7, 0xd5, 0x44, 0x98, 0x47, 0xd5, 0xcc, 0x6c, 0x21, 0x66, 0x9f, 0xc5, +0xf3, 0xad, 0x03, 0x09, 0xd6, 0xf9, 0x2e, 0xe7, 0xd5, 0xd5, 0x13, 0xbc, 0xd8, 0xe7, 0xc8, 0x03, +0x91, 0x8e, 0xc6, 0x32, 0x4c, 0x04, 0xc7, 0x63, 0x2d, 0x76, 0xd8, 0x0f, 0xca, 0x11, 0x08, 0x1e, +0x27, 0x72, 0xbb, 0xcd, 0xe4, 0xd0, 0x73, 0x6c, 0x57, 0x9b, 0x25, 0x1b, 0xd0, 0x3c, 0x3d, 0x59, +0xf1, 0xd9, 0x81, 0x29, 0x8d, 0x43, 0x60, 0xe5, 0x2b, 0xdb, 0x0c, 0x76, 0x09, 0x92, 0xed, 0x24, +0x45, 0x7a, 0x61, 0xe5, 0x40, 0xd7, 0xf9, 0x85, 0x59, 0x65, 0x04, 0x14, 0xaf, 0x6c, 0x33, 0xf8, +0x94, 0x83, 0x33, 0x11, 0x95, 0x0e, 0x4e, 0x56, 0x34, 0x90, 0x0d, 0x69, 0xe8, 0x78, 0xfe, 0x1c, +0xd7, 0x00, 0x50, 0xcc, 0x6a, 0xbe, 0xe9, 0xd8, 0x5f, 0x6e, 0x86, 0x73, 0x86, 0x82, 0x52, 0x12, +0xaf, 0x17, 0x47, 0x3a, 0x67, 0xc6, 0x30, 0x00, 0x2e, 0x35, 0x8a, 0xa2, 0xfc, 0x52, 0xc7, 0xa3, +0xf8, 0xa4, 0xda, 0x53, 0x88, 0x51, 0x2b, 0x7b, 0xa2, 0xb1, 0x1f, 0x48, 0x06, 0x3d, 0x87, 0x3a, +0x5d, 0xe5, 0x7e, 0x14, 0xd1, 0x34, 0x8a, 0xce, 0xc0, 0x07, 0x1f, 0x8d, 0x16, 0x78, 0x28, 0x37, +0xd7, 0x18, 0xe5, 0xa5, 0x70, 0xe5, 0x29, 0x0b, 0x1b, 0x31, 0xfd, 0xa0, 0xb1, 0x97, 0x8f, 0x68, +0x2f, 0xff, 0x7d, 0xb1, 0xa7, 0x1f, 0x8d, 0xea, 0x3a, 0x10, 0x76, 0xb9, 0x3e, 0x87, 0xbd, 0x9b, +0x1f, 0x52, 0x50, 0x66, 0x0e, 0xe5, 0xb2, 0x34, 0xed, 0xa4, 0x38, 0x20, 0x2b, 0x89, 0x24, 0x4f, +0x98, 0xb7, 0x10, 0xab, 0x32, 0x6f, 0xd2, 0x8d, 0xdd, 0xa4, 0x51, 0x12, 0x88, 0xc3, 0x26, 0x2c, +0x48, 0xd9, 0xad, 0xa5, 0x79, 0xe1, 0x29, 0x19, 0x13, 0xb4, 0x64, 0x37, 0x02, 0x22, 0x69, 0xd5, +0xd4, 0xf0, 0x0e, 0xbd, 0x06, 0x04, 0x7e, 0x76, 0x86, 0x02, 0xe3, 0x39, 0xf9, 0x59, 0x0b, 0xd6, +0xc5, 0xa0, 0x55, 0xce, 0x16, 0x4f, 0x86, 0xe8, 0x2a, 0x88, 0xd5, 0x7f, 0xb9, 0xba, 0x12, 0xf6, +0xfe, 0xe0, 0xf7, 0xac, 0xa1, 0xd7, 0xa9, 0xda, 0xda, 0x64, 0xec, 0x92, 0xf5, 0x3a, 0x6d, 0x77, +0xa6, 0x72, 0xb3, 0x3b, 0xcf, 0x72, 0xd4, 0x50, 0x54, 0x5b, 0xdc, 0x83, 0x14, 0x7d, 0x5f, 0xa7, +0xad, 0x0b, 0x9e, 0x30, 0x40, 0x50, 0x69, 0xff, 0xad, 0x93, 0x3f, 0xe2, 0x50, 0x82, 0x06, 0xf2, +0x3c, 0x88, 0x60, 0xb3, 0xbc, 0x5b, 0x91, 0xa4, 0x0c, 0xdb, 0xf0, 0x0a, 0x78, 0x31, 0xc2, 0xaa, +0xa9, 0x8a, 0x46, 0xdf, 0x81, 0x61, 0x69, 0x81, 0xa0, 0xe5, 0x62, 0x6c, 0xe6, 0xe6, 0x41, 0x1e, +0x94, 0xee, 0xbd, 0x9f, 0x18, 0x16, 0x45, 0x20, 0xdd, 0x37, 0x3e, 0xcf, 0x93, 0x24, 0xca, 0xc3, +0x55, 0x47, 0xf7, 0x6c, 0xa7, 0xee, 0xa7, 0xe7, 0x68, 0xf7, 0xd1, 0xe3, 0xbe, 0x19, 0x8f, 0xef, +0xef, 0xef, 0xf9, 0xbd, 0xc9, 0x93, 0xf4, 0x76, 0x6c, 0x60, 0xbf, 0x36, 0x06, 0x43, 0xda, 0x09, +0xd1, 0xa3, 0x14, 0x2c, 0x6b, 0x1e, 0x45, 0xef, 0xcb, 0xfe, 0x04, 0x30, 0xf7, 0x3b, 0xe6, 0x17, +0x22, 0xbc, 0x5d, 0xe4, 0x00, 0x58, 0xec, 0x00, 0xb8, 0x0b, 0xc5, 0xfd, 0x0f, 0xc9, 0x17, 0x62, +0x53, 0xfc, 0x97, 0x0d, 0xfe, 0xf6, 0x07, 0xbd, 0x11, 0xd7, 0x46, 0x95, 0xf1, 0xb7, 0x4f, 0xba, +0x77, 0xe1, 0xc9, 0x4c, 0xed, 0xf3, 0x62, 0x6c, 0x35, 0xb2, 0x1c, 0x59, 0x80, 0x42, 0xdb, 0x9e, +0x2e, 0x8f, 0x16, 0x31, 0x1d, 0xfe, 0x1b, 0x76, 0xa2, 0x53, 0xc4, 0xfd, 0x56, 0x07, 0x1a, 0xb6, +0x84, 0x9e, 0x03, 0x50, 0xb4, 0x60, 0xb2, 0x46, 0x0c, 0x84, 0x8d, 0x03, 0xbf, 0xfa, 0xf1, 0xfd, +0x36, 0xb6, 0x0a, 0x27, 0xd7, 0x35, 0x28, 0xa4, 0xcf, 0x77, 0x47, 0xb8, 0x22, 0x57, 0xc4, 0xfa, +0xe9, 0x55, 0xde, 0x60, 0xbb, 0x33, 0xde, 0x4b, 0x5e, 0x35, 0xc4, 0xac, 0x37, 0x66, 0x1b, 0x4b, +0x4c, 0xd6, 0x8c, 0xdc, 0x65, 0x32, 0x0f, 0x22, 0x55, 0x4a, 0x30, 0x64, 0xd7, 0xc9, 0xfc, 0x6b, +0xad, 0x99, 0xae, 0xb6, 0xc4, 0x3b, 0x8f, 0x37, 0x24, 0xb2, 0xd2, 0x38, 0x58, 0xdd, 0x7d, 0x14, +0x92, 0x92, 0x68, 0xe9, 0xe6, 0x54, 0x4c, 0x6d, 0x18, 0x9a, 0x1a, 0x66, 0xd4, 0x61, 0xea, 0x98, +0x43, 0x3a, 0x20, 0x92, 0x94, 0x47, 0x15, 0x0e, 0x45, 0x12, 0x22, 0xaa, 0x1a, 0xa7, 0x33, 0x92, +0x78, 0x86, 0x0d, 0xd4, 0xe7, 0x37, 0x85, 0xfc, 0x87, 0x51, 0x92, 0x89, 0xc7, 0x5a, 0xff, 0xbd, +0x93, 0x64, 0x87, 0xd4, 0xe3, 0xb0, 0xb3, 0x9b, 0xa9, 0x21, 0x36, 0x60, 0x47, 0xb3, 0x62, 0x17, +0xa7, 0x34, 0x76, 0x06, 0xcf, 0xc6, 0x5e, 0xc8, 0xbd, 0xe0, 0xd3, 0xc8, 0x15, 0x81, 0x85, 0x5d, +0xee, 0x1d, 0x8a, 0xee, 0x69, 0xf8, 0x4d, 0x04, 0x84, 0x70, 0x9e, 0xc4, 0x75, 0xa6, 0x33, 0xb2, +0x89, 0x52, 0x34, 0xb5, 0xf8, 0xdc, 0x00, 0xf4, 0x59, 0x0e, 0x3b, 0xd2, 0x97, 0x79, 0xb8, 0x14, +0xd9, 0x81, 0xb2, 0xfb, 0x48, 0xf7, 0xea, 0x09, 0x31, 0x76, 0x2a, 0x4d, 0x11, 0x45, 0x2a, 0xcb, +0xc8, 0xea, 0x45, 0xbf, 0xea, 0x8c, 0x36, 0xe1, 0xb6, 0x5f, 0xbd, 0x0d, 0xca, 0x56, 0x0b, 0xf5, +0xb9, 0x27, 0x1e, 0x55, 0xd8, 0x76, 0x4a, 0x53, 0xe3, 0x6c, 0x47, 0x54, 0x8d, 0x51, 0x2d, 0xbd, +0x9e, 0xa6, 0x38, 0xda, 0x86, 0x78, 0x13, 0x95, 0x24, 0xfe, 0x07, 0x65, 0xb7, 0x8f, 0xf0, 0xf2, +0x29, 0x00, 0x00}; +#endif /*__API_JS_H__*/ diff --git a/src/web/html/h/colorBright_css.h b/src/web/html/h/colorBright_css.h new file mode 100644 index 00000000..7968d278 --- /dev/null +++ b/src/web/html/h/colorBright_css.h @@ -0,0 +1,22 @@ +#ifndef __COLORBRIGHT_CSS_H__ +#define __COLORBRIGHT_CSS_H__ +#define colorBright_css_len 261 +const uint8_t colorBright_css[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x55, 0x90, 0xdd, 0x6e, 0xc3, 0x20, +0x0c, 0x85, 0x5f, 0x65, 0x52, 0xae, 0x91, 0xbc, 0xfc, 0x42, 0xf6, 0x34, 0x60, 0x9c, 0x06, 0x29, +0x85, 0x8a, 0xd0, 0x54, 0xd3, 0xb4, 0x77, 0x1f, 0xa6, 0x4d, 0x96, 0x8a, 0x1b, 0xfc, 0xf9, 0x70, +0xec, 0xc3, 0x18, 0x43, 0x48, 0x1f, 0x3f, 0x42, 0x98, 0xcb, 0x58, 0x4d, 0xd3, 0xf4, 0x25, 0xc4, +0x94, 0x6f, 0x00, 0x50, 0x6e, 0xf5, 0x0e, 0x9d, 0x9f, 0x42, 0xc1, 0x60, 0x6d, 0x2e, 0x1f, 0x3a, +0x7a, 0x6e, 0x0d, 0x43, 0x11, 0xae, 0x77, 0x44, 0x5a, 0x57, 0x16, 0x28, 0x55, 0x88, 0xf3, 0xb7, +0x7b, 0x2a, 0xa6, 0x44, 0x94, 0xeb, 0xa4, 0xcd, 0x42, 0xc2, 0x84, 0x68, 0x29, 0x8e, 0x15, 0x22, +0x66, 0xe6, 0xf5, 0x56, 0x14, 0x4d, 0xd3, 0xe4, 0xea, 0x16, 0xdd, 0x55, 0xc7, 0x6f, 0xf6, 0xe8, +0x09, 0xe1, 0x9f, 0x88, 0x39, 0x6c, 0xfc, 0x08, 0xda, 0x96, 0x64, 0xcf, 0xd3, 0x08, 0x83, 0xb7, +0x2f, 0xed, 0x50, 0xa3, 0x7c, 0x79, 0x69, 0x4c, 0x6e, 0xa3, 0xb1, 0xea, 0xba, 0x8e, 0x97, 0xcf, +0xc1, 0x28, 0x96, 0x01, 0xb5, 0xe4, 0x93, 0xd9, 0x35, 0x58, 0xbd, 0x9c, 0xa2, 0x3a, 0xbf, 0xe9, +0xc5, 0xd9, 0x27, 0x51, 0x8a, 0xf7, 0x0c, 0x29, 0x2b, 0x66, 0xd2, 0x56, 0x24, 0x97, 0x96, 0xec, +0x26, 0xa9, 0x53, 0xd0, 0x1c, 0x2d, 0x96, 0x9a, 0xbc, 0x21, 0xb4, 0xfc, 0x7e, 0x7b, 0x93, 0x7e, +0x62, 0x2f, 0x9f, 0xe9, 0x5f, 0xbc, 0xa4, 0xab, 0x0d, 0xec, 0x62, 0xeb, 0xd6, 0xc3, 0x56, 0xca, +0x83, 0x8d, 0x95, 0x2a, 0xc3, 0x71, 0x7e, 0xb3, 0x03, 0x68, 0x50, 0xc2, 0x89, 0x9b, 0xcb, 0xe9, +0x77, 0xd2, 0x5a, 0xe0, 0xfe, 0x7d, 0xb9, 0xe4, 0x36, 0x67, 0xff, 0xfd, 0x03, 0x3b, 0xc9, 0xfb, +0x95, 0xd5, 0x01, 0x00, 0x00}; +#endif /*__COLORBRIGHT_CSS_H__*/ diff --git a/src/web/html/h/colorDark_css.h b/src/web/html/h/colorDark_css.h new file mode 100644 index 00000000..a24f888b --- /dev/null +++ b/src/web/html/h/colorDark_css.h @@ -0,0 +1,21 @@ +#ifndef __COLORDARK_CSS_H__ +#define __COLORDARK_CSS_H__ +#define colorDark_css_len 255 +const uint8_t colorDark_css[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x5d, 0x90, 0xd9, 0x6e, 0xc3, 0x20, +0x10, 0x45, 0x7f, 0xa5, 0x92, 0x9f, 0x91, 0x58, 0x6c, 0xc7, 0x72, 0xbf, 0x66, 0xd8, 0x6a, 0x24, +0x07, 0x22, 0x20, 0x44, 0x55, 0xd5, 0x7f, 0x2f, 0x0c, 0x76, 0xd2, 0x56, 0xbc, 0xcc, 0x9c, 0xb9, +0xdc, 0x59, 0xd6, 0x18, 0x42, 0x7e, 0xfb, 0x22, 0x44, 0x7e, 0xac, 0x03, 0xe7, 0xfc, 0x9d, 0x10, +0x5b, 0x23, 0xa5, 0x14, 0x46, 0x7c, 0x1d, 0xac, 0xb5, 0x35, 0x74, 0xde, 0x86, 0x75, 0xa0, 0xf4, +0xc2, 0xd5, 0x52, 0xd3, 0x07, 0x44, 0xdf, 0x4a, 0x00, 0x94, 0xd6, 0x34, 0xdd, 0x95, 0x32, 0x29, +0x35, 0x81, 0x94, 0x48, 0x9c, 0xbf, 0xdd, 0x33, 0x9a, 0x0a, 0x21, 0x6a, 0x9e, 0x41, 0xee, 0x86, +0xc8, 0x10, 0xb5, 0x89, 0x27, 0xf3, 0x50, 0x7e, 0x29, 0x6e, 0xd1, 0x5d, 0x21, 0x7e, 0x36, 0x8f, +0x51, 0x2f, 0x97, 0x17, 0x21, 0x5b, 0x28, 0xed, 0x13, 0xe5, 0x82, 0x4d, 0x53, 0xeb, 0x66, 0x54, +0xf0, 0xfa, 0xd0, 0x1e, 0x03, 0x35, 0x2f, 0x50, 0xd9, 0x15, 0xb3, 0x0e, 0x13, 0xaa, 0x6c, 0x5d, +0xcc, 0xc4, 0xbe, 0xd7, 0xd2, 0x5e, 0x65, 0xd7, 0xa0, 0x61, 0x47, 0x34, 0xcf, 0x33, 0x4e, 0x59, +0x60, 0x77, 0x1a, 0xc9, 0x88, 0x73, 0xe7, 0x90, 0xab, 0x62, 0x33, 0xa0, 0x49, 0x76, 0x79, 0xef, +0x6e, 0x13, 0x63, 0xcf, 0xd2, 0xf1, 0x79, 0xc6, 0x53, 0xb9, 0xf2, 0x47, 0xca, 0xd8, 0x21, 0x3d, +0x79, 0x3f, 0xea, 0x4b, 0xac, 0x5d, 0x3a, 0xb5, 0x7d, 0xe9, 0xce, 0x6a, 0xf3, 0x71, 0xac, 0x99, +0xda, 0xfe, 0xd9, 0x71, 0x8e, 0xab, 0x9c, 0xbc, 0xdb, 0x09, 0x81, 0xb3, 0xe7, 0x84, 0xf0, 0x79, +0xe0, 0x84, 0xe5, 0xb6, 0xfb, 0xf7, 0x0f, 0xe9, 0x86, 0x9e, 0xcf, 0xd5, 0x01, 0x00, 0x00}; +#endif /*__COLORDARK_CSS_H__*/ diff --git a/src/web/html/h/favicon_ico.h b/src/web/html/h/favicon_ico.h new file mode 100644 index 00000000..defec936 --- /dev/null +++ b/src/web/html/h/favicon_ico.h @@ -0,0 +1,101 @@ +#ifndef __FAVICON_ICO_H__ +#define __FAVICON_ICO_H__ +#define favicon_ico_len 1534 +const uint8_t favicon_ico[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xed, 0x5c, 0x4b, 0x6c, 0x1b, 0x55, +0x14, 0x3d, 0x4e, 0x9c, 0xba, 0x48, 0x51, 0x93, 0x05, 0x48, 0x95, 0x88, 0x62, 0xf3, 0x59, 0x64, +0x97, 0xa0, 0x4a, 0x6d, 0x11, 0x51, 0x5d, 0x21, 0x40, 0x88, 0xa6, 0xec, 0xb2, 0x42, 0x95, 0xb2, +0x2a, 0xec, 0xa0, 0xa2, 0xcd, 0x58, 0x22, 0x90, 0x49, 0xf3, 0xe9, 0x07, 0x5a, 0x3b, 0x69, 0x8b, +0x28, 0xb4, 0xa8, 0xad, 0x9b, 0xb6, 0x44, 0x7c, 0xa4, 0x02, 0x25, 0x69, 0x91, 0x6a, 0x67, 0x01, +0x9b, 0x2e, 0xd8, 0x56, 0x75, 0x22, 0x8b, 0x0d, 0xbb, 0x28, 0x4b, 0x2f, 0xac, 0x3c, 0xee, 0x9d, +0x79, 0xe3, 0x38, 0x93, 0x89, 0xff, 0xf1, 0x4b, 0xfc, 0xf2, 0xa4, 0xa3, 0x63, 0x8f, 0xe7, 0xcd, +0xb9, 0xe7, 0xcc, 0x78, 0xe6, 0x65, 0xde, 0xc4, 0x80, 0x0f, 0xcd, 0x68, 0x6f, 0x07, 0x71, 0x08, +0x1f, 0xf9, 0x81, 0xfd, 0x00, 0x42, 0x21, 0xfb, 0xfd, 0x3d, 0x5a, 0xfe, 0x3d, 0x2d, 0x3b, 0x7c, +0xd8, 0x7e, 0xdf, 0xf5, 0x26, 0xf0, 0xce, 0x0b, 0x40, 0x17, 0xad, 0xd3, 0xce, 0xeb, 0xc1, 0x5e, +0xbe, 0x51, 0x5b, 0x48, 0x46, 0xcd, 0x85, 0x64, 0x4c, 0x10, 0x0c, 0x71, 0x1b, 0xd7, 0x09, 0x42, +0x4c, 0xe3, 0xe9, 0x23, 0x03, 0xbd, 0x73, 0x06, 0x04, 0x83, 0x5f, 0x0f, 0xf6, 0xe1, 0x29, 0x41, +0x18, 0x7d, 0xb8, 0xde, 0xdd, 0x09, 0xa3, 0x27, 0x08, 0xc1, 0x58, 0x98, 0x8f, 0x8d, 0xc8, 0x6d, +0x54, 0xd6, 0xdf, 0xd2, 0x8e, 0x9a, 0xcf, 0x1e, 0x4f, 0x75, 0x54, 0xde, 0xdf, 0xda, 0xc6, 0x07, +0x22, 0x8e, 0x8f, 0x2b, 0xef, 0x4f, 0xf5, 0x4f, 0xa3, 0x87, 0xfa, 0x8f, 0x56, 0xdc, 0x9f, 0xeb, +0x9f, 0xc6, 0x30, 0x61, 0xa0, 0xe2, 0xfe, 0x5c, 0xff, 0x6d, 0x7c, 0x36, 0x3b, 0x88, 0xfd, 0x15, +0xf7, 0xa7, 0xfa, 0x79, 0xdf, 0x52, 0xdf, 0xd1, 0x6a, 0xfa, 0x3b, 0xdb, 0xa8, 0xa6, 0x3f, 0xb7, +0xbf, 0x4e, 0xe0, 0xb9, 0x32, 0xfd, 0x8f, 0xb9, 0x8f, 0xd3, 0xc1, 0x23, 0x18, 0x2b, 0x31, 0xff, +0x0b, 0x1b, 0x1d, 0xeb, 0xc6, 0x51, 0x8c, 0x17, 0xec, 0x7f, 0x0b, 0x07, 0x50, 0xa4, 0x9d, 0x7c, +0x0f, 0x07, 0xbc, 0xfa, 0xa7, 0xe6, 0xa3, 0x03, 0x28, 0xb1, 0xf5, 0x84, 0x30, 0xb0, 0xa6, 0x7f, +0x22, 0x76, 0xd1, 0x6b, 0xbd, 0xc7, 0x26, 0x76, 0x33, 0x3c, 0xb7, 0xd1, 0x89, 0x09, 0xab, 0xff, +0x06, 0x7d, 0x67, 0x4c, 0xec, 0x9a, 0x8b, 0xe0, 0x57, 0xda, 0x7f, 0x73, 0x9c, 0xff, 0x46, 0xdb, +0x28, 0x54, 0x67, 0x13, 0xa1, 0x99, 0x61, 0x12, 0x12, 0x40, 0x20, 0x0d, 0xb4, 0x2d, 0x03, 0xc1, +0x0c, 0x70, 0x68, 0x08, 0x18, 0x3a, 0x64, 0x9f, 0x67, 0xf8, 0xec, 0x72, 0xb8, 0xf4, 0xf3, 0x8c, +0x83, 0x25, 0x5e, 0x2e, 0xee, 0xa0, 0x57, 0xee, 0xf3, 0x55, 0xc4, 0x71, 0x9f, 0x3f, 0x9b, 0x8d, +0xc0, 0x70, 0xbe, 0x03, 0x0e, 0x78, 0x19, 0x7f, 0x76, 0xaa, 0x0f, 0xf7, 0xf9, 0x78, 0xc8, 0x07, +0xed, 0xdf, 0x5e, 0xcb, 0x57, 0x10, 0x4b, 0x4e, 0xbe, 0x0e, 0xac, 0x1a, 0xac, 0x73, 0x95, 0x1a, +0xfd, 0xd4, 0x7c, 0x6c, 0xdc, 0x55, 0x43, 0x5d, 0xf5, 0x59, 0x73, 0x31, 0x11, 0x3b, 0x9f, 0x57, +0x43, 0xdd, 0xf5, 0xad, 0x1a, 0x92, 0xb1, 0x51, 0x5e, 0x87, 0xf8, 0x53, 0x15, 0xfa, 0x16, 0xe6, +0xa3, 0xe7, 0x9c, 0xe3, 0x52, 0x89, 0xbe, 0x55, 0x43, 0x6c, 0xc4, 0xd2, 0x9f, 0xc6, 0x7e, 0x25, +0xfa, 0x72, 0xff, 0x5b, 0x35, 0xf0, 0x35, 0x4f, 0x91, 0xbe, 0x98, 0x42, 0x40, 0xd6, 0x30, 0xa1, +0x44, 0x9f, 0xf7, 0x3f, 0x5d, 0xb3, 0x65, 0x0d, 0x63, 0x4a, 0xf4, 0x6d, 0xdf, 0x5f, 0xe4, 0x6a, +0x50, 0xa3, 0xbf, 0x5a, 0x43, 0x1c, 0x6f, 0x2b, 0xd2, 0xcf, 0xd5, 0xa0, 0x50, 0x9f, 0xc7, 0x2f, +0x27, 0xf8, 0xb3, 0x87, 0x11, 0x0c, 0x28, 0xd1, 0x97, 0xfb, 0xdf, 0x1a, 0x7f, 0x45, 0x30, 0xa1, +0x52, 0xdf, 0x5d, 0x83, 0x0a, 0x7d, 0x39, 0x0e, 0x3d, 0xa3, 0x52, 0xdf, 0xa9, 0x41, 0xa5, 0x3e, +0xb7, 0x07, 0xa7, 0xf0, 0x8a, 0x4a, 0x7d, 0xa7, 0x6d, 0xb2, 0xbe, 0x59, 0x4c, 0x9f, 0xf4, 0xcc, +0x4d, 0xd2, 0xff, 0x46, 0x08, 0x1a, 0xca, 0x16, 0x6f, 0x3e, 0xd2, 0x9c, 0xac, 0xa9, 0x7e, 0x1c, +0x57, 0x4b, 0xd4, 0xf6, 0xac, 0xa1, 0x2a, 0xfd, 0xf2, 0xb5, 0x73, 0x35, 0x90, 0xee, 0x54, 0x95, +0xfa, 0xdf, 0x56, 0xa8, 0xbd, 0xa6, 0x86, 0x8a, 0xf4, 0x67, 0xd0, 0x5a, 0xa5, 0x76, 0xae, 0x06, +0xb3, 0x1f, 0xad, 0x95, 0x8c, 0xbf, 0x6a, 0xdd, 0x4a, 0xd1, 0x4f, 0x25, 0x63, 0x97, 0x36, 0x4b, +0xff, 0xb5, 0x20, 0x2e, 0x15, 0xd2, 0x4f, 0x25, 0x26, 0xbf, 0x13, 0xc2, 0x6c, 0xc2, 0xe6, 0x35, +0x1f, 0x69, 0x5e, 0xf6, 0xd2, 0xaf, 0x44, 0x7b, 0xee, 0x24, 0x5e, 0x62, 0x54, 0x53, 0x83, 0xd4, +0xbf, 0x56, 0xae, 0xf6, 0x23, 0x03, 0x9d, 0x74, 0xdd, 0x59, 0x9c, 0x1b, 0xc4, 0xbf, 0x7f, 0x46, +0xf0, 0x72, 0x05, 0x35, 0x5c, 0x91, 0xfa, 0x65, 0x6b, 0xff, 0x11, 0x41, 0x88, 0xc6, 0x40, 0x69, +0xe7, 0xda, 0xcf, 0xaf, 0x79, 0x59, 0x25, 0x35, 0xf8, 0x77, 0xb7, 0x87, 0xc6, 0x08, 0x6f, 0x11, +0x5e, 0x25, 0x3c, 0x4f, 0x68, 0x25, 0xf0, 0xf2, 0x5d, 0x84, 0x16, 0x7e, 0x7d, 0x96, 0xf0, 0x2e, +0xa1, 0x8b, 0xb0, 0xd7, 0xfe, 0xcc, 0xdf, 0x4a, 0xd8, 0x43, 0x68, 0x63, 0xc4, 0x08, 0xff, 0x10, +0x96, 0x57, 0x11, 0xcc, 0x84, 0xfc, 0xe1, 0x6c, 0xc8, 0x3f, 0xbc, 0x12, 0xf2, 0x0b, 0x11, 0x0a, +0x08, 0x91, 0x76, 0xd0, 0xb6, 0x32, 0xbc, 0x1c, 0xcc, 0x86, 0x33, 0xe1, 0x4c, 0x30, 0xdb, 0x25, +0xef, 0x51, 0x98, 0xe5, 0xdf, 0xa7, 0xf0, 0xfa, 0xdb, 0x2d, 0x95, 0xdf, 0x87, 0xc6, 0x8b, 0xc6, +0xba, 0x6b, 0x98, 0x17, 0xa6, 0x71, 0xdc, 0x35, 0x9e, 0x58, 0x72, 0x8f, 0x2f, 0x3d, 0xb0, 0xe4, +0xba, 0x0f, 0x76, 0xdc, 0x7d, 0xdd, 0xf3, 0xc4, 0x11, 0x7b, 0x9c, 0x92, 0x77, 0x4e, 0x48, 0xb9, +0xbf, 0x93, 0x5e, 0xf0, 0xb8, 0x4f, 0xa2, 0x9d, 0xff, 0xa2, 0x19, 0x68, 0xe0, 0xdf, 0xba, 0x47, +0x93, 0x88, 0x9e, 0xd6, 0xcd, 0xff, 0xc2, 0xfc, 0xe4, 0x85, 0xa2, 0x19, 0x34, 0xb2, 0x7f, 0x7b, +0x6c, 0xf0, 0x55, 0xc1, 0x0c, 0x1a, 0xdc, 0xbf, 0x67, 0x06, 0xc9, 0xd8, 0xa8, 0x4e, 0xfe, 0xed, +0x0c, 0xa2, 0x5f, 0x7a, 0x66, 0xa0, 0x89, 0x7f, 0xaf, 0x0c, 0x52, 0xc9, 0xc9, 0x31, 0x9d, 0xfc, +0xdb, 0x73, 0x5b, 0xf6, 0xdc, 0xc5, 0x6a, 0x06, 0xb1, 0x0f, 0x75, 0xf2, 0x9f, 0x3f, 0x77, 0xe2, +0xd5, 0x74, 0xf0, 0x5f, 0x28, 0x03, 0x5d, 0xfc, 0xbb, 0xe7, 0x8e, 0xb4, 0xf4, 0x6f, 0x61, 0x72, +0xd8, 0xe5, 0x7f, 0x40, 0x2b, 0xff, 0xae, 0xf3, 0xff, 0xba, 0xf9, 0x2b, 0x0d, 0xfd, 0x97, 0x94, +0x41, 0x83, 0xfb, 0x97, 0x19, 0x9c, 0xd1, 0xcd, 0xbf, 0xb8, 0x89, 0x17, 0xd7, 0xbc, 0x8f, 0xe3, +0xa2, 0x56, 0xfe, 0xf9, 0xfc, 0x2f, 0xe7, 0x90, 0xf3, 0x32, 0x38, 0xab, 0x95, 0x7f, 0xd7, 0xdc, +0xad, 0x67, 0x06, 0x8d, 0xef, 0x7f, 0x4d, 0x06, 0x3c, 0xaf, 0x40, 0xef, 0x27, 0x35, 0xf3, 0xcf, +0x73, 0x49, 0x9f, 0x7b, 0x66, 0xa0, 0x8b, 0x7f, 0xef, 0x0c, 0xa6, 0xb4, 0xf2, 0x2f, 0x9f, 0x63, +0x75, 0x65, 0xd0, 0xa1, 0x99, 0x7f, 0x3e, 0xe6, 0x87, 0x36, 0x9c, 0x57, 0xd2, 0xc1, 0xbf, 0xeb, +0x38, 0xd0, 0xd4, 0xbf, 0x67, 0x06, 0x9a, 0xf9, 0xe7, 0x73, 0xe2, 0xfb, 0xf9, 0xfd, 0x1e, 0x46, +0x70, 0x49, 0x2b, 0xff, 0xae, 0xf3, 0xbf, 0x00, 0x7c, 0xb3, 0x06, 0x2e, 0xeb, 0xea, 0xbf, 0xc4, +0x0c, 0x1a, 0xda, 0xbf, 0x93, 0xc1, 0x5c, 0x04, 0x57, 0x74, 0xf5, 0x5f, 0x24, 0x03, 0x2d, 0xfc, +0x17, 0xc8, 0x40, 0x1b, 0xff, 0xb9, 0x0c, 0x0c, 0x7c, 0xad, 0xab, 0x7f, 0x8f, 0x0c, 0xb4, 0xf3, +0xef, 0xca, 0x40, 0x4b, 0xff, 0x79, 0xe7, 0x83, 0x09, 0x5d, 0xfd, 0x7b, 0x3e, 0xf7, 0xbb, 0xe3, +0x7f, 0xc7, 0xff, 0xf6, 0xf5, 0x7f, 0xac, 0x6a, 0xff, 0x47, 0x71, 0x6c, 0x5b, 0xfa, 0x8f, 0xe3, +0xae, 0x98, 0xb1, 0xfe, 0x9d, 0xb4, 0xaa, 0x66, 0x9a, 0x68, 0xa2, 0x0c, 0x6e, 0x6c, 0x2b, 0xff, +0x35, 0xf2, 0x5e, 0x56, 0x06, 0x5b, 0xc7, 0xff, 0x3d, 0xf1, 0x18, 0xfe, 0x5a, 0x3f, 0xe0, 0xcd, +0x19, 0x9c, 0xea, 0xc3, 0xcd, 0x2d, 0xee, 0x7f, 0x53, 0xbc, 0x3b, 0xad, 0xbf, 0x1f, 0xcd, 0x1b, +0x66, 0xa0, 0xde, 0xff, 0x0f, 0x9b, 0xe9, 0x3d, 0x3f, 0x03, 0xf2, 0x7b, 0x6b, 0x8b, 0xf9, 0xaf, +0x8b, 0xf7, 0x82, 0x19, 0xa8, 0xf3, 0x5f, 0x57, 0xef, 0x6b, 0xbe, 0x0b, 0x47, 0x11, 0x57, 0xec, +0x7f, 0x46, 0x85, 0x77, 0xcf, 0x0c, 0xea, 0xef, 0x5f, 0xa9, 0xf7, 0x75, 0x19, 0xd4, 0xd3, 0x7f, +0x1c, 0xdd, 0xb5, 0xbc, 0xbe, 0xd7, 0x22, 0x03, 0xa3, 0x0f, 0xdd, 0x2a, 0x9e, 0x7f, 0xd9, 0xaa, +0x6d, 0xc7, 0xff, 0x8e, 0xff, 0x5a, 0xf9, 0x5f, 0x4c, 0x46, 0x6f, 0x6c, 0x3b, 0xff, 0x9d, 0xb8, +0x51, 0x23, 0xff, 0x3f, 0x3e, 0x79, 0x72, 0xb5, 0x65, 0xbb, 0xf9, 0xef, 0x07, 0x9a, 0xc9, 0xdf, +0x74, 0x95, 0xfe, 0xb7, 0xa5, 0xf7, 0x72, 0x32, 0x68, 0x54, 0xef, 0xae, 0x0c, 0xee, 0x94, 0xe9, +0xff, 0xa7, 0x46, 0xf0, 0x5e, 0x4a, 0x06, 0x2a, 0xbd, 0xcf, 0x1a, 0x18, 0x67, 0xd4, 0x2b, 0x83, +0xee, 0x20, 0xee, 0x16, 0xf1, 0x5f, 0x3f, 0xef, 0x11, 0x9c, 0xce, 0xcd, 0x79, 0x0d, 0xe2, 0xbc, +0xaa, 0x0c, 0xf2, 0x9e, 0xf1, 0xff, 0xed, 0xd9, 0x83, 0xa9, 0x40, 0x3d, 0xea, 0x78, 0x68, 0x60, +0x64, 0xdd, 0xef, 0xec, 0x18, 0x38, 0x57, 0x0f, 0xed, 0x7d, 0xfb, 0xd0, 0x42, 0xbe, 0x7f, 0x76, +0xf9, 0xff, 0x5d, 0xa5, 0x77, 0x45, 0x19, 0xfc, 0x22, 0xfd, 0x6f, 0x09, 0xef, 0xb9, 0xdf, 0x1c, +0xa0, 0x75, 0xea, 0x99, 0x01, 0x0e, 0x22, 0x1d, 0x40, 0x07, 0x4c, 0xc9, 0x09, 0xc9, 0x69, 0xc9, +0x9f, 0x48, 0x3e, 0x28, 0xb9, 0x43, 0xf2, 0x1e, 0xc9, 0x01, 0xc9, 0xcd, 0xb3, 0x36, 0xfb, 0x32, +0x36, 0xc3, 0xe1, 0x88, 0x64, 0xb9, 0x1e, 0x7a, 0x25, 0x1f, 0x92, 0x1c, 0x96, 0xfc, 0x86, 0x69, +0xf3, 0xeb, 0x09, 0xb9, 0x7e, 0x5a, 0xf2, 0x80, 0xe4, 0x1e, 0xc9, 0x7b, 0x25, 0xb7, 0x4a, 0x0e, +0x48, 0x6e, 0x96, 0xec, 0x5b, 0xab, 0xb7, 0xca, 0xcb, 0x92, 0x33, 0x92, 0xb3, 0x92, 0x57, 0x24, +0x0b, 0x87, 0xcf, 0x48, 0xfe, 0x5b, 0xf2, 0x7f, 0x92, 0x45, 0x49, 0xec, 0x13, 0xc2, 0xb4, 0xea, +0x11, 0x22, 0x61, 0xd5, 0x27, 0x44, 0x9a, 0xb9, 0x4d, 0x88, 0x65, 0xe6, 0xa0, 0x10, 0x19, 0xe6, +0xb0, 0x10, 0x59, 0xe6, 0x61, 0x21, 0x56, 0x98, 0x05, 0x35, 0xf6, 0xcf, 0x7c, 0x8d, 0x72, 0x61, +0xce, 0x16, 0xe7, 0x61, 0xe6, 0x15, 0x7e, 0xe0, 0x94, 0x1b, 0x7c, 0x36, 0x9b, 0xa4, 0xbe, 0x42, +0x1f, 0x25, 0x48, 0x3d, 0x1b, 0xe6, 0xdf, 0x86, 0x20, 0x55, 0x52, 0x5e, 0x66, 0xf0, 0xeb, 0xb0, +0xfd, 0x9b, 0x11, 0xd9, 0xff, 0x01, 0xd3, 0x39, 0x74, 0x2c, 0x6e, 0x57, 0x00, 0x00}; +#endif /*__FAVICON_ICO_H__*/ diff --git a/src/web/html/h/index_html.h b/src/web/html/h/index_html.h new file mode 100644 index 00000000..7ae17e4c --- /dev/null +++ b/src/web/html/h/index_html.h @@ -0,0 +1,191 @@ +#ifndef __INDEX_HTML_H__ +#define __INDEX_HTML_H__ +#define index_html_len 2967 +const uint8_t index_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xbd, 0x5a, 0xff, 0x6f, 0xdb, 0x36, +0x16, 0xff, 0xbd, 0x7f, 0x05, 0xa7, 0xc3, 0xb5, 0xf2, 0xc5, 0x96, 0x9c, 0xa4, 0x4d, 0x7b, 0x89, +0xe3, 0x21, 0x4b, 0xb2, 0x2d, 0x87, 0xae, 0x2d, 0xea, 0xf4, 0x8a, 0xa1, 0x28, 0x02, 0x5a, 0xa2, +0x6d, 0xb6, 0x32, 0x29, 0x88, 0x94, 0x5d, 0x6f, 0xeb, 0xff, 0x7e, 0xef, 0x51, 0x5f, 0x6c, 0x59, +0xa2, 0x6c, 0xaf, 0xbb, 0x19, 0x08, 0x62, 0x51, 0xe4, 0xe3, 0xe7, 0x7d, 0x7f, 0x8f, 0xf4, 0xe0, +0xbb, 0x50, 0x06, 0x7a, 0x15, 0x33, 0x32, 0xd3, 0xf3, 0x68, 0xf8, 0x68, 0x90, 0xfd, 0x23, 0xf0, +0x19, 0xcc, 0x18, 0x0d, 0xb3, 0xaf, 0xe6, 0x51, 0x73, 0x1d, 0xb1, 0xe1, 0x9d, 0x08, 0xd9, 0x97, +0x81, 0x9f, 0x3d, 0xac, 0x5f, 0x46, 0x5c, 0x7c, 0x26, 0x09, 0x8b, 0x2e, 0x1d, 0xa5, 0x57, 0x11, +0x53, 0x33, 0xc6, 0xb4, 0x43, 0x90, 0xf0, 0xa5, 0xa3, 0xd9, 0x17, 0xed, 0x07, 0x4a, 0x39, 0x64, +0x96, 0xb0, 0x49, 0x3e, 0xc3, 0x83, 0x81, 0xef, 0x17, 0x97, 0x7d, 0xef, 0x85, 0xd7, 0xef, 0xf7, +0x8f, 0x1d, 0x1f, 0xf6, 0x9e, 0x33, 0x4d, 0x89, 0xa0, 0x73, 0x58, 0xb3, 0xe0, 0x6c, 0x19, 0xcb, +0x04, 0x68, 0x04, 0x52, 0x68, 0x26, 0xf4, 0xa5, 0xb3, 0xe4, 0xa1, 0x9e, 0x5d, 0x86, 0x6c, 0xc1, +0x03, 0xd6, 0x33, 0x0f, 0x5d, 0xc2, 0x05, 0xd7, 0x9c, 0x46, 0x3d, 0x15, 0xd0, 0x88, 0x5d, 0x1e, +0x3b, 0x05, 0x91, 0x60, 0x46, 0x13, 0xc5, 0x60, 0xd1, 0xbb, 0xfb, 0x1f, 0x7b, 0x2f, 0x70, 0x58, +0x05, 0x09, 0x8f, 0xf5, 0x26, 0xa2, 0x4f, 0x74, 0x41, 0xb3, 0x51, 0x87, 0xa8, 0x24, 0xb8, 0x74, +0x68, 0xcc, 0xbd, 0x4f, 0x15, 0x50, 0xc3, 0x81, 0x9f, 0xcd, 0x00, 0x02, 0x87, 0x70, 0x18, 0xc8, +0x48, 0x26, 0x6a, 0x07, 0x8b, 0x89, 0x1c, 0x4b, 0xad, 0x36, 0x18, 0x14, 0x92, 0xa3, 0x70, 0xbb, +0x44, 0xc8, 0x89, 0x8c, 0x22, 0xb9, 0x74, 0x88, 0x9f, 0xab, 0xc2, 0x5f, 0xeb, 0x62, 0x30, 0x96, +0xe1, 0x6a, 0x43, 0xf2, 0x21, 0x5f, 0x90, 0x20, 0xa2, 0x4a, 0x01, 0x0c, 0x19, 0x0b, 0xba, 0x70, +0xf2, 0x79, 0x34, 0x07, 0xe3, 0x6f, 0x62, 0x28, 0xa7, 0xa2, 0xfe, 0x9c, 0xe1, 0xd5, 0x4c, 0xae, +0x6e, 0xee, 0xdf, 0x0d, 0x7c, 0xba, 0xb5, 0x68, 0x2d, 0x9c, 0xf3, 0x85, 0xe4, 0xa1, 0xdb, 0xef, +0x5c, 0x94, 0x6b, 0x39, 0x20, 0x76, 0x88, 0x14, 0x41, 0xc4, 0x83, 0xcf, 0xc5, 0xae, 0x6e, 0xc7, +0xd9, 0x00, 0xa5, 0x62, 0x2a, 0x50, 0x78, 0xf8, 0xef, 0xe0, 0xd1, 0x35, 0x1a, 0xe4, 0x8d, 0x87, +0x25, 0x63, 0x05, 0x80, 0xb9, 0x1c, 0x73, 0x44, 0xbf, 0xa6, 0x41, 0xcd, 0x34, 0x98, 0x73, 0x5a, +0x4e, 0x9a, 0xf1, 0x90, 0x15, 0xfa, 0xf0, 0x23, 0xbe, 0x60, 0x15, 0xc5, 0xbe, 0x84, 0x81, 0x72, +0x9f, 0x2a, 0x89, 0xa7, 0xcd, 0x24, 0x14, 0x4b, 0xc0, 0xd2, 0x2a, 0x44, 0xde, 0xb3, 0x71, 0x36, +0x6a, 0xa1, 0xf4, 0xcc, 0x46, 0x49, 0xa7, 0x71, 0x85, 0xd0, 0x88, 0x69, 0xcd, 0xc5, 0x54, 0x55, +0xe9, 0xa0, 0x44, 0x0a, 0x02, 0x8a, 0xc5, 0x2c, 0xa1, 0x5a, 0x26, 0x4e, 0x5d, 0x80, 0xe5, 0x7e, +0x67, 0xcd, 0xfb, 0xa5, 0x71, 0x48, 0x75, 0x95, 0xfd, 0x77, 0x66, 0xc8, 0x02, 0xfb, 0xb9, 0x05, +0xf6, 0x4a, 0x69, 0x36, 0xaf, 0xe2, 0x36, 0x43, 0xdf, 0x88, 0xfa, 0x45, 0xb9, 0x03, 0x38, 0x20, +0x78, 0x14, 0x4d, 0xa6, 0xe8, 0xb9, 0x0f, 0xe3, 0x88, 0x8a, 0xcf, 0xce, 0xf0, 0xed, 0xed, 0xe8, +0x9e, 0x5c, 0xbd, 0xb9, 0xb3, 0x80, 0xfd, 0x77, 0xb1, 0x7a, 0xa6, 0x75, 0xac, 0xce, 0x7d, 0x9f, +0x82, 0x49, 0x87, 0x3a, 0xf5, 0x10, 0xf9, 0x36, 0xad, 0x1b, 0x19, 0xa4, 0x73, 0xf0, 0x35, 0xaa, +0xb9, 0x14, 0x16, 0x82, 0xc7, 0xfd, 0x35, 0x9e, 0xb1, 0x4c, 0x75, 0x85, 0xe1, 0x2b, 0x1c, 0xf9, +0x46, 0x7e, 0xfb, 0x16, 0x13, 0x95, 0x53, 0x2e, 0xc0, 0x30, 0xf1, 0x9f, 0x0d, 0x9a, 0x75, 0x25, +0xa0, 0x32, 0x4b, 0x37, 0xd1, 0x0d, 0x7c, 0x70, 0x9f, 0x2d, 0x47, 0x5a, 0xf2, 0x09, 0xcf, 0xdc, +0xb7, 0xf0, 0x65, 0x31, 0x91, 0x08, 0xd6, 0x4c, 0xdd, 0x58, 0x51, 0x5d, 0x95, 0xd0, 0x18, 0x18, +0xdb, 0x70, 0xb8, 0xca, 0xeb, 0x3c, 0x80, 0x6d, 0xbd, 0x36, 0x53, 0xe2, 0xfa, 0x58, 0x4d, 0x68, +0x21, 0x53, 0x68, 0x90, 0x9a, 0xcf, 0xd9, 0x39, 0xc9, 0xc5, 0x96, 0x4d, 0x40, 0xe2, 0xa9, 0x79, +0x51, 0xca, 0x73, 0x30, 0x4e, 0xfc, 0x7d, 0x69, 0xde, 0x8e, 0xde, 0xf4, 0xee, 0x9b, 0xa9, 0xa2, +0xf5, 0xd7, 0x75, 0x54, 0x92, 0xf2, 0xe3, 0x6f, 0xe1, 0x25, 0xf3, 0x0a, 0x72, 0x07, 0xa2, 0x55, +0xe7, 0xb6, 0x3d, 0x2a, 0x12, 0xe4, 0x8b, 0x52, 0x07, 0xd6, 0x79, 0x85, 0xe6, 0x93, 0xdd, 0x53, +0x8d, 0xce, 0x68, 0x22, 0x1e, 0x2a, 0xda, 0x6d, 0xe4, 0xf2, 0x91, 0x95, 0x80, 0x90, 0x9a, 0x39, +0x96, 0x4d, 0x66, 0xa7, 0xc3, 0x51, 0x1a, 0x63, 0x7e, 0x26, 0x7a, 0xc6, 0x15, 0x89, 0x13, 0xf9, +0x89, 0x05, 0x1a, 0x98, 0x85, 0x37, 0xcd, 0x4b, 0xd2, 0xa8, 0xf9, 0x45, 0x5e, 0x3d, 0x0c, 0xcb, +0xcc, 0x53, 0xf8, 0xf1, 0x94, 0xeb, 0x59, 0x3a, 0xf6, 0x02, 0x39, 0xf7, 0xa3, 0x74, 0x4e, 0xe3, +0xd4, 0x78, 0xb6, 0x3f, 0x8e, 0xe4, 0xd8, 0x9f, 0x53, 0x2e, 0x7c, 0xc8, 0xd9, 0xfe, 0xf5, 0xcf, +0x57, 0xaf, 0x7e, 0xba, 0x1d, 0x79, 0xf3, 0xb0, 0xee, 0xec, 0xd7, 0x33, 0x2a, 0xa6, 0x0c, 0x9c, +0x03, 0x3d, 0x62, 0x00, 0x29, 0xa0, 0x1d, 0xc0, 0x0d, 0x57, 0x41, 0xaa, 0x14, 0x59, 0xc2, 0xbe, +0x24, 0x55, 0x90, 0xdf, 0x48, 0x0d, 0x53, 0x08, 0x73, 0x64, 0x12, 0x7a, 0xd3, 0xa9, 0xff, 0xfe, +0xb7, 0xd9, 0x97, 0xdb, 0x5f, 0xcf, 0x4e, 0xe6, 0x3f, 0x38, 0x66, 0x29, 0x0c, 0xef, 0xb7, 0xcf, +0x5b, 0x66, 0xe4, 0xb6, 0x2f, 0xbf, 0x5c, 0xa9, 0x14, 0x8c, 0xaa, 0xc6, 0x5d, 0x36, 0xbe, 0xdf, +0x96, 0xd7, 0xe0, 0xa0, 0x09, 0x1f, 0xa7, 0x9a, 0x11, 0x2d, 0xc9, 0xe1, 0x92, 0x7e, 0x07, 0x59, +0xee, 0xe1, 0x17, 0x2a, 0x52, 0x1a, 0x19, 0x49, 0xd7, 0xc0, 0x84, 0xdb, 0x71, 0x75, 0x37, 0xa6, +0x1a, 0x0a, 0xc1, 0xa7, 0x33, 0x1d, 0xad, 0x3c, 0xac, 0xb3, 0x2a, 0x38, 0x96, 0x32, 0xf9, 0x3c, +0x81, 0x6a, 0x48, 0xf9, 0x80, 0x30, 0x86, 0xc4, 0xff, 0x00, 0x35, 0x20, 0xe8, 0x35, 0xc6, 0x1d, +0xfd, 0x8d, 0xef, 0xfd, 0xd3, 0x22, 0xf8, 0xe3, 0x0c, 0xef, 0x37, 0x1e, 0x37, 0x65, 0x80, 0xa5, +0x88, 0x24, 0x35, 0xba, 0x22, 0x8f, 0xc9, 0x3d, 0x53, 0x9a, 0x6c, 0x90, 0x20, 0x13, 0x9e, 0xcc, +0xc1, 0x75, 0x58, 0xf7, 0x30, 0x31, 0x55, 0x51, 0xec, 0xb2, 0xcc, 0x9b, 0x8d, 0x0d, 0x0f, 0xb4, +0xd2, 0x39, 0xfd, 0xcc, 0x08, 0xad, 0x83, 0x8b, 0xe9, 0x2a, 0x46, 0xed, 0x30, 0xc0, 0x16, 0xa7, +0x2a, 0x98, 0x35, 0x6a, 0x49, 0xec, 0xa1, 0xa0, 0x81, 0x6f, 0x73, 0xd5, 0x41, 0x5c, 0x04, 0x21, +0x28, 0xfc, 0x1c, 0x3b, 0xce, 0xfb, 0x8d, 0x90, 0x40, 0x96, 0x54, 0x11, 0x05, 0x48, 0x34, 0x0b, +0xc9, 0x24, 0x91, 0xf3, 0x3a, 0xf4, 0xe5, 0x72, 0xe9, 0xcd, 0xf9, 0xe7, 0x44, 0x62, 0x1e, 0x49, +0xa0, 0xf0, 0x65, 0x89, 0x27, 0x98, 0xf6, 0xa1, 0xe8, 0xe3, 0x81, 0xff, 0xec, 0xe4, 0xd9, 0xf3, +0xe7, 0x2f, 0xea, 0x32, 0x34, 0x71, 0x27, 0xcc, 0x7c, 0x16, 0x78, 0xf2, 0x88, 0xfb, 0x4b, 0x9d, +0x46, 0xa7, 0x92, 0x48, 0x77, 0x87, 0xf8, 0x7a, 0xa0, 0xdc, 0x4e, 0x89, 0x96, 0x0c, 0x39, 0x91, +0x10, 0x2d, 0x37, 0x13, 0xe4, 0x66, 0xc8, 0x8e, 0xd8, 0x44, 0x57, 0x8b, 0xd5, 0xfd, 0x2b, 0x96, +0xbc, 0x40, 0x27, 0x8f, 0x03, 0x19, 0xaf, 0xc8, 0x49, 0xff, 0xe4, 0xb4, 0x5a, 0x1b, 0x6c, 0xeb, +0xaa, 0xd1, 0xb5, 0x9a, 0xc3, 0x56, 0xdd, 0x2c, 0xdb, 0xc2, 0xd8, 0x01, 0x31, 0xba, 0x4e, 0xf9, +0x27, 0x33, 0xaf, 0x4e, 0x78, 0x6d, 0x6b, 0xdb, 0xc5, 0x4a, 0x2e, 0xba, 0x04, 0x83, 0x82, 0xb3, +0x9b, 0xdf, 0xad, 0x0d, 0xf7, 0xf3, 0x5c, 0x78, 0x9e, 0x73, 0xad, 0xfc, 0xf1, 0xe4, 0xf9, 0xf3, +0x93, 0xe7, 0xcf, 0x00, 0xe6, 0xdd, 0x3d, 0x19, 0xfd, 0x7c, 0x75, 0x4e, 0xf2, 0x11, 0x72, 0x7e, +0x4e, 0x8a, 0xda, 0xcf, 0x2a, 0x15, 0xa3, 0x7f, 0xa6, 0xe2, 0x07, 0x6c, 0x05, 0x9d, 0x7d, 0x25, +0x17, 0x24, 0x0c, 0x7c, 0x71, 0xc1, 0x10, 0x83, 0x14, 0xca, 0x93, 0xc9, 0x14, 0x16, 0x06, 0x4c, +0x28, 0x06, 0x80, 0x56, 0x3d, 0x11, 0xf4, 0x14, 0xf5, 0x9f, 0x7a, 0x7d, 0x08, 0x2d, 0xac, 0x1e, +0x42, 0xc8, 0xf0, 0xfa, 0x9a, 0xfc, 0xf0, 0x6b, 0xef, 0xd5, 0x75, 0x6f, 0x74, 0x45, 0x60, 0xda, +0x1e, 0xb2, 0xdd, 0xb6, 0xdd, 0xd6, 0x8e, 0xb8, 0xca, 0xc2, 0x82, 0x26, 0x84, 0x7d, 0x61, 0xaf, +0x45, 0xc0, 0xc8, 0x25, 0xd1, 0x49, 0xca, 0x2e, 0x6a, 0xef, 0x35, 0x34, 0x83, 0xd7, 0x10, 0xd0, +0x2e, 0x49, 0xbf, 0xe1, 0xa5, 0x6a, 0x1e, 0x47, 0xf6, 0xb1, 0x4e, 0x82, 0xb7, 0x8e, 0x53, 0x7f, +0x0d, 0xed, 0x36, 0xa3, 0x0a, 0xf7, 0x14, 0x69, 0x14, 0x5d, 0x54, 0xab, 0x95, 0x49, 0x2a, 0x02, +0x0c, 0x67, 0x04, 0xda, 0x86, 0xeb, 0xb1, 0x2b, 0xc7, 0x9f, 0x3a, 0xe4, 0xf7, 0x9a, 0x4f, 0x1b, +0xe8, 0x40, 0xa0, 0x48, 0x51, 0x1e, 0x88, 0xf1, 0x36, 0x62, 0xf8, 0xf5, 0x87, 0xd5, 0x5d, 0xe8, +0x62, 0xd7, 0xff, 0x96, 0xa9, 0x34, 0xd2, 0x4e, 0xe7, 0xa2, 0xb6, 0x9a, 0x4f, 0x90, 0xee, 0x07, +0x47, 0xa5, 0x41, 0xc0, 0xa0, 0xbf, 0xff, 0xd8, 0xb4, 0x05, 0x7e, 0x98, 0xc7, 0x85, 0x60, 0xc9, +0xcf, 0xf7, 0xbf, 0xbc, 0x44, 0x5e, 0x0c, 0x63, 0x54, 0x84, 0x28, 0xb5, 0x00, 0xf2, 0x6e, 0xe8, +0x5c, 0x34, 0x2e, 0x03, 0x30, 0x57, 0x9f, 0xe8, 0x17, 0xd7, 0xf4, 0x3e, 0xbe, 0x69, 0xff, 0x9d, +0x2e, 0x89, 0xf1, 0xf0, 0xa2, 0x01, 0xcd, 0xd7, 0xda, 0x08, 0x8b, 0x14, 0xdb, 0x0b, 0xcf, 0x6d, +0x92, 0xc8, 0xe4, 0x1c, 0xbe, 0x1c, 0x11, 0xc3, 0x10, 0xc3, 0x67, 0xe7, 0x63, 0x75, 0x8f, 0xaf, +0x16, 0x01, 0x43, 0xc3, 0x8a, 0x75, 0xb4, 0x6b, 0x93, 0x2f, 0x56, 0xd3, 0xa8, 0x23, 0xb6, 0x24, +0x37, 0xf0, 0xd5, 0x6d, 0x80, 0x8e, 0xd3, 0x60, 0xe3, 0x7c, 0xd6, 0xeb, 0x31, 0xe6, 0x86, 0xa6, +0x79, 0x30, 0xc7, 0x0b, 0xe6, 0x21, 0x62, 0x86, 0x5d, 0x1f, 0x4c, 0xed, 0xdf, 0x3c, 0x6b, 0x41, +0x23, 0x98, 0x65, 0x44, 0x75, 0x27, 0xb4, 0x8b, 0x18, 0x50, 0xb7, 0x39, 0x50, 0x9f, 0x1c, 0x83, +0xd7, 0x36, 0x6c, 0x50, 0x95, 0xb8, 0x69, 0xc5, 0x41, 0xe2, 0xc6, 0x84, 0xba, 0xc4, 0x79, 0xf3, +0x7a, 0x74, 0x0f, 0x8f, 0xff, 0x19, 0xbd, 0x7e, 0xe5, 0x29, 0xa8, 0x99, 0xc4, 0x94, 0x4f, 0x56, +0xc6, 0xb4, 0x3a, 0xfb, 0x89, 0xca, 0xe0, 0xf9, 0x89, 0x81, 0xe8, 0x79, 0x60, 0x33, 0x49, 0x30, +0xaa, 0xdc, 0x99, 0x3a, 0x8d, 0xba, 0x33, 0x34, 0xa0, 0x79, 0x31, 0xeb, 0xeb, 0x1c, 0x98, 0xd7, +0x6f, 0x21, 0xeb, 0x35, 0xbc, 0x6f, 0x85, 0x05, 0x7d, 0x89, 0x0d, 0x92, 0xf1, 0x4f, 0x63, 0x18, +0x5a, 0x3d, 0x08, 0xb9, 0xdc, 0xb6, 0x0c, 0x9b, 0xa6, 0x2b, 0x4b, 0xc8, 0xbf, 0x6c, 0x42, 0xc7, +0xa5, 0x69, 0x5c, 0x6c, 0x31, 0xcd, 0xc4, 0xe3, 0x7c, 0x34, 0x4b, 0xf3, 0x06, 0xcf, 0xba, 0xe1, +0x4a, 0x6d, 0xaa, 0x19, 0xa8, 0xf8, 0xe4, 0xc5, 0xd9, 0x53, 0xd8, 0x86, 0xfc, 0x93, 0x9c, 0x9e, +0x3d, 0x6b, 0x5e, 0x36, 0x4b, 0x14, 0xa9, 0x2d, 0x3b, 0x3d, 0xcb, 0x56, 0x9d, 0x3c, 0x6d, 0x5e, +0x34, 0xe7, 0xa2, 0xbe, 0xe8, 0xcc, 0x2c, 0x39, 0xeb, 0x37, 0x2f, 0x51, 0x2c, 0xc0, 0x25, 0x30, +0xd3, 0x3e, 0xa7, 0x35, 0xfa, 0xe4, 0xdc, 0x37, 0xc8, 0xac, 0xea, 0xc1, 0x46, 0x0e, 0x47, 0xe0, +0xbf, 0x37, 0x74, 0xe5, 0x34, 0xc6, 0xa9, 0x63, 0xf2, 0x5d, 0x36, 0xad, 0xb3, 0x33, 0x20, 0x1c, +0xa1, 0x77, 0x39, 0xed, 0x5b, 0xe2, 0x9c, 0xae, 0x89, 0x17, 0xae, 0xd3, 0x77, 0x8e, 0x40, 0xa0, +0x1d, 0x4f, 0xa5, 0x63, 0x70, 0x0a, 0xb7, 0x77, 0xd2, 0x41, 0x28, 0xe7, 0x4e, 0xd3, 0x46, 0xf9, +0x7c, 0x90, 0xe5, 0x41, 0xf3, 0x41, 0x90, 0x9b, 0xf3, 0x2d, 0xc6, 0x30, 0xc2, 0x56, 0xbb, 0x45, +0x9a, 0xa6, 0xad, 0x6f, 0x0e, 0xe3, 0x7d, 0x14, 0x4f, 0xc5, 0x5c, 0x6d, 0xa1, 0xbc, 0x88, 0xf9, +0xa5, 0x59, 0x0f, 0xc8, 0xf1, 0xd9, 0x8b, 0x7e, 0xf6, 0xe9, 0x58, 0xab, 0xde, 0x32, 0x48, 0x36, +0x47, 0x7a, 0x6b, 0xa4, 0xc6, 0x8f, 0x61, 0xac, 0xa2, 0x6f, 0x2d, 0xef, 0x94, 0x44, 0x17, 0x1b, +0x81, 0x40, 0x90, 0xad, 0xbd, 0xd3, 0x81, 0x85, 0xab, 0xfa, 0x16, 0x8e, 0x25, 0x27, 0x15, 0x36, +0xcb, 0x45, 0xec, 0x62, 0x10, 0x46, 0x33, 0x50, 0x2b, 0x11, 0x64, 0xe5, 0xfb, 0x38, 0x81, 0x4e, +0x0c, 0x4a, 0xdd, 0x2e, 0xe9, 0x77, 0xc9, 0x07, 0x67, 0xac, 0x85, 0xf3, 0xb1, 0x4b, 0x8a, 0x79, +0xd0, 0x63, 0x6a, 0x29, 0x1c, 0x8b, 0x0c, 0x32, 0x0c, 0x78, 0x96, 0x24, 0xc2, 0xeb, 0x19, 0x8f, +0x42, 0x17, 0xcf, 0x46, 0x5c, 0xe7, 0xd5, 0xfd, 0x1b, 0x82, 0x6e, 0x00, 0x74, 0x17, 0x0c, 0x22, +0x85, 0x80, 0xe2, 0x28, 0x98, 0xd1, 0x71, 0xc4, 0x3c, 0xe2, 0x74, 0xf6, 0x26, 0xc6, 0x0e, 0xdc, +0xd6, 0x41, 0x06, 0xf0, 0xab, 0xe1, 0x60, 0xa3, 0x0e, 0xb0, 0xa9, 0xd0, 0xa3, 0x61, 0x78, 0xbb, +0x00, 0x6b, 0x7b, 0xc9, 0x95, 0xc6, 0x20, 0xe6, 0x3a, 0xe6, 0x0c, 0x1c, 0x08, 0xe5, 0xda, 0x6f, +0xd4, 0x92, 0xb5, 0xaa, 0x80, 0xba, 0xfc, 0x15, 0x16, 0xb8, 0xd7, 0x50, 0x2c, 0xb4, 0xda, 0xa3, +0x5b, 0x5a, 0xa4, 0x02, 0xe1, 0x70, 0x05, 0xe1, 0x92, 0xf4, 0x4a, 0x6b, 0x96, 0x93, 0x09, 0x8a, +0x1f, 0x08, 0x0c, 0xb6, 0x2c, 0xdc, 0x6a, 0x70, 0x8f, 0x1f, 0x93, 0x0a, 0x4d, 0xb3, 0xbe, 0xa8, +0x0d, 0x2a, 0x24, 0x87, 0x5b, 0x24, 0x6d, 0x28, 0xf1, 0xb3, 0x59, 0xcd, 0xbd, 0x81, 0x26, 0x0c, +0xd2, 0x27, 0x58, 0x11, 0xa8, 0x14, 0x7a, 0x23, 0x57, 0x75, 0xba, 0x64, 0xc9, 0xa3, 0x08, 0xe2, +0x6b, 0x0a, 0x56, 0x4a, 0x35, 0xc9, 0xf6, 0xcd, 0x62, 0x4c, 0x99, 0x51, 0xf6, 0x43, 0x95, 0x67, +0x1a, 0x4f, 0xcb, 0x97, 0x12, 0xaf, 0x7e, 0x46, 0x26, 0x57, 0xbb, 0x4f, 0x42, 0xd6, 0xbb, 0xb9, +0x7d, 0x62, 0x53, 0xe0, 0x57, 0xab, 0x67, 0xee, 0xc9, 0x94, 0xd1, 0x96, 0x31, 0xd5, 0x6e, 0xc9, +0x18, 0x89, 0x73, 0x4e, 0x41, 0x9b, 0x68, 0xb2, 0x21, 0xd8, 0xd2, 0x85, 0x95, 0x5a, 0x2d, 0xb8, +0x0c, 0xc9, 0x7e, 0xba, 0x6d, 0x93, 0x7b, 0x05, 0x26, 0x06, 0x6e, 0x23, 0xe2, 0x10, 0x65, 0xfc, +0xf7, 0x09, 0xd7, 0x2e, 0xe0, 0x3d, 0x84, 0x5c, 0xe3, 0xc0, 0x58, 0x8a, 0x39, 0x37, 0x28, 0xe5, +0xdb, 0xca, 0x4d, 0x8b, 0x53, 0xfc, 0xd5, 0xec, 0x7c, 0xdd, 0x11, 0x88, 0x5b, 0x6b, 0xb0, 0xbb, +0x05, 0xa2, 0xee, 0x42, 0xc1, 0x65, 0x2b, 0xa6, 0xb1, 0x4c, 0x82, 0x46, 0xcd, 0xfd, 0xe0, 0x08, +0x29, 0x80, 0xa7, 0x06, 0x7c, 0x13, 0x99, 0xb8, 0x38, 0x95, 0x13, 0x39, 0x21, 0x96, 0x8a, 0xae, +0x20, 0x87, 0xa7, 0xfd, 0x18, 0xcc, 0xe1, 0xdf, 0x28, 0x6b, 0x62, 0xec, 0x51, 0x3f, 0xc0, 0x8a, +0xda, 0x5c, 0xef, 0xf5, 0x8a, 0x86, 0xc7, 0x3e, 0x19, 0x7a, 0x45, 0x1e, 0xb5, 0xa4, 0x11, 0xb0, +0xf4, 0x09, 0x45, 0xad, 0x5f, 0xc2, 0xee, 0xd0, 0x70, 0x08, 0xe3, 0x1c, 0xf6, 0x30, 0x67, 0xd6, +0xac, 0xc1, 0xbe, 0xa7, 0x89, 0xb0, 0x6b, 0x66, 0x03, 0x29, 0x1e, 0x74, 0xb7, 0x38, 0x5c, 0x09, +0xb3, 0x70, 0x4f, 0xcb, 0xdc, 0xaf, 0x99, 0x89, 0x62, 0xb0, 0xdd, 0x84, 0xcd, 0xd5, 0x83, 0xa1, +0x80, 0xb8, 0xff, 0xf8, 0x83, 0x40, 0x19, 0x01, 0xe3, 0xa0, 0xbc, 0x3d, 0xb9, 0x40, 0x7b, 0xde, +0x8b, 0x0b, 0x73, 0x52, 0xbf, 0x07, 0x17, 0x42, 0x6a, 0xb2, 0x82, 0xa0, 0x69, 0x06, 0x90, 0x9f, +0x9d, 0xec, 0xf4, 0x73, 0x4e, 0xc0, 0x27, 0x22, 0xaa, 0xf4, 0xc3, 0xce, 0x56, 0xb6, 0xb2, 0x5f, +0xb9, 0x0f, 0x81, 0xd4, 0x4e, 0x84, 0xc4, 0x0e, 0x80, 0x9a, 0x43, 0xbd, 0x84, 0x05, 0x8c, 0x2f, +0x20, 0xca, 0xa4, 0x42, 0xc3, 0x5c, 0x8c, 0x66, 0xad, 0x50, 0x0e, 0xda, 0x0c, 0x5b, 0x67, 0xae, +0x76, 0x04, 0xd2, 0x2d, 0x3d, 0xc5, 0x89, 0x0c, 0xd3, 0x00, 0x5c, 0xbb, 0x2d, 0xf1, 0xad, 0xf7, +0x3b, 0xca, 0xa5, 0xb9, 0x5e, 0x76, 0xf1, 0x2d, 0xd1, 0xab, 0xee, 0x67, 0x3f, 0x9a, 0x23, 0x8b, +0xfd, 0x80, 0x94, 0x20, 0x4c, 0x88, 0xe3, 0x5e, 0x90, 0x26, 0x0f, 0xf1, 0x32, 0xc1, 0xb2, 0xf9, +0xbd, 0x73, 0x78, 0x80, 0x6a, 0x6e, 0x2b, 0xf3, 0x12, 0xc8, 0xb5, 0x97, 0xb0, 0x8b, 0xa9, 0x8b, +0x0c, 0x74, 0xc9, 0x69, 0x3f, 0xfb, 0x33, 0xc6, 0x69, 0x30, 0x05, 0x51, 0xa7, 0x6b, 0x5f, 0x68, +0xea, 0xa9, 0xbb, 0x22, 0x23, 0xfe, 0xc3, 0x30, 0x01, 0x4a, 0x09, 0x4d, 0x86, 0x71, 0xb2, 0x73, +0x07, 0x18, 0xc0, 0x1f, 0x3e, 0x64, 0x43, 0x46, 0xbb, 0xf0, 0xc5, 0x88, 0xa0, 0x85, 0xf2, 0x38, +0x71, 0x9b, 0x95, 0xd9, 0xb9, 0x78, 0xf4, 0x68, 0x3f, 0xbb, 0x28, 0xfd, 0xf7, 0xf7, 0x36, 0x63, +0x6a, 0xf2, 0x10, 0x48, 0xce, 0xfd, 0x5d, 0x79, 0xb7, 0xa9, 0x2b, 0x6e, 0xa4, 0x65, 0x6d, 0x8e, +0x1b, 0x75, 0x94, 0x49, 0xb4, 0x37, 0x24, 0x48, 0x85, 0xe4, 0x54, 0x26, 0x69, 0x44, 0x74, 0x42, +0x85, 0x9a, 0x73, 0x73, 0xe8, 0x9d, 0xc9, 0xb5, 0xde, 0x2a, 0x40, 0xa5, 0x85, 0x72, 0xfb, 0xcb, +0x33, 0x9b, 0x29, 0xa6, 0x6d, 0xbd, 0x17, 0x5f, 0x38, 0x1d, 0x2f, 0x61, 0x71, 0x44, 0x03, 0x66, +0xaa, 0xec, 0x84, 0x09, 0x37, 0x3e, 0xe4, 0x7c, 0x02, 0x43, 0xbe, 0x8b, 0xe1, 0xfc, 0x2f, 0x48, +0x8d, 0x4b, 0x4c, 0x8d, 0x36, 0x5a, 0x55, 0x49, 0xe7, 0x46, 0x8f, 0xbb, 0x6f, 0x1b, 0xfe, 0x3a, +0xc1, 0x80, 0x48, 0x8d, 0x4a, 0x96, 0x76, 0xd9, 0x36, 0x17, 0xfa, 0x45, 0x55, 0xe3, 0x45, 0x4c, +0x4c, 0xf5, 0xcc, 0x98, 0xd4, 0x7e, 0x80, 0x70, 0x55, 0x23, 0x20, 0x93, 0x2b, 0x0a, 0x40, 0x05, +0xfd, 0x35, 0xae, 0x26, 0x14, 0x78, 0x7c, 0x8a, 0x0d, 0x70, 0x7e, 0xa0, 0xda, 0xd2, 0x6a, 0x80, +0x5a, 0xff, 0xcb, 0x12, 0x3c, 0xfe, 0x70, 0xca, 0x9f, 0x3d, 0x60, 0x63, 0xb1, 0x1e, 0x2f, 0x68, +0xd8, 0x83, 0xec, 0x9f, 0x64, 0xc5, 0xc9, 0x7e, 0x95, 0xb2, 0xce, 0x6d, 0x5d, 0x02, 0x71, 0x30, +0xc1, 0x5b, 0xb2, 0x7c, 0xcf, 0x90, 0x40, 0x84, 0x59, 0x5b, 0x7e, 0x81, 0xa4, 0xd5, 0xdc, 0x8b, +0x3c, 0xd8, 0xcc, 0xd8, 0xf0, 0x6f, 0x61, 0xec, 0x57, 0x99, 0x12, 0x9a, 0x30, 0x92, 0x2a, 0xd3, +0x28, 0x6c, 0x5c, 0xff, 0xe5, 0xfc, 0x94, 0xd7, 0x0c, 0x1e, 0xb9, 0x13, 0x24, 0xc0, 0x33, 0x6f, +0xb0, 0xdf, 0xec, 0x8e, 0x97, 0xac, 0x60, 0xf5, 0x9c, 0xae, 0xc0, 0x9c, 0x61, 0x81, 0x96, 0x10, +0x02, 0x56, 0x44, 0xcf, 0x58, 0x29, 0x1c, 0x28, 0x93, 0x31, 0x67, 0xe6, 0xf0, 0x0f, 0x10, 0x8d, +0x4d, 0x5a, 0xff, 0x67, 0xfe, 0xbf, 0x19, 0x7b, 0x83, 0xa7, 0x59, 0xc3, 0xd2, 0xfa, 0x77, 0x10, +0x7f, 0x3e, 0x3a, 0xe1, 0xd5, 0x86, 0x6b, 0x39, 0xc9, 0x35, 0xe7, 0x4a, 0xda, 0x72, 0xe8, 0xb6, +0xe3, 0xa0, 0xca, 0x7e, 0xe2, 0xb3, 0xd1, 0xe4, 0x1c, 0x1d, 0x61, 0xaf, 0x90, 0x67, 0x8f, 0x4e, +0xf3, 0xe1, 0x16, 0xcc, 0xc9, 0x6f, 0x5f, 0x86, 0x97, 0x30, 0xd1, 0xe6, 0xde, 0xd6, 0x2b, 0x9a, +0xed, 0xc3, 0xf1, 0x27, 0xeb, 0xeb, 0x88, 0x27, 0xfb, 0x5e, 0x47, 0xb4, 0x86, 0xf6, 0x96, 0xa3, +0xf0, 0x22, 0x34, 0xb5, 0xf4, 0x31, 0xbb, 0x0e, 0xcc, 0xcb, 0x53, 0xf1, 0x57, 0x74, 0xe1, 0x56, +0x8f, 0x98, 0x2d, 0x96, 0xbf, 0x7d, 0x4c, 0xbf, 0xe7, 0x8a, 0xe2, 0x04, 0xbd, 0x65, 0xca, 0x5d, +0x8e, 0xa0, 0x38, 0x1e, 0xc0, 0xb3, 0x25, 0xbc, 0xae, 0xc8, 0x1a, 0xfe, 0xb6, 0x95, 0x26, 0xfd, +0x99, 0xb5, 0x68, 0xb3, 0xf8, 0x73, 0x40, 0x2b, 0x98, 0x0d, 0x81, 0xb4, 0x94, 0x27, 0x4b, 0x50, +0xa0, 0x5c, 0x7a, 0xd0, 0x06, 0x43, 0x74, 0x63, 0xc9, 0x82, 0x46, 0xae, 0x93, 0x99, 0xb2, 0xd3, +0xdd, 0x55, 0x8c, 0xac, 0x6f, 0xfb, 0x4c, 0x35, 0x65, 0x9f, 0x58, 0xde, 0xa7, 0x94, 0xb7, 0xd9, +0x31, 0xf7, 0x36, 0x2e, 0x5c, 0xc1, 0xe7, 0xa4, 0xaa, 0x5c, 0xbb, 0xe6, 0xee, 0x0d, 0x83, 0x60, +0xdf, 0x4a, 0x17, 0xf7, 0x5d, 0x6f, 0x73, 0xaf, 0xbf, 0xf8, 0xb3, 0x4d, 0x77, 0xb3, 0xf9, 0xad, +0xc3, 0x3b, 0xe8, 0xc3, 0x56, 0x58, 0x50, 0xe0, 0x13, 0x5e, 0x7b, 0x2a, 0x8e, 0xb8, 0x76, 0x9f, +0x78, 0x4f, 0x1a, 0x50, 0x24, 0x4c, 0xa7, 0x89, 0x20, 0x2e, 0xfd, 0xd0, 0xff, 0x48, 0x06, 0x03, +0x72, 0xf2, 0x14, 0x3a, 0x42, 0x7c, 0x3c, 0x36, 0x8f, 0xc7, 0x67, 0xf8, 0x48, 0x3f, 0x9c, 0x7c, +0x3c, 0xa0, 0xe2, 0xc9, 0x79, 0xb6, 0x79, 0xc7, 0xfa, 0xfa, 0xd3, 0x98, 0x45, 0x56, 0x3d, 0xe7, +0xa7, 0xe4, 0x78, 0x84, 0x71, 0xb6, 0xf3, 0x7e, 0xab, 0xed, 0x46, 0x71, 0x0b, 0xd9, 0x7e, 0x0b, +0xd7, 0x3f, 0x88, 0xce, 0x9e, 0xb2, 0x1f, 0x23, 0x0f, 0xfc, 0xec, 0x67, 0xe3, 0xff, 0x03, 0x2a, +0x4c, 0xb5, 0xf1, 0x4e, 0x2e, 0x00, 0x00}; +#endif /*__INDEX_HTML_H__*/ diff --git a/src/web/html/h/login_html.h b/src/web/html/h/login_html.h new file mode 100644 index 00000000..37b1bccb --- /dev/null +++ b/src/web/html/h/login_html.h @@ -0,0 +1,47 @@ +#ifndef __LOGIN_HTML_H__ +#define __LOGIN_HTML_H__ +#define login_html_len 665 +const uint8_t login_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x95, 0x55, 0xcb, 0x6e, 0xdb, 0x30, +0x10, 0xbc, 0xf7, 0x2b, 0x58, 0x1e, 0x7a, 0x8a, 0x44, 0x47, 0x49, 0x9b, 0xc0, 0x90, 0x54, 0xe4, +0xd1, 0x17, 0x50, 0xf4, 0x92, 0x04, 0x45, 0x4e, 0x01, 0x45, 0xd1, 0x12, 0x13, 0x8a, 0x24, 0x48, +0xca, 0x8e, 0xfb, 0xf5, 0x5d, 0xbd, 0x6a, 0x59, 0x8e, 0xeb, 0xc4, 0x17, 0x89, 0xe4, 0xec, 0xec, +0xee, 0xcc, 0x52, 0x8e, 0xdf, 0xe7, 0x9a, 0xf9, 0xb5, 0xe1, 0xa8, 0xf4, 0x95, 0x4c, 0xdf, 0xc5, +0xdd, 0x03, 0xc1, 0x2f, 0x2e, 0x39, 0xcd, 0xbb, 0xd7, 0x76, 0xe9, 0x85, 0x97, 0x3c, 0xfd, 0xa9, +0x0b, 0xa1, 0x62, 0xd2, 0x2d, 0x36, 0x87, 0x52, 0xa8, 0x27, 0x64, 0xb9, 0x4c, 0xb0, 0xf3, 0x6b, +0xc9, 0x5d, 0xc9, 0xb9, 0xc7, 0xa8, 0x21, 0x4e, 0xb0, 0xe7, 0xcf, 0x9e, 0x30, 0xe7, 0x30, 0x2a, +0x2d, 0x5f, 0xf4, 0x88, 0x10, 0x36, 0x3e, 0x2f, 0x93, 0x59, 0x78, 0x1e, 0xce, 0x66, 0xb3, 0x63, +0x4c, 0x20, 0x77, 0xc5, 0x3d, 0x45, 0x8a, 0x56, 0x10, 0xb3, 0x14, 0x7c, 0x65, 0xb4, 0x05, 0x0e, +0xa6, 0x95, 0xe7, 0xca, 0x27, 0x78, 0x25, 0x72, 0x5f, 0x26, 0x39, 0x5f, 0x0a, 0xc6, 0x83, 0x76, +0x71, 0x84, 0x84, 0x12, 0x5e, 0x50, 0x19, 0x38, 0x46, 0x25, 0x4f, 0x8e, 0xf1, 0x40, 0xc2, 0x4a, +0x6a, 0x1d, 0x87, 0xa0, 0xbb, 0xdb, 0xaf, 0xc1, 0x79, 0xb3, 0xed, 0x98, 0x15, 0xc6, 0x8f, 0x2b, +0x7a, 0xa4, 0x4b, 0xda, 0xed, 0x62, 0xe4, 0x2c, 0x4b, 0x30, 0x35, 0x22, 0x7c, 0xdc, 0x2a, 0x2a, +0x8d, 0x49, 0x87, 0x00, 0x82, 0xb7, 0x74, 0xc8, 0xb4, 0xd4, 0xd6, 0x1d, 0x68, 0xd1, 0xea, 0x4c, +0x7b, 0x37, 0x6a, 0x50, 0x69, 0xa1, 0x72, 0xfe, 0x7c, 0x84, 0x94, 0x5e, 0x68, 0x29, 0xf5, 0x0a, +0x23, 0xd2, 0x5b, 0x41, 0x36, 0x5e, 0xc4, 0x99, 0xce, 0xd7, 0x23, 0xe5, 0x73, 0xb1, 0x44, 0x22, +0x07, 0x79, 0x2c, 0x35, 0x86, 0x5b, 0xbc, 0x39, 0xda, 0x3a, 0x96, 0x8d, 0x6f, 0x93, 0xc3, 0x7f, +0x00, 0x26, 0xa9, 0x73, 0x09, 0x36, 0xc1, 0xe9, 0x0b, 0x88, 0x16, 0xb5, 0xd0, 0xb6, 0x42, 0x94, +0x79, 0xa1, 0x55, 0x82, 0x49, 0x47, 0x86, 0xa0, 0x99, 0x52, 0x03, 0xb7, 0xd1, 0xce, 0xef, 0x09, +0x9c, 0xa6, 0xb0, 0xd0, 0x55, 0x1a, 0x97, 0x51, 0x7a, 0x51, 0xea, 0xf5, 0xf5, 0xed, 0x1d, 0x74, +0x16, 0x81, 0xca, 0x80, 0x78, 0x43, 0xfc, 0x5e, 0xe4, 0x14, 0x0d, 0x3e, 0x04, 0xc7, 0x11, 0x6a, +0x1e, 0xae, 0x0a, 0xce, 0x51, 0x95, 0x05, 0x27, 0x90, 0x5e, 0x28, 0x53, 0x0f, 0xa3, 0x60, 0x00, +0xb8, 0xd2, 0x36, 0xc7, 0xbd, 0x2b, 0x66, 0x05, 0xaf, 0xb4, 0xf6, 0x60, 0x01, 0xab, 0xdd, 0xa1, +0xd2, 0xfe, 0x9f, 0xf0, 0x74, 0x92, 0xcb, 0xd5, 0x59, 0x25, 0xfc, 0x90, 0xa9, 0x17, 0x71, 0x49, +0x65, 0xbd, 0x59, 0xf5, 0x3c, 0x99, 0x57, 0xf8, 0xa0, 0x2c, 0xfb, 0x8f, 0x63, 0xd2, 0xf8, 0xf5, +0x82, 0xd9, 0xbb, 0x21, 0x93, 0xad, 0xe9, 0x72, 0x18, 0x9f, 0x85, 0xd6, 0x7e, 0x6b, 0xb8, 0xc6, +0x5d, 0x4b, 0xbe, 0x18, 0xfb, 0x1f, 0xd3, 0xfe, 0x1a, 0x94, 0xde, 0x1b, 0x37, 0x27, 0x84, 0x82, +0xd7, 0xb9, 0xaf, 0xc3, 0x9c, 0xc3, 0x85, 0xa1, 0xb6, 0x68, 0x2e, 0xe6, 0x43, 0x26, 0xa9, 0x7a, +0xc2, 0xc3, 0x1c, 0xa0, 0x0f, 0x4c, 0x9b, 0x35, 0x8a, 0x66, 0xd1, 0x49, 0x4c, 0xe8, 0x88, 0xab, +0x96, 0x93, 0x7a, 0xa5, 0x48, 0x77, 0x12, 0xe4, 0xc2, 0x31, 0xf0, 0x30, 0x2c, 0x0a, 0xf2, 0xfb, +0x4f, 0xf9, 0xfc, 0xe5, 0xfe, 0x53, 0x54, 0x5d, 0xee, 0xe6, 0xba, 0xee, 0x60, 0x4d, 0x82, 0x98, +0x00, 0xcf, 0x61, 0xe2, 0x42, 0xf8, 0xb2, 0xce, 0x42, 0xa6, 0x2b, 0x22, 0xeb, 0x8a, 0x9a, 0xba, +0xed, 0x65, 0x97, 0xf9, 0x5b, 0x8b, 0xdb, 0x25, 0x8e, 0xc9, 0x50, 0xff, 0x48, 0xd8, 0xad, 0x79, +0x16, 0x45, 0xb9, 0xa5, 0xdd, 0x9e, 0x7e, 0x27, 0x09, 0x5f, 0x55, 0x26, 0x81, 0x35, 0xcc, 0x9b, +0x23, 0xd9, 0xe2, 0xec, 0x2c, 0x3a, 0xfb, 0x08, 0x65, 0xfe, 0xb8, 0x45, 0x37, 0xdf, 0x2f, 0xe6, +0xa8, 0xdf, 0x41, 0xf3, 0x39, 0x1a, 0x3e, 0x4f, 0x7b, 0x55, 0x69, 0xfd, 0xe7, 0xce, 0x3c, 0x34, +0x43, 0x8c, 0x5f, 0xab, 0x1c, 0xb3, 0x9c, 0x7a, 0xb1, 0xe4, 0x4d, 0x0d, 0x5a, 0xb9, 0x50, 0xdb, +0x02, 0x02, 0x19, 0x57, 0x8e, 0x43, 0x41, 0xeb, 0x40, 0xb1, 0xc0, 0x51, 0x72, 0x1a, 0xce, 0x48, +0xce, 0x79, 0xbe, 0xa3, 0x28, 0x4a, 0xaf, 0xae, 0xd0, 0xe5, 0x7d, 0xf0, 0xeb, 0x2a, 0xb8, 0xb9, +0x40, 0x00, 0x7b, 0x85, 0xb6, 0x63, 0x89, 0x49, 0xf7, 0x95, 0x84, 0xcf, 0x4b, 0xfb, 0x7f, 0xf6, +0x17, 0x29, 0x0f, 0xde, 0x34, 0xe7, 0x06, 0x00, 0x00}; +#endif /*__LOGIN_HTML_H__*/ diff --git a/src/web/html/h/save_html.h b/src/web/html/h/save_html.h new file mode 100644 index 00000000..e2853924 --- /dev/null +++ b/src/web/html/h/save_html.h @@ -0,0 +1,86 @@ +#ifndef __SAVE_HTML_H__ +#define __SAVE_HTML_H__ +#define save_html_len 1286 +const uint8_t save_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xad, 0x57, 0x5b, 0x4f, 0x1b, 0x39, +0x14, 0x7e, 0xef, 0xaf, 0x70, 0xfd, 0xb0, 0x04, 0x2d, 0x99, 0x19, 0x92, 0x52, 0x58, 0x72, 0x59, +0x05, 0x4a, 0x0b, 0x12, 0x8b, 0x2a, 0x02, 0xaa, 0xaa, 0xaa, 0xaa, 0x1c, 0xdb, 0xc9, 0x18, 0x1c, +0x7b, 0x3a, 0xf6, 0x04, 0xb2, 0x2b, 0xfe, 0xfb, 0x1e, 0xcf, 0x25, 0x99, 0x49, 0x32, 0x01, 0xb6, +0x3b, 0x2f, 0x89, 0xed, 0x73, 0xf9, 0xbe, 0xe3, 0x73, 0x8e, 0xed, 0xee, 0x5b, 0xa6, 0xa9, 0x9d, +0x47, 0x1c, 0x85, 0x76, 0x2a, 0xfb, 0x6f, 0xba, 0xd9, 0x0f, 0x82, 0xaf, 0x1b, 0x72, 0xc2, 0xb2, +0xbf, 0xe9, 0xd0, 0x0a, 0x2b, 0x79, 0x7f, 0x48, 0x66, 0xbc, 0xeb, 0x67, 0xff, 0x97, 0x6b, 0x52, +0xa8, 0x7b, 0x14, 0x73, 0xd9, 0xc3, 0xc6, 0xce, 0x25, 0x37, 0x21, 0xe7, 0x16, 0x23, 0x67, 0xb7, +0x87, 0x2d, 0x7f, 0xb4, 0x3e, 0x35, 0x06, 0xa3, 0x30, 0xe6, 0xe3, 0x5c, 0xc2, 0x83, 0x89, 0x3f, +0x67, 0xbd, 0xc0, 0x3b, 0xf2, 0x82, 0x20, 0xd8, 0xc7, 0x3e, 0xb8, 0x9e, 0x72, 0x4b, 0x90, 0x22, +0x53, 0xd0, 0x99, 0x09, 0xfe, 0x10, 0xe9, 0x18, 0x6c, 0x50, 0xad, 0x2c, 0x57, 0xb6, 0x87, 0x1f, +0x04, 0xb3, 0x61, 0x8f, 0xf1, 0x99, 0xa0, 0xbc, 0x99, 0x0e, 0xf6, 0x90, 0x50, 0xc2, 0x0a, 0x22, +0x9b, 0x86, 0x12, 0xc9, 0x7b, 0xfb, 0xb8, 0x30, 0x42, 0x43, 0x12, 0x1b, 0x0e, 0x4a, 0xb7, 0x37, +0x1f, 0x9b, 0x47, 0x6e, 0xda, 0xd0, 0x58, 0x44, 0xb6, 0x8c, 0xe8, 0x8e, 0xcc, 0x48, 0x36, 0x8b, +0x91, 0x89, 0x69, 0x0f, 0x93, 0x48, 0x78, 0x77, 0x15, 0x50, 0xfd, 0xae, 0x9f, 0x49, 0x80, 0x81, +0xd7, 0x30, 0xa4, 0x5a, 0xea, 0xd8, 0x3c, 0x43, 0x31, 0xd6, 0x23, 0x6d, 0x4d, 0x89, 0xa0, 0xd2, +0x42, 0x31, 0xfe, 0xb8, 0x87, 0x94, 0x1e, 0x6b, 0x29, 0xf5, 0x03, 0x46, 0x7e, 0xbe, 0x13, 0xfe, +0x72, 0x2b, 0xba, 0x23, 0xcd, 0xe6, 0xa5, 0xc8, 0x33, 0x31, 0x43, 0x54, 0x12, 0x63, 0x00, 0x86, +0x8e, 0x14, 0x99, 0xe1, 0x5c, 0x8e, 0xe4, 0x60, 0xfc, 0x32, 0x86, 0x85, 0xa8, 0xdb, 0x3f, 0xdc, +0x1f, 0x84, 0x7a, 0xfe, 0xe1, 0xe6, 0xb6, 0xeb, 0x93, 0x15, 0xa5, 0x65, 0x70, 0x8e, 0x67, 0x5a, +0xb0, 0x46, 0xb0, 0xdb, 0x59, 0xe8, 0x0a, 0x40, 0x8c, 0x91, 0x56, 0x54, 0x0a, 0x7a, 0x5f, 0x78, +0x6d, 0xec, 0xe2, 0x12, 0x28, 0x13, 0x11, 0xe5, 0x82, 0xe7, 0x7e, 0x5e, 0x3d, 0xbb, 0x44, 0xe3, +0xb8, 0x09, 0xb6, 0x20, 0x56, 0x00, 0x98, 0xea, 0x91, 0x70, 0xe8, 0x97, 0x36, 0x48, 0x2a, 0x06, +0x32, 0xed, 0x85, 0x50, 0x28, 0x18, 0x2f, 0xf6, 0xc3, 0x97, 0x62, 0xc6, 0x2b, 0x1b, 0x7b, 0x29, +0x5c, 0x16, 0x93, 0x4d, 0x26, 0xde, 0x6d, 0x36, 0x61, 0x78, 0x0c, 0x99, 0x56, 0x31, 0xf2, 0x85, +0x8f, 0xb2, 0xd9, 0x1a, 0x4b, 0x07, 0x75, 0x96, 0x6c, 0x12, 0x55, 0x0c, 0x0d, 0xb9, 0xb5, 0x42, +0x4d, 0x4c, 0xd5, 0x8e, 0x8b, 0x48, 0x61, 0xc0, 0xf0, 0x88, 0xc7, 0xc4, 0xea, 0x18, 0xaf, 0x07, +0x70, 0xe1, 0xef, 0xfd, 0x66, 0x7f, 0x49, 0xc4, 0x88, 0xad, 0xd2, 0xbf, 0x4d, 0xa7, 0x6a, 0x60, +0x1f, 0xd6, 0xc0, 0x9e, 0x1b, 0xcb, 0xa7, 0x55, 0xdc, 0xe9, 0xd4, 0x2f, 0xa2, 0x3e, 0x5a, 0x78, +0x80, 0x02, 0x84, 0x8a, 0x22, 0xf1, 0xc4, 0x55, 0xee, 0x8f, 0x91, 0x24, 0xea, 0x1e, 0xf7, 0xaf, +0xcf, 0x86, 0x37, 0x68, 0xf0, 0xf9, 0xa2, 0x06, 0xec, 0x1f, 0x85, 0x76, 0x68, 0x6d, 0x64, 0x8e, +0x7d, 0x9f, 0x40, 0x4a, 0x33, 0x9b, 0x78, 0x0e, 0xf9, 0xaa, 0xad, 0x0f, 0x9a, 0x26, 0x53, 0xa8, +0x35, 0x62, 0x85, 0x56, 0x35, 0x06, 0xf7, 0x83, 0x25, 0x9e, 0x91, 0x4e, 0x6c, 0x85, 0xf0, 0xc0, +0xcd, 0xfc, 0x22, 0xdf, 0xa0, 0x26, 0x45, 0xf5, 0x44, 0x28, 0x48, 0x4c, 0xf7, 0x53, 0x07, 0xad, +0x56, 0x13, 0x50, 0xa5, 0xaa, 0x65, 0x74, 0x5d, 0x1f, 0xca, 0x67, 0xa5, 0x90, 0x1e, 0xc4, 0x58, +0x64, 0xe5, 0x5b, 0xd4, 0xb2, 0x1a, 0x6b, 0x07, 0x36, 0x15, 0x2d, 0x69, 0x54, 0xb5, 0x62, 0x12, +0x01, 0xb1, 0x52, 0xc1, 0x55, 0x96, 0xf3, 0x06, 0xb6, 0xb2, 0x5c, 0x11, 0x71, 0x87, 0xca, 0xb2, +0x7c, 0x6d, 0xb3, 0x8d, 0xa6, 0xa3, 0x66, 0x1b, 0xbb, 0xc3, 0x04, 0xf2, 0x1e, 0x99, 0x3c, 0xff, +0x3d, 0xcf, 0x5b, 0xc1, 0xb0, 0x42, 0x64, 0xd3, 0xb0, 0xf0, 0x31, 0xd6, 0xda, 0x56, 0x40, 0x96, +0x5b, 0xa3, 0xe4, 0x63, 0x5b, 0x6d, 0x18, 0x2f, 0xcf, 0x9a, 0xbc, 0x49, 0xa2, 0xdf, 0xa8, 0x8e, +0xe6, 0xa8, 0x15, 0xb4, 0xda, 0xd5, 0xfd, 0x49, 0xe4, 0x0a, 0x5e, 0x29, 0xfa, 0x6b, 0x0e, 0x98, +0x30, 0x54, 0xc7, 0xcc, 0x9b, 0x4c, 0xfc, 0x2f, 0x7f, 0x87, 0x8f, 0x67, 0x5f, 0xdf, 0xb7, 0xa6, +0x27, 0x1b, 0x32, 0x34, 0x13, 0x73, 0x0e, 0xba, 0xd0, 0xb5, 0x5e, 0x60, 0x78, 0x22, 0x6c, 0x98, +0x8c, 0x3c, 0xaa, 0xa7, 0xbe, 0x4c, 0xa6, 0x24, 0x4a, 0x52, 0x2e, 0xeb, 0x96, 0x3f, 0xa5, 0x72, +0xeb, 0x86, 0xbb, 0x7e, 0x81, 0x7f, 0x35, 0x61, 0xf2, 0xd0, 0xc5, 0x62, 0x12, 0x56, 0x62, 0x57, +0xc3, 0x77, 0xc5, 0xe1, 0x8b, 0x60, 0xfa, 0x30, 0x9e, 0x0a, 0x6b, 0xfc, 0xd1, 0xf8, 0xf0, 0xb0, +0x75, 0x78, 0x00, 0x30, 0x2f, 0x6e, 0xd0, 0xf0, 0x7c, 0x70, 0x8c, 0xf2, 0x19, 0x74, 0x7c, 0x8c, +0x8a, 0xfa, 0xab, 0x8d, 0x4a, 0xba, 0xff, 0xdc, 0x44, 0x3f, 0xdc, 0x71, 0x8c, 0x5f, 0x1a, 0x39, +0x1a, 0x73, 0x68, 0x04, 0x33, 0xee, 0x30, 0x68, 0x65, 0x3c, 0x1d, 0x4f, 0x40, 0x91, 0x72, 0x65, +0x38, 0x00, 0x9a, 0x37, 0x15, 0x6d, 0x1a, 0xe2, 0xbf, 0xf3, 0x02, 0x9f, 0x71, 0xce, 0xd6, 0x22, +0x8a, 0xfa, 0xa7, 0xa7, 0xe8, 0xe4, 0x6b, 0xf3, 0xea, 0xb4, 0x39, 0x1c, 0x20, 0x10, 0x7b, 0x41, +0x6c, 0x57, 0x73, 0x77, 0xeb, 0xad, 0xa4, 0x4a, 0x61, 0x46, 0x62, 0xb8, 0xee, 0x40, 0x86, 0xcf, +0x88, 0xbc, 0x60, 0xa8, 0x87, 0x54, 0x22, 0x65, 0xe7, 0x4d, 0x45, 0x66, 0x9c, 0x28, 0xea, 0x5a, +0x1b, 0x8a, 0xdc, 0xf5, 0xe7, 0x13, 0x57, 0x70, 0x3a, 0xd1, 0x86, 0x1e, 0xdd, 0xed, 0xa2, 0x7f, +0xd6, 0x8a, 0x33, 0x95, 0xb9, 0x82, 0x93, 0xdb, 0xad, 0x77, 0x36, 0x2f, 0x9f, 0x0d, 0x3f, 0x6f, +0x5b, 0xbe, 0x36, 0x46, 0x6c, 0x58, 0x7f, 0xda, 0x86, 0xea, 0x1c, 0x5a, 0x41, 0x1d, 0x24, 0xc7, +0xd1, 0xb5, 0x0a, 0x60, 0x87, 0xf1, 0xba, 0x4f, 0x31, 0x6e, 0xbc, 0x05, 0x4d, 0x2f, 0xe2, 0x8a, +0x41, 0xbb, 0xd8, 0x64, 0x21, 0x17, 0x2b, 0x05, 0xea, 0x6d, 0x16, 0xa9, 0x3a, 0x61, 0xf7, 0x51, +0xc9, 0x49, 0x7c, 0x91, 0xab, 0x94, 0x74, 0x37, 0xd0, 0xce, 0xe8, 0xd5, 0x78, 0x75, 0xd8, 0x4c, +0x42, 0x29, 0x37, 0x66, 0x9b, 0x3b, 0xc7, 0x32, 0xbd, 0x07, 0xf6, 0x10, 0xcb, 0x0f, 0x24, 0x2f, +0xcd, 0x45, 0x7e, 0x26, 0xb9, 0x1b, 0x35, 0x76, 0xdc, 0xf2, 0x4e, 0x8d, 0x7b, 0xf7, 0xb9, 0x75, +0xcf, 0xe5, 0xf1, 0xd9, 0xcf, 0x04, 0x2a, 0x15, 0xc2, 0x05, 0x99, 0x1d, 0xc3, 0xa5, 0x14, 0xd7, +0xaa, 0x14, 0xc1, 0x8b, 0xf9, 0x08, 0x1a, 0xe5, 0x36, 0x7c, 0xee, 0x2b, 0x76, 0xa1, 0xb8, 0x99, +0xa0, 0x9c, 0xd7, 0x18, 0x42, 0x39, 0x47, 0x06, 0xde, 0x00, 0xcc, 0x43, 0x83, 0xc4, 0xea, 0x29, +0x94, 0x10, 0x85, 0x9d, 0x9d, 0x70, 0x77, 0x39, 0xd6, 0x84, 0x41, 0x92, 0xa2, 0x36, 0x74, 0x74, +0x38, 0x15, 0x98, 0xf1, 0x70, 0x67, 0xab, 0x9b, 0x94, 0x47, 0x7e, 0x7e, 0x80, 0xbb, 0x76, 0xbd, +0xf4, 0x13, 0xe2, 0xd2, 0xf0, 0xff, 0x03, 0xf5, 0x75, 0x1a, 0x00, 0x58, 0x2e, 0x13, 0x88, 0x39, +0x13, 0x31, 0xa7, 0xd6, 0xa1, 0x6f, 0x05, 0xff, 0x11, 0x3e, 0x28, 0xfe, 0x8e, 0x70, 0x07, 0xdd, +0x5e, 0x5f, 0xf6, 0xfc, 0x2d, 0xaa, 0x4f, 0xb5, 0x2b, 0x8b, 0x7c, 0x80, 0x46, 0x93, 0x27, 0x83, +0x39, 0x99, 0xdf, 0x90, 0xc9, 0x15, 0x3c, 0x19, 0x1a, 0x3b, 0xee, 0x15, 0xb0, 0xb3, 0xfb, 0x2d, +0xf8, 0xee, 0xb9, 0x03, 0x59, 0xb1, 0xd3, 0x50, 0x48, 0xd6, 0x70, 0x28, 0xea, 0x52, 0xf5, 0xb9, +0xa8, 0x15, 0x11, 0xfb, 0x48, 0xe0, 0x46, 0xcd, 0x5c, 0x88, 0x2a, 0xe7, 0x31, 0x7e, 0x69, 0x05, +0xac, 0xcf, 0x6c, 0xa0, 0x72, 0x32, 0xbf, 0x60, 0x8d, 0xec, 0x2e, 0xb0, 0xeb, 0x09, 0x05, 0xdd, +0xe9, 0xfc, 0xe6, 0xaf, 0x4b, 0x70, 0xef, 0xa6, 0x5e, 0xd1, 0x42, 0xea, 0xda, 0x07, 0xa4, 0xb8, +0x2b, 0x75, 0x57, 0xf2, 0x35, 0x12, 0x8b, 0xce, 0x55, 0xea, 0x8d, 0xdf, 0xf0, 0x24, 0x1b, 0xe0, +0xef, 0x35, 0x51, 0xac, 0xf6, 0xad, 0xce, 0x33, 0xe4, 0x57, 0xa0, 0x57, 0x7a, 0x36, 0x7a, 0x80, +0x27, 0x9e, 0x7e, 0xf0, 0x20, 0xc0, 0x8b, 0x7e, 0x03, 0xee, 0xed, 0xe0, 0x8e, 0x3c, 0x36, 0x76, +0xdc, 0x05, 0xd8, 0x77, 0xb1, 0xf0, 0x5d, 0xaa, 0xee, 0xec, 0x65, 0x8e, 0x77, 0xf1, 0x1e, 0x6a, +0x1d, 0x04, 0xc1, 0x8a, 0xe3, 0x42, 0x2b, 0xbd, 0x36, 0xfb, 0x05, 0x85, 0xbd, 0x0a, 0xbd, 0x92, +0xca, 0xf2, 0x25, 0x9b, 0x8d, 0xb2, 0x57, 0x64, 0xd7, 0xcf, 0x9e, 0xfb, 0xff, 0x02, 0xcf, 0x43, +0x5b, 0x09, 0x06, 0x10, 0x00, 0x00}; +#endif /*__SAVE_HTML_H__*/ diff --git a/src/web/html/h/serial_html.h b/src/web/html/h/serial_html.h new file mode 100644 index 00000000..2d3ab07f --- /dev/null +++ b/src/web/html/h/serial_html.h @@ -0,0 +1,113 @@ +#ifndef __SERIAL_HTML_H__ +#define __SERIAL_HTML_H__ +#define serial_html_len 1724 +const uint8_t serial_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xa5, 0x58, 0x5b, 0x53, 0xdb, 0x38, +0x14, 0x7e, 0xe7, 0x57, 0x08, 0xef, 0x74, 0x49, 0x16, 0x62, 0x9b, 0x3b, 0x1b, 0x92, 0x74, 0x28, +0xb0, 0x2d, 0x3b, 0x2c, 0x30, 0x4d, 0x98, 0x4e, 0x67, 0xd9, 0x61, 0x14, 0x59, 0x49, 0x04, 0xb6, +0xe4, 0x91, 0xe4, 0x40, 0xba, 0xd3, 0xff, 0xbe, 0x47, 0xbe, 0x24, 0xbe, 0xb2, 0x94, 0xe6, 0x25, +0x96, 0x7c, 0xce, 0xd1, 0x77, 0x6e, 0x9f, 0x24, 0xf7, 0xd6, 0x3d, 0x41, 0xf4, 0x22, 0xa4, 0x68, +0xa6, 0x03, 0x7f, 0xb0, 0xd6, 0x33, 0x7f, 0xc8, 0xc7, 0x7c, 0xda, 0xb7, 0x28, 0xb7, 0x06, 0x6b, +0x08, 0x7e, 0xbd, 0x19, 0xc5, 0x5e, 0xf2, 0x18, 0x0f, 0x35, 0xd3, 0x3e, 0x1d, 0x0c, 0xa9, 0x64, +0xd8, 0x47, 0xa7, 0x82, 0x2b, 0xe1, 0xd3, 0x9e, 0x93, 0xcc, 0xae, 0xa4, 0x7c, 0xc6, 0x1f, 0x91, +0xa4, 0x7e, 0xdf, 0x52, 0x7a, 0xe1, 0x53, 0x35, 0xa3, 0x54, 0x5b, 0xc8, 0xac, 0xd5, 0xb7, 0x34, +0x7d, 0xd6, 0x0e, 0x51, 0xca, 0x42, 0x33, 0x49, 0x27, 0xa9, 0x84, 0x0d, 0x13, 0xef, 0xe7, 0x7d, +0xd7, 0x3e, 0xb2, 0x5d, 0xd7, 0xdd, 0xb6, 0x1c, 0x80, 0x13, 0x50, 0x8d, 0x11, 0xc7, 0x01, 0xe8, +0xcc, 0x19, 0x7d, 0x0a, 0x85, 0x04, 0x1b, 0x44, 0x70, 0x4d, 0xb9, 0xee, 0x5b, 0x4f, 0xcc, 0xd3, +0xb3, 0xbe, 0x47, 0xe7, 0x8c, 0xd0, 0x4e, 0x3c, 0xd8, 0x42, 0x8c, 0x33, 0x0d, 0xb8, 0x3a, 0x8a, +0x60, 0x9f, 0xf6, 0xb7, 0xad, 0xcc, 0x08, 0x99, 0x61, 0xa9, 0x28, 0x28, 0xdd, 0x8e, 0xfe, 0xe8, +0x1c, 0x99, 0x69, 0x45, 0x24, 0x0b, 0x75, 0x1e, 0xd1, 0x03, 0x9e, 0xe3, 0x64, 0xd6, 0x42, 0x4a, +0x92, 0xbe, 0x85, 0x43, 0x66, 0x3f, 0x14, 0x40, 0x0d, 0x7a, 0x4e, 0x22, 0x01, 0x06, 0x7e, 0xc4, +0x43, 0x22, 0x7c, 0x21, 0xd5, 0xff, 0xb8, 0x28, 0xc5, 0x58, 0x68, 0x95, 0x73, 0x90, 0x0b, 0xc6, +0x3d, 0xfa, 0xbc, 0x85, 0xb8, 0x98, 0x08, 0xdf, 0x17, 0x4f, 0x16, 0x72, 0xd2, 0x9c, 0x38, 0xab, +0xa4, 0xf4, 0xc6, 0xc2, 0x5b, 0xe4, 0x22, 0xef, 0xb1, 0x39, 0x22, 0x3e, 0x56, 0x0a, 0x60, 0x88, +0x90, 0xe3, 0x79, 0x96, 0x47, 0x9c, 0x82, 0x71, 0xf2, 0x18, 0x96, 0xa2, 0x26, 0x7f, 0xd6, 0xe0, +0x64, 0x26, 0x16, 0x67, 0xa3, 0xdb, 0x9e, 0x83, 0x4b, 0x4a, 0xab, 0xe0, 0x74, 0xe7, 0x82, 0x79, +0x2d, 0xb7, 0x7d, 0xbc, 0xd4, 0x65, 0x80, 0xd8, 0x42, 0x82, 0x13, 0x9f, 0x91, 0xc7, 0x6c, 0xd5, +0x56, 0xdb, 0xca, 0x81, 0x52, 0x21, 0xe6, 0x26, 0x78, 0xe6, 0xef, 0x87, 0x67, 0x57, 0x68, 0x8c, +0x6f, 0xcc, 0x5b, 0x3a, 0x96, 0x01, 0x08, 0xc4, 0x98, 0x19, 0xf4, 0x2b, 0x1b, 0x38, 0x16, 0x03, +0x99, 0xdd, 0xa5, 0xd0, 0x8c, 0x79, 0x34, 0xcb, 0x87, 0xe3, 0xb3, 0x39, 0x2d, 0x24, 0xf6, 0x12, +0x26, 0x96, 0xeb, 0x14, 0x4d, 0xec, 0xd5, 0x9b, 0x50, 0x71, 0x07, 0x14, 0x8c, 0x7c, 0xa1, 0xe3, +0x64, 0xb6, 0xc1, 0xd2, 0x7e, 0x93, 0x25, 0x1d, 0x85, 0x05, 0x43, 0x43, 0xaa, 0x35, 0xe3, 0x53, +0x55, 0xb4, 0x63, 0x22, 0x92, 0x19, 0x50, 0x34, 0xa4, 0x12, 0x6b, 0x21, 0xad, 0x6a, 0x00, 0x97, +0xeb, 0x1d, 0xd4, 0xaf, 0x17, 0x85, 0x1e, 0xd6, 0x45, 0xf7, 0x6f, 0xe3, 0xa9, 0x06, 0xd8, 0x87, +0x0d, 0xb0, 0x17, 0x4a, 0xd3, 0xa0, 0x88, 0x3b, 0x9e, 0xfa, 0x49, 0xd4, 0x47, 0xcb, 0x15, 0xa0, +0x01, 0xa1, 0xa3, 0xb0, 0x9c, 0x9a, 0xce, 0xbd, 0x1f, 0x03, 0x31, 0x3d, 0x5a, 0x83, 0xcf, 0xe7, +0xc3, 0x11, 0x3a, 0xb9, 0xb9, 0x68, 0x00, 0xfb, 0x7b, 0xa6, 0x3d, 0xd3, 0x3a, 0x54, 0x5d, 0xc7, +0xc1, 0x50, 0xd2, 0x9e, 0x8e, 0x6c, 0x83, 0xbc, 0x6c, 0xeb, 0x4c, 0x90, 0x28, 0x80, 0x5e, 0xc3, +0x9a, 0x09, 0xde, 0x60, 0x70, 0xdb, 0x5d, 0xe1, 0x19, 0x8b, 0x48, 0x17, 0x1c, 0x3e, 0x31, 0x33, +0x3f, 0xe9, 0xaf, 0xdb, 0x50, 0xa2, 0x62, 0xca, 0x80, 0x83, 0x2f, 0xcd, 0x5f, 0x13, 0xb4, 0x46, +0x4d, 0x40, 0x15, 0xab, 0xe6, 0xd1, 0xf5, 0x1c, 0x68, 0x9f, 0x52, 0x23, 0x3d, 0xb1, 0x09, 0x4b, +0xda, 0x37, 0xeb, 0x65, 0x3e, 0x11, 0x06, 0x6c, 0x2c, 0x9a, 0xd3, 0x28, 0x6a, 0x49, 0x1c, 0x82, +0x63, 0xb9, 0x86, 0x2b, 0xbc, 0x4e, 0x09, 0x0c, 0x58, 0xd4, 0x10, 0x23, 0xb4, 0x27, 0x7e, 0x4e, +0xf8, 0xb9, 0x8b, 0xb6, 0x5d, 0xf7, 0x1d, 0x5a, 0x67, 0x81, 0xa1, 0x72, 0xcc, 0xf5, 0x71, 0xc9, +0x44, 0x99, 0xc0, 0x24, 0x70, 0x5e, 0x55, 0x22, 0xd9, 0x86, 0x80, 0x62, 0xb1, 0xa4, 0x49, 0x2c, +0x92, 0xae, 0x5b, 0xf1, 0x81, 0xee, 0x98, 0xbe, 0x17, 0x3e, 0x3c, 0x1f, 0x41, 0x78, 0xc1, 0x0c, +0x3c, 0xed, 0x99, 0x27, 0xa0, 0x4d, 0xc1, 0xfd, 0x05, 0x78, 0x98, 0x19, 0xa8, 0x41, 0x50, 0x74, +0xbb, 0x01, 0x18, 0x0a, 0x16, 0xb0, 0x4a, 0x03, 0xba, 0x9c, 0x28, 0xc0, 0x30, 0x72, 0x24, 0xd9, +0x29, 0x11, 0x26, 0x1a, 0xa8, 0xa6, 0x5b, 0xac, 0x13, 0x4f, 0x40, 0xb4, 0x8c, 0x23, 0xc9, 0xdb, +0x65, 0xb5, 0x34, 0x20, 0xa9, 0x5d, 0xc2, 0xf8, 0xdb, 0x51, 0x41, 0x67, 0x2f, 0x05, 0x76, 0x1b, +0x6a, 0x16, 0x2c, 0x17, 0x32, 0xc6, 0xa3, 0x78, 0xe6, 0x2d, 0xc6, 0x0f, 0x56, 0xc6, 0x71, 0x47, +0x36, 0x38, 0x1d, 0x2b, 0x32, 0x1e, 0x46, 0xd9, 0xae, 0x3a, 0x8e, 0xb4, 0x36, 0xa5, 0x35, 0xc7, +0x7e, 0x04, 0x43, 0xe2, 0x53, 0x2c, 0x97, 0x39, 0x1a, 0x6b, 0x9e, 0xb8, 0x9c, 0x4c, 0x3b, 0x6f, +0xb3, 0x89, 0x23, 0x2d, 0x60, 0x5b, 0x82, 0xdd, 0xb1, 0x6a, 0x38, 0x9d, 0x6f, 0xb0, 0xdc, 0x94, +0xe4, 0xea, 0x74, 0xb9, 0x0b, 0x1a, 0x9a, 0x62, 0x22, 0x84, 0x2e, 0xf4, 0x44, 0x3e, 0x88, 0x3e, +0x9d, 0xe8, 0xe2, 0xfe, 0xf4, 0x7a, 0x92, 0x4a, 0xf7, 0x64, 0xf4, 0x2b, 0x11, 0xe1, 0x02, 0xed, +0xb8, 0x3b, 0xbb, 0x45, 0x3a, 0x88, 0xfc, 0x12, 0x5e, 0x9f, 0x0d, 0x2a, 0x0b, 0x78, 0x4c, 0x11, +0x21, 0x3d, 0x7b, 0x3a, 0x75, 0xbe, 0x7c, 0x9b, 0x3d, 0x9f, 0x7f, 0x3d, 0xd8, 0x09, 0x3e, 0xd4, +0x10, 0x62, 0x22, 0x66, 0x16, 0xe8, 0xc1, 0x26, 0xf9, 0x0a, 0xc3, 0x53, 0xa6, 0x67, 0xd1, 0xd8, +0x26, 0x22, 0x70, 0xfc, 0x28, 0xc0, 0x61, 0x14, 0xfb, 0x52, 0xb5, 0xfc, 0x31, 0x96, 0xab, 0x1a, +0xee, 0x39, 0x19, 0xfe, 0x32, 0x3f, 0x65, 0xad, 0xc6, 0xa6, 0xb3, 0x42, 0xec, 0x1a, 0xfc, 0x2d, +0x2d, 0xf8, 0x2a, 0x98, 0x0e, 0x8c, 0x03, 0xa6, 0x95, 0x33, 0x9e, 0x1c, 0x1e, 0xee, 0x1c, 0xee, +0x03, 0xcc, 0x8b, 0x11, 0x1a, 0x7e, 0x3a, 0xe9, 0xa2, 0x74, 0x06, 0x75, 0xbb, 0x28, 0xa3, 0xfb, +0xc6, 0xa8, 0xc4, 0xf9, 0xa7, 0x2a, 0xbc, 0x37, 0x35, 0x6a, 0xbd, 0x36, 0x72, 0x04, 0xc8, 0xc7, +0x74, 0xbb, 0xc1, 0x00, 0xe4, 0x60, 0x0b, 0x39, 0x05, 0x45, 0x42, 0xb9, 0xa2, 0x00, 0x68, 0xd1, +0xe1, 0xa4, 0xa3, 0xb0, 0xb3, 0x67, 0xbb, 0x8e, 0x47, 0xa9, 0x57, 0x89, 0x28, 0x1a, 0x9c, 0x9e, +0xa2, 0x0f, 0x5f, 0x3b, 0x57, 0xa7, 0x9d, 0xe1, 0x09, 0x02, 0xb1, 0x57, 0xc4, 0xb6, 0x5c, 0xbb, +0x2f, 0x1e, 0x82, 0x8b, 0x2e, 0xcc, 0xb1, 0x44, 0xc1, 0x09, 0xb4, 0xdb, 0x30, 0x6e, 0x2b, 0xd4, +0x47, 0x5a, 0x46, 0xf4, 0xb8, 0x22, 0x03, 0x3c, 0x07, 0xef, 0xbc, 0x74, 0x63, 0xb5, 0x01, 0xf1, +0xb9, 0x4f, 0xcd, 0xe3, 0x87, 0xc5, 0x85, 0xd7, 0xca, 0x98, 0xba, 0x5d, 0x55, 0xa4, 0xcf, 0xf4, +0x9a, 0x13, 0xba, 0x34, 0x5c, 0x10, 0x98, 0x44, 0x9c, 0x98, 0x3d, 0x1a, 0x85, 0xe6, 0x1c, 0xff, +0x91, 0x72, 0x30, 0x43, 0x5a, 0x62, 0xfc, 0xd0, 0x46, 0xff, 0x56, 0x7a, 0xd8, 0x58, 0x8b, 0x42, +0x30, 0x04, 0xef, 0xff, 0xb6, 0xb4, 0xba, 0x4f, 0x89, 0xef, 0x9f, 0xe3, 0x5a, 0x51, 0x0f, 0x2f, +0x14, 0x08, 0xc7, 0x96, 0x2f, 0xb8, 0x6e, 0x81, 0xaa, 0x83, 0x8e, 0x0e, 0xf6, 0x5c, 0xb7, 0x8d, +0xde, 0xa1, 0xdd, 0x83, 0xfd, 0x7a, 0xb5, 0x99, 0x54, 0xa8, 0xa2, 0xb6, 0x7b, 0x90, 0x68, 0xed, +0xec, 0xd5, 0x2b, 0x05, 0x8c, 0x57, 0x95, 0x0e, 0x62, 0x95, 0x03, 0xb7, 0x5e, 0x45, 0x51, 0x62, +0x54, 0x40, 0xb2, 0x5e, 0xa6, 0x31, 0xd4, 0xa9, 0xd7, 0x6d, 0x9b, 0x71, 0x08, 0xd7, 0xa7, 0xd1, +0x5f, 0x97, 0x26, 0x31, 0xc6, 0xd9, 0x4d, 0x64, 0xa1, 0x33, 0x78, 0xd8, 0x42, 0x56, 0x2d, 0x37, +0x6e, 0xa2, 0x96, 0xe5, 0x5a, 0x9b, 0xe0, 0x61, 0xdb, 0x56, 0xd1, 0x58, 0x69, 0xd9, 0xea, 0xec, +0xb4, 0x8d, 0x5a, 0xf7, 0x45, 0x05, 0xf0, 0xee, 0xc7, 0x14, 0xc0, 0xb7, 0xbc, 0x42, 0x29, 0xe9, +0xe6, 0x17, 0x47, 0xea, 0xb3, 0x52, 0x2c, 0x4e, 0x76, 0xd5, 0x7b, 0x36, 0x69, 0x99, 0x72, 0x41, +0xfd, 0x7e, 0x56, 0x40, 0x75, 0x15, 0xb1, 0xb4, 0x74, 0x05, 0x17, 0x93, 0x7a, 0x43, 0x4b, 0x91, +0xf3, 0xe1, 0xcd, 0x0b, 0x22, 0x4f, 0x70, 0x25, 0x13, 0x4f, 0x36, 0x1c, 0xd9, 0x21, 0x7d, 0x54, +0xc2, 0x36, 0xd4, 0xb2, 0x20, 0xf0, 0x27, 0x0f, 0xf8, 0xb9, 0xb5, 0x61, 0x0e, 0xac, 0xce, 0x34, +0x29, 0xce, 0x8d, 0xad, 0x42, 0xad, 0xb6, 0xad, 0x2d, 0xb4, 0x0f, 0x24, 0xd2, 0x60, 0x76, 0x55, +0xfc, 0x13, 0xec, 0x2b, 0x5a, 0x2f, 0x04, 0x8b, 0x8e, 0x20, 0xa3, 0xd7, 0x93, 0x09, 0x3c, 0xb5, +0x6a, 0x2c, 0x7d, 0x5f, 0x2b, 0x8e, 0xea, 0x5b, 0xa8, 0x64, 0xa6, 0x26, 0x5c, 0x8e, 0x63, 0x84, +0x90, 0x29, 0x1f, 0x24, 0x62, 0x31, 0x34, 0x11, 0xa6, 0x12, 0xe3, 0x3b, 0x7f, 0x7a, 0x92, 0xa9, +0x2d, 0x56, 0x08, 0x1c, 0xf8, 0xc0, 0xe9, 0x13, 0xba, 0x1e, 0x3f, 0x50, 0x52, 0x8b, 0x12, 0x64, +0x6c, 0x12, 0x78, 0x20, 0x97, 0xb2, 0xc1, 0x7d, 0xa4, 0xc9, 0x7d, 0xb2, 0x8e, 0x55, 0x2f, 0x0e, +0x61, 0x4e, 0xcd, 0x9e, 0xc1, 0x35, 0xa5, 0xd5, 0x36, 0xb5, 0x6e, 0x7c, 0xf8, 0x26, 0xf8, 0xca, +0x8f, 0xdf, 0x50, 0xa7, 0xae, 0x3f, 0xb2, 0xec, 0xc4, 0xd7, 0x89, 0xe4, 0xae, 0x05, 0xb9, 0xe0, +0x91, 0xef, 0x43, 0xf9, 0xdf, 0x5c, 0x0f, 0x47, 0x30, 0xfa, 0x73, 0x78, 0x7d, 0x65, 0x43, 0x11, +0xc2, 0x9d, 0x8b, 0x4d, 0x16, 0x71, 0xfa, 0x4b, 0xc0, 0x4b, 0xc1, 0x6c, 0x6c, 0xba, 0xe4, 0x34, +0xd3, 0xb6, 0xb1, 0xe7, 0x9d, 0xcf, 0x61, 0xf6, 0x92, 0xc1, 0x8d, 0x08, 0x2a, 0xc0, 0xbc, 0x81, +0xdb, 0x31, 0xac, 0x95, 0xe5, 0xa1, 0x36, 0xf2, 0x10, 0x5b, 0x3b, 0x3e, 0xda, 0x98, 0xe8, 0x94, +0x82, 0xf1, 0xbd, 0x04, 0xa9, 0x99, 0x63, 0x93, 0x83, 0xcf, 0x9b, 0x41, 0x14, 0x69, 0x7e, 0x3d, +0x37, 0xac, 0x46, 0x57, 0xcf, 0x98, 0x5a, 0x22, 0x6e, 0xe5, 0x44, 0xdb, 0xe8, 0x3d, 0x2a, 0x1c, +0xcf, 0xba, 0x08, 0x2e, 0x02, 0x3c, 0x82, 0x4c, 0xa6, 0x33, 0x55, 0xef, 0xd6, 0x8a, 0x9d, 0x8d, +0x5a, 0xeb, 0xeb, 0x69, 0xbf, 0xc5, 0x6e, 0x0c, 0x45, 0x24, 0xeb, 0xfb, 0x3b, 0xe6, 0xc9, 0xf8, +0x6d, 0x5a, 0x26, 0x39, 0x79, 0x68, 0x4b, 0x6a, 0x46, 0x6a, 0xa3, 0xa6, 0x16, 0x13, 0xa5, 0x6a, +0xa0, 0x36, 0x44, 0x48, 0xf9, 0x46, 0x2e, 0x4e, 0x8d, 0xb4, 0xd2, 0x98, 0x85, 0xf4, 0x28, 0x0f, +0xfc, 0x16, 0x7f, 0xde, 0x1a, 0x63, 0xf2, 0x38, 0x95, 0x22, 0xe2, 0xde, 0xa9, 0xf9, 0x18, 0x64, +0xf2, 0xfb, 0x8b, 0x4b, 0xdc, 0x9a, 0x82, 0xff, 0xbe, 0x95, 0x90, 0x40, 0x1d, 0x1d, 0x36, 0xe2, +0xa5, 0x52, 0x0a, 0xf9, 0x2a, 0xc0, 0x26, 0xae, 0xd4, 0x4e, 0x0e, 0x13, 0xb6, 0xb9, 0x0f, 0x2d, +0x86, 0x70, 0xff, 0xa5, 0x68, 0xbd, 0x9f, 0x8f, 0x9a, 0x7d, 0x7d, 0x73, 0x7e, 0xd5, 0x64, 0xe2, +0x67, 0xfd, 0x9e, 0xb8, 0x75, 0x7e, 0x57, 0x19, 0xec, 0xcd, 0xd1, 0x48, 0x78, 0xe5, 0x55, 0xe1, +0x58, 0x75, 0xdc, 0x26, 0x6c, 0x21, 0xb6, 0x87, 0x35, 0x86, 0xa8, 0x84, 0x3e, 0x86, 0xca, 0x71, +0xee, 0x7a, 0x92, 0xdf, 0x0d, 0x9c, 0xe9, 0x16, 0xda, 0xb8, 0x93, 0x77, 0x7c, 0xa3, 0x81, 0xbd, +0x61, 0x13, 0xca, 0x57, 0x7e, 0x63, 0xcc, 0xcc, 0x5a, 0x49, 0xf1, 0x8f, 0x84, 0x39, 0x9f, 0xac, +0xc6, 0x9f, 0xa8, 0x39, 0xe5, 0xbe, 0x58, 0x0b, 0x2f, 0xb0, 0x51, 0x91, 0xe2, 0xd2, 0x0d, 0xc8, +0x2a, 0x6d, 0x40, 0xc7, 0xb9, 0x63, 0x61, 0xf6, 0x11, 0x33, 0x19, 0x25, 0x1f, 0x10, 0x7b, 0x4e, +0xf2, 0x11, 0xf8, 0x3f, 0x36, 0x79, 0x7e, 0xc0, 0x15, 0x16, 0x00, 0x00}; +#endif /*__SERIAL_HTML_H__*/ diff --git a/src/web/html/h/setup_html.h b/src/web/html/h/setup_html.h new file mode 100644 index 00000000..40481cd7 --- /dev/null +++ b/src/web/html/h/setup_html.h @@ -0,0 +1,545 @@ +#ifndef __SETUP_HTML_H__ +#define __SETUP_HTML_H__ +#define setup_html_len 8636 +const uint8_t setup_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xed, 0x3d, 0xfb, 0x5b, 0xdb, 0x48, +0x92, 0xbf, 0xe7, 0xaf, 0xe8, 0x68, 0xef, 0x06, 0x79, 0x63, 0xfc, 0x86, 0x10, 0x02, 0xec, 0x47, +0x80, 0x24, 0xdc, 0xf2, 0x3a, 0x4c, 0x36, 0xb3, 0x47, 0xfc, 0xf1, 0xc9, 0x52, 0x1b, 0x2b, 0xc8, +0x92, 0x46, 0x92, 0x0d, 0xde, 0xd9, 0xfc, 0xef, 0x57, 0xd5, 0x0f, 0xf9, 0xd5, 0x2d, 0xcb, 0x60, +0x07, 0x66, 0xee, 0xb2, 0x3b, 0x89, 0xdc, 0x8f, 0xea, 0xee, 0xea, 0xea, 0xaa, 0xea, 0xea, 0xea, +0xea, 0x9d, 0xd7, 0x4e, 0x60, 0x27, 0xc3, 0x90, 0x92, 0x6e, 0xd2, 0xf3, 0xf6, 0x5e, 0xed, 0xe0, +0x3f, 0xc4, 0xb3, 0xfc, 0xdb, 0x5d, 0x83, 0xfa, 0xc6, 0xde, 0x2b, 0x02, 0x7f, 0x76, 0xba, 0xd4, +0x72, 0xf8, 0x27, 0xfb, 0x99, 0xb8, 0x89, 0x47, 0xf7, 0x9a, 0x34, 0xe9, 0x87, 0x3b, 0x65, 0xfe, +0x63, 0x94, 0xe9, 0xb9, 0xfe, 0x1d, 0x89, 0xa8, 0xb7, 0x6b, 0xc4, 0xc9, 0xd0, 0xa3, 0x71, 0x97, +0xd2, 0xc4, 0x20, 0xd8, 0xc4, 0xae, 0x91, 0xd0, 0x87, 0xa4, 0x6c, 0xc7, 0xb1, 0x41, 0xba, 0x11, +0xed, 0x88, 0x12, 0x25, 0x48, 0xf8, 0xdb, 0x60, 0xb7, 0x52, 0xda, 0x2a, 0x55, 0x2a, 0x95, 0xaa, +0x51, 0x86, 0x5e, 0xf4, 0x68, 0x62, 0x11, 0xdf, 0xea, 0x41, 0x9d, 0x81, 0x4b, 0xef, 0xc3, 0x20, +0x02, 0x18, 0x76, 0xe0, 0x27, 0xd4, 0x4f, 0x76, 0x8d, 0x7b, 0xd7, 0x49, 0xba, 0xbb, 0x0e, 0x1d, +0xb8, 0x36, 0x5d, 0x67, 0x3f, 0x8a, 0xc4, 0xf5, 0xdd, 0xc4, 0xb5, 0xbc, 0xf5, 0xd8, 0xb6, 0x3c, +0xba, 0x5b, 0x35, 0x24, 0x10, 0xbb, 0x6b, 0x45, 0x31, 0x85, 0x4a, 0x5f, 0xae, 0x3e, 0xae, 0x6f, +0x61, 0x72, 0x6c, 0x47, 0x6e, 0x98, 0x8c, 0xf7, 0xe8, 0xbb, 0x35, 0xb0, 0x78, 0xaa, 0x41, 0xe2, +0xc8, 0xde, 0x35, 0xac, 0xd0, 0x2d, 0x7d, 0x9f, 0xe8, 0xd4, 0xde, 0x4e, 0x99, 0x97, 0x00, 0x00, +0x8b, 0x8c, 0xd0, 0x0e, 0xbc, 0x20, 0x8a, 0xe7, 0x0c, 0x31, 0x0a, 0xda, 0x41, 0x12, 0x8f, 0x0d, +0xd0, 0x0f, 0x5c, 0xdf, 0xa1, 0x0f, 0x45, 0xe2, 0x07, 0x9d, 0xc0, 0xf3, 0x82, 0x7b, 0x83, 0x94, +0xc5, 0x54, 0x94, 0x47, 0x73, 0xb1, 0xd3, 0x0e, 0x9c, 0xe1, 0x18, 0xe6, 0x1d, 0x77, 0x40, 0x6c, +0xcf, 0x8a, 0x63, 0xe8, 0x46, 0x10, 0xfa, 0xd6, 0x40, 0x4e, 0x9f, 0x25, 0x3a, 0x53, 0x1e, 0xef, +0x43, 0x5a, 0x14, 0xe7, 0xcf, 0xd8, 0xdb, 0xef, 0x06, 0xc3, 0xc3, 0xab, 0x2f, 0x3b, 0x65, 0x6b, +0xaa, 0xd2, 0x08, 0x39, 0xdb, 0x83, 0xc0, 0x75, 0xcc, 0x4a, 0xe1, 0x7d, 0x5a, 0xd7, 0x85, 0x1e, +0x1b, 0x24, 0xf0, 0x6d, 0xcf, 0xb5, 0xef, 0x64, 0xab, 0x66, 0xc1, 0x18, 0xeb, 0x54, 0x1c, 0x5a, +0x3e, 0x22, 0x0f, 0xff, 0x59, 0x38, 0x75, 0xd4, 0x1b, 0x1c, 0x9b, 0xeb, 0xa4, 0x03, 0x93, 0x1d, +0xe8, 0x05, 0x6d, 0x17, 0x7b, 0x3f, 0x82, 0x61, 0xb1, 0x62, 0x50, 0xa6, 0x9e, 0x16, 0xea, 0xba, +0x0e, 0x95, 0xf3, 0x51, 0xf6, 0xdc, 0x01, 0x9d, 0x98, 0xd8, 0x13, 0x48, 0x48, 0xdb, 0x99, 0x04, +0xd1, 0x50, 0x83, 0x88, 0x69, 0x04, 0x94, 0x36, 0x01, 0xe4, 0x2b, 0x6d, 0xf3, 0x54, 0x0d, 0xa4, +0x0d, 0x1d, 0x24, 0x58, 0x42, 0x13, 0x80, 0x60, 0x51, 0x25, 0xae, 0x7f, 0x1b, 0x4f, 0xc2, 0x41, +0x8c, 0x48, 0x00, 0x31, 0x0d, 0x69, 0x64, 0x25, 0x41, 0x64, 0xcc, 0x22, 0x30, 0x6d, 0x6f, 0x53, +0xdd, 0x5e, 0x3f, 0x74, 0xac, 0x64, 0x72, 0xf8, 0x5f, 0x58, 0x92, 0xa6, 0xdb, 0x6f, 0x35, 0xdd, +0x1e, 0xc6, 0x09, 0xed, 0x4d, 0xf6, 0x9b, 0x25, 0x3d, 0xb1, 0xd7, 0x5b, 0x69, 0x0b, 0xb0, 0x00, +0x61, 0x45, 0x59, 0xd1, 0x2d, 0xae, 0xdc, 0x9b, 0x36, 0xf0, 0xa3, 0x3b, 0x63, 0xef, 0xf2, 0xa8, +0x79, 0x45, 0xf6, 0x2f, 0x8e, 0x35, 0x9d, 0x7d, 0x27, 0x6b, 0x77, 0x93, 0x24, 0x8c, 0xb7, 0xcb, +0x65, 0x0b, 0x48, 0xda, 0x49, 0xfa, 0x25, 0xec, 0xf9, 0x34, 0xac, 0xc3, 0xc0, 0xee, 0xf7, 0x60, +0xad, 0x59, 0x89, 0x1b, 0xf8, 0x1a, 0x80, 0xd5, 0xca, 0xa8, 0x3f, 0xed, 0xa0, 0x9f, 0x4c, 0x0c, +0x78, 0x1f, 0x53, 0x9e, 0x38, 0xde, 0x8a, 0x86, 0x44, 0x83, 0x5b, 0x17, 0x58, 0xef, 0x09, 0xfe, +0xa3, 0xeb, 0x9a, 0xb6, 0x26, 0xf4, 0x8a, 0x55, 0x1d, 0xef, 0xdd, 0x4e, 0x19, 0x96, 0xcf, 0xd4, +0x42, 0xba, 0x77, 0x3b, 0x2e, 0x5f, 0xbe, 0x72, 0x2d, 0xfb, 0x9d, 0x00, 0x3b, 0xcb, 0x8a, 0x8e, +0xd5, 0x98, 0xac, 0x15, 0x59, 0x21, 0x0c, 0x6c, 0x6c, 0xc1, 0x4d, 0x64, 0x0b, 0x06, 0x36, 0x95, +0xcd, 0x8a, 0x74, 0x82, 0xa8, 0x47, 0x80, 0xe7, 0x75, 0x03, 0x28, 0x17, 0x06, 0x31, 0x70, 0x4c, +0xcb, 0x46, 0xe4, 0x23, 0x3d, 0x59, 0x03, 0x18, 0x03, 0x02, 0x88, 0x05, 0xf9, 0x2b, 0x20, 0x70, +0x28, 0x2e, 0xf5, 0x1c, 0x28, 0xa4, 0xc9, 0x6e, 0xf7, 0x93, 0x24, 0xf0, 0x05, 0x2b, 0xe6, 0x3f, +0xd2, 0xf1, 0xc5, 0x37, 0xc0, 0x8b, 0x3d, 0x2b, 0x8c, 0xdd, 0xb6, 0x47, 0x49, 0x2f, 0x59, 0x6f, +0x48, 0xaa, 0x25, 0x07, 0x81, 0xdf, 0x71, 0x6f, 0x77, 0xca, 0xbc, 0x86, 0x06, 0xf6, 0x18, 0x77, +0x45, 0x50, 0xba, 0x81, 0x4e, 0x74, 0x33, 0x65, 0x53, 0xed, 0xf5, 0x9a, 0xa6, 0x2c, 0x97, 0x99, +0xf4, 0x96, 0xfa, 0x8e, 0x2c, 0xed, 0x50, 0x18, 0xff, 0x21, 0x93, 0x6e, 0xe4, 0x33, 0x60, 0x8a, +0x9c, 0x81, 0x94, 0xd8, 0x29, 0xf3, 0x42, 0x19, 0x50, 0xc6, 0x7a, 0x18, 0x05, 0xf7, 0x04, 0x1a, +0xad, 0x67, 0x34, 0x3a, 0x5d, 0x05, 0xb0, 0xb3, 0x5e, 0xad, 0x11, 0xfc, 0x27, 0xee, 0x61, 0x4d, +0xd1, 0x03, 0xde, 0xf8, 0x04, 0x39, 0x2c, 0x06, 0xea, 0x1d, 0x50, 0x95, 0xeb, 0x87, 0xfd, 0x71, +0x91, 0x6b, 0x08, 0xc9, 0xc7, 0x65, 0x38, 0xc8, 0xc3, 0x39, 0x2d, 0xcc, 0xcb, 0x7e, 0xfa, 0xd0, +0xb7, 0xc6, 0x46, 0x7e, 0x49, 0xdb, 0x41, 0x90, 0x10, 0x14, 0x89, 0xc4, 0x4a, 0x48, 0xcf, 0x75, +0x7c, 0xf7, 0xb6, 0x9b, 0x3c, 0x02, 0x0b, 0x0d, 0x1d, 0x12, 0xec, 0x2e, 0xb5, 0xef, 0xda, 0xc1, +0x83, 0x44, 0x44, 0x0c, 0x09, 0x0e, 0x6f, 0xf7, 0xa5, 0x61, 0xe3, 0xd0, 0x8a, 0xee, 0xc8, 0x69, +0xe0, 0xd0, 0x55, 0x8e, 0xdf, 0x81, 0x46, 0xb0, 0x8d, 0xf9, 0x83, 0x57, 0x13, 0x9b, 0xb1, 0x67, +0xd2, 0x5e, 0x98, 0x0c, 0x49, 0x1b, 0x46, 0x0c, 0xa2, 0x98, 0xd8, 0x16, 0x34, 0x41, 0x82, 0x88, +0xf4, 0x63, 0x4a, 0x0e, 0xae, 0x2e, 0x4f, 0xc8, 0x1b, 0xf2, 0x71, 0x83, 0x58, 0x9d, 0x04, 0x32, +0x23, 0x3e, 0xc1, 0x49, 0x40, 0x80, 0x9d, 0x79, 0x43, 0x92, 0x74, 0xdd, 0x98, 0x08, 0xde, 0x53, +0x78, 0x3c, 0xf2, 0x77, 0xca, 0x73, 0xf8, 0x93, 0x82, 0x2f, 0x34, 0x16, 0xe4, 0x0b, 0x53, 0x2c, +0x6b, 0x2e, 0x53, 0x08, 0x27, 0x6b, 0x83, 0xc0, 0xeb, 0xc7, 0xe4, 0xe4, 0xe8, 0x10, 0x34, 0x8c, +0x70, 0x0e, 0x09, 0x21, 0x43, 0x0e, 0x5d, 0x9f, 0x49, 0x14, 0x31, 0xea, 0xbc, 0xed, 0x5c, 0x5a, +0x8e, 0x1b, 0x10, 0xf3, 0xec, 0xf2, 0x63, 0xad, 0x71, 0x52, 0xa9, 0xbe, 0x29, 0xe4, 0x6b, 0x2d, +0xea, 0xd4, 0x1a, 0xc6, 0x3c, 0x02, 0x58, 0xb0, 0x0f, 0x07, 0xa7, 0x57, 0xb5, 0x7a, 0xa5, 0xb2, +0x9f, 0xb3, 0x0b, 0x76, 0x0f, 0x47, 0xab, 0xa2, 0xaf, 0xa3, 0xe6, 0x45, 0xbd, 0x06, 0xca, 0xae, +0x37, 0x14, 0x24, 0xb2, 0xa4, 0x7e, 0x36, 0x99, 0xe2, 0x88, 0x33, 0x1a, 0x07, 0x1e, 0x9d, 0xdf, +0xcb, 0xe5, 0xad, 0xec, 0x30, 0x72, 0xfd, 0x04, 0x76, 0x4e, 0x03, 0x1a, 0xe1, 0xaa, 0x00, 0x45, +0xd0, 0x5a, 0x29, 0x8f, 0xa3, 0xd1, 0x91, 0xff, 0xd2, 0xb8, 0x9b, 0xc0, 0xfe, 0x21, 0x6d, 0xf7, +0x6f, 0x57, 0x3c, 0xf8, 0xc3, 0xf6, 0xed, 0x4b, 0x18, 0xfd, 0x98, 0x90, 0x27, 0xbd, 0x21, 0x2a, +0x26, 0xc7, 0xa0, 0xcc, 0x44, 0x03, 0xc0, 0xc2, 0x75, 0xdc, 0x5a, 0xaa, 0xa8, 0xf7, 0xfb, 0xbd, +0x36, 0x68, 0x8b, 0x23, 0x14, 0x40, 0x4b, 0x03, 0x0f, 0xb4, 0x71, 0xdc, 0x73, 0xee, 0x1a, 0xc7, +0x3e, 0x34, 0xea, 0x3a, 0x84, 0x55, 0x79, 0x12, 0x6a, 0xe6, 0x72, 0xde, 0x0c, 0xf6, 0x95, 0x5f, +0x6b, 0x34, 0xf6, 0xce, 0x68, 0x72, 0x1f, 0x44, 0x77, 0xcb, 0x53, 0x15, 0x1f, 0xa3, 0x2e, 0xea, +0x44, 0xc3, 0x57, 0xf7, 0xa3, 0x3b, 0x92, 0x08, 0xb9, 0xa7, 0x30, 0x27, 0x19, 0xe5, 0x23, 0xa5, +0xfd, 0x0b, 0x72, 0x01, 0xd9, 0x80, 0x24, 0x87, 0x98, 0x3d, 0xd7, 0x2f, 0x11, 0x8f, 0xfa, 0xb7, +0x49, 0x77, 0x9b, 0x6c, 0x15, 0x72, 0x90, 0xd6, 0xe3, 0x35, 0x49, 0x2b, 0xbc, 0x09, 0xef, 0x1d, +0x03, 0x94, 0x35, 0x9f, 0xb7, 0xb8, 0x6b, 0x6c, 0xa1, 0xd5, 0x24, 0x0f, 0x3d, 0xcf, 0x91, 0x6d, +0x9c, 0x67, 0xef, 0x1d, 0xe1, 0x2a, 0x01, 0x55, 0x81, 0x12, 0x3b, 0xa2, 0x0e, 0x4c, 0x29, 0xf0, +0x8d, 0x18, 0x75, 0x88, 0x61, 0xd0, 0x8f, 0x48, 0x08, 0x3b, 0x30, 0x1a, 0x41, 0x06, 0xc1, 0x69, +0x20, 0x31, 0xdf, 0x59, 0x96, 0xc8, 0xfe, 0x98, 0xc2, 0x01, 0xda, 0x05, 0xab, 0xcf, 0xb5, 0x5e, +0x92, 0x44, 0x2e, 0x65, 0x00, 0x80, 0x44, 0x7c, 0x6a, 0x27, 0xe4, 0xde, 0x4d, 0xba, 0x5c, 0x17, +0xc1, 0xcd, 0x58, 0xd4, 0xe3, 0x20, 0x98, 0x44, 0x78, 0x9e, 0xd9, 0x6c, 0x52, 0x2b, 0xb2, 0xbb, +0x44, 0x50, 0x7d, 0xbc, 0xf4, 0x09, 0x94, 0x8b, 0x4d, 0xea, 0xc0, 0x96, 0xdf, 0x4e, 0x7c, 0xb1, +0x13, 0x94, 0x3f, 0x04, 0x20, 0xf6, 0x0d, 0xec, 0xa2, 0x2f, 0x0a, 0x8e, 0x99, 0x9d, 0xf0, 0xa7, +0x59, 0x30, 0x96, 0x37, 0xd7, 0xb3, 0xe8, 0xac, 0xe1, 0x5f, 0x5c, 0x60, 0x2c, 0x63, 0x91, 0x0c, +0x2c, 0xd7, 0x5b, 0x2a, 0x56, 0xe7, 0xd6, 0xe6, 0x06, 0x0a, 0xea, 0x21, 0x99, 0x71, 0x6c, 0xfb, +0xa2, 0x79, 0x8e, 0xee, 0xd1, 0xaf, 0xc0, 0x3f, 0xe8, 0x5a, 0xfe, 0x2d, 0xe3, 0xd7, 0x1e, 0xf4, +0x71, 0xc2, 0x9c, 0x37, 0xb7, 0x89, 0x20, 0x44, 0x9a, 0x95, 0x13, 0xb5, 0x5e, 0x35, 0x08, 0x6f, +0x14, 0xd6, 0x85, 0xe3, 0xc6, 0x16, 0x30, 0x51, 0x87, 0x74, 0x5d, 0x07, 0x96, 0xcf, 0x9e, 0x0f, +0x1a, 0x38, 0x4e, 0x9d, 0x4f, 0x9d, 0x9d, 0x32, 0xaf, 0x97, 0x73, 0x1c, 0x65, 0x0e, 0x33, 0x07, +0xce, 0x72, 0x13, 0xc4, 0xb3, 0xd2, 0x43, 0xb3, 0x79, 0x7c, 0xb8, 0x52, 0xe6, 0x18, 0xc7, 0xae, +0xb3, 0xd0, 0xfa, 0x78, 0x1e, 0x74, 0x70, 0x4c, 0x10, 0xe0, 0x7f, 0x9c, 0x44, 0x96, 0x8e, 0x93, +0x69, 0xa5, 0x0c, 0x9b, 0xf9, 0x03, 0xe0, 0x45, 0x90, 0x89, 0x14, 0xac, 0x4b, 0x47, 0x4b, 0x28, +0x00, 0x4b, 0xb4, 0x30, 0x41, 0x2a, 0x96, 0xf0, 0xef, 0x17, 0x5f, 0x0f, 0x7f, 0x2c, 0x05, 0x47, +0xf3, 0x74, 0xb4, 0xc7, 0xec, 0x90, 0xb5, 0xbb, 0x64, 0x14, 0xbf, 0x36, 0x39, 0xbe, 0x20, 0x26, +0xe7, 0x2c, 0x96, 0x57, 0x98, 0xbf, 0x59, 0x16, 0x82, 0x7e, 0x2e, 0x66, 0x4f, 0xa8, 0x35, 0xa0, +0x84, 0x77, 0x95, 0x30, 0x83, 0x32, 0x01, 0x71, 0x4d, 0x0e, 0x3f, 0x1f, 0x5c, 0xec, 0xb4, 0xa3, +0xf2, 0x7c, 0x00, 0x57, 0xa0, 0x04, 0xf0, 0x83, 0x1d, 0x54, 0x09, 0x04, 0x20, 0x2b, 0xa2, 0x24, +0xc4, 0xc3, 0x2a, 0x54, 0x88, 0xb9, 0x1a, 0xc0, 0x95, 0x80, 0x6d, 0x52, 0x7d, 0x57, 0x2b, 0x55, +0x37, 0xb7, 0x4a, 0x8d, 0x52, 0x75, 0xce, 0x0c, 0x84, 0x7b, 0xcf, 0xa3, 0x29, 0x00, 0xa6, 0xf7, +0x1d, 0x27, 0xa2, 0x71, 0xbc, 0x52, 0x46, 0xe6, 0x86, 0xd8, 0x0a, 0x68, 0x79, 0xd6, 0x83, 0xd4, +0xf2, 0xaa, 0x1b, 0x8b, 0xa9, 0x79, 0xcf, 0xa3, 0x48, 0xf5, 0xdb, 0x3d, 0x2b, 0xbe, 0x5b, 0x31, +0x6e, 0x4e, 0xa1, 0x89, 0x3f, 0x1e, 0x6e, 0x0e, 0xcf, 0x9a, 0xa4, 0xba, 0x62, 0xcc, 0x1c, 0xfa, +0x71, 0xf5, 0x8f, 0x89, 0x99, 0xda, 0xea, 0x31, 0x53, 0xfb, 0xe3, 0x61, 0xe6, 0x93, 0x95, 0xd0, +0x7b, 0x6b, 0xb8, 0x62, 0xdc, 0x88, 0x56, 0x56, 0x82, 0x9e, 0x9f, 0x65, 0xb1, 0xb8, 0x88, 0x82, +0x84, 0xda, 0xfc, 0x94, 0x73, 0xd5, 0x46, 0x8b, 0xc5, 0x25, 0x35, 0xe9, 0x3d, 0x30, 0xcd, 0x66, +0xac, 0x93, 0xb9, 0x84, 0xf4, 0x0a, 0xe8, 0x8a, 0x69, 0x6b, 0x09, 0xdb, 0x9e, 0x39, 0x3d, 0x10, +0xc0, 0x3f, 0x4d, 0xdb, 0xb2, 0xb0, 0xb9, 0xd5, 0xa8, 0x5c, 0x42, 0xa1, 0x69, 0xf2, 0x7d, 0x5f, +0x68, 0xdd, 0x02, 0xc6, 0xef, 0xbb, 0x2e, 0x6c, 0xe9, 0xe3, 0x6e, 0xd0, 0xf7, 0x1c, 0xd2, 0x06, +0x95, 0x83, 0xe3, 0x1e, 0xb4, 0x8e, 0xf6, 0x90, 0x84, 0xe9, 0xa0, 0xf3, 0x28, 0x12, 0xec, 0x80, +0x00, 0xaa, 0xdf, 0xa0, 0x6c, 0x33, 0xf6, 0x5e, 0x08, 0xc5, 0x1f, 0x0b, 0x7b, 0xf6, 0x6a, 0xcf, +0x73, 0x75, 0xb4, 0xae, 0xd2, 0x46, 0x47, 0x3d, 0xca, 0x75, 0x86, 0x8b, 0x68, 0x95, 0x46, 0xf9, +0xf9, 0x58, 0x55, 0xec, 0x3a, 0x9e, 0x72, 0xea, 0xbb, 0x54, 0xfb, 0xaf, 0x9c, 0x28, 0x1c, 0x51, +0x3b, 0xf1, 0x41, 0x77, 0x53, 0xda, 0x73, 0x20, 0x9d, 0x48, 0x1c, 0xad, 0xc2, 0x42, 0xfe, 0x34, +0x84, 0xa4, 0xa7, 0x35, 0x71, 0xbf, 0xcd, 0xa6, 0xf3, 0x2c, 0x48, 0xd8, 0x31, 0xcd, 0x93, 0x51, +0x15, 0xee, 0xed, 0x93, 0x35, 0x90, 0x2d, 0xa4, 0x17, 0x38, 0x7d, 0x0f, 0x96, 0x62, 0x70, 0x4f, +0xa3, 0x35, 0x8e, 0x15, 0x12, 0x74, 0xc8, 0x5a, 0x65, 0x4d, 0x5a, 0x4d, 0x62, 0x6e, 0x78, 0xec, +0xa2, 0xb9, 0xc4, 0xc3, 0xfd, 0xc1, 0x1a, 0x3a, 0x32, 0x41, 0x59, 0x97, 0xde, 0xe7, 0xe8, 0xcb, +0xb3, 0xe3, 0xec, 0x13, 0xf5, 0x69, 0x84, 0xee, 0x51, 0x4b, 0x40, 0xdb, 0xff, 0xd9, 0x03, 0x14, +0x60, 0x0a, 0xb2, 0xa5, 0x15, 0x9c, 0xa1, 0xac, 0x0c, 0x3b, 0xa7, 0x40, 0xe1, 0x11, 0xe5, 0xd6, +0xee, 0x90, 0x46, 0x20, 0x59, 0x87, 0x5e, 0x60, 0x39, 0xab, 0x45, 0xd4, 0x25, 0x34, 0x38, 0x7c, +0x59, 0x87, 0x8d, 0x62, 0x59, 0x5d, 0x52, 0x94, 0x24, 0x6c, 0x91, 0xc3, 0xa6, 0x1f, 0x44, 0xc5, +0x3f, 0x51, 0xba, 0x1c, 0x5a, 0x3f, 0xcd, 0xd7, 0x04, 0xb1, 0x13, 0x27, 0xa7, 0x79, 0x4c, 0x82, +0xcf, 0x8d, 0x9e, 0xfb, 0x2e, 0xf5, 0x47, 0x07, 0xd4, 0x21, 0x88, 0x79, 0x34, 0x98, 0x84, 0x56, +0x3f, 0x46, 0xdc, 0x25, 0x24, 0xee, 0xfb, 0x50, 0x7a, 0xf5, 0xc8, 0x3a, 0x08, 0x7a, 0xcd, 0x24, +0x08, 0x5f, 0x9e, 0xa3, 0x92, 0x16, 0x57, 0x31, 0xf7, 0xf4, 0x70, 0x63, 0xb2, 0x86, 0x86, 0x76, +0x0b, 0x8f, 0x1c, 0x50, 0x90, 0xac, 0xad, 0x1e, 0x59, 0x20, 0x1f, 0xd9, 0x09, 0xc7, 0xcb, 0xc4, +0x16, 0x0a, 0xdc, 0xb5, 0x74, 0xf9, 0xfd, 0xd4, 0x15, 0x67, 0x3d, 0xbc, 0xb8, 0x45, 0xc7, 0x4c, +0xa5, 0x11, 0x3f, 0x7a, 0x0c, 0xb0, 0xff, 0x6e, 0x8f, 0x92, 0x78, 0xe8, 0xdb, 0xc4, 0x84, 0x35, +0xd6, 0xe9, 0x33, 0x5d, 0x63, 0xff, 0x62, 0xfd, 0xdc, 0xf7, 0x86, 0xeb, 0xe8, 0xa0, 0x55, 0x58, +0xa9, 0x93, 0x44, 0x12, 0x25, 0x5f, 0x93, 0x6e, 0x72, 0xd5, 0x7b, 0x69, 0x58, 0x62, 0x3c, 0x9a, +0x1c, 0x75, 0x3a, 0xae, 0xed, 0x52, 0xdf, 0x1e, 0x12, 0x73, 0xb4, 0x83, 0x6a, 0xd3, 0xe4, 0x9e, +0xc2, 0xda, 0xab, 0x94, 0xde, 0x6d, 0x30, 0x86, 0x0e, 0x1f, 0x9b, 0x4b, 0xc5, 0xd3, 0xa4, 0x74, +0x1b, 0x7a, 0x0e, 0x74, 0xc4, 0x80, 0x25, 0x4e, 0x43, 0xd8, 0x3e, 0xfa, 0xc3, 0x3f, 0x86, 0xeb, +0xc4, 0xd5, 0x05, 0x69, 0x82, 0xee, 0xf2, 0x5c, 0x1b, 0x33, 0xdd, 0xe6, 0x6c, 0xbc, 0x5f, 0x3f, +0xd7, 0xc5, 0x56, 0xa8, 0x47, 0xa3, 0x0e, 0x90, 0x32, 0x39, 0xbe, 0x58, 0x99, 0xaf, 0xad, 0x9f, +0x70, 0xe3, 0xf9, 0x8b, 0xd4, 0x11, 0x11, 0x09, 0x17, 0x41, 0x94, 0xac, 0x50, 0x29, 0x84, 0xf1, +0x63, 0x0b, 0x2f, 0x77, 0xfc, 0xe9, 0x2e, 0xc2, 0x04, 0x9e, 0x7b, 0xea, 0xfa, 0xfd, 0x84, 0xc6, +0x45, 0xc2, 0x9c, 0x68, 0x36, 0xe4, 0xef, 0xc2, 0x6a, 0x11, 0xc4, 0xfd, 0xb3, 0x5e, 0x24, 0x86, +0x70, 0x95, 0x0b, 0xe7, 0x57, 0x14, 0x52, 0x4f, 0xc5, 0xc3, 0x7c, 0x83, 0x9e, 0xde, 0x51, 0x05, +0x10, 0xf5, 0x41, 0xfa, 0xa9, 0xc8, 0x6f, 0x85, 0x59, 0xa3, 0x13, 0x05, 0x3d, 0xe9, 0x8f, 0x3c, +0xee, 0xae, 0x42, 0x93, 0x2b, 0x18, 0x00, 0xf3, 0x58, 0x79, 0x62, 0x2f, 0x9a, 0x20, 0xa8, 0xd3, +0x6e, 0xf0, 0x1f, 0x2a, 0x77, 0x19, 0x14, 0xe7, 0x40, 0x60, 0xe3, 0x7d, 0x80, 0xa4, 0xb4, 0x13, +0xf9, 0xce, 0x2c, 0xf9, 0xf5, 0x16, 0x6c, 0xcb, 0x0a, 0x5d, 0x50, 0xa5, 0xfa, 0x5e, 0x72, 0x96, +0x84, 0xb3, 0xd7, 0x5b, 0x1e, 0x65, 0x0b, 0xff, 0xf9, 0xe4, 0x24, 0x48, 0xe9, 0xea, 0xc9, 0xa4, +0x24, 0xe0, 0x8d, 0xd0, 0x83, 0xf7, 0xa9, 0x52, 0xb4, 0xbc, 0x7c, 0xb9, 0xdc, 0xec, 0xfb, 0x91, +0x1b, 0x53, 0xf2, 0x0b, 0x69, 0x8a, 0xcd, 0xd4, 0x4b, 0x92, 0xce, 0xb3, 0xbd, 0x7b, 0x16, 0x19, +0x7d, 0x62, 0x25, 0x6e, 0xd2, 0x77, 0x28, 0x31, 0x1d, 0x6a, 0xbb, 0x3d, 0xe6, 0x4d, 0xb0, 0x3a, +0x3f, 0xd9, 0xbe, 0x0f, 0xed, 0x2d, 0x4b, 0xbf, 0x5b, 0x1d, 0x4e, 0x02, 0xff, 0xf6, 0xe7, 0x22, +0x05, 0x89, 0xf8, 0x85, 0x23, 0xe5, 0xbc, 0xd3, 0x41, 0x82, 0x37, 0xc3, 0x88, 0xa2, 0x71, 0x02, +0x69, 0xb7, 0x48, 0xf0, 0xba, 0x9b, 0x30, 0x55, 0x3c, 0x1d, 0x45, 0x13, 0x4e, 0x7c, 0x00, 0x14, +0x5b, 0x64, 0xec, 0x86, 0xfb, 0xc4, 0xbd, 0xa8, 0x5d, 0xd3, 0x05, 0x1a, 0x6a, 0x52, 0xb3, 0x8d, +0xb4, 0x4d, 0xc4, 0xc4, 0xe9, 0x47, 0x98, 0xb0, 0xfa, 0x5b, 0x55, 0x7d, 0xff, 0xd0, 0x8d, 0xcf, +0xb0, 0x99, 0x83, 0xa0, 0xf7, 0x87, 0xd8, 0x26, 0x9d, 0xfe, 0xf7, 0xd5, 0xd5, 0xcb, 0x62, 0xc1, +0xbc, 0x47, 0xcf, 0xc2, 0x76, 0x3f, 0x44, 0xc1, 0x1d, 0xdb, 0x16, 0x89, 0xfd, 0xd1, 0x0a, 0x77, +0x47, 0xbd, 0xdf, 0x92, 0xe4, 0xe5, 0x6e, 0x8f, 0x56, 0xbc, 0x35, 0xc2, 0xc1, 0xbf, 0xdc, 0xbd, +0xd1, 0x81, 0xe7, 0x02, 0x85, 0x93, 0x63, 0x67, 0xc2, 0x99, 0x6f, 0x85, 0x74, 0xc0, 0x1b, 0x3c, +0x76, 0x5e, 0x26, 0x3a, 0xbe, 0xc0, 0x76, 0x02, 0xfb, 0xfa, 0xb3, 0xb0, 0x81, 0xed, 0xbd, 0xd0, +0x55, 0x91, 0xde, 0x34, 0x59, 0x0d, 0x26, 0xa6, 0x3d, 0x35, 0xd8, 0x32, 0xb9, 0x7f, 0xa1, 0x64, +0x71, 0x15, 0x84, 0xae, 0xbd, 0x52, 0x42, 0x60, 0x2d, 0x18, 0x24, 0xb4, 0x12, 0x10, 0xe2, 0xfe, +0xae, 0x71, 0xfd, 0x6d, 0xfd, 0xdb, 0x9b, 0xfd, 0xf5, 0xff, 0xb1, 0xd6, 0xff, 0x55, 0x59, 0x7f, +0xf7, 0xad, 0xf4, 0xad, 0xfc, 0x97, 0x6f, 0xff, 0xf1, 0x9f, 0xbf, 0xec, 0xde, 0xb4, 0xde, 0x68, +0x8e, 0x27, 0xc9, 0x93, 0x31, 0x37, 0x7d, 0x75, 0xd2, 0x1f, 0x79, 0x0e, 0xb0, 0xfb, 0x8b, 0x68, +0xae, 0xb6, 0x48, 0xc7, 0x7d, 0x60, 0x5e, 0xb4, 0xdc, 0x9e, 0x52, 0x24, 0x74, 0x80, 0x47, 0x23, +0x1d, 0x3c, 0x43, 0x07, 0xbd, 0xcc, 0x8d, 0x89, 0x1f, 0xb0, 0xb3, 0xf4, 0x5b, 0x5a, 0x22, 0xfb, +0x19, 0xe7, 0xed, 0x93, 0x70, 0x4a, 0xcc, 0x6f, 0x97, 0xb7, 0x12, 0x93, 0xb0, 0xdf, 0xf6, 0xdc, +0xb8, 0x0b, 0xf9, 0xb0, 0xab, 0x06, 0xa0, 0x09, 0xb9, 0xb7, 0x62, 0xd0, 0xf2, 0x6c, 0x9b, 0xc6, +0x71, 0xa7, 0xef, 0x79, 0x43, 0x12, 0x51, 0x9b, 0xba, 0x03, 0x28, 0xc1, 0x2c, 0x01, 0x52, 0xfd, +0x29, 0xa1, 0xbe, 0xdc, 0xb1, 0x60, 0xff, 0xbc, 0x4d, 0x2a, 0x85, 0x55, 0xdf, 0xf7, 0x7c, 0xb6, +0xc3, 0x6a, 0xa4, 0x98, 0x39, 0xa7, 0xd5, 0xe4, 0x45, 0x2e, 0x24, 0xd0, 0x18, 0xed, 0x00, 0xa6, +0x6a, 0x28, 0x2e, 0x59, 0x13, 0xb3, 0x1b, 0xf4, 0x28, 0x54, 0x70, 0xe3, 0xc4, 0xf2, 0x9f, 0xae, +0xc1, 0x3f, 0xc5, 0xe6, 0x83, 0x48, 0x4d, 0xfb, 0xc7, 0x2d, 0x3f, 0x53, 0x49, 0x2a, 0xfb, 0x0f, +0xac, 0x92, 0x09, 0xfb, 0x93, 0xef, 0xa4, 0x15, 0xf8, 0x10, 0x73, 0xda, 0xa2, 0x66, 0x2d, 0x40, +0xa7, 0xd0, 0xf8, 0xaa, 0x4d, 0x40, 0x3f, 0x4b, 0xf3, 0x06, 0x9c, 0x84, 0x9e, 0x35, 0xfc, 0x29, +0xd1, 0x40, 0x16, 0xd5, 0xc1, 0xa7, 0xfb, 0x96, 0xdb, 0x8f, 0x0c, 0xd8, 0x59, 0x78, 0x05, 0x83, +0xcf, 0xe7, 0x47, 0x26, 0x6b, 0x5c, 0x06, 0xc9, 0x63, 0x1c, 0xcf, 0x9e, 0xb2, 0x55, 0xbc, 0xea, +0x47, 0x3e, 0xf0, 0xe0, 0x0e, 0xfa, 0x27, 0x7a, 0x74, 0x6c, 0xaf, 0x88, 0xd7, 0x22, 0x20, 0x1d, +0x76, 0x90, 0xab, 0x0d, 0x40, 0x01, 0xc3, 0xbe, 0x09, 0xef, 0xa3, 0x97, 0x76, 0xf0, 0x78, 0xe4, +0xa3, 0x38, 0x22, 0x4d, 0x3b, 0xa2, 0xd4, 0xc7, 0x40, 0x39, 0x11, 0x31, 0x43, 0x10, 0x4b, 0x1e, +0x89, 0xbb, 0x6e, 0x07, 0xaf, 0x94, 0x16, 0xc9, 0xf9, 0xc9, 0xd1, 0xe1, 0x78, 0x60, 0x82, 0x55, +0x62, 0xe8, 0x81, 0x35, 0xfb, 0x42, 0x2d, 0x52, 0xfd, 0x9e, 0xeb, 0x5b, 0x20, 0x8d, 0x57, 0x28, +0xd6, 0x18, 0x16, 0x70, 0xc1, 0xb3, 0xab, 0xc6, 0xbb, 0x46, 0x85, 0x79, 0x87, 0xef, 0x1a, 0xb5, +0x8d, 0x8d, 0xe5, 0x59, 0x61, 0x26, 0xb5, 0x9c, 0x0b, 0x16, 0x83, 0x23, 0x5f, 0xf8, 0x0a, 0xec, +0x1e, 0x94, 0x8f, 0x33, 0x97, 0xef, 0x93, 0x38, 0xea, 0xec, 0xc4, 0x35, 0x44, 0x34, 0xa5, 0x57, +0x8f, 0xa1, 0x6f, 0x11, 0x6b, 0x47, 0x5c, 0x89, 0xe6, 0xe1, 0x59, 0x46, 0x4a, 0x14, 0x41, 0x8a, +0x5f, 0x80, 0x94, 0xa6, 0x09, 0xfa, 0x55, 0x6e, 0x39, 0x3b, 0x4d, 0xed, 0xfc, 0xc6, 0x36, 0xc8, +0x0a, 0x4c, 0x07, 0x15, 0xae, 0xbc, 0x00, 0xac, 0xb8, 0xdf, 0xee, 0xb9, 0xc9, 0x48, 0xfe, 0xb2, +0xf0, 0x56, 0x23, 0xc1, 0x4c, 0x22, 0x34, 0x48, 0x65, 0x49, 0xdc, 0xcc, 0xb9, 0x53, 0x66, 0xc1, +0x94, 0x06, 0x51, 0x4f, 0x91, 0x3e, 0x86, 0x9c, 0x6e, 0xc4, 0x96, 0x19, 0xce, 0x96, 0xde, 0xd1, +0x77, 0xbc, 0xc2, 0xbc, 0xb9, 0xdd, 0xb1, 0x26, 0xd4, 0x0d, 0x11, 0x84, 0x8c, 0x46, 0x56, 0x0c, +0xf2, 0xe6, 0xe8, 0x72, 0xbf, 0x79, 0x44, 0x9a, 0x47, 0x57, 0x57, 0xc7, 0x67, 0x9f, 0x9a, 0xc4, +0x44, 0x2f, 0x24, 0xbc, 0x1a, 0x5f, 0x98, 0x08, 0x69, 0xb6, 0x6c, 0x41, 0x79, 0xdc, 0xc3, 0x58, +0x91, 0xa4, 0x4c, 0x8e, 0x1e, 0xd8, 0xc7, 0x7f, 0x35, 0xcf, 0xcf, 0xc8, 0x28, 0xa8, 0xde, 0x23, +0xac, 0x58, 0x73, 0xa9, 0x7b, 0xae, 0x37, 0x2c, 0xef, 0xd3, 0xea, 0xd5, 0x46, 0x16, 0x62, 0x0d, +0x99, 0x00, 0x7e, 0x18, 0x69, 0xb0, 0xb5, 0x8b, 0xf3, 0xe6, 0xd5, 0x58, 0xb0, 0xb5, 0x7e, 0x88, +0xce, 0x97, 0x06, 0xa1, 0xbe, 0xcd, 0xa9, 0xb5, 0x07, 0x7a, 0x9c, 0x1b, 0x5a, 0x51, 0xc2, 0x48, +0x68, 0x1d, 0xf7, 0x37, 0x58, 0xdc, 0xa6, 0x61, 0xb2, 0x9e, 0x46, 0xcf, 0xec, 0x27, 0x1d, 0x16, +0x3d, 0x93, 0xe4, 0xf8, 0x33, 0x85, 0xc4, 0x45, 0xae, 0x8f, 0x6b, 0x11, 0xb0, 0x25, 0x8f, 0xd9, +0xc6, 0xd7, 0x59, 0x07, 0x63, 0x3f, 0x8a, 0xf5, 0x2a, 0x86, 0xb5, 0x97, 0xf3, 0xba, 0xc6, 0xfc, +0x16, 0x1b, 0xaa, 0x16, 0xa7, 0x34, 0xc8, 0x71, 0x2d, 0x9b, 0xcf, 0xf2, 0x98, 0x9e, 0x8d, 0x91, +0xf9, 0xf0, 0xf2, 0xfc, 0x02, 0x3d, 0xca, 0x7b, 0xd7, 0x44, 0xb3, 0xd8, 0x57, 0x7a, 0xe4, 0xfa, +0xd4, 0x75, 0x20, 0xd0, 0xc9, 0xd7, 0xe5, 0xea, 0x17, 0x83, 0x92, 0x35, 0xdd, 0xd2, 0xe4, 0x86, +0xc5, 0xdc, 0x9c, 0x0d, 0x08, 0x29, 0xf8, 0x85, 0x0c, 0x40, 0x48, 0x4c, 0xc6, 0x39, 0x90, 0xc2, +0x18, 0xc3, 0xe2, 0xb1, 0x49, 0x89, 0x89, 0x5a, 0x96, 0x70, 0x1e, 0x2c, 0xa6, 0xb7, 0x65, 0x62, +0x72, 0xef, 0x7a, 0x1e, 0xba, 0x82, 0x45, 0xb4, 0x07, 0xdb, 0x2a, 0xe7, 0x75, 0xe1, 0xf9, 0xb6, +0x44, 0x8a, 0x6a, 0xd3, 0xd1, 0x1c, 0x35, 0xc1, 0x1d, 0x3b, 0x20, 0xf0, 0x26, 0x62, 0x3b, 0x8e, +0x4f, 0x81, 0x47, 0x3b, 0xc9, 0x64, 0x9c, 0xd5, 0xfc, 0xc1, 0x36, 0x45, 0x6c, 0x59, 0xf2, 0x8b, +0x1d, 0x84, 0x43, 0x52, 0xab, 0xd4, 0xea, 0x93, 0x61, 0x2d, 0xfb, 0xde, 0x54, 0x7f, 0x3d, 0x77, +0x6f, 0xa6, 0x01, 0x07, 0xb7, 0xac, 0x91, 0x53, 0xba, 0xbd, 0x2d, 0x7f, 0xfd, 0x57, 0xf7, 0xe1, +0xe8, 0x9f, 0x9b, 0xb5, 0xde, 0x07, 0x45, 0x60, 0x4f, 0x5e, 0x8c, 0xcd, 0x59, 0x19, 0xe0, 0xcc, +0x07, 0x7c, 0xeb, 0x26, 0xdd, 0x7e, 0xbb, 0x64, 0x07, 0xbd, 0xb2, 0xd7, 0xef, 0x59, 0x61, 0x9f, +0x8d, 0x65, 0x16, 0xf2, 0x27, 0x56, 0x6e, 0x16, 0xf0, 0x4e, 0x59, 0xf6, 0x7f, 0x3a, 0xce, 0xa6, +0x5c, 0x40, 0x4c, 0xdc, 0xcf, 0x1f, 0xef, 0x54, 0x83, 0xb9, 0xba, 0x59, 0x86, 0xdf, 0xa0, 0x6b, +0xc4, 0xe5, 0x76, 0xe7, 0xed, 0xdb, 0xda, 0x5b, 0xd0, 0x41, 0x3f, 0x1d, 0x5f, 0x91, 0xe6, 0xe7, +0xfd, 0x6d, 0x22, 0x52, 0xc8, 0xf6, 0x36, 0x91, 0x61, 0x4b, 0xb5, 0x58, 0x61, 0xf3, 0x4f, 0x41, +0xb3, 0x4d, 0xc4, 0x5e, 0x31, 0x17, 0xe6, 0x60, 0x4f, 0x62, 0x25, 0xee, 0x80, 0x62, 0x1f, 0x02, +0x3f, 0x2e, 0x05, 0xd1, 0x2d, 0x54, 0xb4, 0x61, 0x9f, 0x42, 0xa1, 0x43, 0xc3, 0x75, 0xdf, 0x5e, +0x8f, 0xad, 0x72, 0xa3, 0x54, 0x29, 0x3b, 0x94, 0x3a, 0x33, 0x18, 0x25, 0x7b, 0x07, 0x07, 0xe4, +0xc3, 0x3f, 0xd7, 0xcf, 0x0e, 0xd6, 0x9b, 0xfb, 0x04, 0x8a, 0xe5, 0xc0, 0xed, 0x34, 0xed, 0x66, +0x06, 0x73, 0x9e, 0x1c, 0xc2, 0xc0, 0x8a, 0x50, 0x55, 0x3f, 0xf6, 0x07, 0x64, 0x97, 0x54, 0xde, +0xcf, 0xe4, 0x25, 0x31, 0x4f, 0x9f, 0xc9, 0x00, 0xbc, 0x6c, 0xd5, 0x36, 0x37, 0x43, 0x50, 0xab, +0xa1, 0xc4, 0xf5, 0xcc, 0x8a, 0xbb, 0x06, 0xdd, 0xbf, 0x48, 0x0c, 0xdc, 0xbc, 0x96, 0x89, 0x30, +0xed, 0x19, 0xad, 0xe2, 0x6c, 0xb9, 0x0a, 0x94, 0x3a, 0xac, 0x13, 0xf3, 0xd3, 0xc5, 0xf1, 0x79, +0xa5, 0xa0, 0x2c, 0x52, 0x85, 0x22, 0x57, 0xbf, 0xf2, 0x22, 0x55, 0x75, 0x91, 0x1a, 0x42, 0x69, +0xf0, 0x22, 0x35, 0x75, 0x91, 0x3a, 0x14, 0xb9, 0x14, 0x50, 0xea, 0xea, 0x22, 0x0d, 0x84, 0x52, +0xe3, 0x45, 0xe0, 0xbb, 0x79, 0xb8, 0xaf, 0x2e, 0x87, 0x23, 0x3b, 0xac, 0xf2, 0x72, 0xf0, 0xdd, +0x3c, 0x38, 0x51, 0x97, 0xdb, 0x84, 0x72, 0x58, 0x66, 0x53, 0x99, 0xfb, 0x56, 0xe4, 0xbe, 0x55, +0xe6, 0x6e, 0x89, 0xdc, 0x2d, 0x65, 0xee, 0x3b, 0x91, 0xfb, 0x4e, 0x8d, 0xb0, 0x8a, 0xc8, 0xae, +0x56, 0xd4, 0xf9, 0x55, 0x99, 0x5f, 0x55, 0xe7, 0x33, 0x74, 0x6e, 0x0a, 0x8c, 0x6b, 0xf0, 0x59, +0x45, 0x84, 0x1e, 0xbe, 0x15, 0x85, 0x34, 0x18, 0xad, 0x32, 0x94, 0x6e, 0x88, 0x42, 0x0d, 0x4d, +0x21, 0x86, 0xcf, 0x2d, 0x51, 0x68, 0x43, 0x53, 0x08, 0x91, 0x79, 0x58, 0x11, 0x85, 0x36, 0xc9, +0x3a, 0xda, 0xab, 0x8f, 0x2f, 0xff, 0xfb, 0x35, 0x14, 0x9f, 0x28, 0xdd, 0x9a, 0xa2, 0x56, 0x15, +0xe9, 0xd6, 0x6b, 0x4b, 0x21, 0x5c, 0x8e, 0xc4, 0x8a, 0x8e, 0x68, 0xf3, 0x50, 0x2d, 0x07, 0x01, +0x34, 0x77, 0x72, 0x74, 0xa8, 0xa5, 0xdb, 0x3c, 0x84, 0xcb, 0x01, 0x35, 0x74, 0xf4, 0xca, 0xb3, +0x37, 0xf4, 0xd3, 0xcd, 0xa7, 0x9a, 0x98, 0x9f, 0x9b, 0x17, 0xc7, 0xe4, 0xf4, 0xb8, 0x79, 0x9e, +0x31, 0xeb, 0x7c, 0xc6, 0x65, 0xd9, 0xf3, 0xe6, 0x71, 0xc6, 0xe4, 0xf3, 0x89, 0x17, 0x65, 0x61, +0xa5, 0xfc, 0x3d, 0x83, 0x06, 0xf8, 0xfc, 0xeb, 0xa7, 0x9f, 0x4f, 0xbd, 0x3a, 0x5f, 0xae, 0xa6, +0xaa, 0x7a, 0x39, 0x55, 0xe5, 0x7a, 0xaa, 0x02, 0x9d, 0xfd, 0x63, 0x4e, 0x5f, 0xe4, 0xea, 0xaa, +0xbe, 0x13, 0x65, 0xf5, 0xf8, 0xa8, 0xc9, 0xa5, 0x54, 0x03, 0x7e, 0xa0, 0x65, 0x18, 0x35, 0x89, +0xe1, 0x1a, 0x60, 0x58, 0xcb, 0x2e, 0x6a, 0x12, 0xb7, 0xb5, 0xba, 0x6c, 0x57, 0x8b, 0xdb, 0x9a, +0xc4, 0x57, 0x4d, 0x8d, 0xaf, 0x9a, 0xc4, 0x57, 0x4d, 0x8d, 0xaf, 0x9a, 0xc4, 0x57, 0x4d, 0x8d, +0xaf, 0xba, 0xec, 0x71, 0xbd, 0xa6, 0xce, 0x97, 0x7d, 0xad, 0xd7, 0xd5, 0xf9, 0x72, 0xee, 0xeb, +0x0d, 0xe6, 0xba, 0xcb, 0x2c, 0x71, 0xea, 0x92, 0x72, 0x24, 0xf5, 0x8d, 0x79, 0x25, 0x71, 0x4c, +0xff, 0xb8, 0x10, 0x2b, 0x61, 0x13, 0xdf, 0x37, 0xc8, 0x2a, 0x8d, 0xb3, 0xf8, 0x8f, 0x33, 0x51, +0xfa, 0xdd, 0x78, 0xe9, 0x69, 0x7e, 0xa1, 0xe4, 0x10, 0x71, 0x7d, 0x99, 0x3c, 0x82, 0x98, 0x87, +0xe7, 0x67, 0x57, 0xe4, 0x0b, 0x6c, 0xff, 0xd7, 0xc9, 0x87, 0xf3, 0xf3, 0xab, 0x82, 0x9e, 0x6b, +0x30, 0xd2, 0x9b, 0xc3, 0x30, 0xf4, 0xac, 0x82, 0x0d, 0x77, 0x05, 0x5c, 0x62, 0x53, 0x66, 0x6b, +0xa5, 0xd9, 0x1c, 0x71, 0x36, 0x47, 0x9e, 0xad, 0x5c, 0xa0, 0x71, 0x0e, 0x37, 0x8f, 0xab, 0xcd, +0xe3, 0x64, 0xcf, 0xcd, 0xbd, 0xe6, 0x73, 0xac, 0x31, 0x42, 0xfb, 0xd2, 0xfc, 0xb0, 0xae, 0xe1, +0x1f, 0x12, 0xa3, 0xb5, 0xca, 0x74, 0x8d, 0x37, 0x73, 0x39, 0xdd, 0x3c, 0x8e, 0x43, 0xcc, 0x8b, +0xe6, 0xe5, 0xfe, 0x29, 0x93, 0xd1, 0x63, 0xd7, 0xec, 0x0a, 0xf3, 0x38, 0x11, 0x31, 0x3f, 0x9e, +0xec, 0x37, 0x3f, 0xe7, 0xac, 0x27, 0x71, 0x52, 0xdb, 0x5a, 0xac, 0x9e, 0xc4, 0x55, 0xed, 0xdd, +0x42, 0xf5, 0xea, 0x12, 0x63, 0xf5, 0xca, 0x62, 0xf5, 0x24, 0xde, 0xea, 0xd5, 0xc5, 0xea, 0x8d, +0x38, 0xf0, 0x62, 0xf5, 0x46, 0x9c, 0x99, 0x1b, 0x18, 0x29, 0xec, 0xe2, 0x63, 0x76, 0x24, 0x4f, +0xbe, 0x5e, 0x9e, 0x9f, 0x9f, 0x8a, 0x9b, 0xf5, 0x71, 0x61, 0x3e, 0xe3, 0x7e, 0x44, 0xf5, 0x11, +0x37, 0xd7, 0xf3, 0x70, 0xce, 0xbf, 0xd5, 0xf9, 0x92, 0x1a, 0xea, 0x1a, 0xb9, 0x24, 0x67, 0xbd, +0xbe, 0xa5, 0xe7, 0xfa, 0x9c, 0xe3, 0xab, 0x79, 0xa0, 0x9c, 0xc5, 0x86, 0x9a, 0x93, 0x34, 0xe4, +0x6c, 0x35, 0xd4, 0x54, 0xde, 0x90, 0xb3, 0xd2, 0x50, 0x73, 0x92, 0x86, 0xc4, 0x7e, 0x43, 0xc3, +0x83, 0x25, 0x7a, 0x1b, 0x6a, 0x4e, 0xd2, 0x90, 0xf8, 0x6b, 0x6c, 0x4c, 0xac, 0xcb, 0xe6, 0xd5, +0xe5, 0xfe, 0xc5, 0xc5, 0xf1, 0xd9, 0x27, 0x02, 0x7f, 0x69, 0x94, 0x40, 0x89, 0xda, 0xc6, 0xe6, +0xc2, 0x55, 0x25, 0xd6, 0x1b, 0x6a, 0xac, 0x37, 0x24, 0xd6, 0x1b, 0x33, 0x58, 0x9f, 0x12, 0x9f, +0x33, 0xb2, 0xd4, 0xa3, 0xce, 0x4d, 0x17, 0x36, 0xfb, 0x37, 0x68, 0x6c, 0x1d, 0x50, 0xb5, 0x3c, +0xc5, 0x49, 0xf1, 0x82, 0x7b, 0xc2, 0xcb, 0x68, 0x37, 0x81, 0x08, 0x47, 0x53, 0x66, 0x5a, 0xeb, +0xb7, 0x61, 0xef, 0x9d, 0x90, 0x08, 0xdb, 0x2b, 0x57, 0x01, 0x7e, 0xb5, 0x58, 0x6f, 0x81, 0xf8, +0x6c, 0x14, 0x37, 0x8b, 0x5b, 0x2d, 0x00, 0x06, 0x9f, 0xad, 0xd2, 0x5f, 0xcb, 0x53, 0xb5, 0xee, +0x5d, 0xdf, 0x09, 0xee, 0x4b, 0xa0, 0x26, 0x04, 0x96, 0x03, 0x55, 0x3b, 0x7d, 0x9f, 0x99, 0x88, +0xcd, 0x02, 0xf9, 0x7d, 0xa6, 0x4b, 0x9d, 0x20, 0x32, 0xdd, 0x04, 0x7d, 0x64, 0x1c, 0xf1, 0x70, +0x4a, 0x09, 0x76, 0xf2, 0x47, 0x1e, 0xc5, 0xcf, 0xf8, 0xc3, 0xf0, 0x00, 0x2d, 0x1d, 0xf8, 0x52, +0x84, 0x39, 0x75, 0xaa, 0x5e, 0x50, 0x41, 0xc3, 0x3f, 0x6e, 0x52, 0xb2, 0x1c, 0xe7, 0x68, 0x00, +0xf5, 0x4f, 0xdc, 0x38, 0xc1, 0xf0, 0x10, 0xa6, 0xc1, 0x2c, 0xa7, 0x46, 0x31, 0xbb, 0x2f, 0xf2, +0x0f, 0x46, 0xc8, 0x2b, 0x31, 0x13, 0x0b, 0x02, 0x28, 0x25, 0xc1, 0xed, 0xad, 0x07, 0xed, 0x0b, +0x9c, 0x15, 0xde, 0x6b, 0x2b, 0xe2, 0x54, 0x89, 0x23, 0x7b, 0x18, 0x37, 0x03, 0xe3, 0xd3, 0x07, +0x39, 0x9a, 0x26, 0xf4, 0xdb, 0xf5, 0x6f, 0xf5, 0xd5, 0x45, 0xd5, 0x12, 0x7f, 0xbc, 0xca, 0x11, +0x27, 0xf3, 0xbb, 0xc4, 0xd4, 0x64, 0xec, 0xee, 0x12, 0xa3, 0xed, 0x05, 0x30, 0xb0, 0x02, 0xf9, +0x1b, 0x31, 0xfc, 0xc0, 0xa7, 0x06, 0xd9, 0x96, 0x69, 0xea, 0x76, 0x7e, 0x28, 0xba, 0xff, 0x63, +0xf6, 0x40, 0x4e, 0x31, 0x19, 0x1f, 0x86, 0xc7, 0x8e, 0x39, 0x7a, 0x47, 0xa5, 0xa0, 0xc0, 0xb2, +0x38, 0x9e, 0xca, 0x81, 0x66, 0xc4, 0x14, 0x33, 0x7f, 0xa3, 0x6e, 0x98, 0x36, 0xf6, 0x5b, 0x9f, +0x46, 0x43, 0x1e, 0x53, 0x28, 0x88, 0xf6, 0x3d, 0xcf, 0x34, 0x58, 0x99, 0x6b, 0x66, 0x84, 0x59, +0xe3, 0xc7, 0xa5, 0x6b, 0x2d, 0xdd, 0x0c, 0x60, 0xa4, 0x44, 0x93, 0x01, 0x66, 0xe6, 0x16, 0xf8, +0x67, 0x47, 0xb4, 0x51, 0xe2, 0x31, 0xb6, 0x20, 0xe9, 0xcd, 0x9b, 0xac, 0x89, 0x77, 0x3b, 0xa8, +0x3c, 0x63, 0x8d, 0x6b, 0xb7, 0x55, 0x62, 0xc6, 0xd8, 0x12, 0x7b, 0x2f, 0xeb, 0xbc, 0x63, 0x1a, +0x45, 0xc0, 0xf2, 0xeb, 0x5d, 0xb2, 0x5e, 0x2d, 0x64, 0xda, 0x5e, 0xa7, 0xea, 0x43, 0x57, 0xa6, +0x21, 0x46, 0x14, 0xa6, 0xcf, 0xa6, 0x08, 0x11, 0x96, 0x63, 0x49, 0x37, 0x9c, 0x1f, 0xaf, 0xe6, +0xcd, 0xdd, 0xd4, 0xbc, 0x69, 0xe7, 0x4c, 0x04, 0xc8, 0x29, 0x3c, 0x76, 0x5d, 0xb8, 0x83, 0xcf, +0x49, 0xcf, 0x63, 0x76, 0xeb, 0x12, 0x8b, 0x23, 0x69, 0xae, 0xfd, 0x6e, 0x50, 0xe6, 0x3e, 0xe0, +0x18, 0xdb, 0x49, 0xd4, 0xa7, 0x45, 0x03, 0xcf, 0x4a, 0x8c, 0x6d, 0x03, 0xc6, 0xc4, 0x9f, 0xab, +0xe2, 0xdf, 0x22, 0xac, 0x4c, 0x6c, 0x6c, 0x6f, 0xe2, 0x8f, 0x9b, 0x9e, 0xf5, 0xc0, 0x5c, 0x21, +0xb6, 0x81, 0x99, 0xa4, 0xff, 0x6b, 0xb1, 0x2c, 0x0e, 0xe0, 0x1a, 0x6b, 0x4d, 0xfc, 0x9f, 0xe7, +0x0e, 0xd1, 0x2a, 0x0d, 0xeb, 0x7f, 0xba, 0xea, 0x8f, 0xb5, 0xc2, 0x34, 0x52, 0x0a, 0x53, 0xec, +0x48, 0x0e, 0x8d, 0x58, 0xa1, 0x7b, 0xd0, 0xfe, 0xea, 0x76, 0x5c, 0x33, 0x68, 0x7f, 0x57, 0x8d, +0x93, 0xed, 0x5a, 0xc6, 0xe9, 0x71, 0x1a, 0x91, 0x69, 0x2c, 0x63, 0xc5, 0x94, 0xc5, 0xd4, 0x3b, +0xa4, 0x1e, 0x10, 0xed, 0x79, 0x98, 0x98, 0x54, 0x51, 0xc0, 0xed, 0x60, 0xbb, 0xd7, 0x86, 0x38, +0x83, 0x36, 0x5a, 0x6a, 0x3a, 0xa2, 0x25, 0x7c, 0x08, 0xc9, 0x77, 0x0e, 0xba, 0xae, 0xe7, 0xa0, +0xfb, 0xa9, 0x89, 0xc1, 0x8e, 0x81, 0x50, 0x58, 0x44, 0x63, 0xbc, 0xdc, 0x50, 0x2a, 0x01, 0xcd, +0xcc, 0x56, 0x06, 0x34, 0xd3, 0xc5, 0x20, 0x1e, 0x45, 0x51, 0x10, 0x01, 0xbf, 0x20, 0x6f, 0x08, +0xeb, 0x19, 0xc5, 0xdf, 0xd0, 0xaf, 0x6c, 0x32, 0x9b, 0xc4, 0xe7, 0x59, 0x12, 0x3e, 0x1a, 0x9d, +0x13, 0xd7, 0xfd, 0x9e, 0x82, 0x31, 0x17, 0x88, 0x2c, 0xfa, 0x7c, 0x75, 0x7a, 0x02, 0xad, 0x19, +0x68, 0x33, 0xc6, 0xbb, 0xf2, 0xf4, 0x81, 0xda, 0xfd, 0x84, 0x3a, 0x45, 0x3c, 0x7a, 0x21, 0x3e, +0xbd, 0xe7, 0x21, 0x08, 0x10, 0x7b, 0xef, 0x17, 0x41, 0xde, 0x04, 0x70, 0x0d, 0xca, 0x16, 0x43, +0x58, 0x6d, 0x65, 0x18, 0x43, 0x00, 0x78, 0x4b, 0x10, 0x60, 0xe0, 0x80, 0x0f, 0xe1, 0x93, 0xa3, +0x30, 0x89, 0x6f, 0xfc, 0xe0, 0xde, 0x68, 0x91, 0xbf, 0x92, 0x6a, 0xa5, 0x52, 0x51, 0x54, 0x9d, +0x1a, 0x28, 0xde, 0xe3, 0x04, 0x7d, 0x15, 0x63, 0xc4, 0xe2, 0x60, 0x93, 0xe0, 0x38, 0x0e, 0x10, +0x5c, 0x33, 0x89, 0x4c, 0x6c, 0xa1, 0x00, 0x89, 0x40, 0x43, 0x8e, 0xdb, 0xe9, 0xd0, 0x88, 0x42, +0x59, 0x5e, 0xce, 0x04, 0x86, 0xbe, 0x4e, 0x26, 0x9a, 0x64, 0x25, 0x7b, 0xb1, 0xb1, 0x00, 0x8e, +0xd0, 0xf9, 0xef, 0xe9, 0x38, 0x62, 0x2e, 0x84, 0x2b, 0x23, 0xab, 0xe7, 0x22, 0xa2, 0xf4, 0x92, +0xaf, 0x06, 0x37, 0xd3, 0xd3, 0xaf, 0xa1, 0x12, 0x68, 0x58, 0x94, 0x3a, 0x6f, 0x7f, 0x07, 0x79, +0xab, 0x2a, 0x07, 0x65, 0x4a, 0x76, 0xcf, 0x61, 0xe4, 0x40, 0x93, 0x1b, 0x5c, 0x3e, 0x86, 0xba, +0x14, 0x3a, 0xfd, 0xee, 0xf2, 0x18, 0xc3, 0xc7, 0x7e, 0xc2, 0x08, 0x04, 0xe7, 0x45, 0x74, 0xb4, +0xac, 0xa3, 0x39, 0x28, 0xb2, 0xff, 0xdd, 0x7a, 0x30, 0xd9, 0xb3, 0x7c, 0xfc, 0xcd, 0x42, 0xa0, +0x29, 0xb9, 0x4c, 0x80, 0x43, 0x31, 0x0f, 0x83, 0x22, 0xf3, 0xb5, 0x00, 0xe5, 0x07, 0xaf, 0x76, +0xb9, 0x9d, 0x21, 0xa3, 0x0c, 0x25, 0x07, 0x66, 0x0d, 0x06, 0xfd, 0xc4, 0x1c, 0x17, 0x67, 0xb2, +0x91, 0x35, 0xd6, 0x08, 0x13, 0xe7, 0x6b, 0xa3, 0x46, 0x6a, 0x85, 0x1f, 0x45, 0x52, 0x9b, 0xed, +0x9e, 0x16, 0xfd, 0xec, 0x49, 0x00, 0x0d, 0xee, 0x17, 0x45, 0x2a, 0xc0, 0xba, 0xc1, 0xe7, 0xf2, +0x8c, 0x85, 0x50, 0x83, 0x22, 0x6c, 0x25, 0xb8, 0x61, 0xad, 0x94, 0xa5, 0x90, 0x03, 0x24, 0x79, +0xa0, 0x27, 0xc8, 0xc7, 0x04, 0x10, 0x4f, 0x1b, 0x0b, 0xe0, 0x29, 0xbd, 0x07, 0xbe, 0x24, 0x5c, +0x01, 0xbc, 0x1b, 0x1f, 0xb8, 0xde, 0x9f, 0x83, 0x8a, 0x54, 0x9e, 0xd2, 0xcb, 0x41, 0x94, 0x23, +0xc1, 0xde, 0xd8, 0x9d, 0xdb, 0xc5, 0xb0, 0x85, 0x0c, 0x73, 0x11, 0x74, 0xe9, 0x46, 0xc7, 0xfd, +0x53, 0x14, 0xc3, 0xd1, 0xf2, 0x6c, 0xe6, 0x57, 0x54, 0x28, 0xf1, 0xfd, 0x83, 0x8e, 0x65, 0x65, +0x72, 0x7d, 0xe9, 0x29, 0xad, 0x94, 0x6c, 0x42, 0xe3, 0x66, 0x0a, 0x10, 0x08, 0x2b, 0x13, 0x3d, +0x28, 0x4c, 0xe1, 0xd8, 0x83, 0xf1, 0xac, 0x22, 0xe4, 0xe7, 0x79, 0x47, 0xe7, 0x50, 0xef, 0x78, +0xa0, 0x9d, 0x2d, 0xd7, 0x91, 0x3b, 0x3f, 0xd7, 0xc1, 0xf1, 0x70, 0x04, 0x9a, 0xb0, 0x37, 0x97, +0x89, 0x7c, 0x2f, 0xb2, 0x5e, 0x57, 0xf4, 0x54, 0x37, 0x3a, 0xd7, 0x29, 0x94, 0xb8, 0x03, 0x88, +0x99, 0xb3, 0x93, 0x3d, 0xef, 0xa0, 0x0d, 0xd5, 0x40, 0x40, 0xa3, 0x3b, 0x89, 0xdd, 0xbd, 0xdb, +0xed, 0x58, 0x20, 0x9d, 0x74, 0xbd, 0xb6, 0xdb, 0xd0, 0xeb, 0x9e, 0xdc, 0x6f, 0xc1, 0xe4, 0xff, +0x8e, 0x5b, 0x2e, 0x10, 0x51, 0xa9, 0xf3, 0x62, 0x11, 0x46, 0xb6, 0x4d, 0x10, 0x22, 0x2a, 0xea, +0xf8, 0x05, 0x14, 0x6f, 0x68, 0xc4, 0x2b, 0xb4, 0xa7, 0x96, 0xa9, 0x76, 0xbb, 0x24, 0xdd, 0x1e, +0x01, 0x4b, 0xb0, 0x71, 0x98, 0xad, 0x1e, 0x01, 0x45, 0x46, 0x3e, 0xeb, 0x8c, 0xe3, 0x0e, 0xb0, +0x2b, 0x6c, 0x27, 0x0e, 0x7d, 0x49, 0xbd, 0x79, 0xa1, 0xe5, 0x6b, 0x25, 0x78, 0x45, 0xa5, 0x29, +0xaf, 0xd0, 0x1f, 0x0c, 0x23, 0x85, 0xe2, 0x22, 0xd5, 0xc7, 0xdc, 0x3e, 0xa1, 0xba, 0xdd, 0x9e, +0x1d, 0x5a, 0x2b, 0xf7, 0xac, 0x1c, 0x99, 0x6c, 0x42, 0x94, 0x13, 0xb1, 0x82, 0x91, 0xcf, 0x78, +0x49, 0x3d, 0x66, 0xfc, 0xe3, 0xfe, 0x51, 0x3f, 0xb0, 0xef, 0x8f, 0x1e, 0x3f, 0x90, 0xf5, 0xc7, +0x88, 0x52, 0xa0, 0xe8, 0xcc, 0xe5, 0x53, 0x99, 0xa5, 0x0a, 0xe6, 0xbb, 0x0f, 0x04, 0x0d, 0x5b, +0x7a, 0xee, 0x69, 0xa1, 0xb5, 0xfe, 0x74, 0x4c, 0xbf, 0xef, 0x81, 0x36, 0x92, 0xc1, 0x2b, 0x5c, +0x7f, 0x80, 0xba, 0x17, 0xac, 0x2a, 0xfd, 0x56, 0x5e, 0x4c, 0x86, 0xeb, 0xa8, 0x37, 0xe7, 0xae, +0xf3, 0xe6, 0x8d, 0xca, 0x90, 0xa2, 0x01, 0x83, 0x5d, 0xca, 0x87, 0x22, 0xb1, 0xd7, 0xce, 0x50, +0x7e, 0x19, 0x8a, 0xc6, 0x30, 0xa9, 0x5c, 0x81, 0x12, 0x07, 0x30, 0x46, 0x0d, 0xa2, 0x80, 0xf3, +0x7f, 0x46, 0x3e, 0x2d, 0xad, 0x03, 0x45, 0xb6, 0x1e, 0x35, 0xb6, 0x08, 0x3e, 0x8c, 0x5c, 0x96, +0x23, 0xd6, 0xc5, 0x81, 0x60, 0x27, 0x82, 0x9a, 0x90, 0x75, 0x8c, 0xb0, 0x0e, 0x34, 0x84, 0xdd, +0x5b, 0x80, 0xff, 0x8d, 0x82, 0x16, 0x17, 0x26, 0xf6, 0xb2, 0xee, 0x40, 0x35, 0xfa, 0xc1, 0x44, +0x19, 0x20, 0x77, 0xd3, 0x48, 0x6f, 0xf2, 0xc9, 0x79, 0x57, 0x54, 0x63, 0xd2, 0x33, 0xed, 0xe4, +0x7b, 0xf5, 0xc8, 0x2c, 0xc7, 0x89, 0xa6, 0x59, 0xa5, 0x64, 0x88, 0xb8, 0xcf, 0x61, 0x17, 0xbd, +0x8b, 0x44, 0x2e, 0x1f, 0x76, 0xd1, 0xb1, 0x48, 0x04, 0x33, 0x15, 0xfe, 0xfe, 0x45, 0x24, 0xe1, +0x6d, 0x52, 0xad, 0x6f, 0xbd, 0x93, 0x7f, 0x8a, 0xdc, 0xf3, 0x6f, 0x9b, 0xef, 0x07, 0x84, 0x05, +0xa5, 0x35, 0x42, 0x94, 0x7e, 0x90, 0xa6, 0x66, 0x25, 0x33, 0xf6, 0x8f, 0x3d, 0xe2, 0xd7, 0x3c, +0x70, 0xbb, 0x7f, 0x00, 0x3b, 0x98, 0xbe, 0xef, 0xda, 0xec, 0xf1, 0x2f, 0x92, 0xa6, 0xf3, 0x2d, +0x88, 0xb0, 0xe6, 0xb4, 0xb4, 0xac, 0xe1, 0xc8, 0x34, 0xc4, 0x8b, 0x86, 0x67, 0x6c, 0x18, 0xc4, +0x04, 0xbe, 0xe0, 0xb8, 0xb7, 0x6e, 0x12, 0x17, 0xfe, 0x8a, 0x1a, 0x04, 0x8c, 0x7c, 0x76, 0x39, +0xa9, 0xfa, 0x7e, 0xbd, 0x76, 0x47, 0x87, 0xfd, 0x10, 0xd4, 0xa7, 0x35, 0x7e, 0x55, 0x72, 0xad, +0x55, 0x02, 0x05, 0xe0, 0xc8, 0xb2, 0xbb, 0x23, 0x95, 0x8b, 0x0e, 0x12, 0x1d, 0xe5, 0x62, 0x4b, +0xb3, 0xa6, 0x2c, 0xa8, 0x50, 0x24, 0x26, 0x30, 0xd6, 0xdd, 0xbd, 0x0c, 0x0b, 0x1f, 0xce, 0x21, +0x47, 0x2f, 0xcc, 0x22, 0x03, 0xc4, 0x6d, 0x72, 0xe3, 0x92, 0xba, 0x31, 0xc7, 0xc2, 0x8b, 0x71, +0x95, 0x95, 0x4c, 0x6a, 0xdc, 0xa6, 0xcd, 0x96, 0xc1, 0x6e, 0xe5, 0xbd, 0xbb, 0xb3, 0xf9, 0x7e, +0x8e, 0xd5, 0x71, 0x7c, 0x35, 0x02, 0x5f, 0x31, 0x4e, 0x03, 0xe7, 0xe2, 0x3e, 0x32, 0xde, 0xb8, +0x99, 0x4b, 0x52, 0x53, 0x13, 0x4d, 0xe5, 0x8f, 0xa9, 0xca, 0xc2, 0x10, 0x1e, 0x04, 0xb9, 0x9a, +0xfd, 0xf1, 0x6a, 0x1e, 0x44, 0xe6, 0x9d, 0xfd, 0x66, 0x6c, 0x30, 0x73, 0x61, 0x2a, 0x6b, 0xb2, +0xc1, 0x3c, 0xa2, 0x6a, 0x3a, 0x98, 0xb4, 0x6e, 0x86, 0xc9, 0xd7, 0xe4, 0xf4, 0x50, 0x42, 0x8f, +0xf4, 0xfd, 0xc4, 0xac, 0x14, 0x90, 0x6f, 0x56, 0xe7, 0x4d, 0x18, 0xd4, 0x9b, 0xaa, 0x58, 0x65, +0x15, 0xa1, 0xfa, 0xbf, 0xff, 0x4d, 0x94, 0x59, 0x55, 0x7d, 0x56, 0xbd, 0x30, 0xaf, 0x3d, 0x75, +0x9b, 0x75, 0x3d, 0x60, 0x9e, 0x55, 0xd3, 0x67, 0x35, 0x72, 0xb5, 0xc9, 0x10, 0x7c, 0xef, 0x26, +0xb0, 0x36, 0x27, 0x81, 0xd4, 0x72, 0x57, 0x67, 0x9c, 0x5d, 0xdc, 0x4b, 0xce, 0x5d, 0xc1, 0xb6, +0x62, 0x4a, 0x8c, 0x9a, 0xb1, 0x2d, 0x96, 0x5b, 0xf5, 0x3d, 0x69, 0x47, 0xd4, 0xba, 0x7b, 0xbf, +0x20, 0x84, 0x46, 0x0a, 0xa1, 0xf6, 0x48, 0x08, 0x9b, 0x29, 0x84, 0xc6, 0x23, 0x21, 0x6c, 0xa5, +0x10, 0x36, 0x17, 0x82, 0xf0, 0xe3, 0xd5, 0xd3, 0x4a, 0xfc, 0xc8, 0x58, 0xc1, 0x59, 0x0b, 0x02, +0xfb, 0xfa, 0x9a, 0x91, 0x72, 0xf6, 0x04, 0x4f, 0xf2, 0x39, 0xa8, 0x95, 0x87, 0xd3, 0x65, 0x70, +0x3b, 0xbe, 0x45, 0x79, 0xbf, 0x68, 0xf5, 0x94, 0xe5, 0x3d, 0xa6, 0xfe, 0x04, 0xdf, 0xcb, 0x03, +0xe0, 0x47, 0x2e, 0x96, 0xaa, 0x60, 0x80, 0x79, 0x80, 0x67, 0x71, 0xc1, 0xc7, 0xd5, 0x1f, 0x63, +0x85, 0xf3, 0x00, 0xfc, 0xd0, 0x1c, 0x18, 0x2a, 0xcf, 0xa1, 0x32, 0x34, 0x12, 0xa6, 0x2b, 0x60, +0xa7, 0x51, 0x2d, 0x00, 0x2d, 0x49, 0x28, 0x22, 0x62, 0x18, 0x4c, 0xdd, 0x60, 0x87, 0x3d, 0xad, +0x22, 0x41, 0x97, 0x9f, 0x6b, 0xae, 0x25, 0xb5, 0xb8, 0xb2, 0x53, 0x4c, 0x95, 0x26, 0xe3, 0xfa, +0xdb, 0xb7, 0xf5, 0x6f, 0x63, 0x71, 0x20, 0x4a, 0xdf, 0xbe, 0x95, 0xff, 0x22, 0xc3, 0x40, 0x40, +0xfe, 0xe4, 0x95, 0xff, 0x42, 0x41, 0xd5, 0x2b, 0x49, 0xa2, 0xdf, 0xf1, 0x84, 0x59, 0xbd, 0x75, +0xba, 0x1e, 0x4d, 0xd1, 0xf8, 0x11, 0x15, 0xfc, 0xc2, 0xf0, 0xf2, 0xa7, 0xfc, 0x01, 0x85, 0x0b, +0x7c, 0x40, 0x81, 0x98, 0x5f, 0xc3, 0x02, 0x64, 0xa0, 0xf7, 0xc1, 0x35, 0x74, 0x08, 0xba, 0xd1, +0x2a, 0xea, 0x61, 0x8a, 0x01, 0xa7, 0x87, 0x5b, 0x08, 0x91, 0x43, 0x13, 0x39, 0x38, 0x7a, 0x1c, +0xb3, 0x16, 0xc8, 0xd8, 0xe4, 0x4d, 0x1e, 0x82, 0xc1, 0x6f, 0x1e, 0x37, 0xf8, 0x2a, 0x48, 0xd8, +0x0b, 0xdf, 0x51, 0xc4, 0x5f, 0xb9, 0x21, 0xd7, 0x77, 0x5f, 0xbb, 0x2d, 0xc8, 0xdf, 0x12, 0x08, +0x64, 0xf1, 0x33, 0xb0, 0xa3, 0x2d, 0x5c, 0x98, 0xda, 0xb3, 0x58, 0x1b, 0xf5, 0x21, 0x33, 0xa2, +0xa5, 0x84, 0xc6, 0x89, 0x39, 0xa1, 0x85, 0x16, 0xd8, 0xe1, 0x32, 0x3b, 0x58, 0x66, 0x96, 0x1d, +0x43, 0x23, 0x4d, 0x5d, 0xbd, 0x52, 0x64, 0x45, 0xd1, 0xb1, 0x8f, 0x4e, 0x0b, 0x2d, 0xed, 0xc9, +0xad, 0x70, 0x02, 0xc0, 0x96, 0xbf, 0x5f, 0x57, 0x79, 0x6f, 0x75, 0x84, 0xca, 0xc0, 0x95, 0xc2, +0x7e, 0xdc, 0x35, 0x35, 0x5b, 0xd6, 0x3a, 0x81, 0x9d, 0xea, 0xbc, 0x63, 0x5a, 0x4e, 0x97, 0xdf, +0xaf, 0x2b, 0x2d, 0xd4, 0xf8, 0x81, 0x54, 0x41, 0x81, 0xfc, 0x7e, 0x5d, 0x07, 0x42, 0xbc, 0x6e, +0x15, 0xc9, 0x54, 0xa6, 0xa4, 0xca, 0xef, 0xd7, 0x8d, 0xd6, 0x2c, 0xed, 0x69, 0x9b, 0x2a, 0x64, +0xac, 0x37, 0x57, 0xb5, 0x85, 0xcc, 0xe0, 0xce, 0x73, 0x74, 0x7e, 0xcd, 0x0e, 0x7e, 0xe6, 0xc1, +0x48, 0x18, 0x8f, 0xed, 0x71, 0x73, 0x0e, 0x63, 0x13, 0x6c, 0xbb, 0x23, 0xc6, 0xaa, 0xb5, 0x2f, +0x3c, 0xc2, 0xce, 0xf0, 0xfd, 0xba, 0xa6, 0xdb, 0x4d, 0x2c, 0x64, 0x70, 0x98, 0xcb, 0xce, 0xd5, +0x83, 0xc6, 0x2e, 0x30, 0x42, 0xc9, 0x3e, 0xae, 0xd7, 0xe7, 0x6a, 0x8e, 0x85, 0x0a, 0xb9, 0x77, +0xc1, 0x0e, 0xf5, 0xa6, 0xb7, 0x8a, 0xb2, 0x7f, 0x78, 0x57, 0x17, 0xfe, 0x3b, 0xa4, 0xde, 0x68, +0x77, 0x28, 0x6e, 0x00, 0x4a, 0x43, 0xdb, 0x1b, 0xc3, 0x61, 0xb9, 0x62, 0x63, 0x68, 0xfc, 0x6a, +0x64, 0xec, 0x9b, 0xa9, 0x97, 0x71, 0xb6, 0xcf, 0x0c, 0x96, 0x59, 0x1b, 0x65, 0xce, 0xb1, 0xa1, +0x33, 0x34, 0xa1, 0xbc, 0x7c, 0x5e, 0x5b, 0xa8, 0x3b, 0xf8, 0xe4, 0x05, 0x6d, 0x9d, 0xb5, 0x22, +0xd5, 0x0f, 0x18, 0xf3, 0xbd, 0x9e, 0x78, 0x65, 0xa4, 0x88, 0x7b, 0x6d, 0xf1, 0x8d, 0x2b, 0x6e, +0xf4, 0xb2, 0x06, 0xe4, 0x88, 0x37, 0x3d, 0x78, 0x86, 0x08, 0x4a, 0x0e, 0xc9, 0xe2, 0xab, 0xa5, +0x99, 0x19, 0xb5, 0x03, 0x11, 0xf3, 0x1d, 0x72, 0x81, 0xb6, 0x0b, 0xf0, 0x5f, 0xea, 0x93, 0x81, +0x7c, 0xc6, 0x45, 0x3e, 0xf3, 0x7e, 0x4e, 0xaf, 0x0d, 0x0c, 0xac, 0xcf, 0x37, 0xcf, 0xec, 0x9d, +0x06, 0xf8, 0x4c, 0x5f, 0x21, 0xe0, 0x22, 0x02, 0x0b, 0x2c, 0xde, 0x23, 0x11, 0xb9, 0x1f, 0x84, +0x34, 0xeb, 0xd7, 0xc8, 0x2a, 0xca, 0x78, 0x6f, 0x04, 0x39, 0xb8, 0x2e, 0x5b, 0xb9, 0x6c, 0x24, +0x29, 0xcc, 0xb1, 0x28, 0xf7, 0x2a, 0xa8, 0x63, 0xd9, 0x39, 0x0f, 0x1b, 0xd9, 0x89, 0x5e, 0x73, +0x18, 0xe7, 0x9d, 0x61, 0x7e, 0xd9, 0x1e, 0x11, 0xc3, 0xbf, 0x6e, 0xa4, 0xa0, 0xbf, 0xe6, 0x2f, +0x05, 0xa3, 0x1b, 0x03, 0xfe, 0xcb, 0x52, 0xc4, 0xc3, 0xea, 0x90, 0x26, 0xbe, 0x56, 0x3c, 0xb1, +0x59, 0x98, 0x63, 0xef, 0xf5, 0xaa, 0x70, 0xc6, 0x32, 0x16, 0x04, 0xe6, 0x58, 0xd1, 0x1d, 0xbe, +0x68, 0xa0, 0x04, 0x88, 0x99, 0x37, 0x3d, 0xcc, 0x5d, 0x74, 0x72, 0x01, 0x90, 0xc3, 0x83, 0x1a, +0xa8, 0x67, 0x17, 0xf3, 0x6f, 0x44, 0x74, 0x01, 0x05, 0x6c, 0xcd, 0xf1, 0x49, 0x0a, 0x3f, 0x7d, +0x2d, 0x0e, 0x81, 0x2b, 0x8d, 0x8a, 0xaf, 0x59, 0x3b, 0x50, 0x04, 0xaf, 0xba, 0xea, 0x8f, 0xcd, +0xe5, 0x54, 0x18, 0x86, 0xc6, 0x41, 0x21, 0xeb, 0x1c, 0x67, 0xf4, 0xea, 0x9b, 0xe6, 0x14, 0xc8, +0x42, 0x3d, 0x02, 0xe4, 0xaf, 0x43, 0xf1, 0x50, 0xc2, 0x38, 0x41, 0x97, 0x3c, 0xf8, 0xf7, 0x2b, +0x6d, 0x0b, 0x85, 0x05, 0x7e, 0xc8, 0x6b, 0xf9, 0xf8, 0xfd, 0x25, 0x64, 0x61, 0x93, 0x31, 0x95, +0x05, 0x66, 0x56, 0xa1, 0x86, 0x9d, 0x2e, 0x79, 0x1a, 0x05, 0x65, 0x44, 0xe3, 0xa9, 0x57, 0xd9, +0x66, 0xa6, 0x27, 0x19, 0xd3, 0xa7, 0xba, 0x77, 0xa8, 0x50, 0x71, 0x4d, 0x6a, 0x34, 0xa6, 0x16, +0xf9, 0x85, 0x98, 0x55, 0xb2, 0xb3, 0x43, 0xdc, 0x02, 0xdb, 0x84, 0xa7, 0x3f, 0xd4, 0x9a, 0x00, +0xf0, 0x75, 0xa1, 0xe6, 0x1c, 0xb4, 0x39, 0x6e, 0xf8, 0x4b, 0xac, 0x4c, 0x25, 0xb1, 0xae, 0xdd, +0x16, 0x3b, 0xdb, 0x51, 0x98, 0xb1, 0x67, 0x75, 0x79, 0x47, 0x32, 0xfb, 0x52, 0xa9, 0x44, 0xbd, +0xc2, 0x02, 0xeb, 0x9f, 0xbd, 0xb0, 0xe5, 0xda, 0x3a, 0x1e, 0xc0, 0xca, 0x9c, 0x59, 0x03, 0x96, +0xff, 0x5e, 0x9d, 0x7d, 0xd4, 0xbc, 0xc8, 0xca, 0xbe, 0x04, 0xa6, 0x20, 0xf2, 0x67, 0x0a, 0x30, +0x0f, 0xc1, 0x09, 0x87, 0x12, 0xc5, 0xe9, 0x00, 0xf7, 0x38, 0x05, 0xaa, 0x94, 0xf2, 0xc5, 0x34, +0x12, 0x10, 0x7e, 0x26, 0x6a, 0xeb, 0xd5, 0xfc, 0xc7, 0xb2, 0x9c, 0xdd, 0xb1, 0x17, 0x9e, 0x8f, +0xc3, 0xdc, 0x52, 0x2d, 0x14, 0x46, 0x5f, 0xf8, 0x12, 0xa2, 0x8c, 0xbf, 0x97, 0x0b, 0x29, 0x7c, +0xd2, 0x79, 0x1a, 0x7b, 0x29, 0x16, 0x39, 0x23, 0xfe, 0x3b, 0x4a, 0xab, 0x89, 0xb4, 0x9a, 0x4c, +0x93, 0x6f, 0x83, 0x42, 0xf2, 0xad, 0xf8, 0xd4, 0x31, 0x46, 0x69, 0xe8, 0x7f, 0x3d, 0xc6, 0xf7, +0xf4, 0x0a, 0xcd, 0x12, 0xd8, 0x68, 0x26, 0xe2, 0x8e, 0x07, 0x3a, 0x94, 0xa5, 0x97, 0x63, 0xd9, +0x3c, 0xe2, 0x0e, 0xcb, 0xef, 0xf7, 0x6e, 0xd2, 0x48, 0x4c, 0x46, 0xbe, 0x55, 0x87, 0x87, 0xdc, +0x69, 0xa8, 0xbb, 0x71, 0x8f, 0x4e, 0x8d, 0xb6, 0x2c, 0x0f, 0x52, 0xd2, 0x4a, 0xb0, 0x5e, 0x94, +0x6a, 0x50, 0xaa, 0xc3, 0x2c, 0x30, 0xd8, 0x2c, 0x17, 0xa5, 0x69, 0x0a, 0x91, 0xf4, 0xd1, 0x66, +0x41, 0x67, 0xf9, 0x3c, 0xb3, 0xa0, 0xa8, 0x90, 0xc6, 0x42, 0x3b, 0xb0, 0x94, 0x34, 0x36, 0x28, +0x6e, 0xf6, 0xe4, 0x37, 0xcb, 0x61, 0x71, 0x32, 0x21, 0xb5, 0x1f, 0xa7, 0xb5, 0xb9, 0xdc, 0x64, +0x42, 0x13, 0x7f, 0xf3, 0x00, 0x8a, 0xb8, 0x4b, 0x61, 0x1f, 0x2c, 0x4d, 0xad, 0x6a, 0x3d, 0x42, +0x53, 0xc1, 0x38, 0x70, 0xa0, 0xa7, 0x2c, 0x83, 0x44, 0x32, 0xbc, 0x05, 0xa7, 0x91, 0x26, 0x1f, +0x15, 0x41, 0xf5, 0x00, 0xff, 0x65, 0x63, 0x92, 0x2f, 0x6d, 0x4c, 0x20, 0x2e, 0x7d, 0x5d, 0xe2, +0x89, 0x03, 0x5d, 0xca, 0x08, 0x9b, 0x7d, 0x5f, 0x37, 0xc2, 0x4c, 0xe1, 0xce, 0x23, 0xb3, 0xcf, +0x34, 0x6f, 0x78, 0x56, 0xb2, 0xb0, 0xa2, 0xc0, 0x03, 0x9a, 0x2b, 0x60, 0x41, 0xea, 0xe2, 0xb0, +0xc6, 0xe3, 0x5c, 0x2b, 0x15, 0x1a, 0x37, 0x66, 0xe1, 0xb6, 0xed, 0x40, 0x29, 0x5b, 0xf9, 0x1d, +0x82, 0x98, 0x89, 0xd7, 0x39, 0x2d, 0xb1, 0x80, 0xe3, 0x6a, 0xed, 0x63, 0x96, 0x1d, 0xec, 0x92, +0xcd, 0x4a, 0xa6, 0x18, 0x8e, 0x71, 0x53, 0x34, 0xe5, 0xf8, 0x8a, 0xbb, 0x7c, 0xb4, 0x45, 0x61, +0x84, 0x2d, 0x7c, 0xf4, 0x04, 0x48, 0xc6, 0x74, 0x99, 0x1c, 0x66, 0x43, 0x09, 0xb0, 0x03, 0x2d, +0x52, 0x06, 0xd0, 0x85, 0x42, 0xa1, 0x30, 0xef, 0x80, 0x37, 0x93, 0x10, 0x78, 0x6c, 0x2d, 0x84, +0xcb, 0x77, 0x78, 0x45, 0x12, 0x33, 0xfd, 0xe3, 0x51, 0x3e, 0x8d, 0x21, 0x03, 0xa6, 0x52, 0x89, +0xe4, 0xf5, 0xca, 0xeb, 0x35, 0x8f, 0x3a, 0x15, 0x3c, 0x53, 0x83, 0x94, 0x13, 0xf1, 0xb9, 0x9f, +0x10, 0x8f, 0x5a, 0x80, 0xfe, 0xc0, 0x1f, 0x05, 0xbe, 0x63, 0x21, 0x46, 0xa3, 0xc0, 0xe9, 0xdb, +0xa0, 0x22, 0xad, 0xe1, 0x0a, 0xc2, 0xaa, 0xd5, 0x51, 0x55, 0xf6, 0x79, 0xfa, 0xdb, 0xd5, 0x15, +0xce, 0x9d, 0xcf, 0x5e, 0xf0, 0x5d, 0xd3, 0x6d, 0x94, 0x42, 0x5c, 0xad, 0xd8, 0x07, 0xdd, 0x2c, +0xd0, 0x27, 0xd8, 0x2c, 0x32, 0xfc, 0x1d, 0x1e, 0x61, 0x8f, 0x08, 0x7f, 0x96, 0x3d, 0x02, 0x08, +0xcf, 0x0c, 0x81, 0x6d, 0x00, 0x6d, 0x19, 0xa0, 0xf8, 0x60, 0x84, 0x07, 0x03, 0x69, 0x0c, 0xa9, +0x00, 0x6d, 0x69, 0xe3, 0x51, 0x1f, 0xb6, 0x79, 0x99, 0x7a, 0x6d, 0xbd, 0x59, 0x67, 0x85, 0x38, +0x91, 0x5c, 0x1b, 0x76, 0xd7, 0x0d, 0xd9, 0x36, 0x01, 0x2d, 0x70, 0xbc, 0x52, 0x7a, 0x9b, 0x76, +0x7b, 0x74, 0xfb, 0x9e, 0xdb, 0x53, 0x43, 0x58, 0x33, 0xad, 0x9f, 0x61, 0xe7, 0x58, 0x6c, 0x76, +0xc7, 0xd0, 0x49, 0x66, 0xa6, 0x96, 0x64, 0xce, 0xad, 0xaa, 0xaa, 0x72, 0x62, 0x11, 0x8c, 0x81, +0x51, 0x0a, 0xc3, 0xc0, 0xb3, 0x22, 0x37, 0x19, 0x1a, 0x19, 0x73, 0x3c, 0x1f, 0xea, 0x3b, 0x04, +0xf8, 0x6a, 0xde, 0xec, 0x8a, 0x85, 0xf2, 0x19, 0xd8, 0xde, 0x3e, 0xbb, 0x14, 0x84, 0xbe, 0x92, +0x93, 0x57, 0xb4, 0xf8, 0xc4, 0xac, 0x4d, 0xa5, 0xae, 0x65, 0xcc, 0x92, 0x3a, 0x47, 0x51, 0xa1, +0xb0, 0x80, 0xbc, 0x8d, 0x3a, 0x97, 0x96, 0xe3, 0x06, 0x9c, 0x0d, 0xc1, 0x5f, 0xc0, 0x95, 0x96, +0xc0, 0x8e, 0xa2, 0x4e, 0xad, 0xa1, 0xdb, 0x9f, 0x51, 0x9f, 0x5f, 0x79, 0x31, 0x0d, 0x3f, 0xea, +0xa4, 0x4e, 0x06, 0xdc, 0xb4, 0xcf, 0xff, 0x06, 0xe2, 0x6e, 0xa3, 0xe4, 0x9e, 0x28, 0x30, 0xf2, +0x34, 0x53, 0x79, 0xf0, 0xf9, 0xd3, 0x42, 0x87, 0x32, 0x49, 0x36, 0xdf, 0xd5, 0x8f, 0x98, 0xaf, +0x96, 0xca, 0x73, 0xe6, 0x7a, 0x98, 0xa5, 0xec, 0xc6, 0x38, 0xbb, 0xfc, 0x58, 0x6b, 0x48, 0x37, +0x8b, 0x7c, 0x44, 0xa9, 0xf7, 0x3a, 0xa3, 0x7e, 0x7e, 0xf2, 0x50, 0x1d, 0xce, 0x74, 0x94, 0xbc, +0x48, 0xcd, 0xb2, 0x47, 0x22, 0xc5, 0x8e, 0x85, 0x54, 0x38, 0x88, 0xb9, 0xa0, 0xb0, 0xa9, 0x4c, +0xa0, 0x3c, 0xc1, 0x8d, 0x7e, 0x13, 0x29, 0xc7, 0xf0, 0xa5, 0x92, 0x12, 0x3f, 0x98, 0x5b, 0xfc, +0xf2, 0x9b, 0xc2, 0xa4, 0xd8, 0xf6, 0xee, 0x44, 0x5a, 0x13, 0x3f, 0x59, 0x62, 0x2f, 0x88, 0x5d, +0x91, 0x78, 0x8a, 0x9f, 0x3c, 0xd1, 0x8d, 0x03, 0x99, 0x88, 0x9f, 0xca, 0x9e, 0xfe, 0xf1, 0x25, +0x1c, 0x68, 0x67, 0x49, 0xf0, 0x05, 0xba, 0x13, 0x1d, 0x58, 0x31, 0x35, 0x0b, 0x7f, 0x4e, 0x79, +0x07, 0x4c, 0xec, 0x0f, 0x20, 0xf2, 0x96, 0xc2, 0x58, 0x54, 0xd3, 0x6c, 0xf0, 0xc3, 0xc8, 0x13, +0x3a, 0x00, 0x64, 0x2d, 0xce, 0x58, 0x16, 0x98, 0x5d, 0x9c, 0x59, 0xc6, 0xec, 0x59, 0x8b, 0xc6, +0x3c, 0x52, 0x65, 0x87, 0x96, 0x78, 0x0b, 0xf9, 0xf4, 0xf8, 0x0c, 0x0f, 0x13, 0xf1, 0xca, 0x0c, +0x60, 0x8a, 0x3a, 0x05, 0xdd, 0x39, 0xe9, 0x44, 0x4d, 0xbc, 0x9c, 0x7c, 0x72, 0xfe, 0x35, 0x57, +0x59, 0xbc, 0x40, 0xfe, 0xf9, 0xf8, 0xd3, 0xe7, 0x5c, 0x85, 0xf1, 0x36, 0xf9, 0xe9, 0xfe, 0xaf, +0xc4, 0xa4, 0x0f, 0xb0, 0x32, 0x5c, 0x94, 0x63, 0x96, 0x37, 0x1d, 0xc1, 0x64, 0x86, 0x46, 0xc4, +0x51, 0x75, 0x88, 0x43, 0xbf, 0xf1, 0x18, 0xb2, 0x97, 0x22, 0xbd, 0x33, 0x37, 0x93, 0x19, 0xb2, +0xfc, 0xa0, 0x97, 0x8c, 0xc9, 0xf2, 0x27, 0xcb, 0x70, 0xbb, 0x97, 0xcc, 0x17, 0xe1, 0x50, 0x28, +0x5b, 0x84, 0x8f, 0x17, 0xf8, 0xf3, 0x89, 0xf0, 0x83, 0xd3, 0xab, 0x5a, 0xbd, 0x52, 0xd9, 0x7f, +0x1e, 0x29, 0xae, 0x17, 0x96, 0x63, 0x72, 0x0f, 0xa8, 0x62, 0x24, 0xfa, 0x62, 0x20, 0x0f, 0x29, +0x0f, 0xf1, 0x93, 0x0b, 0xd2, 0xb8, 0x9d, 0x8a, 0xd6, 0x36, 0x4f, 0xea, 0x8c, 0xd2, 0x3e, 0xda, +0x32, 0xf1, 0x36, 0x74, 0x83, 0xba, 0x48, 0xfd, 0xc4, 0xbe, 0xff, 0x14, 0x9b, 0xbe, 0xe7, 0x16, +0x89, 0x4f, 0x93, 0x77, 0x85, 0x67, 0xdc, 0xe0, 0x4d, 0xfe, 0xca, 0x34, 0x7a, 0xb1, 0x93, 0x97, +0xbc, 0x96, 0xbd, 0x98, 0x46, 0x47, 0x3e, 0x3b, 0x0a, 0xec, 0x06, 0xf7, 0x37, 0x1e, 0x6c, 0x8b, +0x6e, 0x58, 0x68, 0x60, 0x7e, 0x4c, 0x48, 0xa3, 0xc3, 0xf6, 0x2d, 0x3f, 0x41, 0x6c, 0xf7, 0x6f, +0x9f, 0x64, 0xc7, 0x9b, 0x64, 0x38, 0x8f, 0x38, 0x15, 0x84, 0xce, 0x70, 0xcb, 0xe2, 0xac, 0x2d, +0x6d, 0x64, 0x68, 0x5c, 0xc0, 0x38, 0x28, 0x1e, 0x5b, 0xc8, 0xc7, 0xc1, 0xa7, 0xce, 0xa1, 0xd3, +0x67, 0x04, 0x8a, 0x64, 0x32, 0x60, 0xfe, 0x23, 0x10, 0xa4, 0xc2, 0x4e, 0x4b, 0xe3, 0xf1, 0x9e, +0x29, 0x44, 0xd2, 0xa0, 0xf0, 0x0a, 0x62, 0x2a, 0x97, 0xff, 0x7e, 0x74, 0x74, 0xc1, 0xae, 0x3d, +0x91, 0x20, 0x72, 0x40, 0x63, 0x79, 0xfd, 0xfa, 0xb5, 0xb2, 0x89, 0xb1, 0x5d, 0x00, 0x46, 0xae, +0x40, 0x1e, 0xc4, 0x83, 0xe1, 0x4b, 0xbe, 0x86, 0xe4, 0x91, 0xa6, 0xb2, 0x1f, 0x82, 0xb3, 0x8d, +0x8a, 0x8a, 0x5d, 0x83, 0x63, 0x8f, 0xca, 0xd9, 0x3c, 0x29, 0xa2, 0x31, 0x4d, 0xd2, 0xd4, 0x28, +0x4e, 0x94, 0x7c, 0x4d, 0xc9, 0x6d, 0xf9, 0xe1, 0xdb, 0xf5, 0x5a, 0xbb, 0x1f, 0x0f, 0x53, 0x08, +0x6d, 0xf8, 0x56, 0x9d, 0x23, 0x3c, 0x07, 0xab, 0x1c, 0xb9, 0xf1, 0xdc, 0xe0, 0xa1, 0x20, 0xb2, +0x9c, 0xff, 0xdf, 0x50, 0x3c, 0xca, 0x80, 0x56, 0xfd, 0x39, 0xfc, 0x55, 0xb1, 0x4a, 0xc8, 0x1d, +0xa5, 0x21, 0x91, 0x41, 0x5d, 0x70, 0x8c, 0x31, 0xb9, 0x8d, 0x82, 0x7e, 0x48, 0x1d, 0xf5, 0x7d, +0xd0, 0x30, 0xe1, 0xab, 0xa5, 0xc2, 0x7c, 0x51, 0x7c, 0xee, 0x5f, 0x81, 0x0a, 0x71, 0xf3, 0x73, +0xb5, 0x5a, 0xd9, 0x24, 0xd5, 0x52, 0xfd, 0x9b, 0x41, 0xaa, 0xb5, 0xad, 0x5f, 0x37, 0x1b, 0x2c, +0x0f, 0xa3, 0x21, 0x35, 0x9b, 0x87, 0xd5, 0x3a, 0x64, 0x56, 0x4a, 0x9b, 0x9b, 0x90, 0xbb, 0xd9, +0xf8, 0xb5, 0xb1, 0x45, 0xcc, 0xaf, 0x14, 0x76, 0xcb, 0xfc, 0x95, 0x8f, 0x66, 0x17, 0x1d, 0x0a, +0x0b, 0xac, 0x42, 0x63, 0xa2, 0xc2, 0xbb, 0xaa, 0x00, 0x57, 0xe7, 0x67, 0x94, 0xd5, 0xc9, 0xdc, +0xcd, 0xc9, 0xc6, 0x36, 0xd3, 0xdc, 0x77, 0xa4, 0x56, 0x6a, 0xd4, 0x26, 0x73, 0xeb, 0xac, 0xcf, +0x77, 0xae, 0xb5, 0x51, 0xc5, 0x28, 0x74, 0x79, 0x16, 0x22, 0x8e, 0x57, 0x2c, 0x44, 0x16, 0xc1, +0x8e, 0x5e, 0x58, 0x21, 0x9e, 0x83, 0xe5, 0x59, 0x82, 0xcc, 0xdd, 0x40, 0x3c, 0x54, 0x03, 0x38, +0x63, 0xfb, 0x19, 0xb6, 0x88, 0x01, 0xcd, 0xe8, 0x8b, 0x0a, 0xa0, 0x8b, 0xe9, 0x29, 0x06, 0x4f, +0x6d, 0x2d, 0x72, 0x2f, 0x29, 0x7d, 0x04, 0xa7, 0xf0, 0xfc, 0xbb, 0x42, 0xde, 0x8f, 0x27, 0x6e, +0x07, 0x53, 0x6c, 0x3d, 0x45, 0x51, 0x95, 0x30, 0x66, 0x7d, 0xd2, 0xe4, 0x85, 0x9f, 0x39, 0x37, +0x75, 0xd0, 0xcd, 0xf4, 0x50, 0x88, 0x16, 0x93, 0xaf, 0xd2, 0x34, 0xb6, 0x00, 0x2d, 0xf1, 0x60, +0xcf, 0x5c, 0x1c, 0x17, 0x72, 0x7a, 0x27, 0x4f, 0x2c, 0x9a, 0xca, 0x2f, 0x0e, 0xbd, 0x7d, 0x9f, +0x2e, 0x9b, 0xea, 0x96, 0x4c, 0xc8, 0x43, 0x8e, 0xd3, 0x24, 0x09, 0x00, 0xde, 0xc9, 0xfa, 0x1a, +0x2f, 0x8e, 0xb1, 0xe2, 0x48, 0xff, 0xb5, 0xb7, 0x19, 0xe5, 0x17, 0xa3, 0x3d, 0x7c, 0x4e, 0xe9, +0x05, 0x90, 0x1e, 0x74, 0x83, 0x5d, 0x2a, 0x7b, 0x3a, 0xf9, 0x8d, 0x56, 0x68, 0x14, 0x24, 0x8a, +0x15, 0x8a, 0xa9, 0xad, 0xc2, 0x93, 0x6c, 0xa1, 0x99, 0x9e, 0x5b, 0xe9, 0x1b, 0x3c, 0xb3, 0x1a, +0xdf, 0x28, 0x4f, 0x41, 0x26, 0x0a, 0x8a, 0x45, 0xcf, 0x03, 0xc9, 0x55, 0x16, 0xb8, 0x38, 0x3f, +0x05, 0x25, 0x5d, 0x8f, 0x8a, 0xa5, 0x02, 0xb2, 0x83, 0x05, 0x4a, 0xa7, 0xa8, 0x61, 0x90, 0x9e, +0x15, 0xb2, 0x10, 0x58, 0xd4, 0xb2, 0xbb, 0x13, 0xe2, 0xa4, 0xa4, 0xaa, 0x78, 0x8c, 0x2f, 0xe3, +0x20, 0xd9, 0xc4, 0x18, 0x93, 0xb0, 0xe3, 0x3e, 0x30, 0x18, 0x56, 0x14, 0x41, 0x25, 0x33, 0xa6, +0x34, 0x55, 0xcc, 0x0a, 0xaa, 0xda, 0x2f, 0x45, 0x6b, 0xe3, 0x87, 0xcb, 0x68, 0xd4, 0x85, 0xc1, +0xf3, 0x20, 0x09, 0xf0, 0x65, 0x6a, 0x1c, 0xfd, 0x61, 0xed, 0x4f, 0x04, 0x8f, 0x82, 0x86, 0xca, +0x65, 0x8c, 0x9a, 0xf6, 0x4a, 0x67, 0x8f, 0x82, 0xff, 0xaa, 0x93, 0xc5, 0x85, 0xe0, 0xbb, 0xe1, +0x32, 0xed, 0x95, 0xce, 0x38, 0xa5, 0xa8, 0xc8, 0x84, 0x73, 0x66, 0xbd, 0xba, 0xa8, 0x27, 0xea, +0xf2, 0x7a, 0x17, 0x07, 0x87, 0x5b, 0x1b, 0x8d, 0xc6, 0xcd, 0x16, 0x93, 0xd8, 0xd0, 0x5d, 0x21, +0x3c, 0xd5, 0x20, 0x1a, 0xf3, 0xfa, 0x5c, 0xaf, 0xa9, 0x2b, 0x6e, 0xcc, 0xa9, 0xf8, 0xa0, 0xeb, +0xf4, 0xa6, 0xbe, 0xe2, 0xbb, 0xcc, 0x8a, 0x28, 0xcc, 0xd3, 0xe1, 0xc2, 0xff, 0x5a, 0x2d, 0xa8, +0xc8, 0x85, 0xfb, 0xab, 0x1c, 0x4b, 0x5b, 0xe1, 0x20, 0xc4, 0x54, 0xf6, 0x1c, 0xa1, 0xde, 0xd2, +0x0b, 0x0f, 0xfa, 0x03, 0x2e, 0xa9, 0x50, 0x03, 0x44, 0xd8, 0x1a, 0x81, 0x76, 0x58, 0x18, 0x05, +0x04, 0x7c, 0xaf, 0xf3, 0xc5, 0xe2, 0x74, 0x88, 0xc0, 0xcc, 0x74, 0xd9, 0xa2, 0xcf, 0x51, 0xc6, +0x55, 0x06, 0xdb, 0x93, 0x81, 0x1d, 0xd8, 0xab, 0x2e, 0xf9, 0x63, 0xc1, 0x71, 0xef, 0x40, 0xed, +0xc1, 0x8a, 0x80, 0x0d, 0x02, 0x78, 0x51, 0xc0, 0xf9, 0x5c, 0x1c, 0xb8, 0x77, 0xdd, 0x22, 0x21, +0x3e, 0x98, 0x17, 0x66, 0x61, 0x22, 0x10, 0xd2, 0x44, 0x50, 0x29, 0x33, 0x8d, 0x58, 0x64, 0xbe, +0x79, 0x93, 0xc0, 0x7e, 0x49, 0x44, 0xaa, 0x2a, 0x2c, 0xe2, 0x95, 0x65, 0x46, 0x41, 0xa0, 0xbc, +0x37, 0x3c, 0xe6, 0x29, 0xa7, 0x2b, 0x92, 0x7a, 0x23, 0x4a, 0x7f, 0x47, 0x2c, 0x78, 0x6d, 0xdc, +0xf2, 0x5f, 0x5a, 0xe1, 0x9e, 0xba, 0x48, 0xf3, 0xe2, 0xb1, 0x70, 0x32, 0xcd, 0x2c, 0x2d, 0x3d, +0x0c, 0x45, 0x15, 0xf6, 0xf3, 0xc6, 0x0d, 0xb3, 0x6b, 0x31, 0x8f, 0x33, 0x5e, 0x83, 0x79, 0x64, +0x65, 0x16, 0x46, 0x47, 0x2b, 0x5e, 0x16, 0x63, 0xe6, 0x64, 0xf7, 0xa6, 0xef, 0xcb, 0x8e, 0xf4, +0xfd, 0xec, 0xa2, 0xc2, 0xa7, 0x85, 0x97, 0x16, 0x3e, 0x29, 0xb0, 0xde, 0x27, 0x47, 0x7e, 0x3d, +0x7a, 0xee, 0x63, 0x26, 0x2f, 0xb3, 0xcb, 0xf2, 0xac, 0x9a, 0x57, 0x89, 0xf0, 0x1b, 0xd2, 0x46, +0x40, 0x96, 0xd8, 0xa0, 0xbe, 0x17, 0xa9, 0x95, 0x7d, 0xac, 0x17, 0x90, 0xb6, 0xe2, 0x56, 0x85, +0x01, 0x4d, 0x40, 0x91, 0x17, 0xaf, 0x32, 0x90, 0x25, 0x2d, 0x49, 0xbc, 0x86, 0x90, 0xf6, 0x4b, +0xe9, 0xe4, 0x64, 0x7c, 0x20, 0xe9, 0x34, 0x54, 0xc6, 0x50, 0x50, 0x86, 0x54, 0xc3, 0x07, 0x8f, +0x76, 0x8d, 0x1a, 0x8f, 0x28, 0xa5, 0x5d, 0xac, 0xec, 0x92, 0xfe, 0x52, 0xe2, 0x30, 0xc6, 0xea, +0xe8, 0x18, 0x62, 0x65, 0x48, 0x28, 0x2d, 0x21, 0x34, 0xc8, 0x9e, 0xfe, 0xce, 0x6b, 0xac, 0x0b, +0xa2, 0x18, 0xa2, 0x87, 0x15, 0x25, 0xfc, 0x79, 0x46, 0x22, 0x60, 0x1a, 0x85, 0x42, 0xc6, 0x4d, +0xb7, 0x91, 0xc4, 0xd2, 0x74, 0x64, 0x6e, 0xa0, 0xd2, 0xd9, 0xde, 0x4c, 0x43, 0x42, 0xa9, 0x95, +0xde, 0xb5, 0xc8, 0xc8, 0x64, 0xde, 0x70, 0x26, 0xca, 0x3a, 0x65, 0xa1, 0x08, 0x4a, 0x89, 0x42, +0xce, 0x87, 0x5e, 0x41, 0x3b, 0xae, 0x1f, 0x9a, 0x73, 0xff, 0xc5, 0x70, 0xe9, 0x07, 0x12, 0x81, +0x80, 0xa8, 0xbe, 0x9f, 0x3f, 0x26, 0x13, 0x60, 0x1f, 0xa8, 0xca, 0x5c, 0x3a, 0x31, 0x65, 0x18, +0x40, 0x47, 0x46, 0x62, 0xc4, 0xa3, 0xf6, 0xce, 0xc4, 0x7a, 0x15, 0x65, 0x4e, 0x2c, 0x76, 0xab, +0x73, 0x6e, 0x4c, 0x88, 0x62, 0x99, 0x63, 0x56, 0xc7, 0xef, 0x62, 0xeb, 0x72, 0x6c, 0x00, 0x3b, +0x65, 0xfe, 0x52, 0x91, 0x7c, 0xe2, 0xa8, 0x1d, 0x38, 0x43, 0x7c, 0xe3, 0xa8, 0x9b, 0xf4, 0xbc, +0xbd, 0x57, 0xff, 0x0b, 0x36, 0xc8, 0xe1, 0x4b, 0x9c, 0xc3, 0x00, 0x00}; +#endif /*__SETUP_HTML_H__*/ diff --git a/src/web/html/h/style_css.h b/src/web/html/h/style_css.h new file mode 100644 index 00000000..3bff2337 --- /dev/null +++ b/src/web/html/h/style_css.h @@ -0,0 +1,188 @@ +#ifndef __STYLE_CSS_H__ +#define __STYLE_CSS_H__ +#define style_css_len 2914 +const uint8_t style_css[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x9d, 0x1a, 0x69, 0x8f, 0xdb, 0xb8, +0xf5, 0xaf, 0x68, 0xd7, 0x58, 0x20, 0x13, 0x58, 0x5a, 0x5b, 0xb6, 0xc6, 0x87, 0xd0, 0xa2, 0x45, +0x8b, 0x7c, 0x6b, 0xd1, 0xaf, 0x45, 0x11, 0x2c, 0x28, 0x89, 0x1e, 0x73, 0xa3, 0x0b, 0x12, 0xed, +0x19, 0xef, 0xc0, 0xff, 0xbd, 0xef, 0xf1, 0x12, 0x29, 0xd1, 0x9a, 0x64, 0x27, 0x81, 0x25, 0xf3, +0xf1, 0x78, 0xf7, 0x45, 0x9f, 0x79, 0x55, 0x2e, 0x83, 0xac, 0x29, 0x6e, 0xc1, 0xfb, 0xa9, 0xa9, +0x79, 0x78, 0x22, 0x15, 0x2b, 0x6f, 0xc7, 0xbf, 0x77, 0x8c, 0x94, 0x69, 0x45, 0xba, 0x17, 0x56, +0x1f, 0x57, 0x69, 0x4b, 0x8a, 0x82, 0xd5, 0x2f, 0xf0, 0x76, 0xa6, 0xec, 0xe5, 0xcc, 0x8f, 0xeb, +0xd5, 0xea, 0x97, 0xb4, 0x62, 0x75, 0x68, 0x7f, 0xcf, 0x48, 0xfe, 0xed, 0xa5, 0x6b, 0x2e, 0x75, +0x11, 0xe6, 0x4d, 0xd9, 0x74, 0xc7, 0x2b, 0xe9, 0x3e, 0x85, 0x61, 0xf6, 0xf2, 0x94, 0xda, 0xdf, +0x4f, 0xf0, 0xfd, 0x7e, 0x8e, 0x83, 0x77, 0xb5, 0x6b, 0x58, 0xd2, 0x13, 0xee, 0xd0, 0xbe, 0xa5, +0xf7, 0xbe, 0x25, 0xf5, 0x32, 0x28, 0xd9, 0x32, 0x38, 0x6f, 0xe0, 0x49, 0x32, 0x0a, 0xe8, 0x9d, +0x18, 0x2d, 0x8b, 0x9e, 0xf2, 0xe0, 0x7d, 0xb2, 0x8d, 0x06, 0x2d, 0x03, 0x56, 0xb7, 0x17, 0xfe, +0x3f, 0x7e, 0x6b, 0xe9, 0x5f, 0xfa, 0x4b, 0x56, 0x31, 0xfe, 0x75, 0x19, 0x44, 0x19, 0xaf, 0x83, +0xf7, 0xac, 0xe9, 0x0a, 0xda, 0x85, 0x1d, 0x29, 0xd8, 0xa5, 0x3f, 0x6e, 0xf1, 0x18, 0x6b, 0xf2, +0x89, 0x95, 0xf4, 0x6b, 0xf0, 0xfe, 0xca, 0x0a, 0x7e, 0x96, 0x64, 0xdc, 0x39, 0x7d, 0xe3, 0xa4, +0xa3, 0x64, 0x7a, 0xde, 0x0c, 0x85, 0xf7, 0x45, 0xc9, 0xae, 0x34, 0x40, 0x02, 0xc6, 0xeb, 0x62, +0x80, 0x46, 0xbc, 0x69, 0x6b, 0x72, 0x05, 0x6c, 0xfc, 0x5b, 0x00, 0x4c, 0x6c, 0xd3, 0x36, 0x3d, +0xe3, 0xac, 0xa9, 0x8f, 0x27, 0xf6, 0x46, 0x8b, 0x14, 0x56, 0x01, 0xd3, 0x6d, 0xe4, 0xf4, 0x46, +0xc4, 0x73, 0x8a, 0x16, 0xd3, 0x1a, 0x88, 0x0c, 0xf0, 0x23, 0x45, 0x52, 0xc2, 0x82, 0xe6, 0x4d, +0x47, 0xc4, 0xae, 0x75, 0x53, 0xd3, 0x54, 0x08, 0xba, 0x67, 0x7f, 0xd0, 0xe3, 0x7a, 0x07, 0x73, +0x0a, 0xd6, 0xb7, 0x25, 0xb9, 0x1d, 0xb3, 0xb2, 0xc9, 0xbf, 0x01, 0x1d, 0xe3, 0x03, 0x16, 0xa7, +0xd3, 0xc9, 0x3a, 0x37, 0x62, 0x79, 0x03, 0x24, 0x4a, 0xcc, 0x84, 0xe8, 0x56, 0x16, 0x5f, 0x46, +0xe4, 0xb8, 0x7b, 0x1b, 0xe2, 0x48, 0xd6, 0x37, 0xe5, 0x85, 0x53, 0x6b, 0xdb, 0xe3, 0xb9, 0xb9, +0xd2, 0xee, 0x21, 0x7f, 0xda, 0x8e, 0x81, 0x36, 0xde, 0x42, 0x31, 0xeb, 0x29, 0xf8, 0x89, 0x55, +0x6d, 0xd3, 0x71, 0x52, 0xf3, 0x61, 0x8b, 0x88, 0xd5, 0xa7, 0xc6, 0xc7, 0x95, 0xc9, 0xa9, 0x9d, +0xd0, 0xd9, 0x58, 0x30, 0x08, 0xc8, 0x48, 0x50, 0x25, 0xcc, 0x2e, 0x55, 0x93, 0x81, 0x4a, 0x04, +0xef, 0x1a, 0x75, 0xc1, 0xb2, 0x7b, 0x7f, 0x7d, 0x51, 0x84, 0xc3, 0xf9, 0x9c, 0xe5, 0xa4, 0x0c, +0x49, 0xc9, 0x5e, 0xea, 0x63, 0xc5, 0x8a, 0xa2, 0xa4, 0x86, 0x50, 0x56, 0x97, 0xac, 0xa6, 0xa1, +0xa4, 0x57, 0xda, 0x4f, 0x88, 0x67, 0x84, 0xdb, 0x37, 0x23, 0x1e, 0x38, 0x2f, 0x00, 0xc6, 0x07, +0xf8, 0x14, 0x5a, 0x2f, 0x76, 0x0e, 0x25, 0xfa, 0xa0, 0x8f, 0xa5, 0xc2, 0x1e, 0x07, 0x9e, 0x34, +0xf4, 0x95, 0x74, 0xb5, 0x03, 0xc5, 0x01, 0x03, 0xed, 0x2f, 0x79, 0x4e, 0xfb, 0xde, 0x99, 0xa0, +0xc6, 0x70, 0xce, 0x2b, 0x3b, 0x31, 0x07, 0xa6, 0x95, 0x92, 0x71, 0x24, 0x75, 0x9e, 0xe7, 0xda, +0x7a, 0x51, 0x0f, 0x6c, 0xc6, 0x1b, 0x6d, 0x4b, 0x94, 0xb6, 0x05, 0xeb, 0x67, 0xf8, 0xd8, 0x03, +0x49, 0xd6, 0x34, 0x4b, 0x3c, 0xc8, 0x3e, 0x69, 0x1f, 0xae, 0x5a, 0x48, 0xf5, 0xde, 0x20, 0x2b, +0x94, 0x3b, 0xd9, 0xc0, 0xab, 0x62, 0x5e, 0xd6, 0x70, 0xde, 0x54, 0x42, 0x46, 0x46, 0x90, 0x1d, +0x2d, 0x41, 0x9d, 0xaf, 0xd4, 0xd6, 0x3b, 0xa1, 0xa5, 0xae, 0xa9, 0xc7, 0x8e, 0x5c, 0x49, 0x8e, +0x4b, 0x66, 0x0d, 0x50, 0x4e, 0x79, 0x92, 0x6e, 0x28, 0xea, 0x69, 0x4b, 0xc1, 0x6c, 0x9a, 0xce, +0xf1, 0x0e, 0xda, 0xe1, 0x19, 0x0c, 0x8f, 0x4a, 0x8c, 0x28, 0xce, 0xa9, 0x83, 0x58, 0x6c, 0x0f, +0xf8, 0x6f, 0x62, 0x64, 0xc0, 0x0b, 0x4e, 0x6b, 0x70, 0x69, 0x15, 0x79, 0x0b, 0xd5, 0xf6, 0xeb, +0xed, 0x4a, 0x61, 0xcc, 0x41, 0xbd, 0xce, 0x0f, 0x51, 0x55, 0x70, 0x4a, 0x8a, 0x50, 0x08, 0x70, +0xec, 0x5e, 0x95, 0xbf, 0xc1, 0x49, 0xd9, 0xcb, 0x07, 0xbb, 0x4c, 0x9d, 0xb3, 0x58, 0xcd, 0xae, +0x33, 0xe7, 0x23, 0x70, 0xfe, 0x70, 0x76, 0x9d, 0x3b, 0x59, 0xaf, 0x9f, 0x39, 0x3b, 0x04, 0x7e, +0xcd, 0xad, 0x07, 0xf0, 0x47, 0xc7, 0x7f, 0xc7, 0x16, 0xde, 0xc5, 0xf9, 0x79, 0x86, 0x74, 0x04, +0xce, 0x93, 0x0e, 0x33, 0x66, 0x48, 0xd7, 0xeb, 0x1f, 0x90, 0xce, 0xfb, 0x39, 0xb1, 0xf7, 0x62, +0xed, 0xa3, 0x85, 0x73, 0xa2, 0xee, 0x1f, 0x1d, 0x78, 0xee, 0x4c, 0x7c, 0x44, 0x2f, 0x05, 0x5a, +0x1d, 0x80, 0x8f, 0x64, 0x45, 0xe0, 0x95, 0xb4, 0x52, 0xf8, 0x75, 0x47, 0xab, 0x60, 0x15, 0xe0, +0x23, 0xbd, 0xb7, 0x10, 0x0a, 0x30, 0xc8, 0x48, 0x6f, 0xf8, 0xfb, 0xa5, 0xe7, 0xec, 0x74, 0xb3, +0x43, 0xcc, 0xa6, 0xe5, 0xd3, 0xf0, 0xbf, 0x38, 0x35, 0x0d, 0x9f, 0x71, 0xf7, 0x12, 0x2c, 0x03, +0x6b, 0xd4, 0x35, 0xaf, 0x83, 0xcb, 0x38, 0x95, 0x14, 0x2d, 0xcf, 0x18, 0x0d, 0xda, 0x24, 0x8e, +0x85, 0xaf, 0x1d, 0x69, 0x8f, 0xf8, 0x81, 0x42, 0x68, 0x4a, 0x70, 0x77, 0x30, 0x7a, 0x5c, 0x03, +0xa2, 0x22, 0x6c, 0xc2, 0x50, 0xb8, 0x86, 0x94, 0x00, 0x9f, 0xb1, 0x7a, 0x6e, 0xd4, 0x73, 0xbb, +0x14, 0x8f, 0x44, 0x7d, 0x7d, 0x56, 0xcf, 0x9d, 0x7a, 0xee, 0x25, 0xf8, 0xa0, 0xbe, 0xae, 0x57, +0xfa, 0x45, 0xef, 0xb7, 0x8e, 0xd5, 0x69, 0x70, 0x56, 0x40, 0x2e, 0xbc, 0xd1, 0xe7, 0x69, 0xcf, +0xb1, 0x8f, 0x36, 0xfa, 0x4f, 0xe3, 0x12, 0x1b, 0xaf, 0xf2, 0x1c, 0x3d, 0xcb, 0xbf, 0x9d, 0x86, +0x6d, 0x34, 0x2c, 0x4e, 0xf4, 0xd0, 0x56, 0x0f, 0x6d, 0x36, 0xd1, 0x78, 0xab, 0x44, 0xc3, 0xb6, +0xeb, 0xc9, 0x56, 0xcf, 0x1a, 0x96, 0x18, 0x2e, 0xec, 0xcc, 0xd0, 0x7e, 0xb2, 0xd5, 0x5e, 0xc3, +0x9e, 0xa7, 0x58, 0x1d, 0x34, 0x6c, 0x67, 0xb0, 0x5a, 0xaf, 0x0c, 0x85, 0x53, 0xb4, 0xd6, 0x86, +0xfc, 0xc3, 0x14, 0xaf, 0x75, 0xec, 0xe6, 0x5c, 0x51, 0x8b, 0xdc, 0x32, 0x79, 0x66, 0x14, 0x27, +0x42, 0xbb, 0x60, 0x38, 0xb6, 0x87, 0xcd, 0xe8, 0x66, 0x18, 0x5d, 0xeb, 0xb1, 0xad, 0x35, 0x36, +0xcc, 0x4c, 0x86, 0xd1, 0x8d, 0x1a, 0x7b, 0x73, 0xce, 0x0a, 0xd4, 0x69, 0x81, 0x79, 0x93, 0x73, +0x62, 0x77, 0x8e, 0x99, 0x32, 0xcc, 0xd8, 0xd8, 0x33, 0x1c, 0xab, 0x40, 0xe8, 0xd6, 0x81, 0xea, +0xf5, 0x6b, 0x6b, 0x7d, 0x62, 0xcf, 0xd8, 0x48, 0xb8, 0xc6, 0xf1, 0xe6, 0xe1, 0x87, 0x8b, 0xe1, +0x6d, 0xca, 0x1a, 0x07, 0xbf, 0xdb, 0x98, 0x49, 0x16, 0x76, 0xb7, 0x29, 0xb3, 0x1c, 0xdc, 0x6e, +0x63, 0xb6, 0x0d, 0x98, 0x55, 0xc8, 0x3d, 0x8c, 0x5b, 0xb2, 0x36, 0xf0, 0x72, 0xaf, 0x42, 0xee, +0x39, 0x73, 0xc6, 0xd8, 0x55, 0xc8, 0x3d, 0x6b, 0x86, 0x8b, 0x5f, 0x85, 0xdc, 0xb3, 0xa1, 0x13, +0x0c, 0x2b, 0xe4, 0x9e, 0x35, 0x63, 0x84, 0xe3, 0xcd, 0xc1, 0xd1, 0x87, 0xe1, 0xcd, 0xc1, 0x70, +0x8a, 0xdf, 0xcd, 0xc6, 0x6f, 0x84, 0xdd, 0xcd, 0xc6, 0xce, 0x83, 0xdb, 0xcd, 0xc6, 0x6d, 0x84, +0x19, 0xb7, 0x30, 0x13, 0x3e, 0x57, 0x63, 0x27, 0x60, 0xf1, 0x18, 0x36, 0x80, 0x36, 0x2e, 0x68, +0x6d, 0x00, 0xdb, 0x11, 0xc0, 0x5a, 0x93, 0xb8, 0xa0, 0x8d, 0x02, 0x64, 0x36, 0x0e, 0x2a, 0xc1, +0xb2, 0xd0, 0xc8, 0x6c, 0x34, 0x0c, 0x78, 0x80, 0x6e, 0x26, 0xd0, 0xb5, 0x81, 0x6d, 0xa7, 0x30, +0x6b, 0x65, 0x32, 0x81, 0x2a, 0x94, 0x4e, 0x3d, 0xaa, 0xfb, 0x10, 0x35, 0x36, 0x9a, 0x97, 0x00, +0x88, 0x1d, 0x80, 0x19, 0xde, 0xd8, 0xc3, 0xb1, 0x35, 0x7f, 0xeb, 0x00, 0xcc, 0x70, 0x62, 0x0f, +0xaf, 0xa3, 0xdd, 0xb0, 0xe0, 0xd9, 0x85, 0x0c, 0x80, 0x9d, 0x0b, 0x88, 0x07, 0xc8, 0xde, 0x81, +0x98, 0xe1, 0x83, 0x3d, 0xbc, 0xb2, 0xcf, 0x40, 0x4f, 0x69, 0x83, 0x14, 0x84, 0x84, 0x9d, 0x13, +0x3f, 0x45, 0x65, 0x22, 0xc6, 0x73, 0x67, 0x3c, 0x87, 0x5c, 0x91, 0x76, 0x00, 0x28, 0x42, 0xac, +0x47, 0xdc, 0xea, 0xc4, 0xad, 0x86, 0x0a, 0x59, 0x7c, 0x8c, 0x92, 0x6c, 0x77, 0x0e, 0x46, 0xd4, +0xbf, 0x06, 0x9f, 0x47, 0x25, 0xb8, 0xc2, 0x4a, 0x8f, 0xc9, 0x2a, 0x49, 0xa3, 0xfa, 0x79, 0x19, +0x1c, 0x8f, 0xe4, 0x04, 0x58, 0xe0, 0x4b, 0x46, 0x4f, 0x4d, 0x87, 0xc9, 0x74, 0xf3, 0x86, 0x14, +0xa1, 0x97, 0x50, 0x69, 0x04, 0x8c, 0xa4, 0xf7, 0x5f, 0x3f, 0x07, 0x7d, 0x15, 0x7c, 0xfe, 0xf5, +0x6f, 0x15, 0x2d, 0x18, 0xf9, 0x84, 0x8d, 0x02, 0x15, 0x3a, 0x9e, 0xf7, 0xed, 0xdb, 0x53, 0xf0, +0x2e, 0x62, 0x40, 0x5f, 0xcd, 0x46, 0x48, 0x00, 0xcf, 0x05, 0x49, 0x00, 0x7b, 0xe2, 0x24, 0x8c, +0xce, 0x85, 0x4a, 0x00, 0xcf, 0x45, 0x4b, 0x00, 0x7b, 0x02, 0x26, 0x8c, 0xce, 0xc5, 0x4c, 0x00, +0xcf, 0x85, 0x4d, 0x00, 0x7b, 0x22, 0x27, 0xd2, 0x3e, 0x17, 0x3c, 0x11, 0x3e, 0x17, 0x3f, 0x11, +0x3e, 0x0e, 0xa1, 0x60, 0x60, 0x82, 0xa5, 0xb3, 0xa6, 0x2d, 0xb8, 0x3a, 0x67, 0xdd, 0x82, 0xaf, +0x8f, 0x0d, 0x5c, 0x30, 0x78, 0xce, 0xc6, 0x05, 0x8b, 0x1f, 0x9b, 0xb9, 0x14, 0xba, 0xdf, 0xd2, +0xa5, 0xc4, 0x7d, 0xc6, 0x2e, 0x85, 0xed, 0xb7, 0x77, 0x29, 0x72, 0x9f, 0xc9, 0x4b, 0x69, 0x3f, +0xb0, 0x7a, 0x29, 0x6b, 0xbf, 0xe1, 0x4b, 0x89, 0x3f, 0xb0, 0x7d, 0x29, 0xef, 0x89, 0xf9, 0x17, +0x08, 0xf8, 0xd8, 0xf4, 0xc4, 0xb4, 0x0f, 0x6c, 0x18, 0xed, 0xa7, 0x2a, 0x7c, 0xf6, 0x73, 0x38, +0xc4, 0x83, 0xfd, 0x54, 0xc5, 0xac, 0xfd, 0x00, 0x78, 0xce, 0x7e, 0x00, 0xec, 0xb1, 0x1f, 0x18, +0x9d, 0xb3, 0x1f, 0x00, 0xcf, 0xd9, 0x0f, 0x80, 0x3d, 0xf6, 0x03, 0xa3, 0x73, 0xf6, 0x03, 0xe0, +0x39, 0xfb, 0x01, 0xb0, 0xc7, 0x7e, 0x90, 0xf6, 0x39, 0xfb, 0x41, 0xf8, 0x9c, 0xfd, 0x20, 0x7c, +0x64, 0x3f, 0x77, 0x4e, 0x32, 0xd1, 0x0d, 0x91, 0x8e, 0x0c, 0x66, 0x95, 0xa4, 0xed, 0xe9, 0x51, +0xbf, 0x38, 0x6d, 0x38, 0x7e, 0x76, 0xfc, 0x33, 0xab, 0xcf, 0xb4, 0x63, 0xa2, 0x19, 0x25, 0x36, +0xe1, 0x05, 0x94, 0x06, 0xea, 0xf5, 0x3c, 0x64, 0x52, 0x4a, 0xff, 0x8c, 0xab, 0x94, 0xc6, 0x33, +0x2a, 0xba, 0xc4, 0xb2, 0x50, 0xce, 0xc1, 0x52, 0x09, 0x6b, 0x9a, 0x16, 0x6b, 0xa5, 0x71, 0xbf, +0xd5, 0xea, 0x22, 0x98, 0xd6, 0x12, 0x36, 0x22, 0x62, 0xfc, 0x58, 0xc7, 0xfa, 0x35, 0xc5, 0x96, +0xd9, 0xa9, 0x6c, 0x5e, 0x8f, 0xb2, 0x34, 0x31, 0xb5, 0x97, 0xde, 0x2b, 0x1e, 0x9a, 0x19, 0xb2, +0x57, 0x25, 0x47, 0xec, 0x02, 0xcb, 0x2e, 0xe7, 0xde, 0x86, 0x2d, 0x22, 0x11, 0x23, 0x4c, 0xa3, +0x30, 0xcb, 0x32, 0x5d, 0x23, 0x62, 0x27, 0x28, 0x4e, 0x74, 0x07, 0xd2, 0x09, 0x6e, 0x66, 0x31, +0x06, 0x1d, 0xdf, 0xda, 0x78, 0xa3, 0x3a, 0x2a, 0x2b, 0xbd, 0x89, 0x59, 0x73, 0x81, 0xba, 0xae, +0x64, 0x3d, 0x20, 0xc3, 0x6f, 0xc0, 0x24, 0xec, 0xe0, 0xca, 0x06, 0x9d, 0x5e, 0x8a, 0x4b, 0x04, +0x99, 0x43, 0xcb, 0xda, 0x5e, 0x8c, 0x9d, 0x65, 0xfd, 0x95, 0x78, 0xce, 0x36, 0x32, 0x41, 0xbe, +0x39, 0xc1, 0x11, 0xd1, 0x78, 0xc4, 0x06, 0xd3, 0xbc, 0x74, 0x1a, 0xa6, 0x67, 0x56, 0xcc, 0x19, +0xb9, 0xb4, 0xed, 0xa0, 0xa9, 0xcb, 0x5b, 0xd0, 0xe7, 0x1d, 0xa5, 0x75, 0x40, 0xea, 0x22, 0xf0, +0x19, 0xbb, 0xee, 0x1d, 0x2b, 0x63, 0xdd, 0xb8, 0x1d, 0x36, 0xa7, 0x27, 0x3f, 0xe9, 0xd3, 0x3e, +0x4e, 0x14, 0x86, 0x3e, 0xaf, 0xd3, 0x37, 0x16, 0x6d, 0xd1, 0xa1, 0x6d, 0xa6, 0x5a, 0x84, 0x0e, +0x2f, 0x70, 0x8a, 0xbf, 0x05, 0x3b, 0x6e, 0x9e, 0xaa, 0x76, 0xd7, 0xa8, 0x45, 0x8b, 0x4a, 0x86, +0x42, 0xb2, 0xf7, 0x90, 0xd9, 0xc6, 0x78, 0x54, 0x8b, 0x03, 0x71, 0x32, 0x47, 0xfb, 0x14, 0x5f, +0x36, 0x21, 0x93, 0x41, 0xf1, 0x93, 0x95, 0xa3, 0xa8, 0x52, 0xd7, 0x94, 0x90, 0xe5, 0x4e, 0xc9, +0x88, 0x8d, 0xf7, 0x7b, 0x1b, 0x95, 0x2c, 0x5f, 0x06, 0xe2, 0x81, 0x7c, 0x19, 0xe4, 0xbd, 0x37, +0x4d, 0x8c, 0xc5, 0xe1, 0x70, 0x40, 0x37, 0x4e, 0x7b, 0x27, 0xb5, 0x16, 0x86, 0x36, 0xd3, 0xf5, +0xe8, 0x29, 0xa0, 0x5c, 0x88, 0x6e, 0xea, 0x3d, 0xea, 0x7f, 0x93, 0x9d, 0x46, 0xf0, 0x11, 0xfd, +0x6f, 0xca, 0xbd, 0x30, 0x30, 0xfa, 0x1f, 0xea, 0x81, 0xa7, 0x8e, 0xb2, 0xe1, 0x3e, 0x8a, 0x25, +0x4e, 0xe3, 0xda, 0xd8, 0x3e, 0x68, 0x63, 0x41, 0x6b, 0x35, 0xd3, 0x9c, 0xf8, 0xbd, 0xbd, 0xdf, +0xd7, 0x33, 0xe3, 0x34, 0xcd, 0x2f, 0x5d, 0x0f, 0x5f, 0xda, 0x86, 0x89, 0x6c, 0xd4, 0xf0, 0x3e, +0x76, 0xbd, 0x85, 0x74, 0x5d, 0xf2, 0x7c, 0xcb, 0xfc, 0x91, 0xeb, 0x69, 0x73, 0xe1, 0xd8, 0x20, +0x9f, 0x5c, 0x44, 0x24, 0xde, 0x8e, 0x2f, 0x60, 0x7b, 0xc9, 0x04, 0xab, 0xad, 0xa9, 0xf1, 0x63, +0xd6, 0xda, 0xf2, 0xdd, 0xe9, 0xf5, 0x7f, 0x66, 0x0b, 0xd1, 0xc9, 0xd9, 0x09, 0x6d, 0xc2, 0x6d, +0xc8, 0x11, 0x90, 0xfe, 0xb6, 0x04, 0x43, 0xbf, 0xb2, 0x1e, 0x38, 0x51, 0x28, 0xe7, 0x3f, 0x73, +0xb3, 0x32, 0xa7, 0x00, 0xca, 0x5f, 0xe0, 0x7e, 0xa7, 0x26, 0xbf, 0xf4, 0x83, 0xe3, 0x58, 0x81, +0xbb, 0x22, 0xea, 0xda, 0xea, 0xbb, 0x9b, 0xf2, 0x46, 0x10, 0x3b, 0x6d, 0x03, 0xfa, 0xc5, 0x7f, +0x2d, 0x21, 0x4f, 0xf8, 0xf3, 0x17, 0x2e, 0xe2, 0xf6, 0x6c, 0x19, 0xf4, 0xb4, 0xa4, 0xb9, 0x65, +0x82, 0xbb, 0xa9, 0x05, 0xd8, 0x17, 0x6d, 0xc8, 0xb0, 0xaf, 0xce, 0x3d, 0x5d, 0x4b, 0xfa, 0xfe, +0x15, 0x74, 0xe5, 0xab, 0xde, 0xcb, 0x81, 0xd6, 0x97, 0x2a, 0xa3, 0x9d, 0x7b, 0x35, 0xe7, 0x2f, +0x37, 0x94, 0xbe, 0x0d, 0x71, 0x74, 0x91, 0xe7, 0x79, 0x3a, 0xbd, 0xf6, 0x7b, 0xd4, 0x0b, 0xc6, +0x33, 0xfd, 0xb7, 0x94, 0x02, 0x04, 0xcc, 0xbb, 0x12, 0xdc, 0x56, 0x65, 0x06, 0x78, 0xaf, 0xa0, +0x0f, 0x02, 0x81, 0x39, 0xee, 0xea, 0xd1, 0x09, 0x62, 0x03, 0x3c, 0x63, 0xca, 0xc8, 0xa8, 0x3f, +0x3b, 0xb7, 0x00, 0x63, 0xb7, 0xa4, 0x74, 0xba, 0x53, 0x3e, 0xde, 0x5c, 0x5f, 0xa2, 0x0c, 0xff, +0x49, 0x4b, 0x8f, 0x00, 0x17, 0xb9, 0x8b, 0xd5, 0x30, 0xff, 0x87, 0xb4, 0x4a, 0x51, 0x6b, 0x45, +0x42, 0xa1, 0x60, 0xc2, 0xbd, 0xea, 0x17, 0x5f, 0xd8, 0x14, 0x96, 0xc1, 0x3b, 0x52, 0xf7, 0x50, +0x23, 0x56, 0xc7, 0x0b, 0x26, 0x2f, 0x39, 0xe9, 0x27, 0xee, 0x63, 0x40, 0xeb, 0xa1, 0x2a, 0x2e, +0x56, 0xdb, 0x2d, 0xdd, 0x3f, 0xeb, 0xa9, 0x79, 0x36, 0x29, 0x3c, 0x12, 0x37, 0x75, 0x91, 0xfc, +0x11, 0xf7, 0xc6, 0x26, 0x5c, 0x82, 0xde, 0x78, 0xcd, 0x60, 0xe4, 0x0f, 0xdc, 0xb2, 0x77, 0x3d, +0x10, 0x27, 0xde, 0x4d, 0x3e, 0x22, 0x4e, 0x1c, 0xdd, 0x01, 0xc2, 0xc9, 0xe9, 0xbd, 0xc5, 0x7a, +0x58, 0xf8, 0xc9, 0xb0, 0x6f, 0x49, 0x4e, 0x8f, 0x30, 0x10, 0xaa, 0x7e, 0xb4, 0x8c, 0x3e, 0xe0, +0x87, 0x09, 0x97, 0x6e, 0xf0, 0xae, 0x33, 0x27, 0x39, 0xa6, 0xcb, 0x7e, 0x70, 0x55, 0x2f, 0x5d, +0xeb, 0xcc, 0x54, 0x44, 0x08, 0x66, 0xdf, 0x0b, 0x76, 0x8d, 0xfe, 0xd5, 0x14, 0xff, 0x79, 0x05, +0xdf, 0xa1, 0xde, 0xff, 0x4d, 0x2a, 0x2a, 0xbf, 0xfc, 0x17, 0xef, 0xc2, 0xff, 0x31, 0x5c, 0x57, +0xed, 0x1e, 0x11, 0x2e, 0xb6, 0x39, 0x5b, 0x09, 0x60, 0xab, 0x6d, 0x68, 0x74, 0x09, 0x20, 0xec, +0x68, 0xcc, 0x04, 0xc9, 0xe2, 0x45, 0x0d, 0x71, 0x75, 0xe8, 0x81, 0x69, 0xc0, 0xf0, 0x61, 0xf8, +0x69, 0xc4, 0x62, 0xa7, 0xcf, 0x8b, 0xb2, 0x81, 0x75, 0xa6, 0x92, 0x48, 0xac, 0xbb, 0xbf, 0x78, +0xb5, 0x6a, 0x1f, 0xda, 0xf4, 0x47, 0x16, 0x3c, 0xbd, 0xeb, 0x15, 0x17, 0xbc, 0x70, 0xa4, 0x4c, +0xe2, 0xf0, 0x57, 0x0b, 0x76, 0xa2, 0xfb, 0x6c, 0xe9, 0xb0, 0x98, 0x11, 0xc6, 0x32, 0xe1, 0xd4, +0x95, 0x97, 0xb1, 0xcb, 0x04, 0xd1, 0x7a, 0xc2, 0xe8, 0x7a, 0x8d, 0xf2, 0x73, 0x10, 0x5d, 0x6a, +0xc6, 0x25, 0xdf, 0xf3, 0x73, 0xc8, 0xae, 0x72, 0xc0, 0x09, 0x32, 0x7b, 0x2d, 0x31, 0x98, 0xae, +0x9d, 0xd8, 0x4e, 0x9c, 0xe7, 0xe4, 0xf1, 0x40, 0x21, 0xfc, 0x0d, 0xb2, 0x57, 0x33, 0xf7, 0x92, +0xcd, 0x8a, 0x4f, 0x0e, 0x8a, 0xc2, 0x45, 0x98, 0x5b, 0x53, 0x31, 0xef, 0xbe, 0xe8, 0x29, 0xfe, +0x64, 0xc3, 0xad, 0x68, 0x4c, 0x9a, 0x14, 0x69, 0xa8, 0x73, 0x71, 0x22, 0x6f, 0x1b, 0x8b, 0x86, +0x0f, 0x9a, 0x90, 0x0c, 0x72, 0xf2, 0x5f, 0x67, 0x62, 0x84, 0x72, 0x3d, 0x6b, 0xf2, 0x48, 0xcd, +0x6c, 0xb3, 0x94, 0xc1, 0x1c, 0xef, 0x92, 0x7e, 0xc8, 0x05, 0x41, 0xad, 0xd6, 0xf7, 0xb0, 0x43, +0x53, 0x72, 0xd6, 0xbe, 0x4f, 0xef, 0x7f, 0x1d, 0xb8, 0xf4, 0x22, 0xb2, 0x47, 0xf5, 0xae, 0x28, +0x3f, 0x12, 0xce, 0xbb, 0x4f, 0x05, 0xe1, 0x44, 0xcf, 0x7a, 0x72, 0x2e, 0x8d, 0x81, 0x09, 0xf6, +0xb5, 0xfc, 0x88, 0xb4, 0xcd, 0xa3, 0x08, 0xea, 0x51, 0x33, 0xe3, 0xef, 0xc4, 0x1b, 0xe0, 0x47, +0x3f, 0x85, 0xc0, 0x9a, 0x65, 0x88, 0xa2, 0xb0, 0xd2, 0x0a, 0x51, 0x9c, 0x28, 0x12, 0xbf, 0x7c, +0xf9, 0x92, 0x0e, 0xe9, 0xbe, 0xd0, 0x05, 0xfb, 0xbb, 0x10, 0xb3, 0xd0, 0xd3, 0x44, 0xa7, 0xbf, +0xc8, 0x6c, 0x5f, 0x5b, 0x70, 0xca, 0x06, 0xdd, 0xa1, 0x9b, 0xae, 0x57, 0xa6, 0x25, 0xcd, 0x4a, +0x60, 0xdb, 0x92, 0x0e, 0x36, 0x4a, 0x35, 0xcf, 0x7e, 0x0e, 0x7e, 0xd6, 0xc6, 0xa8, 0x7f, 0x7b, +0xb2, 0xf2, 0x90, 0xac, 0xfc, 0x78, 0x48, 0xaf, 0xb0, 0xa8, 0x97, 0x09, 0xd0, 0x50, 0x3b, 0x03, +0x7d, 0xdd, 0x4b, 0x46, 0x3e, 0xad, 0x96, 0x81, 0xfa, 0xff, 0x64, 0x39, 0x19, 0xe3, 0xdf, 0x07, +0x75, 0x52, 0x66, 0x36, 0xb6, 0x47, 0x51, 0x43, 0x7a, 0x98, 0xbb, 0x5a, 0xa2, 0x3d, 0x82, 0x8e, +0x57, 0x4d, 0xe1, 0x6a, 0xf6, 0x6e, 0x65, 0xfb, 0x6e, 0x59, 0x72, 0xeb, 0x5b, 0x39, 0x35, 0xd9, +0xfb, 0x2b, 0x1b, 0xd5, 0xef, 0xd4, 0xbf, 0x69, 0xf9, 0x03, 0xdc, 0x4a, 0x81, 0x37, 0x88, 0xab, +0x5d, 0x3c, 0xb9, 0xbe, 0x17, 0xfb, 0x84, 0xa6, 0x32, 0xf7, 0x04, 0x2e, 0x20, 0xac, 0x81, 0x30, +0xc0, 0xf8, 0x0d, 0xbb, 0x6b, 0xba, 0x90, 0x59, 0x69, 0x1c, 0x42, 0x93, 0xae, 0xbb, 0x2a, 0x17, +0x89, 0x9e, 0xd7, 0x54, 0xd3, 0x9d, 0xeb, 0x4f, 0x3b, 0x23, 0xf2, 0x1b, 0x93, 0x3c, 0x23, 0x1b, +0xfd, 0x64, 0xa9, 0x04, 0xed, 0xd0, 0x6e, 0xd9, 0x9b, 0x38, 0x29, 0x89, 0xe1, 0xbf, 0x28, 0x7e, +0x92, 0xf7, 0xaa, 0x05, 0xeb, 0x20, 0x35, 0x43, 0x64, 0xe0, 0x80, 0x4b, 0x55, 0x1b, 0x0a, 0xd0, +0x9a, 0x91, 0x78, 0x07, 0x35, 0xa1, 0x97, 0x21, 0x04, 0xc1, 0xaa, 0x17, 0x03, 0x50, 0xa8, 0x93, +0x8e, 0xa7, 0xea, 0x5e, 0x58, 0x53, 0x7d, 0x14, 0x11, 0x32, 0xcc, 0x28, 0x7f, 0x85, 0xba, 0x37, +0x75, 0x6e, 0xf2, 0x1e, 0x35, 0x47, 0x16, 0xf4, 0x40, 0x73, 0x7a, 0x1a, 0x1f, 0x1f, 0xe5, 0x65, +0xd3, 0x53, 0xfb, 0x22, 0x6c, 0x87, 0xbb, 0x28, 0xf1, 0x87, 0xa2, 0x71, 0x69, 0x7f, 0xda, 0x8a, +0x10, 0xca, 0x1f, 0xbe, 0x39, 0x77, 0x64, 0xe2, 0x23, 0xd6, 0x6f, 0x68, 0x5a, 0x72, 0xff, 0x51, +0x7f, 0xd1, 0x96, 0xad, 0xfd, 0xc3, 0x39, 0xdd, 0x08, 0x7a, 0x50, 0x2a, 0x81, 0xfc, 0xb3, 0x0b, +0x10, 0x56, 0xeb, 0x6d, 0x27, 0xf2, 0xb3, 0x0d, 0x52, 0x67, 0x60, 0xe9, 0xfd, 0x9c, 0xf8, 0xda, +0x91, 0xf6, 0x4d, 0x51, 0xea, 0xeb, 0xe8, 0x4a, 0xd4, 0x5e, 0xa5, 0x2d, 0x27, 0x58, 0x5c, 0x44, +0x0a, 0x23, 0x28, 0x39, 0x46, 0xd9, 0x58, 0x94, 0x91, 0xe2, 0x85, 0x0e, 0xbf, 0x24, 0xb2, 0x33, +0xc1, 0x89, 0x7a, 0xc7, 0x7b, 0xb2, 0xdb, 0x26, 0x66, 0x11, 0xfe, 0x16, 0x09, 0xc8, 0x33, 0x8b, +0xe2, 0x75, 0x9c, 0xc4, 0x07, 0x5f, 0xf8, 0x38, 0xe5, 0x60, 0x4f, 0x66, 0x1d, 0xed, 0xba, 0xa6, +0xfb, 0xe0, 0xa8, 0x22, 0xdf, 0x24, 0xc3, 0x51, 0x83, 0xba, 0xb9, 0x0e, 0x59, 0x37, 0xd8, 0xe2, +0x04, 0x24, 0x17, 0x6d, 0x35, 0xe9, 0xb2, 0x78, 0x4f, 0x7e, 0x71, 0x18, 0x01, 0x0e, 0x22, 0x15, +0x6b, 0x75, 0xd4, 0xf3, 0xb8, 0x54, 0x3b, 0x91, 0xab, 0x1b, 0x91, 0xc6, 0x8d, 0x92, 0xbe, 0x0c, +0x52, 0x5a, 0xdc, 0x65, 0x14, 0x33, 0x74, 0xa7, 0xf8, 0xff, 0xa9, 0x3b, 0x87, 0x2e, 0x5a, 0x29, +0x00, 0x00}; +#endif /*__STYLE_CSS_H__*/ diff --git a/src/web/html/h/system_html.h b/src/web/html/h/system_html.h new file mode 100644 index 00000000..1db39ad8 --- /dev/null +++ b/src/web/html/h/system_html.h @@ -0,0 +1,139 @@ +#ifndef __SYSTEM_HTML_H__ +#define __SYSTEM_HTML_H__ +#define system_html_len 2134 +const uint8_t system_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xd5, 0x59, 0x6d, 0x6f, 0xdb, 0x38, +0x12, 0xfe, 0xde, 0x5f, 0xc1, 0x6a, 0x81, 0xb3, 0x74, 0xb5, 0x25, 0x27, 0x7d, 0xdd, 0xc4, 0xce, +0x22, 0x4d, 0xb3, 0x6d, 0x80, 0x24, 0x5b, 0x24, 0x2e, 0xba, 0x8b, 0x20, 0x30, 0x68, 0x89, 0xb6, +0x98, 0x48, 0xa2, 0x4a, 0x52, 0x4e, 0xbc, 0xbb, 0xf9, 0xef, 0x37, 0x43, 0x49, 0xb6, 0x65, 0x4b, +0x8e, 0xdb, 0x6e, 0x71, 0x77, 0xfe, 0x22, 0x8b, 0x9c, 0x19, 0x3e, 0x33, 0x9c, 0x79, 0x38, 0x92, +0x7a, 0x4f, 0x03, 0xe1, 0xeb, 0x59, 0xca, 0x48, 0xa8, 0xe3, 0xe8, 0xe0, 0x49, 0x2f, 0xbf, 0x10, +0xf8, 0xf5, 0x42, 0x46, 0x83, 0xfc, 0xaf, 0xb9, 0xd5, 0x5c, 0x47, 0xec, 0xe0, 0x72, 0xa6, 0x34, +0x8b, 0x7b, 0x5e, 0x7e, 0xb7, 0x98, 0x8d, 0x78, 0x72, 0x4b, 0x24, 0x8b, 0xfa, 0x96, 0xd2, 0xb3, +0x88, 0xa9, 0x90, 0x31, 0x6d, 0x11, 0xb4, 0xdc, 0xb7, 0x34, 0xbb, 0xd7, 0x9e, 0xaf, 0x94, 0x45, +0x42, 0xc9, 0xc6, 0x85, 0x84, 0x0b, 0x03, 0xbf, 0x4c, 0xfb, 0x5d, 0xf7, 0x8d, 0xdb, 0xed, 0x76, +0x77, 0x2c, 0x0f, 0x16, 0x8f, 0x99, 0xa6, 0x24, 0xa1, 0x31, 0xe8, 0x4c, 0x39, 0xbb, 0x4b, 0x85, +0x04, 0x1b, 0xbe, 0x48, 0x34, 0x4b, 0x74, 0xdf, 0xba, 0xe3, 0x81, 0x0e, 0xfb, 0x01, 0x9b, 0x72, +0x9f, 0x75, 0xcc, 0x4d, 0x9b, 0xf0, 0x84, 0x6b, 0x4e, 0xa3, 0x8e, 0xf2, 0x69, 0xc4, 0xfa, 0x3b, +0x56, 0x69, 0xc4, 0x0f, 0xa9, 0x54, 0x0c, 0x94, 0x3e, 0x0d, 0x7e, 0xed, 0xbc, 0xc1, 0x61, 0xe5, +0x4b, 0x9e, 0xea, 0x65, 0x44, 0x37, 0x74, 0x4a, 0xf3, 0x51, 0x8b, 0x28, 0xe9, 0xf7, 0x2d, 0x9a, +0x72, 0xf7, 0xa6, 0x02, 0xea, 0xa0, 0xe7, 0xe5, 0x12, 0x60, 0xe0, 0x6b, 0x3c, 0xf4, 0x45, 0x24, +0xa4, 0x7a, 0xc4, 0x45, 0x29, 0x46, 0x42, 0xab, 0x25, 0x07, 0x13, 0xc1, 0x93, 0x80, 0xdd, 0xb7, +0x49, 0x22, 0xc6, 0x22, 0x8a, 0xc4, 0x9d, 0x45, 0xbc, 0x62, 0x2f, 0xbc, 0xc5, 0x66, 0xf4, 0x46, +0x22, 0x98, 0x2d, 0x45, 0x3e, 0xe0, 0x53, 0xe2, 0x47, 0x54, 0x29, 0x80, 0x21, 0xd2, 0x84, 0x4e, +0xad, 0x42, 0x8e, 0x16, 0x60, 0xbc, 0x65, 0x0c, 0x73, 0x51, 0xdc, 0x3f, 0xeb, 0xe0, 0x30, 0x14, +0xb3, 0x77, 0x83, 0x4f, 0x3d, 0x8f, 0xae, 0x28, 0x2d, 0x82, 0xb3, 0x37, 0x15, 0x3c, 0xb0, 0xbb, +0xce, 0xfe, 0x5c, 0x97, 0x03, 0x62, 0x8b, 0x88, 0xc4, 0x8f, 0xb8, 0x7f, 0x5b, 0xae, 0x6a, 0x3b, +0xd6, 0x12, 0x28, 0x95, 0xd2, 0x04, 0x83, 0x87, 0x97, 0xaf, 0x1e, 0x5d, 0xa0, 0x41, 0xdf, 0x78, +0x30, 0x77, 0xac, 0x04, 0x10, 0x8b, 0x11, 0x47, 0xf4, 0x0b, 0x1b, 0xd4, 0x88, 0x81, 0xcc, 0xf3, +0xb9, 0x50, 0xc8, 0x03, 0x56, 0xee, 0x87, 0x17, 0xf1, 0x29, 0xab, 0x6c, 0xec, 0x29, 0x0c, 0xcc, +0xd7, 0xa9, 0x9a, 0x78, 0x51, 0x6f, 0x42, 0x31, 0x09, 0x99, 0x56, 0x31, 0xf2, 0x99, 0x8d, 0xf2, +0xd1, 0x06, 0x4b, 0x2f, 0x9b, 0x2c, 0xe9, 0x2c, 0xad, 0x18, 0xba, 0x64, 0x5a, 0xf3, 0x64, 0xa2, +0xaa, 0x76, 0x30, 0x22, 0xa5, 0x01, 0xc5, 0x52, 0x26, 0xa9, 0x16, 0xd2, 0x5a, 0x0f, 0xe0, 0x7c, +0xbd, 0x57, 0xf5, 0xeb, 0x65, 0x69, 0x40, 0x75, 0xd5, 0xfd, 0x4f, 0x66, 0xa8, 0x01, 0xf6, 0xeb, +0x06, 0xd8, 0xa6, 0xf4, 0xab, 0xb8, 0x0b, 0x36, 0xf8, 0x2e, 0xd4, 0x6f, 0xe6, 0x2b, 0x40, 0x01, +0x42, 0x45, 0x51, 0x39, 0xc1, 0xca, 0x1d, 0x8e, 0x22, 0x9a, 0xdc, 0x5a, 0x07, 0x17, 0xc7, 0x97, +0x03, 0x72, 0xf8, 0xf1, 0xa4, 0x01, 0xec, 0xcf, 0xa5, 0x76, 0xa8, 0x75, 0xaa, 0xf6, 0x3c, 0x8f, +0x42, 0x4a, 0x07, 0x3a, 0x73, 0x11, 0xf9, 0xaa, 0xad, 0x77, 0xc2, 0xcf, 0x62, 0xa8, 0x35, 0xaa, +0xb9, 0x48, 0x1a, 0x0c, 0xee, 0x74, 0x17, 0x78, 0x46, 0x22, 0xd3, 0x15, 0x87, 0x0f, 0x71, 0xe4, +0x3b, 0xfd, 0xed, 0x36, 0xa4, 0xa8, 0x98, 0xf0, 0x04, 0x12, 0x13, 0x2f, 0x4d, 0xd0, 0x1a, 0x35, +0x01, 0x95, 0x51, 0x5d, 0x46, 0xd7, 0xf3, 0xa0, 0x7c, 0x56, 0x0a, 0xe9, 0x8e, 0x8f, 0x79, 0x5e, +0xbe, 0x65, 0x2d, 0x27, 0x63, 0x81, 0x60, 0x8d, 0xe8, 0x92, 0x46, 0x55, 0x4b, 0xd2, 0x14, 0x1c, +0x5b, 0x2a, 0xb8, 0xca, 0x74, 0x41, 0x60, 0x2b, 0xd3, 0x15, 0x11, 0xb3, 0x4c, 0xb9, 0x26, 0xb0, +0x63, 0x47, 0xc5, 0x9d, 0x9d, 0x5d, 0x82, 0xff, 0xe2, 0xa0, 0xf3, 0x8a, 0xc4, 0xba, 0xf3, 0x7c, +0x0e, 0xa3, 0xd1, 0x0a, 0x1e, 0x4e, 0x0b, 0x12, 0x00, 0x15, 0x12, 0x8f, 0x1a, 0xf4, 0x56, 0x5d, +0x69, 0xf0, 0x6c, 0x2c, 0x84, 0xae, 0x38, 0xb6, 0x4c, 0xa7, 0x11, 0x1b, 0xeb, 0x2a, 0xc9, 0x6c, +0x9f, 0x69, 0x05, 0xb1, 0x92, 0x7f, 0xf9, 0x22, 0x9d, 0x91, 0xdd, 0xee, 0xee, 0xf3, 0xea, 0x9e, +0x66, 0xd1, 0x0a, 0xde, 0x88, 0x1f, 0xac, 0x2d, 0x10, 0x70, 0xe5, 0x0b, 0x19, 0xb8, 0x93, 0x89, +0xf7, 0xf9, 0xcf, 0xf0, 0xfe, 0xf8, 0x8f, 0x57, 0xbb, 0xf1, 0xdb, 0x9a, 0xac, 0xce, 0xc5, 0x70, +0x81, 0x1e, 0x30, 0xdd, 0x16, 0x86, 0x27, 0x5c, 0x87, 0xd9, 0xc8, 0xf5, 0x45, 0xec, 0x45, 0x59, +0x4c, 0xd3, 0xcc, 0xf8, 0xb2, 0x6e, 0xf9, 0xbd, 0x91, 0x5b, 0x37, 0xdc, 0xf3, 0x4a, 0xfc, 0xab, +0x49, 0x56, 0x84, 0x4e, 0xf2, 0x49, 0x58, 0x89, 0x5d, 0x83, 0xbf, 0x2b, 0x0b, 0x6e, 0x05, 0xd3, +0x83, 0xfb, 0x98, 0x6b, 0xe5, 0x8d, 0xc6, 0xaf, 0x5f, 0xef, 0xbe, 0x7e, 0x09, 0x30, 0x4f, 0x06, +0xe4, 0xf2, 0xc3, 0xe1, 0x1e, 0x29, 0x46, 0xc8, 0xde, 0x1e, 0x29, 0x6b, 0xb6, 0x31, 0x2a, 0x66, +0xff, 0x99, 0x4a, 0x87, 0x78, 0x84, 0x5b, 0xdb, 0x46, 0xce, 0x97, 0x0c, 0xc8, 0x63, 0xca, 0x10, +0x83, 0x48, 0x94, 0x2b, 0xe4, 0x04, 0x14, 0x7d, 0x96, 0x28, 0x06, 0x80, 0x66, 0x9d, 0xc4, 0xef, +0x28, 0xea, 0xbd, 0x70, 0xbb, 0x5e, 0xc0, 0x58, 0xb0, 0x16, 0x51, 0x72, 0x70, 0x74, 0x44, 0xde, +0xfe, 0xd1, 0x39, 0x3f, 0xea, 0x5c, 0x1e, 0x12, 0x10, 0xdb, 0x22, 0xb6, 0xab, 0xb9, 0xbb, 0xb1, +0x93, 0xa9, 0xba, 0x30, 0xce, 0x12, 0x1f, 0xa9, 0x8e, 0xa4, 0xd8, 0x0e, 0xbd, 0x67, 0x09, 0x9c, +0x56, 0xbe, 0x2d, 0x46, 0x37, 0x0e, 0xf9, 0x6b, 0xad, 0xcc, 0x8c, 0xcc, 0x39, 0x9c, 0xe4, 0x38, +0xbf, 0x5f, 0x3f, 0x7d, 0x7c, 0xf9, 0x71, 0xd3, 0xf4, 0x85, 0x52, 0xbc, 0x66, 0xfe, 0xe1, 0xc9, +0x06, 0x54, 0x70, 0x86, 0x9c, 0x00, 0x3b, 0x34, 0xa1, 0x02, 0x72, 0x51, 0x9a, 0xc0, 0x69, 0x45, +0x49, 0x9f, 0x5c, 0x59, 0x2a, 0xb8, 0xb5, 0xda, 0xc4, 0xf2, 0xd3, 0x6c, 0x38, 0x96, 0xec, 0x8b, +0xf9, 0x1f, 0xf2, 0x74, 0x28, 0xa1, 0x2d, 0x54, 0x60, 0xd3, 0x6a, 0xaf, 0x59, 0xc0, 0x5f, 0x2e, +0x14, 0x8b, 0x80, 0x45, 0x73, 0x15, 0xa8, 0x19, 0xa6, 0xf0, 0x6e, 0x9e, 0x04, 0xf0, 0x3f, 0xa6, +0x3e, 0x5e, 0x90, 0x27, 0x87, 0x12, 0xbc, 0xc1, 0x1b, 0xad, 0x86, 0x59, 0xaa, 0x79, 0xcc, 0x9a, +0x8c, 0x8f, 0x21, 0xe9, 0xc3, 0xa1, 0xe2, 0x7f, 0x1a, 0x13, 0xea, 0x96, 0x69, 0x3f, 0x1c, 0x66, +0x0a, 0xf6, 0x1f, 0x6e, 0xa1, 0x73, 0x03, 0xf3, 0x42, 0xd3, 0x68, 0x7e, 0x07, 0xc8, 0xd9, 0xd2, +0x0d, 0x9d, 0x34, 0x19, 0x8e, 0xe9, 0xbd, 0x11, 0x86, 0xec, 0x31, 0x6e, 0x4f, 0x99, 0xcc, 0x9d, +0x04, 0x17, 0x00, 0xfd, 0x70, 0xe9, 0x5e, 0xb2, 0x11, 0x70, 0x19, 0xc4, 0x81, 0x2a, 0x18, 0xb8, +0xde, 0x7f, 0xb2, 0x66, 0x11, 0x1a, 0x58, 0xa6, 0x30, 0x88, 0xd7, 0xeb, 0xbb, 0x37, 0x16, 0x92, +0xd8, 0x79, 0xa8, 0xaf, 0x6e, 0xd9, 0xac, 0x4d, 0xa6, 0x34, 0xca, 0xd8, 0x35, 0x11, 0x63, 0xf2, +0xdb, 0xe8, 0x86, 0xf9, 0xda, 0x05, 0x82, 0x97, 0x9c, 0x29, 0xb3, 0x4d, 0x75, 0xfb, 0x84, 0x3f, +0x3e, 0xb6, 0x9f, 0xe2, 0x4e, 0xb9, 0x1c, 0x7a, 0xc3, 0x2c, 0x00, 0x69, 0xb0, 0xe5, 0x90, 0xbf, +0xff, 0x26, 0x36, 0xc6, 0x17, 0x8c, 0x19, 0xb3, 0xa4, 0xdf, 0x27, 0xad, 0x0c, 0x5a, 0xdd, 0x31, +0x20, 0x0a, 0x5a, 0x60, 0x0e, 0x4f, 0x10, 0x9e, 0x64, 0x6c, 0xbf, 0xd6, 0xac, 0x01, 0xee, 0xa6, +0x99, 0x0a, 0x6d, 0x2d, 0xd1, 0xa4, 0x2b, 0x59, 0x1a, 0x51, 0x9f, 0xd9, 0xad, 0x61, 0xab, 0x4d, +0x5a, 0xa4, 0xe5, 0x14, 0x80, 0x9d, 0x9a, 0xc4, 0x7c, 0x58, 0x8f, 0x44, 0x50, 0xb4, 0x01, 0x2e, +0x94, 0xe6, 0x71, 0xc4, 0xf0, 0xef, 0xdb, 0xd9, 0x49, 0x60, 0xe7, 0xc7, 0x94, 0xe3, 0xe2, 0x69, +0x97, 0x04, 0x76, 0x2d, 0x18, 0x6c, 0xc4, 0x11, 0x90, 0x6d, 0xe5, 0xcd, 0x0f, 0xc1, 0xe4, 0x95, +0xb1, 0xe9, 0x28, 0x2c, 0xa7, 0x7e, 0x1f, 0xe3, 0xc8, 0xb6, 0x34, 0x1d, 0x45, 0xb8, 0xe9, 0x7f, +0x19, 0x86, 0xdc, 0x23, 0xc5, 0xc0, 0x43, 0xbd, 0xc6, 0x5c, 0x0b, 0x9b, 0x7d, 0xd4, 0x7a, 0x68, +0xe7, 0x61, 0x70, 0x6a, 0xc5, 0xd7, 0x47, 0xb7, 0xac, 0xc0, 0x11, 0x0d, 0x26, 0xcc, 0x56, 0x99, +0xef, 0x33, 0xa5, 0xda, 0x04, 0xd9, 0xa4, 0x4d, 0x14, 0xb0, 0x5b, 0x82, 0xe4, 0x28, 0x25, 0x74, +0x32, 0x75, 0x9b, 0x2d, 0xa1, 0x83, 0x95, 0x89, 0x41, 0x88, 0x5d, 0xce, 0xb2, 0x5b, 0xc6, 0x62, +0x6e, 0xb7, 0x63, 0x91, 0x67, 0xc4, 0x2e, 0xad, 0x3b, 0xe4, 0x17, 0xa8, 0x8d, 0xfc, 0xbf, 0x45, +0xf6, 0x8a, 0x55, 0x9c, 0x87, 0x7c, 0xd5, 0x2d, 0xf1, 0xce, 0xa3, 0x6f, 0x74, 0x36, 0x23, 0x03, +0xd6, 0x5c, 0x06, 0x86, 0xaa, 0x24, 0xed, 0xec, 0xe6, 0xbd, 0x06, 0x2c, 0x5b, 0x23, 0x23, 0xe1, +0x99, 0xab, 0x7e, 0x06, 0x3a, 0x15, 0x42, 0x3b, 0xbe, 0x55, 0xc2, 0x75, 0x9c, 0xed, 0x19, 0xee, +0x82, 0x06, 0xfc, 0x11, 0x7e, 0x4b, 0x73, 0x76, 0x3b, 0x3b, 0x39, 0x27, 0xb6, 0x34, 0x87, 0x0b, +0x24, 0x20, 0x0b, 0x1c, 0xac, 0xec, 0xd3, 0xdf, 0x3e, 0xe3, 0xe5, 0xc3, 0xc9, 0xfb, 0x0f, 0x78, +0x3d, 0x3b, 0xfc, 0xdd, 0xaa, 0xa9, 0xe0, 0x82, 0x27, 0xa5, 0xb1, 0xb3, 0x43, 0xce, 0x50, 0x74, +0xb7, 0xb8, 0xbc, 0xec, 0x92, 0x5b, 0xeb, 0x7a, 0xbd, 0x0e, 0xa0, 0x5e, 0x01, 0x95, 0x2b, 0x11, +0xdf, 0xb9, 0x1c, 0x43, 0x8d, 0x37, 0x55, 0xf6, 0x9c, 0x3b, 0x1a, 0xb3, 0x15, 0x2a, 0xd3, 0x3a, +0xbf, 0xf8, 0x75, 0xf7, 0xc5, 0x29, 0xf4, 0xc9, 0xed, 0x22, 0xb1, 0x2a, 0xd6, 0xb1, 0x4b, 0x49, +0x12, 0xe0, 0x12, 0x16, 0xb4, 0x21, 0x2d, 0x9a, 0xe6, 0x4c, 0x9e, 0x60, 0x82, 0xc0, 0xf3, 0xb0, +0x26, 0x90, 0x7e, 0xcf, 0x30, 0xfa, 0xc5, 0xa4, 0xe5, 0x38, 0xed, 0xc7, 0x21, 0x90, 0x8f, 0xe2, +0x8e, 0x49, 0x72, 0xca, 0xa6, 0x86, 0xee, 0x53, 0x7a, 0x55, 0x59, 0x2c, 0xc5, 0xd9, 0x61, 0x84, +0xb3, 0xd7, 0x5b, 0x99, 0x7b, 0x87, 0xa7, 0xcf, 0x05, 0x3c, 0x30, 0x81, 0xb1, 0x40, 0x56, 0x8d, +0x21, 0xdf, 0xe1, 0xd4, 0x35, 0xe2, 0x1c, 0xa5, 0xca, 0xaa, 0xaf, 0xd0, 0x9a, 0x1d, 0x7b, 0x20, +0x2c, 0x52, 0x6c, 0x73, 0xb8, 0x6b, 0xa3, 0x3a, 0xa6, 0xa0, 0xd7, 0xce, 0xe3, 0xc3, 0x12, 0xa4, +0x11, 0x8c, 0x4b, 0x1d, 0xe5, 0xff, 0x33, 0x44, 0x67, 0xf2, 0x97, 0x00, 0x8c, 0xff, 0x2d, 0x7e, +0x5b, 0x1b, 0xdb, 0x98, 0xdf, 0x47, 0xb1, 0xde, 0x90, 0xdf, 0x7e, 0xac, 0xcb, 0x70, 0x1f, 0x9d, +0x0d, 0x76, 0x9f, 0x77, 0xbb, 0x87, 0xeb, 0x49, 0x8c, 0x26, 0x9a, 0x92, 0x78, 0x65, 0xee, 0xb1, +0x24, 0xfe, 0xba, 0x74, 0xd8, 0x84, 0xee, 0xbf, 0x93, 0x0c, 0x00, 0xe3, 0xc7, 0x26, 0x03, 0xb8, +0xfc, 0x8d, 0x47, 0xdd, 0x5a, 0x26, 0x6c, 0xe4, 0xe6, 0xb3, 0x2f, 0x5a, 0x37, 0x51, 0x73, 0x91, +0x3e, 0x45, 0x54, 0xbf, 0x8f, 0x1a, 0x17, 0x9b, 0xbf, 0x9c, 0x56, 0x6b, 0xb9, 0x54, 0x4d, 0x20, +0x2d, 0x33, 0x66, 0x92, 0xc8, 0x6c, 0x32, 0x6c, 0xeb, 0x23, 0x6c, 0xf5, 0xd3, 0xe0, 0x77, 0x30, +0x8f, 0x76, 0xf4, 0xfd, 0xd0, 0x4f, 0xf4, 0x63, 0xe2, 0x17, 0xa5, 0xb8, 0xcc, 0xc5, 0x9b, 0x98, +0xeb, 0x5b, 0xa8, 0x0b, 0x17, 0x28, 0xf3, 0x71, 0x35, 0x57, 0x4b, 0x77, 0x7e, 0x58, 0x92, 0x9e, +0x7d, 0x19, 0x0c, 0xfe, 0xff, 0x9a, 0x31, 0x93, 0x90, 0x27, 0xf8, 0x0a, 0xf8, 0x91, 0x8c, 0x84, +0x07, 0x12, 0x95, 0x25, 0x92, 0x2b, 0x46, 0x0e, 0x48, 0xb7, 0x29, 0x31, 0xbf, 0x27, 0x94, 0x2b, +0x9d, 0x6e, 0xd6, 0xd8, 0xda, 0x7e, 0x7b, 0x44, 0xeb, 0xa2, 0x7a, 0xb5, 0x51, 0xba, 0xcc, 0xdb, +0xcb, 0xdc, 0x77, 0xd0, 0x49, 0xd8, 0x1d, 0x1e, 0xce, 0x6c, 0x35, 0x2a, 0xff, 0x26, 0x3b, 0xf0, +0xec, 0xef, 0xb8, 0x5a, 0x9c, 0x0a, 0xfc, 0x32, 0x70, 0x09, 0xcf, 0x2e, 0xc9, 0xc4, 0x6e, 0x05, +0xac, 0xf3, 0xee, 0xb8, 0xb5, 0xa9, 0x8c, 0x56, 0xd6, 0x51, 0x4c, 0xd7, 0x2f, 0x03, 0x13, 0xff, +0xd0, 0x2a, 0x47, 0xd0, 0xec, 0x65, 0x09, 0xf7, 0xcd, 0x13, 0x04, 0x51, 0x9a, 0xca, 0xca, 0x92, +0xab, 0xae, 0x75, 0x48, 0x31, 0x20, 0xc6, 0x63, 0x00, 0xe1, 0xfc, 0x20, 0x14, 0x22, 0x6d, 0x00, +0x81, 0x8e, 0x3f, 0xfb, 0x31, 0x18, 0xce, 0xf1, 0xa5, 0x11, 0x19, 0xb1, 0x90, 0x4e, 0xb9, 0xc8, +0x64, 0x85, 0x29, 0x03, 0xae, 0xcc, 0x34, 0xe2, 0x2c, 0xc9, 0x72, 0x79, 0xcc, 0xf0, 0x25, 0x9c, +0x81, 0x86, 0x2e, 0xf3, 0xf3, 0x96, 0xf8, 0x0b, 0x9f, 0x92, 0x89, 0x79, 0xaa, 0xa7, 0x32, 0xc1, +0xbf, 0x8e, 0xb3, 0x11, 0xcf, 0x75, 0xf3, 0x74, 0x43, 0xc5, 0xd7, 0x3d, 0x75, 0x6e, 0x5d, 0xf1, +0x1b, 0x8a, 0x3d, 0xc9, 0xa2, 0x88, 0x3c, 0xed, 0x93, 0x06, 0x89, 0xf9, 0x7b, 0x97, 0xa5, 0x37, +0x3b, 0x57, 0xd6, 0x24, 0xbf, 0xb1, 0xae, 0xeb, 0xf8, 0x75, 0xdd, 0xf0, 0x95, 0x25, 0xd9, 0x58, +0x32, 0x15, 0x82, 0x42, 0xc3, 0x1a, 0xf8, 0x9b, 0x52, 0x49, 0xcc, 0xc7, 0xab, 0xfe, 0x82, 0x58, +0xcc, 0xcb, 0x30, 0x56, 0x70, 0x8b, 0xdd, 0xc2, 0xe9, 0x96, 0xb3, 0xdf, 0xcc, 0x13, 0x30, 0xef, +0xe2, 0x8b, 0xb4, 0xe3, 0x2f, 0x19, 0x9f, 0x82, 0xa1, 0xf9, 0xca, 0x9b, 0x55, 0x8a, 0xf7, 0xcb, +0x64, 0x15, 0x2e, 0x6e, 0xf2, 0x3e, 0xf9, 0x74, 0x71, 0xda, 0xb7, 0xf2, 0x94, 0x9c, 0xcf, 0x0d, +0x33, 0x19, 0xd5, 0x3d, 0x24, 0x6d, 0xa0, 0x46, 0xf5, 0x76, 0x36, 0xa0, 0x93, 0x73, 0x1a, 0x33, +0xbb, 0x85, 0xcc, 0xd7, 0x72, 0xae, 0xba, 0xd7, 0x05, 0x47, 0x1e, 0x85, 0x3c, 0x0a, 0x6c, 0xc4, +0xd2, 0xe0, 0xdd, 0x43, 0xed, 0x28, 0x9e, 0x91, 0x1b, 0x22, 0x5a, 0x7d, 0x36, 0x74, 0xf3, 0xcf, +0x2b, 0x1b, 0xc2, 0x57, 0xe9, 0x57, 0x0a, 0x71, 0x37, 0x86, 0xfb, 0xc7, 0x74, 0x96, 0xde, 0xb0, +0x5d, 0x59, 0xb9, 0x9e, 0x49, 0x8e, 0x26, 0x25, 0x08, 0xca, 0xe1, 0x0d, 0xbd, 0xb7, 0x5b, 0xf8, +0x41, 0xc6, 0x33, 0xdf, 0x24, 0x5b, 0xed, 0xa5, 0xd3, 0xe9, 0xab, 0x82, 0xd0, 0x78, 0x0a, 0x99, +0x97, 0xf9, 0x8e, 0xcb, 0xa1, 0xe1, 0x91, 0x1f, 0x06, 0x67, 0xa7, 0xe5, 0xf6, 0x9a, 0xf1, 0xeb, +0xaf, 0xac, 0xa8, 0x12, 0xb2, 0xf9, 0x86, 0xe4, 0xe5, 0xdf, 0x09, 0x9e, 0x91, 0x3b, 0xc0, 0x2e, +0xee, 0xdc, 0x48, 0xe4, 0xb4, 0xe6, 0xa6, 0x54, 0x87, 0xf8, 0xed, 0xb5, 0x70, 0x66, 0xc9, 0x8f, +0xc5, 0x77, 0xde, 0xfc, 0x2e, 0xff, 0xc6, 0xda, 0xf3, 0xf2, 0xcf, 0xe1, 0xff, 0x01, 0xf7, 0x15, +0xfc, 0x5a, 0x26, 0x1f, 0x00, 0x00}; +#endif /*__SYSTEM_HTML_H__*/ diff --git a/src/web/html/h/update_html.h b/src/web/html/h/update_html.h new file mode 100644 index 00000000..a853a186 --- /dev/null +++ b/src/web/html/h/update_html.h @@ -0,0 +1,74 @@ +#ifndef __UPDATE_HTML_H__ +#define __UPDATE_HTML_H__ +#define update_html_len 1090 +const uint8_t update_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xa5, 0x57, 0x5b, 0x6f, 0xdb, 0x36, +0x14, 0x7e, 0xef, 0xaf, 0xe0, 0xf4, 0x30, 0xd8, 0x43, 0x2c, 0x3a, 0xe9, 0x25, 0x59, 0x2a, 0x7b, +0x70, 0xd2, 0xac, 0x0b, 0x30, 0x74, 0x41, 0x9d, 0xa0, 0xe8, 0x53, 0x41, 0x51, 0x47, 0x16, 0x13, +0x8a, 0x14, 0x48, 0x4a, 0x8e, 0x37, 0xec, 0xbf, 0x8f, 0xd4, 0xc5, 0x96, 0x6c, 0x29, 0x73, 0x51, +0xbf, 0x48, 0x24, 0xcf, 0xf9, 0xce, 0x77, 0xae, 0x94, 0x83, 0x9f, 0x22, 0x49, 0xcd, 0x26, 0x03, +0x94, 0x98, 0x94, 0xcf, 0x5f, 0x05, 0xd5, 0x03, 0xd9, 0x5f, 0x90, 0x00, 0x89, 0xaa, 0xd7, 0x72, +0x69, 0x98, 0xe1, 0x30, 0x7f, 0xc8, 0x22, 0x62, 0x20, 0xc0, 0xd5, 0x6a, 0x77, 0xca, 0x99, 0x78, +0x42, 0x0a, 0xf8, 0xcc, 0xd3, 0x66, 0xc3, 0x41, 0x27, 0x00, 0xc6, 0x43, 0x0e, 0x79, 0xe6, 0x19, +0x78, 0x36, 0x98, 0x6a, 0xed, 0xa1, 0x44, 0x41, 0x5c, 0x4b, 0xf8, 0x76, 0xe3, 0xb7, 0x62, 0x36, +0xf5, 0x2f, 0xfc, 0xe9, 0x74, 0x7a, 0xea, 0x61, 0x6b, 0x3c, 0x05, 0x43, 0x90, 0x20, 0xa9, 0xd5, +0x29, 0x18, 0xac, 0x33, 0xa9, 0x2c, 0x06, 0x95, 0xc2, 0x80, 0x30, 0x33, 0x6f, 0xcd, 0x22, 0x93, +0xcc, 0x22, 0x28, 0x18, 0x85, 0x49, 0xb9, 0x38, 0x41, 0x4c, 0x30, 0xc3, 0x08, 0x9f, 0x68, 0x4a, +0x38, 0xcc, 0x4e, 0xbd, 0x06, 0x84, 0x26, 0x44, 0x69, 0xb0, 0x4a, 0x0f, 0xf7, 0xbf, 0x4f, 0x2e, +0xdc, 0xb6, 0xa6, 0x8a, 0x65, 0xa6, 0xcd, 0xe8, 0x91, 0x14, 0xa4, 0xda, 0xf5, 0x90, 0x56, 0x74, +0xe6, 0x91, 0x8c, 0xf9, 0x8f, 0x1d, 0x52, 0xf3, 0x00, 0x57, 0x12, 0x16, 0xe0, 0x7b, 0x3c, 0xa4, +0x92, 0x4b, 0xa5, 0xff, 0xc7, 0x45, 0x25, 0x43, 0x69, 0x74, 0xcb, 0x41, 0x21, 0x99, 0x88, 0xe0, +0xf9, 0x04, 0x09, 0x19, 0x4b, 0xce, 0xe5, 0xda, 0x43, 0xb8, 0xce, 0x05, 0xde, 0x25, 0x23, 0x08, +0x65, 0xb4, 0x69, 0x45, 0x3e, 0x62, 0x05, 0xa2, 0x9c, 0x68, 0x6d, 0x69, 0xc8, 0x4c, 0x90, 0xc2, +0xab, 0xe5, 0x48, 0x4d, 0x06, 0xb7, 0x39, 0x6c, 0x45, 0x5d, 0xfe, 0xbc, 0xf9, 0x22, 0x91, 0x9b, +0x0f, 0xf7, 0x0f, 0x01, 0x26, 0x7b, 0x4a, 0xbb, 0xe0, 0x5c, 0x16, 0x92, 0x45, 0xa3, 0xe9, 0xf8, +0xfd, 0x56, 0x97, 0x59, 0xc6, 0x1e, 0x92, 0x82, 0x72, 0x46, 0x9f, 0x1a, 0xab, 0xa3, 0xb1, 0xd7, +0x22, 0xa5, 0x33, 0x22, 0x5c, 0xf0, 0xdc, 0xe3, 0xbb, 0x77, 0x77, 0x6c, 0x9c, 0x6f, 0x2c, 0xda, +0x3a, 0xd6, 0x10, 0x48, 0x65, 0xc8, 0x1c, 0xfb, 0x1d, 0x06, 0x29, 0xc5, 0xac, 0xcc, 0xeb, 0xad, +0x50, 0xc2, 0x22, 0x68, 0xf2, 0x81, 0x39, 0x2b, 0xa0, 0x93, 0xd8, 0x3f, 0xed, 0xc6, 0xd6, 0x4e, +0x17, 0xe2, 0x4d, 0x3f, 0x84, 0x06, 0x65, 0x2b, 0xad, 0x03, 0xf2, 0x05, 0xc2, 0x6a, 0x77, 0x00, +0xe9, 0xed, 0x10, 0x92, 0xc9, 0xb3, 0x0e, 0xd0, 0x12, 0x8c, 0x61, 0x62, 0xa5, 0xbb, 0x38, 0x2e, +0x22, 0x0d, 0x80, 0x86, 0x0c, 0x14, 0x31, 0x52, 0x79, 0x87, 0x01, 0xdc, 0xda, 0x7b, 0xd7, 0x6f, +0x2f, 0x2f, 0x7b, 0xb6, 0x63, 0xb0, 0x69, 0xe3, 0x5e, 0xda, 0xe7, 0x03, 0xb4, 0x37, 0xda, 0x40, +0xda, 0xe5, 0x5d, 0x6e, 0xfd, 0x20, 0xeb, 0x8b, 0xad, 0x05, 0xdb, 0x80, 0xb6, 0xa3, 0x88, 0x5a, +0xb9, 0xce, 0xfd, 0x16, 0x72, 0x22, 0x9e, 0xbc, 0xf9, 0xe7, 0x9b, 0xe5, 0x3d, 0x5a, 0xdc, 0xdd, +0x0e, 0x90, 0xfd, 0xb5, 0xd1, 0x4e, 0x8c, 0xc9, 0xf4, 0x25, 0xc6, 0xc4, 0x96, 0x74, 0x64, 0x72, +0xdf, 0x31, 0xdf, 0xc7, 0xfa, 0x20, 0x69, 0x9e, 0xda, 0x5e, 0x23, 0x86, 0x49, 0x31, 0x00, 0x78, +0x3a, 0xdd, 0xf1, 0x09, 0x65, 0x6e, 0x3a, 0x0e, 0x2f, 0xdc, 0xce, 0x0f, 0xfa, 0x3b, 0x1d, 0x28, +0x51, 0xb9, 0x62, 0xc2, 0x16, 0xa6, 0x7b, 0x0c, 0x51, 0x1b, 0xd4, 0xb4, 0xac, 0x4a, 0xd5, 0x36, +0xbb, 0x00, 0xdb, 0xf6, 0xd9, 0x6b, 0xa4, 0x35, 0x8b, 0x59, 0xd5, 0xbe, 0x4d, 0x2f, 0x8b, 0x58, +0x3a, 0xb2, 0xa5, 0x68, 0x4b, 0xa3, 0xab, 0xa5, 0x48, 0x66, 0x1d, 0x6b, 0x35, 0x5c, 0xe7, 0xb8, +0x1e, 0x60, 0x7b, 0xc7, 0xa5, 0x48, 0xcc, 0x80, 0x47, 0xb6, 0xde, 0x0f, 0x8f, 0xaa, 0x5b, 0x03, +0x56, 0x20, 0xa2, 0x86, 0x4b, 0x04, 0xda, 0xb5, 0x02, 0x07, 0x6a, 0x50, 0xcc, 0x54, 0xba, 0x26, +0x0a, 0xec, 0x0b, 0x07, 0x34, 0xfa, 0xc5, 0x0f, 0x99, 0x18, 0x07, 0xb8, 0x52, 0x18, 0x40, 0x8b, +0xa5, 0x4a, 0x4b, 0x42, 0xee, 0xc5, 0x43, 0x76, 0xd4, 0x26, 0xd2, 0xae, 0xee, 0xfe, 0x5a, 0xde, +0x7b, 0x88, 0x50, 0x97, 0xf3, 0x6d, 0x37, 0x78, 0x08, 0x04, 0xad, 0x86, 0x77, 0x9a, 0x73, 0xc3, +0x32, 0xa2, 0x0c, 0x76, 0x7a, 0x13, 0x7b, 0x4a, 0x9c, 0x38, 0x85, 0xcc, 0x4c, 0xb6, 0xf7, 0x48, +0x6e, 0xe2, 0xf2, 0x1e, 0x41, 0x03, 0xbf, 0x80, 0x89, 0x2c, 0x6f, 0xae, 0x17, 0xc7, 0xd9, 0xab, +0xa7, 0x7c, 0x6d, 0xee, 0x48, 0xcd, 0x30, 0x37, 0xa6, 0x95, 0x9d, 0xd0, 0xd8, 0xf7, 0x82, 0xf0, +0xdc, 0x1e, 0x3d, 0xd4, 0xbc, 0xb7, 0x73, 0xd7, 0xd5, 0x40, 0x67, 0xea, 0x76, 0x50, 0x4b, 0x67, +0x7a, 0x32, 0x82, 0xfb, 0x53, 0xb2, 0x9f, 0xfa, 0x81, 0x4a, 0x88, 0xa5, 0x34, 0x9d, 0x42, 0x68, +0x5f, 0x3f, 0x1c, 0x62, 0xd3, 0x1d, 0xca, 0xc7, 0x77, 0x66, 0x7d, 0x11, 0xa1, 0x9f, 0xa9, 0xcc, +0x36, 0xe8, 0x6c, 0x7a, 0xf6, 0xba, 0xdb, 0x03, 0x39, 0xdf, 0xe3, 0xcb, 0xd9, 0xfc, 0xc0, 0x40, +0xc4, 0x34, 0x95, 0x2a, 0xf2, 0x57, 0x2b, 0xfc, 0xe5, 0xef, 0xe4, 0xf9, 0xe6, 0xeb, 0xbb, 0xb3, +0xf4, 0xaa, 0x67, 0x0a, 0x54, 0x62, 0xce, 0x80, 0xad, 0x28, 0x76, 0x04, 0xf0, 0x8a, 0x99, 0x24, +0x0f, 0x7d, 0x2a, 0x53, 0xcc, 0xf3, 0x94, 0x64, 0x79, 0xe9, 0xcb, 0x21, 0xf2, 0xc7, 0x52, 0xee, +0x10, 0x38, 0xc0, 0x0d, 0xff, 0xfd, 0xa6, 0xac, 0x43, 0xa7, 0xd8, 0x2a, 0xe9, 0xc4, 0x6e, 0xc0, +0xdf, 0x3d, 0x83, 0x47, 0xd1, 0xc4, 0x76, 0x9d, 0x32, 0xa3, 0x71, 0x18, 0x9f, 0x9f, 0x9f, 0x9d, +0xbf, 0xb5, 0x34, 0x6f, 0xef, 0xd1, 0xf2, 0x8f, 0xc5, 0x25, 0xaa, 0x77, 0xd0, 0xe5, 0x25, 0x6a, +0x66, 0xdc, 0x60, 0x54, 0xca, 0xfc, 0x83, 0xce, 0xbe, 0xb9, 0x4a, 0xf5, 0x8e, 0x8d, 0x1c, 0x55, +0x60, 0x87, 0x6d, 0x01, 0x8e, 0x83, 0x14, 0xda, 0x97, 0x6a, 0x65, 0x15, 0x29, 0x08, 0x0d, 0x96, +0xd0, 0x66, 0x22, 0xe8, 0x44, 0x13, 0xfc, 0xc6, 0x9f, 0xe2, 0x08, 0x20, 0x3a, 0x88, 0x28, 0x9a, +0x5f, 0x5f, 0xa3, 0xab, 0xaf, 0x93, 0x4f, 0xd7, 0x93, 0xe5, 0x02, 0x59, 0xb1, 0x23, 0x62, 0xbb, +0x5f, 0xbb, 0x2f, 0x7e, 0xf9, 0x75, 0x5d, 0x88, 0x73, 0x51, 0x8e, 0x09, 0x94, 0xb9, 0xb6, 0xff, +0x08, 0xc2, 0xde, 0xee, 0x74, 0x24, 0xc3, 0xc7, 0x31, 0xfa, 0xe7, 0xa0, 0x95, 0x4a, 0x99, 0x4f, +0xf6, 0xcb, 0xc7, 0x9d, 0xbf, 0xef, 0x3f, 0xbe, 0x59, 0xde, 0xbd, 0x74, 0xfc, 0x59, 0x6b, 0xd6, +0x73, 0xfe, 0xef, 0xab, 0x7e, 0x56, 0x55, 0xc7, 0xf7, 0x50, 0x89, 0xea, 0x7b, 0xcd, 0xb7, 0xb1, +0xbb, 0xe1, 0xe0, 0x5e, 0xaf, 0x36, 0xb7, 0xd1, 0xa8, 0x9a, 0x84, 0x63, 0x5f, 0xe7, 0xa1, 0xad, +0x80, 0x51, 0x0f, 0x8d, 0x82, 0x28, 0x04, 0x68, 0x36, 0x8c, 0xd0, 0x0c, 0xf7, 0x1e, 0x5d, 0xf0, +0x15, 0x64, 0x9c, 0x50, 0xb8, 0x4e, 0x18, 0x8f, 0x14, 0x88, 0x91, 0xbb, 0xf2, 0x46, 0xf5, 0xc8, +0x43, 0xda, 0xe6, 0xd2, 0xd8, 0x9c, 0x8e, 0x5f, 0xf6, 0xce, 0x1a, 0x5c, 0x3c, 0x92, 0xe7, 0x51, +0x79, 0xfd, 0xe3, 0x55, 0x15, 0x73, 0xef, 0xa4, 0x93, 0x82, 0x16, 0xc2, 0xee, 0x8b, 0xbc, 0x5a, +0x55, 0x5f, 0xc3, 0xf6, 0x03, 0xb9, 0xfc, 0xe3, 0xf2, 0x1f, 0x6f, 0x3a, 0xe4, 0xb0, 0xd0, 0x0c, +0x00, 0x00}; +#endif /*__UPDATE_HTML_H__*/ diff --git a/src/web/html/h/visualization_html.h b/src/web/html/h/visualization_html.h new file mode 100644 index 00000000..4fdaad5d --- /dev/null +++ b/src/web/html/h/visualization_html.h @@ -0,0 +1,275 @@ +#ifndef __VISUALIZATION_HTML_H__ +#define __VISUALIZATION_HTML_H__ +#define visualization_html_len 4311 +const uint8_t visualization_html[] PROGMEM = { +0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xed, 0x1c, 0x6b, 0x73, 0xdb, 0x38, +0xee, 0x7b, 0x7f, 0x05, 0xab, 0x99, 0xed, 0xda, 0x5b, 0x3f, 0xf3, 0x6a, 0x37, 0xaf, 0x4e, 0x9a, +0xa6, 0xdb, 0xdc, 0xb5, 0x69, 0xaf, 0xc9, 0x6e, 0x6f, 0x27, 0x93, 0xc9, 0xd0, 0x12, 0x6d, 0xb1, +0x91, 0x25, 0x9d, 0x48, 0xdb, 0xf1, 0xee, 0xe4, 0xbf, 0x1f, 0x40, 0x4a, 0xb2, 0x6c, 0x8b, 0xb2, +0xe4, 0xb8, 0xdd, 0xbd, 0x99, 0xcb, 0x87, 0x24, 0x92, 0x08, 0x10, 0x00, 0x01, 0x10, 0x00, 0x21, +0x1d, 0x3e, 0x75, 0x02, 0x5b, 0x4e, 0x43, 0x46, 0x5c, 0x39, 0xf4, 0x8e, 0x9f, 0x1c, 0xea, 0x3f, +0x04, 0x7e, 0x0e, 0x5d, 0x46, 0x1d, 0xfd, 0xaf, 0xba, 0x94, 0x5c, 0x7a, 0xec, 0xf8, 0x3d, 0x1f, +0xb3, 0xc3, 0xb6, 0xfe, 0x7f, 0xf6, 0xcc, 0xe3, 0xfe, 0x1d, 0x89, 0x98, 0x77, 0x64, 0x09, 0x39, +0xf5, 0x98, 0x70, 0x19, 0x93, 0x16, 0x41, 0xbc, 0x47, 0x96, 0x64, 0xf7, 0xb2, 0x6d, 0x0b, 0x61, +0x11, 0x37, 0x62, 0xfd, 0x78, 0x44, 0x0b, 0x6e, 0xbc, 0x1a, 0x1f, 0x75, 0x5a, 0x2f, 0x5b, 0x9d, +0x4e, 0xa7, 0x6b, 0xb5, 0x61, 0xea, 0x21, 0x93, 0x94, 0xf8, 0x74, 0x08, 0x30, 0x63, 0xce, 0x26, +0x61, 0x10, 0x01, 0x0e, 0x3b, 0xf0, 0x25, 0xf3, 0xe5, 0x91, 0x35, 0xe1, 0x8e, 0x74, 0x8f, 0x1c, +0x36, 0xe6, 0x36, 0x6b, 0xaa, 0x8b, 0x06, 0xe1, 0x3e, 0x97, 0x9c, 0x7a, 0x4d, 0x61, 0x53, 0x8f, +0x1d, 0x75, 0xad, 0x04, 0x89, 0xed, 0xd2, 0x48, 0x30, 0x00, 0xfa, 0xf5, 0xea, 0x6d, 0xf3, 0x25, +0xde, 0x16, 0x76, 0xc4, 0x43, 0x99, 0xa5, 0xe8, 0x2b, 0x1d, 0x53, 0x7d, 0xd7, 0x22, 0x22, 0xb2, +0x8f, 0x2c, 0x1a, 0xf2, 0xd6, 0xd7, 0x39, 0xa2, 0x8e, 0x0f, 0xdb, 0x7a, 0x04, 0x20, 0xa8, 0xc2, +0xa1, 0x1d, 0x78, 0x41, 0x24, 0x56, 0xb0, 0x18, 0x05, 0xbd, 0x40, 0x8a, 0x0c, 0x83, 0x7e, 0xc0, +0x7d, 0x87, 0xdd, 0x37, 0x88, 0x1f, 0xf4, 0x03, 0xcf, 0x0b, 0x26, 0x16, 0x69, 0x67, 0x44, 0x9c, +0x01, 0xa5, 0x61, 0xe8, 0xb1, 0xe6, 0x30, 0xe8, 0x71, 0xf8, 0x33, 0x61, 0xbd, 0x26, 0xdc, 0x68, +0xda, 0x34, 0xa4, 0x3d, 0x8f, 0x65, 0x10, 0x4e, 0x99, 0xb0, 0xe2, 0xa5, 0x6c, 0xcf, 0xd6, 0xf2, +0xb0, 0x17, 0x38, 0xd3, 0x0c, 0x5e, 0x87, 0x8f, 0x89, 0xed, 0x51, 0x21, 0x80, 0x8f, 0x20, 0xf4, +0xe9, 0x38, 0x81, 0xa1, 0x31, 0x37, 0xed, 0x2c, 0x13, 0xe9, 0x50, 0x54, 0x00, 0xeb, 0xf8, 0xc4, +0x0d, 0xa6, 0x6f, 0xae, 0x7e, 0x3d, 0x6c, 0xd3, 0x05, 0xa0, 0x99, 0x74, 0xf7, 0xc7, 0x01, 0x77, +0x6a, 0x9d, 0xfa, 0x41, 0x0a, 0xcb, 0x81, 0x42, 0x8b, 0x04, 0xbe, 0xed, 0x71, 0xfb, 0x2e, 0x99, +0xb5, 0x56, 0xb7, 0x32, 0x44, 0x89, 0x90, 0xfa, 0x28, 0x7d, 0xfc, 0x53, 0xf9, 0xee, 0x8c, 0x1a, +0xe4, 0x8d, 0x3b, 0x29, 0x63, 0x09, 0x01, 0x5a, 0x72, 0xd9, 0xf9, 0xa8, 0x1a, 0x06, 0x63, 0xb6, +0xd3, 0x41, 0x2e, 0x77, 0x58, 0xb2, 0xa0, 0x6d, 0x0f, 0xb4, 0x7e, 0x4e, 0x33, 0xb4, 0x19, 0xd0, +0x3c, 0x14, 0x3b, 0xf9, 0x28, 0x04, 0x8b, 0x40, 0x55, 0xe7, 0x90, 0x7c, 0x61, 0x3d, 0x7d, 0xd7, +0x80, 0x69, 0xd7, 0x84, 0x49, 0x8e, 0xc2, 0x39, 0x44, 0x97, 0x4c, 0x4a, 0xee, 0x0f, 0xc4, 0x3c, +0x1e, 0x94, 0x48, 0x82, 0x40, 0xb0, 0x90, 0x45, 0x54, 0x06, 0x91, 0xb5, 0x2c, 0xc0, 0x74, 0xbe, +0xbd, 0xfc, 0xf9, 0x46, 0xa1, 0x43, 0xe5, 0x3c, 0xfb, 0xbf, 0xaa, 0x5b, 0x06, 0xb2, 0x5f, 0x18, +0xc8, 0x9e, 0x0a, 0xc9, 0x86, 0xf3, 0x74, 0xab, 0x5b, 0x8f, 0xa4, 0xfa, 0x65, 0x3a, 0x03, 0x58, +0x30, 0x98, 0x24, 0x8d, 0x06, 0x68, 0xfa, 0xb7, 0x3d, 0x8f, 0xfa, 0x77, 0xd6, 0xf1, 0xe7, 0xb3, +0xcb, 0x2b, 0x72, 0xf2, 0xe9, 0xdc, 0x40, 0xec, 0xcf, 0x09, 0xb4, 0x2b, 0x65, 0x28, 0xf6, 0xdb, +0x6d, 0x0a, 0x2a, 0xed, 0xc8, 0x51, 0x0b, 0x29, 0x5f, 0xc4, 0xf5, 0x26, 0xb0, 0x47, 0x43, 0xb0, +0x2d, 0x2a, 0x79, 0xe0, 0x1b, 0x10, 0x76, 0x3b, 0x33, 0x7a, 0x7a, 0xc1, 0x48, 0xce, 0x31, 0x7c, +0x82, 0x77, 0x1e, 0xc9, 0x6f, 0xc7, 0xa0, 0xa2, 0xc1, 0x80, 0xfb, 0xa0, 0x98, 0xf8, 0xc7, 0x44, +0x9a, 0x11, 0x12, 0xa8, 0x52, 0xa0, 0x59, 0xea, 0x0e, 0xdb, 0x60, 0x3e, 0x0b, 0x86, 0x34, 0xe1, +0x7d, 0xae, 0xcd, 0x37, 0xb1, 0x65, 0xbf, 0x1f, 0x20, 0xb1, 0x6a, 0x68, 0x06, 0x62, 0x1e, 0x2a, +0x02, 0x07, 0xc5, 0xa2, 0x8c, 0xc1, 0xcd, 0x3d, 0x8e, 0x1d, 0xd6, 0xc2, 0xe3, 0xb9, 0x21, 0x68, +0x7f, 0xe9, 0x34, 0x4b, 0xa3, 0xc2, 0xe3, 0xb3, 0x31, 0x8b, 0xa6, 0xb1, 0x2c, 0x71, 0x3c, 0x30, +0x16, 0x81, 0x8f, 0x4e, 0xc5, 0x48, 0x04, 0x83, 0x59, 0x1c, 0x41, 0xa4, 0xcb, 0xc8, 0x98, 0x7a, +0x23, 0x26, 0x08, 0x8d, 0x18, 0xd1, 0xaa, 0xed, 0x1c, 0xb6, 0xc3, 0x05, 0xda, 0x16, 0x38, 0x31, +0x30, 0xd6, 0x0f, 0x02, 0x39, 0xc7, 0x57, 0xd6, 0x9b, 0x7a, 0xac, 0x2f, 0xe7, 0x7d, 0x4c, 0x79, +0x45, 0x8b, 0xfd, 0x2a, 0x79, 0x66, 0x07, 0xe1, 0x94, 0x6c, 0x75, 0xb6, 0xb6, 0xe7, 0x97, 0x74, +0xe4, 0x2d, 0xd0, 0xeb, 0xf1, 0xe3, 0xa5, 0x09, 0x1c, 0x2e, 0xec, 0x20, 0x72, 0x5a, 0x83, 0x41, +0xfb, 0xcb, 0x1f, 0xee, 0xfd, 0xd9, 0xef, 0x7b, 0x5b, 0xc3, 0xd7, 0x39, 0x4a, 0xad, 0x87, 0xe1, +0x04, 0x87, 0xe0, 0xe8, 0x4a, 0x20, 0x1e, 0x70, 0xe9, 0x8e, 0x7a, 0x2d, 0x3b, 0x18, 0xb6, 0xbd, +0xd1, 0x90, 0x86, 0x23, 0xc5, 0xcb, 0x32, 0xe6, 0x5f, 0xd4, 0xb8, 0x65, 0xc4, 0x87, 0xed, 0x84, +0xfe, 0x45, 0x1d, 0x8b, 0x45, 0x17, 0xf1, 0x81, 0x3b, 0x27, 0x3b, 0x03, 0xbf, 0x0b, 0x13, 0x96, +0x22, 0xb3, 0x0d, 0xd7, 0x43, 0x2e, 0x45, 0xbb, 0xd7, 0x7f, 0xf1, 0x62, 0xeb, 0xc5, 0x2e, 0x90, +0x79, 0x7e, 0x45, 0x2e, 0xdf, 0x9d, 0xec, 0x93, 0xf8, 0x0e, 0xd9, 0xdf, 0x27, 0x89, 0xc9, 0x1a, +0xa5, 0xa2, 0xd6, 0x9f, 0x89, 0xf0, 0x16, 0x43, 0x00, 0xab, 0xac, 0xe4, 0xec, 0x88, 0x81, 0xef, +0x18, 0x33, 0xa4, 0x21, 0xf0, 0x45, 0x2b, 0x88, 0x06, 0x00, 0x68, 0x33, 0x5f, 0x30, 0x20, 0x68, +0xda, 0xf4, 0xed, 0xa6, 0xa0, 0xed, 0x9d, 0x56, 0xa7, 0xed, 0x30, 0xe6, 0x2c, 0x49, 0x94, 0x1c, +0x9f, 0x9e, 0x92, 0xd7, 0xbf, 0x37, 0x2f, 0x4e, 0x9b, 0x97, 0x27, 0x04, 0x86, 0x95, 0x90, 0xed, +0xa2, 0xee, 0x16, 0x46, 0x42, 0xf3, 0x2c, 0x8c, 0x69, 0x44, 0xd8, 0x3d, 0xfb, 0xe8, 0xdb, 0x8c, +0x1c, 0x11, 0x19, 0x8d, 0xd8, 0xc1, 0xd2, 0xf3, 0x11, 0x84, 0x60, 0x02, 0x22, 0xb1, 0xf1, 0x99, +0xbf, 0xfc, 0x70, 0x78, 0x3e, 0x7e, 0x07, 0xf1, 0x24, 0x00, 0x5f, 0xdf, 0xe4, 0x3c, 0xbd, 0x18, +0x0d, 0xe1, 0x51, 0x67, 0xf9, 0x89, 0x0c, 0x24, 0x45, 0xa8, 0x93, 0x28, 0xa2, 0xd3, 0xda, 0x6e, +0xbd, 0xd5, 0xe7, 0x9e, 0x87, 0x31, 0xc4, 0xf2, 0xc8, 0x4f, 0x93, 0xe8, 0xc4, 0xbe, 0x3b, 0x78, +0x32, 0xf7, 0xa4, 0x3f, 0xf2, 0x6d, 0x74, 0xd1, 0x24, 0xc4, 0x38, 0xf0, 0x17, 0xe6, 0xc3, 0x2e, +0x6b, 0xd7, 0x82, 0xde, 0xd7, 0x3a, 0xf9, 0x73, 0xc9, 0x7d, 0xf0, 0x7e, 0x0d, 0x59, 0x23, 0x47, +0x47, 0x09, 0xb3, 0xf5, 0xe5, 0x41, 0xf8, 0xa3, 0x90, 0x5d, 0x40, 0xa8, 0x82, 0x88, 0x0e, 0xcc, +0x43, 0xce, 0x2e, 0x3f, 0x19, 0x86, 0x3c, 0x3c, 0xc9, 0x05, 0xf8, 0x2c, 0x04, 0xcf, 0x81, 0x78, +0x30, 0x30, 0xe5, 0x8f, 0x86, 0xaf, 0xf9, 0xa0, 0x06, 0x6e, 0xac, 0xa1, 0xc4, 0xdf, 0x20, 0x0e, +0x13, 0x79, 0x9c, 0x45, 0x10, 0x28, 0x44, 0x3e, 0x19, 0x7a, 0x35, 0x0b, 0x74, 0xc0, 0x6a, 0x90, +0x3f, 0x95, 0x7d, 0xed, 0x13, 0x8c, 0x50, 0x9b, 0x7b, 0x04, 0x7f, 0x8b, 0x61, 0x73, 0x87, 0xd0, +0xa6, 0x6d, 0x3d, 0x34, 0xc8, 0x75, 0x2e, 0x4f, 0x39, 0xe0, 0x11, 0x04, 0xa7, 0x0f, 0x8d, 0xdc, +0xd1, 0x06, 0x08, 0x98, 0xca, 0x3c, 0x43, 0x16, 0x0e, 0xdd, 0x75, 0x16, 0xb0, 0x2f, 0x9a, 0xbb, +0x04, 0x7e, 0x0d, 0x9d, 0xe6, 0x0e, 0x62, 0xb8, 0x94, 0x11, 0x44, 0x3a, 0xb5, 0x0f, 0x54, 0xba, +0xad, 0x28, 0x18, 0xf9, 0x0e, 0xca, 0x81, 0xfc, 0x44, 0xba, 0x9d, 0x4e, 0x9d, 0xb4, 0xd5, 0x9f, +0x7a, 0x63, 0x9d, 0x59, 0xf6, 0xe2, 0x59, 0x5e, 0x90, 0xe1, 0x7d, 0xb3, 0x8b, 0x53, 0xa1, 0x6c, +0xeb, 0x46, 0x54, 0x37, 0xa6, 0x79, 0x36, 0x28, 0xaf, 0x75, 0xf8, 0xf8, 0x99, 0x84, 0x31, 0xfd, +0xa8, 0x15, 0x46, 0x0c, 0xf9, 0x4f, 0x96, 0xef, 0xde, 0x94, 0x57, 0xca, 0x0f, 0xdc, 0xd9, 0xa4, +0x52, 0xe2, 0x3f, 0xb0, 0x1e, 0xdb, 0x64, 0xd8, 0x6b, 0x6e, 0xfd, 0x8d, 0xd5, 0x73, 0xef, 0x9b, +0xaa, 0xe5, 0xcb, 0xff, 0x75, 0x75, 0xfc, 0xee, 0x9a, 0xa8, 0x36, 0x0f, 0x51, 0xcb, 0xd3, 0xbd, +0x7e, 0x10, 0xd5, 0x70, 0xd7, 0xe0, 0x6a, 0xdb, 0x81, 0x3f, 0x87, 0x64, 0x17, 0xfe, 0x3c, 0x7f, +0x9e, 0x37, 0x18, 0x7f, 0x14, 0xae, 0x6b, 0x7e, 0x03, 0xe3, 0x33, 0x4b, 0x9b, 0xde, 0xcd, 0xae, +0x6f, 0x9e, 0xb7, 0xaf, 0xa0, 0xfc, 0xb0, 0x26, 0x64, 0x28, 0xb5, 0xb6, 0xef, 0x9a, 0x64, 0xbd, +0x8e, 0xe6, 0xe6, 0xc0, 0x84, 0xcd, 0x2d, 0xcd, 0x59, 0xd3, 0x2d, 0xb3, 0xaa, 0xd5, 0xb4, 0xa7, +0x98, 0x56, 0xd4, 0xe6, 0x2d, 0xfc, 0x05, 0x96, 0xad, 0xb4, 0xda, 0xba, 0xfa, 0x78, 0x75, 0xf2, +0xde, 0xaa, 0x17, 0xe2, 0x2b, 0x30, 0x9d, 0x7a, 0x63, 0x3d, 0xce, 0x7b, 0x83, 0x72, 0x06, 0x9f, +0xcb, 0xfc, 0x0a, 0x38, 0xfc, 0x89, 0x37, 0x69, 0xad, 0x2a, 0x9d, 0x1b, 0x60, 0xf4, 0x0b, 0xe0, +0xb1, 0x4e, 0x4e, 0xc9, 0xa7, 0x60, 0x02, 0x39, 0x43, 0xbd, 0x51, 0x0d, 0x45, 0x57, 0xa1, 0x70, +0x11, 0xc7, 0xef, 0x9c, 0x79, 0x0e, 0x79, 0x43, 0xa7, 0x95, 0x91, 0x6c, 0x21, 0x92, 0xbb, 0x2c, +0x96, 0x2b, 0xbc, 0xbf, 0x42, 0xfa, 0x37, 0xf5, 0xca, 0x3a, 0xe2, 0x46, 0xd6, 0x43, 0xbd, 0xf1, +0x2d, 0x85, 0x8b, 0x9b, 0x8d, 0x66, 0x6a, 0x3b, 0x15, 0xee, 0x9b, 0x6a, 0xc2, 0x9d, 0xa1, 0xd8, +0x41, 0x14, 0xe0, 0x18, 0x10, 0xc9, 0x67, 0x46, 0x6d, 0x0c, 0xd1, 0x13, 0x54, 0x2b, 0x44, 0xf3, +0xa4, 0xe2, 0xa3, 0x9c, 0xdb, 0x4b, 0x7e, 0x2d, 0xd7, 0xad, 0xf1, 0xf1, 0x3b, 0x46, 0x9d, 0x82, +0x20, 0xb6, 0x43, 0x9e, 0x1e, 0x11, 0x78, 0xdc, 0x12, 0x92, 0xca, 0x11, 0xee, 0xbd, 0xa4, 0xdd, +0x26, 0x81, 0xef, 0x4d, 0x09, 0x75, 0x9c, 0xd8, 0x2d, 0xc2, 0x40, 0xc2, 0x7d, 0xc8, 0x96, 0x21, +0x6f, 0x25, 0x5c, 0xe0, 0x63, 0xee, 0xb3, 0x02, 0xdf, 0xd7, 0xb9, 0x21, 0xcf, 0x35, 0x5a, 0xdb, +0x85, 0x0b, 0x50, 0xa1, 0x03, 0x44, 0xfb, 0xe9, 0xf6, 0xe4, 0xb4, 0x00, 0x6a, 0x7b, 0x01, 0xea, +0x65, 0x02, 0xf5, 0xa6, 0x08, 0x6a, 0x67, 0x01, 0xaa, 0xdb, 0xd1, 0x60, 0xff, 0xca, 0x9b, 0x6c, +0x39, 0x96, 0x4e, 0x0c, 0x65, 0x1e, 0xc9, 0x0b, 0x8d, 0x43, 0xa9, 0x3b, 0xd8, 0x8c, 0x01, 0x6a, +0x6b, 0x01, 0x6a, 0x2f, 0x03, 0xa5, 0x6c, 0x64, 0xd9, 0x97, 0xab, 0xf4, 0x03, 0x36, 0x06, 0xdc, +0xf4, 0x6a, 0xd6, 0x33, 0xbf, 0x27, 0xc2, 0x83, 0x67, 0x0e, 0x1b, 0x1c, 0x9c, 0x5a, 0x39, 0xa1, +0x3f, 0x8e, 0xb6, 0x3d, 0x97, 0x00, 0x00, 0xac, 0xd4, 0xd1, 0xfc, 0x4a, 0xbd, 0x22, 0x16, 0x1f, +0x37, 0xdd, 0x26, 0x64, 0xec, 0x16, 0xd9, 0xd7, 0x17, 0x96, 0x09, 0x47, 0x6f, 0x50, 0x80, 0xa3, +0x37, 0xc8, 0x22, 0x01, 0x27, 0x97, 0x8f, 0x25, 0x9c, 0x44, 0xef, 0x39, 0x64, 0xc1, 0x80, 0xc9, +0xf2, 0xdb, 0xd4, 0x3a, 0x78, 0x92, 0xa7, 0x51, 0x7b, 0xbb, 0xbb, 0xdb, 0xbb, 0x89, 0x56, 0x85, +0x68, 0x0e, 0xb7, 0x1e, 0x42, 0xdd, 0x42, 0x16, 0xeb, 0x98, 0xb6, 0xcc, 0x0c, 0xea, 0x3c, 0x30, +0xf2, 0x9c, 0xc4, 0xb2, 0xfa, 0xc1, 0xca, 0xcf, 0xa1, 0xb2, 0xaa, 0x3c, 0xa4, 0xf7, 0xb7, 0x80, +0xd0, 0x6c, 0x65, 0xe9, 0x6c, 0xb0, 0x7a, 0x68, 0xbd, 0x80, 0x3e, 0xb3, 0x51, 0x67, 0x50, 0xc0, +0x5e, 0x9d, 0x4b, 0x8e, 0x8e, 0xcd, 0x90, 0xaa, 0x2f, 0xd6, 0x66, 0xb6, 0xf0, 0xad, 0xef, 0xb0, +0x7b, 0x23, 0x9f, 0xa0, 0x4d, 0x0f, 0xdf, 0xce, 0xc5, 0x96, 0xdc, 0xbe, 0xb3, 0x51, 0x1f, 0x49, +0x29, 0x0c, 0xb8, 0x8f, 0x75, 0xb1, 0x46, 0x52, 0xe4, 0xdf, 0x4f, 0xdd, 0x58, 0xcd, 0xa4, 0x36, +0x8b, 0x3f, 0x03, 0x26, 0x4f, 0xbe, 0xd2, 0xfb, 0x9a, 0xaa, 0xea, 0xb6, 0x13, 0x97, 0xd5, 0x86, +0x3f, 0x02, 0xd0, 0xb4, 0x51, 0x00, 0xb8, 0x9e, 0xdc, 0x69, 0xe8, 0x1c, 0xfa, 0x7c, 0xfc, 0x9b, +0x7e, 0x64, 0xc8, 0xcc, 0xe7, 0x56, 0x15, 0x08, 0x47, 0x60, 0x3c, 0x4d, 0xa9, 0xd7, 0xd7, 0x0e, +0x65, 0x30, 0x6b, 0x36, 0xb0, 0xa8, 0x14, 0xec, 0x43, 0xe0, 0x50, 0x4f, 0x39, 0xec, 0x87, 0x52, +0x22, 0x37, 0x45, 0xd1, 0x4e, 0xd3, 0x0f, 0x7c, 0x46, 0x1c, 0x4c, 0x8b, 0x7a, 0x5e, 0x60, 0xdf, +0x91, 0x44, 0xc0, 0x18, 0x3f, 0x9d, 0x64, 0x76, 0x2b, 0x72, 0x1a, 0xf8, 0x32, 0x0a, 0xbc, 0x7d, +0xa5, 0x20, 0x89, 0x6d, 0x94, 0xe0, 0xd0, 0x3c, 0xb5, 0x9e, 0x50, 0xcd, 0xad, 0xa8, 0x98, 0x9b, +0xfa, 0xd3, 0xe9, 0xc2, 0x4c, 0x2b, 0x27, 0xba, 0x79, 0x9c, 0xb8, 0xff, 0x02, 0x8d, 0xa3, 0x1e, +0x8d, 0x86, 0x79, 0xfa, 0x76, 0x82, 0x0f, 0x4a, 0x6a, 0x5b, 0xcd, 0x52, 0xa3, 0x85, 0x16, 0x17, +0x22, 0x52, 0x68, 0x6f, 0x6d, 0x5f, 0xd6, 0x1f, 0xa5, 0x81, 0xd1, 0x92, 0x45, 0xc6, 0x99, 0xe8, +0x6c, 0x2b, 0xdb, 0xbd, 0x41, 0xf7, 0x26, 0x5b, 0xdc, 0xf7, 0x59, 0x74, 0xc5, 0xee, 0xe5, 0xda, +0x21, 0x4d, 0xf5, 0x58, 0x5b, 0xfb, 0xa9, 0xde, 0x60, 0xfd, 0x50, 0xbb, 0x74, 0xa4, 0x9d, 0x0d, +0x51, 0x1e, 0x11, 0x6d, 0x67, 0x03, 0x87, 0x47, 0x45, 0xdc, 0xd9, 0x58, 0xe2, 0xef, 0x1e, 0x75, +0x27, 0xdb, 0x56, 0xe9, 0xc8, 0x3b, 0x13, 0xa3, 0x75, 0x53, 0x69, 0x7f, 0xa0, 0xf7, 0xe4, 0xa4, +0x7a, 0x08, 0x9e, 0x8d, 0x12, 0x1f, 0x11, 0xc9, 0xcf, 0xd0, 0xa8, 0x6c, 0xeb, 0xb7, 0x78, 0xfd, +0x7f, 0x0b, 0x3c, 0x49, 0x07, 0x6c, 0x2d, 0x44, 0x8a, 0xb5, 0x93, 0x18, 0xd1, 0xe9, 0x28, 0x8a, +0xf0, 0x94, 0x6a, 0x1d, 0x44, 0x2a, 0x45, 0x79, 0xf7, 0x07, 0x62, 0x7a, 0x1b, 0xb1, 0xff, 0x8c, +0x98, 0x6f, 0x4f, 0xd7, 0x42, 0xf4, 0x33, 0x22, 0xfa, 0x01, 0xf1, 0x9c, 0xf5, 0xfb, 0xdc, 0xe6, +0x6b, 0x23, 0xea, 0x76, 0x0a, 0x52, 0x9e, 0x35, 0xf0, 0xa9, 0x0c, 0x0a, 0x71, 0xe9, 0x7d, 0xe8, +0x2d, 0x20, 0x0c, 0xfe, 0x9a, 0xe4, 0xc9, 0x58, 0x9e, 0x3c, 0x75, 0x1f, 0x5d, 0x9d, 0xec, 0x6e, +0x25, 0xe5, 0xc9, 0xbd, 0xa4, 0x3c, 0x09, 0xb7, 0xfe, 0xee, 0xf5, 0xc9, 0xa4, 0xb0, 0xfd, 0xed, +0xeb, 0x94, 0x5b, 0xff, 0xaf, 0x53, 0x96, 0xaf, 0x53, 0xda, 0x6e, 0x4d, 0xe7, 0x6e, 0x0d, 0xd5, +0xd6, 0xd3, 0xc0, 0x73, 0xe9, 0x5c, 0x9d, 0x5c, 0x4a, 0x1d, 0x4d, 0x69, 0xa3, 0xed, 0x96, 0x4b, +0x1b, 0x8d, 0x29, 0x23, 0x20, 0xc8, 0x4d, 0x19, 0xcb, 0xd4, 0xec, 0x75, 0xa9, 0x5e, 0x56, 0x34, +0x05, 0x0c, 0x12, 0x20, 0xb0, 0x9b, 0x25, 0x34, 0x4a, 0x16, 0xe5, 0x55, 0xa4, 0x74, 0x90, 0xb1, +0x6e, 0x2e, 0x94, 0x3a, 0x0e, 0xa1, 0xe2, 0x0a, 0x75, 0xdc, 0xa9, 0x23, 0x8c, 0xb2, 0x7b, 0x54, +0x06, 0xc3, 0xde, 0x3c, 0x06, 0xdc, 0x30, 0xab, 0xa2, 0xd8, 0x4d, 0x51, 0xe0, 0x7f, 0xd6, 0x79, +0x14, 0x51, 0x87, 0xab, 0x7e, 0x94, 0x0a, 0x48, 0xb6, 0x53, 0x24, 0x6a, 0x67, 0x2a, 0x1d, 0xde, +0x64, 0x50, 0xec, 0xa4, 0x28, 0x76, 0x6e, 0x16, 0xe3, 0x9a, 0xd2, 0x48, 0x3a, 0x29, 0x92, 0x4e, +0x2c, 0xd1, 0x92, 0xdb, 0x75, 0x06, 0x47, 0x37, 0xc5, 0xd1, 0x8d, 0x71, 0xa4, 0x3b, 0xf5, 0x06, +0xb6, 0x97, 0xd2, 0x87, 0x0e, 0xe2, 0xdc, 0xef, 0x07, 0xa6, 0xea, 0x1c, 0x5a, 0x20, 0x70, 0x85, +0x43, 0xb0, 0xe2, 0xf2, 0x9e, 0x0a, 0x09, 0x36, 0x65, 0x33, 0xd8, 0x73, 0x1d, 0xe2, 0x50, 0x49, +0x89, 0x8a, 0x0a, 0x84, 0x84, 0x4b, 0x2a, 0x41, 0x35, 0x0f, 0xf2, 0xca, 0x31, 0xb8, 0xdb, 0x4a, +0x71, 0x0b, 0xda, 0x2b, 0x6f, 0xc5, 0xc8, 0xb6, 0x99, 0x10, 0xe4, 0x98, 0x74, 0x4c, 0xf9, 0x0d, +0x4e, 0x8a, 0xdd, 0x2d, 0x30, 0xa3, 0xcf, 0x26, 0xb0, 0xbc, 0x92, 0xe5, 0xa2, 0x50, 0xce, 0xbf, +0x63, 0x48, 0x64, 0x12, 0xaa, 0x9f, 0x1f, 0x11, 0x19, 0x9c, 0x8b, 0x00, 0xb1, 0xc0, 0x1e, 0x52, +0x43, 0xc4, 0xa5, 0x0e, 0xb8, 0x99, 0x27, 0xd8, 0x2a, 0xcc, 0x96, 0x1f, 0x48, 0x17, 0xb6, 0xa5, +0x54, 0x26, 0x86, 0x7a, 0x14, 0x52, 0x1f, 0x09, 0xc1, 0x81, 0x6b, 0xd8, 0x77, 0x5f, 0x98, 0x18, +0x8f, 0x47, 0x0e, 0xf0, 0xd8, 0x5f, 0x59, 0x06, 0x39, 0x24, 0x5b, 0x66, 0x65, 0xc8, 0x12, 0x42, +0x6a, 0x9f, 0x2f, 0x2f, 0xcf, 0x75, 0x96, 0x56, 0x9b, 0xcd, 0x07, 0x3e, 0xb3, 0xb9, 0xb7, 0xa3, +0x1c, 0xe6, 0xf1, 0x91, 0xf2, 0x94, 0x87, 0x96, 0xaa, 0x19, 0xe1, 0x6d, 0xe7, 0xf5, 0xb0, 0x6e, +0x28, 0x65, 0x19, 0x99, 0x2f, 0x9a, 0x37, 0x9d, 0x15, 0xf0, 0x1b, 0x70, 0x57, 0x2a, 0x4b, 0xc5, +0x07, 0x4a, 0x95, 0xc2, 0x13, 0x12, 0x36, 0xbb, 0xa0, 0xd3, 0x4d, 0x37, 0xd9, 0xd5, 0xd7, 0x08, +0x56, 0x2c, 0x83, 0x01, 0x56, 0xda, 0xff, 0x89, 0x3a, 0xb1, 0x11, 0xb0, 0x2d, 0x55, 0xa1, 0x64, +0xb1, 0x2e, 0x40, 0x92, 0xd2, 0xd5, 0x5a, 0x05, 0x02, 0x43, 0x61, 0x00, 0x1d, 0x6f, 0x80, 0x5b, +0x69, 0x5e, 0x71, 0xe0, 0x33, 0x3e, 0xbc, 0x84, 0x87, 0xa2, 0xa0, 0x42, 0x80, 0x95, 0x81, 0x58, +0x0b, 0x36, 0x1d, 0x5c, 0xc4, 0x64, 0x98, 0x1c, 0x12, 0xb6, 0xde, 0x3c, 0x7f, 0x7e, 0x90, 0x5f, +0xd4, 0xb6, 0x5d, 0x3f, 0xa7, 0x63, 0x67, 0xf1, 0xfc, 0xb4, 0xab, 0xcf, 0x4f, 0x75, 0x0a, 0xd0, +0xf2, 0x98, 0x3f, 0x90, 0x6e, 0xe1, 0x59, 0x2a, 0x02, 0xe2, 0xe6, 0x4e, 0x92, 0x3a, 0xfb, 0x2d, +0x5e, 0x5d, 0xf3, 0x1b, 0x63, 0x19, 0x18, 0x9f, 0xc7, 0x98, 0xd1, 0x04, 0x3b, 0x66, 0x1b, 0x8e, +0xf1, 0x5a, 0xa7, 0xef, 0x4e, 0x2e, 0x2e, 0xce, 0xde, 0x2b, 0x3b, 0xe2, 0x07, 0x45, 0xde, 0x01, +0xa6, 0x8f, 0x2b, 0xc3, 0x78, 0x90, 0xab, 0xdc, 0x68, 0xbb, 0x4d, 0x84, 0x0b, 0x2a, 0x67, 0xbb, +0xd4, 0xf7, 0x99, 0xa7, 0x8f, 0x4e, 0x78, 0x9f, 0xc0, 0x38, 0x32, 0x0c, 0x1c, 0xac, 0x72, 0x19, +0x09, 0x00, 0x99, 0xb5, 0xc2, 0x91, 0x70, 0x6b, 0x10, 0xd5, 0xcd, 0xaa, 0xf2, 0x49, 0x64, 0x17, +0xe7, 0x49, 0x1c, 0x82, 0xdf, 0x32, 0x3e, 0x33, 0x6e, 0x9b, 0xd2, 0x08, 0x57, 0x19, 0x4b, 0x61, +0x04, 0x93, 0x39, 0x34, 0x6a, 0x54, 0x0c, 0x8d, 0xd2, 0xb4, 0x06, 0x58, 0x2b, 0x00, 0xce, 0x6c, +0x7c, 0x15, 0x52, 0xb6, 0x7c, 0xc5, 0xc3, 0x6d, 0x29, 0xb7, 0xd1, 0x6c, 0x51, 0xf7, 0xb4, 0xb1, +0xc1, 0x1a, 0xc7, 0x4a, 0x88, 0xdd, 0x67, 0x65, 0x54, 0x10, 0xd6, 0xbe, 0xc6, 0xf1, 0x6c, 0x21, +0x03, 0x50, 0x27, 0xcf, 0x9e, 0xa9, 0x6b, 0x5c, 0x9e, 0x02, 0x4f, 0x10, 0x13, 0xd7, 0x87, 0x98, +0x83, 0x99, 0x4d, 0xda, 0xe0, 0x2b, 0xb8, 0xa3, 0x9c, 0x04, 0x4f, 0xfd, 0x43, 0x81, 0x57, 0xe8, +0x45, 0x8c, 0xde, 0xe5, 0x3f, 0x7e, 0x28, 0xa1, 0x3c, 0xc0, 0x23, 0x92, 0x5a, 0x20, 0x02, 0xd5, +0x77, 0x77, 0x4c, 0xba, 0x66, 0x73, 0x4a, 0x14, 0x70, 0xe4, 0x0b, 0x97, 0xf7, 0x65, 0x2d, 0x69, +0xa9, 0x30, 0x50, 0xed, 0xc4, 0x6d, 0xd1, 0xb0, 0xe5, 0xca, 0x33, 0x8f, 0xe1, 0xbf, 0xaf, 0xa7, +0xe7, 0x4e, 0x4d, 0xb7, 0xed, 0xd6, 0x5b, 0x11, 0x0b, 0x3d, 0x6a, 0xb3, 0x53, 0x97, 0x7b, 0x0e, +0x44, 0x66, 0xb5, 0x56, 0xab, 0x15, 0xcf, 0xb0, 0xd2, 0x1c, 0x56, 0xf8, 0x37, 0x55, 0x55, 0x2d, +0x8a, 0xba, 0xdc, 0xfc, 0xf6, 0xc3, 0xe4, 0x71, 0xd0, 0xef, 0x8b, 0x6c, 0x7c, 0x54, 0x47, 0x16, +0xae, 0xf8, 0x90, 0xfd, 0x11, 0xf8, 0xec, 0x23, 0x3c, 0x64, 0x12, 0xb6, 0x87, 0x9f, 0x60, 0x9b, +0xcf, 0xe9, 0xef, 0x70, 0x4b, 0xdb, 0x68, 0xe9, 0x8c, 0xc3, 0xbc, 0x9b, 0xaa, 0xb4, 0x55, 0x46, +0x81, 0x3f, 0x88, 0x8d, 0xde, 0x3a, 0x1b, 0xab, 0x20, 0xb7, 0xde, 0xd8, 0x08, 0xb6, 0xf3, 0x37, +0x1b, 0x43, 0x05, 0xdb, 0x5e, 0xb4, 0x39, 0xc2, 0xce, 0x7c, 0x07, 0x70, 0x55, 0xf1, 0x2d, 0x79, +0x9e, 0x83, 0xc2, 0x52, 0xcf, 0xea, 0xee, 0x05, 0xc6, 0x41, 0x5b, 0x76, 0xe0, 0x30, 0xf4, 0x11, +0x9d, 0x22, 0x6f, 0xb0, 0x62, 0xed, 0xbf, 0xe5, 0x09, 0x9c, 0x6c, 0x6e, 0x67, 0x2a, 0x39, 0x14, +0xb6, 0x9a, 0xe8, 0x11, 0x47, 0x08, 0x4b, 0xe8, 0x90, 0xfd, 0xcd, 0xe1, 0x53, 0x49, 0x03, 0x1a, +0x14, 0x26, 0x0d, 0xa9, 0x99, 0x29, 0xaa, 0x41, 0x49, 0x30, 0x6e, 0x02, 0x23, 0xab, 0x27, 0x39, +0x48, 0xfd, 0x3b, 0x4c, 0xcc, 0x7c, 0x27, 0x67, 0xda, 0xb5, 0x8f, 0x44, 0xd6, 0x77, 0xd4, 0x43, +0x75, 0x3c, 0x18, 0x1f, 0x0c, 0xa1, 0x7a, 0xa6, 0x7d, 0x19, 0x69, 0x3c, 0x39, 0xbe, 0xd5, 0xf1, +0xc3, 0xfc, 0x76, 0x8f, 0xba, 0x57, 0xaf, 0x16, 0x07, 0xc6, 0x67, 0xa3, 0x45, 0x9e, 0x12, 0xc8, +0x61, 0xde, 0x32, 0x37, 0x62, 0xc2, 0x65, 0x1c, 0xd3, 0xcc, 0x12, 0x2a, 0x93, 0x65, 0xd8, 0x54, +0x30, 0xd2, 0xd9, 0xd7, 0xb8, 0x30, 0x1e, 0xfb, 0x70, 0xde, 0xb4, 0x0e, 0x8a, 0x76, 0x34, 0x05, +0xd1, 0xcd, 0x40, 0xbc, 0xfb, 0x50, 0x06, 0x62, 0x6b, 0x0e, 0xe2, 0xb2, 0x0c, 0xc8, 0xf6, 0x1c, +0xc8, 0xd5, 0x0a, 0x10, 0x87, 0xf5, 0xe9, 0xc8, 0x93, 0x19, 0x98, 0x57, 0xaf, 0x5e, 0x15, 0xc0, +0xe4, 0x2e, 0x2f, 0x00, 0x42, 0x72, 0x97, 0x39, 0x90, 0x4b, 0xda, 0x19, 0x54, 0xea, 0x58, 0xbb, +0x54, 0xef, 0x7e, 0xcd, 0x92, 0x3e, 0xfd, 0x2e, 0x18, 0x3e, 0xc3, 0x9c, 0xef, 0x49, 0xd1, 0x7e, +0x86, 0x0a, 0x21, 0xd5, 0xeb, 0x7e, 0x19, 0x2b, 0xd0, 0x37, 0x0a, 0x33, 0x3d, 0x89, 0x2f, 0xff, +0xad, 0x8c, 0x1a, 0xc1, 0x62, 0xac, 0x0f, 0x48, 0x3e, 0x8c, 0x54, 0x6c, 0x14, 0xc5, 0x7f, 0x30, +0xf6, 0x2d, 0x8f, 0x86, 0x13, 0x7c, 0x9d, 0x26, 0x56, 0x33, 0xd2, 0x26, 0xaf, 0x47, 0xb0, 0xd7, +0x5b, 0x73, 0xa7, 0x91, 0xfd, 0xc9, 0x2d, 0xe8, 0x77, 0xcc, 0x7b, 0x0f, 0x9f, 0x6b, 0xd6, 0xe7, +0x87, 0xa8, 0xc2, 0x82, 0x1a, 0xb3, 0xfc, 0x4c, 0x82, 0x39, 0xd7, 0xb5, 0x7c, 0x56, 0x50, 0xf4, +0x8e, 0x46, 0x8e, 0x81, 0x22, 0x85, 0xcc, 0x55, 0xb4, 0xb4, 0xb1, 0xdc, 0xdd, 0x92, 0xc1, 0x5b, +0x7e, 0xcf, 0x9c, 0xda, 0x56, 0x21, 0x69, 0x61, 0x14, 0x38, 0xb7, 0xf6, 0x44, 0x8d, 0x69, 0xe7, +0x3d, 0x9b, 0x32, 0x1a, 0x55, 0x24, 0x0e, 0xe2, 0xb0, 0x9e, 0x3e, 0xb4, 0x46, 0x24, 0xe0, 0x0f, +0x6f, 0xfd, 0xd1, 0x10, 0xe8, 0x89, 0x51, 0x77, 0xf7, 0xea, 0x2b, 0x30, 0xbd, 0x0e, 0x02, 0xe9, +0x05, 0xd4, 0x01, 0x9f, 0x11, 0x33, 0x9a, 0x30, 0xd8, 0x83, 0x27, 0x79, 0x2c, 0xae, 0x5d, 0xf8, +0xca, 0x78, 0x2c, 0x55, 0xb5, 0x80, 0x4d, 0x75, 0xd9, 0x61, 0x6d, 0xc8, 0x5b, 0xcd, 0x92, 0xe7, +0x12, 0xa1, 0xdd, 0xb7, 0x37, 0x85, 0xab, 0x7f, 0x13, 0x3b, 0x18, 0x41, 0xac, 0xa5, 0x17, 0x4a, +0xde, 0xab, 0x63, 0xfb, 0xe2, 0x95, 0xf9, 0xfc, 0x6f, 0x12, 0xd7, 0xd7, 0x62, 0xa8, 0xe8, 0x3e, +0x29, 0xb8, 0xad, 0x86, 0xec, 0x53, 0xee, 0xcd, 0xc0, 0xf0, 0x6a, 0x35, 0x8c, 0x1f, 0x10, 0xea, +0x8b, 0x49, 0xaa, 0x4e, 0x31, 0xe0, 0xad, 0xbe, 0x59, 0x62, 0xce, 0x88, 0x0e, 0x30, 0x70, 0x4f, +0xe8, 0x85, 0xeb, 0x21, 0x2b, 0xc1, 0x28, 0x08, 0x27, 0x62, 0x32, 0x82, 0x69, 0xf0, 0xa5, 0xaa, +0x64, 0xf2, 0xd9, 0x9d, 0x4d, 0x28, 0x9c, 0xd2, 0x07, 0x75, 0x6a, 0xc1, 0x85, 0xe4, 0xb6, 0xf8, +0x36, 0xca, 0xb7, 0xd0, 0xb3, 0x63, 0xd0, 0xba, 0x20, 0xc4, 0x2c, 0xf0, 0xfa, 0xda, 0x0a, 0x6d, +0x54, 0x08, 0xeb, 0x07, 0xeb, 0x06, 0xf4, 0xc7, 0x9a, 0x50, 0xa9, 0x2e, 0xbf, 0x58, 0x37, 0x86, +0x54, 0x23, 0xa3, 0xae, 0xab, 0x32, 0x77, 0x73, 0x42, 0xbe, 0xbd, 0x4e, 0xfa, 0x90, 0x39, 0xb6, +0xdc, 0x25, 0xc3, 0xa9, 0xce, 0xea, 0x2d, 0xdd, 0x36, 0xf7, 0x1b, 0xbe, 0x0b, 0x69, 0x55, 0x0e, +0xd5, 0x9b, 0x2f, 0x53, 0x8c, 0x49, 0xd4, 0xce, 0xfd, 0x70, 0x84, 0x22, 0xf8, 0x13, 0xd7, 0x01, +0x46, 0x29, 0x71, 0xc2, 0x35, 0xbe, 0x68, 0x06, 0x97, 0xbe, 0xf6, 0x75, 0xba, 0x2e, 0x58, 0x7d, +0xbe, 0x9d, 0x64, 0x3e, 0x45, 0xbc, 0x60, 0x68, 0xc0, 0xf8, 0xe2, 0x5d, 0x03, 0x17, 0x04, 0x70, +0xe2, 0x6a, 0x18, 0x9d, 0x5b, 0xe3, 0xbb, 0x48, 0x79, 0x5e, 0x24, 0xd6, 0x3f, 0x19, 0x0b, 0xb5, +0x4e, 0x91, 0x60, 0xcc, 0x32, 0xfa, 0x1a, 0x31, 0xa1, 0x13, 0xa4, 0xf5, 0x85, 0xf0, 0x62, 0x49, +0xe8, 0xb1, 0x94, 0x6d, 0x97, 0xd9, 0x77, 0xbd, 0xe0, 0xde, 0xd2, 0x95, 0x27, 0xb8, 0x73, 0x07, +0x64, 0x58, 0x0f, 0x1b, 0x12, 0xcd, 0x54, 0x89, 0xa6, 0x22, 0xd9, 0xd8, 0xa5, 0x64, 0xa2, 0xb7, +0x37, 0x92, 0x52, 0x6d, 0x5a, 0xea, 0x9d, 0x5c, 0xb8, 0x71, 0x12, 0x86, 0x1e, 0x7a, 0xe5, 0x04, +0xbe, 0x27, 0xfd, 0xb5, 0x6a, 0xb6, 0xf8, 0x89, 0x84, 0xa9, 0x52, 0xf1, 0x9a, 0x2e, 0x16, 0xad, +0x28, 0xc3, 0xfa, 0x23, 0xcf, 0xab, 0x6f, 0xa2, 0x5e, 0x0d, 0x32, 0xda, 0xd9, 0x9c, 0x91, 0xc6, +0xfd, 0x7c, 0xd5, 0x75, 0x25, 0xd5, 0x94, 0x44, 0xfa, 0xab, 0x5b, 0x07, 0x56, 0xae, 0x4d, 0xa2, +0xb8, 0x8f, 0x5f, 0x9d, 0x74, 0x85, 0x4e, 0x65, 0xe4, 0xd5, 0x92, 0xd2, 0x79, 0x3a, 0xc1, 0x8a, +0xa6, 0xba, 0x74, 0xbd, 0x1a, 0x8f, 0xe7, 0x49, 0x1d, 0x9a, 0x40, 0x32, 0x38, 0xcf, 0x94, 0x7e, +0xe7, 0x6a, 0x83, 0x9c, 0xa9, 0xb6, 0x63, 0x40, 0xd8, 0xf9, 0xee, 0xac, 0xf9, 0xdf, 0x6e, 0xb9, +0x12, 0xa6, 0xba, 0x65, 0x99, 0xaa, 0x7e, 0x1e, 0x5b, 0xcd, 0xf4, 0xa4, 0xee, 0x80, 0xdc, 0x8c, +0xe9, 0x7d, 0x66, 0x02, 0x12, 0xc0, 0x35, 0xbc, 0xb4, 0xb2, 0xba, 0x04, 0x4d, 0xb6, 0xdb, 0x24, +0xf6, 0xc8, 0x90, 0x00, 0x82, 0xa2, 0xab, 0x39, 0x9a, 0xd6, 0x46, 0x02, 0xf2, 0xbc, 0x16, 0xe0, +0xa2, 0x18, 0xc9, 0x5d, 0xae, 0xbc, 0x9a, 0x82, 0xa2, 0x8c, 0x1f, 0xe5, 0x8e, 0xb1, 0x39, 0x65, +0xe8, 0x60, 0x86, 0xac, 0xbb, 0xea, 0xf3, 0xcf, 0xae, 0x9f, 0xe6, 0xd4, 0x88, 0xc5, 0xeb, 0xe9, +0x05, 0xd0, 0x53, 0xd3, 0x7b, 0x54, 0xfd, 0xba, 0x73, 0xd3, 0x52, 0xfb, 0x17, 0x73, 0xf2, 0x85, +0x82, 0xd3, 0xe8, 0xd3, 0x62, 0x3f, 0x67, 0x92, 0xe4, 0x69, 0x88, 0x89, 0x90, 0xc0, 0x0f, 0x4a, +0x18, 0x48, 0x29, 0xa2, 0x44, 0xc5, 0x14, 0x8a, 0x12, 0x65, 0x45, 0x78, 0xea, 0xa4, 0x43, 0x8b, +0x42, 0x82, 0x22, 0xe6, 0xa9, 0xb7, 0xfa, 0x73, 0xe6, 0x33, 0x9e, 0x00, 0x27, 0xb0, 0xb4, 0x27, +0x02, 0x6f, 0x24, 0x99, 0x65, 0x38, 0x8c, 0x1b, 0xab, 0x17, 0xe1, 0x8b, 0x68, 0xd6, 0x81, 0xd6, +0x8c, 0xe8, 0x5c, 0xa6, 0xb9, 0xb8, 0xa0, 0x17, 0xd8, 0x30, 0x61, 0x50, 0x38, 0x3d, 0x8d, 0x7a, +0x8d, 0x31, 0x3f, 0xec, 0xed, 0x7d, 0x8d, 0xeb, 0xe4, 0x1f, 0x7b, 0x5f, 0x99, 0x2d, 0x6b, 0x39, +0xda, 0x18, 0x9f, 0xca, 0x1c, 0x11, 0xee, 0xe4, 0x3f, 0xd4, 0x7a, 0x02, 0xbf, 0xf3, 0x1f, 0x6b, +0x1a, 0xe0, 0xf7, 0xf2, 0xe3, 0xf9, 0x63, 0x15, 0x1b, 0xdc, 0x10, 0xba, 0x35, 0xf8, 0x73, 0xda, +0xc3, 0x9e, 0xc3, 0x8f, 0x97, 0x57, 0x70, 0xfd, 0x8f, 0xcb, 0x8f, 0x17, 0x58, 0x0d, 0x85, 0xdc, +0x99, 0xf7, 0xa7, 0x2a, 0x88, 0xaf, 0xa2, 0xe5, 0xca, 0xb9, 0xa1, 0x63, 0x03, 0x02, 0x95, 0x17, +0x3d, 0xea, 0x18, 0x93, 0x80, 0xf2, 0xd2, 0xf8, 0xde, 0xe2, 0xd8, 0xda, 0x84, 0x3c, 0x34, 0xaa, +0xa2, 0x34, 0x88, 0xad, 0x50, 0xca, 0xd8, 0xc9, 0xa1, 0x56, 0x1a, 0x7b, 0x59, 0x92, 0x7c, 0xd8, +0xb0, 0xfb, 0x30, 0xdd, 0xb1, 0xfe, 0xee, 0xea, 0xc3, 0x7b, 0xa2, 0x8c, 0x2c, 0xee, 0x97, 0xc1, +0x6f, 0x67, 0x50, 0x1f, 0x96, 0x68, 0x42, 0x39, 0x7e, 0xf5, 0x68, 0xde, 0xd3, 0x51, 0xfb, 0xce, +0x0f, 0x26, 0x1e, 0x73, 0x06, 0x8c, 0xb4, 0x5a, 0x2d, 0x43, 0x63, 0x46, 0xfc, 0xd9, 0x08, 0xc0, +0x3b, 0xe1, 0xbe, 0x13, 0x4c, 0x5a, 0x82, 0xc9, 0x73, 0xec, 0x14, 0x18, 0xa3, 0x3f, 0x4d, 0xc4, +0xfb, 0xe3, 0xfc, 0x21, 0x1e, 0xf0, 0x04, 0xd8, 0x33, 0xa7, 0xfd, 0x58, 0xed, 0xf9, 0xb1, 0x11, +0x7f, 0x44, 0x46, 0x63, 0xac, 0xe3, 0x7e, 0x98, 0xdf, 0x4e, 0x53, 0xa1, 0x37, 0x66, 0x81, 0xf5, +0xb3, 0x28, 0x0a, 0xa2, 0xb4, 0x4e, 0x78, 0x6d, 0x31, 0xbc, 0xb6, 0x6e, 0xaa, 0xac, 0xe5, 0xd6, +0xf7, 0x5a, 0xcc, 0x32, 0xfc, 0xc4, 0x2b, 0x98, 0x6d, 0xf7, 0xf9, 0x4b, 0x44, 0x93, 0x5d, 0xb8, +0x82, 0x17, 0x2b, 0x9f, 0xaa, 0x73, 0x23, 0x58, 0xdb, 0x5c, 0x82, 0x74, 0xe3, 0xcd, 0xc1, 0xe6, +0x05, 0x6b, 0x7b, 0x8c, 0x46, 0xa9, 0x52, 0xc6, 0x1a, 0x5b, 0xcf, 0x5d, 0x00, 0x8c, 0xae, 0xd4, +0xf7, 0x4b, 0xaa, 0x91, 0xb8, 0x20, 0xcb, 0x3c, 0x1b, 0x72, 0x48, 0xdc, 0x1a, 0xae, 0x82, 0x3d, +0xf5, 0x6d, 0xb9, 0x48, 0x65, 0x17, 0x6a, 0x05, 0xad, 0x0a, 0x65, 0xbd, 0x02, 0x01, 0x2b, 0xf2, +0xf5, 0x1b, 0x7f, 0xc6, 0xb7, 0x0a, 0x17, 0x3e, 0xe4, 0x72, 0x6d, 0x0d, 0xf4, 0x85, 0x75, 0x63, +0x88, 0x3e, 0x55, 0x4f, 0x20, 0xb0, 0xa5, 0x3d, 0x74, 0x0b, 0xe2, 0x33, 0x3e, 0xf0, 0x6b, 0x7f, +0xea, 0x57, 0xbf, 0xae, 0xad, 0xbe, 0xe7, 0xdc, 0xaa, 0x21, 0x46, 0x04, 0xd8, 0x13, 0x30, 0x83, +0xd7, 0x1f, 0x8d, 0xaa, 0x19, 0xb0, 0x41, 0x14, 0x78, 0x63, 0x3a, 0x1d, 0x37, 0x7f, 0x04, 0x27, +0xdb, 0x8d, 0xb3, 0xfc, 0x21, 0x9c, 0xd4, 0x57, 0xe1, 0xe1, 0x7b, 0xfe, 0x17, 0x70, 0xf2, 0x7a, +0x23, 0x3a, 0xb3, 0xbe, 0x1c, 0x3e, 0x2e, 0xd3, 0x14, 0x91, 0x31, 0x62, 0x3e, 0x5e, 0xd1, 0x04, +0xb1, 0xa1, 0x16, 0x87, 0x15, 0x6d, 0x0e, 0xf9, 0xde, 0xd2, 0x7c, 0x37, 0x69, 0x0d, 0xd4, 0x1f, +0xfd, 0xc2, 0x8f, 0x3a, 0x98, 0x53, 0x8d, 0xec, 0xc0, 0x23, 0xb2, 0x5b, 0xb1, 0xa1, 0x21, 0xf9, +0xae, 0x58, 0x7d, 0xce, 0x72, 0x32, 0x38, 0x8d, 0x3d, 0x47, 0x8b, 0x9f, 0x18, 0x2a, 0x10, 0xf2, +0xea, 0x2d, 0x09, 0xfb, 0x2a, 0x7e, 0x8c, 0x05, 0x5d, 0x4f, 0x6b, 0xae, 0x9a, 0xa9, 0xc2, 0x76, +0x4e, 0x65, 0xf5, 0xe9, 0x17, 0x9d, 0x0a, 0x7a, 0x59, 0x1e, 0x1e, 0xb3, 0x7d, 0x55, 0x14, 0x5f, +0xfc, 0x06, 0x72, 0x81, 0x27, 0x99, 0x57, 0x39, 0xd5, 0x55, 0x92, 0x70, 0x7f, 0x90, 0xf9, 0xf2, +0x55, 0xf2, 0xb1, 0x4e, 0x7d, 0xa5, 0xbf, 0x73, 0x79, 0xd8, 0xd6, 0x5f, 0x34, 0xfd, 0x2f, 0xe6, +0xde, 0x0e, 0x11, 0xe9, 0x54, 0x00, 0x00}; +#endif /*__VISUALIZATION_HTML_H__*/ diff --git a/src/web/html/tmp/about.html b/src/web/html/tmp/about.html new file mode 100644 index 00000000..820fd356 --- /dev/null +++ b/src/web/html/tmp/about.html @@ -0,0 +1,100 @@ + + + + About + + + + + + + + + +
+
+

About AhoyDTU

+
+
+
Used Libraries
+
+ + + + + + + + +
+
Contact Information
+
+
+
Github Repository
+ +
+
+
Discord Chat
+ +
+
+
E-Mail
+ +
+
+
+
+ + + + diff --git a/src/web/html/tmp/index.html b/src/web/html/tmp/index.html new file mode 100644 index 00000000..a2da0653 --- /dev/null +++ b/src/web/html/tmp/index.html @@ -0,0 +1,263 @@ + + + + Index + + + + + + + + + +
+
+

+ Uptime:
+ ESP-Time: +

+

+ System Infos: +

+
+
+

+ +
+

Support this project:

+ +

+ This project was started from this discussion. (Mikrocontroller.net) +

+
+
+
+ + + + diff --git a/src/web/html/tmp/login.html b/src/web/html/tmp/login.html new file mode 100644 index 00000000..81c4051d --- /dev/null +++ b/src/web/html/tmp/login.html @@ -0,0 +1,43 @@ + + + + Login + + + + + + + + +
+
+
+
+

AhoyDTU

+
+
+
+
+
+
+
+
+ + + diff --git a/src/web/html/tmp/save.html b/src/web/html/tmp/save.html new file mode 100644 index 00000000..1b85d690 --- /dev/null +++ b/src/web/html/tmp/save.html @@ -0,0 +1,102 @@ + + + + Save + + + + + + + + + +
+
+
Saving settings...
+
+
+ + + + diff --git a/src/web/html/tmp/serial.html b/src/web/html/tmp/serial.html new file mode 100644 index 00000000..28d56965 --- /dev/null +++ b/src/web/html/tmp/serial.html @@ -0,0 +1,132 @@ + + + + Serial Console + + + + + + + + + +
+
+
+ +
+
+
console active:
+
Uptime:
+
+ + +
+
+
+
+ + + + diff --git a/src/web/html/tmp/setup.html b/src/web/html/tmp/setup.html new file mode 100644 index 00000000..bebdaab9 --- /dev/null +++ b/src/web/html/tmp/setup.html @@ -0,0 +1,1000 @@ + + + + Setup + + + + + + + + + +
+
+
+
+ +
+
+ Device Host Name +
+
Device Name
+
+
+
+
Reboot Ahoy at midnight
+
+
+
+
Dark Mode
+
+
(empty browser cache or use CTRL + F5 after reboot to apply this setting)
+
+
+
+ System Config +

Status LEDs

+
+ +

Radio (NRF24L01+)

+
+ +

Radio (CMT2300A)

+
(ESP32 only)
+ +

Serial Console

+
+
print inverter data
+
+
+
+
Serial Debug
+
+
+
+
Interval [s]
+
+
+
+
+ + +
+
+ WiFi + +
+
AP Password (min. length: 8)
+
+
+ +

Enter the credentials to your preferred WiFi station. After rebooting the device tries to connect with this information.

+ +
+
Search Networks
+
+
+ +
+
Avail Networks
+
+ +
+
+
+
SSID
+
+
+
+
SSID is hidden
+
+
+
+
Password
+
+
+
+
+ Static IP (optional) +

+ Leave fields blank for DHCP
+ The following fields are parsed in this format: 192.168.4.1 +

+
+
IP Address
+
+
+
+
Submask
+
+
+
+
DNS 1
+
+
+
+
DNS 2
+
+
+
+
Gateway
+
+
+
+
+ + +
+
+ Protection +
+
Admin Password
+
+
+

Select pages which should be protected by password

+
+
+
+ + +
+
+ Inverter +
+
+
+
+
+
+

Note

+

A 'max module power' value of '0' disables the channel in 'live' view

+
+
+

General

+
+
+
+
Interval [s]
+
+
+
+
Max retries per Payload
+
+
+
+
Reset values and YieldDay at midnight
+
+
+
+
Reset values when inverter polling pauses at sunset
+
+
+
+
Reset values when inverter status is 'not available'
+
+
+
+
Reset 'max' values at midnight
+
+
+
+
Start without time sync (useful in AP-Only-Mode)
+
+
+
+
Yield Efficiency (should be between 0.95 and 0.96)
+
+
+
+
+ + +
+
+ NTP Server +
+
NTP Server / IP
+
+
+
+
NTP Port
+
+
+
+
NTP Interval (in Minutes, min. 5 Minutes)
+
+
+
+
set System time
+
+ +
+ +
+
+
+
System Time
+
+
+
+
+ + +
+
+ Sunrise & Sunset +
+
Latitude (decimal)
+
+
+
+
Longitude (decimal)
+
+
+
+
Offset (pre sunrise, post sunset)
+
+
+
+
Pause polling inverters during night
+
+
+
+
+ + +
+
+ MQTT +
+
Broker / Server IP
+
+
+
+
Port
+
+
+
+
Client Id (optional)
+
+
+
+
Username (optional)
+
+
+
+
Password (optional)
+
+
+
+
Topic
+
+
+

Send Inverter data in a fixed interval, even if there is no change. A value of '0' disables the fixed interval. The data is published once it was successfully received from inverter. (default: 0)

+
+
Interval [s]
+
+
+
+
Discovery Config (homeassistant)
+
+ + +
+
+
+
+ + +
+
+ Display Config +
+
+
+
Turn off while inverters are offline
+
+
+
+
Enable Screensaver (pixel shifting, OLED only)
+
+
+
+
Luminance
+
+
+

Pinout

+
+
+
+ +
+
Reboot device after successful save
+
+ + +
+
+ +
+
+ ERASE SETTINGS (not WiFi) +
+ Import / Export JSON Settings +
+
Import
+
+
+
+
+
+
+
+
+
+
+
Export
+
+ Export settings (JSON file) (only values, passwords will be removed!) +
+
+
+
+
+
+ + + + diff --git a/src/web/html/tmp/style.css b/src/web/html/tmp/style.css new file mode 100644 index 00000000..95cbff3b --- /dev/null +++ b/src/web/html/tmp/style.css @@ -0,0 +1,781 @@ +html, body { + font-family: Arial; + margin: 0; + padding: 0; + height: 100%; + min-height: 100%; + background-color: var(--bg); + color: var(--fg); +} + +h2 { + padding-left: 10px; +} + +span, li, h3, label, fieldset { + color: var(--fg); +} + +fieldset, input[type=submit], .btn { + border-radius: 4px; +} + +input[type=file] { + width: 100%; +} + +textarea { + color: var(--fg); + background-color: var(--bg); +} + +#live span { + color: var(--fg2); +} + +.topnav { + background-color: var(--nav-bg); + position: fixed; + top: 0; + width: 100%; +} + +.topnav a { + color: var(--fg2); + padding: 14px 14px; + text-decoration: none; + font-size: 17px; + display: block; +} + +#topnav a { + color: #fff; +} + +.topnav a.icon { + top: 0; + left: 0; + background: var(--nav-bg); + display: block; + position: absolute; +} + +.topnav a:hover { + background-color: var(--primary-hover) !important; +} + +.topnav .info { + color: var(--fg2); + position: absolute; + right: 24px; + top: 5px; +} + +.topnav .mobile { + display: none; +} + +svg.icon { + vertical-align: middle; + display: inline-block; + margin-top:-4x; + padding: 5px 7px 5px 0px; +} + +.icon-info { + fill: var(--info); +} + +.icon-warn { + fill: var(--warn); +} + +.icon-success { + fill: var(--success); +} + +.wifi { + fill: var(--fg2); +} + +.title { + background-color: var(--primary); + color: #fff !important; + padding: 15px 14px 16px 80px !important +} + +.topnav .icon span { + display: block; + width: 30px; + height: 3px; + margin-bottom: 5px; + position: relative; + background: #fff; + border-radius: 2px; +} + +.topnav .active { + background-color: var(--nav-active); +} + +span.seperator { + width: 100%; + height: 1px; + margin: 5px 0px 5px; + background-color: #494949; + display: block; +} + +#content { + max-width: 1140px; +} + +.total-h { + background-color: var(--total-head-title); + color: var(--fg2); +} + +.total-bg { + background-color: var(--total-bg); + color: var(--fg2); +} + +.iv-h { + background-color: var(--iv-head-title); + color: var(--fg2); +} + +.iv-bg { + background-color: var(--iv-head-bg); + color: var(--fg2); +} + +.iv-h-dis { + background-color: var(--iv-dis-title); + color: var(--fg2); +} + +.iv-bg-dis { + background-color: var(--iv-dis); + color: var(--fg2); +} + +.ch-h { + background-color: var(--ch-head-title); + color: var(--fg2); +} + +.ch-bg { + background-color: var(--ch-head-bg); + color: var(--fg2); +} + +.ts-h { + background-color: var(--ts-head); + color: var(--fg2); +} + +.ts-bg { + background-color: var(--ts-bg); + color: var(--fg2); +} + +.hr { + border-top: 1px solid var(--iv-head-title); + margin: 1rem 0 1rem; +} + +p { + text-align: justify; + font-size: 13pt; + color: var(--fg); +} + +#footer { + background-color: var(--footer-bg); +} + +.row { display: flex; max-width: 100%; flex-wrap: wrap; } +.col { flex: 1 0 0%; } + +.col-1, .col-2, .col-3, .col-4, +.col-5, .col-6, .col-7, .col-8, +.col-9, .col-10, .col-11, .col-12 { flex: 0 0 auto; } + +.col-1 { width: 8.333333333%; } +.col-2 { width: 16.66666667%; } +.col-3 { width: 25%; } +.col-4 { width: 33.33333333%; } +.col-5 { width: 41.66666667%; } +.col-6 { width: 50%; } +.col-7 { width: 58.33333333%; } +.col-8 { width: 66.66666667%; } +.col-9 { width: 75%; } +.col-10 { width: 83.33333333%; } +.col-11 { width: 91.66666667%; } +.col-12 { width: 100%; } + +.p-1 { padding: 0.25rem; } +.p-2 { padding: 0.5rem; } +.p-3 { padding: 1rem; } +.p-4 { padding: 1.5rem; } +.p-5 { padding: 3rem; } + +.px-1 { padding: 0 0.25rem 0 0.25rem; } +.px-2 { padding: 0 0.5rem 0 0.5rem; } +.px-3 { padding: 0 1rem 0 1rem; } +.px-4 { padding: 0 1.5rem 0 1.5rem; } +.px-5 { padding: 0 3rem 0 3rem; } + +.py-1 { padding: 0.25rem 0 0.25rem; } +.py-2 { padding: 0.5rem 0 0.5rem; } +.py-3 { padding: 1rem 0 1rem; } +.py-4 { padding: 1.5rem 0 1.5rem; } +.py-5 { padding: 3rem 0 3rem; } + +.mx-1 { margin: 0 0.25rem 0 0.25rem; } +.mx-2 { margin: 0 0.5rem 0 0.5rem; } +.mx-3 { margin: 0 1rem 0 1rem; } +.mx-4 { margin: 0 1.5rem 0 1.5rem; } +.mx-5 { margin: 0 3rem 0 3rem; } + +.my-1 { margin: 0.25rem 0 0.25rem; } +.my-2 { margin: 0.5rem 0 0.5rem; } +.my-3 { margin: 1rem 0 1rem; } +.my-4 { margin: 1.5rem 0 1.5rem; } +.my-5 { margin: 3rem 0 3rem; } + +.mt-1 { margin-top: 0.25rem } +.mt-2 { margin-top: 0.5rem } +.mt-3 { margin-top: 1rem } +.mt-4 { margin-top: 1.5rem } +.mt-5 { margin-top: 3rem } + +.mb-1 { margin-bottom: 0.25rem } +.mb-2 { margin-bottom: 0.5rem } +.mb-3 { margin-bottom: 1rem } +.mb-4 { margin-bottom: 1.5rem } +.mb-5 { margin-bottom: 3rem } + +.fs-1 { font-size: 3.5rem; } +.fs-2 { font-size: 3rem; } +.fs-3 { font-size: 2.5rem; } +.fs-4 { font-size: 2rem; } +.fs-5 { font-size: 1.75rem; } +.fs-6 { font-size: 1.5rem; } +.fs-7 { font-size: 1.25rem; } +.fs-8 { font-size: 1rem; } +.fs-9 { font-size: 0.75rem; } +.fs-10 { font-size: 0.5rem; } + +.a-r { text-align: right; } +.a-c { text-align: center; } + +.d-none { display: none !important; } +.d-block { display: block !important; } + +.row > * { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +*, ::after, ::before { + box-sizing: border-box; +} + +/* sm */ +@media(min-width: 768px) { + .col-sm-1 { width: 8.333333333%; } + .col-sm-2 { width: 16.66666667%; } + .col-sm-3 { width: 25%; } + .col-sm-4 { width: 33.33333333%; } + .col-sm-5 { width: 41.66666667%; } + .col-sm-6 { width: 50%; } + .col-sm-7 { width: 58.33333333%; } + .col-sm-8 { width: 66.66666667%; } + .col-sm-9 { width: 75%; } + .col-sm-10 { width: 83.33333333%; } + .col-sm-11 { width: 91.66666667%; } + .col-sm-12 { width: 100%; } + + .mb-sm-1 { margin-bottom: 0.25rem } + .mb-sm-2 { margin-bottom: 0.5rem } + .mb-sm-3 { margin-bottom: 1rem } + .mb-sm-4 { margin-bottom: 1.5rem } + .mb-sm-5 { margin-bottom: 3rem } + + .fs-sm-1 { font-size: 3.5rem; } + .fs-sm-2 { font-size: 3rem; } + .fs-sm-3 { font-size: 2.5rem; } + .fs-sm-4 { font-size: 2rem; } + .fs-sm-5 { font-size: 1.75rem; } + .fs-sm-6 { font-size: 1.5rem; } + .fs-sm-7 { font-size: 1.25rem; } + .fs-sm-8 { font-size: 1rem; } + + .d-sm-block { display: block !important;} + .d-sm-none { display: none !important; } +} + +/* md */ +@media(min-width: 992px) { + .col-md-1 { width: 8.333333333%; } + .col-md-2 { width: 16.66666667%; } + .col-md-3 { width: 25%; } + .col-md-4 { width: 33.33333333%; } + .col-md-5 { width: 41.66666667%; } + .col-md-6 { width: 50%; } + .col-md-7 { width: 58.33333333%; } + .col-md-8 { width: 66.66666667%; } + .col-md-9 { width: 75%; } + .col-md-10 { width: 83.33333333%; } + .col-md-11 { width: 91.66666667%; } + .col-md-12 { width: 100%; } +} + +table { + border-collapse: collapse; + width: 100%; +} + +th { + text-align: inherit; +} + +.table td, .table th { + padding: .75rem; + border-bottom: 1px solid var(--table-border); +} + +#wrapper { + min-height: 100%; +} + +#content { + padding: 50px 20px 120px 20px; + overflow: auto; +} + +#footer { + height: 121px; + margin-top: -121px; + width: 100%; + font-size: 13px; +} + +#footer .right { + color: #bbb; + margin: 6px 25px; + text-align: right; +} + +#footer .left { + color: #bbb; + margin: 23px 0px 0px 25px; +} + +#footer ul { + list-style-type: none; + margin: 20px auto; + padding: 0; +} + +#footer ul li, #footer a { + color: #bbb; + margin-bottom: 10px; + padding-left: 5px; + font-size: 13px; +} + +#footer a:hover { + color: #fff; +} + +.hide { + display: none !important; +} + +@media only screen and (min-width: 992px) { + .topnav { + width: 230px !important; + height: 100%; + } + + .topnav a.icon { + display: none !important; + } + + .topnav a { + padding: 14px 24px; + } + + .topnav .title { + padding-left: 24px !important; + } + + .topnav .mobile { + display: block; + } + + .topnav .info { + top: auto !important; + right: auto !important; + bottom: 14px; + left: 24px; + } + + #content { + padding: 15px 15px 120px 250px; + } + + #footer .left { + margin-left: 250px !important; + } +} + +p.lic, p.lic a { + font-size: 8pt; + color: #999; +} + +.des { + margin-top: 20px; + font-size: 13pt; + color: var(--secondary); +} + +.s_active, .s_collapsible:hover { + background-color: var(--primary-hover); + color: #fff; +} + +.s_content { + display: none; + overflow: hidden; +} + +.s_collapsible { + background-color: var(--primary); + color: white; + cursor: pointer; + padding: 12px; + width: 100%; + border: none; + text-align: left; + outline: none; + font-size: 15px; + margin-bottom: 5px; +} + +.subdes { + font-size: 12pt; + color: var(--secondary); + margin-left: 7px; +} + +.subsubdes { + font-size:12pt; + color:var(--secondary); + margin: 0 0 7px 12px; +} + +a:link, a:visited { + text-decoration: none; + font-size: 13pt; + color: var(--secondary); +} + +a:hover, a:focus { + color: #f00; +} + +a.btn { + background-color: var(--primary); + color: #fff; + padding: 7px 15px 7px 15px; + display: inline-block; +} + +a.btn:hover { + background-color: var(--primary-hover) !important; +} + +input, select { + padding: 7px; + font-size: 13pt; +} + +input[type=text], input[type=password], select, input[type=number] { + width: 100%; + box-sizing: border-box; + border: 1px solid #ccc; + border-radius: 4px; + background-color: var(--input-bg); + color: var(--fg); +} + +input:invalid { + border: 2px solid #f00 !important; + background-color: var(--invalid-bg) !important; +} + +input.sh { + max-width: 150px !important; + margin-right: 10px; +} + +input.btnDel { + background-color: #c00 !important; +} + +input.btn { + background-color: var(--primary); + color: #fff; + border: 0px; + padding: 7px 20px 7px 20px; + margin-bottom: 10px; + text-transform: uppercase; + cursor: pointer; +} + +input.btn:hover { + background-color: #044e86; +} + +input.cb { + margin-bottom: 15px; + margin-top: 10px; +} + +label { + width: 20%; + display: inline-block; + font-size: 12pt; + padding-right: 10px; + margin: 10px 0px 0px 15px; + vertical-align: top; +} + +pre { + white-space: pre-wrap; +} + +.left { + float: left; +} + +.right { + float: right; +} + +.subgrp { + float: left; + width: 220px; +} + +div.ModPwr, div.ModName, div.YieldCor { + width:70%; + display: inline-block; +} + +div.hr { + height: 1px; + border-top: 1px solid #ccc; + margin: 10px 0px 10px; +} + +#note { + margin: 10px 10px 10px 10px; + padding-top: 10px; + width: 100%; +} + +#login { + width: 450px; + height: 200px; + border: 1px solid #ccc; + background-color: var(--input-bg); + position: absolute; + top: 50%; + left: 50%; + margin-top: -160px; + margin-left: -225px; +} + +@media(max-width: 500px) { + div.ch .unit, div.ch-iv .unit { + font-size: 18px; + } + + div.ch { + width: 170px; + min-height: 100px + } + + .subgrp { + width: 180px; + } + + #login { + margin-left: -150px; + width: 300px; + } +} + +#serial { + width: 100%; +} + +#content .serial { + max-width: 1000px; +} + +.dot { + height: 15px; + width: 15px; + background-color: #f00; + border-radius: 50%; + display: inline-block; + margin-top: 15px; +} + + +.head { + background-color: var(--primary); + color: #fff; +} + + +.css-tooltip{ + position: relative; +} +.css-tooltip:hover:after{ + content:attr(data-tooltip); + background:#000; + padding:5px; + border-radius:3px; + display: inline-block; + position: absolute; + transform: translate(-50%,-100%); + margin:0 auto; + color:#FFF; + min-width:100px; + min-width:150px; + top:-5px; + left: 50%; + text-align:center; +} +.css-tooltip:hover:before { + top:-5px; + left: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-color: rgba(0, 0, 0, 0); + border-top-color: #000; + border-width: 5px; + margin-left: -5px; + transform: translate(0,0px); +} + +#modal { + max-width: 700px; + margin: 1.75rem auto; +} + +.modal { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1072; + display: block; +} + +#modal-wrapper { + background-color: #000; + opacity: 0.5; + bottom: 0; +} + +.modal-content { + border-radius: .3rem; + position: relative; + display: flex; + width: 100%; + background-color: var(--modal-bg); + background-clip: padding-box; + border: 1px solid rgba(0,0,0,.2); + flex-direction: column; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem; + border-bottom: 1px solid #e9ecef; +} + +.modal-header .close { + padding: 0.7rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-body { + padding: 1rem 1rem 2rem 1rem; +} + +.close { + font-size: 2rem; + opacity: 0.5; + font-family: inherit; + cursor: pointer; + padding: 0; +} + +button.close { + background-color: transparent; + border: 0; +} + +h5 { + font-size: 1.25rem; + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; +} + +.pointer { + cursor: pointer; +} + +.badge-success { + color: #fff; + background-color: #28a745; +} + +.badge-warning { + color: #212529; + background-color: #ffc107; +} + +.badge-error { + color: #fff; + background-color: #dc3545; +} + +.badge { + display: inline-block; + padding: .25em .4em; + font-size: 85%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25rem; +} diff --git a/src/web/html/tmp/system.html b/src/web/html/tmp/system.html new file mode 100644 index 00000000..b7221966 --- /dev/null +++ b/src/web/html/tmp/system.html @@ -0,0 +1,188 @@ + + + + System + + + + + + + + + +
+
+
+
+
+
+ + + + diff --git a/src/web/html/tmp/update.html b/src/web/html/tmp/update.html new file mode 100644 index 00000000..883afac5 --- /dev/null +++ b/src/web/html/tmp/update.html @@ -0,0 +1,80 @@ + + + + Update + + + + + + + + + +
+
+
+ Select firmware file (*.bin) +
+ + +
+
+
+
+ + + + diff --git a/src/web/html/tmp/visualization.html b/src/web/html/tmp/visualization.html new file mode 100644 index 00000000..545a1555 --- /dev/null +++ b/src/web/html/tmp/visualization.html @@ -0,0 +1,479 @@ + + + + Live + + + + + + + + + + +
+
+
+

Every seconds the values are updated

+
+
+ + + + From 5b3d0593fe8da30618958711fcf2611d2ccb18af Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Wed, 18 Oct 2023 18:56:59 +0200 Subject: [PATCH 14/42] some more MI specific things - might decode data and enqueue correct next command - small fixes wrt. to serial readibility --- src/hm/CommQueue.h | 16 +++++++ src/hm/Communication.h | 105 ++++++++++++++++++++++++++++++++++++++++- src/hm/hmInverter.h | 3 +- src/hm/hmRadio.h | 3 +- 4 files changed, 124 insertions(+), 3 deletions(-) diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 9c9da707..5f27db60 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -22,6 +22,10 @@ class CommQueue { void add(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop, false); + /*mQueue[mRdPtr].firstTry = false; + if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { + mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); + }*/ inc(&mWrPtr); } @@ -32,6 +36,7 @@ class CommQueue { uint8_t attempts; bool delOnPop; bool isDevControl; + bool firstTry; uint32_t ts; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : @@ -41,6 +46,10 @@ class CommQueue { protected: void add(queue_s q) { mQueue[mWrPtr] = q; + /*mQueue[mRdPtr].firstTry = false; + if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { + mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); + }*/ inc(&mWrPtr); } @@ -60,6 +69,13 @@ class CommQueue { inc(&mRdPtr); } + bool isFirstTry(void) { + if(!mQueue[mRdPtr].firstTry) + return false; + mQueue[mRdPtr].firstTry = false; + return true; + } + void setTs(uint32_t *ts) { mQueue[mRdPtr].ts = *ts; } diff --git a/src/hm/Communication.h b/src/hm/Communication.h index c14bd4f0..2dbf4593 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -90,6 +90,13 @@ class Communication : public CommQueue<> { case States::CHECK_FRAMES: { if(!q->iv->radio->get()) { // radio buffer empty + // second try for nRF type inverters if available + /*if(isFirstTry()) { + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINTLN(F("enqueue second try")); + mState = States::START; + break; + }*/ cmdDone(); DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("request timeout: ")); @@ -111,12 +118,17 @@ class Communication : public CommQueue<> { DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("RX ")); + if(p->millis<100) + DBGPRINT("0"); DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); if((IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen)) { DBGPRINT(F(" CH")); - DBGPRINT(String(p->ch)); + if(p->ch == 3) + DBGPRINT("03"); + else + DBGPRINT(String(p->ch)); } DBGPRINT(F(", ")); DBGPRINT(String(p->rssi)); @@ -132,6 +144,23 @@ class Communication : public CommQueue<> { } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) { // response from dev control command parseDevCtrl(p, q); cmdDone(true); // remove done request + } else if (q->iv->ivGen == IV_MI) { + /*if (p->packet[0] == (0x88)) { // 0x88 is MI status response to 0x09 + miStsDecode(p, q); + } + + else if (p->packet[0] == (MI_REQ_CH2 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11 + miStsDecode(p, q, CH2); + + } else*/ if ( p->packet[0] == MI_REQ_CH1 + ALL_FRAMES || + p->packet[0] == MI_REQ_CH2 + ALL_FRAMES || + ( p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) + && q->cmd != 0x0f) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 + //mPayload[iv->id].txId = p->packet[0]; + miDataDecode(p, q); + + } + //parseMiFrame(p, q); } } @@ -254,6 +283,80 @@ class Communication : public CommQueue<> { q->iv->actPowerLimit = 0xffff; // unknown, readback current value } + inline void parseMiFrame(packet_t *p, const queue_s *q) { + if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) + return; + bool accepted = true; + if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) + q->iv->powerLimitAck = true; + else + accepted = false; + + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("has ")); + if(!accepted) DBGPRINT(F("not ")); + DBGPRINT(F("accepted power limit set point ")); + DBGPRINT(String(q->iv->powerLimit[0])); + DBGPRINT(F(" with PowerLimitControl ")); + DBGPRINTLN(String(q->iv->powerLimit[1])); + q->iv->actPowerLimit = 0xffff; // unknown, readback current value + } + + inline void miDataDecode(packet_t *p, const queue_s *q) { + record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser + //rec->ts = mPayload[iv->id].ts; + //mPayload[iv->id].gotFragment = true; + //mPayload[iv->id].multi_parts += 4; + + uint8_t datachan = ( p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES) || p->packet[0] == (MI_REQ_4CH + ALL_FRAMES) ) ? CH1 : + ( p->packet[0] == (MI_REQ_CH2 + ALL_FRAMES) || p->packet[0] == (0x37 + ALL_FRAMES) ) ? CH2 : + p->packet[0] == (0x38 + ALL_FRAMES) ? CH3 : + CH4; + // count in RF_communication_protocol.xlsx is with offset = -1 + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_UDC, rec), rec, (float)((p->packet[9] << 8) + p->packet[10])/10); + yield(); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_IDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); + yield(); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); + yield(); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[15] << 8) + p->packet[16])/100); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_PDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10); + yield(); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_YD, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/1); + yield(); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(q->iv, datachan))); + //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + + /*if ( datachan < 3 ) { + mPayload[q->iv->id].dataAB[datachan] = true; + } + if ( !mPayload[iv->id].dataAB[CH0] && mPayload[iv->id].dataAB[CH1] && mPayload[iv->id].dataAB[CH2] ) { + mPayload[iv->id].dataAB[CH0] = true; + }*/ + + if (p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) ) { + /*For MI1500: + if (MI1500) { + STAT = (uint8_t)(p->packet[25] ); + FCNT = (uint8_t)(p->packet[26]); + FCODE = (uint8_t)(p->packet[27]); + }*/ + //miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]); + + if (p->packet[0] < (0x39 + ALL_FRAMES) ) { + addImportant(q->iv, (q->cmd + 1)); + //mPayload[iv->id].txCmd++; + //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response + //mPayload[iv->id].complete = false; + } else { + //miComplete(iv); + } + } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && q->iv->type == INV_TYPE_2CH ) { + addImportant(q->iv, MI_REQ_CH2); + } + } + inline void compilePayload(const queue_s *q) { uint16_t crc = 0xffff, crcRcv = 0x0000; for(uint8_t i = 0; i < mMaxFrameId; i++) { diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 04aca4d2..e90acac3 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -202,7 +202,8 @@ class Inverter { mDevControlRequest = false; } else if(0 == getFwVersion()) - cb(InverterDevInform_All, false); // get firmware version + cb(MI_REQ_CH1, false); // get firmware version + //cb(InverterDevInform_All, false); // get firmware version else { record_t<> *rec = getRecordStruct(InverterDevInform_Simple); if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index 461fd08e..e8a95990 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -146,7 +146,8 @@ class HmRadio : public Radio { } void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) { - DPRINT(DBG_INFO, F("sendControlPacket cmd: 0x")); + DPRINT_IVID(DBG_INFO,iv->id); + DBGPRINT(F("sendControlPacket cmd: 0x")); DBGHEXLN(cmd); initPacket(iv->radioId.u64, TX_REQ_DEVCONTROL, SINGLE_FRAME); uint8_t cnt = 10; From 96f181c6625cfe61d4adec81efc9a846d9fb529f Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 18 Oct 2023 22:39:41 +0200 Subject: [PATCH 15/42] some improvements --- src/app.cpp | 20 +++++++++++--------- src/hm/CommQueue.h | 7 +++++++ src/hm/Communication.h | 35 ++++++++++++++++++++++++----------- src/hm/hmInverter.h | 6 +++--- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index 44d8ab30..9cbe06a1 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -413,13 +413,15 @@ void app::tickSend(void) { for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { Inverter<> *iv = mSys.getInverterByPos(i); if(NULL != iv) { - iv->tickSend([this, iv](uint8_t cmd, bool isDevControl) { - if(isDevControl) - mCommunication.addImportant(iv, cmd); - else - mCommunication.add(iv, cmd); - }); - }; + if(iv->config->enabled) { + iv->tickSend([this, iv](uint8_t cmd, bool isDevControl) { + if(isDevControl) + mCommunication.addImportant(iv, cmd); + else + mCommunication.add(iv, cmd); + }); + } + } } /*if(mConfig->nrf.enabled) { @@ -468,9 +470,9 @@ void app::tickSend(void) { if (mConfig->serial.debug) DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); } - yield(); + yield();*/ - updateLed();*/ + updateLed(); } //----------------------------------------------------------------------------- diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 9c9da707..94cc63bd 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -44,6 +44,13 @@ class CommQueue { inc(&mWrPtr); } + void add(const queue_s *q, bool rstAttempts = false) { + mQueue[mWrPtr] = *q; + if(rstAttempts) + mQueue[mWrPtr].attempts = 5; + inc(&mWrPtr); + } + void get(std::function cb) { if(mRdPtr == mWrPtr) { cb(false, &mQueue[mRdPtr]); // empty diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 4cdf0beb..81dc763c 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -112,7 +112,8 @@ class Communication : public CommQueue<> { parseDevCtrl(p, q); cmdDone(true); // remove done request } - } + } else + DPRINTLN(DBG_WARN, F("Inverter serial does not match")); q->iv->radio->mBufCtrl.pop(); yield(); @@ -126,7 +127,7 @@ class Communication : public CommQueue<> { setAttempt(); DPRINT_IVID(DBG_WARN, q->iv->id); - DBGPRINT(F("last frame missing: request retransmit (")); + DBGPRINT(F("frame missing: request retransmit (")); DBGPRINT(String(q->attempts)); DBGPRINTLN(F(" attempts left)")); @@ -136,11 +137,17 @@ class Communication : public CommQueue<> { break; } - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); - q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + 500; - mState = States::WAIT; - break; + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + 500; + mState = States::WAIT; + } else { + add(q, true); + cmdDone(q); + mState = States::RESET; + } + return; } for(uint8_t i = 0; i < mMaxFrameId; i++) { @@ -154,10 +161,16 @@ class Communication : public CommQueue<> { DBGPRINT(String(q->attempts)); DBGPRINTLN(F(" attempts left)")); - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); - q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + 500; - mState = States::WAIT; + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + 500; + mState = States::WAIT; + } else { + add(q, true); + cmdDone(q); + mState = States::RESET; + } return; } } diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 5e3e4266..45b861a7 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -617,9 +617,9 @@ class Inverter { uint32_t startTimeOffset = 0, endTimeOffset = 0; uint32_t start, endTime; - if (((wCode >> 13) & 0x01) == 1) // check if is AM or PM - startTimeOffset = 12 * 60 * 60; - if (((wCode >> 12) & 0x01) == 1) // check if is AM or PM + // check if is AM or PM + startTimeOffset = ((wCode >> 13) & 0x01) * 12 * 60 * 60; + if (((wCode >> 12) & 0x03) != 0) endTimeOffset = 12 * 60 * 60; start = (((uint16_t)pyld[startOff + 4] << 8) | ((uint16_t)pyld[startOff + 5])) + startTimeOffset; From 1b965d67a850d41be6a97eef72a9bab557057ddd Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 18 Oct 2023 23:11:46 +0200 Subject: [PATCH 16/42] added MI additions / corrections from @rejoe2 --- src/hm/Communication.h | 79 ++++++++++++++++++++++++++++++++++++++++-- src/hm/hmDefines.h | 4 +++ src/hm/hmInverter.h | 42 +++++++++++++++------- src/hm/hmRadio.h | 26 ++++++++------ src/hm/radio.h | 11 +++++- src/hms/hmsRadio.h | 6 +++- 6 files changed, 141 insertions(+), 27 deletions(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 81dc763c..1336e78c 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -71,7 +71,8 @@ class Communication : public CommQueue<> { case States::CHECK_FRAMES: { if(!q->iv->radio->get()) { // radio buffer empty cmdDone(); - DPRINT(DBG_INFO, F("request timeout: ")); + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("request timeout: ")); DBGPRINT(String(millis() - mWaitTimeout + 500)); DBGPRINTLN(F("ms")); @@ -90,11 +91,15 @@ class Communication : public CommQueue<> { DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("RX ")); + if(p->millis < 100) + DBGPRINT(F("0")); DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); - if(IV_HM == q->iv->ivGen) { + if((IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen)) { DBGPRINT(F(" CH")); + if(3 == p->ch) + DBGPRINT(F("0")); DBGPRINT(String(p->ch)); } DBGPRINT(F(", ")); @@ -111,6 +116,8 @@ class Communication : public CommQueue<> { } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) { // response from dev control command parseDevCtrl(p, q); cmdDone(true); // remove done request + } else if(IV_MI == q->iv->ivGen) { + parseMiFrame(p, q); } } else DPRINTLN(DBG_WARN, F("Inverter serial does not match")); @@ -227,6 +234,74 @@ class Communication : public CommQueue<> { f->rssi = p->rssi; } + inline void parseMiFrame(packet_t *p, const queue_s *q) { + if ((p->packet[0] == MI_REQ_CH1 + ALL_FRAMES) + || (p->packet[0] == MI_REQ_CH2 + ALL_FRAMES) + || ((p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES)) + && (p->packet[0] < (0x39 + SINGLE_FRAME)) + && (q->cmd != 0x0f))) { + // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 + //mPayload[iv->id].txId = p->packet[0]; + miDataDecode(p, q); + + } + } + + inline void miDataDecode(packet_t *p, const queue_s *q) { + record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser + //rec->ts = mPayload[iv->id].ts; + //mPayload[iv->id].gotFragment = true; + //mPayload[iv->id].multi_parts += 4; + + uint8_t datachan = ( p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES) || p->packet[0] == (MI_REQ_4CH + ALL_FRAMES) ) ? CH1 : + ( p->packet[0] == (MI_REQ_CH2 + ALL_FRAMES) || p->packet[0] == (0x37 + ALL_FRAMES) ) ? CH2 : + p->packet[0] == (0x38 + ALL_FRAMES) ? CH3 : + CH4; + // count in RF_communication_protocol.xlsx is with offset = -1 + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_UDC, rec), rec, (float)((p->packet[9] << 8) + p->packet[10])/10); + + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_IDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); + + q->iv->setValue(q->iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); + + q->iv->setValue(q->iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[15] << 8) + p->packet[16])/100); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_PDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10); + + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_YD, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/1); + + q->iv->setValue(q->iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(q->iv, datachan))); + //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + + /*if ( datachan < 3 ) { + mPayload[q->iv->id].dataAB[datachan] = true; + } + if ( !mPayload[iv->id].dataAB[CH0] && mPayload[iv->id].dataAB[CH1] && mPayload[iv->id].dataAB[CH2] ) { + mPayload[iv->id].dataAB[CH0] = true; + }*/ + + if (p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) ) { + /*For MI1500: + if (MI1500) { + STAT = (uint8_t)(p->packet[25] ); + FCNT = (uint8_t)(p->packet[26]); + FCODE = (uint8_t)(p->packet[27]); + }*/ + //miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]); + + if (p->packet[0] < (0x39 + ALL_FRAMES) ) { + addImportant(q->iv, (q->cmd + 1)); + //mPayload[iv->id].txCmd++; + //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response + //mPayload[iv->id].complete = false; + } else { + //miComplete(iv); + } + } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && q->iv->type == INV_TYPE_2CH ) { + addImportant(q->iv, MI_REQ_CH2); + } + } + inline void parseDevCtrl(packet_t *p, const queue_s *q) { if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) return; diff --git a/src/hm/hmDefines.h b/src/hm/hmDefines.h index acd81541..c00f4940 100644 --- a/src/hm/hmDefines.h +++ b/src/hm/hmDefines.h @@ -346,4 +346,8 @@ const devInfo_t devInfo[] = { { 0x103331, 2250 } }; +#define MI_REQ_CH1 0x09 +#define MI_REQ_CH2 0x11 +#define MI_REQ_4CH 0x36 + #endif /*__HM_DEFINES_H__*/ diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 45b861a7..618cf5da 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -182,19 +182,35 @@ class Inverter { } void tickSend(std::function cb) { - if(mDevControlRequest) { - cb(devControlCmd, true); - mDevControlRequest = false; - } else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) - cb(AlarmData, false); // get last alarms - else if(0 == getFwVersion()) - cb(InverterDevInform_All, false); // get firmware version - else if(0 == getHwVersion()) - cb(InverterDevInform_Simple, false); // get hardware version - else if(actPowerLimit == 0xffff) - cb(SystemConfigPara, false); // power limit info - else - cb(RealTimeRunData_Debug, false); // get live data + if (IV_MI != ivGen) { + if(mDevControlRequest) { + cb(devControlCmd, true); + mDevControlRequest = false; + } else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) + cb(AlarmData, false); // get last alarms + else if(0 == getFwVersion()) + cb(InverterDevInform_All, false); // get firmware version + else if(0 == getHwVersion()) + cb(InverterDevInform_Simple, false); // get hardware version + else if(actPowerLimit == 0xffff) + cb(SystemConfigPara, false); // power limit info + else + cb(RealTimeRunData_Debug, false); // get live data + } else { + if(mDevControlRequest) { + cb(devControlCmd, true); + mDevControlRequest = false; + } else if(0 == getFwVersion()) + cb(MI_REQ_CH1, false); // get firmware version + //cb(InverterDevInform_All, false); // get firmware version + else { + record_t<> *rec = getRecordStruct(InverterDevInform_Simple); + if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) + cb(InverterDevInform_All, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 + else + cb(type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1, false); + } + } } /*template diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index 461fd08e..3d74222d 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -117,24 +117,24 @@ class HmRadio : public Radio { mNrf24.setChannel(mRfChLst[mRxChIdx]); mNrf24.startListening(); - uint32_t startMicros = micros(); + uint32_t startMicros = micros() + 5110; uint32_t loopMillis = millis() + 400; while (millis() < loopMillis) { - while (micros()-startMicros < 5110) { // listen (4088us or?) 5110us to each channel + while (micros() < startMicros) { // listen (4088us or?) 5110us to each channel if (mIrqRcvd) { mIrqRcvd = false; - if (getReceived()) { // everything received + + if (getReceived()) // everything received return; - } + } yield(); } // switch to next RX channel - startMicros = micros(); if(++mRxChIdx >= RF_CHANNELS) mRxChIdx = 0; mNrf24.setChannel(mRfChLst[mRxChIdx]); - yield(); + startMicros = micros() + 5000; } // not finished but time is over return; @@ -145,12 +145,13 @@ class HmRadio : public Radio { return mNrf24.isChipConnected(); } - void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) { - DPRINT(DBG_INFO, F("sendControlPacket cmd: 0x")); + void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit) { + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINT(F("sendControlPacket cmd: 0x")); DBGHEXLN(cmd); initPacket(iv->radioId.u64, TX_REQ_DEVCONTROL, SINGLE_FRAME); uint8_t cnt = 10; - if (isNoMI) { + if (IV_MI != iv->ivGen) { mTxBuf[cnt++] = cmd; // cmd -> 0 on, 1 off, 2 restart, 11 active power, 12 reactive power, 13 power factor mTxBuf[cnt++] = 0x00; if(cmd >= ActivePowerContr && cmd <= PFSet) { // ActivePowerContr, ReactivePowerContr, PFSet @@ -160,6 +161,7 @@ class HmRadio : public Radio { mTxBuf[cnt++] = ((data[1] ) ) & 0xff; // setting for persistens handling } } else { //MI 2nd gen. specific + uint16_t powerMax = ((iv->powerLimit[1] == RelativNonPersistent) ? 0 : iv->getMaxPower()); switch (cmd) { case Restart: case TurnOn: @@ -225,7 +227,7 @@ class HmRadio : public Radio { } cnt++; } - sendPacket(iv, cnt, isRetransmit, isNoMI); + sendPacket(iv, cnt, isRetransmit, (IV_MI != iv->ivGen)); } uint8_t getDataRate(void) { @@ -297,6 +299,10 @@ class HmRadio : public Radio { return iv->radioId.u64; } + uint8_t getIvGen(Inverter<> *iv) { + return iv->ivGen; + } + uint64_t DTU_RADIO_ID; uint8_t mRfChLst[RF_CHANNELS]; uint8_t mTxChIdx; diff --git a/src/hm/radio.h b/src/hm/radio.h index 2096f108..75db5436 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -21,7 +21,7 @@ class Inverter; // abstract radio interface class Radio { public: - virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) = 0; + virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit) = 0; virtual bool switchFrequency(Inverter<> *iv, uint32_t fromkHz, uint32_t tokHz) { return true; } virtual void loop(void) {}; @@ -43,6 +43,14 @@ class Radio { } void prepareDevInformCmd(Inverter<> *iv, uint8_t cmd, uint32_t ts, uint16_t alarmMesId, bool isRetransmit, uint8_t reqfld=TX_REQ_INFO) { // might not be necessary to add additional arg. + if(IV_MI == getIvGen(iv)) { + DPRINT_IVID(DBG_INFO, getIvId(iv)); + DBGPRINT(F("legacy cmd 0x")); + DBGHEXLN(cmd); + sendCmdPacket(iv, cmd, cmd, false, false); + return; + } + if(mSerialDebug) { DPRINT(DBG_DEBUG, F("prepareDevInformCmd 0x")); DPRINTLN(DBG_DEBUG,String(cmd, HEX)); @@ -63,6 +71,7 @@ class Radio { protected: virtual void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) = 0; virtual uint64_t getIvId(Inverter<> *iv) = 0; + virtual uint8_t getIvGen(Inverter<> *iv) = 0; void initPacket(uint64_t ivId, uint8_t mid, uint8_t pid) { mTxBuf[0] = mid; diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index 24c3c7cd..097a3f03 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -44,7 +44,7 @@ class CmtRadio : public Radio { return mCmtAvail; } - void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) { + void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit) { DPRINT(DBG_INFO, F("sendControlPacket cmd: 0x")); DBGHEXLN(cmd); initPacket(iv->radioId.u64, TX_REQ_DEVCONTROL, SINGLE_FRAME); @@ -101,6 +101,10 @@ class CmtRadio : public Radio { return iv->radioId.u64; } + uint8_t getIvGen(Inverter<> *iv) { + return iv->ivGen; + } + inline void reset(bool genDtuSn) { if(genDtuSn) generateDtuSn(); From 0fca99f833db79006827e831d794ea67e782a046 Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Thu, 19 Oct 2023 17:50:04 +0200 Subject: [PATCH 17/42] MI might be functional again --- src/hm/CommQueue.h | 23 +- src/hm/Communication.h | 482 +++++++++++++++++++++++++++++++---------- src/hm/hmInverter.h | 24 +- src/hm/hmRadio.h | 25 ++- src/hm/miPayload.h | 2 +- src/hm/radio.h | 13 +- 6 files changed, 418 insertions(+), 151 deletions(-) diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 5f27db60..94cc63bd 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -22,10 +22,6 @@ class CommQueue { void add(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop, false); - /*mQueue[mRdPtr].firstTry = false; - if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { - mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); - }*/ inc(&mWrPtr); } @@ -36,7 +32,6 @@ class CommQueue { uint8_t attempts; bool delOnPop; bool isDevControl; - bool firstTry; uint32_t ts; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : @@ -46,10 +41,13 @@ class CommQueue { protected: void add(queue_s q) { mQueue[mWrPtr] = q; - /*mQueue[mRdPtr].firstTry = false; - if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { - mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); - }*/ + inc(&mWrPtr); + } + + void add(const queue_s *q, bool rstAttempts = false) { + mQueue[mWrPtr] = *q; + if(rstAttempts) + mQueue[mWrPtr].attempts = 5; inc(&mWrPtr); } @@ -69,13 +67,6 @@ class CommQueue { inc(&mRdPtr); } - bool isFirstTry(void) { - if(!mQueue[mRdPtr].firstTry) - return false; - mQueue[mRdPtr].firstTry = false; - return true; - } - void setTs(uint32_t *ts) { mQueue[mRdPtr].ts = *ts; } diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 2dbf4593..d8859477 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -10,6 +10,9 @@ #include #include "../utils/crc.h" +#define MI_TIMEOUT 500 +#define DEFAULT_TIMEOUT 500 + typedef std::function *)> payloadListenerType; typedef std::function *)> alarmListenerType; @@ -37,6 +40,8 @@ class Communication : public CommQueue<> { if(!valid) return; // empty + uint16_t lcl_tmo = q->iv->ivGen != IV_MI ? DEFAULT_TIMEOUT : MI_TIMEOUT; + switch(mState) { case States::RESET: if(millis() < mWaitTimeout) @@ -50,34 +55,26 @@ class Communication : public CommQueue<> { case States::START: setTs(mTimestamp); - if (q->iv->ivGen != IV_MI) { - if(q->isDevControl) { - if(ActivePowerContr == q->cmd) - q->iv->powerLimitAck = false; - q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); - } else - q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); - } else { // IV_MI - if(q->isDevControl) { - if(ActivePowerContr == q->cmd) - q->iv->powerLimitAck = false; - q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false, false, (q->iv->powerLimit[1] == RelativNonPersistent) ? 0 : q->iv->getMaxPower()); - } else { - //uint8_t cmd = q->iv->type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1; - //q->iv->radio->sendCmdPacket(q->iv, cmd, cmd, false, false); - q->iv->radio->sendCmdPacket(q->iv, q->cmd, q->cmd, false, false); - //if (q->iv->radio->mSerialDebug) { - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F("legacy cmd 0x")); - DBGHEXLN(q->cmd); - //} - //mPayload[q->iv->id]. = cmd; - } - + if(q->isDevControl) { + if(ActivePowerContr == q->cmd) + q->iv->powerLimitAck = false; + q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); + } + else if (q->iv->ivGen != IV_MI) + q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); + else { // IV_MI + //uint8_t cmd = q->iv->type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1; + //q->iv->radio->sendCmdPacket(q->iv, cmd, cmd, false, false); + q->iv->radio->sendCmdPacket(q->iv, q->cmd, q->cmd, false, false); + //if (q->iv->radio->mSerialDebug) { + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("legacy cmd 0x")); + DBGHEXLN(q->cmd); + //} + //mPayload[q->iv->id]. = cmd; } - q->iv->radioStatistics.txCnt++; - mWaitTimeout = millis() + 500; + mWaitTimeout = millis() + lcl_tmo; setAttempt(); mState = States::WAIT; break; @@ -90,17 +87,10 @@ class Communication : public CommQueue<> { case States::CHECK_FRAMES: { if(!q->iv->radio->get()) { // radio buffer empty - // second try for nRF type inverters if available - /*if(isFirstTry()) { - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINTLN(F("enqueue second try")); - mState = States::START; - break; - }*/ cmdDone(); DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("request timeout: ")); - DBGPRINT(String(millis() - mWaitTimeout + 500)); + DBGPRINT(String(millis() - mWaitTimeout + lcl_tmo)); DBGPRINTLN(F("ms")); q->iv->radioStatistics.rxFailNoAnser++; // got nothing @@ -118,15 +108,15 @@ class Communication : public CommQueue<> { DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("RX ")); - if(p->millis<100) - DBGPRINT("0"); + if(p->millis < 100) + DBGPRINT(F("0")); DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); if((IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen)) { DBGPRINT(F(" CH")); - if(p->ch == 3) - DBGPRINT("03"); + if(3 == p->ch) + DBGPRINT(F("03")); else DBGPRINT(String(p->ch)); } @@ -144,25 +134,11 @@ class Communication : public CommQueue<> { } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) { // response from dev control command parseDevCtrl(p, q); cmdDone(true); // remove done request - } else if (q->iv->ivGen == IV_MI) { - /*if (p->packet[0] == (0x88)) { // 0x88 is MI status response to 0x09 - miStsDecode(p, q); - } - - else if (p->packet[0] == (MI_REQ_CH2 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11 - miStsDecode(p, q, CH2); - - } else*/ if ( p->packet[0] == MI_REQ_CH1 + ALL_FRAMES || - p->packet[0] == MI_REQ_CH2 + ALL_FRAMES || - ( p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) - && q->cmd != 0x0f) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 - //mPayload[iv->id].txId = p->packet[0]; - miDataDecode(p, q); - - } - //parseMiFrame(p, q); + } else if(IV_MI == q->iv->ivGen) { + parseMiFrame(p, q); } - } + } else + DPRINTLN(DBG_WARN, F("Inverter serial does not match")); q->iv->radio->mBufCtrl.pop(); yield(); @@ -176,7 +152,7 @@ class Communication : public CommQueue<> { setAttempt(); DPRINT_IVID(DBG_WARN, q->iv->id); - DBGPRINT(F("last frame missing: request retransmit (")); + DBGPRINT(F("frame missing: request retransmit (")); DBGPRINT(String(q->attempts)); DBGPRINTLN(F(" attempts left)")); @@ -186,11 +162,17 @@ class Communication : public CommQueue<> { break; } - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); - q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + 500; - mState = States::WAIT; - break; + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + lcl_tmo; + mState = States::WAIT; + } else { + add(q, true); + cmdDone(q); + mState = States::RESET; + } + return; } for(uint8_t i = 0; i < mMaxFrameId; i++) { @@ -204,10 +186,16 @@ class Communication : public CommQueue<> { DBGPRINT(String(q->attempts)); DBGPRINTLN(F(" attempts left)")); - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); - q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + 500; - mState = States::WAIT; + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + lcl_tmo; + mState = States::WAIT; + } else { + add(q, true); + cmdDone(q); + mState = States::RESET; + } return; } } @@ -264,47 +252,167 @@ class Communication : public CommQueue<> { f->rssi = p->rssi; } - inline void parseDevCtrl(packet_t *p, const queue_s *q) { - if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) - return; - bool accepted = true; - if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) - q->iv->powerLimitAck = true; - else - accepted = false; + inline void parseMiFrame(packet_t *p, const queue_s *q) { + if ((p->packet[0] == MI_REQ_CH1 + ALL_FRAMES) + || (p->packet[0] == MI_REQ_CH2 + ALL_FRAMES) + || ((p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES)) + && (p->packet[0] < (0x39 + SINGLE_FRAME)) + && (q->cmd != 0x0f))) { + // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 + //mPayload[iv->id].txId = p->packet[0]; + miDataDecode(p, q); + + } + else if (p->packet[0] == 0x0f + ALL_FRAMES) + miHwDecode(p, q); + + else if ((p->packet[0] == 0x88) || (p->packet[0] == 0x92)) { + record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure + rec->ts = q->ts; + miStsConsolidate(q, p->packet[0] == 0x88 ? 1 : 2, rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); + } + - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F(" has ")); - if(!accepted) DBGPRINT(F("not ")); - DBGPRINT(F("accepted power limit set point ")); - DBGPRINT(String(q->iv->powerLimit[0])); - DBGPRINT(F(" with PowerLimitControl ")); - DBGPRINTLN(String(q->iv->powerLimit[1])); - q->iv->actPowerLimit = 0xffff; // unknown, readback current value } - inline void parseMiFrame(packet_t *p, const queue_s *q) { - if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) - return; - bool accepted = true; - if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) - q->iv->powerLimitAck = true; - else - accepted = false; + inline void miHwDecode(packet_t *p, const queue_s *q) { + record_t<> *rec = q->iv->getRecordStruct(InverterDevInform_All); // choose the record structure + rec->ts = q->ts; + //mPayload[iv->id].gotFragment = true; + uint8_t multi_parts = 0; + +/* +Polling the device software and hardware version number command +start byte Command word routing address target address User data check end byte +byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] +0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f +Command Receipt - First Frame +start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte +byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] +0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f +Command Receipt - Second Frame +start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte +byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] +0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f +Command receipt - third frame +start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte +byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] +0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f +*/ + +/* +case InverterDevInform_All: + rec->length = (uint8_t)(HMINFO_LIST_LEN); + rec->assign = (byteAssign_t *)InfoAssignment; + rec->pyldLen = HMINFO_PAYLOAD_LEN; + break; + +const byteAssign_t InfoAssignment[] = { +{ FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, +{ FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, +{ FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 }, +{ FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 }, +{ FLD_BOOTLOADER_VER, UNIT_NONE, CH0, 8, 2, 1 } +}; +*/ - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F("has ")); - if(!accepted) DBGPRINT(F("not ")); - DBGPRINT(F("accepted power limit set point ")); - DBGPRINT(String(q->iv->powerLimit[0])); - DBGPRINT(F(" with PowerLimitControl ")); - DBGPRINTLN(String(q->iv->powerLimit[1])); - q->iv->actPowerLimit = 0xffff; // unknown, readback current value + if ( p->packet[9] == 0x00 ) {//first frame + //FLD_FW_VERSION + for (uint8_t i = 0; i < 5; i++) { + q->iv->setValue(i, rec, (float) ((p->packet[(12+2*i)] << 8) + p->packet[(13+2*i)])/1); + } + q->iv->isConnected = true; + //if(mSerialDebug) { + DPRINT_IVID(DBG_INFO, q->iv->id); + DPRINT(DBG_INFO,F("HW_VER is ")); + DBGPRINTLN(String((p->packet[24] << 8) + p->packet[25])); + //} + record_t<> *rec = q->iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure + rec->ts = q->ts; + q->iv->setValue(1, rec, (uint32_t) ((p->packet[24] << 8) + p->packet[25])/1); + //mPayload[iv->id].multi_parts +=4; + multi_parts +=4; + } else if ( p->packet[9] == 0x01 || p->packet[9] == 0x10 ) {//second frame for MI, 3rd gen. answers in 0x10 + DPRINT_IVID(DBG_INFO, q->iv->id); + if ( p->packet[9] == 0x01 ) { + DBGPRINTLN(F("got 2nd frame (hw info)")); + /* according to xlsx (different start byte -1!) + byte[11] to byte[14] HW_PN + byte[15] byte[16] HW_FB_TLmValue + byte[17] byte[18] HW_FB_ReSPRT + byte[19] byte[20] HW_GridSamp_ResValule + byte[21] byte[22] HW_ECapValue + byte[23] to byte[26] Matching_APPFW_PN*/ + DPRINT(DBG_INFO,F("HW_PartNo ")); + DBGPRINTLN(String((uint32_t) (((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13])); + record_t<> *rec = q->iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure + rec->ts = q->ts; + q->iv->setValue(0, rec, (uint32_t) ((((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13])/1); + + //if(mSerialDebug) { + DPRINT(DBG_INFO,F("HW_FB_TLmValue ")); + DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15])); + DPRINT(DBG_INFO,F("HW_FB_ReSPRT ")); + DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17])); + DPRINT(DBG_INFO,F("HW_GridSamp_ResValule ")); + DBGPRINTLN(String((p->packet[18] << 8) + p->packet[19])); + DPRINT(DBG_INFO,F("HW_ECapValue ")); + DBGPRINTLN(String((p->packet[20] << 8) + p->packet[21])); + DPRINT(DBG_INFO,F("Matching_APPFW_PN ")); + DBGPRINTLN(String((uint32_t) (((p->packet[22] << 8) | p->packet[23]) << 8 | p->packet[24]) << 8 | p->packet[25])); + //} + //notify(InverterDevInform_Simple, iv); + //mPayload[iv->id].multi_parts +=2; + multi_parts +=2; + //notify(InverterDevInform_All, iv); + } else { + DBGPRINTLN(F("3rd gen. inverter!")); + } + + } else if ( p->packet[9] == 0x12 ) {//3rd frame + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINTLN(F("got 3rd frame (hw info)")); + /* according to xlsx (different start byte -1!) + byte[11] byte[12] APPFW_MINVER + byte[13] byte[14] HWInfoAddr + byte[15] byte[16] PNInfoCRC_gusv + byte[15] byte[16] PNInfoCRC_gusv (this really is double mentionned in xlsx...) + */ + //if(mSerialDebug) { + DPRINT(DBG_INFO,F("APPFW_MINVER ")); + DBGPRINTLN(String((p->packet[10] << 8) + p->packet[11])); + DPRINT(DBG_INFO,F("HWInfoAddr ")); + DBGPRINTLN(String((p->packet[12] << 8) + p->packet[13])); + DPRINT(DBG_INFO,F("PNInfoCRC_gusv ")); + DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15])); + //} + //mPayload[iv->id].multi_parts++; + multi_parts++; + } + if(multi_parts > 5) { + cmdDone(q); + mState = States::RESET; + q->iv->radioStatistics.rxSuccess++; + } + + /*if (mPayload[iv->id].multi_parts > 5) { + iv->setQueuedCmdFinished(); + mPayload[iv->id].complete = true; + mPayload[iv->id].rxTmo = true; + mPayload[iv->id].requested= false; + iv->radioStatistics.rxSuccess++; + } + if (mHighPrioIv == NULL) + mHighPrioIv = iv; + */ } inline void miDataDecode(packet_t *p, const queue_s *q) { record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser - //rec->ts = mPayload[iv->id].ts; + rec->ts = q->ts; + q->iv->radioStatistics.rxSuccess++; + mState = States::RESET; + //mPayload[iv->id].gotFragment = true; //mPayload[iv->id].multi_parts += 4; @@ -314,19 +422,22 @@ class Communication : public CommQueue<> { CH4; // count in RF_communication_protocol.xlsx is with offset = -1 q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_UDC, rec), rec, (float)((p->packet[9] << 8) + p->packet[10])/10); - yield(); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_IDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); - yield(); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); - yield(); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[15] << 8) + p->packet[16])/100); q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_PDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10); - yield(); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_YD, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/1); - yield(); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); q->iv->setValue(q->iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(q->iv, datachan))); - //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + if (datachan == 1) //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + q->iv->rssi = p->rssi; + else if(q->iv->rssi > p->rssi) + q->iv->rssi = p->rssi; /*if ( datachan < 3 ) { mPayload[q->iv->id].dataAB[datachan] = true; @@ -342,19 +453,164 @@ class Communication : public CommQueue<> { FCNT = (uint8_t)(p->packet[26]); FCODE = (uint8_t)(p->packet[27]); }*/ - //miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]); + miStsConsolidate(q, datachan, rec, p->packet[23], p->packet[24]); if (p->packet[0] < (0x39 + ALL_FRAMES) ) { - addImportant(q->iv, (q->cmd + 1)); - //mPayload[iv->id].txCmd++; - //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response - //mPayload[iv->id].complete = false; + miNextRequest((p->packet[0] - ALL_FRAMES + 1), q); } else { - //miComplete(iv); + miComplete(q->iv); } } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && q->iv->type == INV_TYPE_2CH ) { - addImportant(q->iv, MI_REQ_CH2); + miNextRequest(MI_REQ_CH2, q); + } else { // first data msg for 1ch, 2nd for 2ch + miComplete(q->iv); + } + cmdDone(q); + } + + inline void miNextRequest(uint8_t cmd, const queue_s *q) { + //setAttempt(); + DPRINT_IVID(DBG_WARN, q->iv->id); + DBGPRINT(F("next request (")); + DBGPRINT(String(q->attempts)); + DBGPRINT(F(" attempts left): 0x")); + DBGHEXLN(cmd); + + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, cmd, 0x00, true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + MI_TIMEOUT; + mState = States::WAIT; + } else { + add(q, true); + cmdDone(q); + mState = States::RESET; + } + } + +/* inline void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t stschan = CH1) { + record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure + rec->ts = mPayload[iv->id].ts; + mPayload[iv->id].gotFragment = true; + mPayload[iv->id].multi_parts += 3; + mPayload[iv->id].txId = p->packet[0]; + miStsConsolidate(iv, stschan, rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); + mPayload[iv->id].stsAB[stschan] = true; + if (mPayload[iv->id].stsAB[CH1] && mPayload[iv->id].stsAB[CH2]) + */ + + inline void miStsConsolidate(const queue_s *q, uint8_t stschan, record_t<> *rec, uint8_t uState, uint8_t uEnum, uint8_t lState = 0, uint8_t lEnum = 0) { + //uint8_t status = (p->packet[11] << 8) + p->packet[12]; + uint16_t statusMi = 3; // regular status for MI, change to 1 later? + if ( uState == 2 ) { + statusMi = 5050 + stschan; //first approach, needs review! + if (lState) + statusMi += lState*10; + } else if ( uState > 3 ) { + statusMi = uState*1000 + uEnum*10; + if (lState) + statusMi += lState*100; //needs review, esp. for 4ch-8310 state! + //if (lEnum) + statusMi += lEnum; + if (uEnum < 6) { + statusMi += stschan; + } + if (statusMi == 8000) + statusMi = 8310; //trick? + } + + uint16_t prntsts = statusMi == 3 ? 1 : statusMi; + bool stsok = true; + if ( prntsts != rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)] ) { //sth.'s changed? + q->iv->alarmCnt = 1; // minimum... + //sth is or was wrong? + if ( (q->iv->type != INV_TYPE_1CH) && ( (statusMi != 3) + || ((q->iv->lastAlarm[stschan].code) && (statusMi == 3) && (q->iv->lastAlarm[stschan].code != 1))) + ) { + q->iv->lastAlarm[stschan] = alarm_t(prntsts, q->ts,0); + q->iv->alarmCnt = q->iv->type == INV_TYPE_2CH ? 3 : 5; + } + + q->iv->alarmLastId = prntsts; //iv->alarmMesIndex; + + stsok = false; + if (q->iv->alarmCnt > 1) { //more than one channel + for (uint8_t ch = 0; ch < (q->iv->alarmCnt); ++ch) { //start with 1 + if (q->iv->lastAlarm[ch].code == 1) { + stsok = true; + break; + } + } + } + //if (mSerialDebug) { + DPRINT(DBG_WARN, F("New state on CH")); + DBGPRINT(String(stschan)); DBGPRINT(F(" (")); + DBGPRINT(String(prntsts)); DBGPRINT(F("): ")); + DBGPRINTLN(q->iv->getAlarmStr(prntsts)); + //} + } + + if (!stsok) { + q->iv->setValue(q->iv->getPosByChFld(0, FLD_EVT, rec), rec, prntsts); + q->iv->lastAlarm[0] = alarm_t(prntsts, q->ts, 0); + } + + if (q->iv->alarmMesIndex < rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)]) { + q->iv->alarmMesIndex = rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!? + //if (mSerialDebug) { + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("alarm ID incremented to ")); + DBGPRINTLN(String(q->iv->alarmMesIndex)); + //} + } + } + + + inline void miComplete(Inverter<> *iv) { + //if ( mPayload[iv->id].complete ) + // return; //if we got second message as well in repreated attempt + //mPayload[iv->id].complete = true; + //if (mSerialDebug) { + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINTLN(F("got all data msgs")); + //} + record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); + iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); + + //preliminary AC calculation... + float ac_pow = 0; + for(uint8_t i = 1; i <= iv->channels; i++) { + if ((!iv->lastAlarm[i].code) || (iv->lastAlarm[i].code == 1)) { + uint8_t pos = iv->getPosByChFld(i, FLD_PDC, rec); + ac_pow += iv->getValue(pos, rec); + } } + ac_pow = (int) (ac_pow*9.5); + iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) ac_pow/10); + + iv->doCalculations(); + // update status state-machine, + iv->isProducing(); + } + + + inline void parseDevCtrl(packet_t *p, const queue_s *q) { + if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) + return; + bool accepted = true; + if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) + q->iv->powerLimitAck = true; + else + accepted = false; + + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("has ")); + if(!accepted) DBGPRINT(F("not ")); + DBGPRINT(F("accepted power limit set point ")); + DBGPRINT(String(q->iv->powerLimit[0])); + DBGPRINT(F(" with PowerLimitControl ")); + DBGPRINTLN(String(q->iv->powerLimit[1])); + q->iv->actPowerLimit = 0xffff; // unknown, readback current value } inline void compilePayload(const queue_s *q) { @@ -396,7 +652,7 @@ class Communication : public CommQueue<> { } memcpy(&mPayload[len], mLocalBuf[i].buf, mLocalBuf[i].len); len += mLocalBuf[i].len; - // get worst RSSI + // get best RSSI if(mLocalBuf[i].rssi > rssi) rssi = mLocalBuf[i].rssi; } diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index e90acac3..bbf9167a 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -182,7 +182,7 @@ class Inverter { } void tickSend(std::function cb) { - if (ivGen != IV_MI) { + if (IV_MI != ivGen) { if(mDevControlRequest) { cb(devControlCmd, true); mDevControlRequest = false; @@ -197,17 +197,23 @@ class Inverter { else cb(RealTimeRunData_Debug, false); // get live data } else { + /*if (cmd == 0x01) { //0x1 for HM-types + cmd2 = 0x00; + cmd = 0x0f; // for MI, these seem to make part of polling the device software and hardware version number command + } + if (cmd == SystemConfigPara ) { // 0x05 for HM-types + cmd2 = 0x00; + cmd = 0x10; // legacy GPF request + */ if(mDevControlRequest) { cb(devControlCmd, true); mDevControlRequest = false; - } - else if(0 == getFwVersion()) - cb(MI_REQ_CH1, false); // get firmware version - //cb(InverterDevInform_All, false); // get firmware version + } else if(0 == getFwVersion()) + cb(0x0f, false); // get firmware version; for MI, this makes part of polling the device software and hardware version number else { record_t<> *rec = getRecordStruct(InverterDevInform_Simple); if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) - cb(InverterDevInform_All, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 + cb(0x0f, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 else cb(type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1, false); } @@ -634,9 +640,9 @@ class Inverter { uint32_t startTimeOffset = 0, endTimeOffset = 0; uint32_t start, endTime; - if (((wCode >> 13) & 0x01) == 1) // check if is AM or PM - startTimeOffset = 12 * 60 * 60; - if (((wCode >> 12) & 0x01) == 1) // check if is AM or PM + // check if is AM or PM + startTimeOffset = ((wCode >> 13) & 0x01) * 12 * 60 * 60; + if (((wCode >> 12) & 0x03) != 0) endTimeOffset = 12 * 60 * 60; start = (((uint16_t)pyld[startOff + 4] << 8) | ((uint16_t)pyld[startOff + 5])) + startTimeOffset; diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index e8a95990..3d74222d 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -117,24 +117,24 @@ class HmRadio : public Radio { mNrf24.setChannel(mRfChLst[mRxChIdx]); mNrf24.startListening(); - uint32_t startMicros = micros(); + uint32_t startMicros = micros() + 5110; uint32_t loopMillis = millis() + 400; while (millis() < loopMillis) { - while (micros()-startMicros < 5110) { // listen (4088us or?) 5110us to each channel + while (micros() < startMicros) { // listen (4088us or?) 5110us to each channel if (mIrqRcvd) { mIrqRcvd = false; - if (getReceived()) { // everything received + + if (getReceived()) // everything received return; - } + } yield(); } // switch to next RX channel - startMicros = micros(); if(++mRxChIdx >= RF_CHANNELS) mRxChIdx = 0; mNrf24.setChannel(mRfChLst[mRxChIdx]); - yield(); + startMicros = micros() + 5000; } // not finished but time is over return; @@ -145,13 +145,13 @@ class HmRadio : public Radio { return mNrf24.isChipConnected(); } - void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) { - DPRINT_IVID(DBG_INFO,iv->id); + void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit) { + DPRINT_IVID(DBG_INFO, iv->id); DBGPRINT(F("sendControlPacket cmd: 0x")); DBGHEXLN(cmd); initPacket(iv->radioId.u64, TX_REQ_DEVCONTROL, SINGLE_FRAME); uint8_t cnt = 10; - if (isNoMI) { + if (IV_MI != iv->ivGen) { mTxBuf[cnt++] = cmd; // cmd -> 0 on, 1 off, 2 restart, 11 active power, 12 reactive power, 13 power factor mTxBuf[cnt++] = 0x00; if(cmd >= ActivePowerContr && cmd <= PFSet) { // ActivePowerContr, ReactivePowerContr, PFSet @@ -161,6 +161,7 @@ class HmRadio : public Radio { mTxBuf[cnt++] = ((data[1] ) ) & 0xff; // setting for persistens handling } } else { //MI 2nd gen. specific + uint16_t powerMax = ((iv->powerLimit[1] == RelativNonPersistent) ? 0 : iv->getMaxPower()); switch (cmd) { case Restart: case TurnOn: @@ -226,7 +227,7 @@ class HmRadio : public Radio { } cnt++; } - sendPacket(iv, cnt, isRetransmit, isNoMI); + sendPacket(iv, cnt, isRetransmit, (IV_MI != iv->ivGen)); } uint8_t getDataRate(void) { @@ -298,6 +299,10 @@ class HmRadio : public Radio { return iv->radioId.u64; } + uint8_t getIvGen(Inverter<> *iv) { + return iv->ivGen; + } + uint64_t DTU_RADIO_ID; uint8_t mRfChLst[RF_CHANNELS]; uint8_t mTxChIdx; diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index 892dc0a8..94f7a9b3 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -36,7 +36,7 @@ typedef struct { } miPayload_t; -//typedef std::function *)> miPayloadListenerType; +typedef std::function *)> miPayloadListenerType; template diff --git a/src/hm/radio.h b/src/hm/radio.h index 46c05d99..75db5436 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -21,7 +21,7 @@ class Inverter; // abstract radio interface class Radio { public: - virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit, bool isNoMI = true, uint16_t powerMax = 0) = 0; + virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit) = 0; virtual bool switchFrequency(Inverter<> *iv, uint32_t fromkHz, uint32_t tokHz) { return true; } virtual void loop(void) {}; @@ -42,7 +42,15 @@ class Radio { sendPacket(iv, 10, isRetransmit, appendCrc16); } - void prepareDevInformCmd(Inverter<> *iv, uint8_t cmd, uint32_t ts, uint16_t alarmMesId, bool isRetransmit, uint8_t reqfld=TX_REQ_INFO) { + void prepareDevInformCmd(Inverter<> *iv, uint8_t cmd, uint32_t ts, uint16_t alarmMesId, bool isRetransmit, uint8_t reqfld=TX_REQ_INFO) { // might not be necessary to add additional arg. + if(IV_MI == getIvGen(iv)) { + DPRINT_IVID(DBG_INFO, getIvId(iv)); + DBGPRINT(F("legacy cmd 0x")); + DBGHEXLN(cmd); + sendCmdPacket(iv, cmd, cmd, false, false); + return; + } + if(mSerialDebug) { DPRINT(DBG_DEBUG, F("prepareDevInformCmd 0x")); DPRINTLN(DBG_DEBUG,String(cmd, HEX)); @@ -63,6 +71,7 @@ class Radio { protected: virtual void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) = 0; virtual uint64_t getIvId(Inverter<> *iv) = 0; + virtual uint8_t getIvGen(Inverter<> *iv) = 0; void initPacket(uint64_t ivId, uint8_t mid, uint8_t pid) { mTxBuf[0] = mid; From ae49f919664a48c8f05e378046ac4ce09fdeeb03 Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Thu, 19 Oct 2023 17:55:57 +0200 Subject: [PATCH 18/42] fix 1ch AC calc --- src/hm/Communication.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index d8859477..c7332b32 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -579,10 +579,15 @@ const byteAssign_t InfoAssignment[] = { //preliminary AC calculation... float ac_pow = 0; - for(uint8_t i = 1; i <= iv->channels; i++) { - if ((!iv->lastAlarm[i].code) || (iv->lastAlarm[i].code == 1)) { - uint8_t pos = iv->getPosByChFld(i, FLD_PDC, rec); - ac_pow += iv->getValue(pos, rec); + if (iv->type == INV_TYPE_1CH) { + if ((!iv->lastAlarm[0].code) || (iv->lastAlarm[0].code == 1)) + ac_pow += iv->getValue(iv->getPosByChFld(1, FLD_PDC, rec), rec); + } else { + for(uint8_t i = 1; i <= iv->channels; i++) { + if ((!iv->lastAlarm[i].code) || (iv->lastAlarm[i].code == 1)) { + uint8_t pos = iv->getPosByChFld(i, FLD_PDC, rec); + ac_pow += iv->getValue(pos, rec); + } } } ac_pow = (int) (ac_pow*9.5); From 3282f44e3764a2cf01fd182a956b106627009708 Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Thu, 19 Oct 2023 18:22:39 +0200 Subject: [PATCH 19/42] remove to early cmdDone (?) --- src/hm/Communication.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index c7332b32..7c59d5a2 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -465,7 +465,7 @@ const byteAssign_t InfoAssignment[] = { } else { // first data msg for 1ch, 2nd for 2ch miComplete(q->iv); } - cmdDone(q); + //cmdDone(q); } inline void miNextRequest(uint8_t cmd, const queue_s *q) { From 70b2ae6246505baf68f937063d90a046c934204a Mon Sep 17 00:00:00 2001 From: lumapu Date: Fri, 20 Oct 2023 23:10:50 +0200 Subject: [PATCH 20/42] updated to latest changes from @rejoe2 for MI inverters --- src/hm/CommQueue.h | 2 +- src/hm/Communication.h | 315 ++++++++++++++++++++++++++++++++--------- src/hm/hmInverter.h | 7 +- 3 files changed, 252 insertions(+), 72 deletions(-) diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 94cc63bd..56e06bfc 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -30,9 +30,9 @@ class CommQueue { Inverter<> *iv; uint8_t cmd; uint8_t attempts; + uint32_t ts; bool delOnPop; bool isDevControl; - uint32_t ts; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : iv(i), cmd(c), attempts(5), ts(0), delOnPop(d), isDevControl(dev) {} diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 1336e78c..5a5e0b7d 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -10,6 +10,9 @@ #include #include "../utils/crc.h" +#define MI_TIMEOUT 500 +#define DEFAULT_TIMEOUT 500 + typedef std::function *)> payloadListenerType; typedef std::function *)> alarmListenerType; @@ -37,6 +40,8 @@ class Communication : public CommQueue<> { if(!valid) return; // empty + uint16_t timeout = q->iv->ivGen != IV_MI ? DEFAULT_TIMEOUT : MI_TIMEOUT; + switch(mState) { case States::RESET: if(millis() < mWaitTimeout) @@ -57,7 +62,7 @@ class Communication : public CommQueue<> { } else q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); q->iv->radioStatistics.txCnt++; - mWaitTimeout = millis() + 500; + mWaitTimeout = millis() + timeout; setAttempt(); mState = States::WAIT; break; @@ -73,7 +78,7 @@ class Communication : public CommQueue<> { cmdDone(); DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("request timeout: ")); - DBGPRINT(String(millis() - mWaitTimeout + 500)); + DBGPRINT(String(millis() - mWaitTimeout + timeout)); DBGPRINTLN(F("ms")); q->iv->radioStatistics.rxFailNoAnser++; // got nothing @@ -92,7 +97,7 @@ class Communication : public CommQueue<> { DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("RX ")); if(p->millis < 100) - DBGPRINT(F("0")); + DBGPRINT(F(" ")); DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); @@ -119,13 +124,20 @@ class Communication : public CommQueue<> { } else if(IV_MI == q->iv->ivGen) { parseMiFrame(p, q); } - } else + } else { DPRINTLN(DBG_WARN, F("Inverter serial does not match")); + mWaitTimeout = millis() + timeout; + } q->iv->radio->mBufCtrl.pop(); yield(); } - mState = nextState; + if(0 == q->attempts) { + cmdDone(q); + mState = States::RESET; + } else + mState = nextState; + } break; @@ -140,14 +152,15 @@ class Communication : public CommQueue<> { uint8_t i = 0; while(i < MAX_PAYLOAD_ENTRIES) { - if(mLocalBuf[i++].len == 0) + if(mLocalBuf[i].len == 0) break; + i++; } if(q->attempts) { - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + 500; + mWaitTimeout = millis() + timeout; mState = States::WAIT; } else { add(q, true); @@ -169,9 +182,9 @@ class Communication : public CommQueue<> { DBGPRINTLN(F(" attempts left)")); if(q->attempts) { - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + 500; + mWaitTimeout = millis() + timeout; mState = States::WAIT; } else { add(q, true); @@ -243,62 +256,12 @@ class Communication : public CommQueue<> { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 //mPayload[iv->id].txId = p->packet[0]; miDataDecode(p, q); - - } - } - - inline void miDataDecode(packet_t *p, const queue_s *q) { - record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser - //rec->ts = mPayload[iv->id].ts; - //mPayload[iv->id].gotFragment = true; - //mPayload[iv->id].multi_parts += 4; - - uint8_t datachan = ( p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES) || p->packet[0] == (MI_REQ_4CH + ALL_FRAMES) ) ? CH1 : - ( p->packet[0] == (MI_REQ_CH2 + ALL_FRAMES) || p->packet[0] == (0x37 + ALL_FRAMES) ) ? CH2 : - p->packet[0] == (0x38 + ALL_FRAMES) ? CH3 : - CH4; - // count in RF_communication_protocol.xlsx is with offset = -1 - q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_UDC, rec), rec, (float)((p->packet[9] << 8) + p->packet[10])/10); - - q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_IDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); - - q->iv->setValue(q->iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); - - q->iv->setValue(q->iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[15] << 8) + p->packet[16])/100); - q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_PDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10); - - q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_YD, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/1); - - q->iv->setValue(q->iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); - q->iv->setValue(q->iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(q->iv, datachan))); - //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; - - /*if ( datachan < 3 ) { - mPayload[q->iv->id].dataAB[datachan] = true; - } - if ( !mPayload[iv->id].dataAB[CH0] && mPayload[iv->id].dataAB[CH1] && mPayload[iv->id].dataAB[CH2] ) { - mPayload[iv->id].dataAB[CH0] = true; - }*/ - - if (p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) ) { - /*For MI1500: - if (MI1500) { - STAT = (uint8_t)(p->packet[25] ); - FCNT = (uint8_t)(p->packet[26]); - FCODE = (uint8_t)(p->packet[27]); - }*/ - //miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]); - - if (p->packet[0] < (0x39 + ALL_FRAMES) ) { - addImportant(q->iv, (q->cmd + 1)); - //mPayload[iv->id].txCmd++; - //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response - //mPayload[iv->id].complete = false; - } else { - //miComplete(iv); - } - } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && q->iv->type == INV_TYPE_2CH ) { - addImportant(q->iv, MI_REQ_CH2); + } else if (p->packet[0] == (0x0f + ALL_FRAMES)) + miHwDecode(p, q); + else if ((p->packet[0] == 0x88) || (p->packet[0] == 0x92)) { + record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure + rec->ts = q->ts; + miStsConsolidate(q, ((p->packet[0] == 0x88) ? 1 : 2), rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); } } @@ -360,7 +323,7 @@ class Communication : public CommQueue<> { } memcpy(&mPayload[len], mLocalBuf[i].buf, mLocalBuf[i].len); len += mLocalBuf[i].len; - // get worst RSSI + // get worst RSSI (high value is better) if(mLocalBuf[i].rssi > rssi) rssi = mLocalBuf[i].rssi; } @@ -408,6 +371,224 @@ class Communication : public CommQueue<> { } } + private: + inline void miHwDecode(packet_t *p, const queue_s *q) { + record_t<> *rec = q->iv->getRecordStruct(InverterDevInform_All); // choose the record structure + rec->ts = q->ts; + //mPayload[iv->id].gotFragment = true; + + /* + Polling the device software and hardware version number command + start byte Command word routing address target address User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] + 0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f + Command Receipt - First Frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f + Command Receipt - Second Frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f + Command receipt - third frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f + */ + + /* + case InverterDevInform_All: + rec->length = (uint8_t)(HMINFO_LIST_LEN); + rec->assign = (byteAssign_t *)InfoAssignment; + rec->pyldLen = HMINFO_PAYLOAD_LEN; + break; + const byteAssign_t InfoAssignment[] = { + { FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, + { FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, + { FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 }, + { FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 }, + { FLD_BOOTLOADER_VER, UNIT_NONE, CH0, 8, 2, 1 } + }; + */ + } + + inline void miDataDecode(packet_t *p, const queue_s *q) { + record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser + rec->ts = q->ts; + q->iv->radioStatistics.rxSuccess++; + mState = States::RESET; + + uint8_t datachan = ( p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES) || p->packet[0] == (MI_REQ_4CH + ALL_FRAMES) ) ? CH1 : + ( p->packet[0] == (MI_REQ_CH2 + ALL_FRAMES) || p->packet[0] == (0x37 + ALL_FRAMES) ) ? CH2 : + p->packet[0] == (0x38 + ALL_FRAMES) ? CH3 : + CH4; + // count in RF_communication_protocol.xlsx is with offset = -1 + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_UDC, rec), rec, (float)((p->packet[9] << 8) + p->packet[10])/10); + + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_IDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); + + q->iv->setValue(q->iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); + + q->iv->setValue(q->iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[15] << 8) + p->packet[16])/100); + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_PDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10); + + q->iv->setValue(q->iv->getPosByChFld(datachan, FLD_YD, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/1); + + q->iv->setValue(q->iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); + q->iv->setValue(q->iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(q->iv, datachan))); + //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + + if (datachan == 1) //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + q->iv->rssi = p->rssi; + else if(q->iv->rssi > p->rssi) + q->iv->rssi = p->rssi; + + if (p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) ) { + /*For MI1500: + if (MI1500) { + STAT = (uint8_t)(p->packet[25] ); + FCNT = (uint8_t)(p->packet[26]); + FCODE = (uint8_t)(p->packet[27]); + }*/ + miStsConsolidate(q, datachan, rec, p->packet[23], p->packet[24]); + + if (p->packet[0] < (0x39 + ALL_FRAMES) ) { + addImportant(q->iv, (q->cmd + 1)); + //mPayload[iv->id].txCmd++; + //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response + //mPayload[iv->id].complete = false; + miNextRequest((p->packet[0] - ALL_FRAMES + 1), q); + } else { + miComplete(q->iv); + } + } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && (q->iv->type == INV_TYPE_2CH)) { + addImportant(q->iv, MI_REQ_CH2); + miNextRequest(MI_REQ_CH2, q); + } else { // first data msg for 1ch, 2nd for 2ch + miComplete(q->iv); + } + //cmdDone(q); + } + + inline void miNextRequest(uint8_t cmd, const queue_s *q) { + //setAttempt(); + DPRINT_IVID(DBG_WARN, q->iv->id); + DBGPRINT(F("next request (")); + DBGPRINT(String(q->attempts)); + DBGPRINT(F(" attempts left): 0x")); + DBGHEXLN(cmd); + + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, cmd, 0x00, true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + MI_TIMEOUT; + mState = States::WAIT; + } else { + add(q, true); + cmdDone(q); + mState = States::RESET; + } + } + + inline void miStsConsolidate(const queue_s *q, uint8_t stschan, record_t<> *rec, uint8_t uState, uint8_t uEnum, uint8_t lState = 0, uint8_t lEnum = 0) { + //uint8_t status = (p->packet[11] << 8) + p->packet[12]; + uint16_t statusMi = 3; // regular status for MI, change to 1 later? + if ( uState == 2 ) { + statusMi = 5050 + stschan; //first approach, needs review! + if (lState) + statusMi += lState*10; + } else if ( uState > 3 ) { + statusMi = uState*1000 + uEnum*10; + if (lState) + statusMi += lState*100; //needs review, esp. for 4ch-8310 state! + //if (lEnum) + statusMi += lEnum; + if (uEnum < 6) { + statusMi += stschan; + } + if (statusMi == 8000) + statusMi = 8310; //trick? + } + + uint16_t prntsts = statusMi == 3 ? 1 : statusMi; + bool stsok = true; + if ( prntsts != rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)] ) { //sth.'s changed? + q->iv->alarmCnt = 1; // minimum... + //sth is or was wrong? + if ( (q->iv->type != INV_TYPE_1CH) && ( (statusMi != 3) + || ((q->iv->lastAlarm[stschan].code) && (statusMi == 3) && (q->iv->lastAlarm[stschan].code != 1))) + ) { + q->iv->lastAlarm[stschan] = alarm_t(prntsts, q->ts,0); + q->iv->alarmCnt = q->iv->type == INV_TYPE_2CH ? 3 : 5; + } + + q->iv->alarmLastId = prntsts; //iv->alarmMesIndex; + + stsok = false; + if (q->iv->alarmCnt > 1) { //more than one channel + for (uint8_t ch = 0; ch < (q->iv->alarmCnt); ++ch) { //start with 1 + if (q->iv->lastAlarm[ch].code == 1) { + stsok = true; + break; + } + } + } + //if (mSerialDebug) { + DPRINT(DBG_WARN, F("New state on CH")); + DBGPRINT(String(stschan)); DBGPRINT(F(" (")); + DBGPRINT(String(prntsts)); DBGPRINT(F("): ")); + DBGPRINTLN(q->iv->getAlarmStr(prntsts)); + //} + } + + if (!stsok) { + q->iv->setValue(q->iv->getPosByChFld(0, FLD_EVT, rec), rec, prntsts); + q->iv->lastAlarm[0] = alarm_t(prntsts, q->ts, 0); + } + + if (q->iv->alarmMesIndex < rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)]) { + q->iv->alarmMesIndex = rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!? + //if (mSerialDebug) { + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("alarm ID incremented to ")); + DBGPRINTLN(String(q->iv->alarmMesIndex)); + //} + } + } + + + inline void miComplete(Inverter<> *iv) { + //if ( mPayload[iv->id].complete ) + // return; //if we got second message as well in repreated attempt + //mPayload[iv->id].complete = true; + //if (mSerialDebug) { + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINTLN(F("got all data msgs")); + //} + record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); + iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); + + //preliminary AC calculation... + float ac_pow = 0; + if (iv->type == INV_TYPE_1CH) { + if ((!iv->lastAlarm[0].code) || (iv->lastAlarm[0].code == 1)) + ac_pow += iv->getValue(iv->getPosByChFld(1, FLD_PDC, rec), rec); + } else { + for(uint8_t i = 1; i <= iv->channels; i++) { + if ((!iv->lastAlarm[i].code) || (iv->lastAlarm[i].code == 1)) { + uint8_t pos = iv->getPosByChFld(i, FLD_PDC, rec); + ac_pow += iv->getValue(pos, rec); + } + } + } + ac_pow = (int) (ac_pow*9.5); + iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) ac_pow/10); + + iv->doCalculations(); + // update status state-machine, + iv->isProducing(); + } + private: enum class States : uint8_t { RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 618cf5da..4b9add6f 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -201,14 +201,13 @@ class Inverter { cb(devControlCmd, true); mDevControlRequest = false; } else if(0 == getFwVersion()) - cb(MI_REQ_CH1, false); // get firmware version - //cb(InverterDevInform_All, false); // get firmware version + cb(0x0f, false); // get firmware version; for MI, this makes part of polling the device software and hardware version number else { record_t<> *rec = getRecordStruct(InverterDevInform_Simple); if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) - cb(InverterDevInform_All, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 + cb(0x0f, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 else - cb(type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1, false); + cb(((type == INV_TYPE_4CH) ? MI_REQ_4CH : MI_REQ_CH1), false); } } } From 810afaac8b03269c0416b2323fbff6cb55fc623e Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Sun, 22 Oct 2023 09:11:25 +0200 Subject: [PATCH 21/42] various fixes - increase buffer - fix incomplete miHwDecode - shorten timeout for MI --- src/hm/CommQueue.h | 17 +- src/hm/Communication.h | 375 +++++++++++++++++++---------------------- src/hm/hmInverter.h | 10 +- src/hm/hmPayload.h | 6 +- 4 files changed, 195 insertions(+), 213 deletions(-) diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 94cc63bd..ae947504 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -22,6 +22,10 @@ class CommQueue { void add(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop, false); + /*mQueue[mRdPtr].firstTry = false; + if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { + mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); + }*/ inc(&mWrPtr); } @@ -30,9 +34,9 @@ class CommQueue { Inverter<> *iv; uint8_t cmd; uint8_t attempts; + uint32_t ts; bool delOnPop; bool isDevControl; - uint32_t ts; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : iv(i), cmd(c), attempts(5), ts(0), delOnPop(d), isDevControl(dev) {} @@ -48,6 +52,10 @@ class CommQueue { mQueue[mWrPtr] = *q; if(rstAttempts) mQueue[mWrPtr].attempts = 5; + /*mQueue[mRdPtr].firstTry = false; + if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { + mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); + }*/ inc(&mWrPtr); } @@ -67,6 +75,13 @@ class CommQueue { inc(&mRdPtr); } + bool isFirstTry(void) { + if(!mQueue[mRdPtr].firstTry) + return false; + mQueue[mRdPtr].firstTry = false; + return true; + } + void setTs(uint32_t *ts) { mQueue[mRdPtr].ts = *ts; } diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 7c59d5a2..1a23ca07 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -10,8 +10,9 @@ #include #include "../utils/crc.h" -#define MI_TIMEOUT 500 +#define MI_TIMEOUT 250 #define DEFAULT_TIMEOUT 500 +#define MAX_BUFFER 200 //was: 150 (hardcoded) typedef std::function *)> payloadListenerType; typedef std::function *)> alarmListenerType; @@ -40,7 +41,7 @@ class Communication : public CommQueue<> { if(!valid) return; // empty - uint16_t lcl_tmo = q->iv->ivGen != IV_MI ? DEFAULT_TIMEOUT : MI_TIMEOUT; + uint16_t timeout = q->iv->ivGen != IV_MI ? DEFAULT_TIMEOUT : MI_TIMEOUT; switch(mState) { case States::RESET: @@ -59,22 +60,10 @@ class Communication : public CommQueue<> { if(ActivePowerContr == q->cmd) q->iv->powerLimitAck = false; q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); - } - else if (q->iv->ivGen != IV_MI) + } else q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); - else { // IV_MI - //uint8_t cmd = q->iv->type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1; - //q->iv->radio->sendCmdPacket(q->iv, cmd, cmd, false, false); - q->iv->radio->sendCmdPacket(q->iv, q->cmd, q->cmd, false, false); - //if (q->iv->radio->mSerialDebug) { - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F("legacy cmd 0x")); - DBGHEXLN(q->cmd); - //} - //mPayload[q->iv->id]. = cmd; - } q->iv->radioStatistics.txCnt++; - mWaitTimeout = millis() + lcl_tmo; + mWaitTimeout = millis() + timeout; setAttempt(); mState = States::WAIT; break; @@ -90,7 +79,7 @@ class Communication : public CommQueue<> { cmdDone(); DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("request timeout: ")); - DBGPRINT(String(millis() - mWaitTimeout + lcl_tmo)); + DBGPRINT(String(millis() - mWaitTimeout + timeout)); DBGPRINTLN(F("ms")); q->iv->radioStatistics.rxFailNoAnser++; // got nothing @@ -109,16 +98,15 @@ class Communication : public CommQueue<> { DPRINT_IVID(DBG_INFO, q->iv->id); DBGPRINT(F("RX ")); if(p->millis < 100) - DBGPRINT(F("0")); + DBGPRINT(F(" ")); DBGPRINT(String(p->millis)); DBGPRINT(F("ms ")); DBGPRINT(String(p->len)); if((IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen)) { DBGPRINT(F(" CH")); if(3 == p->ch) - DBGPRINT(F("03")); - else - DBGPRINT(String(p->ch)); + DBGPRINT(F("0")); + DBGPRINT(String(p->ch)); } DBGPRINT(F(", ")); DBGPRINT(String(p->rssi)); @@ -137,13 +125,20 @@ class Communication : public CommQueue<> { } else if(IV_MI == q->iv->ivGen) { parseMiFrame(p, q); } - } else + } else { DPRINTLN(DBG_WARN, F("Inverter serial does not match")); + mWaitTimeout = millis() + timeout; + } q->iv->radio->mBufCtrl.pop(); yield(); } - mState = nextState; + if(0 == q->attempts) { + cmdDone(q); + mState = States::RESET; + } else + mState = nextState; + } break; @@ -158,14 +153,15 @@ class Communication : public CommQueue<> { uint8_t i = 0; while(i < MAX_PAYLOAD_ENTRIES) { - if(mLocalBuf[i++].len == 0) + if(mLocalBuf[i].len == 0) break; + i++; } if(q->attempts) { - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + lcl_tmo; + mWaitTimeout = millis() + timeout; mState = States::WAIT; } else { add(q, true); @@ -187,9 +183,9 @@ class Communication : public CommQueue<> { DBGPRINTLN(F(" attempts left)")); if(q->attempts) { - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + lcl_tmo; + mWaitTimeout = millis() + timeout; mState = States::WAIT; } else { add(q, true); @@ -257,65 +253,165 @@ class Communication : public CommQueue<> { || (p->packet[0] == MI_REQ_CH2 + ALL_FRAMES) || ((p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES)) && (p->packet[0] < (0x39 + SINGLE_FRAME)) - && (q->cmd != 0x0f))) { + )) { //&& (p->packet[0] != (0x0f + ALL_FRAMES)))) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 //mPayload[iv->id].txId = p->packet[0]; miDataDecode(p, q); - - } - else if (p->packet[0] == 0x0f + ALL_FRAMES) + } else if (p->packet[0] == (0x0f + ALL_FRAMES)) miHwDecode(p, q); - else if ((p->packet[0] == 0x88) || (p->packet[0] == 0x92)) { record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure rec->ts = q->ts; - miStsConsolidate(q, p->packet[0] == 0x88 ? 1 : 2, rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); + miStsConsolidate(q, ((p->packet[0] == 0x88) ? 1 : 2), rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); } + } + inline void parseDevCtrl(packet_t *p, const queue_s *q) { + if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) + return; + bool accepted = true; + if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) + q->iv->powerLimitAck = true; + else + accepted = false; + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F(" has ")); + if(!accepted) DBGPRINT(F("not ")); + DBGPRINT(F("accepted power limit set point ")); + DBGPRINT(String(q->iv->powerLimit[0])); + DBGPRINT(F(" with PowerLimitControl ")); + DBGPRINTLN(String(q->iv->powerLimit[1])); + q->iv->actPowerLimit = 0xffff; // unknown, readback current value } + inline void compilePayload(const queue_s *q) { + uint16_t crc = 0xffff, crcRcv = 0x0000; + for(uint8_t i = 0; i < mMaxFrameId; i++) { + if(i == (mMaxFrameId - 1)) { + crc = ah::crc16(mLocalBuf[i].buf, mLocalBuf[i].len - 2, crc); + crcRcv = (mLocalBuf[i].buf[mLocalBuf[i].len-2] << 8); + crcRcv |= mLocalBuf[i].buf[mLocalBuf[i].len-1]; + } else + crc = ah::crc16(mLocalBuf[i].buf, mLocalBuf[i].len, crc); + } + + if(crc != crcRcv) { + DPRINT_IVID(DBG_WARN, q->iv->id); + DBGPRINT(F("CRC Error ")); + if(q->attempts == 0) { + DBGPRINTLN(F("-> Fail")); + q->iv->radioStatistics.rxFail++; // got fragments but not complete response + cmdDone(); + } else + DBGPRINTLN(F("-> complete retransmit")); + mState = States::RESET; + return; + } + + /*DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("procPyld: cmd: 0x")); + DBGHEXLN(q->cmd);*/ + + memset(mPayload, 0, MAX_BUFFER); + int8_t rssi = -127; + uint8_t len = 0; + + for(uint8_t i = 0; i < mMaxFrameId; i++) { + if(mLocalBuf[i].len + len > MAX_BUFFER) { + DPRINTLN(DBG_ERROR, F("payload buffer to small!")); + return; + } + memcpy(&mPayload[len], mLocalBuf[i].buf, mLocalBuf[i].len); + len += mLocalBuf[i].len; + // get worst RSSI (high value is better) + if(mLocalBuf[i].rssi > rssi) + rssi = mLocalBuf[i].rssi; + } + + len -= 2; + + DPRINT_IVID(DBG_INFO, q->iv->id); + DBGPRINT(F("Payload (")); + DBGPRINT(String(len)); + DBGPRINT(F("): ")); + ah::dumpBuf(mPayload, len); + + record_t<> *rec = q->iv->getRecordStruct(q->cmd); + if(NULL == rec) { + DPRINTLN(DBG_ERROR, F("record is NULL!")); + return; + } + if((rec->pyldLen != len) && (0 != rec->pyldLen)) { + DPRINT(DBG_ERROR, F("plausibility check failed, expected ")); + DBGPRINT(String(rec->pyldLen)); + DBGPRINTLN(F(" bytes")); + q->iv->radioStatistics.rxFail++; + return; + } + + q->iv->radioStatistics.rxSuccess++; + + rec->ts = q->ts; + for (uint8_t i = 0; i < rec->length; i++) { + q->iv->addValue(i, mPayload, rec); + } + + q->iv->rssi = rssi; + q->iv->doCalculations(); + + if(AlarmData == q->cmd) { + uint8_t i = 0; + while(1) { + if(0 == q->iv->parseAlarmLog(i++, mPayload, len)) + break; + if (NULL != mCbAlarm) + (mCbAlarm)(q->iv); + yield(); + } + } + } + + private: inline void miHwDecode(packet_t *p, const queue_s *q) { record_t<> *rec = q->iv->getRecordStruct(InverterDevInform_All); // choose the record structure rec->ts = q->ts; //mPayload[iv->id].gotFragment = true; uint8_t multi_parts = 0; -/* -Polling the device software and hardware version number command -start byte Command word routing address target address User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] -0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f -Command Receipt - First Frame -start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] -0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f -Command Receipt - Second Frame -start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] -0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f -Command receipt - third frame -start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] -0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f -*/ - -/* -case InverterDevInform_All: - rec->length = (uint8_t)(HMINFO_LIST_LEN); - rec->assign = (byteAssign_t *)InfoAssignment; - rec->pyldLen = HMINFO_PAYLOAD_LEN; - break; - -const byteAssign_t InfoAssignment[] = { -{ FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, -{ FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, -{ FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 }, -{ FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 }, -{ FLD_BOOTLOADER_VER, UNIT_NONE, CH0, 8, 2, 1 } -}; -*/ - + /* + Polling the device software and hardware version number command + start byte Command word routing address target address User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] + 0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f + Command Receipt - First Frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f + Command Receipt - Second Frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f + Command receipt - third frame + start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte + byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] + 0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f + */ + + /* + case InverterDevInform_All: + rec->length = (uint8_t)(HMINFO_LIST_LEN); + rec->assign = (byteAssign_t *)InfoAssignment; + rec->pyldLen = HMINFO_PAYLOAD_LEN; + break; + const byteAssign_t InfoAssignment[] = { + { FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, + { FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, + { FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 }, + { FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 }, + { FLD_BOOTLOADER_VER, UNIT_NONE, CH0, 8, 2, 1 } + }; + */ if ( p->packet[9] == 0x00 ) {//first frame //FLD_FW_VERSION for (uint8_t i = 0; i < 5; i++) { @@ -413,9 +509,6 @@ const byteAssign_t InfoAssignment[] = { q->iv->radioStatistics.rxSuccess++; mState = States::RESET; - //mPayload[iv->id].gotFragment = true; - //mPayload[iv->id].multi_parts += 4; - uint8_t datachan = ( p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES) || p->packet[0] == (MI_REQ_4CH + ALL_FRAMES) ) ? CH1 : ( p->packet[0] == (MI_REQ_CH2 + ALL_FRAMES) || p->packet[0] == (0x37 + ALL_FRAMES) ) ? CH2 : p->packet[0] == (0x38 + ALL_FRAMES) ? CH3 : @@ -434,18 +527,13 @@ const byteAssign_t InfoAssignment[] = { q->iv->setValue(q->iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); q->iv->setValue(q->iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(q->iv, datachan))); + //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; + if (datachan == 1) //mPayload[q->iv->id].rssi[(datachan-1)] = p->rssi; q->iv->rssi = p->rssi; else if(q->iv->rssi > p->rssi) q->iv->rssi = p->rssi; - /*if ( datachan < 3 ) { - mPayload[q->iv->id].dataAB[datachan] = true; - } - if ( !mPayload[iv->id].dataAB[CH0] && mPayload[iv->id].dataAB[CH1] && mPayload[iv->id].dataAB[CH2] ) { - mPayload[iv->id].dataAB[CH0] = true; - }*/ - if (p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) ) { /*For MI1500: if (MI1500) { @@ -453,14 +541,19 @@ const byteAssign_t InfoAssignment[] = { FCNT = (uint8_t)(p->packet[26]); FCODE = (uint8_t)(p->packet[27]); }*/ - miStsConsolidate(q, datachan, rec, p->packet[23], p->packet[24]); + miStsConsolidate(q, datachan, rec, p->packet[23], p->packet[24]); if (p->packet[0] < (0x39 + ALL_FRAMES) ) { + addImportant(q->iv, (q->cmd + 1)); + //mPayload[iv->id].txCmd++; + //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response + //mPayload[iv->id].complete = false; miNextRequest((p->packet[0] - ALL_FRAMES + 1), q); } else { miComplete(q->iv); } - } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && q->iv->type == INV_TYPE_2CH ) { + } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && (q->iv->type == INV_TYPE_2CH)) { + addImportant(q->iv, MI_REQ_CH2); miNextRequest(MI_REQ_CH2, q); } else { // first data msg for 1ch, 2nd for 2ch miComplete(q->iv); @@ -488,17 +581,6 @@ const byteAssign_t InfoAssignment[] = { } } -/* inline void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t stschan = CH1) { - record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure - rec->ts = mPayload[iv->id].ts; - mPayload[iv->id].gotFragment = true; - mPayload[iv->id].multi_parts += 3; - mPayload[iv->id].txId = p->packet[0]; - miStsConsolidate(iv, stschan, rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); - mPayload[iv->id].stsAB[stschan] = true; - if (mPayload[iv->id].stsAB[CH1] && mPayload[iv->id].stsAB[CH2]) - */ - inline void miStsConsolidate(const queue_s *q, uint8_t stschan, record_t<> *rec, uint8_t uState, uint8_t uEnum, uint8_t lState = 0, uint8_t lEnum = 0) { //uint8_t status = (p->packet[11] << 8) + p->packet[12]; uint16_t statusMi = 3; // regular status for MI, change to 1 later? @@ -598,113 +680,6 @@ const byteAssign_t InfoAssignment[] = { iv->isProducing(); } - - inline void parseDevCtrl(packet_t *p, const queue_s *q) { - if((p->packet[12] != ActivePowerContr) || (p->packet[13] != 0x00)) - return; - bool accepted = true; - if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) - q->iv->powerLimitAck = true; - else - accepted = false; - - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F("has ")); - if(!accepted) DBGPRINT(F("not ")); - DBGPRINT(F("accepted power limit set point ")); - DBGPRINT(String(q->iv->powerLimit[0])); - DBGPRINT(F(" with PowerLimitControl ")); - DBGPRINTLN(String(q->iv->powerLimit[1])); - q->iv->actPowerLimit = 0xffff; // unknown, readback current value - } - - inline void compilePayload(const queue_s *q) { - uint16_t crc = 0xffff, crcRcv = 0x0000; - for(uint8_t i = 0; i < mMaxFrameId; i++) { - if(i == (mMaxFrameId - 1)) { - crc = ah::crc16(mLocalBuf[i].buf, mLocalBuf[i].len - 2, crc); - crcRcv = (mLocalBuf[i].buf[mLocalBuf[i].len-2] << 8); - crcRcv |= mLocalBuf[i].buf[mLocalBuf[i].len-1]; - } else - crc = ah::crc16(mLocalBuf[i].buf, mLocalBuf[i].len, crc); - } - - if(crc != crcRcv) { - DPRINT_IVID(DBG_WARN, q->iv->id); - DBGPRINT(F("CRC Error ")); - if(q->attempts == 0) { - DBGPRINTLN(F("-> Fail")); - q->iv->radioStatistics.rxFail++; // got fragments but not complete response - cmdDone(); - } else - DBGPRINTLN(F("-> complete retransmit")); - mState = States::RESET; - return; - } - - /*DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F("procPyld: cmd: 0x")); - DBGHEXLN(q->cmd);*/ - - memset(mPayload, 0, 150); - int8_t rssi = -127; - uint8_t len = 0; - - for(uint8_t i = 0; i < mMaxFrameId; i++) { - if(mLocalBuf[i].len + len > 150) { - DPRINTLN(DBG_ERROR, F("payload buffer to small!")); - return; - } - memcpy(&mPayload[len], mLocalBuf[i].buf, mLocalBuf[i].len); - len += mLocalBuf[i].len; - // get best RSSI - if(mLocalBuf[i].rssi > rssi) - rssi = mLocalBuf[i].rssi; - } - - len -= 2; - - DPRINT_IVID(DBG_INFO, q->iv->id); - DBGPRINT(F("Payload (")); - DBGPRINT(String(len)); - DBGPRINT(F("): ")); - ah::dumpBuf(mPayload, len); - - record_t<> *rec = q->iv->getRecordStruct(q->cmd); - if(NULL == rec) { - DPRINTLN(DBG_ERROR, F("record is NULL!")); - return; - } - if((rec->pyldLen != len) && (0 != rec->pyldLen)) { - DPRINT(DBG_ERROR, F("plausibility check failed, expected ")); - DBGPRINT(String(rec->pyldLen)); - DBGPRINTLN(F(" bytes")); - q->iv->radioStatistics.rxFail++; - return; - } - - q->iv->radioStatistics.rxSuccess++; - - rec->ts = q->ts; - for (uint8_t i = 0; i < rec->length; i++) { - q->iv->addValue(i, mPayload, rec); - } - - q->iv->rssi = rssi; - q->iv->doCalculations(); - - if(AlarmData == q->cmd) { - uint8_t i = 0; - while(1) { - if(0 == q->iv->parseAlarmLog(i++, mPayload, len)) - break; - if (NULL != mCbAlarm) - (mCbAlarm)(q->iv); - yield(); - } - } - } - private: enum class States : uint8_t { RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE @@ -722,7 +697,7 @@ const byteAssign_t InfoAssignment[] = { uint32_t mWaitTimeout = 0; std::array mLocalBuf; uint8_t mMaxFrameId; - uint8_t mPayload[150]; + uint8_t mPayload[MAX_BUFFER]; payloadListenerType mCbPayload = NULL; alarmListenerType mCbAlarm = NULL; }; diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index bbf9167a..4b9add6f 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -197,14 +197,6 @@ class Inverter { else cb(RealTimeRunData_Debug, false); // get live data } else { - /*if (cmd == 0x01) { //0x1 for HM-types - cmd2 = 0x00; - cmd = 0x0f; // for MI, these seem to make part of polling the device software and hardware version number command - } - if (cmd == SystemConfigPara ) { // 0x05 for HM-types - cmd2 = 0x00; - cmd = 0x10; // legacy GPF request - */ if(mDevControlRequest) { cb(devControlCmd, true); mDevControlRequest = false; @@ -215,7 +207,7 @@ class Inverter { if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) cb(0x0f, false); // hard- and firmware version for missing HW part nr, delivered by frame 1 else - cb(type == INV_TYPE_4CH ? MI_REQ_4CH : MI_REQ_CH1, false); + cb(((type == INV_TYPE_4CH) ? MI_REQ_4CH : MI_REQ_CH1), false); } } } diff --git a/src/hm/hmPayload.h b/src/hm/hmPayload.h index 13f4edd5..1f4ef550 100644 --- a/src/hm/hmPayload.h +++ b/src/hm/hmPayload.h @@ -330,15 +330,15 @@ class HmPayload { mPayload[iv->id].requested = false; mPayload[iv->id].rxTmo = false; - uint8_t payload[150]; + uint8_t payload[MAX_BUFFER]; uint8_t payloadLen = 0; - memset(payload, 0, 150); + memset(payload, 0, MAX_BUFFER); int8_t rssi = -127; for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { - if((mPayload[iv->id].len[i] + payloadLen) > 150) { + if((mPayload[iv->id].len[i] + payloadLen) > MAX_BUFFER) { DPRINTLN(DBG_ERROR, F("payload buffer to small!")); break; } From 46b37cadde88cbc62add022cfcc8e4ff15bc0dbe Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Sun, 22 Oct 2023 10:27:01 +0200 Subject: [PATCH 22/42] review MI next cmd queuing - still sends out to much messages and shows some strange behaviour --- src/hm/CommQueue.h | 14 ++++++++++++++ src/hm/Communication.h | 8 +++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index ae947504..1acda1a1 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -29,6 +29,10 @@ class CommQueue { inc(&mWrPtr); } + void chgCmd(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { + mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop, false); + } + protected: struct queue_s { Inverter<> *iv; @@ -37,6 +41,7 @@ class CommQueue { uint32_t ts; bool delOnPop; bool isDevControl; + bool firstTry; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : iv(i), cmd(c), attempts(5), ts(0), delOnPop(d), isDevControl(dev) {} @@ -45,6 +50,10 @@ class CommQueue { protected: void add(queue_s q) { mQueue[mWrPtr] = q; + /*mQueue[mRdPtr].firstTry = false; + if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { + mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); + }*/ inc(&mWrPtr); } @@ -59,6 +68,11 @@ class CommQueue { inc(&mWrPtr); } + void chgCmd(uint8_t cmd) { + mQueue[mRdPtr].cmd = cmd; + mQueue[mRdPtr].isDevControl = false; + } + void get(std::function cb) { if(mRdPtr == mWrPtr) { cb(false, &mQueue[mRdPtr]); // empty diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 1a23ca07..aaf52a64 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -541,10 +541,10 @@ class Communication : public CommQueue<> { FCNT = (uint8_t)(p->packet[26]); FCODE = (uint8_t)(p->packet[27]); }*/ - miStsConsolidate(q, datachan, rec, p->packet[23], p->packet[24]); + miStsConsolidate(q, datachan, rec, p->packet[23], p->packet[24]); if (p->packet[0] < (0x39 + ALL_FRAMES) ) { - addImportant(q->iv, (q->cmd + 1)); + //addImportant(q->iv, (q->cmd + 1)); //mPayload[iv->id].txCmd++; //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response //mPayload[iv->id].complete = false; @@ -553,7 +553,7 @@ class Communication : public CommQueue<> { miComplete(q->iv); } } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && (q->iv->type == INV_TYPE_2CH)) { - addImportant(q->iv, MI_REQ_CH2); + //addImportant(q->iv, MI_REQ_CH2); miNextRequest(MI_REQ_CH2, q); } else { // first data msg for 1ch, 2nd for 2ch miComplete(q->iv); @@ -573,6 +573,8 @@ class Communication : public CommQueue<> { q->iv->radio->sendCmdPacket(q->iv, cmd, 0x00, true); q->iv->radioStatistics.retransmits++; mWaitTimeout = millis() + MI_TIMEOUT; + //chgCmd(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) + chgCmd(cmd); mState = States::WAIT; } else { add(q, true); From 06a1159d4fc7375c4907793f1738a0b417a2871a Mon Sep 17 00:00:00 2001 From: rejoe2 Date: Sun, 22 Oct 2023 17:45:05 +0200 Subject: [PATCH 23/42] various changes might not all be correct... --- src/hm/Communication.h | 35 +++++++++++++++++++++++------------ src/hm/hmInverter.h | 16 +++++++--------- src/hm/radio.h | 5 ++--- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index aaf52a64..056b9b47 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -12,7 +12,8 @@ #define MI_TIMEOUT 250 #define DEFAULT_TIMEOUT 500 -#define MAX_BUFFER 200 //was: 150 (hardcoded) +#define SINGLEFR_TIMEOUT 60 +#define MAX_BUFFER 250 //was: 150 (hardcoded) typedef std::function *)> payloadListenerType; typedef std::function *)> alarmListenerType; @@ -134,7 +135,8 @@ class Communication : public CommQueue<> { yield(); } if(0 == q->attempts) { - cmdDone(q); + //cmdDone(q); + cmdDone(true); mState = States::RESET; } else mState = nextState; @@ -161,11 +163,12 @@ class Communication : public CommQueue<> { if(q->attempts) { q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + timeout; + mWaitTimeout = millis() + SINGLEFR_TIMEOUT; // timeout mState = States::WAIT; } else { add(q, true); - cmdDone(q); + //cmdDone(q); + cmdDone(true); mState = States::RESET; } return; @@ -185,11 +188,12 @@ class Communication : public CommQueue<> { if(q->attempts) { q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + timeout; + mWaitTimeout = millis() + SINGLEFR_TIMEOUT; // timeout; mState = States::WAIT; } else { add(q, true); - cmdDone(q); + //cmdDone(q); + cmdDone(true); mState = States::RESET; } return; @@ -486,7 +490,7 @@ class Communication : public CommQueue<> { multi_parts++; } if(multi_parts > 5) { - cmdDone(q); + cmdDone(true); mState = States::RESET; q->iv->radioStatistics.rxSuccess++; } @@ -558,7 +562,6 @@ class Communication : public CommQueue<> { } else { // first data msg for 1ch, 2nd for 2ch miComplete(q->iv); } - //cmdDone(q); } inline void miNextRequest(uint8_t cmd, const queue_s *q) { @@ -578,7 +581,7 @@ class Communication : public CommQueue<> { mState = States::WAIT; } else { add(q, true); - cmdDone(q); + cmdDone(); mState = States::RESET; } } @@ -607,17 +610,23 @@ class Communication : public CommQueue<> { bool stsok = true; if ( prntsts != rec->record[q->iv->getPosByChFld(0, FLD_EVT, rec)] ) { //sth.'s changed? q->iv->alarmCnt = 1; // minimum... + stsok = false; //sth is or was wrong? if ( (q->iv->type != INV_TYPE_1CH) && ( (statusMi != 3) || ((q->iv->lastAlarm[stschan].code) && (statusMi == 3) && (q->iv->lastAlarm[stschan].code != 1))) ) { + q->iv->lastAlarm[stschan+q->iv->type==INV_TYPE_2CH ? 2: 4] = alarm_t(q->iv->lastAlarm[stschan].code, q->iv->lastAlarm[stschan].start,q->ts); q->iv->lastAlarm[stschan] = alarm_t(prntsts, q->ts,0); q->iv->alarmCnt = q->iv->type == INV_TYPE_2CH ? 3 : 5; - } + } else if ( (q->iv->type == INV_TYPE_1CH) && ( (statusMi != 3) + || ((q->iv->lastAlarm[stschan].code) && (statusMi == 3) && (q->iv->lastAlarm[stschan].code != 1))) + ) { + q->iv->lastAlarm[stschan] = alarm_t(q->iv->lastAlarm[0].code, q->iv->lastAlarm[0].start,q->ts); + } else if (q->iv->type == INV_TYPE_1CH) + stsok = true; q->iv->alarmLastId = prntsts; //iv->alarmMesIndex; - stsok = false; if (q->iv->alarmCnt > 1) { //more than one channel for (uint8_t ch = 0; ch < (q->iv->alarmCnt); ++ch) { //start with 1 if (q->iv->lastAlarm[ch].code == 1) { @@ -679,7 +688,9 @@ class Communication : public CommQueue<> { iv->doCalculations(); // update status state-machine, - iv->isProducing(); + if (ac_pow) + iv->isProducing(); + cmdDone(true); } private: diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 4b9add6f..0bac7e4c 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -182,11 +182,12 @@ class Inverter { } void tickSend(std::function cb) { - if (IV_MI != ivGen) { - if(mDevControlRequest) { - cb(devControlCmd, true); - mDevControlRequest = false; - } else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) + if(mDevControlRequest) { + cb(devControlCmd, true); + mDevControlRequest = false; + } + else if (IV_MI != ivGen) { + if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) cb(AlarmData, false); // get last alarms else if(0 == getFwVersion()) cb(InverterDevInform_All, false); // get firmware version @@ -197,10 +198,7 @@ class Inverter { else cb(RealTimeRunData_Debug, false); // get live data } else { - if(mDevControlRequest) { - cb(devControlCmd, true); - mDevControlRequest = false; - } else if(0 == getFwVersion()) + if(0 == getFwVersion()) cb(0x0f, false); // get firmware version; for MI, this makes part of polling the device software and hardware version number else { record_t<> *rec = getRecordStruct(InverterDevInform_Simple); diff --git a/src/hm/radio.h b/src/hm/radio.h index 75db5436..79239022 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -44,9 +44,8 @@ class Radio { void prepareDevInformCmd(Inverter<> *iv, uint8_t cmd, uint32_t ts, uint16_t alarmMesId, bool isRetransmit, uint8_t reqfld=TX_REQ_INFO) { // might not be necessary to add additional arg. if(IV_MI == getIvGen(iv)) { - DPRINT_IVID(DBG_INFO, getIvId(iv)); - DBGPRINT(F("legacy cmd 0x")); - DBGHEXLN(cmd); + DPRINT(DBG_DEBUG, F("legacy cmd 0x")); + DPRINTLN(DBG_DEBUG,String(cmd, HEX)); sendCmdPacket(iv, cmd, cmd, false, false); return; } From 7a97124bf7bdb4e931a5c71ce27379127936b26e Mon Sep 17 00:00:00 2001 From: lumapu Date: Mon, 23 Oct 2023 22:23:21 +0200 Subject: [PATCH 24/42] small corrections after merging #1219 --- src/hm/CommQueue.h | 6 +- src/hm/Communication.h | 2 +- src/hm/hmInverter.h | 3 +- src/web/html/h/about_html.h | 82 --- src/web/html/h/api_js.h | 216 ------ src/web/html/h/colorBright_css.h | 22 - src/web/html/h/colorDark_css.h | 21 - src/web/html/h/favicon_ico.h | 101 --- src/web/html/h/index_html.h | 191 ----- src/web/html/h/login_html.h | 47 -- src/web/html/h/save_html.h | 86 --- src/web/html/h/serial_html.h | 113 --- src/web/html/h/setup_html.h | 545 --------------- src/web/html/h/style_css.h | 188 ----- src/web/html/h/system_html.h | 139 ---- src/web/html/h/update_html.h | 74 -- src/web/html/h/visualization_html.h | 275 -------- src/web/html/tmp/about.html | 100 --- src/web/html/tmp/index.html | 263 ------- src/web/html/tmp/login.html | 43 -- src/web/html/tmp/save.html | 102 --- src/web/html/tmp/serial.html | 132 ---- src/web/html/tmp/setup.html | 1000 --------------------------- src/web/html/tmp/style.css | 781 --------------------- src/web/html/tmp/system.html | 188 ----- src/web/html/tmp/update.html | 80 --- src/web/html/tmp/visualization.html | 479 ------------- 27 files changed, 5 insertions(+), 5274 deletions(-) delete mode 100644 src/web/html/h/about_html.h delete mode 100644 src/web/html/h/api_js.h delete mode 100644 src/web/html/h/colorBright_css.h delete mode 100644 src/web/html/h/colorDark_css.h delete mode 100644 src/web/html/h/favicon_ico.h delete mode 100644 src/web/html/h/index_html.h delete mode 100644 src/web/html/h/login_html.h delete mode 100644 src/web/html/h/save_html.h delete mode 100644 src/web/html/h/serial_html.h delete mode 100644 src/web/html/h/setup_html.h delete mode 100644 src/web/html/h/style_css.h delete mode 100644 src/web/html/h/system_html.h delete mode 100644 src/web/html/h/update_html.h delete mode 100644 src/web/html/h/visualization_html.h delete mode 100644 src/web/html/tmp/about.html delete mode 100644 src/web/html/tmp/index.html delete mode 100644 src/web/html/tmp/login.html delete mode 100644 src/web/html/tmp/save.html delete mode 100644 src/web/html/tmp/serial.html delete mode 100644 src/web/html/tmp/setup.html delete mode 100644 src/web/html/tmp/style.css delete mode 100644 src/web/html/tmp/system.html delete mode 100644 src/web/html/tmp/update.html delete mode 100644 src/web/html/tmp/visualization.html diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 1acda1a1..4042935d 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -41,7 +41,7 @@ class CommQueue { uint32_t ts; bool delOnPop; bool isDevControl; - bool firstTry; + //bool firstTry; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : iv(i), cmd(c), attempts(5), ts(0), delOnPop(d), isDevControl(dev) {} @@ -89,12 +89,12 @@ class CommQueue { inc(&mRdPtr); } - bool isFirstTry(void) { + /*bool isFirstTry(void) { if(!mQueue[mRdPtr].firstTry) return false; mQueue[mRdPtr].firstTry = false; return true; - } + }*/ void setTs(uint32_t *ts) { mQueue[mRdPtr].ts = *ts; diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 8dc816e7..8a7a9e7a 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -13,7 +13,7 @@ #define MI_TIMEOUT 250 #define DEFAULT_TIMEOUT 500 #define SINGLEFR_TIMEOUT 60 -#define MAX_BUFFER 250 //was: 150 (hardcoded) +#define MAX_BUFFER 250 typedef std::function *)> payloadListenerType; typedef std::function *)> alarmListenerType; diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 0bac7e4c..d1a1e43a 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -185,8 +185,7 @@ class Inverter { if(mDevControlRequest) { cb(devControlCmd, true); mDevControlRequest = false; - } - else if (IV_MI != ivGen) { + } else if (IV_MI != ivGen) { if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) cb(AlarmData, false); // get last alarms else if(0 == getFwVersion()) diff --git a/src/web/html/h/about_html.h b/src/web/html/h/about_html.h deleted file mode 100644 index 1e486394..00000000 --- a/src/web/html/h/about_html.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __ABOUT_HTML_H__ -#define __ABOUT_HTML_H__ -#define about_html_len 1227 -const uint8_t about_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xc5, 0x58, 0x6d, 0x6f, 0xdb, 0x36, -0x10, 0xfe, 0xbe, 0x5f, 0xc1, 0xea, 0xc3, 0x90, 0x00, 0x91, 0xe9, 0x38, 0x49, 0x93, 0xba, 0xb6, -0x37, 0xd7, 0x49, 0xb3, 0x0c, 0x6d, 0x11, 0xc4, 0x09, 0x8a, 0x62, 0x18, 0x0a, 0x8a, 0xa2, 0x24, -0x26, 0x14, 0xa9, 0x92, 0x94, 0x63, 0x77, 0xe8, 0x7f, 0x1f, 0x29, 0xf9, 0x45, 0xaf, 0x4e, 0xba, -0xba, 0x58, 0x3e, 0x44, 0xd6, 0xf1, 0x5e, 0x9e, 0x3b, 0xde, 0x9d, 0x8e, 0x1c, 0xbc, 0xf0, 0x05, -0xd6, 0x8b, 0x84, 0x80, 0x48, 0xc7, 0x6c, 0xf4, 0xcb, 0x20, 0x7f, 0x00, 0xf3, 0x37, 0x88, 0x08, -0xf2, 0xf3, 0x9f, 0xd9, 0xab, 0xa6, 0x9a, 0x91, 0xd1, 0xd8, 0x13, 0xa9, 0x1e, 0xc0, 0xfc, 0x65, -0xb3, 0xc8, 0x28, 0x7f, 0x00, 0x92, 0xb0, 0xa1, 0xa3, 0xf4, 0x82, 0x11, 0x15, 0x11, 0xa2, 0x1d, -0x60, 0x15, 0x0f, 0x1d, 0x4d, 0xe6, 0x1a, 0x62, 0xa5, 0x1c, 0x10, 0x49, 0x12, 0x2c, 0x39, 0x3a, -0x86, 0xf0, 0xdb, 0x6c, 0xd8, 0xed, 0x9c, 0x75, 0xba, 0xdd, 0xee, 0xa1, 0x03, 0x8d, 0xed, 0x98, -0x68, 0x04, 0x38, 0x8a, 0x8d, 0xcc, 0x8c, 0x92, 0xc7, 0x44, 0x48, 0xa3, 0x03, 0x0b, 0xae, 0x09, -0xd7, 0x43, 0xe7, 0x91, 0xfa, 0x3a, 0x1a, 0xfa, 0x64, 0x46, 0x31, 0x71, 0xb3, 0x97, 0x03, 0x40, -0x39, 0xd5, 0x14, 0x31, 0x57, 0x61, 0xc4, 0xc8, 0xf0, 0xd0, 0x59, 0x29, 0xc1, 0x11, 0x92, 0x8a, -0x18, 0xa1, 0xbb, 0xdb, 0xb7, 0xee, 0x99, 0x25, 0x2b, 0x2c, 0x69, 0xa2, 0x8b, 0x88, 0xee, 0xd1, -0x0c, 0xe5, 0x54, 0x07, 0x28, 0x89, 0x87, 0x0e, 0x4a, 0x68, 0xe7, 0xbe, 0x04, 0x6a, 0x34, 0x80, -0x39, 0x87, 0x51, 0xf0, 0x3d, 0x1e, 0x62, 0xc1, 0x84, 0x54, 0x4f, 0xb8, 0x28, 0x85, 0x27, 0xb4, -0x2a, 0x38, 0xc8, 0x05, 0xe5, 0x3e, 0x99, 0x1f, 0x00, 0x2e, 0x02, 0xc1, 0x98, 0x78, 0x74, 0x00, -0x5c, 0x6e, 0x05, 0xdc, 0xec, 0xc5, 0xc0, 0x13, 0xfe, 0xa2, 0x10, 0x79, 0x9f, 0xce, 0x00, 0x66, -0x48, 0x29, 0x03, 0x43, 0x24, 0x1c, 0xcd, 0x9c, 0x25, 0x1f, 0x5a, 0x82, 0x81, 0x45, 0x0c, 0x6b, -0x56, 0xbb, 0x7f, 0xce, 0x68, 0x1c, 0x89, 0xc5, 0xf9, 0xed, 0xdd, 0x00, 0xa2, 0x8a, 0xd0, 0x26, -0x38, 0xfd, 0x99, 0xa0, 0xfe, 0x5e, 0x77, 0xff, 0xf5, 0x5a, 0x96, 0x1a, 0xc4, 0x0e, 0x10, 0x1c, -0x33, 0x8a, 0x1f, 0x56, 0x56, 0xf7, 0xf6, 0x9d, 0x02, 0x28, 0x95, 0x20, 0x6e, 0x83, 0x67, 0x1f, -0xdf, 0x4d, 0xdd, 0xa0, 0xb1, 0xbe, 0x51, 0x7f, 0xed, 0xd8, 0x0a, 0x40, 0x2c, 0x3c, 0x6a, 0xd1, -0x6f, 0x74, 0xa0, 0x8c, 0xcd, 0xf0, 0x1c, 0xad, 0x99, 0x22, 0xea, 0x93, 0xd5, 0x7e, 0x40, 0x46, -0x67, 0xa4, 0xb4, 0xb1, 0xef, 0x0c, 0x61, 0x6d, 0xa7, 0xac, 0xe2, 0xb8, 0x59, 0x85, 0x22, 0xd2, -0x64, 0x5a, 0x49, 0xc9, 0x47, 0xe2, 0xe5, 0xd4, 0x16, 0x4d, 0x27, 0x6d, 0x9a, 0x74, 0x9a, 0x94, -0x14, 0x4d, 0x89, 0xd6, 0x94, 0x87, 0xaa, 0xac, 0xc7, 0x46, 0x64, 0xa5, 0x40, 0x91, 0x84, 0x48, -0xa4, 0x85, 0x74, 0xea, 0x01, 0x5c, 0xdb, 0x7b, 0xd9, 0x6c, 0x2f, 0x4d, 0x7c, 0xa4, 0xcb, 0xee, -0xdf, 0x65, 0xa4, 0x16, 0xd8, 0xa7, 0x2d, 0xb0, 0x17, 0x4a, 0x93, 0xb8, 0x8c, 0x3b, 0x23, 0xfd, -0x20, 0xea, 0xb3, 0xb5, 0x05, 0x53, 0x80, 0xa6, 0xa2, 0x90, 0x0c, 0x6d, 0xe5, 0x7e, 0xf6, 0x18, -0xe2, 0x0f, 0xce, 0xe8, 0xe6, 0x62, 0x7a, 0x0b, 0xc6, 0xd7, 0x57, 0x2d, 0x60, 0x5f, 0xad, 0xa4, -0x23, 0xad, 0x13, 0xd5, 0x87, 0x10, 0x99, 0x94, 0xf6, 0x75, 0xda, 0xb1, 0xc8, 0xab, 0xba, 0xce, -0x05, 0x4e, 0x63, 0x53, 0x6b, 0x48, 0x53, 0xc1, 0x5b, 0x14, 0x1e, 0x76, 0x37, 0x78, 0x6c, 0xaf, -0x2b, 0x39, 0xbc, 0xec, 0x7e, 0x3f, 0xe4, 0x6f, 0xb7, 0x25, 0x45, 0x45, 0x48, 0xb9, 0x49, 0x4c, -0xfb, 0x68, 0x83, 0xd6, 0x2a, 0x69, 0x50, 0x65, 0xa2, 0x45, 0x74, 0x03, 0x68, 0xca, 0xa7, 0x52, -0x48, 0x8f, 0x34, 0xa0, 0x79, 0xf9, 0xae, 0x6a, 0x99, 0x07, 0xc2, 0x82, 0xcd, 0x58, 0x0b, 0x12, -0x65, 0x29, 0x89, 0x12, 0xe3, 0x58, 0xa1, 0xe0, 0x4a, 0xcb, 0xcb, 0x06, 0x56, 0x59, 0xae, 0x36, -0xa7, 0x78, 0xe1, 0x1e, 0x19, 0x4b, 0x51, 0x2f, 0x0f, 0x22, 0x58, 0xb7, 0x1e, 0x43, 0xa9, 0x18, -0x6e, 0x17, 0xaf, 0xb1, 0x54, 0xd9, 0xa4, 0x78, 0x04, 0x96, 0x15, 0xd8, 0x86, 0xd9, 0xc2, 0x5f, -0x95, 0x49, 0xdc, 0x9e, 0xa9, 0x08, 0x45, 0x7c, 0xf0, 0x8e, 0x7a, 0x12, 0x49, 0x4a, 0x54, 0x0b, -0xa0, 0x4a, 0x58, 0x9f, 0x00, 0x62, 0xbc, 0x45, 0x95, 0xe4, 0x0c, 0xa9, 0x8e, 0x52, 0xaf, 0x83, -0x45, 0x0c, 0x3d, 0x22, 0x75, 0x4c, 0x18, 0x55, 0x90, 0xa8, 0xe4, 0xfd, 0x17, 0xad, 0x27, 0x8c, -0xda, 0x28, 0xd6, 0x92, 0xb6, 0x85, 0xd1, 0xee, 0xf3, 0xae, 0xb0, 0x2c, 0x52, 0x4f, 0xcc, 0x5d, -0x2e, 0x7c, 0xe2, 0x0a, 0x19, 0xc2, 0x8b, 0xe9, 0xf5, 0x58, 0x2d, 0x38, 0x36, 0xfd, 0x6d, 0x4a, -0xe4, 0xcc, 0xec, 0x7c, 0x0d, 0xd4, 0x53, 0x12, 0xbb, 0x44, 0xe7, 0x59, 0x9b, 0x38, 0x12, 0x1c, -0x8e, 0xa5, 0x9f, 0x52, 0x2e, 0xfe, 0x54, 0x36, 0x83, 0x6b, 0x71, 0x6a, 0x62, 0xdb, 0x25, 0x0e, -0x2e, 0x83, 0xde, 0x31, 0xbc, 0x79, 0xdb, 0x3b, 0xae, 0x1b, 0xdf, 0xac, 0xed, 0xd2, 0x62, 0x82, -0x52, 0xa6, 0xb4, 0x08, 0x02, 0x49, 0x42, 0xc2, 0xe1, 0x2d, 0x8d, 0x1b, 0x9a, 0x5a, 0x03, 0xd3, -0x2e, 0x31, 0x08, 0x46, 0x1f, 0x24, 0x4a, 0x15, 0xbc, 0x3b, 0x0b, 0x7b, 0x75, 0xeb, 0xa5, 0xe5, -0x5d, 0xda, 0xfd, 0x6a, 0x3e, 0x88, 0xe1, 0x7d, 0x0c, 0x2f, 0xe7, 0x17, 0xd7, 0xe7, 0x0d, 0x86, -0xcb, 0xeb, 0x05, 0xcb, 0x3f, 0xaf, 0x47, 0x4c, 0x4c, 0xa3, 0x43, 0x58, 0x83, 0x2b, 0xd3, 0x34, -0x65, 0xbc, 0xfc, 0x88, 0xec, 0xa4, 0x51, 0x3c, 0x0b, 0x83, 0x99, 0x2a, 0xdd, 0x13, 0x60, 0xff, -0xab, 0xd8, 0x36, 0xc3, 0xcb, 0x2c, 0x58, 0xe0, 0x86, 0x24, 0x42, 0x51, 0xf3, 0xd1, 0x59, 0x6c, -0xb1, 0xd8, 0xa4, 0xeb, 0x74, 0xa5, 0xeb, 0xd5, 0xf6, 0x9d, 0x60, 0x69, 0x8c, 0x92, 0x34, 0xfb, -0xb0, 0x3a, 0xa3, 0xed, 0xeb, 0x4f, 0x25, 0xc0, 0xcf, 0x0e, 0xc9, 0x39, 0x55, 0x58, 0x48, 0x1f, -0x4c, 0x22, 0xa4, 0x77, 0x19, 0x0d, 0x3f, 0xd7, 0xdb, 0x09, 0x43, 0xf8, 0xf1, 0x6b, 0x34, 0xbf, -0xf8, 0xf4, 0xb2, 0x17, 0xbf, 0x69, 0x98, 0x2f, 0x72, 0xb6, 0xff, 0x3b, 0x0a, 0x17, 0xee, 0x7b, -0x44, 0xd9, 0x2e, 0xfc, 0x8f, 0x8d, 0x1e, 0x2d, 0xfa, 0x38, 0x4f, 0xfc, 0xdf, 0x0b, 0xb3, 0xd5, -0xa8, 0x4e, 0xfb, 0x6f, 0x6e, 0x37, 0x90, 0xab, 0x73, 0x48, 0xcb, 0x58, 0x12, 0x08, 0xa1, 0x4b, -0x53, 0x49, 0xd1, 0x25, 0x46, 0x02, 0x5d, 0x3e, 0x21, 0x3c, 0x7f, 0x4c, 0x5c, 0x8e, 0x26, 0xe0, -0x57, 0x2c, 0x92, 0x05, 0xe8, 0x75, 0x7b, 0x47, 0xe5, 0x81, 0x2c, 0x65, 0x15, 0xbc, 0x8c, 0xee, -0x26, 0x65, 0x8c, 0x9e, 0xa7, 0x15, 0xb7, 0x54, 0x66, 0x4d, 0x73, 0xde, 0x1e, 0xea, 0x8a, 0x07, -0x70, 0x85, 0xbf, 0x3a, 0x21, 0xae, 0x12, 0x8f, 0x86, 0x51, 0x29, 0x76, 0x2d, 0xfe, 0x56, 0x0c, -0x3e, 0x0b, 0x26, 0x34, 0xef, 0x31, 0xd5, 0x0a, 0x7a, 0xc1, 0xe9, 0x69, 0xef, 0xf4, 0xc4, 0xc0, -0xbc, 0xba, 0x05, 0xd3, 0x3f, 0xc6, 0x7d, 0xb0, 0xa4, 0x80, 0x7e, 0x1f, 0xac, 0x06, 0xee, 0xd6, -0xa8, 0x64, 0xfb, 0x6f, 0xc6, 0xa1, 0xcf, 0xf6, 0xfc, 0xed, 0x3c, 0x37, 0x72, 0x58, 0x12, 0xd3, -0xb4, 0x67, 0xc4, 0x62, 0x10, 0x5c, 0x75, 0xec, 0xe4, 0x62, 0xce, 0xb0, 0x84, 0x2b, 0x62, 0x00, -0x2d, 0x5c, 0x8e, 0x5d, 0x85, 0xe0, 0x71, 0xa7, 0x0b, 0x7d, 0x42, 0xfc, 0x5a, 0x44, 0xc1, 0x68, -0x32, 0x01, 0x6f, 0x3e, 0xb9, 0x1f, 0x26, 0xee, 0x74, 0x0c, 0x0c, 0xdb, 0x33, 0x62, 0x5b, 0xcd, -0xdd, 0xad, 0xd7, 0x10, 0x65, 0x17, 0x82, 0x94, 0x63, 0xfb, 0x89, 0x01, 0x89, 0xbd, 0xcb, 0xb8, -0x24, 0xdc, 0x1c, 0x35, 0xf1, 0x9e, 0xf0, 0xee, 0xf7, 0xc1, 0x3f, 0xb5, 0x2a, 0xca, 0x78, 0x3e, -0x98, 0x63, 0xb8, 0x5d, 0x7f, 0xdd, 0xbc, 0x6c, 0x86, 0xb4, 0x6d, 0xcb, 0x37, 0x4a, 0xd1, 0x86, -0xf5, 0x6f, 0x5b, 0x40, 0xb5, 0xa1, 0xa1, 0xc1, 0x1e, 0x4f, 0x19, 0x03, 0x2f, 0x86, 0xa0, 0x85, -0x63, 0x6d, 0xb5, 0xe0, 0xd7, 0x5f, 0x4e, 0x98, 0xbf, 0x38, 0x7f, 0x37, 0x60, 0xfc, 0xb6, 0x05, -0x95, 0xd9, 0xa5, 0xf1, 0x3d, 0x9a, 0xef, 0x65, 0x47, 0x48, 0x68, 0xaf, 0xb0, 0xa0, 0x42, 0x33, -0xe2, 0x1c, 0xe4, 0x36, 0x0a, 0xda, 0x36, 0x17, 0x3a, 0xf9, 0x5b, 0x7e, 0x99, 0x32, 0x80, 0xf9, -0xb5, 0xd7, 0xbf, 0x27, 0x09, 0x59, 0x3f, 0x0e, 0x13, 0x00, 0x00}; -#endif /*__ABOUT_HTML_H__*/ diff --git a/src/web/html/h/api_js.h b/src/web/html/h/api_js.h deleted file mode 100644 index d9bf93cb..00000000 --- a/src/web/html/h/api_js.h +++ /dev/null @@ -1,216 +0,0 @@ -#ifndef __API_JS_H__ -#define __API_JS_H__ -#define api_js_len 3363 -const uint8_t api_js[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xdd, 0x59, 0x79, 0x6f, 0xdb, 0x46, -0x16, 0xff, 0xdf, 0x9f, 0x62, 0x42, 0x60, 0x63, 0x2a, 0x91, 0x46, 0xbc, 0x8f, 0xb8, 0xea, 0x42, -0x75, 0x9d, 0xc4, 0x0b, 0xc7, 0x2e, 0x62, 0xb7, 0xbb, 0x80, 0x61, 0x04, 0xb4, 0x34, 0xb6, 0xd8, -0x50, 0xa4, 0x96, 0xa4, 0xec, 0xc4, 0x85, 0xbf, 0xfb, 0xfe, 0xde, 0x90, 0x94, 0x78, 0xc9, 0xf1, -0x9e, 0x2d, 0x56, 0x31, 0xaf, 0x99, 0x77, 0x5f, 0xf3, 0x66, 0x32, 0x7e, 0xf5, 0x6a, 0x8f, 0xbd, -0x62, 0xe7, 0xbf, 0xbc, 0x63, 0xc7, 0x87, 0x67, 0xa7, 0xe7, 0xf8, 0x18, 0xef, 0xed, 0x85, 0xb3, -0x24, 0xfe, 0x6b, 0x78, 0x13, 0xea, 0x6c, 0xc2, 0x2e, 0xf7, 0x18, 0x7e, 0xca, 0x07, 0x5d, 0xe7, -0x9a, 0xe5, 0x30, 0x5d, 0xe3, 0x96, 0x6d, 0xcd, 0xb8, 0x61, 0x38, 0x23, 0xba, 0x71, 0xdd, 0xb3, -0x47, 0xdc, 0xd1, 0x70, 0xd3, 0x47, 0xdc, 0xb5, 0xa7, 0x0e, 0xb7, 0x5c, 0x93, 0x15, 0x77, 0x4d, -0xfe, 0xf3, 0x98, 0x3f, 0x1b, 0x01, 0xdb, 0x61, 0xda, 0xc8, 0xc0, 0xc3, 0xe0, 0x86, 0x6d, 0xe1, -0xcd, 0xb7, 0x1c, 0xee, 0x6a, 0x16, 0xc8, 0x78, 0x36, 0xd7, 0x2d, 0x50, 0x30, 0x41, 0xcf, 0x36, -0x30, 0xa2, 0x83, 0x52, 0xc4, 0x35, 0xdd, 0xa6, 0x6b, 0xc6, 0x75, 0x87, 0xfe, 0x2c, 0xcd, 0xe5, -0xba, 0xcf, 0x1d, 0x92, 0xc4, 0x9f, 0xda, 0xe0, 0xe0, 0xb1, 0xe2, 0x4e, 0x5c, 0x74, 0xf0, 0xd1, -0xb5, 0x19, 0xf7, 0x1c, 0xfa, 0xd6, 0xb9, 0xe3, 0x73, 0x43, 0xd3, 0x99, 0xc1, 0x2d, 0x83, 0xdb, -0x0e, 0xde, 0x4d, 0x50, 0xb5, 0x40, 0xd0, 0x25, 0x0a, 0x23, 0x90, 0xd0, 0x25, 0x87, 0x11, 0xdd, -0x1e, 0x3e, 0xf8, 0x24, 0x9f, 0x0e, 0x68, 0xe8, 0xa6, 0xfb, 0xd0, 0x0d, 0x37, 0x5c, 0xde, 0x08, -0x02, 0x01, 0x04, 0x32, 0x39, 0xce, 0x54, 0xe7, 0xbe, 0xcf, 0xe4, 0xad, 0xd2, 0x0c, 0xb2, 0xd8, -0x41, 0x6b, 0x98, 0x74, 0x85, 0x8e, 0xde, 0x0c, 0x9a, 0x99, 0x1e, 0x34, 0xa3, 0x27, 0xc4, 0x77, -0x2c, 0x22, 0x04, 0x3a, 0x11, 0xd4, 0x26, 0xd5, 0x9d, 0x80, 0xdb, 0xdc, 0x2e, 0x69, 0xe1, 0xdb, -0x65, 0x1a, 0x4d, 0x81, 0x27, 0xde, 0x1f, 0x94, 0xbd, 0xab, 0x83, 0xad, 0x2b, 0x8c, 0xba, 0x2b, -0x4c, 0x58, 0xde, 0x67, 0x1e, 0x37, 0x5c, 0x1d, 0x9e, 0xd0, 0xc9, 0x13, 0x64, 0x22, 0x1f, 0x0c, -0x6c, 0x17, 0xe8, 0x9a, 0x63, 0x82, 0x86, 0x65, 0x4f, 0x7d, 0x68, 0xec, 0xb0, 0xe2, 0x5e, 0x89, -0xec, 0x90, 0x33, 0x7c, 0x0d, 0x7c, 0x47, 0x26, 0x77, 0x3c, 0x18, 0x67, 0x04, 0xf3, 0x3b, 0xd0, -0x1e, 0xaa, 0x42, 0x24, 0xcb, 0xc3, 0x5f, 0xa9, 0x09, 0x51, 0x22, 0x42, 0x98, 0x91, 0x57, 0x25, -0xab, 0x63, 0x93, 0x23, 0xed, 0x29, 0x40, 0x1d, 0x26, 0x6f, 0x95, 0x0b, 0xdc, 0xa0, 0x3d, 0x66, -0x41, 0x26, 0x17, 0xc4, 0x4d, 0xd3, 0x81, 0xb0, 0x1a, 0x78, 0x99, 0x06, 0x31, 0xd1, 0x35, 0x8f, -0xe8, 0x10, 0x0f, 0xfb, 0x61, 0x89, 0x78, 0xd0, 0x3d, 0x93, 0xc9, 0xfb, 0xef, 0x14, 0x5d, 0xde, -0xff, 0x77, 0x74, 0x79, 0x45, 0x74, 0xb9, 0x7d, 0xd1, 0x65, 0xd6, 0xa3, 0xcb, 0xe6, 0xa6, 0x67, -0xc1, 0xc6, 0xba, 0x6e, 0x53, 0x34, 0xd8, 0x74, 0x6d, 0xe2, 0xc1, 0x22, 0x7c, 0x13, 0xc2, 0x92, -0x32, 0x16, 0x2b, 0x1f, 0x95, 0xc0, 0xe6, 0xa1, 0x0d, 0xf3, 0xfb, 0x8c, 0x1c, 0xe9, 0x1a, 0x26, -0x33, 0xb9, 0xe7, 0x19, 0x90, 0xc9, 0x84, 0x29, 0x4d, 0xd7, 0xef, 0x21, 0xe7, 0x11, 0x35, 0x6e, -0xeb, 0x1e, 0x5d, 0x9b, 0xf0, 0x42, 0x58, 0x6a, 0xf6, 0x14, 0xea, 0x5b, 0x96, 0xb4, 0x82, 0x65, -0x6d, 0xdd, 0x60, 0xcd, 0x60, 0x72, 0xca, 0x15, 0x44, 0x96, 0x67, 0xb8, 0xdc, 0xd3, 0x0c, 0x08, -0xeb, 0xea, 0x0e, 0x05, 0x8f, 0x63, 0x15, 0x21, 0x46, 0x41, 0xec, 0x23, 0xd2, 0x88, 0x14, 0xb1, -0xf1, 0x1f, 0x94, 0x61, 0x4f, 0xf6, 0x90, 0x40, 0x14, 0x8c, 0x46, 0x2d, 0xde, 0xb7, 0x99, 0x63, -0xb3, 0xe2, 0xfe, 0x7b, 0x66, 0x8e, 0xb3, 0xcd, 0x1c, 0xa7, 0x99, 0x39, 0xe6, 0x1f, 0x27, 0x73, -0xfe, 0x63, 0x75, 0x79, 0x93, 0x38, 0xce, 0x1f, 0xaf, 0x2c, 0x77, 0x13, 0x27, 0x48, 0xe3, 0x5a, -0xde, 0xb8, 0xdc, 0x37, 0x3d, 0xe8, 0x05, 0xe1, 0xa7, 0x14, 0x79, 0xba, 0x59, 0xe9, 0xcf, 0x35, -0x84, 0xa8, 0x11, 0x34, 0x06, 0x65, 0x7c, 0x68, 0x64, 0x40, 0x4b, 0x5e, 0x9b, 0x61, 0xdb, 0xc2, -0xe5, 0x46, 0x0e, 0xf7, 0x6c, 0x97, 0xf4, 0x70, 0x1c, 0x77, 0xc6, 0x35, 0x08, 0x0a, 0xd9, 0x34, -0x13, 0x0e, 0x31, 0x2c, 0xa2, 0x47, 0xde, 0x06, 0x45, 0x10, 0xc1, 0x55, 0x20, 0x8f, 0x0a, 0x64, -0x4a, 0x5c, 0x79, 0x6d, 0x46, 0x1d, 0x60, 0xea, 0xee, 0x7b, 0x9d, 0xf8, 0x04, 0x94, 0xd6, 0x74, -0xd5, 0x66, 0xc9, 0xd6, 0x6e, 0x0f, 0xad, 0x91, 0x24, 0xe6, 0xca, 0x6b, 0x23, 0x9f, 0x06, 0xbb, -0x83, 0xf7, 0x09, 0x12, 0x0f, 0x55, 0x02, 0xea, 0xba, 0x24, 0x87, 0xe5, 0xd2, 0x55, 0x53, 0x82, -0x08, 0xb8, 0x0f, 0x4b, 0x6a, 0x1a, 0xf0, 0x6e, 0x91, 0x37, 0xa0, 0xbb, 0x5e, 0x19, 0x80, 0xbc, -0xe1, 0x83, 0xe8, 0x09, 0x58, 0xda, 0x8c, 0x52, 0xd2, 0x34, 0x67, 0x04, 0xe7, 0x72, 0xd7, 0xf5, -0x28, 0x0a, 0x00, 0xeb, 0x3a, 0xb0, 0xa9, 0x57, 0xbc, 0x2c, 0x00, 0xe3, 0xea, 0x08, 0x70, 0xcf, -0xf3, 0x65, 0x1c, 0x59, 0x26, 0x82, 0xc0, 0xf7, 0x01, 0x30, 0x92, 0x00, 0x27, 0x1e, 0x5e, 0x0d, -0x4a, 0x45, 0xc7, 0xd9, 0x26, 0xbb, 0x2b, 0x6d, 0xaf, 0x1b, 0x01, 0xe8, 0x49, 0xd9, 0x10, 0x79, -0xe5, 0xb3, 0xd0, 0x13, 0x5f, 0x0f, 0x80, 0xd2, 0x11, 0xb1, 0xbe, 0x8f, 0x7a, 0x87, 0xf4, 0x2e, -0x52, 0x5c, 0xc2, 0xe8, 0x9c, 0xaa, 0x26, 0x12, 0xc0, 0x46, 0x29, 0x43, 0xd1, 0x41, 0x64, 0x20, -0x7f, 0x71, 0x95, 0xd8, 0xd0, 0x07, 0x3a, 0x6c, 0xd0, 0x6b, 0xc1, 0x71, 0x1c, 0xdf, 0x24, 0xb5, -0xe0, 0x80, 0x16, 0xf6, 0xd4, 0x65, 0x6e, 0x49, 0x17, 0x9f, 0x41, 0xf1, 0xa5, 0x15, 0x72, 0x59, -0x0f, 0x4b, 0xdc, 0xa7, 0x1e, 0xf3, 0xca, 0x11, 0x3c, 0x83, 0xe2, 0xab, 0xf8, 0xa7, 0x6f, 0x95, -0x5a, 0x42, 0x53, 0xca, 0x64, 0xdb, 0xf3, 0x90, 0xad, 0x06, 0xf2, 0xc9, 0x43, 0x6c, 0x6a, 0x28, -0x64, 0x08, 0x6b, 0xca, 0x24, 0x59, 0x07, 0x7c, 0x8b, 0x52, 0xca, 0x84, 0xb8, 0xe4, 0x41, 0xc3, -0xa3, 0xba, 0xe2, 0x47, 0x54, 0xbc, 0x51, 0xa6, 0xf1, 0x4e, 0x79, 0x80, 0x8e, 0x81, 0x7b, 0x3e, -0xc4, 0x87, 0xc2, 0x28, 0x33, 0x48, 0x62, 0x4f, 0xf3, 0xca, 0x37, 0xdb, 0x92, 0x46, 0x00, 0x36, -0xec, 0x6c, 0xd8, 0x64, 0x59, 0xcb, 0x41, 0x2d, 0xb0, 0x7d, 0x0f, 0x09, 0x0a, 0xd6, 0xdc, 0xd2, -0x1d, 0xca, 0x25, 0xa2, 0x8f, 0x0f, 0x1f, 0xa2, 0x58, 0x78, 0x71, 0x3c, 0xa7, 0x78, 0x31, 0x5c, -0x2a, 0x94, 0x28, 0xfb, 0x54, 0x82, 0x7c, 0x54, 0x2b, 0x93, 0xd2, 0xd5, 0x36, 0xcd, 0x93, 0xad, -0xfc, 0x48, 0x70, 0xaa, 0x72, 0x5b, 0xef, 0x8c, 0x1a, 0xde, 0x21, 0x5f, 0xd5, 0x6c, 0x7a, 0xbe, -0x9e, 0xcd, 0x44, 0x96, 0xfd, 0x97, 0xcc, 0xfa, 0x01, 0xad, 0xad, 0xef, 0x42, 0x1c, 0x1f, 0x6e, -0x36, 0x90, 0x69, 0xb8, 0x36, 0xc5, 0x1c, 0x71, 0x6e, 0x18, 0x70, 0xb4, 0x85, 0x56, 0x06, 0x8b, -0x82, 0xee, 0xb2, 0x62, 0x95, 0x84, 0x85, 0x0d, 0xc4, 0xbf, 0x6b, 0x73, 0xd7, 0xde, 0x96, 0x19, -0x2a, 0xda, 0x9a, 0x73, 0xe2, 0x10, 0x3d, 0xaa, 0x8a, 0x4d, 0x08, 0x9a, 0x74, 0x7d, 0x22, 0x1a, -0x99, 0x88, 0x1a, 0x63, 0x04, 0x96, 0x7e, 0x87, 0x86, 0x4b, 0xd1, 0xa5, 0xd9, 0x5d, 0xf5, 0xdf, -0xae, 0xa3, 0xa8, 0xbe, 0x5c, 0x63, 0xc9, 0xd8, 0x28, 0x28, 0x55, 0xdc, 0x28, 0x88, 0x6f, 0xa4, -0x18, 0x56, 0x08, 0xb0, 0x71, 0x71, 0xd3, 0xba, 0x92, 0x7a, 0xff, 0x5b, 0xbd, 0x50, 0x68, 0xea, -0x5a, 0xb1, 0x71, 0xb1, 0xfd, 0x78, 0x77, 0x74, 0x7a, 0xf4, 0xf1, 0xf8, 0x90, 0xbd, 0xfd, 0xf9, -0xf4, 0xf0, 0xe2, 0xb8, 0xda, 0x86, 0xdc, 0xac, 0xe3, 0x59, 0x1e, 0x26, 0x31, 0x5b, 0x46, 0x6a, -0x1e, 0xdc, 0x9e, 0x06, 0x4b, 0x31, 0x64, 0x9c, 0xf3, 0x20, 0xbd, 0xcd, 0x06, 0xec, 0x37, 0xa9, -0xff, 0x5d, 0x90, 0x32, 0x41, 0xe6, 0x98, 0x27, 0xb3, 0xf5, 0x52, 0xc4, 0x39, 0x9f, 0xa5, 0x22, -0xc8, 0xc5, 0x51, 0x24, 0xe8, 0xab, 0xc2, 0x1b, 0x1c, 0x48, 0xe8, 0xf0, 0x46, 0x25, 0xe4, 0x4b, -0xed, 0xaa, 0xc2, 0xa7, 0xdf, 0x4d, 0x92, 0xaa, 0x44, 0x27, 0x06, 0x20, 0x0b, 0x63, 0xd6, 0x03, -0x52, 0x22, 0x13, 0x04, 0x0f, 0xe3, 0xb9, 0xf8, 0x72, 0x76, 0xa3, 0x2a, 0x49, 0xac, 0x0c, 0xd8, -0x64, 0x32, 0x61, 0x5a, 0x1b, 0x94, 0x7e, 0x22, 0xe2, 0xc1, 0x7c, 0x7e, 0x74, 0x07, 0x29, 0x4e, -0xc2, 0x2c, 0x17, 0xb1, 0x48, 0x0b, 0xfc, 0x6c, 0x7d, 0x9d, 0xe5, 0xa9, 0x6a, 0x0c, 0x78, 0x9e, -0x9c, 0x24, 0xf7, 0x22, 0x3d, 0x0c, 0x32, 0xa1, 0x0e, 0x86, 0x15, 0xdf, 0x4b, 0x82, 0xba, 0x1a, -0xb2, 0x9b, 0x20, 0xca, 0xc4, 0xa0, 0x41, 0xf7, 0x11, 0x54, 0x33, 0xd1, 0xcf, 0x2c, 0x13, 0xf9, -0x34, 0xcf, 0xd3, 0xf0, 0x7a, 0x9d, 0x0b, 0xc9, 0xa8, 0x45, 0xb0, 0x34, 0xc1, 0x86, 0xd4, 0x5e, -0xf3, 0xed, 0xb1, 0x34, 0x10, 0x53, 0x5f, 0x48, 0x34, 0xbd, 0xa1, 0x7f, 0x2a, 0xf2, 0x35, 0x16, -0x3b, 0x11, 0x1d, 0xd4, 0x80, 0xcb, 0xc1, 0x58, 0x40, 0xbb, 0x54, 0x15, 0x51, 0xc9, 0x10, 0x98, -0x7b, 0x8f, 0x7b, 0x5b, 0xef, 0xd5, 0xe6, 0xe3, 0x8a, 0x26, 0xf1, 0xc9, 0xbf, 0xae, 0x44, 0x72, -0xc3, 0x62, 0x69, 0x42, 0x05, 0x26, 0x09, 0xe3, 0x5b, 0xa5, 0xce, 0x14, 0x4a, 0x85, 0x31, 0xcc, -0xf6, 0xfe, 0xe2, 0xc3, 0x09, 0x3c, 0x1c, 0x97, 0xbc, 0x0b, 0x1b, 0x10, 0x85, 0x18, 0xde, 0xca, -0xf2, 0x20, 0x9e, 0x11, 0x9d, 0x69, 0x9a, 0x06, 0x5f, 0xfb, 0xdc, 0x1a, 0x02, 0x57, 0x3b, 0xc0, -0xe3, 0x3b, 0x16, 0xf3, 0x48, 0xc4, 0xb7, 0xf9, 0x02, 0x5f, 0xaf, 0x5f, 0x77, 0xfd, 0xbb, 0x95, -0xe9, 0x32, 0xbc, 0xda, 0x29, 0x56, 0xf5, 0x23, 0xda, 0x79, 0x37, 0xf2, 0x2e, 0xc4, 0x97, 0xfc, -0x34, 0x99, 0xc3, 0x07, 0x20, 0xd2, 0x32, 0x7a, 0x15, 0x17, 0xab, 0x95, 0x88, 0xe7, 0x87, 0x8b, -0x30, 0x9a, 0xab, 0x79, 0xdb, 0x2f, 0x35, 0xf5, 0x48, 0x8a, 0x9a, 0x86, 0x44, 0x75, 0xf0, 0xdb, -0xb7, 0x08, 0xf6, 0xb0, 0xed, 0xf8, 0x7a, 0x87, 0x09, 0x5b, 0x0c, 0xda, 0x84, 0x07, 0x5d, 0xdf, -0x53, 0x40, 0xd4, 0x7d, 0x9d, 0x27, 0xab, 0x38, 0xb8, 0x53, 0x2b, 0x73, 0xe5, 0xc9, 0xed, 0x6d, -0x24, 0x54, 0xa5, 0x18, 0x56, 0x86, 0x58, 0xbb, 0x92, 0xeb, 0x30, 0x12, 0xca, 0xa0, 0x89, 0xb6, -0x0a, 0xd2, 0x4c, 0x9c, 0x02, 0x31, 0xb9, 0xfe, 0xb5, 0xc2, 0x25, 0xf7, 0xd5, 0x5c, 0xa7, 0xeb, -0x1d, 0xa7, 0x21, 0x21, 0x01, 0x30, 0x61, 0x46, 0x33, 0x49, 0x50, 0x29, 0xf3, 0x30, 0x5e, 0x8b, -0xad, 0x0d, 0xc8, 0x53, 0x8d, 0x1a, 0x71, 0x2b, 0xf2, 0xb2, 0x40, 0xfc, 0xf0, 0xf5, 0x78, 0xae, -0x2a, 0x24, 0xdc, 0xeb, 0xb0, 0x66, 0x35, 0x90, 0xbe, 0x47, 0x9e, 0x27, 0xf7, 0x3c, 0x4a, 0x66, -0x01, 0xc9, 0xc8, 0x57, 0x41, 0xbe, 0x90, 0x15, 0x82, 0xc2, 0x62, 0xac, 0xb0, 0xd7, 0x2c, 0xe2, -0x8b, 0x54, 0xdc, 0x94, 0xf9, 0x8c, 0x28, 0x51, 0xb5, 0x61, 0x35, 0xb6, 0xa9, 0x11, 0x7f, 0x56, -0x06, 0x03, 0x9e, 0xad, 0xa2, 0x30, 0x57, 0xf7, 0xc7, 0xfb, 0x03, 0xbe, 0x4a, 0x56, 0xea, 0xa0, -0xa7, 0xb2, 0x40, 0x93, 0x17, 0x13, 0x94, 0xed, 0xc1, 0xcb, 0x97, 0xac, 0x78, 0xf7, 0x07, 0x83, -0x8e, 0xab, 0x23, 0x3e, 0x8b, 0x82, 0x2c, 0xa3, 0x7a, 0x42, 0xc5, 0x45, 0x55, 0x02, 0xd8, 0xef, -0x4e, 0x9a, 0x73, 0xeb, 0xe1, 0xba, 0x12, 0xb0, 0xe7, 0xa5, 0x02, 0x3d, 0xd7, 0x9f, 0x56, 0x69, -0x92, 0x1f, 0xc5, 0x4a, 0x5f, 0x55, 0x6b, 0x02, 0x75, 0x41, 0x4a, 0x30, 0x8d, 0x34, 0x0f, 0xbb, -0x42, 0xb5, 0x05, 0x4b, 0xc5, 0x32, 0xb9, 0x83, 0xd3, 0x17, 0xe1, 0xbc, 0x21, 0xd9, 0x36, 0xac, -0x64, 0xec, 0x41, 0xcb, 0xef, 0xe1, 0xba, 0x1e, 0x5e, 0x95, 0x49, 0x6a, 0x82, 0x2d, 0x83, 0xec, -0xb3, 0x72, 0xc5, 0xbe, 0xff, 0x1e, 0xc6, 0x19, 0x19, 0x30, 0xe0, 0x4b, 0xa6, 0x7d, 0xd1, 0x74, -0x2a, 0xbf, 0xf4, 0xa2, 0xf5, 0x4b, 0xf5, 0xcf, 0x4a, 0xf6, 0xd8, 0x9f, 0x89, 0xd0, 0xfc, 0x45, -0xaf, 0xe6, 0xcf, 0xa1, 0xfd, 0xd8, 0xd0, 0x57, 0x6f, 0x12, 0xf9, 0x16, 0x81, 0xc7, 0x6e, 0x96, -0xfc, 0x22, 0xd2, 0x0c, 0x1f, 0xf5, 0x4c, 0xd9, 0x19, 0xd6, 0x77, 0x05, 0xac, 0x32, 0x68, 0xe4, -0xf1, 0x46, 0x82, 0x28, 0x8c, 0x3f, 0x83, 0x5f, 0x9e, 0xaf, 0xb2, 0x37, 0xe3, 0xf1, 0x6d, 0x98, -0x2f, 0xd6, 0xd7, 0x7c, 0x96, 0x2c, 0xc7, 0xd1, 0x7a, 0x19, 0xac, 0xd6, 0xe3, 0x60, 0x91, 0x7c, -0x1d, 0xe3, 0x7b, 0x19, 0xe6, 0x99, 0x0c, 0x78, 0xe9, 0x8f, 0xeb, 0x35, 0x88, 0x28, 0x58, 0x9f, -0x94, 0x77, 0x61, 0xce, 0xce, 0xdf, 0x4f, 0xdf, 0xb0, 0xf6, 0x1c, 0x3e, 0x15, 0xf6, 0xa6, 0x36, -0x5e, 0x09, 0x42, 0x58, 0x9f, 0xae, 0xa3, 0x20, 0xfe, 0xac, 0x14, 0x86, 0xe8, 0xab, 0x03, 0x47, -0xe7, 0x3f, 0x3d, 0x4b, 0x3b, 0x91, 0xad, 0x3e, 0x51, 0xbd, 0x86, 0x7a, 0xa9, 0x58, 0x45, 0xc1, -0x4c, 0x48, 0xfd, 0x52, 0x11, 0x6f, 0x55, 0xdc, 0x55, 0x9b, 0x95, 0x1f, 0x92, 0x20, 0x9d, 0xd7, -0x24, 0xdc, 0x10, 0xbb, 0xda, 0x2d, 0xd8, 0xc7, 0x2c, 0x0b, 0xeb, 0x92, 0xc9, 0xc5, 0x05, 0xd5, -0x06, 0x95, 0x65, 0x73, 0x8e, 0xb2, 0xe9, 0x33, 0x24, 0xd5, 0x7b, 0x0c, 0x7d, 0x4a, 0x81, 0x06, -0x9b, 0x7c, 0x37, 0x61, 0x23, 0xaf, 0x16, 0xa8, 0x2d, 0x4c, 0xbd, 0xc0, 0xac, 0x82, 0xa5, 0x17, -0xdd, 0xdd, 0x8d, 0x6e, 0x1c, 0x3c, 0x6d, 0x2c, 0x22, 0x45, 0xb0, 0x3d, 0xc6, 0xca, 0xee, 0x6e, -0x55, 0x9a, 0x1a, 0x32, 0xd3, 0x28, 0x2e, 0x09, 0x8d, 0x6a, 0xdd, 0x16, 0x62, 0x30, 0x68, 0x57, -0xfb, 0xe3, 0x2c, 0xf9, 0x11, 0x76, 0x3d, 0x47, 0x3f, 0x33, 0xaf, 0xcc, 0xb2, 0x69, 0x0b, 0xee, -0x19, 0xcd, 0xa9, 0x73, 0x12, 0xe6, 0x22, 0x5c, 0xa2, 0xc7, 0x81, 0xb5, 0xb7, 0x9f, 0x0f, 0x49, -0x2c, 0xce, 0x6e, 0x6e, 0xd0, 0xb7, 0x60, 0xe2, 0x15, 0x1b, 0x39, 0x1a, 0x7e, 0x03, 0xea, 0x8a, -0x8e, 0xcf, 0xcf, 0xce, 0x8b, 0x8a, 0x3a, 0x68, 0x56, 0x57, 0xdd, 0xdf, 0x88, 0xaf, 0xee, 0x5f, -0xec, 0x0f, 0x19, 0xfd, 0xf5, 0x09, 0x45, 0xf4, 0x2b, 0xa1, 0xd8, 0x78, 0xcc, 0x7e, 0xbe, 0x38, -0x7c, 0xf1, 0x2d, 0xe1, 0x76, 0x73, 0xd6, 0xf5, 0xe7, 0xb1, 0x86, 0x2a, 0xef, 0x91, 0xbd, 0x6a, -0x38, 0x1f, 0x32, 0x4a, 0xe3, 0x66, 0x93, 0xba, 0x7c, 0x62, 0x05, 0x0a, 0xe7, 0xdb, 0x0e, 0x35, -0x96, 0xfd, 0xfd, 0x84, 0x30, 0x06, 0xad, 0x06, 0x6c, 0x03, 0x53, 0xa7, 0x5e, 0x0e, 0xbd, 0x00, -0x7c, 0xad, 0x9c, 0xd0, 0x2a, 0x18, 0x60, 0x6d, 0xaf, 0x0a, 0x4a, 0xb3, 0xf0, 0x34, 0x61, 0xe5, -0x52, 0xd2, 0xa8, 0x3b, 0x32, 0x0e, 0xf7, 0xfa, 0xa1, 0xcb, 0x42, 0xb5, 0x4f, 0x08, 0x5d, 0xe3, -0xcb, 0x05, 0x9f, 0x0c, 0x30, 0x8b, 0x26, 0x25, 0xcd, 0xba, 0x15, 0x9e, 0x69, 0x83, 0x17, 0xa2, -0x4f, 0x95, 0x59, 0x54, 0x53, 0x43, 0xb4, 0x14, 0xc0, 0xe4, 0x36, 0x85, 0x7a, 0xa1, 0x4a, 0xc1, -0x25, 0x60, 0x5d, 0x68, 0xc8, 0x31, 0xfd, 0x35, 0xf8, 0xa2, 0xae, 0x53, 0xb4, 0xa8, 0xab, 0x3c, -0x1d, 0xb2, 0xa5, 0xc8, 0x17, 0xc9, 0x7c, 0xa2, 0xbc, 0x3b, 0xba, 0x40, 0x1a, 0xfc, 0x9a, 0x25, -0xf1, 0x84, 0xbc, 0x52, 0xd7, 0xe4, 0xcb, 0x22, 0xa5, 0x9e, 0x14, 0x71, 0xf4, 0xb7, 0x0f, 0x27, -0xef, 0x51, 0x43, 0x3f, 0x8a, 0xbf, 0xaf, 0xd1, 0xe9, 0xaa, 0x5b, 0x25, 0x08, 0x04, 0x0b, 0x47, -0x1d, 0x13, 0x3f, 0x8c, 0xf2, 0x04, 0xd5, 0x58, 0x2d, 0x98, 0x0c, 0x99, 0x64, 0x9b, 0xa7, 0x6b, -0xb1, 0x5d, 0x35, 0x24, 0x4c, 0x8c, 0x92, 0x35, 0xff, 0x8a, 0xe6, 0x2c, 0x17, 0xb3, 0x45, 0x10, -0xdf, 0x92, 0xed, 0x56, 0x1b, 0x10, 0xd0, 0x57, 0x7e, 0x3a, 0x3b, 0xbf, 0x50, 0x28, 0x54, 0x0a, -0x52, 0x4d, 0x17, 0x13, 0x0d, 0x04, 0x64, 0x29, 0xd6, 0x7b, 0xd0, 0x42, 0x13, 0xae, 0x1c, 0xc2, -0x96, 0x30, 0xf8, 0xe8, 0x82, 0x6a, 0x1d, 0x32, 0x1d, 0x0b, 0x43, 0x14, 0x16, 0x1d, 0xce, 0x98, -0xf4, 0x3c, 0x00, 0x2b, 0x94, 0xba, 0x7c, 0xf2, 0xf3, 0xc5, 0xdb, 0x91, 0xa7, 0x34, 0x45, 0xca, -0xb0, 0x86, 0xa8, 0x04, 0x35, 0xa8, 0x6f, 0x03, 0xb6, 0x45, 0x52, 0x6d, 0x85, 0x24, 0xe1, 0x48, -0x25, 0xce, 0x49, 0x09, 0x12, 0xd4, 0xea, 0xdb, 0x54, 0x51, 0xbc, 0xc3, 0x4e, 0x05, 0x74, 0xb6, -0x4a, 0xe2, 0x4c, 0x16, 0xea, 0x1d, 0x6d, 0x48, 0x05, 0x0e, 0x47, 0xf5, 0xaf, 0xfa, 0x98, 0x50, -0xff, 0x72, 0x7e, 0x76, 0xca, 0x65, 0xd1, 0x56, 0x3b, 0x64, 0xbf, 0xb9, 0x11, 0x42, 0x6c, 0x94, -0xfb, 0xd2, 0xc3, 0x8f, 0x47, 0xd3, 0x8b, 0x23, 0xf6, 0xe3, 0xd9, 0x87, 0xd6, 0xd6, 0xb4, 0x16, -0xf1, 0xb4, 0xc9, 0x88, 0x50, 0x20, 0x70, 0x37, 0xb6, 0xdb, 0x9b, 0x6a, 0x27, 0x41, 0xa3, 0xb2, -0x63, 0x8c, 0xd7, 0xcb, 0x6b, 0x91, 0x2a, 0x83, 0x5a, 0x53, 0x4a, 0x33, 0xac, 0x2c, 0x37, 0x12, -0xfb, 0xa0, 0x5e, 0xa2, 0xb0, 0xe9, 0x55, 0xf2, 0x14, 0x3e, 0xfa, 0xed, 0x71, 0x58, 0x6e, 0xf6, -0xe9, 0x27, 0x87, 0x17, 0x34, 0x9c, 0xe5, 0x5f, 0x23, 0xf1, 0x86, 0x8a, 0xf5, 0x3c, 0x5f, 0xbc, -0x61, 0xb6, 0xf6, 0x27, 0xe5, 0x51, 0x8a, 0xa1, 0x0f, 0x86, 0x4d, 0xf0, 0x79, 0x49, 0x45, 0x32, -0x91, 0x53, 0x57, 0xad, 0x14, 0x98, 0x8b, 0x8c, 0x44, 0xa8, 0xe4, 0x17, 0xbb, 0x37, 0xd4, 0xfb, -0xab, 0xfd, 0x2a, 0xcf, 0xda, 0x15, 0x04, 0x05, 0x13, 0x74, 0x94, 0xcd, 0x74, 0x7d, 0xf3, 0x06, -0xe2, 0x0d, 0xed, 0x44, 0x93, 0x7f, 0x74, 0x1d, 0xa9, 0x8b, 0x7c, 0x19, 0xa1, 0xe9, 0x97, 0x62, -0xca, 0xf2, 0x41, 0x9e, 0x1e, 0xb2, 0x70, 0xde, 0xc8, 0xbd, 0xa7, 0x44, 0x8b, 0x82, 0x6b, 0x11, -0x6d, 0xc5, 0x23, 0x82, 0x6f, 0x13, 0x4a, 0xd3, 0x92, 0xf4, 0x93, 0x82, 0xd5, 0x42, 0x0b, 0x15, -0xa2, 0xa3, 0x1d, 0xe7, 0x7c, 0x53, 0x61, 0x6a, 0xa0, 0x28, 0x5a, 0x44, 0x70, 0x4e, 0x4b, 0xf1, -0xfc, 0x29, 0x0d, 0xc3, 0x78, 0x55, 0xee, 0xca, 0xa5, 0x7a, 0xcb, 0xe0, 0xcb, 0x84, 0x96, 0x5a, -0xa8, 0x79, 0xa9, 0xe4, 0x08, 0x4b, 0xea, 0x8d, 0x4a, 0x55, 0x51, 0x0d, 0x10, 0x3c, 0xe5, 0x2b, -0xb6, 0x1d, 0xd8, 0x3d, 0xc7, 0xd5, 0x44, 0x98, 0x47, 0xd5, 0xcc, 0x6c, 0x21, 0x66, 0x9f, 0xc5, -0xf3, 0xad, 0x03, 0x09, 0xd6, 0xf9, 0x2e, 0xe7, 0xd5, 0xd5, 0x13, 0xbc, 0xd8, 0xe7, 0xc8, 0x03, -0x91, 0x8e, 0xc6, 0x32, 0x4c, 0x04, 0xc7, 0x63, 0x2d, 0x76, 0xd8, 0x0f, 0xca, 0x11, 0x08, 0x1e, -0x27, 0x72, 0xbb, 0xcd, 0xe4, 0xd0, 0x73, 0x6c, 0x57, 0x9b, 0x25, 0x1b, 0xd0, 0x3c, 0x3d, 0x59, -0xf1, 0xd9, 0x81, 0x29, 0x8d, 0x43, 0x60, 0xe5, 0x2b, 0xdb, 0x0c, 0x76, 0x09, 0x92, 0xed, 0x24, -0x45, 0x7a, 0x61, 0xe5, 0x40, 0xd7, 0xf9, 0x85, 0x59, 0x65, 0x04, 0x14, 0xaf, 0x6c, 0x33, 0xf8, -0x94, 0x83, 0x33, 0x11, 0x95, 0x0e, 0x4e, 0x56, 0x34, 0x90, 0x0d, 0x69, 0xe8, 0x78, 0xfe, 0x1c, -0xd7, 0x00, 0x50, 0xcc, 0x6a, 0xbe, 0xe9, 0xd8, 0x5f, 0x6e, 0x86, 0x73, 0x86, 0x82, 0x52, 0x12, -0xaf, 0x17, 0x47, 0x3a, 0x67, 0xc6, 0x30, 0x00, 0x2e, 0x35, 0x8a, 0xa2, 0xfc, 0x52, 0xc7, 0xa3, -0xf8, 0xa4, 0xda, 0x53, 0x88, 0x51, 0x2b, 0x7b, 0xa2, 0xb1, 0x1f, 0x48, 0x06, 0x3d, 0x87, 0x3a, -0x5d, 0xe5, 0x7e, 0x14, 0xd1, 0x34, 0x8a, 0xce, 0xc0, 0x07, 0x1f, 0x8d, 0x16, 0x78, 0x28, 0x37, -0xd7, 0x18, 0xe5, 0xa5, 0x70, 0xe5, 0x29, 0x0b, 0x1b, 0x31, 0xfd, 0xa0, 0xb1, 0x97, 0x8f, 0x68, -0x2f, 0xff, 0x7d, 0xb1, 0xa7, 0x1f, 0x8d, 0xea, 0x3a, 0x10, 0x76, 0xb9, 0x3e, 0x87, 0xbd, 0x9b, -0x1f, 0x52, 0x50, 0x66, 0x0e, 0xe5, 0xb2, 0x34, 0xed, 0xa4, 0x38, 0x20, 0x2b, 0x89, 0x24, 0x4f, -0x98, 0xb7, 0x10, 0xab, 0x32, 0x6f, 0xd2, 0x8d, 0xdd, 0xa4, 0x51, 0x12, 0x88, 0xc3, 0x26, 0x2c, -0x48, 0xd9, 0xad, 0xa5, 0x79, 0xe1, 0x29, 0x19, 0x13, 0xb4, 0x64, 0x37, 0x02, 0x22, 0x69, 0xd5, -0xd4, 0xf0, 0x0e, 0xbd, 0x06, 0x04, 0x7e, 0x76, 0x86, 0x02, 0xe3, 0x39, 0xf9, 0x59, 0x0b, 0xd6, -0xc5, 0xa0, 0x55, 0xce, 0x16, 0x4f, 0x86, 0xe8, 0x2a, 0x88, 0xd5, 0x7f, 0xb9, 0xba, 0x12, 0xf6, -0xfe, 0xe0, 0xf7, 0xac, 0xa1, 0xd7, 0xa9, 0xda, 0xda, 0x64, 0xec, 0x92, 0xf5, 0x3a, 0x6d, 0x77, -0xa6, 0x72, 0xb3, 0x3b, 0xcf, 0x72, 0xd4, 0x50, 0x54, 0x5b, 0xdc, 0x83, 0x14, 0x7d, 0x5f, 0xa7, -0xad, 0x0b, 0x9e, 0x30, 0x40, 0x50, 0x69, 0xff, 0xad, 0x93, 0x3f, 0xe2, 0x50, 0x82, 0x06, 0xf2, -0x3c, 0x88, 0x60, 0xb3, 0xbc, 0x5b, 0x91, 0xa4, 0x0c, 0xdb, 0xf0, 0x0a, 0x78, 0x31, 0xc2, 0xaa, -0xa9, 0x8a, 0x46, 0xdf, 0x81, 0x61, 0x69, 0x81, 0xa0, 0xe5, 0x62, 0x6c, 0xe6, 0xe6, 0x41, 0x1e, -0x94, 0xee, 0xbd, 0x9f, 0x18, 0x16, 0x45, 0x20, 0xdd, 0x37, 0x3e, 0xcf, 0x93, 0x24, 0xca, 0xc3, -0x55, 0x47, 0xf7, 0x6c, 0xa7, 0xee, 0xa7, 0xe7, 0x68, 0xf7, 0xd1, 0xe3, 0xbe, 0x19, 0x8f, 0xef, -0xef, 0xef, 0xf9, 0xbd, 0xc9, 0x93, 0xf4, 0x76, 0x6c, 0x60, 0xbf, 0x36, 0x06, 0x43, 0xda, 0x09, -0xd1, 0xa3, 0x14, 0x2c, 0x6b, 0x1e, 0x45, 0xef, 0xcb, 0xfe, 0x04, 0x30, 0xf7, 0x3b, 0xe6, 0x17, -0x22, 0xbc, 0x5d, 0xe4, 0x00, 0x58, 0xec, 0x00, 0xb8, 0x0b, 0xc5, 0xfd, 0x0f, 0xc9, 0x17, 0x62, -0x53, 0xfc, 0x97, 0x0d, 0xfe, 0xf6, 0x07, 0xbd, 0x11, 0xd7, 0x46, 0x95, 0xf1, 0xb7, 0x4f, 0xba, -0x77, 0xe1, 0xc9, 0x4c, 0xed, 0xf3, 0x62, 0x6c, 0x35, 0xb2, 0x1c, 0x59, 0x80, 0x42, 0xdb, 0x9e, -0x2e, 0x8f, 0x16, 0x31, 0x1d, 0xfe, 0x1b, 0x76, 0xa2, 0x53, 0xc4, 0xfd, 0x56, 0x07, 0x1a, 0xb6, -0x84, 0x9e, 0x03, 0x50, 0xb4, 0x60, 0xb2, 0x46, 0x0c, 0x84, 0x8d, 0x03, 0xbf, 0xfa, 0xf1, 0xfd, -0x36, 0xb6, 0x0a, 0x27, 0xd7, 0x35, 0x28, 0xa4, 0xcf, 0x77, 0x47, 0xb8, 0x22, 0x57, 0xc4, 0xfa, -0xe9, 0x55, 0xde, 0x60, 0xbb, 0x33, 0xde, 0x4b, 0x5e, 0x35, 0xc4, 0xac, 0x37, 0x66, 0x1b, 0x4b, -0x4c, 0xd6, 0x8c, 0xdc, 0x65, 0x32, 0x0f, 0x22, 0x55, 0x4a, 0x30, 0x64, 0xd7, 0xc9, 0xfc, 0x6b, -0xad, 0x99, 0xae, 0xb6, 0xc4, 0x3b, 0x8f, 0x37, 0x24, 0xb2, 0xd2, 0x38, 0x58, 0xdd, 0x7d, 0x14, -0x92, 0x92, 0x68, 0xe9, 0xe6, 0x54, 0x4c, 0x6d, 0x18, 0x9a, 0x1a, 0x66, 0xd4, 0x61, 0xea, 0x98, -0x43, 0x3a, 0x20, 0x92, 0x94, 0x47, 0x15, 0x0e, 0x45, 0x12, 0x22, 0xaa, 0x1a, 0xa7, 0x33, 0x92, -0x78, 0x86, 0x0d, 0xd4, 0xe7, 0x37, 0x85, 0xfc, 0x87, 0x51, 0x92, 0x89, 0xc7, 0x5a, 0xff, 0xbd, -0x93, 0x64, 0x87, 0xd4, 0xe3, 0xb0, 0xb3, 0x9b, 0xa9, 0x21, 0x36, 0x60, 0x47, 0xb3, 0x62, 0x17, -0xa7, 0x34, 0x76, 0x06, 0xcf, 0xc6, 0x5e, 0xc8, 0xbd, 0xe0, 0xd3, 0xc8, 0x15, 0x81, 0x85, 0x5d, -0xee, 0x1d, 0x8a, 0xee, 0x69, 0xf8, 0x4d, 0x04, 0x84, 0x70, 0x9e, 0xc4, 0x75, 0xa6, 0x33, 0xb2, -0x89, 0x52, 0x34, 0xb5, 0xf8, 0xdc, 0x00, 0xf4, 0x59, 0x0e, 0x3b, 0xd2, 0x97, 0x79, 0xb8, 0x14, -0xd9, 0x81, 0xb2, 0xfb, 0x48, 0xf7, 0xea, 0x09, 0x31, 0x76, 0x2a, 0x4d, 0x11, 0x45, 0x2a, 0xcb, -0xc8, 0xea, 0x45, 0xbf, 0xea, 0x8c, 0x36, 0xe1, 0xb6, 0x5f, 0xbd, 0x0d, 0xca, 0x56, 0x0b, 0xf5, -0xb9, 0x27, 0x1e, 0x55, 0xd8, 0x76, 0x4a, 0x53, 0xe3, 0x6c, 0x47, 0x54, 0x8d, 0x51, 0x2d, 0xbd, -0x9e, 0xa6, 0x38, 0xda, 0x86, 0x78, 0x13, 0x95, 0x24, 0xfe, 0x07, 0x65, 0xb7, 0x8f, 0xf0, 0xf2, -0x29, 0x00, 0x00}; -#endif /*__API_JS_H__*/ diff --git a/src/web/html/h/colorBright_css.h b/src/web/html/h/colorBright_css.h deleted file mode 100644 index 7968d278..00000000 --- a/src/web/html/h/colorBright_css.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __COLORBRIGHT_CSS_H__ -#define __COLORBRIGHT_CSS_H__ -#define colorBright_css_len 261 -const uint8_t colorBright_css[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x55, 0x90, 0xdd, 0x6e, 0xc3, 0x20, -0x0c, 0x85, 0x5f, 0x65, 0x52, 0xae, 0x91, 0xbc, 0xfc, 0x42, 0xf6, 0x34, 0x60, 0x9c, 0x06, 0x29, -0x85, 0x8a, 0xd0, 0x54, 0xd3, 0xb4, 0x77, 0x1f, 0xa6, 0x4d, 0x96, 0x8a, 0x1b, 0xfc, 0xf9, 0x70, -0xec, 0xc3, 0x18, 0x43, 0x48, 0x1f, 0x3f, 0x42, 0x98, 0xcb, 0x58, 0x4d, 0xd3, 0xf4, 0x25, 0xc4, -0x94, 0x6f, 0x00, 0x50, 0x6e, 0xf5, 0x0e, 0x9d, 0x9f, 0x42, 0xc1, 0x60, 0x6d, 0x2e, 0x1f, 0x3a, -0x7a, 0x6e, 0x0d, 0x43, 0x11, 0xae, 0x77, 0x44, 0x5a, 0x57, 0x16, 0x28, 0x55, 0x88, 0xf3, 0xb7, -0x7b, 0x2a, 0xa6, 0x44, 0x94, 0xeb, 0xa4, 0xcd, 0x42, 0xc2, 0x84, 0x68, 0x29, 0x8e, 0x15, 0x22, -0x66, 0xe6, 0xf5, 0x56, 0x14, 0x4d, 0xd3, 0xe4, 0xea, 0x16, 0xdd, 0x55, 0xc7, 0x6f, 0xf6, 0xe8, -0x09, 0xe1, 0x9f, 0x88, 0x39, 0x6c, 0xfc, 0x08, 0xda, 0x96, 0x64, 0xcf, 0xd3, 0x08, 0x83, 0xb7, -0x2f, 0xed, 0x50, 0xa3, 0x7c, 0x79, 0x69, 0x4c, 0x6e, 0xa3, 0xb1, 0xea, 0xba, 0x8e, 0x97, 0xcf, -0xc1, 0x28, 0x96, 0x01, 0xb5, 0xe4, 0x93, 0xd9, 0x35, 0x58, 0xbd, 0x9c, 0xa2, 0x3a, 0xbf, 0xe9, -0xc5, 0xd9, 0x27, 0x51, 0x8a, 0xf7, 0x0c, 0x29, 0x2b, 0x66, 0xd2, 0x56, 0x24, 0x97, 0x96, 0xec, -0x26, 0xa9, 0x53, 0xd0, 0x1c, 0x2d, 0x96, 0x9a, 0xbc, 0x21, 0xb4, 0xfc, 0x7e, 0x7b, 0x93, 0x7e, -0x62, 0x2f, 0x9f, 0xe9, 0x5f, 0xbc, 0xa4, 0xab, 0x0d, 0xec, 0x62, 0xeb, 0xd6, 0xc3, 0x56, 0xca, -0x83, 0x8d, 0x95, 0x2a, 0xc3, 0x71, 0x7e, 0xb3, 0x03, 0x68, 0x50, 0xc2, 0x89, 0x9b, 0xcb, 0xe9, -0x77, 0xd2, 0x5a, 0xe0, 0xfe, 0x7d, 0xb9, 0xe4, 0x36, 0x67, 0xff, 0xfd, 0x03, 0x3b, 0xc9, 0xfb, -0x95, 0xd5, 0x01, 0x00, 0x00}; -#endif /*__COLORBRIGHT_CSS_H__*/ diff --git a/src/web/html/h/colorDark_css.h b/src/web/html/h/colorDark_css.h deleted file mode 100644 index a24f888b..00000000 --- a/src/web/html/h/colorDark_css.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __COLORDARK_CSS_H__ -#define __COLORDARK_CSS_H__ -#define colorDark_css_len 255 -const uint8_t colorDark_css[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x5d, 0x90, 0xd9, 0x6e, 0xc3, 0x20, -0x10, 0x45, 0x7f, 0xa5, 0x92, 0x9f, 0x91, 0x58, 0x6c, 0xc7, 0x72, 0xbf, 0x66, 0xd8, 0x6a, 0x24, -0x07, 0x22, 0x20, 0x44, 0x55, 0xd5, 0x7f, 0x2f, 0x0c, 0x76, 0xd2, 0x56, 0xbc, 0xcc, 0x9c, 0xb9, -0xdc, 0x59, 0xd6, 0x18, 0x42, 0x7e, 0xfb, 0x22, 0x44, 0x7e, 0xac, 0x03, 0xe7, 0xfc, 0x9d, 0x10, -0x5b, 0x23, 0xa5, 0x14, 0x46, 0x7c, 0x1d, 0xac, 0xb5, 0x35, 0x74, 0xde, 0x86, 0x75, 0xa0, 0xf4, -0xc2, 0xd5, 0x52, 0xd3, 0x07, 0x44, 0xdf, 0x4a, 0x00, 0x94, 0xd6, 0x34, 0xdd, 0x95, 0x32, 0x29, -0x35, 0x81, 0x94, 0x48, 0x9c, 0xbf, 0xdd, 0x33, 0x9a, 0x0a, 0x21, 0x6a, 0x9e, 0x41, 0xee, 0x86, -0xc8, 0x10, 0xb5, 0x89, 0x27, 0xf3, 0x50, 0x7e, 0x29, 0x6e, 0xd1, 0x5d, 0x21, 0x7e, 0x36, 0x8f, -0x51, 0x2f, 0x97, 0x17, 0x21, 0x5b, 0x28, 0xed, 0x13, 0xe5, 0x82, 0x4d, 0x53, 0xeb, 0x66, 0x54, -0xf0, 0xfa, 0xd0, 0x1e, 0x03, 0x35, 0x2f, 0x50, 0xd9, 0x15, 0xb3, 0x0e, 0x13, 0xaa, 0x6c, 0x5d, -0xcc, 0xc4, 0xbe, 0xd7, 0xd2, 0x5e, 0x65, 0xd7, 0xa0, 0x61, 0x47, 0x34, 0xcf, 0x33, 0x4e, 0x59, -0x60, 0x77, 0x1a, 0xc9, 0x88, 0x73, 0xe7, 0x90, 0xab, 0x62, 0x33, 0xa0, 0x49, 0x76, 0x79, 0xef, -0x6e, 0x13, 0x63, 0xcf, 0xd2, 0xf1, 0x79, 0xc6, 0x53, 0xb9, 0xf2, 0x47, 0xca, 0xd8, 0x21, 0x3d, -0x79, 0x3f, 0xea, 0x4b, 0xac, 0x5d, 0x3a, 0xb5, 0x7d, 0xe9, 0xce, 0x6a, 0xf3, 0x71, 0xac, 0x99, -0xda, 0xfe, 0xd9, 0x71, 0x8e, 0xab, 0x9c, 0xbc, 0xdb, 0x09, 0x81, 0xb3, 0xe7, 0x84, 0xf0, 0x79, -0xe0, 0x84, 0xe5, 0xb6, 0xfb, 0xf7, 0x0f, 0xe9, 0x86, 0x9e, 0xcf, 0xd5, 0x01, 0x00, 0x00}; -#endif /*__COLORDARK_CSS_H__*/ diff --git a/src/web/html/h/favicon_ico.h b/src/web/html/h/favicon_ico.h deleted file mode 100644 index defec936..00000000 --- a/src/web/html/h/favicon_ico.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef __FAVICON_ICO_H__ -#define __FAVICON_ICO_H__ -#define favicon_ico_len 1534 -const uint8_t favicon_ico[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xed, 0x5c, 0x4b, 0x6c, 0x1b, 0x55, -0x14, 0x3d, 0x4e, 0x9c, 0xba, 0x48, 0x51, 0x93, 0x05, 0x48, 0x95, 0x88, 0x62, 0xf3, 0x59, 0x64, -0x97, 0xa0, 0x4a, 0x6d, 0x11, 0x51, 0x5d, 0x21, 0x40, 0x88, 0xa6, 0xec, 0xb2, 0x42, 0x95, 0xb2, -0x2a, 0xec, 0xa0, 0xa2, 0xcd, 0x58, 0x22, 0x90, 0x49, 0xf3, 0xe9, 0x07, 0x5a, 0x3b, 0x69, 0x8b, -0x28, 0xb4, 0xa8, 0xad, 0x9b, 0xb6, 0x44, 0x7c, 0xa4, 0x02, 0x25, 0x69, 0x91, 0x6a, 0x67, 0x01, -0x9b, 0x2e, 0xd8, 0x56, 0x75, 0x22, 0x8b, 0x0d, 0xbb, 0x28, 0x4b, 0x2f, 0xac, 0x3c, 0xee, 0x9d, -0x79, 0xe3, 0x38, 0x93, 0x89, 0xff, 0xf1, 0x4b, 0xfc, 0xf2, 0xa4, 0xa3, 0x63, 0x8f, 0xe7, 0xcd, -0xb9, 0xe7, 0xcc, 0x78, 0xe6, 0x65, 0xde, 0xc4, 0x80, 0x0f, 0xcd, 0x68, 0x6f, 0x07, 0x71, 0x08, -0x1f, 0xf9, 0x81, 0xfd, 0x00, 0x42, 0x21, 0xfb, 0xfd, 0x3d, 0x5a, 0xfe, 0x3d, 0x2d, 0x3b, 0x7c, -0xd8, 0x7e, 0xdf, 0xf5, 0x26, 0xf0, 0xce, 0x0b, 0x40, 0x17, 0xad, 0xd3, 0xce, 0xeb, 0xc1, 0x5e, -0xbe, 0x51, 0x5b, 0x48, 0x46, 0xcd, 0x85, 0x64, 0x4c, 0x10, 0x0c, 0x71, 0x1b, 0xd7, 0x09, 0x42, -0x4c, 0xe3, 0xe9, 0x23, 0x03, 0xbd, 0x73, 0x06, 0x04, 0x83, 0x5f, 0x0f, 0xf6, 0xe1, 0x29, 0x41, -0x18, 0x7d, 0xb8, 0xde, 0xdd, 0x09, 0xa3, 0x27, 0x08, 0xc1, 0x58, 0x98, 0x8f, 0x8d, 0xc8, 0x6d, -0x54, 0xd6, 0xdf, 0xd2, 0x8e, 0x9a, 0xcf, 0x1e, 0x4f, 0x75, 0x54, 0xde, 0xdf, 0xda, 0xc6, 0x07, -0x22, 0x8e, 0x8f, 0x2b, 0xef, 0x4f, 0xf5, 0x4f, 0xa3, 0x87, 0xfa, 0x8f, 0x56, 0xdc, 0x9f, 0xeb, -0x9f, 0xc6, 0x30, 0x61, 0xa0, 0xe2, 0xfe, 0x5c, 0xff, 0x6d, 0x7c, 0x36, 0x3b, 0x88, 0xfd, 0x15, -0xf7, 0xa7, 0xfa, 0x79, 0xdf, 0x52, 0xdf, 0xd1, 0x6a, 0xfa, 0x3b, 0xdb, 0xa8, 0xa6, 0x3f, 0xb7, -0xbf, 0x4e, 0xe0, 0xb9, 0x32, 0xfd, 0x8f, 0xb9, 0x8f, 0xd3, 0xc1, 0x23, 0x18, 0x2b, 0x31, 0xff, -0x0b, 0x1b, 0x1d, 0xeb, 0xc6, 0x51, 0x8c, 0x17, 0xec, 0x7f, 0x0b, 0x07, 0x50, 0xa4, 0x9d, 0x7c, -0x0f, 0x07, 0xbc, 0xfa, 0xa7, 0xe6, 0xa3, 0x03, 0x28, 0xb1, 0xf5, 0x84, 0x30, 0xb0, 0xa6, 0x7f, -0x22, 0x76, 0xd1, 0x6b, 0xbd, 0xc7, 0x26, 0x76, 0x33, 0x3c, 0xb7, 0xd1, 0x89, 0x09, 0xab, 0xff, -0x06, 0x7d, 0x67, 0x4c, 0xec, 0x9a, 0x8b, 0xe0, 0x57, 0xda, 0x7f, 0x73, 0x9c, 0xff, 0x46, 0xdb, -0x28, 0x54, 0x67, 0x13, 0xa1, 0x99, 0x61, 0x12, 0x12, 0x40, 0x20, 0x0d, 0xb4, 0x2d, 0x03, 0xc1, -0x0c, 0x70, 0x68, 0x08, 0x18, 0x3a, 0x64, 0x9f, 0x67, 0xf8, 0xec, 0x72, 0xb8, 0xf4, 0xf3, 0x8c, -0x83, 0x25, 0x5e, 0x2e, 0xee, 0xa0, 0x57, 0xee, 0xf3, 0x55, 0xc4, 0x71, 0x9f, 0x3f, 0x9b, 0x8d, -0xc0, 0x70, 0xbe, 0x03, 0x0e, 0x78, 0x19, 0x7f, 0x76, 0xaa, 0x0f, 0xf7, 0xf9, 0x78, 0xc8, 0x07, -0xed, 0xdf, 0x5e, 0xcb, 0x57, 0x10, 0x4b, 0x4e, 0xbe, 0x0e, 0xac, 0x1a, 0xac, 0x73, 0x95, 0x1a, -0xfd, 0xd4, 0x7c, 0x6c, 0xdc, 0x55, 0x43, 0x5d, 0xf5, 0x59, 0x73, 0x31, 0x11, 0x3b, 0x9f, 0x57, -0x43, 0xdd, 0xf5, 0xad, 0x1a, 0x92, 0xb1, 0x51, 0x5e, 0x87, 0xf8, 0x53, 0x15, 0xfa, 0x16, 0xe6, -0xa3, 0xe7, 0x9c, 0xe3, 0x52, 0x89, 0xbe, 0x55, 0x43, 0x6c, 0xc4, 0xd2, 0x9f, 0xc6, 0x7e, 0x25, -0xfa, 0x72, 0xff, 0x5b, 0x35, 0xf0, 0x35, 0x4f, 0x91, 0xbe, 0x98, 0x42, 0x40, 0xd6, 0x30, 0xa1, -0x44, 0x9f, 0xf7, 0x3f, 0x5d, 0xb3, 0x65, 0x0d, 0x63, 0x4a, 0xf4, 0x6d, 0xdf, 0x5f, 0xe4, 0x6a, -0x50, 0xa3, 0xbf, 0x5a, 0x43, 0x1c, 0x6f, 0x2b, 0xd2, 0xcf, 0xd5, 0xa0, 0x50, 0x9f, 0xc7, 0x2f, -0x27, 0xf8, 0xb3, 0x87, 0x11, 0x0c, 0x28, 0xd1, 0x97, 0xfb, 0xdf, 0x1a, 0x7f, 0x45, 0x30, 0xa1, -0x52, 0xdf, 0x5d, 0x83, 0x0a, 0x7d, 0x39, 0x0e, 0x3d, 0xa3, 0x52, 0xdf, 0xa9, 0x41, 0xa5, 0x3e, -0xb7, 0x07, 0xa7, 0xf0, 0x8a, 0x4a, 0x7d, 0xa7, 0x6d, 0xb2, 0xbe, 0x59, 0x4c, 0x9f, 0xf4, 0xcc, -0x4d, 0xd2, 0xff, 0x46, 0x08, 0x1a, 0xca, 0x16, 0x6f, 0x3e, 0xd2, 0x9c, 0xac, 0xa9, 0x7e, 0x1c, -0x57, 0x4b, 0xd4, 0xf6, 0xac, 0xa1, 0x2a, 0xfd, 0xf2, 0xb5, 0x73, 0x35, 0x90, 0xee, 0x54, 0x95, -0xfa, 0xdf, 0x56, 0xa8, 0xbd, 0xa6, 0x86, 0x8a, 0xf4, 0x67, 0xd0, 0x5a, 0xa5, 0x76, 0xae, 0x06, -0xb3, 0x1f, 0xad, 0x95, 0x8c, 0xbf, 0x6a, 0xdd, 0x4a, 0xd1, 0x4f, 0x25, 0x63, 0x97, 0x36, 0x4b, -0xff, 0xb5, 0x20, 0x2e, 0x15, 0xd2, 0x4f, 0x25, 0x26, 0xbf, 0x13, 0xc2, 0x6c, 0xc2, 0xe6, 0x35, -0x1f, 0x69, 0x5e, 0xf6, 0xd2, 0xaf, 0x44, 0x7b, 0xee, 0x24, 0x5e, 0x62, 0x54, 0x53, 0x83, 0xd4, -0xbf, 0x56, 0xae, 0xf6, 0x23, 0x03, 0x9d, 0x74, 0xdd, 0x59, 0x9c, 0x1b, 0xc4, 0xbf, 0x7f, 0x46, -0xf0, 0x72, 0x05, 0x35, 0x5c, 0x91, 0xfa, 0x65, 0x6b, 0xff, 0x11, 0x41, 0x88, 0xc6, 0x40, 0x69, -0xe7, 0xda, 0xcf, 0xaf, 0x79, 0x59, 0x25, 0x35, 0xf8, 0x77, 0xb7, 0x87, 0xc6, 0x08, 0x6f, 0x11, -0x5e, 0x25, 0x3c, 0x4f, 0x68, 0x25, 0xf0, 0xf2, 0x5d, 0x84, 0x16, 0x7e, 0x7d, 0x96, 0xf0, 0x2e, -0xa1, 0x8b, 0xb0, 0xd7, 0xfe, 0xcc, 0xdf, 0x4a, 0xd8, 0x43, 0x68, 0x63, 0xc4, 0x08, 0xff, 0x10, -0x96, 0x57, 0x11, 0xcc, 0x84, 0xfc, 0xe1, 0x6c, 0xc8, 0x3f, 0xbc, 0x12, 0xf2, 0x0b, 0x11, 0x0a, -0x08, 0x91, 0x76, 0xd0, 0xb6, 0x32, 0xbc, 0x1c, 0xcc, 0x86, 0x33, 0xe1, 0x4c, 0x30, 0xdb, 0x25, -0xef, 0x51, 0x98, 0xe5, 0xdf, 0xa7, 0xf0, 0xfa, 0xdb, 0x2d, 0x95, 0xdf, 0x87, 0xc6, 0x8b, 0xc6, -0xba, 0x6b, 0x98, 0x17, 0xa6, 0x71, 0xdc, 0x35, 0x9e, 0x58, 0x72, 0x8f, 0x2f, 0x3d, 0xb0, 0xe4, -0xba, 0x0f, 0x76, 0xdc, 0x7d, 0xdd, 0xf3, 0xc4, 0x11, 0x7b, 0x9c, 0x92, 0x77, 0x4e, 0x48, 0xb9, -0xbf, 0x93, 0x5e, 0xf0, 0xb8, 0x4f, 0xa2, 0x9d, 0xff, 0xa2, 0x19, 0x68, 0xe0, 0xdf, 0xba, 0x47, -0x93, 0x88, 0x9e, 0xd6, 0xcd, 0xff, 0xc2, 0xfc, 0xe4, 0x85, 0xa2, 0x19, 0x34, 0xb2, 0x7f, 0x7b, -0x6c, 0xf0, 0x55, 0xc1, 0x0c, 0x1a, 0xdc, 0xbf, 0x67, 0x06, 0xc9, 0xd8, 0xa8, 0x4e, 0xfe, 0xed, -0x0c, 0xa2, 0x5f, 0x7a, 0x66, 0xa0, 0x89, 0x7f, 0xaf, 0x0c, 0x52, 0xc9, 0xc9, 0x31, 0x9d, 0xfc, -0xdb, 0x73, 0x5b, 0xf6, 0xdc, 0xc5, 0x6a, 0x06, 0xb1, 0x0f, 0x75, 0xf2, 0x9f, 0x3f, 0x77, 0xe2, -0xd5, 0x74, 0xf0, 0x5f, 0x28, 0x03, 0x5d, 0xfc, 0xbb, 0xe7, 0x8e, 0xb4, 0xf4, 0x6f, 0x61, 0x72, -0xd8, 0xe5, 0x7f, 0x40, 0x2b, 0xff, 0xae, 0xf3, 0xff, 0xba, 0xf9, 0x2b, 0x0d, 0xfd, 0x97, 0x94, -0x41, 0x83, 0xfb, 0x97, 0x19, 0x9c, 0xd1, 0xcd, 0xbf, 0xb8, 0x89, 0x17, 0xd7, 0xbc, 0x8f, 0xe3, -0xa2, 0x56, 0xfe, 0xf9, 0xfc, 0x2f, 0xe7, 0x90, 0xf3, 0x32, 0x38, 0xab, 0x95, 0x7f, 0xd7, 0xdc, -0xad, 0x67, 0x06, 0x8d, 0xef, 0x7f, 0x4d, 0x06, 0x3c, 0xaf, 0x40, 0xef, 0x27, 0x35, 0xf3, 0xcf, -0x73, 0x49, 0x9f, 0x7b, 0x66, 0xa0, 0x8b, 0x7f, 0xef, 0x0c, 0xa6, 0xb4, 0xf2, 0x2f, 0x9f, 0x63, -0x75, 0x65, 0xd0, 0xa1, 0x99, 0x7f, 0x3e, 0xe6, 0x87, 0x36, 0x9c, 0x57, 0xd2, 0xc1, 0xbf, 0xeb, -0x38, 0xd0, 0xd4, 0xbf, 0x67, 0x06, 0x9a, 0xf9, 0xe7, 0x73, 0xe2, 0xfb, 0xf9, 0xfd, 0x1e, 0x46, -0x70, 0x49, 0x2b, 0xff, 0xae, 0xf3, 0xbf, 0x00, 0x7c, 0xb3, 0x06, 0x2e, 0xeb, 0xea, 0xbf, 0xc4, -0x0c, 0x1a, 0xda, 0xbf, 0x93, 0xc1, 0x5c, 0x04, 0x57, 0x74, 0xf5, 0x5f, 0x24, 0x03, 0x2d, 0xfc, -0x17, 0xc8, 0x40, 0x1b, 0xff, 0xb9, 0x0c, 0x0c, 0x7c, 0xad, 0xab, 0x7f, 0x8f, 0x0c, 0xb4, 0xf3, -0xef, 0xca, 0x40, 0x4b, 0xff, 0x79, 0xe7, 0x83, 0x09, 0x5d, 0xfd, 0x7b, 0x3e, 0xf7, 0xbb, 0xe3, -0x7f, 0xc7, 0xff, 0xf6, 0xf5, 0x7f, 0xac, 0x6a, 0xff, 0x47, 0x71, 0x6c, 0x5b, 0xfa, 0x8f, 0xe3, -0xae, 0x98, 0xb1, 0xfe, 0x9d, 0xb4, 0xaa, 0x66, 0x9a, 0x68, 0xa2, 0x0c, 0x6e, 0x6c, 0x2b, 0xff, -0x35, 0xf2, 0x5e, 0x56, 0x06, 0x5b, 0xc7, 0xff, 0x3d, 0xf1, 0x18, 0xfe, 0x5a, 0x3f, 0xe0, 0xcd, -0x19, 0x9c, 0xea, 0xc3, 0xcd, 0x2d, 0xee, 0x7f, 0x53, 0xbc, 0x3b, 0xad, 0xbf, 0x1f, 0xcd, 0x1b, -0x66, 0xa0, 0xde, 0xff, 0x0f, 0x9b, 0xe9, 0x3d, 0x3f, 0x03, 0xf2, 0x7b, 0x6b, 0x8b, 0xf9, 0xaf, -0x8b, 0xf7, 0x82, 0x19, 0xa8, 0xf3, 0x5f, 0x57, 0xef, 0x6b, 0xbe, 0x0b, 0x47, 0x11, 0x57, 0xec, -0x7f, 0x46, 0x85, 0x77, 0xcf, 0x0c, 0xea, 0xef, 0x5f, 0xa9, 0xf7, 0x75, 0x19, 0xd4, 0xd3, 0x7f, -0x1c, 0xdd, 0xb5, 0xbc, 0xbe, 0xd7, 0x22, 0x03, 0xa3, 0x0f, 0xdd, 0x2a, 0x9e, 0x7f, 0xd9, 0xaa, -0x6d, 0xc7, 0xff, 0x8e, 0xff, 0x5a, 0xf9, 0x5f, 0x4c, 0x46, 0x6f, 0x6c, 0x3b, 0xff, 0x9d, 0xb8, -0x51, 0x23, 0xff, 0x3f, 0x3e, 0x79, 0x72, 0xb5, 0x65, 0xbb, 0xf9, 0xef, 0x07, 0x9a, 0xc9, 0xdf, -0x74, 0x95, 0xfe, 0xb7, 0xa5, 0xf7, 0x72, 0x32, 0x68, 0x54, 0xef, 0xae, 0x0c, 0xee, 0x94, 0xe9, -0xff, 0xa7, 0x46, 0xf0, 0x5e, 0x4a, 0x06, 0x2a, 0xbd, 0xcf, 0x1a, 0x18, 0x67, 0xd4, 0x2b, 0x83, -0xee, 0x20, 0xee, 0x16, 0xf1, 0x5f, 0x3f, 0xef, 0x11, 0x9c, 0xce, 0xcd, 0x79, 0x0d, 0xe2, 0xbc, -0xaa, 0x0c, 0xf2, 0x9e, 0xf1, 0xff, 0xed, 0xd9, 0x83, 0xa9, 0x40, 0x3d, 0xea, 0x78, 0x68, 0x60, -0x64, 0xdd, 0xef, 0xec, 0x18, 0x38, 0x57, 0x0f, 0xed, 0x7d, 0xfb, 0xd0, 0x42, 0xbe, 0x7f, 0x76, -0xf9, 0xff, 0x5d, 0xa5, 0x77, 0x45, 0x19, 0xfc, 0x22, 0xfd, 0x6f, 0x09, 0xef, 0xb9, 0xdf, 0x1c, -0xa0, 0x75, 0xea, 0x99, 0x01, 0x0e, 0x22, 0x1d, 0x40, 0x07, 0x4c, 0xc9, 0x09, 0xc9, 0x69, 0xc9, -0x9f, 0x48, 0x3e, 0x28, 0xb9, 0x43, 0xf2, 0x1e, 0xc9, 0x01, 0xc9, 0xcd, 0xb3, 0x36, 0xfb, 0x32, -0x36, 0xc3, 0xe1, 0x88, 0x64, 0xb9, 0x1e, 0x7a, 0x25, 0x1f, 0x92, 0x1c, 0x96, 0xfc, 0x86, 0x69, -0xf3, 0xeb, 0x09, 0xb9, 0x7e, 0x5a, 0xf2, 0x80, 0xe4, 0x1e, 0xc9, 0x7b, 0x25, 0xb7, 0x4a, 0x0e, -0x48, 0x6e, 0x96, 0xec, 0x5b, 0xab, 0xb7, 0xca, 0xcb, 0x92, 0x33, 0x92, 0xb3, 0x92, 0x57, 0x24, -0x0b, 0x87, 0xcf, 0x48, 0xfe, 0x5b, 0xf2, 0x7f, 0x92, 0x45, 0x49, 0xec, 0x13, 0xc2, 0xb4, 0xea, -0x11, 0x22, 0x61, 0xd5, 0x27, 0x44, 0x9a, 0xb9, 0x4d, 0x88, 0x65, 0xe6, 0xa0, 0x10, 0x19, 0xe6, -0xb0, 0x10, 0x59, 0xe6, 0x61, 0x21, 0x56, 0x98, 0x05, 0x35, 0xf6, 0xcf, 0x7c, 0x8d, 0x72, 0x61, -0xce, 0x16, 0xe7, 0x61, 0xe6, 0x15, 0x7e, 0xe0, 0x94, 0x1b, 0x7c, 0x36, 0x9b, 0xa4, 0xbe, 0x42, -0x1f, 0x25, 0x48, 0x3d, 0x1b, 0xe6, 0xdf, 0x86, 0x20, 0x55, 0x52, 0x5e, 0x66, 0xf0, 0xeb, 0xb0, -0xfd, 0x9b, 0x11, 0xd9, 0xff, 0x01, 0xd3, 0x39, 0x74, 0x2c, 0x6e, 0x57, 0x00, 0x00}; -#endif /*__FAVICON_ICO_H__*/ diff --git a/src/web/html/h/index_html.h b/src/web/html/h/index_html.h deleted file mode 100644 index 7ae17e4c..00000000 --- a/src/web/html/h/index_html.h +++ /dev/null @@ -1,191 +0,0 @@ -#ifndef __INDEX_HTML_H__ -#define __INDEX_HTML_H__ -#define index_html_len 2967 -const uint8_t index_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xbd, 0x5a, 0xff, 0x6f, 0xdb, 0x36, -0x16, 0xff, 0xbd, 0x7f, 0x05, 0xa7, 0xc3, 0xb5, 0xf2, 0xc5, 0x96, 0x9c, 0xa4, 0x4d, 0x7b, 0x89, -0xe3, 0x21, 0x4b, 0xb2, 0x2d, 0x87, 0xae, 0x2d, 0xea, 0xf4, 0x8a, 0xa1, 0x28, 0x02, 0x5a, 0xa2, -0x6d, 0xb6, 0x32, 0x29, 0x88, 0x94, 0x5d, 0x6f, 0xeb, 0xff, 0x7e, 0xef, 0x51, 0x5f, 0x6c, 0x59, -0xa2, 0x6c, 0xaf, 0xbb, 0x19, 0x08, 0x62, 0x51, 0xe4, 0xe3, 0xe7, 0x7d, 0x7f, 0x8f, 0xf4, 0xe0, -0xbb, 0x50, 0x06, 0x7a, 0x15, 0x33, 0x32, 0xd3, 0xf3, 0x68, 0xf8, 0x68, 0x90, 0xfd, 0x23, 0xf0, -0x19, 0xcc, 0x18, 0x0d, 0xb3, 0xaf, 0xe6, 0x51, 0x73, 0x1d, 0xb1, 0xe1, 0x9d, 0x08, 0xd9, 0x97, -0x81, 0x9f, 0x3d, 0xac, 0x5f, 0x46, 0x5c, 0x7c, 0x26, 0x09, 0x8b, 0x2e, 0x1d, 0xa5, 0x57, 0x11, -0x53, 0x33, 0xc6, 0xb4, 0x43, 0x90, 0xf0, 0xa5, 0xa3, 0xd9, 0x17, 0xed, 0x07, 0x4a, 0x39, 0x64, -0x96, 0xb0, 0x49, 0x3e, 0xc3, 0x83, 0x81, 0xef, 0x17, 0x97, 0x7d, 0xef, 0x85, 0xd7, 0xef, 0xf7, -0x8f, 0x1d, 0x1f, 0xf6, 0x9e, 0x33, 0x4d, 0x89, 0xa0, 0x73, 0x58, 0xb3, 0xe0, 0x6c, 0x19, 0xcb, -0x04, 0x68, 0x04, 0x52, 0x68, 0x26, 0xf4, 0xa5, 0xb3, 0xe4, 0xa1, 0x9e, 0x5d, 0x86, 0x6c, 0xc1, -0x03, 0xd6, 0x33, 0x0f, 0x5d, 0xc2, 0x05, 0xd7, 0x9c, 0x46, 0x3d, 0x15, 0xd0, 0x88, 0x5d, 0x1e, -0x3b, 0x05, 0x91, 0x60, 0x46, 0x13, 0xc5, 0x60, 0xd1, 0xbb, 0xfb, 0x1f, 0x7b, 0x2f, 0x70, 0x58, -0x05, 0x09, 0x8f, 0xf5, 0x26, 0xa2, 0x4f, 0x74, 0x41, 0xb3, 0x51, 0x87, 0xa8, 0x24, 0xb8, 0x74, -0x68, 0xcc, 0xbd, 0x4f, 0x15, 0x50, 0xc3, 0x81, 0x9f, 0xcd, 0x00, 0x02, 0x87, 0x70, 0x18, 0xc8, -0x48, 0x26, 0x6a, 0x07, 0x8b, 0x89, 0x1c, 0x4b, 0xad, 0x36, 0x18, 0x14, 0x92, 0xa3, 0x70, 0xbb, -0x44, 0xc8, 0x89, 0x8c, 0x22, 0xb9, 0x74, 0x88, 0x9f, 0xab, 0xc2, 0x5f, 0xeb, 0x62, 0x30, 0x96, -0xe1, 0x6a, 0x43, 0xf2, 0x21, 0x5f, 0x90, 0x20, 0xa2, 0x4a, 0x01, 0x0c, 0x19, 0x0b, 0xba, 0x70, -0xf2, 0x79, 0x34, 0x07, 0xe3, 0x6f, 0x62, 0x28, 0xa7, 0xa2, 0xfe, 0x9c, 0xe1, 0xd5, 0x4c, 0xae, -0x6e, 0xee, 0xdf, 0x0d, 0x7c, 0xba, 0xb5, 0x68, 0x2d, 0x9c, 0xf3, 0x85, 0xe4, 0xa1, 0xdb, 0xef, -0x5c, 0x94, 0x6b, 0x39, 0x20, 0x76, 0x88, 0x14, 0x41, 0xc4, 0x83, 0xcf, 0xc5, 0xae, 0x6e, 0xc7, -0xd9, 0x00, 0xa5, 0x62, 0x2a, 0x50, 0x78, 0xf8, 0xef, 0xe0, 0xd1, 0x35, 0x1a, 0xe4, 0x8d, 0x87, -0x25, 0x63, 0x05, 0x80, 0xb9, 0x1c, 0x73, 0x44, 0xbf, 0xa6, 0x41, 0xcd, 0x34, 0x98, 0x73, 0x5a, -0x4e, 0x9a, 0xf1, 0x90, 0x15, 0xfa, 0xf0, 0x23, 0xbe, 0x60, 0x15, 0xc5, 0xbe, 0x84, 0x81, 0x72, -0x9f, 0x2a, 0x89, 0xa7, 0xcd, 0x24, 0x14, 0x4b, 0xc0, 0xd2, 0x2a, 0x44, 0xde, 0xb3, 0x71, 0x36, -0x6a, 0xa1, 0xf4, 0xcc, 0x46, 0x49, 0xa7, 0x71, 0x85, 0xd0, 0x88, 0x69, 0xcd, 0xc5, 0x54, 0x55, -0xe9, 0xa0, 0x44, 0x0a, 0x02, 0x8a, 0xc5, 0x2c, 0xa1, 0x5a, 0x26, 0x4e, 0x5d, 0x80, 0xe5, 0x7e, -0x67, 0xcd, 0xfb, 0xa5, 0x71, 0x48, 0x75, 0x95, 0xfd, 0x77, 0x66, 0xc8, 0x02, 0xfb, 0xb9, 0x05, -0xf6, 0x4a, 0x69, 0x36, 0xaf, 0xe2, 0x36, 0x43, 0xdf, 0x88, 0xfa, 0x45, 0xb9, 0x03, 0x38, 0x20, -0x78, 0x14, 0x4d, 0xa6, 0xe8, 0xb9, 0x0f, 0xe3, 0x88, 0x8a, 0xcf, 0xce, 0xf0, 0xed, 0xed, 0xe8, -0x9e, 0x5c, 0xbd, 0xb9, 0xb3, 0x80, 0xfd, 0x77, 0xb1, 0x7a, 0xa6, 0x75, 0xac, 0xce, 0x7d, 0x9f, -0x82, 0x49, 0x87, 0x3a, 0xf5, 0x10, 0xf9, 0x36, 0xad, 0x1b, 0x19, 0xa4, 0x73, 0xf0, 0x35, 0xaa, -0xb9, 0x14, 0x16, 0x82, 0xc7, 0xfd, 0x35, 0x9e, 0xb1, 0x4c, 0x75, 0x85, 0xe1, 0x2b, 0x1c, 0xf9, -0x46, 0x7e, 0xfb, 0x16, 0x13, 0x95, 0x53, 0x2e, 0xc0, 0x30, 0xf1, 0x9f, 0x0d, 0x9a, 0x75, 0x25, -0xa0, 0x32, 0x4b, 0x37, 0xd1, 0x0d, 0x7c, 0x70, 0x9f, 0x2d, 0x47, 0x5a, 0xf2, 0x09, 0xcf, 0xdc, -0xb7, 0xf0, 0x65, 0x31, 0x91, 0x08, 0xd6, 0x4c, 0xdd, 0x58, 0x51, 0x5d, 0x95, 0xd0, 0x18, 0x18, -0xdb, 0x70, 0xb8, 0xca, 0xeb, 0x3c, 0x80, 0x6d, 0xbd, 0x36, 0x53, 0xe2, 0xfa, 0x58, 0x4d, 0x68, -0x21, 0x53, 0x68, 0x90, 0x9a, 0xcf, 0xd9, 0x39, 0xc9, 0xc5, 0x96, 0x4d, 0x40, 0xe2, 0xa9, 0x79, -0x51, 0xca, 0x73, 0x30, 0x4e, 0xfc, 0x7d, 0x69, 0xde, 0x8e, 0xde, 0xf4, 0xee, 0x9b, 0xa9, 0xa2, -0xf5, 0xd7, 0x75, 0x54, 0x92, 0xf2, 0xe3, 0x6f, 0xe1, 0x25, 0xf3, 0x0a, 0x72, 0x07, 0xa2, 0x55, -0xe7, 0xb6, 0x3d, 0x2a, 0x12, 0xe4, 0x8b, 0x52, 0x07, 0xd6, 0x79, 0x85, 0xe6, 0x93, 0xdd, 0x53, -0x8d, 0xce, 0x68, 0x22, 0x1e, 0x2a, 0xda, 0x6d, 0xe4, 0xf2, 0x91, 0x95, 0x80, 0x90, 0x9a, 0x39, -0x96, 0x4d, 0x66, 0xa7, 0xc3, 0x51, 0x1a, 0x63, 0x7e, 0x26, 0x7a, 0xc6, 0x15, 0x89, 0x13, 0xf9, -0x89, 0x05, 0x1a, 0x98, 0x85, 0x37, 0xcd, 0x4b, 0xd2, 0xa8, 0xf9, 0x45, 0x5e, 0x3d, 0x0c, 0xcb, -0xcc, 0x53, 0xf8, 0xf1, 0x94, 0xeb, 0x59, 0x3a, 0xf6, 0x02, 0x39, 0xf7, 0xa3, 0x74, 0x4e, 0xe3, -0xd4, 0x78, 0xb6, 0x3f, 0x8e, 0xe4, 0xd8, 0x9f, 0x53, 0x2e, 0x7c, 0xc8, 0xd9, 0xfe, 0xf5, 0xcf, -0x57, 0xaf, 0x7e, 0xba, 0x1d, 0x79, 0xf3, 0xb0, 0xee, 0xec, 0xd7, 0x33, 0x2a, 0xa6, 0x0c, 0x9c, -0x03, 0x3d, 0x62, 0x00, 0x29, 0xa0, 0x1d, 0xc0, 0x0d, 0x57, 0x41, 0xaa, 0x14, 0x59, 0xc2, 0xbe, -0x24, 0x55, 0x90, 0xdf, 0x48, 0x0d, 0x53, 0x08, 0x73, 0x64, 0x12, 0x7a, 0xd3, 0xa9, 0xff, 0xfe, -0xb7, 0xd9, 0x97, 0xdb, 0x5f, 0xcf, 0x4e, 0xe6, 0x3f, 0x38, 0x66, 0x29, 0x0c, 0xef, 0xb7, 0xcf, -0x5b, 0x66, 0xe4, 0xb6, 0x2f, 0xbf, 0x5c, 0xa9, 0x14, 0x8c, 0xaa, 0xc6, 0x5d, 0x36, 0xbe, 0xdf, -0x96, 0xd7, 0xe0, 0xa0, 0x09, 0x1f, 0xa7, 0x9a, 0x11, 0x2d, 0xc9, 0xe1, 0x92, 0x7e, 0x07, 0x59, -0xee, 0xe1, 0x17, 0x2a, 0x52, 0x1a, 0x19, 0x49, 0xd7, 0xc0, 0x84, 0xdb, 0x71, 0x75, 0x37, 0xa6, -0x1a, 0x0a, 0xc1, 0xa7, 0x33, 0x1d, 0xad, 0x3c, 0xac, 0xb3, 0x2a, 0x38, 0x96, 0x32, 0xf9, 0x3c, -0x81, 0x6a, 0x48, 0xf9, 0x80, 0x30, 0x86, 0xc4, 0xff, 0x00, 0x35, 0x20, 0xe8, 0x35, 0xc6, 0x1d, -0xfd, 0x8d, 0xef, 0xfd, 0xd3, 0x22, 0xf8, 0xe3, 0x0c, 0xef, 0x37, 0x1e, 0x37, 0x65, 0x80, 0xa5, -0x88, 0x24, 0x35, 0xba, 0x22, 0x8f, 0xc9, 0x3d, 0x53, 0x9a, 0x6c, 0x90, 0x20, 0x13, 0x9e, 0xcc, -0xc1, 0x75, 0x58, 0xf7, 0x30, 0x31, 0x55, 0x51, 0xec, 0xb2, 0xcc, 0x9b, 0x8d, 0x0d, 0x0f, 0xb4, -0xd2, 0x39, 0xfd, 0xcc, 0x08, 0xad, 0x83, 0x8b, 0xe9, 0x2a, 0x46, 0xed, 0x30, 0xc0, 0x16, 0xa7, -0x2a, 0x98, 0x35, 0x6a, 0x49, 0xec, 0xa1, 0xa0, 0x81, 0x6f, 0x73, 0xd5, 0x41, 0x5c, 0x04, 0x21, -0x28, 0xfc, 0x1c, 0x3b, 0xce, 0xfb, 0x8d, 0x90, 0x40, 0x96, 0x54, 0x11, 0x05, 0x48, 0x34, 0x0b, -0xc9, 0x24, 0x91, 0xf3, 0x3a, 0xf4, 0xe5, 0x72, 0xe9, 0xcd, 0xf9, 0xe7, 0x44, 0x62, 0x1e, 0x49, -0xa0, 0xf0, 0x65, 0x89, 0x27, 0x98, 0xf6, 0xa1, 0xe8, 0xe3, 0x81, 0xff, 0xec, 0xe4, 0xd9, 0xf3, -0xe7, 0x2f, 0xea, 0x32, 0x34, 0x71, 0x27, 0xcc, 0x7c, 0x16, 0x78, 0xf2, 0x88, 0xfb, 0x4b, 0x9d, -0x46, 0xa7, 0x92, 0x48, 0x77, 0x87, 0xf8, 0x7a, 0xa0, 0xdc, 0x4e, 0x89, 0x96, 0x0c, 0x39, 0x91, -0x10, 0x2d, 0x37, 0x13, 0xe4, 0x66, 0xc8, 0x8e, 0xd8, 0x44, 0x57, 0x8b, 0xd5, 0xfd, 0x2b, 0x96, -0xbc, 0x40, 0x27, 0x8f, 0x03, 0x19, 0xaf, 0xc8, 0x49, 0xff, 0xe4, 0xb4, 0x5a, 0x1b, 0x6c, 0xeb, -0xaa, 0xd1, 0xb5, 0x9a, 0xc3, 0x56, 0xdd, 0x2c, 0xdb, 0xc2, 0xd8, 0x01, 0x31, 0xba, 0x4e, 0xf9, -0x27, 0x33, 0xaf, 0x4e, 0x78, 0x6d, 0x6b, 0xdb, 0xc5, 0x4a, 0x2e, 0xba, 0x04, 0x83, 0x82, 0xb3, -0x9b, 0xdf, 0xad, 0x0d, 0xf7, 0xf3, 0x5c, 0x78, 0x9e, 0x73, 0xad, 0xfc, 0xf1, 0xe4, 0xf9, 0xf3, -0x93, 0xe7, 0xcf, 0x00, 0xe6, 0xdd, 0x3d, 0x19, 0xfd, 0x7c, 0x75, 0x4e, 0xf2, 0x11, 0x72, 0x7e, -0x4e, 0x8a, 0xda, 0xcf, 0x2a, 0x15, 0xa3, 0x7f, 0xa6, 0xe2, 0x07, 0x6c, 0x05, 0x9d, 0x7d, 0x25, -0x17, 0x24, 0x0c, 0x7c, 0x71, 0xc1, 0x10, 0x83, 0x14, 0xca, 0x93, 0xc9, 0x14, 0x16, 0x06, 0x4c, -0x28, 0x06, 0x80, 0x56, 0x3d, 0x11, 0xf4, 0x14, 0xf5, 0x9f, 0x7a, 0x7d, 0x08, 0x2d, 0xac, 0x1e, -0x42, 0xc8, 0xf0, 0xfa, 0x9a, 0xfc, 0xf0, 0x6b, 0xef, 0xd5, 0x75, 0x6f, 0x74, 0x45, 0x60, 0xda, -0x1e, 0xb2, 0xdd, 0xb6, 0xdd, 0xd6, 0x8e, 0xb8, 0xca, 0xc2, 0x82, 0x26, 0x84, 0x7d, 0x61, 0xaf, -0x45, 0xc0, 0xc8, 0x25, 0xd1, 0x49, 0xca, 0x2e, 0x6a, 0xef, 0x35, 0x34, 0x83, 0xd7, 0x10, 0xd0, -0x2e, 0x49, 0xbf, 0xe1, 0xa5, 0x6a, 0x1e, 0x47, 0xf6, 0xb1, 0x4e, 0x82, 0xb7, 0x8e, 0x53, 0x7f, -0x0d, 0xed, 0x36, 0xa3, 0x0a, 0xf7, 0x14, 0x69, 0x14, 0x5d, 0x54, 0xab, 0x95, 0x49, 0x2a, 0x02, -0x0c, 0x67, 0x04, 0xda, 0x86, 0xeb, 0xb1, 0x2b, 0xc7, 0x9f, 0x3a, 0xe4, 0xf7, 0x9a, 0x4f, 0x1b, -0xe8, 0x40, 0xa0, 0x48, 0x51, 0x1e, 0x88, 0xf1, 0x36, 0x62, 0xf8, 0xf5, 0x87, 0xd5, 0x5d, 0xe8, -0x62, 0xd7, 0xff, 0x96, 0xa9, 0x34, 0xd2, 0x4e, 0xe7, 0xa2, 0xb6, 0x9a, 0x4f, 0x90, 0xee, 0x07, -0x47, 0xa5, 0x41, 0xc0, 0xa0, 0xbf, 0xff, 0xd8, 0xb4, 0x05, 0x7e, 0x98, 0xc7, 0x85, 0x60, 0xc9, -0xcf, 0xf7, 0xbf, 0xbc, 0x44, 0x5e, 0x0c, 0x63, 0x54, 0x84, 0x28, 0xb5, 0x00, 0xf2, 0x6e, 0xe8, -0x5c, 0x34, 0x2e, 0x03, 0x30, 0x57, 0x9f, 0xe8, 0x17, 0xd7, 0xf4, 0x3e, 0xbe, 0x69, 0xff, 0x9d, -0x2e, 0x89, 0xf1, 0xf0, 0xa2, 0x01, 0xcd, 0xd7, 0xda, 0x08, 0x8b, 0x14, 0xdb, 0x0b, 0xcf, 0x6d, -0x92, 0xc8, 0xe4, 0x1c, 0xbe, 0x1c, 0x11, 0xc3, 0x10, 0xc3, 0x67, 0xe7, 0x63, 0x75, 0x8f, 0xaf, -0x16, 0x01, 0x43, 0xc3, 0x8a, 0x75, 0xb4, 0x6b, 0x93, 0x2f, 0x56, 0xd3, 0xa8, 0x23, 0xb6, 0x24, -0x37, 0xf0, 0xd5, 0x6d, 0x80, 0x8e, 0xd3, 0x60, 0xe3, 0x7c, 0xd6, 0xeb, 0x31, 0xe6, 0x86, 0xa6, -0x79, 0x30, 0xc7, 0x0b, 0xe6, 0x21, 0x62, 0x86, 0x5d, 0x1f, 0x4c, 0xed, 0xdf, 0x3c, 0x6b, 0x41, -0x23, 0x98, 0x65, 0x44, 0x75, 0x27, 0xb4, 0x8b, 0x18, 0x50, 0xb7, 0x39, 0x50, 0x9f, 0x1c, 0x83, -0xd7, 0x36, 0x6c, 0x50, 0x95, 0xb8, 0x69, 0xc5, 0x41, 0xe2, 0xc6, 0x84, 0xba, 0xc4, 0x79, 0xf3, -0x7a, 0x74, 0x0f, 0x8f, 0xff, 0x19, 0xbd, 0x7e, 0xe5, 0x29, 0xa8, 0x99, 0xc4, 0x94, 0x4f, 0x56, -0xc6, 0xb4, 0x3a, 0xfb, 0x89, 0xca, 0xe0, 0xf9, 0x89, 0x81, 0xe8, 0x79, 0x60, 0x33, 0x49, 0x30, -0xaa, 0xdc, 0x99, 0x3a, 0x8d, 0xba, 0x33, 0x34, 0xa0, 0x79, 0x31, 0xeb, 0xeb, 0x1c, 0x98, 0xd7, -0x6f, 0x21, 0xeb, 0x35, 0xbc, 0x6f, 0x85, 0x05, 0x7d, 0x89, 0x0d, 0x92, 0xf1, 0x4f, 0x63, 0x18, -0x5a, 0x3d, 0x08, 0xb9, 0xdc, 0xb6, 0x0c, 0x9b, 0xa6, 0x2b, 0x4b, 0xc8, 0xbf, 0x6c, 0x42, 0xc7, -0xa5, 0x69, 0x5c, 0x6c, 0x31, 0xcd, 0xc4, 0xe3, 0x7c, 0x34, 0x4b, 0xf3, 0x06, 0xcf, 0xba, 0xe1, -0x4a, 0x6d, 0xaa, 0x19, 0xa8, 0xf8, 0xe4, 0xc5, 0xd9, 0x53, 0xd8, 0x86, 0xfc, 0x93, 0x9c, 0x9e, -0x3d, 0x6b, 0x5e, 0x36, 0x4b, 0x14, 0xa9, 0x2d, 0x3b, 0x3d, 0xcb, 0x56, 0x9d, 0x3c, 0x6d, 0x5e, -0x34, 0xe7, 0xa2, 0xbe, 0xe8, 0xcc, 0x2c, 0x39, 0xeb, 0x37, 0x2f, 0x51, 0x2c, 0xc0, 0x25, 0x30, -0xd3, 0x3e, 0xa7, 0x35, 0xfa, 0xe4, 0xdc, 0x37, 0xc8, 0xac, 0xea, 0xc1, 0x46, 0x0e, 0x47, 0xe0, -0xbf, 0x37, 0x74, 0xe5, 0x34, 0xc6, 0xa9, 0x63, 0xf2, 0x5d, 0x36, 0xad, 0xb3, 0x33, 0x20, 0x1c, -0xa1, 0x77, 0x39, 0xed, 0x5b, 0xe2, 0x9c, 0xae, 0x89, 0x17, 0xae, 0xd3, 0x77, 0x8e, 0x40, 0xa0, -0x1d, 0x4f, 0xa5, 0x63, 0x70, 0x0a, 0xb7, 0x77, 0xd2, 0x41, 0x28, 0xe7, 0x4e, 0xd3, 0x46, 0xf9, -0x7c, 0x90, 0xe5, 0x41, 0xf3, 0x41, 0x90, 0x9b, 0xf3, 0x2d, 0xc6, 0x30, 0xc2, 0x56, 0xbb, 0x45, -0x9a, 0xa6, 0xad, 0x6f, 0x0e, 0xe3, 0x7d, 0x14, 0x4f, 0xc5, 0x5c, 0x6d, 0xa1, 0xbc, 0x88, 0xf9, -0xa5, 0x59, 0x0f, 0xc8, 0xf1, 0xd9, 0x8b, 0x7e, 0xf6, 0xe9, 0x58, 0xab, 0xde, 0x32, 0x48, 0x36, -0x47, 0x7a, 0x6b, 0xa4, 0xc6, 0x8f, 0x61, 0xac, 0xa2, 0x6f, 0x2d, 0xef, 0x94, 0x44, 0x17, 0x1b, -0x81, 0x40, 0x90, 0xad, 0xbd, 0xd3, 0x81, 0x85, 0xab, 0xfa, 0x16, 0x8e, 0x25, 0x27, 0x15, 0x36, -0xcb, 0x45, 0xec, 0x62, 0x10, 0x46, 0x33, 0x50, 0x2b, 0x11, 0x64, 0xe5, 0xfb, 0x38, 0x81, 0x4e, -0x0c, 0x4a, 0xdd, 0x2e, 0xe9, 0x77, 0xc9, 0x07, 0x67, 0xac, 0x85, 0xf3, 0xb1, 0x4b, 0x8a, 0x79, -0xd0, 0x63, 0x6a, 0x29, 0x1c, 0x8b, 0x0c, 0x32, 0x0c, 0x78, 0x96, 0x24, 0xc2, 0xeb, 0x19, 0x8f, -0x42, 0x17, 0xcf, 0x46, 0x5c, 0xe7, 0xd5, 0xfd, 0x1b, 0x82, 0x6e, 0x00, 0x74, 0x17, 0x0c, 0x22, -0x85, 0x80, 0xe2, 0x28, 0x98, 0xd1, 0x71, 0xc4, 0x3c, 0xe2, 0x74, 0xf6, 0x26, 0xc6, 0x0e, 0xdc, -0xd6, 0x41, 0x06, 0xf0, 0xab, 0xe1, 0x60, 0xa3, 0x0e, 0xb0, 0xa9, 0xd0, 0xa3, 0x61, 0x78, 0xbb, -0x00, 0x6b, 0x7b, 0xc9, 0x95, 0xc6, 0x20, 0xe6, 0x3a, 0xe6, 0x0c, 0x1c, 0x08, 0xe5, 0xda, 0x6f, -0xd4, 0x92, 0xb5, 0xaa, 0x80, 0xba, 0xfc, 0x15, 0x16, 0xb8, 0xd7, 0x50, 0x2c, 0xb4, 0xda, 0xa3, -0x5b, 0x5a, 0xa4, 0x02, 0xe1, 0x70, 0x05, 0xe1, 0x92, 0xf4, 0x4a, 0x6b, 0x96, 0x93, 0x09, 0x8a, -0x1f, 0x08, 0x0c, 0xb6, 0x2c, 0xdc, 0x6a, 0x70, 0x8f, 0x1f, 0x93, 0x0a, 0x4d, 0xb3, 0xbe, 0xa8, -0x0d, 0x2a, 0x24, 0x87, 0x5b, 0x24, 0x6d, 0x28, 0xf1, 0xb3, 0x59, 0xcd, 0xbd, 0x81, 0x26, 0x0c, -0xd2, 0x27, 0x58, 0x11, 0xa8, 0x14, 0x7a, 0x23, 0x57, 0x75, 0xba, 0x64, 0xc9, 0xa3, 0x08, 0xe2, -0x6b, 0x0a, 0x56, 0x4a, 0x35, 0xc9, 0xf6, 0xcd, 0x62, 0x4c, 0x99, 0x51, 0xf6, 0x43, 0x95, 0x67, -0x1a, 0x4f, 0xcb, 0x97, 0x12, 0xaf, 0x7e, 0x46, 0x26, 0x57, 0xbb, 0x4f, 0x42, 0xd6, 0xbb, 0xb9, -0x7d, 0x62, 0x53, 0xe0, 0x57, 0xab, 0x67, 0xee, 0xc9, 0x94, 0xd1, 0x96, 0x31, 0xd5, 0x6e, 0xc9, -0x18, 0x89, 0x73, 0x4e, 0x41, 0x9b, 0x68, 0xb2, 0x21, 0xd8, 0xd2, 0x85, 0x95, 0x5a, 0x2d, 0xb8, -0x0c, 0xc9, 0x7e, 0xba, 0x6d, 0x93, 0x7b, 0x05, 0x26, 0x06, 0x6e, 0x23, 0xe2, 0x10, 0x65, 0xfc, -0xf7, 0x09, 0xd7, 0x2e, 0xe0, 0x3d, 0x84, 0x5c, 0xe3, 0xc0, 0x58, 0x8a, 0x39, 0x37, 0x28, 0xe5, -0xdb, 0xca, 0x4d, 0x8b, 0x53, 0xfc, 0xd5, 0xec, 0x7c, 0xdd, 0x11, 0x88, 0x5b, 0x6b, 0xb0, 0xbb, -0x05, 0xa2, 0xee, 0x42, 0xc1, 0x65, 0x2b, 0xa6, 0xb1, 0x4c, 0x82, 0x46, 0xcd, 0xfd, 0xe0, 0x08, -0x29, 0x80, 0xa7, 0x06, 0x7c, 0x13, 0x99, 0xb8, 0x38, 0x95, 0x13, 0x39, 0x21, 0x96, 0x8a, 0xae, -0x20, 0x87, 0xa7, 0xfd, 0x18, 0xcc, 0xe1, 0xdf, 0x28, 0x6b, 0x62, 0xec, 0x51, 0x3f, 0xc0, 0x8a, -0xda, 0x5c, 0xef, 0xf5, 0x8a, 0x86, 0xc7, 0x3e, 0x19, 0x7a, 0x45, 0x1e, 0xb5, 0xa4, 0x11, 0xb0, -0xf4, 0x09, 0x45, 0xad, 0x5f, 0xc2, 0xee, 0xd0, 0x70, 0x08, 0xe3, 0x1c, 0xf6, 0x30, 0x67, 0xd6, -0xac, 0xc1, 0xbe, 0xa7, 0x89, 0xb0, 0x6b, 0x66, 0x03, 0x29, 0x1e, 0x74, 0xb7, 0x38, 0x5c, 0x09, -0xb3, 0x70, 0x4f, 0xcb, 0xdc, 0xaf, 0x99, 0x89, 0x62, 0xb0, 0xdd, 0x84, 0xcd, 0xd5, 0x83, 0xa1, -0x80, 0xb8, 0xff, 0xf8, 0x83, 0x40, 0x19, 0x01, 0xe3, 0xa0, 0xbc, 0x3d, 0xb9, 0x40, 0x7b, 0xde, -0x8b, 0x0b, 0x73, 0x52, 0xbf, 0x07, 0x17, 0x42, 0x6a, 0xb2, 0x82, 0xa0, 0x69, 0x06, 0x90, 0x9f, -0x9d, 0xec, 0xf4, 0x73, 0x4e, 0xc0, 0x27, 0x22, 0xaa, 0xf4, 0xc3, 0xce, 0x56, 0xb6, 0xb2, 0x5f, -0xb9, 0x0f, 0x81, 0xd4, 0x4e, 0x84, 0xc4, 0x0e, 0x80, 0x9a, 0x43, 0xbd, 0x84, 0x05, 0x8c, 0x2f, -0x20, 0xca, 0xa4, 0x42, 0xc3, 0x5c, 0x8c, 0x66, 0xad, 0x50, 0x0e, 0xda, 0x0c, 0x5b, 0x67, 0xae, -0x76, 0x04, 0xd2, 0x2d, 0x3d, 0xc5, 0x89, 0x0c, 0xd3, 0x00, 0x5c, 0xbb, 0x2d, 0xf1, 0xad, 0xf7, -0x3b, 0xca, 0xa5, 0xb9, 0x5e, 0x76, 0xf1, 0x2d, 0xd1, 0xab, 0xee, 0x67, 0x3f, 0x9a, 0x23, 0x8b, -0xfd, 0x80, 0x94, 0x20, 0x4c, 0x88, 0xe3, 0x5e, 0x90, 0x26, 0x0f, 0xf1, 0x32, 0xc1, 0xb2, 0xf9, -0xbd, 0x73, 0x78, 0x80, 0x6a, 0x6e, 0x2b, 0xf3, 0x12, 0xc8, 0xb5, 0x97, 0xb0, 0x8b, 0xa9, 0x8b, -0x0c, 0x74, 0xc9, 0x69, 0x3f, 0xfb, 0x33, 0xc6, 0x69, 0x30, 0x05, 0x51, 0xa7, 0x6b, 0x5f, 0x68, -0xea, 0xa9, 0xbb, 0x22, 0x23, 0xfe, 0xc3, 0x30, 0x01, 0x4a, 0x09, 0x4d, 0x86, 0x71, 0xb2, 0x73, -0x07, 0x18, 0xc0, 0x1f, 0x3e, 0x64, 0x43, 0x46, 0xbb, 0xf0, 0xc5, 0x88, 0xa0, 0x85, 0xf2, 0x38, -0x71, 0x9b, 0x95, 0xd9, 0xb9, 0x78, 0xf4, 0x68, 0x3f, 0xbb, 0x28, 0xfd, 0xf7, 0xf7, 0x36, 0x63, -0x6a, 0xf2, 0x10, 0x48, 0xce, 0xfd, 0x5d, 0x79, 0xb7, 0xa9, 0x2b, 0x6e, 0xa4, 0x65, 0x6d, 0x8e, -0x1b, 0x75, 0x94, 0x49, 0xb4, 0x37, 0x24, 0x48, 0x85, 0xe4, 0x54, 0x26, 0x69, 0x44, 0x74, 0x42, -0x85, 0x9a, 0x73, 0x73, 0xe8, 0x9d, 0xc9, 0xb5, 0xde, 0x2a, 0x40, 0xa5, 0x85, 0x72, 0xfb, 0xcb, -0x33, 0x9b, 0x29, 0xa6, 0x6d, 0xbd, 0x17, 0x5f, 0x38, 0x1d, 0x2f, 0x61, 0x71, 0x44, 0x03, 0x66, -0xaa, 0xec, 0x84, 0x09, 0x37, 0x3e, 0xe4, 0x7c, 0x02, 0x43, 0xbe, 0x8b, 0xe1, 0xfc, 0x2f, 0x48, -0x8d, 0x4b, 0x4c, 0x8d, 0x36, 0x5a, 0x55, 0x49, 0xe7, 0x46, 0x8f, 0xbb, 0x6f, 0x1b, 0xfe, 0x3a, -0xc1, 0x80, 0x48, 0x8d, 0x4a, 0x96, 0x76, 0xd9, 0x36, 0x17, 0xfa, 0x45, 0x55, 0xe3, 0x45, 0x4c, -0x4c, 0xf5, 0xcc, 0x98, 0xd4, 0x7e, 0x80, 0x70, 0x55, 0x23, 0x20, 0x93, 0x2b, 0x0a, 0x40, 0x05, -0xfd, 0x35, 0xae, 0x26, 0x14, 0x78, 0x7c, 0x8a, 0x0d, 0x70, 0x7e, 0xa0, 0xda, 0xd2, 0x6a, 0x80, -0x5a, 0xff, 0xcb, 0x12, 0x3c, 0xfe, 0x70, 0xca, 0x9f, 0x3d, 0x60, 0x63, 0xb1, 0x1e, 0x2f, 0x68, -0xd8, 0x83, 0xec, 0x9f, 0x64, 0xc5, 0xc9, 0x7e, 0x95, 0xb2, 0xce, 0x6d, 0x5d, 0x02, 0x71, 0x30, -0xc1, 0x5b, 0xb2, 0x7c, 0xcf, 0x90, 0x40, 0x84, 0x59, 0x5b, 0x7e, 0x81, 0xa4, 0xd5, 0xdc, 0x8b, -0x3c, 0xd8, 0xcc, 0xd8, 0xf0, 0x6f, 0x61, 0xec, 0x57, 0x99, 0x12, 0x9a, 0x30, 0x92, 0x2a, 0xd3, -0x28, 0x6c, 0x5c, 0xff, 0xe5, 0xfc, 0x94, 0xd7, 0x0c, 0x1e, 0xb9, 0x13, 0x24, 0xc0, 0x33, 0x6f, -0xb0, 0xdf, 0xec, 0x8e, 0x97, 0xac, 0x60, 0xf5, 0x9c, 0xae, 0xc0, 0x9c, 0x61, 0x81, 0x96, 0x10, -0x02, 0x56, 0x44, 0xcf, 0x58, 0x29, 0x1c, 0x28, 0x93, 0x31, 0x67, 0xe6, 0xf0, 0x0f, 0x10, 0x8d, -0x4d, 0x5a, 0xff, 0x67, 0xfe, 0xbf, 0x19, 0x7b, 0x83, 0xa7, 0x59, 0xc3, 0xd2, 0xfa, 0x77, 0x10, -0x7f, 0x3e, 0x3a, 0xe1, 0xd5, 0x86, 0x6b, 0x39, 0xc9, 0x35, 0xe7, 0x4a, 0xda, 0x72, 0xe8, 0xb6, -0xe3, 0xa0, 0xca, 0x7e, 0xe2, 0xb3, 0xd1, 0xe4, 0x1c, 0x1d, 0x61, 0xaf, 0x90, 0x67, 0x8f, 0x4e, -0xf3, 0xe1, 0x16, 0xcc, 0xc9, 0x6f, 0x5f, 0x86, 0x97, 0x30, 0xd1, 0xe6, 0xde, 0xd6, 0x2b, 0x9a, -0xed, 0xc3, 0xf1, 0x27, 0xeb, 0xeb, 0x88, 0x27, 0xfb, 0x5e, 0x47, 0xb4, 0x86, 0xf6, 0x96, 0xa3, -0xf0, 0x22, 0x34, 0xb5, 0xf4, 0x31, 0xbb, 0x0e, 0xcc, 0xcb, 0x53, 0xf1, 0x57, 0x74, 0xe1, 0x56, -0x8f, 0x98, 0x2d, 0x96, 0xbf, 0x7d, 0x4c, 0xbf, 0xe7, 0x8a, 0xe2, 0x04, 0xbd, 0x65, 0xca, 0x5d, -0x8e, 0xa0, 0x38, 0x1e, 0xc0, 0xb3, 0x25, 0xbc, 0xae, 0xc8, 0x1a, 0xfe, 0xb6, 0x95, 0x26, 0xfd, -0x99, 0xb5, 0x68, 0xb3, 0xf8, 0x73, 0x40, 0x2b, 0x98, 0x0d, 0x81, 0xb4, 0x94, 0x27, 0x4b, 0x50, -0xa0, 0x5c, 0x7a, 0xd0, 0x06, 0x43, 0x74, 0x63, 0xc9, 0x82, 0x46, 0xae, 0x93, 0x99, 0xb2, 0xd3, -0xdd, 0x55, 0x8c, 0xac, 0x6f, 0xfb, 0x4c, 0x35, 0x65, 0x9f, 0x58, 0xde, 0xa7, 0x94, 0xb7, 0xd9, -0x31, 0xf7, 0x36, 0x2e, 0x5c, 0xc1, 0xe7, 0xa4, 0xaa, 0x5c, 0xbb, 0xe6, 0xee, 0x0d, 0x83, 0x60, -0xdf, 0x4a, 0x17, 0xf7, 0x5d, 0x6f, 0x73, 0xaf, 0xbf, 0xf8, 0xb3, 0x4d, 0x77, 0xb3, 0xf9, 0xad, -0xc3, 0x3b, 0xe8, 0xc3, 0x56, 0x58, 0x50, 0xe0, 0x13, 0x5e, 0x7b, 0x2a, 0x8e, 0xb8, 0x76, 0x9f, -0x78, 0x4f, 0x1a, 0x50, 0x24, 0x4c, 0xa7, 0x89, 0x20, 0x2e, 0xfd, 0xd0, 0xff, 0x48, 0x06, 0x03, -0x72, 0xf2, 0x14, 0x3a, 0x42, 0x7c, 0x3c, 0x36, 0x8f, 0xc7, 0x67, 0xf8, 0x48, 0x3f, 0x9c, 0x7c, -0x3c, 0xa0, 0xe2, 0xc9, 0x79, 0xb6, 0x79, 0xc7, 0xfa, 0xfa, 0xd3, 0x98, 0x45, 0x56, 0x3d, 0xe7, -0xa7, 0xe4, 0x78, 0x84, 0x71, 0xb6, 0xf3, 0x7e, 0xab, 0xed, 0x46, 0x71, 0x0b, 0xd9, 0x7e, 0x0b, -0xd7, 0x3f, 0x88, 0xce, 0x9e, 0xb2, 0x1f, 0x23, 0x0f, 0xfc, 0xec, 0x67, 0xe3, 0xff, 0x03, 0x2a, -0x4c, 0xb5, 0xf1, 0x4e, 0x2e, 0x00, 0x00}; -#endif /*__INDEX_HTML_H__*/ diff --git a/src/web/html/h/login_html.h b/src/web/html/h/login_html.h deleted file mode 100644 index 37b1bccb..00000000 --- a/src/web/html/h/login_html.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __LOGIN_HTML_H__ -#define __LOGIN_HTML_H__ -#define login_html_len 665 -const uint8_t login_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x95, 0x55, 0xcb, 0x6e, 0xdb, 0x30, -0x10, 0xbc, 0xf7, 0x2b, 0x58, 0x1e, 0x7a, 0x8a, 0x44, 0x47, 0x49, 0x9b, 0xc0, 0x90, 0x54, 0xe4, -0xd1, 0x17, 0x50, 0xf4, 0x92, 0x04, 0x45, 0x4e, 0x01, 0x45, 0xd1, 0x12, 0x13, 0x8a, 0x24, 0x48, -0xca, 0x8e, 0xfb, 0xf5, 0x5d, 0xbd, 0x6a, 0x59, 0x8e, 0xeb, 0xc4, 0x17, 0x89, 0xe4, 0xec, 0xec, -0xee, 0xcc, 0x52, 0x8e, 0xdf, 0xe7, 0x9a, 0xf9, 0xb5, 0xe1, 0xa8, 0xf4, 0x95, 0x4c, 0xdf, 0xc5, -0xdd, 0x03, 0xc1, 0x2f, 0x2e, 0x39, 0xcd, 0xbb, 0xd7, 0x76, 0xe9, 0x85, 0x97, 0x3c, 0xfd, 0xa9, -0x0b, 0xa1, 0x62, 0xd2, 0x2d, 0x36, 0x87, 0x52, 0xa8, 0x27, 0x64, 0xb9, 0x4c, 0xb0, 0xf3, 0x6b, -0xc9, 0x5d, 0xc9, 0xb9, 0xc7, 0xa8, 0x21, 0x4e, 0xb0, 0xe7, 0xcf, 0x9e, 0x30, 0xe7, 0x30, 0x2a, -0x2d, 0x5f, 0xf4, 0x88, 0x10, 0x36, 0x3e, 0x2f, 0x93, 0x59, 0x78, 0x1e, 0xce, 0x66, 0xb3, 0x63, -0x4c, 0x20, 0x77, 0xc5, 0x3d, 0x45, 0x8a, 0x56, 0x10, 0xb3, 0x14, 0x7c, 0x65, 0xb4, 0x05, 0x0e, -0xa6, 0x95, 0xe7, 0xca, 0x27, 0x78, 0x25, 0x72, 0x5f, 0x26, 0x39, 0x5f, 0x0a, 0xc6, 0x83, 0x76, -0x71, 0x84, 0x84, 0x12, 0x5e, 0x50, 0x19, 0x38, 0x46, 0x25, 0x4f, 0x8e, 0xf1, 0x40, 0xc2, 0x4a, -0x6a, 0x1d, 0x87, 0xa0, 0xbb, 0xdb, 0xaf, 0xc1, 0x79, 0xb3, 0xed, 0x98, 0x15, 0xc6, 0x8f, 0x2b, -0x7a, 0xa4, 0x4b, 0xda, 0xed, 0x62, 0xe4, 0x2c, 0x4b, 0x30, 0x35, 0x22, 0x7c, 0xdc, 0x2a, 0x2a, -0x8d, 0x49, 0x87, 0x00, 0x82, 0xb7, 0x74, 0xc8, 0xb4, 0xd4, 0xd6, 0x1d, 0x68, 0xd1, 0xea, 0x4c, -0x7b, 0x37, 0x6a, 0x50, 0x69, 0xa1, 0x72, 0xfe, 0x7c, 0x84, 0x94, 0x5e, 0x68, 0x29, 0xf5, 0x0a, -0x23, 0xd2, 0x5b, 0x41, 0x36, 0x5e, 0xc4, 0x99, 0xce, 0xd7, 0x23, 0xe5, 0x73, 0xb1, 0x44, 0x22, -0x07, 0x79, 0x2c, 0x35, 0x86, 0x5b, 0xbc, 0x39, 0xda, 0x3a, 0x96, 0x8d, 0x6f, 0x93, 0xc3, 0x7f, -0x00, 0x26, 0xa9, 0x73, 0x09, 0x36, 0xc1, 0xe9, 0x0b, 0x88, 0x16, 0xb5, 0xd0, 0xb6, 0x42, 0x94, -0x79, 0xa1, 0x55, 0x82, 0x49, 0x47, 0x86, 0xa0, 0x99, 0x52, 0x03, 0xb7, 0xd1, 0xce, 0xef, 0x09, -0x9c, 0xa6, 0xb0, 0xd0, 0x55, 0x1a, 0x97, 0x51, 0x7a, 0x51, 0xea, 0xf5, 0xf5, 0xed, 0x1d, 0x74, -0x16, 0x81, 0xca, 0x80, 0x78, 0x43, 0xfc, 0x5e, 0xe4, 0x14, 0x0d, 0x3e, 0x04, 0xc7, 0x11, 0x6a, -0x1e, 0xae, 0x0a, 0xce, 0x51, 0x95, 0x05, 0x27, 0x90, 0x5e, 0x28, 0x53, 0x0f, 0xa3, 0x60, 0x00, -0xb8, 0xd2, 0x36, 0xc7, 0xbd, 0x2b, 0x66, 0x05, 0xaf, 0xb4, 0xf6, 0x60, 0x01, 0xab, 0xdd, 0xa1, -0xd2, 0xfe, 0x9f, 0xf0, 0x74, 0x92, 0xcb, 0xd5, 0x59, 0x25, 0xfc, 0x90, 0xa9, 0x17, 0x71, 0x49, -0x65, 0xbd, 0x59, 0xf5, 0x3c, 0x99, 0x57, 0xf8, 0xa0, 0x2c, 0xfb, 0x8f, 0x63, 0xd2, 0xf8, 0xf5, -0x82, 0xd9, 0xbb, 0x21, 0x93, 0xad, 0xe9, 0x72, 0x18, 0x9f, 0x85, 0xd6, 0x7e, 0x6b, 0xb8, 0xc6, -0x5d, 0x4b, 0xbe, 0x18, 0xfb, 0x1f, 0xd3, 0xfe, 0x1a, 0x94, 0xde, 0x1b, 0x37, 0x27, 0x84, 0x82, -0xd7, 0xb9, 0xaf, 0xc3, 0x9c, 0xc3, 0x85, 0xa1, 0xb6, 0x68, 0x2e, 0xe6, 0x43, 0x26, 0xa9, 0x7a, -0xc2, 0xc3, 0x1c, 0xa0, 0x0f, 0x4c, 0x9b, 0x35, 0x8a, 0x66, 0xd1, 0x49, 0x4c, 0xe8, 0x88, 0xab, -0x96, 0x93, 0x7a, 0xa5, 0x48, 0x77, 0x12, 0xe4, 0xc2, 0x31, 0xf0, 0x30, 0x2c, 0x0a, 0xf2, 0xfb, -0x4f, 0xf9, 0xfc, 0xe5, 0xfe, 0x53, 0x54, 0x5d, 0xee, 0xe6, 0xba, 0xee, 0x60, 0x4d, 0x82, 0x98, -0x00, 0xcf, 0x61, 0xe2, 0x42, 0xf8, 0xb2, 0xce, 0x42, 0xa6, 0x2b, 0x22, 0xeb, 0x8a, 0x9a, 0xba, -0xed, 0x65, 0x97, 0xf9, 0x5b, 0x8b, 0xdb, 0x25, 0x8e, 0xc9, 0x50, 0xff, 0x48, 0xd8, 0xad, 0x79, -0x16, 0x45, 0xb9, 0xa5, 0xdd, 0x9e, 0x7e, 0x27, 0x09, 0x5f, 0x55, 0x26, 0x81, 0x35, 0xcc, 0x9b, -0x23, 0xd9, 0xe2, 0xec, 0x2c, 0x3a, 0xfb, 0x08, 0x65, 0xfe, 0xb8, 0x45, 0x37, 0xdf, 0x2f, 0xe6, -0xa8, 0xdf, 0x41, 0xf3, 0x39, 0x1a, 0x3e, 0x4f, 0x7b, 0x55, 0x69, 0xfd, 0xe7, 0xce, 0x3c, 0x34, -0x43, 0x8c, 0x5f, 0xab, 0x1c, 0xb3, 0x9c, 0x7a, 0xb1, 0xe4, 0x4d, 0x0d, 0x5a, 0xb9, 0x50, 0xdb, -0x02, 0x02, 0x19, 0x57, 0x8e, 0x43, 0x41, 0xeb, 0x40, 0xb1, 0xc0, 0x51, 0x72, 0x1a, 0xce, 0x48, -0xce, 0x79, 0xbe, 0xa3, 0x28, 0x4a, 0xaf, 0xae, 0xd0, 0xe5, 0x7d, 0xf0, 0xeb, 0x2a, 0xb8, 0xb9, -0x40, 0x00, 0x7b, 0x85, 0xb6, 0x63, 0x89, 0x49, 0xf7, 0x95, 0x84, 0xcf, 0x4b, 0xfb, 0x7f, 0xf6, -0x17, 0x29, 0x0f, 0xde, 0x34, 0xe7, 0x06, 0x00, 0x00}; -#endif /*__LOGIN_HTML_H__*/ diff --git a/src/web/html/h/save_html.h b/src/web/html/h/save_html.h deleted file mode 100644 index e2853924..00000000 --- a/src/web/html/h/save_html.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef __SAVE_HTML_H__ -#define __SAVE_HTML_H__ -#define save_html_len 1286 -const uint8_t save_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xad, 0x57, 0x5b, 0x4f, 0x1b, 0x39, -0x14, 0x7e, 0xef, 0xaf, 0x70, 0xfd, 0xb0, 0x04, 0x2d, 0x99, 0x19, 0x92, 0x52, 0x58, 0x72, 0x59, -0x05, 0x4a, 0x0b, 0x12, 0x8b, 0x2a, 0x02, 0xaa, 0xaa, 0xaa, 0xaa, 0x1c, 0xdb, 0xc9, 0x18, 0x1c, -0x7b, 0x3a, 0xf6, 0x04, 0xb2, 0x2b, 0xfe, 0xfb, 0x1e, 0xcf, 0x25, 0x99, 0x49, 0x32, 0x01, 0xb6, -0x3b, 0x2f, 0x89, 0xed, 0x73, 0xf9, 0xbe, 0xe3, 0x73, 0x8e, 0xed, 0xee, 0x5b, 0xa6, 0xa9, 0x9d, -0x47, 0x1c, 0x85, 0x76, 0x2a, 0xfb, 0x6f, 0xba, 0xd9, 0x0f, 0x82, 0xaf, 0x1b, 0x72, 0xc2, 0xb2, -0xbf, 0xe9, 0xd0, 0x0a, 0x2b, 0x79, 0x7f, 0x48, 0x66, 0xbc, 0xeb, 0x67, 0xff, 0x97, 0x6b, 0x52, -0xa8, 0x7b, 0x14, 0x73, 0xd9, 0xc3, 0xc6, 0xce, 0x25, 0x37, 0x21, 0xe7, 0x16, 0x23, 0x67, 0xb7, -0x87, 0x2d, 0x7f, 0xb4, 0x3e, 0x35, 0x06, 0xa3, 0x30, 0xe6, 0xe3, 0x5c, 0xc2, 0x83, 0x89, 0x3f, -0x67, 0xbd, 0xc0, 0x3b, 0xf2, 0x82, 0x20, 0xd8, 0xc7, 0x3e, 0xb8, 0x9e, 0x72, 0x4b, 0x90, 0x22, -0x53, 0xd0, 0x99, 0x09, 0xfe, 0x10, 0xe9, 0x18, 0x6c, 0x50, 0xad, 0x2c, 0x57, 0xb6, 0x87, 0x1f, -0x04, 0xb3, 0x61, 0x8f, 0xf1, 0x99, 0xa0, 0xbc, 0x99, 0x0e, 0xf6, 0x90, 0x50, 0xc2, 0x0a, 0x22, -0x9b, 0x86, 0x12, 0xc9, 0x7b, 0xfb, 0xb8, 0x30, 0x42, 0x43, 0x12, 0x1b, 0x0e, 0x4a, 0xb7, 0x37, -0x1f, 0x9b, 0x47, 0x6e, 0xda, 0xd0, 0x58, 0x44, 0xb6, 0x8c, 0xe8, 0x8e, 0xcc, 0x48, 0x36, 0x8b, -0x91, 0x89, 0x69, 0x0f, 0x93, 0x48, 0x78, 0x77, 0x15, 0x50, 0xfd, 0xae, 0x9f, 0x49, 0x80, 0x81, -0xd7, 0x30, 0xa4, 0x5a, 0xea, 0xd8, 0x3c, 0x43, 0x31, 0xd6, 0x23, 0x6d, 0x4d, 0x89, 0xa0, 0xd2, -0x42, 0x31, 0xfe, 0xb8, 0x87, 0x94, 0x1e, 0x6b, 0x29, 0xf5, 0x03, 0x46, 0x7e, 0xbe, 0x13, 0xfe, -0x72, 0x2b, 0xba, 0x23, 0xcd, 0xe6, 0xa5, 0xc8, 0x33, 0x31, 0x43, 0x54, 0x12, 0x63, 0x00, 0x86, -0x8e, 0x14, 0x99, 0xe1, 0x5c, 0x8e, 0xe4, 0x60, 0xfc, 0x32, 0x86, 0x85, 0xa8, 0xdb, 0x3f, 0xdc, -0x1f, 0x84, 0x7a, 0xfe, 0xe1, 0xe6, 0xb6, 0xeb, 0x93, 0x15, 0xa5, 0x65, 0x70, 0x8e, 0x67, 0x5a, -0xb0, 0x46, 0xb0, 0xdb, 0x59, 0xe8, 0x0a, 0x40, 0x8c, 0x91, 0x56, 0x54, 0x0a, 0x7a, 0x5f, 0x78, -0x6d, 0xec, 0xe2, 0x12, 0x28, 0x13, 0x11, 0xe5, 0x82, 0xe7, 0x7e, 0x5e, 0x3d, 0xbb, 0x44, 0xe3, -0xb8, 0x09, 0xb6, 0x20, 0x56, 0x00, 0x98, 0xea, 0x91, 0x70, 0xe8, 0x97, 0x36, 0x48, 0x2a, 0x06, -0x32, 0xed, 0x85, 0x50, 0x28, 0x18, 0x2f, 0xf6, 0xc3, 0x97, 0x62, 0xc6, 0x2b, 0x1b, 0x7b, 0x29, -0x5c, 0x16, 0x93, 0x4d, 0x26, 0xde, 0x6d, 0x36, 0x61, 0x78, 0x0c, 0x99, 0x56, 0x31, 0xf2, 0x85, -0x8f, 0xb2, 0xd9, 0x1a, 0x4b, 0x07, 0x75, 0x96, 0x6c, 0x12, 0x55, 0x0c, 0x0d, 0xb9, 0xb5, 0x42, -0x4d, 0x4c, 0xd5, 0x8e, 0x8b, 0x48, 0x61, 0xc0, 0xf0, 0x88, 0xc7, 0xc4, 0xea, 0x18, 0xaf, 0x07, -0x70, 0xe1, 0xef, 0xfd, 0x66, 0x7f, 0x49, 0xc4, 0x88, 0xad, 0xd2, 0xbf, 0x4d, 0xa7, 0x6a, 0x60, -0x1f, 0xd6, 0xc0, 0x9e, 0x1b, 0xcb, 0xa7, 0x55, 0xdc, 0xe9, 0xd4, 0x2f, 0xa2, 0x3e, 0x5a, 0x78, -0x80, 0x02, 0x84, 0x8a, 0x22, 0xf1, 0xc4, 0x55, 0xee, 0x8f, 0x91, 0x24, 0xea, 0x1e, 0xf7, 0xaf, -0xcf, 0x86, 0x37, 0x68, 0xf0, 0xf9, 0xa2, 0x06, 0xec, 0x1f, 0x85, 0x76, 0x68, 0x6d, 0x64, 0x8e, -0x7d, 0x9f, 0x40, 0x4a, 0x33, 0x9b, 0x78, 0x0e, 0xf9, 0xaa, 0xad, 0x0f, 0x9a, 0x26, 0x53, 0xa8, -0x35, 0x62, 0x85, 0x56, 0x35, 0x06, 0xf7, 0x83, 0x25, 0x9e, 0x91, 0x4e, 0x6c, 0x85, 0xf0, 0xc0, -0xcd, 0xfc, 0x22, 0xdf, 0xa0, 0x26, 0x45, 0xf5, 0x44, 0x28, 0x48, 0x4c, 0xf7, 0x53, 0x07, 0xad, -0x56, 0x13, 0x50, 0xa5, 0xaa, 0x65, 0x74, 0x5d, 0x1f, 0xca, 0x67, 0xa5, 0x90, 0x1e, 0xc4, 0x58, -0x64, 0xe5, 0x5b, 0xd4, 0xb2, 0x1a, 0x6b, 0x07, 0x36, 0x15, 0x2d, 0x69, 0x54, 0xb5, 0x62, 0x12, -0x01, 0xb1, 0x52, 0xc1, 0x55, 0x96, 0xf3, 0x06, 0xb6, 0xb2, 0x5c, 0x11, 0x71, 0x87, 0xca, 0xb2, -0x7c, 0x6d, 0xb3, 0x8d, 0xa6, 0xa3, 0x66, 0x1b, 0xbb, 0xc3, 0x04, 0xf2, 0x1e, 0x99, 0x3c, 0xff, -0x3d, 0xcf, 0x5b, 0xc1, 0xb0, 0x42, 0x64, 0xd3, 0xb0, 0xf0, 0x31, 0xd6, 0xda, 0x56, 0x40, 0x96, -0x5b, 0xa3, 0xe4, 0x63, 0x5b, 0x6d, 0x18, 0x2f, 0xcf, 0x9a, 0xbc, 0x49, 0xa2, 0xdf, 0xa8, 0x8e, -0xe6, 0xa8, 0x15, 0xb4, 0xda, 0xd5, 0xfd, 0x49, 0xe4, 0x0a, 0x5e, 0x29, 0xfa, 0x6b, 0x0e, 0x98, -0x30, 0x54, 0xc7, 0xcc, 0x9b, 0x4c, 0xfc, 0x2f, 0x7f, 0x87, 0x8f, 0x67, 0x5f, 0xdf, 0xb7, 0xa6, -0x27, 0x1b, 0x32, 0x34, 0x13, 0x73, 0x0e, 0xba, 0xd0, 0xb5, 0x5e, 0x60, 0x78, 0x22, 0x6c, 0x98, -0x8c, 0x3c, 0xaa, 0xa7, 0xbe, 0x4c, 0xa6, 0x24, 0x4a, 0x52, 0x2e, 0xeb, 0x96, 0x3f, 0xa5, 0x72, -0xeb, 0x86, 0xbb, 0x7e, 0x81, 0x7f, 0x35, 0x61, 0xf2, 0xd0, 0xc5, 0x62, 0x12, 0x56, 0x62, 0x57, -0xc3, 0x77, 0xc5, 0xe1, 0x8b, 0x60, 0xfa, 0x30, 0x9e, 0x0a, 0x6b, 0xfc, 0xd1, 0xf8, 0xf0, 0xb0, -0x75, 0x78, 0x00, 0x30, 0x2f, 0x6e, 0xd0, 0xf0, 0x7c, 0x70, 0x8c, 0xf2, 0x19, 0x74, 0x7c, 0x8c, -0x8a, 0xfa, 0xab, 0x8d, 0x4a, 0xba, 0xff, 0xdc, 0x44, 0x3f, 0xdc, 0x71, 0x8c, 0x5f, 0x1a, 0x39, -0x1a, 0x73, 0x68, 0x04, 0x33, 0xee, 0x30, 0x68, 0x65, 0x3c, 0x1d, 0x4f, 0x40, 0x91, 0x72, 0x65, -0x38, 0x00, 0x9a, 0x37, 0x15, 0x6d, 0x1a, 0xe2, 0xbf, 0xf3, 0x02, 0x9f, 0x71, 0xce, 0xd6, 0x22, -0x8a, 0xfa, 0xa7, 0xa7, 0xe8, 0xe4, 0x6b, 0xf3, 0xea, 0xb4, 0x39, 0x1c, 0x20, 0x10, 0x7b, 0x41, -0x6c, 0x57, 0x73, 0x77, 0xeb, 0xad, 0xa4, 0x4a, 0x61, 0x46, 0x62, 0xb8, 0xee, 0x40, 0x86, 0xcf, -0x88, 0xbc, 0x60, 0xa8, 0x87, 0x54, 0x22, 0x65, 0xe7, 0x4d, 0x45, 0x66, 0x9c, 0x28, 0xea, 0x5a, -0x1b, 0x8a, 0xdc, 0xf5, 0xe7, 0x13, 0x57, 0x70, 0x3a, 0xd1, 0x86, 0x1e, 0xdd, 0xed, 0xa2, 0x7f, -0xd6, 0x8a, 0x33, 0x95, 0xb9, 0x82, 0x93, 0xdb, 0xad, 0x77, 0x36, 0x2f, 0x9f, 0x0d, 0x3f, 0x6f, -0x5b, 0xbe, 0x36, 0x46, 0x6c, 0x58, 0x7f, 0xda, 0x86, 0xea, 0x1c, 0x5a, 0x41, 0x1d, 0x24, 0xc7, -0xd1, 0xb5, 0x0a, 0x60, 0x87, 0xf1, 0xba, 0x4f, 0x31, 0x6e, 0xbc, 0x05, 0x4d, 0x2f, 0xe2, 0x8a, -0x41, 0xbb, 0xd8, 0x64, 0x21, 0x17, 0x2b, 0x05, 0xea, 0x6d, 0x16, 0xa9, 0x3a, 0x61, 0xf7, 0x51, -0xc9, 0x49, 0x7c, 0x91, 0xab, 0x94, 0x74, 0x37, 0xd0, 0xce, 0xe8, 0xd5, 0x78, 0x75, 0xd8, 0x4c, -0x42, 0x29, 0x37, 0x66, 0x9b, 0x3b, 0xc7, 0x32, 0xbd, 0x07, 0xf6, 0x10, 0xcb, 0x0f, 0x24, 0x2f, -0xcd, 0x45, 0x7e, 0x26, 0xb9, 0x1b, 0x35, 0x76, 0xdc, 0xf2, 0x4e, 0x8d, 0x7b, 0xf7, 0xb9, 0x75, -0xcf, 0xe5, 0xf1, 0xd9, 0xcf, 0x04, 0x2a, 0x15, 0xc2, 0x05, 0x99, 0x1d, 0xc3, 0xa5, 0x14, 0xd7, -0xaa, 0x14, 0xc1, 0x8b, 0xf9, 0x08, 0x1a, 0xe5, 0x36, 0x7c, 0xee, 0x2b, 0x76, 0xa1, 0xb8, 0x99, -0xa0, 0x9c, 0xd7, 0x18, 0x42, 0x39, 0x47, 0x06, 0xde, 0x00, 0xcc, 0x43, 0x83, 0xc4, 0xea, 0x29, -0x94, 0x10, 0x85, 0x9d, 0x9d, 0x70, 0x77, 0x39, 0xd6, 0x84, 0x41, 0x92, 0xa2, 0x36, 0x74, 0x74, -0x38, 0x15, 0x98, 0xf1, 0x70, 0x67, 0xab, 0x9b, 0x94, 0x47, 0x7e, 0x7e, 0x80, 0xbb, 0x76, 0xbd, -0xf4, 0x13, 0xe2, 0xd2, 0xf0, 0xff, 0x03, 0xf5, 0x75, 0x1a, 0x00, 0x58, 0x2e, 0x13, 0x88, 0x39, -0x13, 0x31, 0xa7, 0xd6, 0xa1, 0x6f, 0x05, 0xff, 0x11, 0x3e, 0x28, 0xfe, 0x8e, 0x70, 0x07, 0xdd, -0x5e, 0x5f, 0xf6, 0xfc, 0x2d, 0xaa, 0x4f, 0xb5, 0x2b, 0x8b, 0x7c, 0x80, 0x46, 0x93, 0x27, 0x83, -0x39, 0x99, 0xdf, 0x90, 0xc9, 0x15, 0x3c, 0x19, 0x1a, 0x3b, 0xee, 0x15, 0xb0, 0xb3, 0xfb, 0x2d, -0xf8, 0xee, 0xb9, 0x03, 0x59, 0xb1, 0xd3, 0x50, 0x48, 0xd6, 0x70, 0x28, 0xea, 0x52, 0xf5, 0xb9, -0xa8, 0x15, 0x11, 0xfb, 0x48, 0xe0, 0x46, 0xcd, 0x5c, 0x88, 0x2a, 0xe7, 0x31, 0x7e, 0x69, 0x05, -0xac, 0xcf, 0x6c, 0xa0, 0x72, 0x32, 0xbf, 0x60, 0x8d, 0xec, 0x2e, 0xb0, 0xeb, 0x09, 0x05, 0xdd, -0xe9, 0xfc, 0xe6, 0xaf, 0x4b, 0x70, 0xef, 0xa6, 0x5e, 0xd1, 0x42, 0xea, 0xda, 0x07, 0xa4, 0xb8, -0x2b, 0x75, 0x57, 0xf2, 0x35, 0x12, 0x8b, 0xce, 0x55, 0xea, 0x8d, 0xdf, 0xf0, 0x24, 0x1b, 0xe0, -0xef, 0x35, 0x51, 0xac, 0xf6, 0xad, 0xce, 0x33, 0xe4, 0x57, 0xa0, 0x57, 0x7a, 0x36, 0x7a, 0x80, -0x27, 0x9e, 0x7e, 0xf0, 0x20, 0xc0, 0x8b, 0x7e, 0x03, 0xee, 0xed, 0xe0, 0x8e, 0x3c, 0x36, 0x76, -0xdc, 0x05, 0xd8, 0x77, 0xb1, 0xf0, 0x5d, 0xaa, 0xee, 0xec, 0x65, 0x8e, 0x77, 0xf1, 0x1e, 0x6a, -0x1d, 0x04, 0xc1, 0x8a, 0xe3, 0x42, 0x2b, 0xbd, 0x36, 0xfb, 0x05, 0x85, 0xbd, 0x0a, 0xbd, 0x92, -0xca, 0xf2, 0x25, 0x9b, 0x8d, 0xb2, 0x57, 0x64, 0xd7, 0xcf, 0x9e, 0xfb, 0xff, 0x02, 0xcf, 0x43, -0x5b, 0x09, 0x06, 0x10, 0x00, 0x00}; -#endif /*__SAVE_HTML_H__*/ diff --git a/src/web/html/h/serial_html.h b/src/web/html/h/serial_html.h deleted file mode 100644 index 2d3ab07f..00000000 --- a/src/web/html/h/serial_html.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef __SERIAL_HTML_H__ -#define __SERIAL_HTML_H__ -#define serial_html_len 1724 -const uint8_t serial_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xa5, 0x58, 0x5b, 0x53, 0xdb, 0x38, -0x14, 0x7e, 0xe7, 0x57, 0x08, 0xef, 0x74, 0x49, 0x16, 0x62, 0x9b, 0x3b, 0x1b, 0x92, 0x74, 0x28, -0xb0, 0x2d, 0x3b, 0x2c, 0x30, 0x4d, 0x98, 0x4e, 0x67, 0xd9, 0x61, 0x14, 0x59, 0x49, 0x04, 0xb6, -0xe4, 0x91, 0xe4, 0x40, 0xba, 0xd3, 0xff, 0xbe, 0x47, 0xbe, 0x24, 0xbe, 0xb2, 0x94, 0xe6, 0x25, -0x96, 0x7c, 0xce, 0xd1, 0x77, 0x6e, 0x9f, 0x24, 0xf7, 0xd6, 0x3d, 0x41, 0xf4, 0x22, 0xa4, 0x68, -0xa6, 0x03, 0x7f, 0xb0, 0xd6, 0x33, 0x7f, 0xc8, 0xc7, 0x7c, 0xda, 0xb7, 0x28, 0xb7, 0x06, 0x6b, -0x08, 0x7e, 0xbd, 0x19, 0xc5, 0x5e, 0xf2, 0x18, 0x0f, 0x35, 0xd3, 0x3e, 0x1d, 0x0c, 0xa9, 0x64, -0xd8, 0x47, 0xa7, 0x82, 0x2b, 0xe1, 0xd3, 0x9e, 0x93, 0xcc, 0xae, 0xa4, 0x7c, 0xc6, 0x1f, 0x91, -0xa4, 0x7e, 0xdf, 0x52, 0x7a, 0xe1, 0x53, 0x35, 0xa3, 0x54, 0x5b, 0xc8, 0xac, 0xd5, 0xb7, 0x34, -0x7d, 0xd6, 0x0e, 0x51, 0xca, 0x42, 0x33, 0x49, 0x27, 0xa9, 0x84, 0x0d, 0x13, 0xef, 0xe7, 0x7d, -0xd7, 0x3e, 0xb2, 0x5d, 0xd7, 0xdd, 0xb6, 0x1c, 0x80, 0x13, 0x50, 0x8d, 0x11, 0xc7, 0x01, 0xe8, -0xcc, 0x19, 0x7d, 0x0a, 0x85, 0x04, 0x1b, 0x44, 0x70, 0x4d, 0xb9, 0xee, 0x5b, 0x4f, 0xcc, 0xd3, -0xb3, 0xbe, 0x47, 0xe7, 0x8c, 0xd0, 0x4e, 0x3c, 0xd8, 0x42, 0x8c, 0x33, 0x0d, 0xb8, 0x3a, 0x8a, -0x60, 0x9f, 0xf6, 0xb7, 0xad, 0xcc, 0x08, 0x99, 0x61, 0xa9, 0x28, 0x28, 0xdd, 0x8e, 0xfe, 0xe8, -0x1c, 0x99, 0x69, 0x45, 0x24, 0x0b, 0x75, 0x1e, 0xd1, 0x03, 0x9e, 0xe3, 0x64, 0xd6, 0x42, 0x4a, -0x92, 0xbe, 0x85, 0x43, 0x66, 0x3f, 0x14, 0x40, 0x0d, 0x7a, 0x4e, 0x22, 0x01, 0x06, 0x7e, 0xc4, -0x43, 0x22, 0x7c, 0x21, 0xd5, 0xff, 0xb8, 0x28, 0xc5, 0x58, 0x68, 0x95, 0x73, 0x90, 0x0b, 0xc6, -0x3d, 0xfa, 0xbc, 0x85, 0xb8, 0x98, 0x08, 0xdf, 0x17, 0x4f, 0x16, 0x72, 0xd2, 0x9c, 0x38, 0xab, -0xa4, 0xf4, 0xc6, 0xc2, 0x5b, 0xe4, 0x22, 0xef, 0xb1, 0x39, 0x22, 0x3e, 0x56, 0x0a, 0x60, 0x88, -0x90, 0xe3, 0x79, 0x96, 0x47, 0x9c, 0x82, 0x71, 0xf2, 0x18, 0x96, 0xa2, 0x26, 0x7f, 0xd6, 0xe0, -0x64, 0x26, 0x16, 0x67, 0xa3, 0xdb, 0x9e, 0x83, 0x4b, 0x4a, 0xab, 0xe0, 0x74, 0xe7, 0x82, 0x79, -0x2d, 0xb7, 0x7d, 0xbc, 0xd4, 0x65, 0x80, 0xd8, 0x42, 0x82, 0x13, 0x9f, 0x91, 0xc7, 0x6c, 0xd5, -0x56, 0xdb, 0xca, 0x81, 0x52, 0x21, 0xe6, 0x26, 0x78, 0xe6, 0xef, 0x87, 0x67, 0x57, 0x68, 0x8c, -0x6f, 0xcc, 0x5b, 0x3a, 0x96, 0x01, 0x08, 0xc4, 0x98, 0x19, 0xf4, 0x2b, 0x1b, 0x38, 0x16, 0x03, -0x99, 0xdd, 0xa5, 0xd0, 0x8c, 0x79, 0x34, 0xcb, 0x87, 0xe3, 0xb3, 0x39, 0x2d, 0x24, 0xf6, 0x12, -0x26, 0x96, 0xeb, 0x14, 0x4d, 0xec, 0xd5, 0x9b, 0x50, 0x71, 0x07, 0x14, 0x8c, 0x7c, 0xa1, 0xe3, -0x64, 0xb6, 0xc1, 0xd2, 0x7e, 0x93, 0x25, 0x1d, 0x85, 0x05, 0x43, 0x43, 0xaa, 0x35, 0xe3, 0x53, -0x55, 0xb4, 0x63, 0x22, 0x92, 0x19, 0x50, 0x34, 0xa4, 0x12, 0x6b, 0x21, 0xad, 0x6a, 0x00, 0x97, -0xeb, 0x1d, 0xd4, 0xaf, 0x17, 0x85, 0x1e, 0xd6, 0x45, 0xf7, 0x6f, 0xe3, 0xa9, 0x06, 0xd8, 0x87, -0x0d, 0xb0, 0x17, 0x4a, 0xd3, 0xa0, 0x88, 0x3b, 0x9e, 0xfa, 0x49, 0xd4, 0x47, 0xcb, 0x15, 0xa0, -0x01, 0xa1, 0xa3, 0xb0, 0x9c, 0x9a, 0xce, 0xbd, 0x1f, 0x03, 0x31, 0x3d, 0x5a, 0x83, 0xcf, 0xe7, -0xc3, 0x11, 0x3a, 0xb9, 0xb9, 0x68, 0x00, 0xfb, 0x7b, 0xa6, 0x3d, 0xd3, 0x3a, 0x54, 0x5d, 0xc7, -0xc1, 0x50, 0xd2, 0x9e, 0x8e, 0x6c, 0x83, 0xbc, 0x6c, 0xeb, 0x4c, 0x90, 0x28, 0x80, 0x5e, 0xc3, -0x9a, 0x09, 0xde, 0x60, 0x70, 0xdb, 0x5d, 0xe1, 0x19, 0x8b, 0x48, 0x17, 0x1c, 0x3e, 0x31, 0x33, -0x3f, 0xe9, 0xaf, 0xdb, 0x50, 0xa2, 0x62, 0xca, 0x80, 0x83, 0x2f, 0xcd, 0x5f, 0x13, 0xb4, 0x46, -0x4d, 0x40, 0x15, 0xab, 0xe6, 0xd1, 0xf5, 0x1c, 0x68, 0x9f, 0x52, 0x23, 0x3d, 0xb1, 0x09, 0x4b, -0xda, 0x37, 0xeb, 0x65, 0x3e, 0x11, 0x06, 0x6c, 0x2c, 0x9a, 0xd3, 0x28, 0x6a, 0x49, 0x1c, 0x82, -0x63, 0xb9, 0x86, 0x2b, 0xbc, 0x4e, 0x09, 0x0c, 0x58, 0xd4, 0x10, 0x23, 0xb4, 0x27, 0x7e, 0x4e, -0xf8, 0xb9, 0x8b, 0xb6, 0x5d, 0xf7, 0x1d, 0x5a, 0x67, 0x81, 0xa1, 0x72, 0xcc, 0xf5, 0x71, 0xc9, -0x44, 0x99, 0xc0, 0x24, 0x70, 0x5e, 0x55, 0x22, 0xd9, 0x86, 0x80, 0x62, 0xb1, 0xa4, 0x49, 0x2c, -0x92, 0xae, 0x5b, 0xf1, 0x81, 0xee, 0x98, 0xbe, 0x17, 0x3e, 0x3c, 0x1f, 0x41, 0x78, 0xc1, 0x0c, -0x3c, 0xed, 0x99, 0x27, 0xa0, 0x4d, 0xc1, 0xfd, 0x05, 0x78, 0x98, 0x19, 0xa8, 0x41, 0x50, 0x74, -0xbb, 0x01, 0x18, 0x0a, 0x16, 0xb0, 0x4a, 0x03, 0xba, 0x9c, 0x28, 0xc0, 0x30, 0x72, 0x24, 0xd9, -0x29, 0x11, 0x26, 0x1a, 0xa8, 0xa6, 0x5b, 0xac, 0x13, 0x4f, 0x40, 0xb4, 0x8c, 0x23, 0xc9, 0xdb, -0x65, 0xb5, 0x34, 0x20, 0xa9, 0x5d, 0xc2, 0xf8, 0xdb, 0x51, 0x41, 0x67, 0x2f, 0x05, 0x76, 0x1b, -0x6a, 0x16, 0x2c, 0x17, 0x32, 0xc6, 0xa3, 0x78, 0xe6, 0x2d, 0xc6, 0x0f, 0x56, 0xc6, 0x71, 0x47, -0x36, 0x38, 0x1d, 0x2b, 0x32, 0x1e, 0x46, 0xd9, 0xae, 0x3a, 0x8e, 0xb4, 0x36, 0xa5, 0x35, 0xc7, -0x7e, 0x04, 0x43, 0xe2, 0x53, 0x2c, 0x97, 0x39, 0x1a, 0x6b, 0x9e, 0xb8, 0x9c, 0x4c, 0x3b, 0x6f, -0xb3, 0x89, 0x23, 0x2d, 0x60, 0x5b, 0x82, 0xdd, 0xb1, 0x6a, 0x38, 0x9d, 0x6f, 0xb0, 0xdc, 0x94, -0xe4, 0xea, 0x74, 0xb9, 0x0b, 0x1a, 0x9a, 0x62, 0x22, 0x84, 0x2e, 0xf4, 0x44, 0x3e, 0x88, 0x3e, -0x9d, 0xe8, 0xe2, 0xfe, 0xf4, 0x7a, 0x92, 0x4a, 0xf7, 0x64, 0xf4, 0x2b, 0x11, 0xe1, 0x02, 0xed, -0xb8, 0x3b, 0xbb, 0x45, 0x3a, 0x88, 0xfc, 0x12, 0x5e, 0x9f, 0x0d, 0x2a, 0x0b, 0x78, 0x4c, 0x11, -0x21, 0x3d, 0x7b, 0x3a, 0x75, 0xbe, 0x7c, 0x9b, 0x3d, 0x9f, 0x7f, 0x3d, 0xd8, 0x09, 0x3e, 0xd4, -0x10, 0x62, 0x22, 0x66, 0x16, 0xe8, 0xc1, 0x26, 0xf9, 0x0a, 0xc3, 0x53, 0xa6, 0x67, 0xd1, 0xd8, -0x26, 0x22, 0x70, 0xfc, 0x28, 0xc0, 0x61, 0x14, 0xfb, 0x52, 0xb5, 0xfc, 0x31, 0x96, 0xab, 0x1a, -0xee, 0x39, 0x19, 0xfe, 0x32, 0x3f, 0x65, 0xad, 0xc6, 0xa6, 0xb3, 0x42, 0xec, 0x1a, 0xfc, 0x2d, -0x2d, 0xf8, 0x2a, 0x98, 0x0e, 0x8c, 0x03, 0xa6, 0x95, 0x33, 0x9e, 0x1c, 0x1e, 0xee, 0x1c, 0xee, -0x03, 0xcc, 0x8b, 0x11, 0x1a, 0x7e, 0x3a, 0xe9, 0xa2, 0x74, 0x06, 0x75, 0xbb, 0x28, 0xa3, 0xfb, -0xc6, 0xa8, 0xc4, 0xf9, 0xa7, 0x2a, 0xbc, 0x37, 0x35, 0x6a, 0xbd, 0x36, 0x72, 0x04, 0xc8, 0xc7, -0x74, 0xbb, 0xc1, 0x00, 0xe4, 0x60, 0x0b, 0x39, 0x05, 0x45, 0x42, 0xb9, 0xa2, 0x00, 0x68, 0xd1, -0xe1, 0xa4, 0xa3, 0xb0, 0xb3, 0x67, 0xbb, 0x8e, 0x47, 0xa9, 0x57, 0x89, 0x28, 0x1a, 0x9c, 0x9e, -0xa2, 0x0f, 0x5f, 0x3b, 0x57, 0xa7, 0x9d, 0xe1, 0x09, 0x02, 0xb1, 0x57, 0xc4, 0xb6, 0x5c, 0xbb, -0x2f, 0x1e, 0x82, 0x8b, 0x2e, 0xcc, 0xb1, 0x44, 0xc1, 0x09, 0xb4, 0xdb, 0x30, 0x6e, 0x2b, 0xd4, -0x47, 0x5a, 0x46, 0xf4, 0xb8, 0x22, 0x03, 0x3c, 0x07, 0xef, 0xbc, 0x74, 0x63, 0xb5, 0x01, 0xf1, -0xb9, 0x4f, 0xcd, 0xe3, 0x87, 0xc5, 0x85, 0xd7, 0xca, 0x98, 0xba, 0x5d, 0x55, 0xa4, 0xcf, 0xf4, -0x9a, 0x13, 0xba, 0x34, 0x5c, 0x10, 0x98, 0x44, 0x9c, 0x98, 0x3d, 0x1a, 0x85, 0xe6, 0x1c, 0xff, -0x91, 0x72, 0x30, 0x43, 0x5a, 0x62, 0xfc, 0xd0, 0x46, 0xff, 0x56, 0x7a, 0xd8, 0x58, 0x8b, 0x42, -0x30, 0x04, 0xef, 0xff, 0xb6, 0xb4, 0xba, 0x4f, 0x89, 0xef, 0x9f, 0xe3, 0x5a, 0x51, 0x0f, 0x2f, -0x14, 0x08, 0xc7, 0x96, 0x2f, 0xb8, 0x6e, 0x81, 0xaa, 0x83, 0x8e, 0x0e, 0xf6, 0x5c, 0xb7, 0x8d, -0xde, 0xa1, 0xdd, 0x83, 0xfd, 0x7a, 0xb5, 0x99, 0x54, 0xa8, 0xa2, 0xb6, 0x7b, 0x90, 0x68, 0xed, -0xec, 0xd5, 0x2b, 0x05, 0x8c, 0x57, 0x95, 0x0e, 0x62, 0x95, 0x03, 0xb7, 0x5e, 0x45, 0x51, 0x62, -0x54, 0x40, 0xb2, 0x5e, 0xa6, 0x31, 0xd4, 0xa9, 0xd7, 0x6d, 0x9b, 0x71, 0x08, 0xd7, 0xa7, 0xd1, -0x5f, 0x97, 0x26, 0x31, 0xc6, 0xd9, 0x4d, 0x64, 0xa1, 0x33, 0x78, 0xd8, 0x42, 0x56, 0x2d, 0x37, -0x6e, 0xa2, 0x96, 0xe5, 0x5a, 0x9b, 0xe0, 0x61, 0xdb, 0x56, 0xd1, 0x58, 0x69, 0xd9, 0xea, 0xec, -0xb4, 0x8d, 0x5a, 0xf7, 0x45, 0x05, 0xf0, 0xee, 0xc7, 0x14, 0xc0, 0xb7, 0xbc, 0x42, 0x29, 0xe9, -0xe6, 0x17, 0x47, 0xea, 0xb3, 0x52, 0x2c, 0x4e, 0x76, 0xd5, 0x7b, 0x36, 0x69, 0x99, 0x72, 0x41, -0xfd, 0x7e, 0x56, 0x40, 0x75, 0x15, 0xb1, 0xb4, 0x74, 0x05, 0x17, 0x93, 0x7a, 0x43, 0x4b, 0x91, -0xf3, 0xe1, 0xcd, 0x0b, 0x22, 0x4f, 0x70, 0x25, 0x13, 0x4f, 0x36, 0x1c, 0xd9, 0x21, 0x7d, 0x54, -0xc2, 0x36, 0xd4, 0xb2, 0x20, 0xf0, 0x27, 0x0f, 0xf8, 0xb9, 0xb5, 0x61, 0x0e, 0xac, 0xce, 0x34, -0x29, 0xce, 0x8d, 0xad, 0x42, 0xad, 0xb6, 0xad, 0x2d, 0xb4, 0x0f, 0x24, 0xd2, 0x60, 0x76, 0x55, -0xfc, 0x13, 0xec, 0x2b, 0x5a, 0x2f, 0x04, 0x8b, 0x8e, 0x20, 0xa3, 0xd7, 0x93, 0x09, 0x3c, 0xb5, -0x6a, 0x2c, 0x7d, 0x5f, 0x2b, 0x8e, 0xea, 0x5b, 0xa8, 0x64, 0xa6, 0x26, 0x5c, 0x8e, 0x63, 0x84, -0x90, 0x29, 0x1f, 0x24, 0x62, 0x31, 0x34, 0x11, 0xa6, 0x12, 0xe3, 0x3b, 0x7f, 0x7a, 0x92, 0xa9, -0x2d, 0x56, 0x08, 0x1c, 0xf8, 0xc0, 0xe9, 0x13, 0xba, 0x1e, 0x3f, 0x50, 0x52, 0x8b, 0x12, 0x64, -0x6c, 0x12, 0x78, 0x20, 0x97, 0xb2, 0xc1, 0x7d, 0xa4, 0xc9, 0x7d, 0xb2, 0x8e, 0x55, 0x2f, 0x0e, -0x61, 0x4e, 0xcd, 0x9e, 0xc1, 0x35, 0xa5, 0xd5, 0x36, 0xb5, 0x6e, 0x7c, 0xf8, 0x26, 0xf8, 0xca, -0x8f, 0xdf, 0x50, 0xa7, 0xae, 0x3f, 0xb2, 0xec, 0xc4, 0xd7, 0x89, 0xe4, 0xae, 0x05, 0xb9, 0xe0, -0x91, 0xef, 0x43, 0xf9, 0xdf, 0x5c, 0x0f, 0x47, 0x30, 0xfa, 0x73, 0x78, 0x7d, 0x65, 0x43, 0x11, -0xc2, 0x9d, 0x8b, 0x4d, 0x16, 0x71, 0xfa, 0x4b, 0xc0, 0x4b, 0xc1, 0x6c, 0x6c, 0xba, 0xe4, 0x34, -0xd3, 0xb6, 0xb1, 0xe7, 0x9d, 0xcf, 0x61, 0xf6, 0x92, 0xc1, 0x8d, 0x08, 0x2a, 0xc0, 0xbc, 0x81, -0xdb, 0x31, 0xac, 0x95, 0xe5, 0xa1, 0x36, 0xf2, 0x10, 0x5b, 0x3b, 0x3e, 0xda, 0x98, 0xe8, 0x94, -0x82, 0xf1, 0xbd, 0x04, 0xa9, 0x99, 0x63, 0x93, 0x83, 0xcf, 0x9b, 0x41, 0x14, 0x69, 0x7e, 0x3d, -0x37, 0xac, 0x46, 0x57, 0xcf, 0x98, 0x5a, 0x22, 0x6e, 0xe5, 0x44, 0xdb, 0xe8, 0x3d, 0x2a, 0x1c, -0xcf, 0xba, 0x08, 0x2e, 0x02, 0x3c, 0x82, 0x4c, 0xa6, 0x33, 0x55, 0xef, 0xd6, 0x8a, 0x9d, 0x8d, -0x5a, 0xeb, 0xeb, 0x69, 0xbf, 0xc5, 0x6e, 0x0c, 0x45, 0x24, 0xeb, 0xfb, 0x3b, 0xe6, 0xc9, 0xf8, -0x6d, 0x5a, 0x26, 0x39, 0x79, 0x68, 0x4b, 0x6a, 0x46, 0x6a, 0xa3, 0xa6, 0x16, 0x13, 0xa5, 0x6a, -0xa0, 0x36, 0x44, 0x48, 0xf9, 0x46, 0x2e, 0x4e, 0x8d, 0xb4, 0xd2, 0x98, 0x85, 0xf4, 0x28, 0x0f, -0xfc, 0x16, 0x7f, 0xde, 0x1a, 0x63, 0xf2, 0x38, 0x95, 0x22, 0xe2, 0xde, 0xa9, 0xf9, 0x18, 0x64, -0xf2, 0xfb, 0x8b, 0x4b, 0xdc, 0x9a, 0x82, 0xff, 0xbe, 0x95, 0x90, 0x40, 0x1d, 0x1d, 0x36, 0xe2, -0xa5, 0x52, 0x0a, 0xf9, 0x2a, 0xc0, 0x26, 0xae, 0xd4, 0x4e, 0x0e, 0x13, 0xb6, 0xb9, 0x0f, 0x2d, -0x86, 0x70, 0xff, 0xa5, 0x68, 0xbd, 0x9f, 0x8f, 0x9a, 0x7d, 0x7d, 0x73, 0x7e, 0xd5, 0x64, 0xe2, -0x67, 0xfd, 0x9e, 0xb8, 0x75, 0x7e, 0x57, 0x19, 0xec, 0xcd, 0xd1, 0x48, 0x78, 0xe5, 0x55, 0xe1, -0x58, 0x75, 0xdc, 0x26, 0x6c, 0x21, 0xb6, 0x87, 0x35, 0x86, 0xa8, 0x84, 0x3e, 0x86, 0xca, 0x71, -0xee, 0x7a, 0x92, 0xdf, 0x0d, 0x9c, 0xe9, 0x16, 0xda, 0xb8, 0x93, 0x77, 0x7c, 0xa3, 0x81, 0xbd, -0x61, 0x13, 0xca, 0x57, 0x7e, 0x63, 0xcc, 0xcc, 0x5a, 0x49, 0xf1, 0x8f, 0x84, 0x39, 0x9f, 0xac, -0xc6, 0x9f, 0xa8, 0x39, 0xe5, 0xbe, 0x58, 0x0b, 0x2f, 0xb0, 0x51, 0x91, 0xe2, 0xd2, 0x0d, 0xc8, -0x2a, 0x6d, 0x40, 0xc7, 0xb9, 0x63, 0x61, 0xf6, 0x11, 0x33, 0x19, 0x25, 0x1f, 0x10, 0x7b, 0x4e, -0xf2, 0x11, 0xf8, 0x3f, 0x36, 0x79, 0x7e, 0xc0, 0x15, 0x16, 0x00, 0x00}; -#endif /*__SERIAL_HTML_H__*/ diff --git a/src/web/html/h/setup_html.h b/src/web/html/h/setup_html.h deleted file mode 100644 index 40481cd7..00000000 --- a/src/web/html/h/setup_html.h +++ /dev/null @@ -1,545 +0,0 @@ -#ifndef __SETUP_HTML_H__ -#define __SETUP_HTML_H__ -#define setup_html_len 8636 -const uint8_t setup_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xed, 0x3d, 0xfb, 0x5b, 0xdb, 0x48, -0x92, 0xbf, 0xe7, 0xaf, 0xe8, 0x68, 0xef, 0x06, 0x79, 0x63, 0xfc, 0x86, 0x10, 0x02, 0xec, 0x47, -0x80, 0x24, 0xdc, 0xf2, 0x3a, 0x4c, 0x36, 0xb3, 0x47, 0xfc, 0xf1, 0xc9, 0x52, 0x1b, 0x2b, 0xc8, -0x92, 0x46, 0x92, 0x0d, 0xde, 0xd9, 0xfc, 0xef, 0x57, 0xd5, 0x0f, 0xf9, 0xd5, 0x2d, 0xcb, 0x60, -0x07, 0x66, 0xee, 0xb2, 0x3b, 0x89, 0xdc, 0x8f, 0xea, 0xee, 0xea, 0xea, 0xaa, 0xea, 0xea, 0xea, -0xea, 0x9d, 0xd7, 0x4e, 0x60, 0x27, 0xc3, 0x90, 0x92, 0x6e, 0xd2, 0xf3, 0xf6, 0x5e, 0xed, 0xe0, -0x3f, 0xc4, 0xb3, 0xfc, 0xdb, 0x5d, 0x83, 0xfa, 0xc6, 0xde, 0x2b, 0x02, 0x7f, 0x76, 0xba, 0xd4, -0x72, 0xf8, 0x27, 0xfb, 0x99, 0xb8, 0x89, 0x47, 0xf7, 0x9a, 0x34, 0xe9, 0x87, 0x3b, 0x65, 0xfe, -0x63, 0x94, 0xe9, 0xb9, 0xfe, 0x1d, 0x89, 0xa8, 0xb7, 0x6b, 0xc4, 0xc9, 0xd0, 0xa3, 0x71, 0x97, -0xd2, 0xc4, 0x20, 0xd8, 0xc4, 0xae, 0x91, 0xd0, 0x87, 0xa4, 0x6c, 0xc7, 0xb1, 0x41, 0xba, 0x11, -0xed, 0x88, 0x12, 0x25, 0x48, 0xf8, 0xdb, 0x60, 0xb7, 0x52, 0xda, 0x2a, 0x55, 0x2a, 0x95, 0xaa, -0x51, 0x86, 0x5e, 0xf4, 0x68, 0x62, 0x11, 0xdf, 0xea, 0x41, 0x9d, 0x81, 0x4b, 0xef, 0xc3, 0x20, -0x02, 0x18, 0x76, 0xe0, 0x27, 0xd4, 0x4f, 0x76, 0x8d, 0x7b, 0xd7, 0x49, 0xba, 0xbb, 0x0e, 0x1d, -0xb8, 0x36, 0x5d, 0x67, 0x3f, 0x8a, 0xc4, 0xf5, 0xdd, 0xc4, 0xb5, 0xbc, 0xf5, 0xd8, 0xb6, 0x3c, -0xba, 0x5b, 0x35, 0x24, 0x10, 0xbb, 0x6b, 0x45, 0x31, 0x85, 0x4a, 0x5f, 0xae, 0x3e, 0xae, 0x6f, -0x61, 0x72, 0x6c, 0x47, 0x6e, 0x98, 0x8c, 0xf7, 0xe8, 0xbb, 0x35, 0xb0, 0x78, 0xaa, 0x41, 0xe2, -0xc8, 0xde, 0x35, 0xac, 0xd0, 0x2d, 0x7d, 0x9f, 0xe8, 0xd4, 0xde, 0x4e, 0x99, 0x97, 0x00, 0x00, -0x8b, 0x8c, 0xd0, 0x0e, 0xbc, 0x20, 0x8a, 0xe7, 0x0c, 0x31, 0x0a, 0xda, 0x41, 0x12, 0x8f, 0x0d, -0xd0, 0x0f, 0x5c, 0xdf, 0xa1, 0x0f, 0x45, 0xe2, 0x07, 0x9d, 0xc0, 0xf3, 0x82, 0x7b, 0x83, 0x94, -0xc5, 0x54, 0x94, 0x47, 0x73, 0xb1, 0xd3, 0x0e, 0x9c, 0xe1, 0x18, 0xe6, 0x1d, 0x77, 0x40, 0x6c, -0xcf, 0x8a, 0x63, 0xe8, 0x46, 0x10, 0xfa, 0xd6, 0x40, 0x4e, 0x9f, 0x25, 0x3a, 0x53, 0x1e, 0xef, -0x43, 0x5a, 0x14, 0xe7, 0xcf, 0xd8, 0xdb, 0xef, 0x06, 0xc3, 0xc3, 0xab, 0x2f, 0x3b, 0x65, 0x6b, -0xaa, 0xd2, 0x08, 0x39, 0xdb, 0x83, 0xc0, 0x75, 0xcc, 0x4a, 0xe1, 0x7d, 0x5a, 0xd7, 0x85, 0x1e, -0x1b, 0x24, 0xf0, 0x6d, 0xcf, 0xb5, 0xef, 0x64, 0xab, 0x66, 0xc1, 0x18, 0xeb, 0x54, 0x1c, 0x5a, -0x3e, 0x22, 0x0f, 0xff, 0x59, 0x38, 0x75, 0xd4, 0x1b, 0x1c, 0x9b, 0xeb, 0xa4, 0x03, 0x93, 0x1d, -0xe8, 0x05, 0x6d, 0x17, 0x7b, 0x3f, 0x82, 0x61, 0xb1, 0x62, 0x50, 0xa6, 0x9e, 0x16, 0xea, 0xba, -0x0e, 0x95, 0xf3, 0x51, 0xf6, 0xdc, 0x01, 0x9d, 0x98, 0xd8, 0x13, 0x48, 0x48, 0xdb, 0x99, 0x04, -0xd1, 0x50, 0x83, 0x88, 0x69, 0x04, 0x94, 0x36, 0x01, 0xe4, 0x2b, 0x6d, 0xf3, 0x54, 0x0d, 0xa4, -0x0d, 0x1d, 0x24, 0x58, 0x42, 0x13, 0x80, 0x60, 0x51, 0x25, 0xae, 0x7f, 0x1b, 0x4f, 0xc2, 0x41, -0x8c, 0x48, 0x00, 0x31, 0x0d, 0x69, 0x64, 0x25, 0x41, 0x64, 0xcc, 0x22, 0x30, 0x6d, 0x6f, 0x53, -0xdd, 0x5e, 0x3f, 0x74, 0xac, 0x64, 0x72, 0xf8, 0x5f, 0x58, 0x92, 0xa6, 0xdb, 0x6f, 0x35, 0xdd, -0x1e, 0xc6, 0x09, 0xed, 0x4d, 0xf6, 0x9b, 0x25, 0x3d, 0xb1, 0xd7, 0x5b, 0x69, 0x0b, 0xb0, 0x00, -0x61, 0x45, 0x59, 0xd1, 0x2d, 0xae, 0xdc, 0x9b, 0x36, 0xf0, 0xa3, 0x3b, 0x63, 0xef, 0xf2, 0xa8, -0x79, 0x45, 0xf6, 0x2f, 0x8e, 0x35, 0x9d, 0x7d, 0x27, 0x6b, 0x77, 0x93, 0x24, 0x8c, 0xb7, 0xcb, -0x65, 0x0b, 0x48, 0xda, 0x49, 0xfa, 0x25, 0xec, 0xf9, 0x34, 0xac, 0xc3, 0xc0, 0xee, 0xf7, 0x60, -0xad, 0x59, 0x89, 0x1b, 0xf8, 0x1a, 0x80, 0xd5, 0xca, 0xa8, 0x3f, 0xed, 0xa0, 0x9f, 0x4c, 0x0c, -0x78, 0x1f, 0x53, 0x9e, 0x38, 0xde, 0x8a, 0x86, 0x44, 0x83, 0x5b, 0x17, 0x58, 0xef, 0x09, 0xfe, -0xa3, 0xeb, 0x9a, 0xb6, 0x26, 0xf4, 0x8a, 0x55, 0x1d, 0xef, 0xdd, 0x4e, 0x19, 0x96, 0xcf, 0xd4, -0x42, 0xba, 0x77, 0x3b, 0x2e, 0x5f, 0xbe, 0x72, 0x2d, 0xfb, 0x9d, 0x00, 0x3b, 0xcb, 0x8a, 0x8e, -0xd5, 0x98, 0xac, 0x15, 0x59, 0x21, 0x0c, 0x6c, 0x6c, 0xc1, 0x4d, 0x64, 0x0b, 0x06, 0x36, 0x95, -0xcd, 0x8a, 0x74, 0x82, 0xa8, 0x47, 0x80, 0xe7, 0x75, 0x03, 0x28, 0x17, 0x06, 0x31, 0x70, 0x4c, -0xcb, 0x46, 0xe4, 0x23, 0x3d, 0x59, 0x03, 0x18, 0x03, 0x02, 0x88, 0x05, 0xf9, 0x2b, 0x20, 0x70, -0x28, 0x2e, 0xf5, 0x1c, 0x28, 0xa4, 0xc9, 0x6e, 0xf7, 0x93, 0x24, 0xf0, 0x05, 0x2b, 0xe6, 0x3f, -0xd2, 0xf1, 0xc5, 0x37, 0xc0, 0x8b, 0x3d, 0x2b, 0x8c, 0xdd, 0xb6, 0x47, 0x49, 0x2f, 0x59, 0x6f, -0x48, 0xaa, 0x25, 0x07, 0x81, 0xdf, 0x71, 0x6f, 0x77, 0xca, 0xbc, 0x86, 0x06, 0xf6, 0x18, 0x77, -0x45, 0x50, 0xba, 0x81, 0x4e, 0x74, 0x33, 0x65, 0x53, 0xed, 0xf5, 0x9a, 0xa6, 0x2c, 0x97, 0x99, -0xf4, 0x96, 0xfa, 0x8e, 0x2c, 0xed, 0x50, 0x18, 0xff, 0x21, 0x93, 0x6e, 0xe4, 0x33, 0x60, 0x8a, -0x9c, 0x81, 0x94, 0xd8, 0x29, 0xf3, 0x42, 0x19, 0x50, 0xc6, 0x7a, 0x18, 0x05, 0xf7, 0x04, 0x1a, -0xad, 0x67, 0x34, 0x3a, 0x5d, 0x05, 0xb0, 0xb3, 0x5e, 0xad, 0x11, 0xfc, 0x27, 0xee, 0x61, 0x4d, -0xd1, 0x03, 0xde, 0xf8, 0x04, 0x39, 0x2c, 0x06, 0xea, 0x1d, 0x50, 0x95, 0xeb, 0x87, 0xfd, 0x71, -0x91, 0x6b, 0x08, 0xc9, 0xc7, 0x65, 0x38, 0xc8, 0xc3, 0x39, 0x2d, 0xcc, 0xcb, 0x7e, 0xfa, 0xd0, -0xb7, 0xc6, 0x46, 0x7e, 0x49, 0xdb, 0x41, 0x90, 0x10, 0x14, 0x89, 0xc4, 0x4a, 0x48, 0xcf, 0x75, -0x7c, 0xf7, 0xb6, 0x9b, 0x3c, 0x02, 0x0b, 0x0d, 0x1d, 0x12, 0xec, 0x2e, 0xb5, 0xef, 0xda, 0xc1, -0x83, 0x44, 0x44, 0x0c, 0x09, 0x0e, 0x6f, 0xf7, 0xa5, 0x61, 0xe3, 0xd0, 0x8a, 0xee, 0xc8, 0x69, -0xe0, 0xd0, 0x55, 0x8e, 0xdf, 0x81, 0x46, 0xb0, 0x8d, 0xf9, 0x83, 0x57, 0x13, 0x9b, 0xb1, 0x67, -0xd2, 0x5e, 0x98, 0x0c, 0x49, 0x1b, 0x46, 0x0c, 0xa2, 0x98, 0xd8, 0x16, 0x34, 0x41, 0x82, 0x88, -0xf4, 0x63, 0x4a, 0x0e, 0xae, 0x2e, 0x4f, 0xc8, 0x1b, 0xf2, 0x71, 0x83, 0x58, 0x9d, 0x04, 0x32, -0x23, 0x3e, 0xc1, 0x49, 0x40, 0x80, 0x9d, 0x79, 0x43, 0x92, 0x74, 0xdd, 0x98, 0x08, 0xde, 0x53, -0x78, 0x3c, 0xf2, 0x77, 0xca, 0x73, 0xf8, 0x93, 0x82, 0x2f, 0x34, 0x16, 0xe4, 0x0b, 0x53, 0x2c, -0x6b, 0x2e, 0x53, 0x08, 0x27, 0x6b, 0x83, 0xc0, 0xeb, 0xc7, 0xe4, 0xe4, 0xe8, 0x10, 0x34, 0x8c, -0x70, 0x0e, 0x09, 0x21, 0x43, 0x0e, 0x5d, 0x9f, 0x49, 0x14, 0x31, 0xea, 0xbc, 0xed, 0x5c, 0x5a, -0x8e, 0x1b, 0x10, 0xf3, 0xec, 0xf2, 0x63, 0xad, 0x71, 0x52, 0xa9, 0xbe, 0x29, 0xe4, 0x6b, 0x2d, -0xea, 0xd4, 0x1a, 0xc6, 0x3c, 0x02, 0x58, 0xb0, 0x0f, 0x07, 0xa7, 0x57, 0xb5, 0x7a, 0xa5, 0xb2, -0x9f, 0xb3, 0x0b, 0x76, 0x0f, 0x47, 0xab, 0xa2, 0xaf, 0xa3, 0xe6, 0x45, 0xbd, 0x06, 0xca, 0xae, -0x37, 0x14, 0x24, 0xb2, 0xa4, 0x7e, 0x36, 0x99, 0xe2, 0x88, 0x33, 0x1a, 0x07, 0x1e, 0x9d, 0xdf, -0xcb, 0xe5, 0xad, 0xec, 0x30, 0x72, 0xfd, 0x04, 0x76, 0x4e, 0x03, 0x1a, 0xe1, 0xaa, 0x00, 0x45, -0xd0, 0x5a, 0x29, 0x8f, 0xa3, 0xd1, 0x91, 0xff, 0xd2, 0xb8, 0x9b, 0xc0, 0xfe, 0x21, 0x6d, 0xf7, -0x6f, 0x57, 0x3c, 0xf8, 0xc3, 0xf6, 0xed, 0x4b, 0x18, 0xfd, 0x98, 0x90, 0x27, 0xbd, 0x21, 0x2a, -0x26, 0xc7, 0xa0, 0xcc, 0x44, 0x03, 0xc0, 0xc2, 0x75, 0xdc, 0x5a, 0xaa, 0xa8, 0xf7, 0xfb, 0xbd, -0x36, 0x68, 0x8b, 0x23, 0x14, 0x40, 0x4b, 0x03, 0x0f, 0xb4, 0x71, 0xdc, 0x73, 0xee, 0x1a, 0xc7, -0x3e, 0x34, 0xea, 0x3a, 0x84, 0x55, 0x79, 0x12, 0x6a, 0xe6, 0x72, 0xde, 0x0c, 0xf6, 0x95, 0x5f, -0x6b, 0x34, 0xf6, 0xce, 0x68, 0x72, 0x1f, 0x44, 0x77, 0xcb, 0x53, 0x15, 0x1f, 0xa3, 0x2e, 0xea, -0x44, 0xc3, 0x57, 0xf7, 0xa3, 0x3b, 0x92, 0x08, 0xb9, 0xa7, 0x30, 0x27, 0x19, 0xe5, 0x23, 0xa5, -0xfd, 0x0b, 0x72, 0x01, 0xd9, 0x80, 0x24, 0x87, 0x98, 0x3d, 0xd7, 0x2f, 0x11, 0x8f, 0xfa, 0xb7, -0x49, 0x77, 0x9b, 0x6c, 0x15, 0x72, 0x90, 0xd6, 0xe3, 0x35, 0x49, 0x2b, 0xbc, 0x09, 0xef, 0x1d, -0x03, 0x94, 0x35, 0x9f, 0xb7, 0xb8, 0x6b, 0x6c, 0xa1, 0xd5, 0x24, 0x0f, 0x3d, 0xcf, 0x91, 0x6d, -0x9c, 0x67, 0xef, 0x1d, 0xe1, 0x2a, 0x01, 0x55, 0x81, 0x12, 0x3b, 0xa2, 0x0e, 0x4c, 0x29, 0xf0, -0x8d, 0x18, 0x75, 0x88, 0x61, 0xd0, 0x8f, 0x48, 0x08, 0x3b, 0x30, 0x1a, 0x41, 0x06, 0xc1, 0x69, -0x20, 0x31, 0xdf, 0x59, 0x96, 0xc8, 0xfe, 0x98, 0xc2, 0x01, 0xda, 0x05, 0xab, 0xcf, 0xb5, 0x5e, -0x92, 0x44, 0x2e, 0x65, 0x00, 0x80, 0x44, 0x7c, 0x6a, 0x27, 0xe4, 0xde, 0x4d, 0xba, 0x5c, 0x17, -0xc1, 0xcd, 0x58, 0xd4, 0xe3, 0x20, 0x98, 0x44, 0x78, 0x9e, 0xd9, 0x6c, 0x52, 0x2b, 0xb2, 0xbb, -0x44, 0x50, 0x7d, 0xbc, 0xf4, 0x09, 0x94, 0x8b, 0x4d, 0xea, 0xc0, 0x96, 0xdf, 0x4e, 0x7c, 0xb1, -0x13, 0x94, 0x3f, 0x04, 0x20, 0xf6, 0x0d, 0xec, 0xa2, 0x2f, 0x0a, 0x8e, 0x99, 0x9d, 0xf0, 0xa7, -0x59, 0x30, 0x96, 0x37, 0xd7, 0xb3, 0xe8, 0xac, 0xe1, 0x5f, 0x5c, 0x60, 0x2c, 0x63, 0x91, 0x0c, -0x2c, 0xd7, 0x5b, 0x2a, 0x56, 0xe7, 0xd6, 0xe6, 0x06, 0x0a, 0xea, 0x21, 0x99, 0x71, 0x6c, 0xfb, -0xa2, 0x79, 0x8e, 0xee, 0xd1, 0xaf, 0xc0, 0x3f, 0xe8, 0x5a, 0xfe, 0x2d, 0xe3, 0xd7, 0x1e, 0xf4, -0x71, 0xc2, 0x9c, 0x37, 0xb7, 0x89, 0x20, 0x44, 0x9a, 0x95, 0x13, 0xb5, 0x5e, 0x35, 0x08, 0x6f, -0x14, 0xd6, 0x85, 0xe3, 0xc6, 0x16, 0x30, 0x51, 0x87, 0x74, 0x5d, 0x07, 0x96, 0xcf, 0x9e, 0x0f, -0x1a, 0x38, 0x4e, 0x9d, 0x4f, 0x9d, 0x9d, 0x32, 0xaf, 0x97, 0x73, 0x1c, 0x65, 0x0e, 0x33, 0x07, -0xce, 0x72, 0x13, 0xc4, 0xb3, 0xd2, 0x43, 0xb3, 0x79, 0x7c, 0xb8, 0x52, 0xe6, 0x18, 0xc7, 0xae, -0xb3, 0xd0, 0xfa, 0x78, 0x1e, 0x74, 0x70, 0x4c, 0x10, 0xe0, 0x7f, 0x9c, 0x44, 0x96, 0x8e, 0x93, -0x69, 0xa5, 0x0c, 0x9b, 0xf9, 0x03, 0xe0, 0x45, 0x90, 0x89, 0x14, 0xac, 0x4b, 0x47, 0x4b, 0x28, -0x00, 0x4b, 0xb4, 0x30, 0x41, 0x2a, 0x96, 0xf0, 0xef, 0x17, 0x5f, 0x0f, 0x7f, 0x2c, 0x05, 0x47, -0xf3, 0x74, 0xb4, 0xc7, 0xec, 0x90, 0xb5, 0xbb, 0x64, 0x14, 0xbf, 0x36, 0x39, 0xbe, 0x20, 0x26, -0xe7, 0x2c, 0x96, 0x57, 0x98, 0xbf, 0x59, 0x16, 0x82, 0x7e, 0x2e, 0x66, 0x4f, 0xa8, 0x35, 0xa0, -0x84, 0x77, 0x95, 0x30, 0x83, 0x32, 0x01, 0x71, 0x4d, 0x0e, 0x3f, 0x1f, 0x5c, 0xec, 0xb4, 0xa3, -0xf2, 0x7c, 0x00, 0x57, 0xa0, 0x04, 0xf0, 0x83, 0x1d, 0x54, 0x09, 0x04, 0x20, 0x2b, 0xa2, 0x24, -0xc4, 0xc3, 0x2a, 0x54, 0x88, 0xb9, 0x1a, 0xc0, 0x95, 0x80, 0x6d, 0x52, 0x7d, 0x57, 0x2b, 0x55, -0x37, 0xb7, 0x4a, 0x8d, 0x52, 0x75, 0xce, 0x0c, 0x84, 0x7b, 0xcf, 0xa3, 0x29, 0x00, 0xa6, 0xf7, -0x1d, 0x27, 0xa2, 0x71, 0xbc, 0x52, 0x46, 0xe6, 0x86, 0xd8, 0x0a, 0x68, 0x79, 0xd6, 0x83, 0xd4, -0xf2, 0xaa, 0x1b, 0x8b, 0xa9, 0x79, 0xcf, 0xa3, 0x48, 0xf5, 0xdb, 0x3d, 0x2b, 0xbe, 0x5b, 0x31, -0x6e, 0x4e, 0xa1, 0x89, 0x3f, 0x1e, 0x6e, 0x0e, 0xcf, 0x9a, 0xa4, 0xba, 0x62, 0xcc, 0x1c, 0xfa, -0x71, 0xf5, 0x8f, 0x89, 0x99, 0xda, 0xea, 0x31, 0x53, 0xfb, 0xe3, 0x61, 0xe6, 0x93, 0x95, 0xd0, -0x7b, 0x6b, 0xb8, 0x62, 0xdc, 0x88, 0x56, 0x56, 0x82, 0x9e, 0x9f, 0x65, 0xb1, 0xb8, 0x88, 0x82, -0x84, 0xda, 0xfc, 0x94, 0x73, 0xd5, 0x46, 0x8b, 0xc5, 0x25, 0x35, 0xe9, 0x3d, 0x30, 0xcd, 0x66, -0xac, 0x93, 0xb9, 0x84, 0xf4, 0x0a, 0xe8, 0x8a, 0x69, 0x6b, 0x09, 0xdb, 0x9e, 0x39, 0x3d, 0x10, -0xc0, 0x3f, 0x4d, 0xdb, 0xb2, 0xb0, 0xb9, 0xd5, 0xa8, 0x5c, 0x42, 0xa1, 0x69, 0xf2, 0x7d, 0x5f, -0x68, 0xdd, 0x02, 0xc6, 0xef, 0xbb, 0x2e, 0x6c, 0xe9, 0xe3, 0x6e, 0xd0, 0xf7, 0x1c, 0xd2, 0x06, -0x95, 0x83, 0xe3, 0x1e, 0xb4, 0x8e, 0xf6, 0x90, 0x84, 0xe9, 0xa0, 0xf3, 0x28, 0x12, 0xec, 0x80, -0x00, 0xaa, 0xdf, 0xa0, 0x6c, 0x33, 0xf6, 0x5e, 0x08, 0xc5, 0x1f, 0x0b, 0x7b, 0xf6, 0x6a, 0xcf, -0x73, 0x75, 0xb4, 0xae, 0xd2, 0x46, 0x47, 0x3d, 0xca, 0x75, 0x86, 0x8b, 0x68, 0x95, 0x46, 0xf9, -0xf9, 0x58, 0x55, 0xec, 0x3a, 0x9e, 0x72, 0xea, 0xbb, 0x54, 0xfb, 0xaf, 0x9c, 0x28, 0x1c, 0x51, -0x3b, 0xf1, 0x41, 0x77, 0x53, 0xda, 0x73, 0x20, 0x9d, 0x48, 0x1c, 0xad, 0xc2, 0x42, 0xfe, 0x34, -0x84, 0xa4, 0xa7, 0x35, 0x71, 0xbf, 0xcd, 0xa6, 0xf3, 0x2c, 0x48, 0xd8, 0x31, 0xcd, 0x93, 0x51, -0x15, 0xee, 0xed, 0x93, 0x35, 0x90, 0x2d, 0xa4, 0x17, 0x38, 0x7d, 0x0f, 0x96, 0x62, 0x70, 0x4f, -0xa3, 0x35, 0x8e, 0x15, 0x12, 0x74, 0xc8, 0x5a, 0x65, 0x4d, 0x5a, 0x4d, 0x62, 0x6e, 0x78, 0xec, -0xa2, 0xb9, 0xc4, 0xc3, 0xfd, 0xc1, 0x1a, 0x3a, 0x32, 0x41, 0x59, 0x97, 0xde, 0xe7, 0xe8, 0xcb, -0xb3, 0xe3, 0xec, 0x13, 0xf5, 0x69, 0x84, 0xee, 0x51, 0x4b, 0x40, 0xdb, 0xff, 0xd9, 0x03, 0x14, -0x60, 0x0a, 0xb2, 0xa5, 0x15, 0x9c, 0xa1, 0xac, 0x0c, 0x3b, 0xa7, 0x40, 0xe1, 0x11, 0xe5, 0xd6, -0xee, 0x90, 0x46, 0x20, 0x59, 0x87, 0x5e, 0x60, 0x39, 0xab, 0x45, 0xd4, 0x25, 0x34, 0x38, 0x7c, -0x59, 0x87, 0x8d, 0x62, 0x59, 0x5d, 0x52, 0x94, 0x24, 0x6c, 0x91, 0xc3, 0xa6, 0x1f, 0x44, 0xc5, -0x3f, 0x51, 0xba, 0x1c, 0x5a, 0x3f, 0xcd, 0xd7, 0x04, 0xb1, 0x13, 0x27, 0xa7, 0x79, 0x4c, 0x82, -0xcf, 0x8d, 0x9e, 0xfb, 0x2e, 0xf5, 0x47, 0x07, 0xd4, 0x21, 0x88, 0x79, 0x34, 0x98, 0x84, 0x56, -0x3f, 0x46, 0xdc, 0x25, 0x24, 0xee, 0xfb, 0x50, 0x7a, 0xf5, 0xc8, 0x3a, 0x08, 0x7a, 0xcd, 0x24, -0x08, 0x5f, 0x9e, 0xa3, 0x92, 0x16, 0x57, 0x31, 0xf7, 0xf4, 0x70, 0x63, 0xb2, 0x86, 0x86, 0x76, -0x0b, 0x8f, 0x1c, 0x50, 0x90, 0xac, 0xad, 0x1e, 0x59, 0x20, 0x1f, 0xd9, 0x09, 0xc7, 0xcb, 0xc4, -0x16, 0x0a, 0xdc, 0xb5, 0x74, 0xf9, 0xfd, 0xd4, 0x15, 0x67, 0x3d, 0xbc, 0xb8, 0x45, 0xc7, 0x4c, -0xa5, 0x11, 0x3f, 0x7a, 0x0c, 0xb0, 0xff, 0x6e, 0x8f, 0x92, 0x78, 0xe8, 0xdb, 0xc4, 0x84, 0x35, -0xd6, 0xe9, 0x33, 0x5d, 0x63, 0xff, 0x62, 0xfd, 0xdc, 0xf7, 0x86, 0xeb, 0xe8, 0xa0, 0x55, 0x58, -0xa9, 0x93, 0x44, 0x12, 0x25, 0x5f, 0x93, 0x6e, 0x72, 0xd5, 0x7b, 0x69, 0x58, 0x62, 0x3c, 0x9a, -0x1c, 0x75, 0x3a, 0xae, 0xed, 0x52, 0xdf, 0x1e, 0x12, 0x73, 0xb4, 0x83, 0x6a, 0xd3, 0xe4, 0x9e, -0xc2, 0xda, 0xab, 0x94, 0xde, 0x6d, 0x30, 0x86, 0x0e, 0x1f, 0x9b, 0x4b, 0xc5, 0xd3, 0xa4, 0x74, -0x1b, 0x7a, 0x0e, 0x74, 0xc4, 0x80, 0x25, 0x4e, 0x43, 0xd8, 0x3e, 0xfa, 0xc3, 0x3f, 0x86, 0xeb, -0xc4, 0xd5, 0x05, 0x69, 0x82, 0xee, 0xf2, 0x5c, 0x1b, 0x33, 0xdd, 0xe6, 0x6c, 0xbc, 0x5f, 0x3f, -0xd7, 0xc5, 0x56, 0xa8, 0x47, 0xa3, 0x0e, 0x90, 0x32, 0x39, 0xbe, 0x58, 0x99, 0xaf, 0xad, 0x9f, -0x70, 0xe3, 0xf9, 0x8b, 0xd4, 0x11, 0x11, 0x09, 0x17, 0x41, 0x94, 0xac, 0x50, 0x29, 0x84, 0xf1, -0x63, 0x0b, 0x2f, 0x77, 0xfc, 0xe9, 0x2e, 0xc2, 0x04, 0x9e, 0x7b, 0xea, 0xfa, 0xfd, 0x84, 0xc6, -0x45, 0xc2, 0x9c, 0x68, 0x36, 0xe4, 0xef, 0xc2, 0x6a, 0x11, 0xc4, 0xfd, 0xb3, 0x5e, 0x24, 0x86, -0x70, 0x95, 0x0b, 0xe7, 0x57, 0x14, 0x52, 0x4f, 0xc5, 0xc3, 0x7c, 0x83, 0x9e, 0xde, 0x51, 0x05, -0x10, 0xf5, 0x41, 0xfa, 0xa9, 0xc8, 0x6f, 0x85, 0x59, 0xa3, 0x13, 0x05, 0x3d, 0xe9, 0x8f, 0x3c, -0xee, 0xae, 0x42, 0x93, 0x2b, 0x18, 0x00, 0xf3, 0x58, 0x79, 0x62, 0x2f, 0x9a, 0x20, 0xa8, 0xd3, -0x6e, 0xf0, 0x1f, 0x2a, 0x77, 0x19, 0x14, 0xe7, 0x40, 0x60, 0xe3, 0x7d, 0x80, 0xa4, 0xb4, 0x13, -0xf9, 0xce, 0x2c, 0xf9, 0xf5, 0x16, 0x6c, 0xcb, 0x0a, 0x5d, 0x50, 0xa5, 0xfa, 0x5e, 0x72, 0x96, -0x84, 0xb3, 0xd7, 0x5b, 0x1e, 0x65, 0x0b, 0xff, 0xf9, 0xe4, 0x24, 0x48, 0xe9, 0xea, 0xc9, 0xa4, -0x24, 0xe0, 0x8d, 0xd0, 0x83, 0xf7, 0xa9, 0x52, 0xb4, 0xbc, 0x7c, 0xb9, 0xdc, 0xec, 0xfb, 0x91, -0x1b, 0x53, 0xf2, 0x0b, 0x69, 0x8a, 0xcd, 0xd4, 0x4b, 0x92, 0xce, 0xb3, 0xbd, 0x7b, 0x16, 0x19, -0x7d, 0x62, 0x25, 0x6e, 0xd2, 0x77, 0x28, 0x31, 0x1d, 0x6a, 0xbb, 0x3d, 0xe6, 0x4d, 0xb0, 0x3a, -0x3f, 0xd9, 0xbe, 0x0f, 0xed, 0x2d, 0x4b, 0xbf, 0x5b, 0x1d, 0x4e, 0x02, 0xff, 0xf6, 0xe7, 0x22, -0x05, 0x89, 0xf8, 0x85, 0x23, 0xe5, 0xbc, 0xd3, 0x41, 0x82, 0x37, 0xc3, 0x88, 0xa2, 0x71, 0x02, -0x69, 0xb7, 0x48, 0xf0, 0xba, 0x9b, 0x30, 0x55, 0x3c, 0x1d, 0x45, 0x13, 0x4e, 0x7c, 0x00, 0x14, -0x5b, 0x64, 0xec, 0x86, 0xfb, 0xc4, 0xbd, 0xa8, 0x5d, 0xd3, 0x05, 0x1a, 0x6a, 0x52, 0xb3, 0x8d, -0xb4, 0x4d, 0xc4, 0xc4, 0xe9, 0x47, 0x98, 0xb0, 0xfa, 0x5b, 0x55, 0x7d, 0xff, 0xd0, 0x8d, 0xcf, -0xb0, 0x99, 0x83, 0xa0, 0xf7, 0x87, 0xd8, 0x26, 0x9d, 0xfe, 0xf7, 0xd5, 0xd5, 0xcb, 0x62, 0xc1, -0xbc, 0x47, 0xcf, 0xc2, 0x76, 0x3f, 0x44, 0xc1, 0x1d, 0xdb, 0x16, 0x89, 0xfd, 0xd1, 0x0a, 0x77, -0x47, 0xbd, 0xdf, 0x92, 0xe4, 0xe5, 0x6e, 0x8f, 0x56, 0xbc, 0x35, 0xc2, 0xc1, 0xbf, 0xdc, 0xbd, -0xd1, 0x81, 0xe7, 0x02, 0x85, 0x93, 0x63, 0x67, 0xc2, 0x99, 0x6f, 0x85, 0x74, 0xc0, 0x1b, 0x3c, -0x76, 0x5e, 0x26, 0x3a, 0xbe, 0xc0, 0x76, 0x02, 0xfb, 0xfa, 0xb3, 0xb0, 0x81, 0xed, 0xbd, 0xd0, -0x55, 0x91, 0xde, 0x34, 0x59, 0x0d, 0x26, 0xa6, 0x3d, 0x35, 0xd8, 0x32, 0xb9, 0x7f, 0xa1, 0x64, -0x71, 0x15, 0x84, 0xae, 0xbd, 0x52, 0x42, 0x60, 0x2d, 0x18, 0x24, 0xb4, 0x12, 0x10, 0xe2, 0xfe, -0xae, 0x71, 0xfd, 0x6d, 0xfd, 0xdb, 0x9b, 0xfd, 0xf5, 0xff, 0xb1, 0xd6, 0xff, 0x55, 0x59, 0x7f, -0xf7, 0xad, 0xf4, 0xad, 0xfc, 0x97, 0x6f, 0xff, 0xf1, 0x9f, 0xbf, 0xec, 0xde, 0xb4, 0xde, 0x68, -0x8e, 0x27, 0xc9, 0x93, 0x31, 0x37, 0x7d, 0x75, 0xd2, 0x1f, 0x79, 0x0e, 0xb0, 0xfb, 0x8b, 0x68, -0xae, 0xb6, 0x48, 0xc7, 0x7d, 0x60, 0x5e, 0xb4, 0xdc, 0x9e, 0x52, 0x24, 0x74, 0x80, 0x47, 0x23, -0x1d, 0x3c, 0x43, 0x07, 0xbd, 0xcc, 0x8d, 0x89, 0x1f, 0xb0, 0xb3, 0xf4, 0x5b, 0x5a, 0x22, 0xfb, -0x19, 0xe7, 0xed, 0x93, 0x70, 0x4a, 0xcc, 0x6f, 0x97, 0xb7, 0x12, 0x93, 0xb0, 0xdf, 0xf6, 0xdc, -0xb8, 0x0b, 0xf9, 0xb0, 0xab, 0x06, 0xa0, 0x09, 0xb9, 0xb7, 0x62, 0xd0, 0xf2, 0x6c, 0x9b, 0xc6, -0x71, 0xa7, 0xef, 0x79, 0x43, 0x12, 0x51, 0x9b, 0xba, 0x03, 0x28, 0xc1, 0x2c, 0x01, 0x52, 0xfd, -0x29, 0xa1, 0xbe, 0xdc, 0xb1, 0x60, 0xff, 0xbc, 0x4d, 0x2a, 0x85, 0x55, 0xdf, 0xf7, 0x7c, 0xb6, -0xc3, 0x6a, 0xa4, 0x98, 0x39, 0xa7, 0xd5, 0xe4, 0x45, 0x2e, 0x24, 0xd0, 0x18, 0xed, 0x00, 0xa6, -0x6a, 0x28, 0x2e, 0x59, 0x13, 0xb3, 0x1b, 0xf4, 0x28, 0x54, 0x70, 0xe3, 0xc4, 0xf2, 0x9f, 0xae, -0xc1, 0x3f, 0xc5, 0xe6, 0x83, 0x48, 0x4d, 0xfb, 0xc7, 0x2d, 0x3f, 0x53, 0x49, 0x2a, 0xfb, 0x0f, -0xac, 0x92, 0x09, 0xfb, 0x93, 0xef, 0xa4, 0x15, 0xf8, 0x10, 0x73, 0xda, 0xa2, 0x66, 0x2d, 0x40, -0xa7, 0xd0, 0xf8, 0xaa, 0x4d, 0x40, 0x3f, 0x4b, 0xf3, 0x06, 0x9c, 0x84, 0x9e, 0x35, 0xfc, 0x29, -0xd1, 0x40, 0x16, 0xd5, 0xc1, 0xa7, 0xfb, 0x96, 0xdb, 0x8f, 0x0c, 0xd8, 0x59, 0x78, 0x05, 0x83, -0xcf, 0xe7, 0x47, 0x26, 0x6b, 0x5c, 0x06, 0xc9, 0x63, 0x1c, 0xcf, 0x9e, 0xb2, 0x55, 0xbc, 0xea, -0x47, 0x3e, 0xf0, 0xe0, 0x0e, 0xfa, 0x27, 0x7a, 0x74, 0x6c, 0xaf, 0x88, 0xd7, 0x22, 0x20, 0x1d, -0x76, 0x90, 0xab, 0x0d, 0x40, 0x01, 0xc3, 0xbe, 0x09, 0xef, 0xa3, 0x97, 0x76, 0xf0, 0x78, 0xe4, -0xa3, 0x38, 0x22, 0x4d, 0x3b, 0xa2, 0xd4, 0xc7, 0x40, 0x39, 0x11, 0x31, 0x43, 0x10, 0x4b, 0x1e, -0x89, 0xbb, 0x6e, 0x07, 0xaf, 0x94, 0x16, 0xc9, 0xf9, 0xc9, 0xd1, 0xe1, 0x78, 0x60, 0x82, 0x55, -0x62, 0xe8, 0x81, 0x35, 0xfb, 0x42, 0x2d, 0x52, 0xfd, 0x9e, 0xeb, 0x5b, 0x20, 0x8d, 0x57, 0x28, -0xd6, 0x18, 0x16, 0x70, 0xc1, 0xb3, 0xab, 0xc6, 0xbb, 0x46, 0x85, 0x79, 0x87, 0xef, 0x1a, 0xb5, -0x8d, 0x8d, 0xe5, 0x59, 0x61, 0x26, 0xb5, 0x9c, 0x0b, 0x16, 0x83, 0x23, 0x5f, 0xf8, 0x0a, 0xec, -0x1e, 0x94, 0x8f, 0x33, 0x97, 0xef, 0x93, 0x38, 0xea, 0xec, 0xc4, 0x35, 0x44, 0x34, 0xa5, 0x57, -0x8f, 0xa1, 0x6f, 0x11, 0x6b, 0x47, 0x5c, 0x89, 0xe6, 0xe1, 0x59, 0x46, 0x4a, 0x14, 0x41, 0x8a, -0x5f, 0x80, 0x94, 0xa6, 0x09, 0xfa, 0x55, 0x6e, 0x39, 0x3b, 0x4d, 0xed, 0xfc, 0xc6, 0x36, 0xc8, -0x0a, 0x4c, 0x07, 0x15, 0xae, 0xbc, 0x00, 0xac, 0xb8, 0xdf, 0xee, 0xb9, 0xc9, 0x48, 0xfe, 0xb2, -0xf0, 0x56, 0x23, 0xc1, 0x4c, 0x22, 0x34, 0x48, 0x65, 0x49, 0xdc, 0xcc, 0xb9, 0x53, 0x66, 0xc1, -0x94, 0x06, 0x51, 0x4f, 0x91, 0x3e, 0x86, 0x9c, 0x6e, 0xc4, 0x96, 0x19, 0xce, 0x96, 0xde, 0xd1, -0x77, 0xbc, 0xc2, 0xbc, 0xb9, 0xdd, 0xb1, 0x26, 0xd4, 0x0d, 0x11, 0x84, 0x8c, 0x46, 0x56, 0x0c, -0xf2, 0xe6, 0xe8, 0x72, 0xbf, 0x79, 0x44, 0x9a, 0x47, 0x57, 0x57, 0xc7, 0x67, 0x9f, 0x9a, 0xc4, -0x44, 0x2f, 0x24, 0xbc, 0x1a, 0x5f, 0x98, 0x08, 0x69, 0xb6, 0x6c, 0x41, 0x79, 0xdc, 0xc3, 0x58, -0x91, 0xa4, 0x4c, 0x8e, 0x1e, 0xd8, 0xc7, 0x7f, 0x35, 0xcf, 0xcf, 0xc8, 0x28, 0xa8, 0xde, 0x23, -0xac, 0x58, 0x73, 0xa9, 0x7b, 0xae, 0x37, 0x2c, 0xef, 0xd3, 0xea, 0xd5, 0x46, 0x16, 0x62, 0x0d, -0x99, 0x00, 0x7e, 0x18, 0x69, 0xb0, 0xb5, 0x8b, 0xf3, 0xe6, 0xd5, 0x58, 0xb0, 0xb5, 0x7e, 0x88, -0xce, 0x97, 0x06, 0xa1, 0xbe, 0xcd, 0xa9, 0xb5, 0x07, 0x7a, 0x9c, 0x1b, 0x5a, 0x51, 0xc2, 0x48, -0x68, 0x1d, 0xf7, 0x37, 0x58, 0xdc, 0xa6, 0x61, 0xb2, 0x9e, 0x46, 0xcf, 0xec, 0x27, 0x1d, 0x16, -0x3d, 0x93, 0xe4, 0xf8, 0x33, 0x85, 0xc4, 0x45, 0xae, 0x8f, 0x6b, 0x11, 0xb0, 0x25, 0x8f, 0xd9, -0xc6, 0xd7, 0x59, 0x07, 0x63, 0x3f, 0x8a, 0xf5, 0x2a, 0x86, 0xb5, 0x97, 0xf3, 0xba, 0xc6, 0xfc, -0x16, 0x1b, 0xaa, 0x16, 0xa7, 0x34, 0xc8, 0x71, 0x2d, 0x9b, 0xcf, 0xf2, 0x98, 0x9e, 0x8d, 0x91, -0xf9, 0xf0, 0xf2, 0xfc, 0x02, 0x3d, 0xca, 0x7b, 0xd7, 0x44, 0xb3, 0xd8, 0x57, 0x7a, 0xe4, 0xfa, -0xd4, 0x75, 0x20, 0xd0, 0xc9, 0xd7, 0xe5, 0xea, 0x17, 0x83, 0x92, 0x35, 0xdd, 0xd2, 0xe4, 0x86, -0xc5, 0xdc, 0x9c, 0x0d, 0x08, 0x29, 0xf8, 0x85, 0x0c, 0x40, 0x48, 0x4c, 0xc6, 0x39, 0x90, 0xc2, -0x18, 0xc3, 0xe2, 0xb1, 0x49, 0x89, 0x89, 0x5a, 0x96, 0x70, 0x1e, 0x2c, 0xa6, 0xb7, 0x65, 0x62, -0x72, 0xef, 0x7a, 0x1e, 0xba, 0x82, 0x45, 0xb4, 0x07, 0xdb, 0x2a, 0xe7, 0x75, 0xe1, 0xf9, 0xb6, -0x44, 0x8a, 0x6a, 0xd3, 0xd1, 0x1c, 0x35, 0xc1, 0x1d, 0x3b, 0x20, 0xf0, 0x26, 0x62, 0x3b, 0x8e, -0x4f, 0x81, 0x47, 0x3b, 0xc9, 0x64, 0x9c, 0xd5, 0xfc, 0xc1, 0x36, 0x45, 0x6c, 0x59, 0xf2, 0x8b, -0x1d, 0x84, 0x43, 0x52, 0xab, 0xd4, 0xea, 0x93, 0x61, 0x2d, 0xfb, 0xde, 0x54, 0x7f, 0x3d, 0x77, -0x6f, 0xa6, 0x01, 0x07, 0xb7, 0xac, 0x91, 0x53, 0xba, 0xbd, 0x2d, 0x7f, 0xfd, 0x57, 0xf7, 0xe1, -0xe8, 0x9f, 0x9b, 0xb5, 0xde, 0x07, 0x45, 0x60, 0x4f, 0x5e, 0x8c, 0xcd, 0x59, 0x19, 0xe0, 0xcc, -0x07, 0x7c, 0xeb, 0x26, 0xdd, 0x7e, 0xbb, 0x64, 0x07, 0xbd, 0xb2, 0xd7, 0xef, 0x59, 0x61, 0x9f, -0x8d, 0x65, 0x16, 0xf2, 0x27, 0x56, 0x6e, 0x16, 0xf0, 0x4e, 0x59, 0xf6, 0x7f, 0x3a, 0xce, 0xa6, -0x5c, 0x40, 0x4c, 0xdc, 0xcf, 0x1f, 0xef, 0x54, 0x83, 0xb9, 0xba, 0x59, 0x86, 0xdf, 0xa0, 0x6b, -0xc4, 0xe5, 0x76, 0xe7, 0xed, 0xdb, 0xda, 0x5b, 0xd0, 0x41, 0x3f, 0x1d, 0x5f, 0x91, 0xe6, 0xe7, -0xfd, 0x6d, 0x22, 0x52, 0xc8, 0xf6, 0x36, 0x91, 0x61, 0x4b, 0xb5, 0x58, 0x61, 0xf3, 0x4f, 0x41, -0xb3, 0x4d, 0xc4, 0x5e, 0x31, 0x17, 0xe6, 0x60, 0x4f, 0x62, 0x25, 0xee, 0x80, 0x62, 0x1f, 0x02, -0x3f, 0x2e, 0x05, 0xd1, 0x2d, 0x54, 0xb4, 0x61, 0x9f, 0x42, 0xa1, 0x43, 0xc3, 0x75, 0xdf, 0x5e, -0x8f, 0xad, 0x72, 0xa3, 0x54, 0x29, 0x3b, 0x94, 0x3a, 0x33, 0x18, 0x25, 0x7b, 0x07, 0x07, 0xe4, -0xc3, 0x3f, 0xd7, 0xcf, 0x0e, 0xd6, 0x9b, 0xfb, 0x04, 0x8a, 0xe5, 0xc0, 0xed, 0x34, 0xed, 0x66, -0x06, 0x73, 0x9e, 0x1c, 0xc2, 0xc0, 0x8a, 0x50, 0x55, 0x3f, 0xf6, 0x07, 0x64, 0x97, 0x54, 0xde, -0xcf, 0xe4, 0x25, 0x31, 0x4f, 0x9f, 0xc9, 0x00, 0xbc, 0x6c, 0xd5, 0x36, 0x37, 0x43, 0x50, 0xab, -0xa1, 0xc4, 0xf5, 0xcc, 0x8a, 0xbb, 0x06, 0xdd, 0xbf, 0x48, 0x0c, 0xdc, 0xbc, 0x96, 0x89, 0x30, -0xed, 0x19, 0xad, 0xe2, 0x6c, 0xb9, 0x0a, 0x94, 0x3a, 0xac, 0x13, 0xf3, 0xd3, 0xc5, 0xf1, 0x79, -0xa5, 0xa0, 0x2c, 0x52, 0x85, 0x22, 0x57, 0xbf, 0xf2, 0x22, 0x55, 0x75, 0x91, 0x1a, 0x42, 0x69, -0xf0, 0x22, 0x35, 0x75, 0x91, 0x3a, 0x14, 0xb9, 0x14, 0x50, 0xea, 0xea, 0x22, 0x0d, 0x84, 0x52, -0xe3, 0x45, 0xe0, 0xbb, 0x79, 0xb8, 0xaf, 0x2e, 0x87, 0x23, 0x3b, 0xac, 0xf2, 0x72, 0xf0, 0xdd, -0x3c, 0x38, 0x51, 0x97, 0xdb, 0x84, 0x72, 0x58, 0x66, 0x53, 0x99, 0xfb, 0x56, 0xe4, 0xbe, 0x55, -0xe6, 0x6e, 0x89, 0xdc, 0x2d, 0x65, 0xee, 0x3b, 0x91, 0xfb, 0x4e, 0x8d, 0xb0, 0x8a, 0xc8, 0xae, -0x56, 0xd4, 0xf9, 0x55, 0x99, 0x5f, 0x55, 0xe7, 0x33, 0x74, 0x6e, 0x0a, 0x8c, 0x6b, 0xf0, 0x59, -0x45, 0x84, 0x1e, 0xbe, 0x15, 0x85, 0x34, 0x18, 0xad, 0x32, 0x94, 0x6e, 0x88, 0x42, 0x0d, 0x4d, -0x21, 0x86, 0xcf, 0x2d, 0x51, 0x68, 0x43, 0x53, 0x08, 0x91, 0x79, 0x58, 0x11, 0x85, 0x36, 0xc9, -0x3a, 0xda, 0xab, 0x8f, 0x2f, 0xff, 0xfb, 0x35, 0x14, 0x9f, 0x28, 0xdd, 0x9a, 0xa2, 0x56, 0x15, -0xe9, 0xd6, 0x6b, 0x4b, 0x21, 0x5c, 0x8e, 0xc4, 0x8a, 0x8e, 0x68, 0xf3, 0x50, 0x2d, 0x07, 0x01, -0x34, 0x77, 0x72, 0x74, 0xa8, 0xa5, 0xdb, 0x3c, 0x84, 0xcb, 0x01, 0x35, 0x74, 0xf4, 0xca, 0xb3, -0x37, 0xf4, 0xd3, 0xcd, 0xa7, 0x9a, 0x98, 0x9f, 0x9b, 0x17, 0xc7, 0xe4, 0xf4, 0xb8, 0x79, 0x9e, -0x31, 0xeb, 0x7c, 0xc6, 0x65, 0xd9, 0xf3, 0xe6, 0x71, 0xc6, 0xe4, 0xf3, 0x89, 0x17, 0x65, 0x61, -0xa5, 0xfc, 0x3d, 0x83, 0x06, 0xf8, 0xfc, 0xeb, 0xa7, 0x9f, 0x4f, 0xbd, 0x3a, 0x5f, 0xae, 0xa6, -0xaa, 0x7a, 0x39, 0x55, 0xe5, 0x7a, 0xaa, 0x02, 0x9d, 0xfd, 0x63, 0x4e, 0x5f, 0xe4, 0xea, 0xaa, -0xbe, 0x13, 0x65, 0xf5, 0xf8, 0xa8, 0xc9, 0xa5, 0x54, 0x03, 0x7e, 0xa0, 0x65, 0x18, 0x35, 0x89, -0xe1, 0x1a, 0x60, 0x58, 0xcb, 0x2e, 0x6a, 0x12, 0xb7, 0xb5, 0xba, 0x6c, 0x57, 0x8b, 0xdb, 0x9a, -0xc4, 0x57, 0x4d, 0x8d, 0xaf, 0x9a, 0xc4, 0x57, 0x4d, 0x8d, 0xaf, 0x9a, 0xc4, 0x57, 0x4d, 0x8d, -0xaf, 0xba, 0xec, 0x71, 0xbd, 0xa6, 0xce, 0x97, 0x7d, 0xad, 0xd7, 0xd5, 0xf9, 0x72, 0xee, 0xeb, -0x0d, 0xe6, 0xba, 0xcb, 0x2c, 0x71, 0xea, 0x92, 0x72, 0x24, 0xf5, 0x8d, 0x79, 0x25, 0x71, 0x4c, -0xff, 0xb8, 0x10, 0x2b, 0x61, 0x13, 0xdf, 0x37, 0xc8, 0x2a, 0x8d, 0xb3, 0xf8, 0x8f, 0x33, 0x51, -0xfa, 0xdd, 0x78, 0xe9, 0x69, 0x7e, 0xa1, 0xe4, 0x10, 0x71, 0x7d, 0x99, 0x3c, 0x82, 0x98, 0x87, -0xe7, 0x67, 0x57, 0xe4, 0x0b, 0x6c, 0xff, 0xd7, 0xc9, 0x87, 0xf3, 0xf3, 0xab, 0x82, 0x9e, 0x6b, -0x30, 0xd2, 0x9b, 0xc3, 0x30, 0xf4, 0xac, 0x82, 0x0d, 0x77, 0x05, 0x5c, 0x62, 0x53, 0x66, 0x6b, -0xa5, 0xd9, 0x1c, 0x71, 0x36, 0x47, 0x9e, 0xad, 0x5c, 0xa0, 0x71, 0x0e, 0x37, 0x8f, 0xab, 0xcd, -0xe3, 0x64, 0xcf, 0xcd, 0xbd, 0xe6, 0x73, 0xac, 0x31, 0x42, 0xfb, 0xd2, 0xfc, 0xb0, 0xae, 0xe1, -0x1f, 0x12, 0xa3, 0xb5, 0xca, 0x74, 0x8d, 0x37, 0x73, 0x39, 0xdd, 0x3c, 0x8e, 0x43, 0xcc, 0x8b, -0xe6, 0xe5, 0xfe, 0x29, 0x93, 0xd1, 0x63, 0xd7, 0xec, 0x0a, 0xf3, 0x38, 0x11, 0x31, 0x3f, 0x9e, -0xec, 0x37, 0x3f, 0xe7, 0xac, 0x27, 0x71, 0x52, 0xdb, 0x5a, 0xac, 0x9e, 0xc4, 0x55, 0xed, 0xdd, -0x42, 0xf5, 0xea, 0x12, 0x63, 0xf5, 0xca, 0x62, 0xf5, 0x24, 0xde, 0xea, 0xd5, 0xc5, 0xea, 0x8d, -0x38, 0xf0, 0x62, 0xf5, 0x46, 0x9c, 0x99, 0x1b, 0x18, 0x29, 0xec, 0xe2, 0x63, 0x76, 0x24, 0x4f, -0xbe, 0x5e, 0x9e, 0x9f, 0x9f, 0x8a, 0x9b, 0xf5, 0x71, 0x61, 0x3e, 0xe3, 0x7e, 0x44, 0xf5, 0x11, -0x37, 0xd7, 0xf3, 0x70, 0xce, 0xbf, 0xd5, 0xf9, 0x92, 0x1a, 0xea, 0x1a, 0xb9, 0x24, 0x67, 0xbd, -0xbe, 0xa5, 0xe7, 0xfa, 0x9c, 0xe3, 0xab, 0x79, 0xa0, 0x9c, 0xc5, 0x86, 0x9a, 0x93, 0x34, 0xe4, -0x6c, 0x35, 0xd4, 0x54, 0xde, 0x90, 0xb3, 0xd2, 0x50, 0x73, 0x92, 0x86, 0xc4, 0x7e, 0x43, 0xc3, -0x83, 0x25, 0x7a, 0x1b, 0x6a, 0x4e, 0xd2, 0x90, 0xf8, 0x6b, 0x6c, 0x4c, 0xac, 0xcb, 0xe6, 0xd5, -0xe5, 0xfe, 0xc5, 0xc5, 0xf1, 0xd9, 0x27, 0x02, 0x7f, 0x69, 0x94, 0x40, 0x89, 0xda, 0xc6, 0xe6, -0xc2, 0x55, 0x25, 0xd6, 0x1b, 0x6a, 0xac, 0x37, 0x24, 0xd6, 0x1b, 0x33, 0x58, 0x9f, 0x12, 0x9f, -0x33, 0xb2, 0xd4, 0xa3, 0xce, 0x4d, 0x17, 0x36, 0xfb, 0x37, 0x68, 0x6c, 0x1d, 0x50, 0xb5, 0x3c, -0xc5, 0x49, 0xf1, 0x82, 0x7b, 0xc2, 0xcb, 0x68, 0x37, 0x81, 0x08, 0x47, 0x53, 0x66, 0x5a, 0xeb, -0xb7, 0x61, 0xef, 0x9d, 0x90, 0x08, 0xdb, 0x2b, 0x57, 0x01, 0x7e, 0xb5, 0x58, 0x6f, 0x81, 0xf8, -0x6c, 0x14, 0x37, 0x8b, 0x5b, 0x2d, 0x00, 0x06, 0x9f, 0xad, 0xd2, 0x5f, 0xcb, 0x53, 0xb5, 0xee, -0x5d, 0xdf, 0x09, 0xee, 0x4b, 0xa0, 0x26, 0x04, 0x96, 0x03, 0x55, 0x3b, 0x7d, 0x9f, 0x99, 0x88, -0xcd, 0x02, 0xf9, 0x7d, 0xa6, 0x4b, 0x9d, 0x20, 0x32, 0xdd, 0x04, 0x7d, 0x64, 0x1c, 0xf1, 0x70, -0x4a, 0x09, 0x76, 0xf2, 0x47, 0x1e, 0xc5, 0xcf, 0xf8, 0xc3, 0xf0, 0x00, 0x2d, 0x1d, 0xf8, 0x52, -0x84, 0x39, 0x75, 0xaa, 0x5e, 0x50, 0x41, 0xc3, 0x3f, 0x6e, 0x52, 0xb2, 0x1c, 0xe7, 0x68, 0x00, -0xf5, 0x4f, 0xdc, 0x38, 0xc1, 0xf0, 0x10, 0xa6, 0xc1, 0x2c, 0xa7, 0x46, 0x31, 0xbb, 0x2f, 0xf2, -0x0f, 0x46, 0xc8, 0x2b, 0x31, 0x13, 0x0b, 0x02, 0x28, 0x25, 0xc1, 0xed, 0xad, 0x07, 0xed, 0x0b, -0x9c, 0x15, 0xde, 0x6b, 0x2b, 0xe2, 0x54, 0x89, 0x23, 0x7b, 0x18, 0x37, 0x03, 0xe3, 0xd3, 0x07, -0x39, 0x9a, 0x26, 0xf4, 0xdb, 0xf5, 0x6f, 0xf5, 0xd5, 0x45, 0xd5, 0x12, 0x7f, 0xbc, 0xca, 0x11, -0x27, 0xf3, 0xbb, 0xc4, 0xd4, 0x64, 0xec, 0xee, 0x12, 0xa3, 0xed, 0x05, 0x30, 0xb0, 0x02, 0xf9, -0x1b, 0x31, 0xfc, 0xc0, 0xa7, 0x06, 0xd9, 0x96, 0x69, 0xea, 0x76, 0x7e, 0x28, 0xba, 0xff, 0x63, -0xf6, 0x40, 0x4e, 0x31, 0x19, 0x1f, 0x86, 0xc7, 0x8e, 0x39, 0x7a, 0x47, 0xa5, 0xa0, 0xc0, 0xb2, -0x38, 0x9e, 0xca, 0x81, 0x66, 0xc4, 0x14, 0x33, 0x7f, 0xa3, 0x6e, 0x98, 0x36, 0xf6, 0x5b, 0x9f, -0x46, 0x43, 0x1e, 0x53, 0x28, 0x88, 0xf6, 0x3d, 0xcf, 0x34, 0x58, 0x99, 0x6b, 0x66, 0x84, 0x59, -0xe3, 0xc7, 0xa5, 0x6b, 0x2d, 0xdd, 0x0c, 0x60, 0xa4, 0x44, 0x93, 0x01, 0x66, 0xe6, 0x16, 0xf8, -0x67, 0x47, 0xb4, 0x51, 0xe2, 0x31, 0xb6, 0x20, 0xe9, 0xcd, 0x9b, 0xac, 0x89, 0x77, 0x3b, 0xa8, -0x3c, 0x63, 0x8d, 0x6b, 0xb7, 0x55, 0x62, 0xc6, 0xd8, 0x12, 0x7b, 0x2f, 0xeb, 0xbc, 0x63, 0x1a, -0x45, 0xc0, 0xf2, 0xeb, 0x5d, 0xb2, 0x5e, 0x2d, 0x64, 0xda, 0x5e, 0xa7, 0xea, 0x43, 0x57, 0xa6, -0x21, 0x46, 0x14, 0xa6, 0xcf, 0xa6, 0x08, 0x11, 0x96, 0x63, 0x49, 0x37, 0x9c, 0x1f, 0xaf, 0xe6, -0xcd, 0xdd, 0xd4, 0xbc, 0x69, 0xe7, 0x4c, 0x04, 0xc8, 0x29, 0x3c, 0x76, 0x5d, 0xb8, 0x83, 0xcf, -0x49, 0xcf, 0x63, 0x76, 0xeb, 0x12, 0x8b, 0x23, 0x69, 0xae, 0xfd, 0x6e, 0x50, 0xe6, 0x3e, 0xe0, -0x18, 0xdb, 0x49, 0xd4, 0xa7, 0x45, 0x03, 0xcf, 0x4a, 0x8c, 0x6d, 0x03, 0xc6, 0xc4, 0x9f, 0xab, -0xe2, 0xdf, 0x22, 0xac, 0x4c, 0x6c, 0x6c, 0x6f, 0xe2, 0x8f, 0x9b, 0x9e, 0xf5, 0xc0, 0x5c, 0x21, -0xb6, 0x81, 0x99, 0xa4, 0xff, 0x6b, 0xb1, 0x2c, 0x0e, 0xe0, 0x1a, 0x6b, 0x4d, 0xfc, 0x9f, 0xe7, -0x0e, 0xd1, 0x2a, 0x0d, 0xeb, 0x7f, 0xba, 0xea, 0x8f, 0xb5, 0xc2, 0x34, 0x52, 0x0a, 0x53, 0xec, -0x48, 0x0e, 0x8d, 0x58, 0xa1, 0x7b, 0xd0, 0xfe, 0xea, 0x76, 0x5c, 0x33, 0x68, 0x7f, 0x57, 0x8d, -0x93, 0xed, 0x5a, 0xc6, 0xe9, 0x71, 0x1a, 0x91, 0x69, 0x2c, 0x63, 0xc5, 0x94, 0xc5, 0xd4, 0x3b, -0xa4, 0x1e, 0x10, 0xed, 0x79, 0x98, 0x98, 0x54, 0x51, 0xc0, 0xed, 0x60, 0xbb, 0xd7, 0x86, 0x38, -0x83, 0x36, 0x5a, 0x6a, 0x3a, 0xa2, 0x25, 0x7c, 0x08, 0xc9, 0x77, 0x0e, 0xba, 0xae, 0xe7, 0xa0, -0xfb, 0xa9, 0x89, 0xc1, 0x8e, 0x81, 0x50, 0x58, 0x44, 0x63, 0xbc, 0xdc, 0x50, 0x2a, 0x01, 0xcd, -0xcc, 0x56, 0x06, 0x34, 0xd3, 0xc5, 0x20, 0x1e, 0x45, 0x51, 0x10, 0x01, 0xbf, 0x20, 0x6f, 0x08, -0xeb, 0x19, 0xc5, 0xdf, 0xd0, 0xaf, 0x6c, 0x32, 0x9b, 0xc4, 0xe7, 0x59, 0x12, 0x3e, 0x1a, 0x9d, -0x13, 0xd7, 0xfd, 0x9e, 0x82, 0x31, 0x17, 0x88, 0x2c, 0xfa, 0x7c, 0x75, 0x7a, 0x02, 0xad, 0x19, -0x68, 0x33, 0xc6, 0xbb, 0xf2, 0xf4, 0x81, 0xda, 0xfd, 0x84, 0x3a, 0x45, 0x3c, 0x7a, 0x21, 0x3e, -0xbd, 0xe7, 0x21, 0x08, 0x10, 0x7b, 0xef, 0x17, 0x41, 0xde, 0x04, 0x70, 0x0d, 0xca, 0x16, 0x43, -0x58, 0x6d, 0x65, 0x18, 0x43, 0x00, 0x78, 0x4b, 0x10, 0x60, 0xe0, 0x80, 0x0f, 0xe1, 0x93, 0xa3, -0x30, 0x89, 0x6f, 0xfc, 0xe0, 0xde, 0x68, 0x91, 0xbf, 0x92, 0x6a, 0xa5, 0x52, 0x51, 0x54, 0x9d, -0x1a, 0x28, 0xde, 0xe3, 0x04, 0x7d, 0x15, 0x63, 0xc4, 0xe2, 0x60, 0x93, 0xe0, 0x38, 0x0e, 0x10, -0x5c, 0x33, 0x89, 0x4c, 0x6c, 0xa1, 0x00, 0x89, 0x40, 0x43, 0x8e, 0xdb, 0xe9, 0xd0, 0x88, 0x42, -0x59, 0x5e, 0xce, 0x04, 0x86, 0xbe, 0x4e, 0x26, 0x9a, 0x64, 0x25, 0x7b, 0xb1, 0xb1, 0x00, 0x8e, -0xd0, 0xf9, 0xef, 0xe9, 0x38, 0x62, 0x2e, 0x84, 0x2b, 0x23, 0xab, 0xe7, 0x22, 0xa2, 0xf4, 0x92, -0xaf, 0x06, 0x37, 0xd3, 0xd3, 0xaf, 0xa1, 0x12, 0x68, 0x58, 0x94, 0x3a, 0x6f, 0x7f, 0x07, 0x79, -0xab, 0x2a, 0x07, 0x65, 0x4a, 0x76, 0xcf, 0x61, 0xe4, 0x40, 0x93, 0x1b, 0x5c, 0x3e, 0x86, 0xba, -0x14, 0x3a, 0xfd, 0xee, 0xf2, 0x18, 0xc3, 0xc7, 0x7e, 0xc2, 0x08, 0x04, 0xe7, 0x45, 0x74, 0xb4, -0xac, 0xa3, 0x39, 0x28, 0xb2, 0xff, 0xdd, 0x7a, 0x30, 0xd9, 0xb3, 0x7c, 0xfc, 0xcd, 0x42, 0xa0, -0x29, 0xb9, 0x4c, 0x80, 0x43, 0x31, 0x0f, 0x83, 0x22, 0xf3, 0xb5, 0x00, 0xe5, 0x07, 0xaf, 0x76, -0xb9, 0x9d, 0x21, 0xa3, 0x0c, 0x25, 0x07, 0x66, 0x0d, 0x06, 0xfd, 0xc4, 0x1c, 0x17, 0x67, 0xb2, -0x91, 0x35, 0xd6, 0x08, 0x13, 0xe7, 0x6b, 0xa3, 0x46, 0x6a, 0x85, 0x1f, 0x45, 0x52, 0x9b, 0xed, -0x9e, 0x16, 0xfd, 0xec, 0x49, 0x00, 0x0d, 0xee, 0x17, 0x45, 0x2a, 0xc0, 0xba, 0xc1, 0xe7, 0xf2, -0x8c, 0x85, 0x50, 0x83, 0x22, 0x6c, 0x25, 0xb8, 0x61, 0xad, 0x94, 0xa5, 0x90, 0x03, 0x24, 0x79, -0xa0, 0x27, 0xc8, 0xc7, 0x04, 0x10, 0x4f, 0x1b, 0x0b, 0xe0, 0x29, 0xbd, 0x07, 0xbe, 0x24, 0x5c, -0x01, 0xbc, 0x1b, 0x1f, 0xb8, 0xde, 0x9f, 0x83, 0x8a, 0x54, 0x9e, 0xd2, 0xcb, 0x41, 0x94, 0x23, -0xc1, 0xde, 0xd8, 0x9d, 0xdb, 0xc5, 0xb0, 0x85, 0x0c, 0x73, 0x11, 0x74, 0xe9, 0x46, 0xc7, 0xfd, -0x53, 0x14, 0xc3, 0xd1, 0xf2, 0x6c, 0xe6, 0x57, 0x54, 0x28, 0xf1, 0xfd, 0x83, 0x8e, 0x65, 0x65, -0x72, 0x7d, 0xe9, 0x29, 0xad, 0x94, 0x6c, 0x42, 0xe3, 0x66, 0x0a, 0x10, 0x08, 0x2b, 0x13, 0x3d, -0x28, 0x4c, 0xe1, 0xd8, 0x83, 0xf1, 0xac, 0x22, 0xe4, 0xe7, 0x79, 0x47, 0xe7, 0x50, 0xef, 0x78, -0xa0, 0x9d, 0x2d, 0xd7, 0x91, 0x3b, 0x3f, 0xd7, 0xc1, 0xf1, 0x70, 0x04, 0x9a, 0xb0, 0x37, 0x97, -0x89, 0x7c, 0x2f, 0xb2, 0x5e, 0x57, 0xf4, 0x54, 0x37, 0x3a, 0xd7, 0x29, 0x94, 0xb8, 0x03, 0x88, -0x99, 0xb3, 0x93, 0x3d, 0xef, 0xa0, 0x0d, 0xd5, 0x40, 0x40, 0xa3, 0x3b, 0x89, 0xdd, 0xbd, 0xdb, -0xed, 0x58, 0x20, 0x9d, 0x74, 0xbd, 0xb6, 0xdb, 0xd0, 0xeb, 0x9e, 0xdc, 0x6f, 0xc1, 0xe4, 0xff, -0x8e, 0x5b, 0x2e, 0x10, 0x51, 0xa9, 0xf3, 0x62, 0x11, 0x46, 0xb6, 0x4d, 0x10, 0x22, 0x2a, 0xea, -0xf8, 0x05, 0x14, 0x6f, 0x68, 0xc4, 0x2b, 0xb4, 0xa7, 0x96, 0xa9, 0x76, 0xbb, 0x24, 0xdd, 0x1e, -0x01, 0x4b, 0xb0, 0x71, 0x98, 0xad, 0x1e, 0x01, 0x45, 0x46, 0x3e, 0xeb, 0x8c, 0xe3, 0x0e, 0xb0, -0x2b, 0x6c, 0x27, 0x0e, 0x7d, 0x49, 0xbd, 0x79, 0xa1, 0xe5, 0x6b, 0x25, 0x78, 0x45, 0xa5, 0x29, -0xaf, 0xd0, 0x1f, 0x0c, 0x23, 0x85, 0xe2, 0x22, 0xd5, 0xc7, 0xdc, 0x3e, 0xa1, 0xba, 0xdd, 0x9e, -0x1d, 0x5a, 0x2b, 0xf7, 0xac, 0x1c, 0x99, 0x6c, 0x42, 0x94, 0x13, 0xb1, 0x82, 0x91, 0xcf, 0x78, -0x49, 0x3d, 0x66, 0xfc, 0xe3, 0xfe, 0x51, 0x3f, 0xb0, 0xef, 0x8f, 0x1e, 0x3f, 0x90, 0xf5, 0xc7, -0x88, 0x52, 0xa0, 0xe8, 0xcc, 0xe5, 0x53, 0x99, 0xa5, 0x0a, 0xe6, 0xbb, 0x0f, 0x04, 0x0d, 0x5b, -0x7a, 0xee, 0x69, 0xa1, 0xb5, 0xfe, 0x74, 0x4c, 0xbf, 0xef, 0x81, 0x36, 0x92, 0xc1, 0x2b, 0x5c, -0x7f, 0x80, 0xba, 0x17, 0xac, 0x2a, 0xfd, 0x56, 0x5e, 0x4c, 0x86, 0xeb, 0xa8, 0x37, 0xe7, 0xae, -0xf3, 0xe6, 0x8d, 0xca, 0x90, 0xa2, 0x01, 0x83, 0x5d, 0xca, 0x87, 0x22, 0xb1, 0xd7, 0xce, 0x50, -0x7e, 0x19, 0x8a, 0xc6, 0x30, 0xa9, 0x5c, 0x81, 0x12, 0x07, 0x30, 0x46, 0x0d, 0xa2, 0x80, 0xf3, -0x7f, 0x46, 0x3e, 0x2d, 0xad, 0x03, 0x45, 0xb6, 0x1e, 0x35, 0xb6, 0x08, 0x3e, 0x8c, 0x5c, 0x96, -0x23, 0xd6, 0xc5, 0x81, 0x60, 0x27, 0x82, 0x9a, 0x90, 0x75, 0x8c, 0xb0, 0x0e, 0x34, 0x84, 0xdd, -0x5b, 0x80, 0xff, 0x8d, 0x82, 0x16, 0x17, 0x26, 0xf6, 0xb2, 0xee, 0x40, 0x35, 0xfa, 0xc1, 0x44, -0x19, 0x20, 0x77, 0xd3, 0x48, 0x6f, 0xf2, 0xc9, 0x79, 0x57, 0x54, 0x63, 0xd2, 0x33, 0xed, 0xe4, -0x7b, 0xf5, 0xc8, 0x2c, 0xc7, 0x89, 0xa6, 0x59, 0xa5, 0x64, 0x88, 0xb8, 0xcf, 0x61, 0x17, 0xbd, -0x8b, 0x44, 0x2e, 0x1f, 0x76, 0xd1, 0xb1, 0x48, 0x04, 0x33, 0x15, 0xfe, 0xfe, 0x45, 0x24, 0xe1, -0x6d, 0x52, 0xad, 0x6f, 0xbd, 0x93, 0x7f, 0x8a, 0xdc, 0xf3, 0x6f, 0x9b, 0xef, 0x07, 0x84, 0x05, -0xa5, 0x35, 0x42, 0x94, 0x7e, 0x90, 0xa6, 0x66, 0x25, 0x33, 0xf6, 0x8f, 0x3d, 0xe2, 0xd7, 0x3c, -0x70, 0xbb, 0x7f, 0x00, 0x3b, 0x98, 0xbe, 0xef, 0xda, 0xec, 0xf1, 0x2f, 0x92, 0xa6, 0xf3, 0x2d, -0x88, 0xb0, 0xe6, 0xb4, 0xb4, 0xac, 0xe1, 0xc8, 0x34, 0xc4, 0x8b, 0x86, 0x67, 0x6c, 0x18, 0xc4, -0x04, 0xbe, 0xe0, 0xb8, 0xb7, 0x6e, 0x12, 0x17, 0xfe, 0x8a, 0x1a, 0x04, 0x8c, 0x7c, 0x76, 0x39, -0xa9, 0xfa, 0x7e, 0xbd, 0x76, 0x47, 0x87, 0xfd, 0x10, 0xd4, 0xa7, 0x35, 0x7e, 0x55, 0x72, 0xad, -0x55, 0x02, 0x05, 0xe0, 0xc8, 0xb2, 0xbb, 0x23, 0x95, 0x8b, 0x0e, 0x12, 0x1d, 0xe5, 0x62, 0x4b, -0xb3, 0xa6, 0x2c, 0xa8, 0x50, 0x24, 0x26, 0x30, 0xd6, 0xdd, 0xbd, 0x0c, 0x0b, 0x1f, 0xce, 0x21, -0x47, 0x2f, 0xcc, 0x22, 0x03, 0xc4, 0x6d, 0x72, 0xe3, 0x92, 0xba, 0x31, 0xc7, 0xc2, 0x8b, 0x71, -0x95, 0x95, 0x4c, 0x6a, 0xdc, 0xa6, 0xcd, 0x96, 0xc1, 0x6e, 0xe5, 0xbd, 0xbb, 0xb3, 0xf9, 0x7e, -0x8e, 0xd5, 0x71, 0x7c, 0x35, 0x02, 0x5f, 0x31, 0x4e, 0x03, 0xe7, 0xe2, 0x3e, 0x32, 0xde, 0xb8, -0x99, 0x4b, 0x52, 0x53, 0x13, 0x4d, 0xe5, 0x8f, 0xa9, 0xca, 0xc2, 0x10, 0x1e, 0x04, 0xb9, 0x9a, -0xfd, 0xf1, 0x6a, 0x1e, 0x44, 0xe6, 0x9d, 0xfd, 0x66, 0x6c, 0x30, 0x73, 0x61, 0x2a, 0x6b, 0xb2, -0xc1, 0x3c, 0xa2, 0x6a, 0x3a, 0x98, 0xb4, 0x6e, 0x86, 0xc9, 0xd7, 0xe4, 0xf4, 0x50, 0x42, 0x8f, -0xf4, 0xfd, 0xc4, 0xac, 0x14, 0x90, 0x6f, 0x56, 0xe7, 0x4d, 0x18, 0xd4, 0x9b, 0xaa, 0x58, 0x65, -0x15, 0xa1, 0xfa, 0xbf, 0xff, 0x4d, 0x94, 0x59, 0x55, 0x7d, 0x56, 0xbd, 0x30, 0xaf, 0x3d, 0x75, -0x9b, 0x75, 0x3d, 0x60, 0x9e, 0x55, 0xd3, 0x67, 0x35, 0x72, 0xb5, 0xc9, 0x10, 0x7c, 0xef, 0x26, -0xb0, 0x36, 0x27, 0x81, 0xd4, 0x72, 0x57, 0x67, 0x9c, 0x5d, 0xdc, 0x4b, 0xce, 0x5d, 0xc1, 0xb6, -0x62, 0x4a, 0x8c, 0x9a, 0xb1, 0x2d, 0x96, 0x5b, 0xf5, 0x3d, 0x69, 0x47, 0xd4, 0xba, 0x7b, 0xbf, -0x20, 0x84, 0x46, 0x0a, 0xa1, 0xf6, 0x48, 0x08, 0x9b, 0x29, 0x84, 0xc6, 0x23, 0x21, 0x6c, 0xa5, -0x10, 0x36, 0x17, 0x82, 0xf0, 0xe3, 0xd5, 0xd3, 0x4a, 0xfc, 0xc8, 0x58, 0xc1, 0x59, 0x0b, 0x02, -0xfb, 0xfa, 0x9a, 0x91, 0x72, 0xf6, 0x04, 0x4f, 0xf2, 0x39, 0xa8, 0x95, 0x87, 0xd3, 0x65, 0x70, -0x3b, 0xbe, 0x45, 0x79, 0xbf, 0x68, 0xf5, 0x94, 0xe5, 0x3d, 0xa6, 0xfe, 0x04, 0xdf, 0xcb, 0x03, -0xe0, 0x47, 0x2e, 0x96, 0xaa, 0x60, 0x80, 0x79, 0x80, 0x67, 0x71, 0xc1, 0xc7, 0xd5, 0x1f, 0x63, -0x85, 0xf3, 0x00, 0xfc, 0xd0, 0x1c, 0x18, 0x2a, 0xcf, 0xa1, 0x32, 0x34, 0x12, 0xa6, 0x2b, 0x60, -0xa7, 0x51, 0x2d, 0x00, 0x2d, 0x49, 0x28, 0x22, 0x62, 0x18, 0x4c, 0xdd, 0x60, 0x87, 0x3d, 0xad, -0x22, 0x41, 0x97, 0x9f, 0x6b, 0xae, 0x25, 0xb5, 0xb8, 0xb2, 0x53, 0x4c, 0x95, 0x26, 0xe3, 0xfa, -0xdb, 0xb7, 0xf5, 0x6f, 0x63, 0x71, 0x20, 0x4a, 0xdf, 0xbe, 0x95, 0xff, 0x22, 0xc3, 0x40, 0x40, -0xfe, 0xe4, 0x95, 0xff, 0x42, 0x41, 0xd5, 0x2b, 0x49, 0xa2, 0xdf, 0xf1, 0x84, 0x59, 0xbd, 0x75, -0xba, 0x1e, 0x4d, 0xd1, 0xf8, 0x11, 0x15, 0xfc, 0xc2, 0xf0, 0xf2, 0xa7, 0xfc, 0x01, 0x85, 0x0b, -0x7c, 0x40, 0x81, 0x98, 0x5f, 0xc3, 0x02, 0x64, 0xa0, 0xf7, 0xc1, 0x35, 0x74, 0x08, 0xba, 0xd1, -0x2a, 0xea, 0x61, 0x8a, 0x01, 0xa7, 0x87, 0x5b, 0x08, 0x91, 0x43, 0x13, 0x39, 0x38, 0x7a, 0x1c, -0xb3, 0x16, 0xc8, 0xd8, 0xe4, 0x4d, 0x1e, 0x82, 0xc1, 0x6f, 0x1e, 0x37, 0xf8, 0x2a, 0x48, 0xd8, -0x0b, 0xdf, 0x51, 0xc4, 0x5f, 0xb9, 0x21, 0xd7, 0x77, 0x5f, 0xbb, 0x2d, 0xc8, 0xdf, 0x12, 0x08, -0x64, 0xf1, 0x33, 0xb0, 0xa3, 0x2d, 0x5c, 0x98, 0xda, 0xb3, 0x58, 0x1b, 0xf5, 0x21, 0x33, 0xa2, -0xa5, 0x84, 0xc6, 0x89, 0x39, 0xa1, 0x85, 0x16, 0xd8, 0xe1, 0x32, 0x3b, 0x58, 0x66, 0x96, 0x1d, -0x43, 0x23, 0x4d, 0x5d, 0xbd, 0x52, 0x64, 0x45, 0xd1, 0xb1, 0x8f, 0x4e, 0x0b, 0x2d, 0xed, 0xc9, -0xad, 0x70, 0x02, 0xc0, 0x96, 0xbf, 0x5f, 0x57, 0x79, 0x6f, 0x75, 0x84, 0xca, 0xc0, 0x95, 0xc2, -0x7e, 0xdc, 0x35, 0x35, 0x5b, 0xd6, 0x3a, 0x81, 0x9d, 0xea, 0xbc, 0x63, 0x5a, 0x4e, 0x97, 0xdf, -0xaf, 0x2b, 0x2d, 0xd4, 0xf8, 0x81, 0x54, 0x41, 0x81, 0xfc, 0x7e, 0x5d, 0x07, 0x42, 0xbc, 0x6e, -0x15, 0xc9, 0x54, 0xa6, 0xa4, 0xca, 0xef, 0xd7, 0x8d, 0xd6, 0x2c, 0xed, 0x69, 0x9b, 0x2a, 0x64, -0xac, 0x37, 0x57, 0xb5, 0x85, 0xcc, 0xe0, 0xce, 0x73, 0x74, 0x7e, 0xcd, 0x0e, 0x7e, 0xe6, 0xc1, -0x48, 0x18, 0x8f, 0xed, 0x71, 0x73, 0x0e, 0x63, 0x13, 0x6c, 0xbb, 0x23, 0xc6, 0xaa, 0xb5, 0x2f, -0x3c, 0xc2, 0xce, 0xf0, 0xfd, 0xba, 0xa6, 0xdb, 0x4d, 0x2c, 0x64, 0x70, 0x98, 0xcb, 0xce, 0xd5, -0x83, 0xc6, 0x2e, 0x30, 0x42, 0xc9, 0x3e, 0xae, 0xd7, 0xe7, 0x6a, 0x8e, 0x85, 0x0a, 0xb9, 0x77, -0xc1, 0x0e, 0xf5, 0xa6, 0xb7, 0x8a, 0xb2, 0x7f, 0x78, 0x57, 0x17, 0xfe, 0x3b, 0xa4, 0xde, 0x68, -0x77, 0x28, 0x6e, 0x00, 0x4a, 0x43, 0xdb, 0x1b, 0xc3, 0x61, 0xb9, 0x62, 0x63, 0x68, 0xfc, 0x6a, -0x64, 0xec, 0x9b, 0xa9, 0x97, 0x71, 0xb6, 0xcf, 0x0c, 0x96, 0x59, 0x1b, 0x65, 0xce, 0xb1, 0xa1, -0x33, 0x34, 0xa1, 0xbc, 0x7c, 0x5e, 0x5b, 0xa8, 0x3b, 0xf8, 0xe4, 0x05, 0x6d, 0x9d, 0xb5, 0x22, -0xd5, 0x0f, 0x18, 0xf3, 0xbd, 0x9e, 0x78, 0x65, 0xa4, 0x88, 0x7b, 0x6d, 0xf1, 0x8d, 0x2b, 0x6e, -0xf4, 0xb2, 0x06, 0xe4, 0x88, 0x37, 0x3d, 0x78, 0x86, 0x08, 0x4a, 0x0e, 0xc9, 0xe2, 0xab, 0xa5, -0x99, 0x19, 0xb5, 0x03, 0x11, 0xf3, 0x1d, 0x72, 0x81, 0xb6, 0x0b, 0xf0, 0x5f, 0xea, 0x93, 0x81, -0x7c, 0xc6, 0x45, 0x3e, 0xf3, 0x7e, 0x4e, 0xaf, 0x0d, 0x0c, 0xac, 0xcf, 0x37, 0xcf, 0xec, 0x9d, -0x06, 0xf8, 0x4c, 0x5f, 0x21, 0xe0, 0x22, 0x02, 0x0b, 0x2c, 0xde, 0x23, 0x11, 0xb9, 0x1f, 0x84, -0x34, 0xeb, 0xd7, 0xc8, 0x2a, 0xca, 0x78, 0x6f, 0x04, 0x39, 0xb8, 0x2e, 0x5b, 0xb9, 0x6c, 0x24, -0x29, 0xcc, 0xb1, 0x28, 0xf7, 0x2a, 0xa8, 0x63, 0xd9, 0x39, 0x0f, 0x1b, 0xd9, 0x89, 0x5e, 0x73, -0x18, 0xe7, 0x9d, 0x61, 0x7e, 0xd9, 0x1e, 0x11, 0xc3, 0xbf, 0x6e, 0xa4, 0xa0, 0xbf, 0xe6, 0x2f, -0x05, 0xa3, 0x1b, 0x03, 0xfe, 0xcb, 0x52, 0xc4, 0xc3, 0xea, 0x90, 0x26, 0xbe, 0x56, 0x3c, 0xb1, -0x59, 0x98, 0x63, 0xef, 0xf5, 0xaa, 0x70, 0xc6, 0x32, 0x16, 0x04, 0xe6, 0x58, 0xd1, 0x1d, 0xbe, -0x68, 0xa0, 0x04, 0x88, 0x99, 0x37, 0x3d, 0xcc, 0x5d, 0x74, 0x72, 0x01, 0x90, 0xc3, 0x83, 0x1a, -0xa8, 0x67, 0x17, 0xf3, 0x6f, 0x44, 0x74, 0x01, 0x05, 0x6c, 0xcd, 0xf1, 0x49, 0x0a, 0x3f, 0x7d, -0x2d, 0x0e, 0x81, 0x2b, 0x8d, 0x8a, 0xaf, 0x59, 0x3b, 0x50, 0x04, 0xaf, 0xba, 0xea, 0x8f, 0xcd, -0xe5, 0x54, 0x18, 0x86, 0xc6, 0x41, 0x21, 0xeb, 0x1c, 0x67, 0xf4, 0xea, 0x9b, 0xe6, 0x14, 0xc8, -0x42, 0x3d, 0x02, 0xe4, 0xaf, 0x43, 0xf1, 0x50, 0xc2, 0x38, 0x41, 0x97, 0x3c, 0xf8, 0xf7, 0x2b, -0x6d, 0x0b, 0x85, 0x05, 0x7e, 0xc8, 0x6b, 0xf9, 0xf8, 0xfd, 0x25, 0x64, 0x61, 0x93, 0x31, 0x95, -0x05, 0x66, 0x56, 0xa1, 0x86, 0x9d, 0x2e, 0x79, 0x1a, 0x05, 0x65, 0x44, 0xe3, 0xa9, 0x57, 0xd9, -0x66, 0xa6, 0x27, 0x19, 0xd3, 0xa7, 0xba, 0x77, 0xa8, 0x50, 0x71, 0x4d, 0x6a, 0x34, 0xa6, 0x16, -0xf9, 0x85, 0x98, 0x55, 0xb2, 0xb3, 0x43, 0xdc, 0x02, 0xdb, 0x84, 0xa7, 0x3f, 0xd4, 0x9a, 0x00, -0xf0, 0x75, 0xa1, 0xe6, 0x1c, 0xb4, 0x39, 0x6e, 0xf8, 0x4b, 0xac, 0x4c, 0x25, 0xb1, 0xae, 0xdd, -0x16, 0x3b, 0xdb, 0x51, 0x98, 0xb1, 0x67, 0x75, 0x79, 0x47, 0x32, 0xfb, 0x52, 0xa9, 0x44, 0xbd, -0xc2, 0x02, 0xeb, 0x9f, 0xbd, 0xb0, 0xe5, 0xda, 0x3a, 0x1e, 0xc0, 0xca, 0x9c, 0x59, 0x03, 0x96, -0xff, 0x5e, 0x9d, 0x7d, 0xd4, 0xbc, 0xc8, 0xca, 0xbe, 0x04, 0xa6, 0x20, 0xf2, 0x67, 0x0a, 0x30, -0x0f, 0xc1, 0x09, 0x87, 0x12, 0xc5, 0xe9, 0x00, 0xf7, 0x38, 0x05, 0xaa, 0x94, 0xf2, 0xc5, 0x34, -0x12, 0x10, 0x7e, 0x26, 0x6a, 0xeb, 0xd5, 0xfc, 0xc7, 0xb2, 0x9c, 0xdd, 0xb1, 0x17, 0x9e, 0x8f, -0xc3, 0xdc, 0x52, 0x2d, 0x14, 0x46, 0x5f, 0xf8, 0x12, 0xa2, 0x8c, 0xbf, 0x97, 0x0b, 0x29, 0x7c, -0xd2, 0x79, 0x1a, 0x7b, 0x29, 0x16, 0x39, 0x23, 0xfe, 0x3b, 0x4a, 0xab, 0x89, 0xb4, 0x9a, 0x4c, -0x93, 0x6f, 0x83, 0x42, 0xf2, 0xad, 0xf8, 0xd4, 0x31, 0x46, 0x69, 0xe8, 0x7f, 0x3d, 0xc6, 0xf7, -0xf4, 0x0a, 0xcd, 0x12, 0xd8, 0x68, 0x26, 0xe2, 0x8e, 0x07, 0x3a, 0x94, 0xa5, 0x97, 0x63, 0xd9, -0x3c, 0xe2, 0x0e, 0xcb, 0xef, 0xf7, 0x6e, 0xd2, 0x48, 0x4c, 0x46, 0xbe, 0x55, 0x87, 0x87, 0xdc, -0x69, 0xa8, 0xbb, 0x71, 0x8f, 0x4e, 0x8d, 0xb6, 0x2c, 0x0f, 0x52, 0xd2, 0x4a, 0xb0, 0x5e, 0x94, -0x6a, 0x50, 0xaa, 0xc3, 0x2c, 0x30, 0xd8, 0x2c, 0x17, 0xa5, 0x69, 0x0a, 0x91, 0xf4, 0xd1, 0x66, -0x41, 0x67, 0xf9, 0x3c, 0xb3, 0xa0, 0xa8, 0x90, 0xc6, 0x42, 0x3b, 0xb0, 0x94, 0x34, 0x36, 0x28, -0x6e, 0xf6, 0xe4, 0x37, 0xcb, 0x61, 0x71, 0x32, 0x21, 0xb5, 0x1f, 0xa7, 0xb5, 0xb9, 0xdc, 0x64, -0x42, 0x13, 0x7f, 0xf3, 0x00, 0x8a, 0xb8, 0x4b, 0x61, 0x1f, 0x2c, 0x4d, 0xad, 0x6a, 0x3d, 0x42, -0x53, 0xc1, 0x38, 0x70, 0xa0, 0xa7, 0x2c, 0x83, 0x44, 0x32, 0xbc, 0x05, 0xa7, 0x91, 0x26, 0x1f, -0x15, 0x41, 0xf5, 0x00, 0xff, 0x65, 0x63, 0x92, 0x2f, 0x6d, 0x4c, 0x20, 0x2e, 0x7d, 0x5d, 0xe2, -0x89, 0x03, 0x5d, 0xca, 0x08, 0x9b, 0x7d, 0x5f, 0x37, 0xc2, 0x4c, 0xe1, 0xce, 0x23, 0xb3, 0xcf, -0x34, 0x6f, 0x78, 0x56, 0xb2, 0xb0, 0xa2, 0xc0, 0x03, 0x9a, 0x2b, 0x60, 0x41, 0xea, 0xe2, 0xb0, -0xc6, 0xe3, 0x5c, 0x2b, 0x15, 0x1a, 0x37, 0x66, 0xe1, 0xb6, 0xed, 0x40, 0x29, 0x5b, 0xf9, 0x1d, -0x82, 0x98, 0x89, 0xd7, 0x39, 0x2d, 0xb1, 0x80, 0xe3, 0x6a, 0xed, 0x63, 0x96, 0x1d, 0xec, 0x92, -0xcd, 0x4a, 0xa6, 0x18, 0x8e, 0x71, 0x53, 0x34, 0xe5, 0xf8, 0x8a, 0xbb, 0x7c, 0xb4, 0x45, 0x61, -0x84, 0x2d, 0x7c, 0xf4, 0x04, 0x48, 0xc6, 0x74, 0x99, 0x1c, 0x66, 0x43, 0x09, 0xb0, 0x03, 0x2d, -0x52, 0x06, 0xd0, 0x85, 0x42, 0xa1, 0x30, 0xef, 0x80, 0x37, 0x93, 0x10, 0x78, 0x6c, 0x2d, 0x84, -0xcb, 0x77, 0x78, 0x45, 0x12, 0x33, 0xfd, 0xe3, 0x51, 0x3e, 0x8d, 0x21, 0x03, 0xa6, 0x52, 0x89, -0xe4, 0xf5, 0xca, 0xeb, 0x35, 0x8f, 0x3a, 0x15, 0x3c, 0x53, 0x83, 0x94, 0x13, 0xf1, 0xb9, 0x9f, -0x10, 0x8f, 0x5a, 0x80, 0xfe, 0xc0, 0x1f, 0x05, 0xbe, 0x63, 0x21, 0x46, 0xa3, 0xc0, 0xe9, 0xdb, -0xa0, 0x22, 0xad, 0xe1, 0x0a, 0xc2, 0xaa, 0xd5, 0x51, 0x55, 0xf6, 0x79, 0xfa, 0xdb, 0xd5, 0x15, -0xce, 0x9d, 0xcf, 0x5e, 0xf0, 0x5d, 0xd3, 0x6d, 0x94, 0x42, 0x5c, 0xad, 0xd8, 0x07, 0xdd, 0x2c, -0xd0, 0x27, 0xd8, 0x2c, 0x32, 0xfc, 0x1d, 0x1e, 0x61, 0x8f, 0x08, 0x7f, 0x96, 0x3d, 0x02, 0x08, -0xcf, 0x0c, 0x81, 0x6d, 0x00, 0x6d, 0x19, 0xa0, 0xf8, 0x60, 0x84, 0x07, 0x03, 0x69, 0x0c, 0xa9, -0x00, 0x6d, 0x69, 0xe3, 0x51, 0x1f, 0xb6, 0x79, 0x99, 0x7a, 0x6d, 0xbd, 0x59, 0x67, 0x85, 0x38, -0x91, 0x5c, 0x1b, 0x76, 0xd7, 0x0d, 0xd9, 0x36, 0x01, 0x2d, 0x70, 0xbc, 0x52, 0x7a, 0x9b, 0x76, -0x7b, 0x74, 0xfb, 0x9e, 0xdb, 0x53, 0x43, 0x58, 0x33, 0xad, 0x9f, 0x61, 0xe7, 0x58, 0x6c, 0x76, -0xc7, 0xd0, 0x49, 0x66, 0xa6, 0x96, 0x64, 0xce, 0xad, 0xaa, 0xaa, 0x72, 0x62, 0x11, 0x8c, 0x81, -0x51, 0x0a, 0xc3, 0xc0, 0xb3, 0x22, 0x37, 0x19, 0x1a, 0x19, 0x73, 0x3c, 0x1f, 0xea, 0x3b, 0x04, -0xf8, 0x6a, 0xde, 0xec, 0x8a, 0x85, 0xf2, 0x19, 0xd8, 0xde, 0x3e, 0xbb, 0x14, 0x84, 0xbe, 0x92, -0x93, 0x57, 0xb4, 0xf8, 0xc4, 0xac, 0x4d, 0xa5, 0xae, 0x65, 0xcc, 0x92, 0x3a, 0x47, 0x51, 0xa1, -0xb0, 0x80, 0xbc, 0x8d, 0x3a, 0x97, 0x96, 0xe3, 0x06, 0x9c, 0x0d, 0xc1, 0x5f, 0xc0, 0x95, 0x96, -0xc0, 0x8e, 0xa2, 0x4e, 0xad, 0xa1, 0xdb, 0x9f, 0x51, 0x9f, 0x5f, 0x79, 0x31, 0x0d, 0x3f, 0xea, -0xa4, 0x4e, 0x06, 0xdc, 0xb4, 0xcf, 0xff, 0x06, 0xe2, 0x6e, 0xa3, 0xe4, 0x9e, 0x28, 0x30, 0xf2, -0x34, 0x53, 0x79, 0xf0, 0xf9, 0xd3, 0x42, 0x87, 0x32, 0x49, 0x36, 0xdf, 0xd5, 0x8f, 0x98, 0xaf, -0x96, 0xca, 0x73, 0xe6, 0x7a, 0x98, 0xa5, 0xec, 0xc6, 0x38, 0xbb, 0xfc, 0x58, 0x6b, 0x48, 0x37, -0x8b, 0x7c, 0x44, 0xa9, 0xf7, 0x3a, 0xa3, 0x7e, 0x7e, 0xf2, 0x50, 0x1d, 0xce, 0x74, 0x94, 0xbc, -0x48, 0xcd, 0xb2, 0x47, 0x22, 0xc5, 0x8e, 0x85, 0x54, 0x38, 0x88, 0xb9, 0xa0, 0xb0, 0xa9, 0x4c, -0xa0, 0x3c, 0xc1, 0x8d, 0x7e, 0x13, 0x29, 0xc7, 0xf0, 0xa5, 0x92, 0x12, 0x3f, 0x98, 0x5b, 0xfc, -0xf2, 0x9b, 0xc2, 0xa4, 0xd8, 0xf6, 0xee, 0x44, 0x5a, 0x13, 0x3f, 0x59, 0x62, 0x2f, 0x88, 0x5d, -0x91, 0x78, 0x8a, 0x9f, 0x3c, 0xd1, 0x8d, 0x03, 0x99, 0x88, 0x9f, 0xca, 0x9e, 0xfe, 0xf1, 0x25, -0x1c, 0x68, 0x67, 0x49, 0xf0, 0x05, 0xba, 0x13, 0x1d, 0x58, 0x31, 0x35, 0x0b, 0x7f, 0x4e, 0x79, -0x07, 0x4c, 0xec, 0x0f, 0x20, 0xf2, 0x96, 0xc2, 0x58, 0x54, 0xd3, 0x6c, 0xf0, 0xc3, 0xc8, 0x13, -0x3a, 0x00, 0x64, 0x2d, 0xce, 0x58, 0x16, 0x98, 0x5d, 0x9c, 0x59, 0xc6, 0xec, 0x59, 0x8b, 0xc6, -0x3c, 0x52, 0x65, 0x87, 0x96, 0x78, 0x0b, 0xf9, 0xf4, 0xf8, 0x0c, 0x0f, 0x13, 0xf1, 0xca, 0x0c, -0x60, 0x8a, 0x3a, 0x05, 0xdd, 0x39, 0xe9, 0x44, 0x4d, 0xbc, 0x9c, 0x7c, 0x72, 0xfe, 0x35, 0x57, -0x59, 0xbc, 0x40, 0xfe, 0xf9, 0xf8, 0xd3, 0xe7, 0x5c, 0x85, 0xf1, 0x36, 0xf9, 0xe9, 0xfe, 0xaf, -0xc4, 0xa4, 0x0f, 0xb0, 0x32, 0x5c, 0x94, 0x63, 0x96, 0x37, 0x1d, 0xc1, 0x64, 0x86, 0x46, 0xc4, -0x51, 0x75, 0x88, 0x43, 0xbf, 0xf1, 0x18, 0xb2, 0x97, 0x22, 0xbd, 0x33, 0x37, 0x93, 0x19, 0xb2, -0xfc, 0xa0, 0x97, 0x8c, 0xc9, 0xf2, 0x27, 0xcb, 0x70, 0xbb, 0x97, 0xcc, 0x17, 0xe1, 0x50, 0x28, -0x5b, 0x84, 0x8f, 0x17, 0xf8, 0xf3, 0x89, 0xf0, 0x83, 0xd3, 0xab, 0x5a, 0xbd, 0x52, 0xd9, 0x7f, -0x1e, 0x29, 0xae, 0x17, 0x96, 0x63, 0x72, 0x0f, 0xa8, 0x62, 0x24, 0xfa, 0x62, 0x20, 0x0f, 0x29, -0x0f, 0xf1, 0x93, 0x0b, 0xd2, 0xb8, 0x9d, 0x8a, 0xd6, 0x36, 0x4f, 0xea, 0x8c, 0xd2, 0x3e, 0xda, -0x32, 0xf1, 0x36, 0x74, 0x83, 0xba, 0x48, 0xfd, 0xc4, 0xbe, 0xff, 0x14, 0x9b, 0xbe, 0xe7, 0x16, -0x89, 0x4f, 0x93, 0x77, 0x85, 0x67, 0xdc, 0xe0, 0x4d, 0xfe, 0xca, 0x34, 0x7a, 0xb1, 0x93, 0x97, -0xbc, 0x96, 0xbd, 0x98, 0x46, 0x47, 0x3e, 0x3b, 0x0a, 0xec, 0x06, 0xf7, 0x37, 0x1e, 0x6c, 0x8b, -0x6e, 0x58, 0x68, 0x60, 0x7e, 0x4c, 0x48, 0xa3, 0xc3, 0xf6, 0x2d, 0x3f, 0x41, 0x6c, 0xf7, 0x6f, -0x9f, 0x64, 0xc7, 0x9b, 0x64, 0x38, 0x8f, 0x38, 0x15, 0x84, 0xce, 0x70, 0xcb, 0xe2, 0xac, 0x2d, -0x6d, 0x64, 0x68, 0x5c, 0xc0, 0x38, 0x28, 0x1e, 0x5b, 0xc8, 0xc7, 0xc1, 0xa7, 0xce, 0xa1, 0xd3, -0x67, 0x04, 0x8a, 0x64, 0x32, 0x60, 0xfe, 0x23, 0x10, 0xa4, 0xc2, 0x4e, 0x4b, 0xe3, 0xf1, 0x9e, -0x29, 0x44, 0xd2, 0xa0, 0xf0, 0x0a, 0x62, 0x2a, 0x97, 0xff, 0x7e, 0x74, 0x74, 0xc1, 0xae, 0x3d, -0x91, 0x20, 0x72, 0x40, 0x63, 0x79, 0xfd, 0xfa, 0xb5, 0xb2, 0x89, 0xb1, 0x5d, 0x00, 0x46, 0xae, -0x40, 0x1e, 0xc4, 0x83, 0xe1, 0x4b, 0xbe, 0x86, 0xe4, 0x91, 0xa6, 0xb2, 0x1f, 0x82, 0xb3, 0x8d, -0x8a, 0x8a, 0x5d, 0x83, 0x63, 0x8f, 0xca, 0xd9, 0x3c, 0x29, 0xa2, 0x31, 0x4d, 0xd2, 0xd4, 0x28, -0x4e, 0x94, 0x7c, 0x4d, 0xc9, 0x6d, 0xf9, 0xe1, 0xdb, 0xf5, 0x5a, 0xbb, 0x1f, 0x0f, 0x53, 0x08, -0x6d, 0xf8, 0x56, 0x9d, 0x23, 0x3c, 0x07, 0xab, 0x1c, 0xb9, 0xf1, 0xdc, 0xe0, 0xa1, 0x20, 0xb2, -0x9c, 0xff, 0xdf, 0x50, 0x3c, 0xca, 0x80, 0x56, 0xfd, 0x39, 0xfc, 0x55, 0xb1, 0x4a, 0xc8, 0x1d, -0xa5, 0x21, 0x91, 0x41, 0x5d, 0x70, 0x8c, 0x31, 0xb9, 0x8d, 0x82, 0x7e, 0x48, 0x1d, 0xf5, 0x7d, -0xd0, 0x30, 0xe1, 0xab, 0xa5, 0xc2, 0x7c, 0x51, 0x7c, 0xee, 0x5f, 0x81, 0x0a, 0x71, 0xf3, 0x73, -0xb5, 0x5a, 0xd9, 0x24, 0xd5, 0x52, 0xfd, 0x9b, 0x41, 0xaa, 0xb5, 0xad, 0x5f, 0x37, 0x1b, 0x2c, -0x0f, 0xa3, 0x21, 0x35, 0x9b, 0x87, 0xd5, 0x3a, 0x64, 0x56, 0x4a, 0x9b, 0x9b, 0x90, 0xbb, 0xd9, -0xf8, 0xb5, 0xb1, 0x45, 0xcc, 0xaf, 0x14, 0x76, 0xcb, 0xfc, 0x95, 0x8f, 0x66, 0x17, 0x1d, 0x0a, -0x0b, 0xac, 0x42, 0x63, 0xa2, 0xc2, 0xbb, 0xaa, 0x00, 0x57, 0xe7, 0x67, 0x94, 0xd5, 0xc9, 0xdc, -0xcd, 0xc9, 0xc6, 0x36, 0xd3, 0xdc, 0x77, 0xa4, 0x56, 0x6a, 0xd4, 0x26, 0x73, 0xeb, 0xac, 0xcf, -0x77, 0xae, 0xb5, 0x51, 0xc5, 0x28, 0x74, 0x79, 0x16, 0x22, 0x8e, 0x57, 0x2c, 0x44, 0x16, 0xc1, -0x8e, 0x5e, 0x58, 0x21, 0x9e, 0x83, 0xe5, 0x59, 0x82, 0xcc, 0xdd, 0x40, 0x3c, 0x54, 0x03, 0x38, -0x63, 0xfb, 0x19, 0xb6, 0x88, 0x01, 0xcd, 0xe8, 0x8b, 0x0a, 0xa0, 0x8b, 0xe9, 0x29, 0x06, 0x4f, -0x6d, 0x2d, 0x72, 0x2f, 0x29, 0x7d, 0x04, 0xa7, 0xf0, 0xfc, 0xbb, 0x42, 0xde, 0x8f, 0x27, 0x6e, -0x07, 0x53, 0x6c, 0x3d, 0x45, 0x51, 0x95, 0x30, 0x66, 0x7d, 0xd2, 0xe4, 0x85, 0x9f, 0x39, 0x37, -0x75, 0xd0, 0xcd, 0xf4, 0x50, 0x88, 0x16, 0x93, 0xaf, 0xd2, 0x34, 0xb6, 0x00, 0x2d, 0xf1, 0x60, -0xcf, 0x5c, 0x1c, 0x17, 0x72, 0x7a, 0x27, 0x4f, 0x2c, 0x9a, 0xca, 0x2f, 0x0e, 0xbd, 0x7d, 0x9f, -0x2e, 0x9b, 0xea, 0x96, 0x4c, 0xc8, 0x43, 0x8e, 0xd3, 0x24, 0x09, 0x00, 0xde, 0xc9, 0xfa, 0x1a, -0x2f, 0x8e, 0xb1, 0xe2, 0x48, 0xff, 0xb5, 0xb7, 0x19, 0xe5, 0x17, 0xa3, 0x3d, 0x7c, 0x4e, 0xe9, -0x05, 0x90, 0x1e, 0x74, 0x83, 0x5d, 0x2a, 0x7b, 0x3a, 0xf9, 0x8d, 0x56, 0x68, 0x14, 0x24, 0x8a, -0x15, 0x8a, 0xa9, 0xad, 0xc2, 0x93, 0x6c, 0xa1, 0x99, 0x9e, 0x5b, 0xe9, 0x1b, 0x3c, 0xb3, 0x1a, -0xdf, 0x28, 0x4f, 0x41, 0x26, 0x0a, 0x8a, 0x45, 0xcf, 0x03, 0xc9, 0x55, 0x16, 0xb8, 0x38, 0x3f, -0x05, 0x25, 0x5d, 0x8f, 0x8a, 0xa5, 0x02, 0xb2, 0x83, 0x05, 0x4a, 0xa7, 0xa8, 0x61, 0x90, 0x9e, -0x15, 0xb2, 0x10, 0x58, 0xd4, 0xb2, 0xbb, 0x13, 0xe2, 0xa4, 0xa4, 0xaa, 0x78, 0x8c, 0x2f, 0xe3, -0x20, 0xd9, 0xc4, 0x18, 0x93, 0xb0, 0xe3, 0x3e, 0x30, 0x18, 0x56, 0x14, 0x41, 0x25, 0x33, 0xa6, -0x34, 0x55, 0xcc, 0x0a, 0xaa, 0xda, 0x2f, 0x45, 0x6b, 0xe3, 0x87, 0xcb, 0x68, 0xd4, 0x85, 0xc1, -0xf3, 0x20, 0x09, 0xf0, 0x65, 0x6a, 0x1c, 0xfd, 0x61, 0xed, 0x4f, 0x04, 0x8f, 0x82, 0x86, 0xca, -0x65, 0x8c, 0x9a, 0xf6, 0x4a, 0x67, 0x8f, 0x82, 0xff, 0xaa, 0x93, 0xc5, 0x85, 0xe0, 0xbb, 0xe1, -0x32, 0xed, 0x95, 0xce, 0x38, 0xa5, 0xa8, 0xc8, 0x84, 0x73, 0x66, 0xbd, 0xba, 0xa8, 0x27, 0xea, -0xf2, 0x7a, 0x17, 0x07, 0x87, 0x5b, 0x1b, 0x8d, 0xc6, 0xcd, 0x16, 0x93, 0xd8, 0xd0, 0x5d, 0x21, -0x3c, 0xd5, 0x20, 0x1a, 0xf3, 0xfa, 0x5c, 0xaf, 0xa9, 0x2b, 0x6e, 0xcc, 0xa9, 0xf8, 0xa0, 0xeb, -0xf4, 0xa6, 0xbe, 0xe2, 0xbb, 0xcc, 0x8a, 0x28, 0xcc, 0xd3, 0xe1, 0xc2, 0xff, 0x5a, 0x2d, 0xa8, -0xc8, 0x85, 0xfb, 0xab, 0x1c, 0x4b, 0x5b, 0xe1, 0x20, 0xc4, 0x54, 0xf6, 0x1c, 0xa1, 0xde, 0xd2, -0x0b, 0x0f, 0xfa, 0x03, 0x2e, 0xa9, 0x50, 0x03, 0x44, 0xd8, 0x1a, 0x81, 0x76, 0x58, 0x18, 0x05, -0x04, 0x7c, 0xaf, 0xf3, 0xc5, 0xe2, 0x74, 0x88, 0xc0, 0xcc, 0x74, 0xd9, 0xa2, 0xcf, 0x51, 0xc6, -0x55, 0x06, 0xdb, 0x93, 0x81, 0x1d, 0xd8, 0xab, 0x2e, 0xf9, 0x63, 0xc1, 0x71, 0xef, 0x40, 0xed, -0xc1, 0x8a, 0x80, 0x0d, 0x02, 0x78, 0x51, 0xc0, 0xf9, 0x5c, 0x1c, 0xb8, 0x77, 0xdd, 0x22, 0x21, -0x3e, 0x98, 0x17, 0x66, 0x61, 0x22, 0x10, 0xd2, 0x44, 0x50, 0x29, 0x33, 0x8d, 0x58, 0x64, 0xbe, -0x79, 0x93, 0xc0, 0x7e, 0x49, 0x44, 0xaa, 0x2a, 0x2c, 0xe2, 0x95, 0x65, 0x46, 0x41, 0xa0, 0xbc, -0x37, 0x3c, 0xe6, 0x29, 0xa7, 0x2b, 0x92, 0x7a, 0x23, 0x4a, 0x7f, 0x47, 0x2c, 0x78, 0x6d, 0xdc, -0xf2, 0x5f, 0x5a, 0xe1, 0x9e, 0xba, 0x48, 0xf3, 0xe2, 0xb1, 0x70, 0x32, 0xcd, 0x2c, 0x2d, 0x3d, -0x0c, 0x45, 0x15, 0xf6, 0xf3, 0xc6, 0x0d, 0xb3, 0x6b, 0x31, 0x8f, 0x33, 0x5e, 0x83, 0x79, 0x64, -0x65, 0x16, 0x46, 0x47, 0x2b, 0x5e, 0x16, 0x63, 0xe6, 0x64, 0xf7, 0xa6, 0xef, 0xcb, 0x8e, 0xf4, -0xfd, 0xec, 0xa2, 0xc2, 0xa7, 0x85, 0x97, 0x16, 0x3e, 0x29, 0xb0, 0xde, 0x27, 0x47, 0x7e, 0x3d, -0x7a, 0xee, 0x63, 0x26, 0x2f, 0xb3, 0xcb, 0xf2, 0xac, 0x9a, 0x57, 0x89, 0xf0, 0x1b, 0xd2, 0x46, -0x40, 0x96, 0xd8, 0xa0, 0xbe, 0x17, 0xa9, 0x95, 0x7d, 0xac, 0x17, 0x90, 0xb6, 0xe2, 0x56, 0x85, -0x01, 0x4d, 0x40, 0x91, 0x17, 0xaf, 0x32, 0x90, 0x25, 0x2d, 0x49, 0xbc, 0x86, 0x90, 0xf6, 0x4b, -0xe9, 0xe4, 0x64, 0x7c, 0x20, 0xe9, 0x34, 0x54, 0xc6, 0x50, 0x50, 0x86, 0x54, 0xc3, 0x07, 0x8f, -0x76, 0x8d, 0x1a, 0x8f, 0x28, 0xa5, 0x5d, 0xac, 0xec, 0x92, 0xfe, 0x52, 0xe2, 0x30, 0xc6, 0xea, -0xe8, 0x18, 0x62, 0x65, 0x48, 0x28, 0x2d, 0x21, 0x34, 0xc8, 0x9e, 0xfe, 0xce, 0x6b, 0xac, 0x0b, -0xa2, 0x18, 0xa2, 0x87, 0x15, 0x25, 0xfc, 0x79, 0x46, 0x22, 0x60, 0x1a, 0x85, 0x42, 0xc6, 0x4d, -0xb7, 0x91, 0xc4, 0xd2, 0x74, 0x64, 0x6e, 0xa0, 0xd2, 0xd9, 0xde, 0x4c, 0x43, 0x42, 0xa9, 0x95, -0xde, 0xb5, 0xc8, 0xc8, 0x64, 0xde, 0x70, 0x26, 0xca, 0x3a, 0x65, 0xa1, 0x08, 0x4a, 0x89, 0x42, -0xce, 0x87, 0x5e, 0x41, 0x3b, 0xae, 0x1f, 0x9a, 0x73, 0xff, 0xc5, 0x70, 0xe9, 0x07, 0x12, 0x81, -0x80, 0xa8, 0xbe, 0x9f, 0x3f, 0x26, 0x13, 0x60, 0x1f, 0xa8, 0xca, 0x5c, 0x3a, 0x31, 0x65, 0x18, -0x40, 0x47, 0x46, 0x62, 0xc4, 0xa3, 0xf6, 0xce, 0xc4, 0x7a, 0x15, 0x65, 0x4e, 0x2c, 0x76, 0xab, -0x73, 0x6e, 0x4c, 0x88, 0x62, 0x99, 0x63, 0x56, 0xc7, 0xef, 0x62, 0xeb, 0x72, 0x6c, 0x00, 0x3b, -0x65, 0xfe, 0x52, 0x91, 0x7c, 0xe2, 0xa8, 0x1d, 0x38, 0x43, 0x7c, 0xe3, 0xa8, 0x9b, 0xf4, 0xbc, -0xbd, 0x57, 0xff, 0x0b, 0x36, 0xc8, 0xe1, 0x4b, 0x9c, 0xc3, 0x00, 0x00}; -#endif /*__SETUP_HTML_H__*/ diff --git a/src/web/html/h/style_css.h b/src/web/html/h/style_css.h deleted file mode 100644 index 3bff2337..00000000 --- a/src/web/html/h/style_css.h +++ /dev/null @@ -1,188 +0,0 @@ -#ifndef __STYLE_CSS_H__ -#define __STYLE_CSS_H__ -#define style_css_len 2914 -const uint8_t style_css[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0x9d, 0x1a, 0x69, 0x8f, 0xdb, 0xb8, -0xf5, 0xaf, 0x68, 0xd7, 0x58, 0x20, 0x13, 0x58, 0x5a, 0x5b, 0xb6, 0xc6, 0x87, 0xd0, 0xa2, 0x45, -0x8b, 0x7c, 0x6b, 0xd1, 0xaf, 0x45, 0x11, 0x2c, 0x28, 0x89, 0x1e, 0x73, 0xa3, 0x0b, 0x12, 0xed, -0x19, 0xef, 0xc0, 0xff, 0xbd, 0xef, 0xf1, 0x12, 0x29, 0xd1, 0x9a, 0x64, 0x27, 0x81, 0x25, 0xf3, -0xf1, 0x78, 0xf7, 0x45, 0x9f, 0x79, 0x55, 0x2e, 0x83, 0xac, 0x29, 0x6e, 0xc1, 0xfb, 0xa9, 0xa9, -0x79, 0x78, 0x22, 0x15, 0x2b, 0x6f, 0xc7, 0xbf, 0x77, 0x8c, 0x94, 0x69, 0x45, 0xba, 0x17, 0x56, -0x1f, 0x57, 0x69, 0x4b, 0x8a, 0x82, 0xd5, 0x2f, 0xf0, 0x76, 0xa6, 0xec, 0xe5, 0xcc, 0x8f, 0xeb, -0xd5, 0xea, 0x97, 0xb4, 0x62, 0x75, 0x68, 0x7f, 0xcf, 0x48, 0xfe, 0xed, 0xa5, 0x6b, 0x2e, 0x75, -0x11, 0xe6, 0x4d, 0xd9, 0x74, 0xc7, 0x2b, 0xe9, 0x3e, 0x85, 0x61, 0xf6, 0xf2, 0x94, 0xda, 0xdf, -0x4f, 0xf0, 0xfd, 0x7e, 0x8e, 0x83, 0x77, 0xb5, 0x6b, 0x58, 0xd2, 0x13, 0xee, 0xd0, 0xbe, 0xa5, -0xf7, 0xbe, 0x25, 0xf5, 0x32, 0x28, 0xd9, 0x32, 0x38, 0x6f, 0xe0, 0x49, 0x32, 0x0a, 0xe8, 0x9d, -0x18, 0x2d, 0x8b, 0x9e, 0xf2, 0xe0, 0x7d, 0xb2, 0x8d, 0x06, 0x2d, 0x03, 0x56, 0xb7, 0x17, 0xfe, -0x3f, 0x7e, 0x6b, 0xe9, 0x5f, 0xfa, 0x4b, 0x56, 0x31, 0xfe, 0x75, 0x19, 0x44, 0x19, 0xaf, 0x83, -0xf7, 0xac, 0xe9, 0x0a, 0xda, 0x85, 0x1d, 0x29, 0xd8, 0xa5, 0x3f, 0x6e, 0xf1, 0x18, 0x6b, 0xf2, -0x89, 0x95, 0xf4, 0x6b, 0xf0, 0xfe, 0xca, 0x0a, 0x7e, 0x96, 0x64, 0xdc, 0x39, 0x7d, 0xe3, 0xa4, -0xa3, 0x64, 0x7a, 0xde, 0x0c, 0x85, 0xf7, 0x45, 0xc9, 0xae, 0x34, 0x40, 0x02, 0xc6, 0xeb, 0x62, -0x80, 0x46, 0xbc, 0x69, 0x6b, 0x72, 0x05, 0x6c, 0xfc, 0x5b, 0x00, 0x4c, 0x6c, 0xd3, 0x36, 0x3d, -0xe3, 0xac, 0xa9, 0x8f, 0x27, 0xf6, 0x46, 0x8b, 0x14, 0x56, 0x01, 0xd3, 0x6d, 0xe4, 0xf4, 0x46, -0xc4, 0x73, 0x8a, 0x16, 0xd3, 0x1a, 0x88, 0x0c, 0xf0, 0x23, 0x45, 0x52, 0xc2, 0x82, 0xe6, 0x4d, -0x47, 0xc4, 0xae, 0x75, 0x53, 0xd3, 0x54, 0x08, 0xba, 0x67, 0x7f, 0xd0, 0xe3, 0x7a, 0x07, 0x73, -0x0a, 0xd6, 0xb7, 0x25, 0xb9, 0x1d, 0xb3, 0xb2, 0xc9, 0xbf, 0x01, 0x1d, 0xe3, 0x03, 0x16, 0xa7, -0xd3, 0xc9, 0x3a, 0x37, 0x62, 0x79, 0x03, 0x24, 0x4a, 0xcc, 0x84, 0xe8, 0x56, 0x16, 0x5f, 0x46, -0xe4, 0xb8, 0x7b, 0x1b, 0xe2, 0x48, 0xd6, 0x37, 0xe5, 0x85, 0x53, 0x6b, 0xdb, 0xe3, 0xb9, 0xb9, -0xd2, 0xee, 0x21, 0x7f, 0xda, 0x8e, 0x81, 0x36, 0xde, 0x42, 0x31, 0xeb, 0x29, 0xf8, 0x89, 0x55, -0x6d, 0xd3, 0x71, 0x52, 0xf3, 0x61, 0x8b, 0x88, 0xd5, 0xa7, 0xc6, 0xc7, 0x95, 0xc9, 0xa9, 0x9d, -0xd0, 0xd9, 0x58, 0x30, 0x08, 0xc8, 0x48, 0x50, 0x25, 0xcc, 0x2e, 0x55, 0x93, 0x81, 0x4a, 0x04, -0xef, 0x1a, 0x75, 0xc1, 0xb2, 0x7b, 0x7f, 0x7d, 0x51, 0x84, 0xc3, 0xf9, 0x9c, 0xe5, 0xa4, 0x0c, -0x49, 0xc9, 0x5e, 0xea, 0x63, 0xc5, 0x8a, 0xa2, 0xa4, 0x86, 0x50, 0x56, 0x97, 0xac, 0xa6, 0xa1, -0xa4, 0x57, 0xda, 0x4f, 0x88, 0x67, 0x84, 0xdb, 0x37, 0x23, 0x1e, 0x38, 0x2f, 0x00, 0xc6, 0x07, -0xf8, 0x14, 0x5a, 0x2f, 0x76, 0x0e, 0x25, 0xfa, 0xa0, 0x8f, 0xa5, 0xc2, 0x1e, 0x07, 0x9e, 0x34, -0xf4, 0x95, 0x74, 0xb5, 0x03, 0xc5, 0x01, 0x03, 0xed, 0x2f, 0x79, 0x4e, 0xfb, 0xde, 0x99, 0xa0, -0xc6, 0x70, 0xce, 0x2b, 0x3b, 0x31, 0x07, 0xa6, 0x95, 0x92, 0x71, 0x24, 0x75, 0x9e, 0xe7, 0xda, -0x7a, 0x51, 0x0f, 0x6c, 0xc6, 0x1b, 0x6d, 0x4b, 0x94, 0xb6, 0x05, 0xeb, 0x67, 0xf8, 0xd8, 0x03, -0x49, 0xd6, 0x34, 0x4b, 0x3c, 0xc8, 0x3e, 0x69, 0x1f, 0xae, 0x5a, 0x48, 0xf5, 0xde, 0x20, 0x2b, -0x94, 0x3b, 0xd9, 0xc0, 0xab, 0x62, 0x5e, 0xd6, 0x70, 0xde, 0x54, 0x42, 0x46, 0x46, 0x90, 0x1d, -0x2d, 0x41, 0x9d, 0xaf, 0xd4, 0xd6, 0x3b, 0xa1, 0xa5, 0xae, 0xa9, 0xc7, 0x8e, 0x5c, 0x49, 0x8e, -0x4b, 0x66, 0x0d, 0x50, 0x4e, 0x79, 0x92, 0x6e, 0x28, 0xea, 0x69, 0x4b, 0xc1, 0x6c, 0x9a, 0xce, -0xf1, 0x0e, 0xda, 0xe1, 0x19, 0x0c, 0x8f, 0x4a, 0x8c, 0x28, 0xce, 0xa9, 0x83, 0x58, 0x6c, 0x0f, -0xf8, 0x6f, 0x62, 0x64, 0xc0, 0x0b, 0x4e, 0x6b, 0x70, 0x69, 0x15, 0x79, 0x0b, 0xd5, 0xf6, 0xeb, -0xed, 0x4a, 0x61, 0xcc, 0x41, 0xbd, 0xce, 0x0f, 0x51, 0x55, 0x70, 0x4a, 0x8a, 0x50, 0x08, 0x70, -0xec, 0x5e, 0x95, 0xbf, 0xc1, 0x49, 0xd9, 0xcb, 0x07, 0xbb, 0x4c, 0x9d, 0xb3, 0x58, 0xcd, 0xae, -0x33, 0xe7, 0x23, 0x70, 0xfe, 0x70, 0x76, 0x9d, 0x3b, 0x59, 0xaf, 0x9f, 0x39, 0x3b, 0x04, 0x7e, -0xcd, 0xad, 0x07, 0xf0, 0x47, 0xc7, 0x7f, 0xc7, 0x16, 0xde, 0xc5, 0xf9, 0x79, 0x86, 0x74, 0x04, -0xce, 0x93, 0x0e, 0x33, 0x66, 0x48, 0xd7, 0xeb, 0x1f, 0x90, 0xce, 0xfb, 0x39, 0xb1, 0xf7, 0x62, -0xed, 0xa3, 0x85, 0x73, 0xa2, 0xee, 0x1f, 0x1d, 0x78, 0xee, 0x4c, 0x7c, 0x44, 0x2f, 0x05, 0x5a, -0x1d, 0x80, 0x8f, 0x64, 0x45, 0xe0, 0x95, 0xb4, 0x52, 0xf8, 0x75, 0x47, 0xab, 0x60, 0x15, 0xe0, -0x23, 0xbd, 0xb7, 0x10, 0x0a, 0x30, 0xc8, 0x48, 0x6f, 0xf8, 0xfb, 0xa5, 0xe7, 0xec, 0x74, 0xb3, -0x43, 0xcc, 0xa6, 0xe5, 0xd3, 0xf0, 0xbf, 0x38, 0x35, 0x0d, 0x9f, 0x71, 0xf7, 0x12, 0x2c, 0x03, -0x6b, 0xd4, 0x35, 0xaf, 0x83, 0xcb, 0x38, 0x95, 0x14, 0x2d, 0xcf, 0x18, 0x0d, 0xda, 0x24, 0x8e, -0x85, 0xaf, 0x1d, 0x69, 0x8f, 0xf8, 0x81, 0x42, 0x68, 0x4a, 0x70, 0x77, 0x30, 0x7a, 0x5c, 0x03, -0xa2, 0x22, 0x6c, 0xc2, 0x50, 0xb8, 0x86, 0x94, 0x00, 0x9f, 0xb1, 0x7a, 0x6e, 0xd4, 0x73, 0xbb, -0x14, 0x8f, 0x44, 0x7d, 0x7d, 0x56, 0xcf, 0x9d, 0x7a, 0xee, 0x25, 0xf8, 0xa0, 0xbe, 0xae, 0x57, -0xfa, 0x45, 0xef, 0xb7, 0x8e, 0xd5, 0x69, 0x70, 0x56, 0x40, 0x2e, 0xbc, 0xd1, 0xe7, 0x69, 0xcf, -0xb1, 0x8f, 0x36, 0xfa, 0x4f, 0xe3, 0x12, 0x1b, 0xaf, 0xf2, 0x1c, 0x3d, 0xcb, 0xbf, 0x9d, 0x86, -0x6d, 0x34, 0x2c, 0x4e, 0xf4, 0xd0, 0x56, 0x0f, 0x6d, 0x36, 0xd1, 0x78, 0xab, 0x44, 0xc3, 0xb6, -0xeb, 0xc9, 0x56, 0xcf, 0x1a, 0x96, 0x18, 0x2e, 0xec, 0xcc, 0xd0, 0x7e, 0xb2, 0xd5, 0x5e, 0xc3, -0x9e, 0xa7, 0x58, 0x1d, 0x34, 0x6c, 0x67, 0xb0, 0x5a, 0xaf, 0x0c, 0x85, 0x53, 0xb4, 0xd6, 0x86, -0xfc, 0xc3, 0x14, 0xaf, 0x75, 0xec, 0xe6, 0x5c, 0x51, 0x8b, 0xdc, 0x32, 0x79, 0x66, 0x14, 0x27, -0x42, 0xbb, 0x60, 0x38, 0xb6, 0x87, 0xcd, 0xe8, 0x66, 0x18, 0x5d, 0xeb, 0xb1, 0xad, 0x35, 0x36, -0xcc, 0x4c, 0x86, 0xd1, 0x8d, 0x1a, 0x7b, 0x73, 0xce, 0x0a, 0xd4, 0x69, 0x81, 0x79, 0x93, 0x73, -0x62, 0x77, 0x8e, 0x99, 0x32, 0xcc, 0xd8, 0xd8, 0x33, 0x1c, 0xab, 0x40, 0xe8, 0xd6, 0x81, 0xea, -0xf5, 0x6b, 0x6b, 0x7d, 0x62, 0xcf, 0xd8, 0x48, 0xb8, 0xc6, 0xf1, 0xe6, 0xe1, 0x87, 0x8b, 0xe1, -0x6d, 0xca, 0x1a, 0x07, 0xbf, 0xdb, 0x98, 0x49, 0x16, 0x76, 0xb7, 0x29, 0xb3, 0x1c, 0xdc, 0x6e, -0x63, 0xb6, 0x0d, 0x98, 0x55, 0xc8, 0x3d, 0x8c, 0x5b, 0xb2, 0x36, 0xf0, 0x72, 0xaf, 0x42, 0xee, -0x39, 0x73, 0xc6, 0xd8, 0x55, 0xc8, 0x3d, 0x6b, 0x86, 0x8b, 0x5f, 0x85, 0xdc, 0xb3, 0xa1, 0x13, -0x0c, 0x2b, 0xe4, 0x9e, 0x35, 0x63, 0x84, 0xe3, 0xcd, 0xc1, 0xd1, 0x87, 0xe1, 0xcd, 0xc1, 0x70, -0x8a, 0xdf, 0xcd, 0xc6, 0x6f, 0x84, 0xdd, 0xcd, 0xc6, 0xce, 0x83, 0xdb, 0xcd, 0xc6, 0x6d, 0x84, -0x19, 0xb7, 0x30, 0x13, 0x3e, 0x57, 0x63, 0x27, 0x60, 0xf1, 0x18, 0x36, 0x80, 0x36, 0x2e, 0x68, -0x6d, 0x00, 0xdb, 0x11, 0xc0, 0x5a, 0x93, 0xb8, 0xa0, 0x8d, 0x02, 0x64, 0x36, 0x0e, 0x2a, 0xc1, -0xb2, 0xd0, 0xc8, 0x6c, 0x34, 0x0c, 0x78, 0x80, 0x6e, 0x26, 0xd0, 0xb5, 0x81, 0x6d, 0xa7, 0x30, -0x6b, 0x65, 0x32, 0x81, 0x2a, 0x94, 0x4e, 0x3d, 0xaa, 0xfb, 0x10, 0x35, 0x36, 0x9a, 0x97, 0x00, -0x88, 0x1d, 0x80, 0x19, 0xde, 0xd8, 0xc3, 0xb1, 0x35, 0x7f, 0xeb, 0x00, 0xcc, 0x70, 0x62, 0x0f, -0xaf, 0xa3, 0xdd, 0xb0, 0xe0, 0xd9, 0x85, 0x0c, 0x80, 0x9d, 0x0b, 0x88, 0x07, 0xc8, 0xde, 0x81, -0x98, 0xe1, 0x83, 0x3d, 0xbc, 0xb2, 0xcf, 0x40, 0x4f, 0x69, 0x83, 0x14, 0x84, 0x84, 0x9d, 0x13, -0x3f, 0x45, 0x65, 0x22, 0xc6, 0x73, 0x67, 0x3c, 0x87, 0x5c, 0x91, 0x76, 0x00, 0x28, 0x42, 0xac, -0x47, 0xdc, 0xea, 0xc4, 0xad, 0x86, 0x0a, 0x59, 0x7c, 0x8c, 0x92, 0x6c, 0x77, 0x0e, 0x46, 0xd4, -0xbf, 0x06, 0x9f, 0x47, 0x25, 0xb8, 0xc2, 0x4a, 0x8f, 0xc9, 0x2a, 0x49, 0xa3, 0xfa, 0x79, 0x19, -0x1c, 0x8f, 0xe4, 0x04, 0x58, 0xe0, 0x4b, 0x46, 0x4f, 0x4d, 0x87, 0xc9, 0x74, 0xf3, 0x86, 0x14, -0xa1, 0x97, 0x50, 0x69, 0x04, 0x8c, 0xa4, 0xf7, 0x5f, 0x3f, 0x07, 0x7d, 0x15, 0x7c, 0xfe, 0xf5, -0x6f, 0x15, 0x2d, 0x18, 0xf9, 0x84, 0x8d, 0x02, 0x15, 0x3a, 0x9e, 0xf7, 0xed, 0xdb, 0x53, 0xf0, -0x2e, 0x62, 0x40, 0x5f, 0xcd, 0x46, 0x48, 0x00, 0xcf, 0x05, 0x49, 0x00, 0x7b, 0xe2, 0x24, 0x8c, -0xce, 0x85, 0x4a, 0x00, 0xcf, 0x45, 0x4b, 0x00, 0x7b, 0x02, 0x26, 0x8c, 0xce, 0xc5, 0x4c, 0x00, -0xcf, 0x85, 0x4d, 0x00, 0x7b, 0x22, 0x27, 0xd2, 0x3e, 0x17, 0x3c, 0x11, 0x3e, 0x17, 0x3f, 0x11, -0x3e, 0x0e, 0xa1, 0x60, 0x60, 0x82, 0xa5, 0xb3, 0xa6, 0x2d, 0xb8, 0x3a, 0x67, 0xdd, 0x82, 0xaf, -0x8f, 0x0d, 0x5c, 0x30, 0x78, 0xce, 0xc6, 0x05, 0x8b, 0x1f, 0x9b, 0xb9, 0x14, 0xba, 0xdf, 0xd2, -0xa5, 0xc4, 0x7d, 0xc6, 0x2e, 0x85, 0xed, 0xb7, 0x77, 0x29, 0x72, 0x9f, 0xc9, 0x4b, 0x69, 0x3f, -0xb0, 0x7a, 0x29, 0x6b, 0xbf, 0xe1, 0x4b, 0x89, 0x3f, 0xb0, 0x7d, 0x29, 0xef, 0x89, 0xf9, 0x17, -0x08, 0xf8, 0xd8, 0xf4, 0xc4, 0xb4, 0x0f, 0x6c, 0x18, 0xed, 0xa7, 0x2a, 0x7c, 0xf6, 0x73, 0x38, -0xc4, 0x83, 0xfd, 0x54, 0xc5, 0xac, 0xfd, 0x00, 0x78, 0xce, 0x7e, 0x00, 0xec, 0xb1, 0x1f, 0x18, -0x9d, 0xb3, 0x1f, 0x00, 0xcf, 0xd9, 0x0f, 0x80, 0x3d, 0xf6, 0x03, 0xa3, 0x73, 0xf6, 0x03, 0xe0, -0x39, 0xfb, 0x01, 0xb0, 0xc7, 0x7e, 0x90, 0xf6, 0x39, 0xfb, 0x41, 0xf8, 0x9c, 0xfd, 0x20, 0x7c, -0x64, 0x3f, 0x77, 0x4e, 0x32, 0xd1, 0x0d, 0x91, 0x8e, 0x0c, 0x66, 0x95, 0xa4, 0xed, 0xe9, 0x51, -0xbf, 0x38, 0x6d, 0x38, 0x7e, 0x76, 0xfc, 0x33, 0xab, 0xcf, 0xb4, 0x63, 0xa2, 0x19, 0x25, 0x36, -0xe1, 0x05, 0x94, 0x06, 0xea, 0xf5, 0x3c, 0x64, 0x52, 0x4a, 0xff, 0x8c, 0xab, 0x94, 0xc6, 0x33, -0x2a, 0xba, 0xc4, 0xb2, 0x50, 0xce, 0xc1, 0x52, 0x09, 0x6b, 0x9a, 0x16, 0x6b, 0xa5, 0x71, 0xbf, -0xd5, 0xea, 0x22, 0x98, 0xd6, 0x12, 0x36, 0x22, 0x62, 0xfc, 0x58, 0xc7, 0xfa, 0x35, 0xc5, 0x96, -0xd9, 0xa9, 0x6c, 0x5e, 0x8f, 0xb2, 0x34, 0x31, 0xb5, 0x97, 0xde, 0x2b, 0x1e, 0x9a, 0x19, 0xb2, -0x57, 0x25, 0x47, 0xec, 0x02, 0xcb, 0x2e, 0xe7, 0xde, 0x86, 0x2d, 0x22, 0x11, 0x23, 0x4c, 0xa3, -0x30, 0xcb, 0x32, 0x5d, 0x23, 0x62, 0x27, 0x28, 0x4e, 0x74, 0x07, 0xd2, 0x09, 0x6e, 0x66, 0x31, -0x06, 0x1d, 0xdf, 0xda, 0x78, 0xa3, 0x3a, 0x2a, 0x2b, 0xbd, 0x89, 0x59, 0x73, 0x81, 0xba, 0xae, -0x64, 0x3d, 0x20, 0xc3, 0x6f, 0xc0, 0x24, 0xec, 0xe0, 0xca, 0x06, 0x9d, 0x5e, 0x8a, 0x4b, 0x04, -0x99, 0x43, 0xcb, 0xda, 0x5e, 0x8c, 0x9d, 0x65, 0xfd, 0x95, 0x78, 0xce, 0x36, 0x32, 0x41, 0xbe, -0x39, 0xc1, 0x11, 0xd1, 0x78, 0xc4, 0x06, 0xd3, 0xbc, 0x74, 0x1a, 0xa6, 0x67, 0x56, 0xcc, 0x19, -0xb9, 0xb4, 0xed, 0xa0, 0xa9, 0xcb, 0x5b, 0xd0, 0xe7, 0x1d, 0xa5, 0x75, 0x40, 0xea, 0x22, 0xf0, -0x19, 0xbb, 0xee, 0x1d, 0x2b, 0x63, 0xdd, 0xb8, 0x1d, 0x36, 0xa7, 0x27, 0x3f, 0xe9, 0xd3, 0x3e, -0x4e, 0x14, 0x86, 0x3e, 0xaf, 0xd3, 0x37, 0x16, 0x6d, 0xd1, 0xa1, 0x6d, 0xa6, 0x5a, 0x84, 0x0e, -0x2f, 0x70, 0x8a, 0xbf, 0x05, 0x3b, 0x6e, 0x9e, 0xaa, 0x76, 0xd7, 0xa8, 0x45, 0x8b, 0x4a, 0x86, -0x42, 0xb2, 0xf7, 0x90, 0xd9, 0xc6, 0x78, 0x54, 0x8b, 0x03, 0x71, 0x32, 0x47, 0xfb, 0x14, 0x5f, -0x36, 0x21, 0x93, 0x41, 0xf1, 0x93, 0x95, 0xa3, 0xa8, 0x52, 0xd7, 0x94, 0x90, 0xe5, 0x4e, 0xc9, -0x88, 0x8d, 0xf7, 0x7b, 0x1b, 0x95, 0x2c, 0x5f, 0x06, 0xe2, 0x81, 0x7c, 0x19, 0xe4, 0xbd, 0x37, -0x4d, 0x8c, 0xc5, 0xe1, 0x70, 0x40, 0x37, 0x4e, 0x7b, 0x27, 0xb5, 0x16, 0x86, 0x36, 0xd3, 0xf5, -0xe8, 0x29, 0xa0, 0x5c, 0x88, 0x6e, 0xea, 0x3d, 0xea, 0x7f, 0x93, 0x9d, 0x46, 0xf0, 0x11, 0xfd, -0x6f, 0xca, 0xbd, 0x30, 0x30, 0xfa, 0x1f, 0xea, 0x81, 0xa7, 0x8e, 0xb2, 0xe1, 0x3e, 0x8a, 0x25, -0x4e, 0xe3, 0xda, 0xd8, 0x3e, 0x68, 0x63, 0x41, 0x6b, 0x35, 0xd3, 0x9c, 0xf8, 0xbd, 0xbd, 0xdf, -0xd7, 0x33, 0xe3, 0x34, 0xcd, 0x2f, 0x5d, 0x0f, 0x5f, 0xda, 0x86, 0x89, 0x6c, 0xd4, 0xf0, 0x3e, -0x76, 0xbd, 0x85, 0x74, 0x5d, 0xf2, 0x7c, 0xcb, 0xfc, 0x91, 0xeb, 0x69, 0x73, 0xe1, 0xd8, 0x20, -0x9f, 0x5c, 0x44, 0x24, 0xde, 0x8e, 0x2f, 0x60, 0x7b, 0xc9, 0x04, 0xab, 0xad, 0xa9, 0xf1, 0x63, -0xd6, 0xda, 0xf2, 0xdd, 0xe9, 0xf5, 0x7f, 0x66, 0x0b, 0xd1, 0xc9, 0xd9, 0x09, 0x6d, 0xc2, 0x6d, -0xc8, 0x11, 0x90, 0xfe, 0xb6, 0x04, 0x43, 0xbf, 0xb2, 0x1e, 0x38, 0x51, 0x28, 0xe7, 0x3f, 0x73, -0xb3, 0x32, 0xa7, 0x00, 0xca, 0x5f, 0xe0, 0x7e, 0xa7, 0x26, 0xbf, 0xf4, 0x83, 0xe3, 0x58, 0x81, -0xbb, 0x22, 0xea, 0xda, 0xea, 0xbb, 0x9b, 0xf2, 0x46, 0x10, 0x3b, 0x6d, 0x03, 0xfa, 0xc5, 0x7f, -0x2d, 0x21, 0x4f, 0xf8, 0xf3, 0x17, 0x2e, 0xe2, 0xf6, 0x6c, 0x19, 0xf4, 0xb4, 0xa4, 0xb9, 0x65, -0x82, 0xbb, 0xa9, 0x05, 0xd8, 0x17, 0x6d, 0xc8, 0xb0, 0xaf, 0xce, 0x3d, 0x5d, 0x4b, 0xfa, 0xfe, -0x15, 0x74, 0xe5, 0xab, 0xde, 0xcb, 0x81, 0xd6, 0x97, 0x2a, 0xa3, 0x9d, 0x7b, 0x35, 0xe7, 0x2f, -0x37, 0x94, 0xbe, 0x0d, 0x71, 0x74, 0x91, 0xe7, 0x79, 0x3a, 0xbd, 0xf6, 0x7b, 0xd4, 0x0b, 0xc6, -0x33, 0xfd, 0xb7, 0x94, 0x02, 0x04, 0xcc, 0xbb, 0x12, 0xdc, 0x56, 0x65, 0x06, 0x78, 0xaf, 0xa0, -0x0f, 0x02, 0x81, 0x39, 0xee, 0xea, 0xd1, 0x09, 0x62, 0x03, 0x3c, 0x63, 0xca, 0xc8, 0xa8, 0x3f, -0x3b, 0xb7, 0x00, 0x63, 0xb7, 0xa4, 0x74, 0xba, 0x53, 0x3e, 0xde, 0x5c, 0x5f, 0xa2, 0x0c, 0xff, -0x49, 0x4b, 0x8f, 0x00, 0x17, 0xb9, 0x8b, 0xd5, 0x30, 0xff, 0x87, 0xb4, 0x4a, 0x51, 0x6b, 0x45, -0x42, 0xa1, 0x60, 0xc2, 0xbd, 0xea, 0x17, 0x5f, 0xd8, 0x14, 0x96, 0xc1, 0x3b, 0x52, 0xf7, 0x50, -0x23, 0x56, 0xc7, 0x0b, 0x26, 0x2f, 0x39, 0xe9, 0x27, 0xee, 0x63, 0x40, 0xeb, 0xa1, 0x2a, 0x2e, -0x56, 0xdb, 0x2d, 0xdd, 0x3f, 0xeb, 0xa9, 0x79, 0x36, 0x29, 0x3c, 0x12, 0x37, 0x75, 0x91, 0xfc, -0x11, 0xf7, 0xc6, 0x26, 0x5c, 0x82, 0xde, 0x78, 0xcd, 0x60, 0xe4, 0x0f, 0xdc, 0xb2, 0x77, 0x3d, -0x10, 0x27, 0xde, 0x4d, 0x3e, 0x22, 0x4e, 0x1c, 0xdd, 0x01, 0xc2, 0xc9, 0xe9, 0xbd, 0xc5, 0x7a, -0x58, 0xf8, 0xc9, 0xb0, 0x6f, 0x49, 0x4e, 0x8f, 0x30, 0x10, 0xaa, 0x7e, 0xb4, 0x8c, 0x3e, 0xe0, -0x87, 0x09, 0x97, 0x6e, 0xf0, 0xae, 0x33, 0x27, 0x39, 0xa6, 0xcb, 0x7e, 0x70, 0x55, 0x2f, 0x5d, -0xeb, 0xcc, 0x54, 0x44, 0x08, 0x66, 0xdf, 0x0b, 0x76, 0x8d, 0xfe, 0xd5, 0x14, 0xff, 0x79, 0x05, -0xdf, 0xa1, 0xde, 0xff, 0x4d, 0x2a, 0x2a, 0xbf, 0xfc, 0x17, 0xef, 0xc2, 0xff, 0x31, 0x5c, 0x57, -0xed, 0x1e, 0x11, 0x2e, 0xb6, 0x39, 0x5b, 0x09, 0x60, 0xab, 0x6d, 0x68, 0x74, 0x09, 0x20, 0xec, -0x68, 0xcc, 0x04, 0xc9, 0xe2, 0x45, 0x0d, 0x71, 0x75, 0xe8, 0x81, 0x69, 0xc0, 0xf0, 0x61, 0xf8, -0x69, 0xc4, 0x62, 0xa7, 0xcf, 0x8b, 0xb2, 0x81, 0x75, 0xa6, 0x92, 0x48, 0xac, 0xbb, 0xbf, 0x78, -0xb5, 0x6a, 0x1f, 0xda, 0xf4, 0x47, 0x16, 0x3c, 0xbd, 0xeb, 0x15, 0x17, 0xbc, 0x70, 0xa4, 0x4c, -0xe2, 0xf0, 0x57, 0x0b, 0x76, 0xa2, 0xfb, 0x6c, 0xe9, 0xb0, 0x98, 0x11, 0xc6, 0x32, 0xe1, 0xd4, -0x95, 0x97, 0xb1, 0xcb, 0x04, 0xd1, 0x7a, 0xc2, 0xe8, 0x7a, 0x8d, 0xf2, 0x73, 0x10, 0x5d, 0x6a, -0xc6, 0x25, 0xdf, 0xf3, 0x73, 0xc8, 0xae, 0x72, 0xc0, 0x09, 0x32, 0x7b, 0x2d, 0x31, 0x98, 0xae, -0x9d, 0xd8, 0x4e, 0x9c, 0xe7, 0xe4, 0xf1, 0x40, 0x21, 0xfc, 0x0d, 0xb2, 0x57, 0x33, 0xf7, 0x92, -0xcd, 0x8a, 0x4f, 0x0e, 0x8a, 0xc2, 0x45, 0x98, 0x5b, 0x53, 0x31, 0xef, 0xbe, 0xe8, 0x29, 0xfe, -0x64, 0xc3, 0xad, 0x68, 0x4c, 0x9a, 0x14, 0x69, 0xa8, 0x73, 0x71, 0x22, 0x6f, 0x1b, 0x8b, 0x86, -0x0f, 0x9a, 0x90, 0x0c, 0x72, 0xf2, 0x5f, 0x67, 0x62, 0x84, 0x72, 0x3d, 0x6b, 0xf2, 0x48, 0xcd, -0x6c, 0xb3, 0x94, 0xc1, 0x1c, 0xef, 0x92, 0x7e, 0xc8, 0x05, 0x41, 0xad, 0xd6, 0xf7, 0xb0, 0x43, -0x53, 0x72, 0xd6, 0xbe, 0x4f, 0xef, 0x7f, 0x1d, 0xb8, 0xf4, 0x22, 0xb2, 0x47, 0xf5, 0xae, 0x28, -0x3f, 0x12, 0xce, 0xbb, 0x4f, 0x05, 0xe1, 0x44, 0xcf, 0x7a, 0x72, 0x2e, 0x8d, 0x81, 0x09, 0xf6, -0xb5, 0xfc, 0x88, 0xb4, 0xcd, 0xa3, 0x08, 0xea, 0x51, 0x33, 0xe3, 0xef, 0xc4, 0x1b, 0xe0, 0x47, -0x3f, 0x85, 0xc0, 0x9a, 0x65, 0x88, 0xa2, 0xb0, 0xd2, 0x0a, 0x51, 0x9c, 0x28, 0x12, 0xbf, 0x7c, -0xf9, 0x92, 0x0e, 0xe9, 0xbe, 0xd0, 0x05, 0xfb, 0xbb, 0x10, 0xb3, 0xd0, 0xd3, 0x44, 0xa7, 0xbf, -0xc8, 0x6c, 0x5f, 0x5b, 0x70, 0xca, 0x06, 0xdd, 0xa1, 0x9b, 0xae, 0x57, 0xa6, 0x25, 0xcd, 0x4a, -0x60, 0xdb, 0x92, 0x0e, 0x36, 0x4a, 0x35, 0xcf, 0x7e, 0x0e, 0x7e, 0xd6, 0xc6, 0xa8, 0x7f, 0x7b, -0xb2, 0xf2, 0x90, 0xac, 0xfc, 0x78, 0x48, 0xaf, 0xb0, 0xa8, 0x97, 0x09, 0xd0, 0x50, 0x3b, 0x03, -0x7d, 0xdd, 0x4b, 0x46, 0x3e, 0xad, 0x96, 0x81, 0xfa, 0xff, 0x64, 0x39, 0x19, 0xe3, 0xdf, 0x07, -0x75, 0x52, 0x66, 0x36, 0xb6, 0x47, 0x51, 0x43, 0x7a, 0x98, 0xbb, 0x5a, 0xa2, 0x3d, 0x82, 0x8e, -0x57, 0x4d, 0xe1, 0x6a, 0xf6, 0x6e, 0x65, 0xfb, 0x6e, 0x59, 0x72, 0xeb, 0x5b, 0x39, 0x35, 0xd9, -0xfb, 0x2b, 0x1b, 0xd5, 0xef, 0xd4, 0xbf, 0x69, 0xf9, 0x03, 0xdc, 0x4a, 0x81, 0x37, 0x88, 0xab, -0x5d, 0x3c, 0xb9, 0xbe, 0x17, 0xfb, 0x84, 0xa6, 0x32, 0xf7, 0x04, 0x2e, 0x20, 0xac, 0x81, 0x30, -0xc0, 0xf8, 0x0d, 0xbb, 0x6b, 0xba, 0x90, 0x59, 0x69, 0x1c, 0x42, 0x93, 0xae, 0xbb, 0x2a, 0x17, -0x89, 0x9e, 0xd7, 0x54, 0xd3, 0x9d, 0xeb, 0x4f, 0x3b, 0x23, 0xf2, 0x1b, 0x93, 0x3c, 0x23, 0x1b, -0xfd, 0x64, 0xa9, 0x04, 0xed, 0xd0, 0x6e, 0xd9, 0x9b, 0x38, 0x29, 0x89, 0xe1, 0xbf, 0x28, 0x7e, -0x92, 0xf7, 0xaa, 0x05, 0xeb, 0x20, 0x35, 0x43, 0x64, 0xe0, 0x80, 0x4b, 0x55, 0x1b, 0x0a, 0xd0, -0x9a, 0x91, 0x78, 0x07, 0x35, 0xa1, 0x97, 0x21, 0x04, 0xc1, 0xaa, 0x17, 0x03, 0x50, 0xa8, 0x93, -0x8e, 0xa7, 0xea, 0x5e, 0x58, 0x53, 0x7d, 0x14, 0x11, 0x32, 0xcc, 0x28, 0x7f, 0x85, 0xba, 0x37, -0x75, 0x6e, 0xf2, 0x1e, 0x35, 0x47, 0x16, 0xf4, 0x40, 0x73, 0x7a, 0x1a, 0x1f, 0x1f, 0xe5, 0x65, -0xd3, 0x53, 0xfb, 0x22, 0x6c, 0x87, 0xbb, 0x28, 0xf1, 0x87, 0xa2, 0x71, 0x69, 0x7f, 0xda, 0x8a, -0x10, 0xca, 0x1f, 0xbe, 0x39, 0x77, 0x64, 0xe2, 0x23, 0xd6, 0x6f, 0x68, 0x5a, 0x72, 0xff, 0x51, -0x7f, 0xd1, 0x96, 0xad, 0xfd, 0xc3, 0x39, 0xdd, 0x08, 0x7a, 0x50, 0x2a, 0x81, 0xfc, 0xb3, 0x0b, -0x10, 0x56, 0xeb, 0x6d, 0x27, 0xf2, 0xb3, 0x0d, 0x52, 0x67, 0x60, 0xe9, 0xfd, 0x9c, 0xf8, 0xda, -0x91, 0xf6, 0x4d, 0x51, 0xea, 0xeb, 0xe8, 0x4a, 0xd4, 0x5e, 0xa5, 0x2d, 0x27, 0x58, 0x5c, 0x44, -0x0a, 0x23, 0x28, 0x39, 0x46, 0xd9, 0x58, 0x94, 0x91, 0xe2, 0x85, 0x0e, 0xbf, 0x24, 0xb2, 0x33, -0xc1, 0x89, 0x7a, 0xc7, 0x7b, 0xb2, 0xdb, 0x26, 0x66, 0x11, 0xfe, 0x16, 0x09, 0xc8, 0x33, 0x8b, -0xe2, 0x75, 0x9c, 0xc4, 0x07, 0x5f, 0xf8, 0x38, 0xe5, 0x60, 0x4f, 0x66, 0x1d, 0xed, 0xba, 0xa6, -0xfb, 0xe0, 0xa8, 0x22, 0xdf, 0x24, 0xc3, 0x51, 0x83, 0xba, 0xb9, 0x0e, 0x59, 0x37, 0xd8, 0xe2, -0x04, 0x24, 0x17, 0x6d, 0x35, 0xe9, 0xb2, 0x78, 0x4f, 0x7e, 0x71, 0x18, 0x01, 0x0e, 0x22, 0x15, -0x6b, 0x75, 0xd4, 0xf3, 0xb8, 0x54, 0x3b, 0x91, 0xab, 0x1b, 0x91, 0xc6, 0x8d, 0x92, 0xbe, 0x0c, -0x52, 0x5a, 0xdc, 0x65, 0x14, 0x33, 0x74, 0xa7, 0xf8, 0xff, 0xa9, 0x3b, 0x87, 0x2e, 0x5a, 0x29, -0x00, 0x00}; -#endif /*__STYLE_CSS_H__*/ diff --git a/src/web/html/h/system_html.h b/src/web/html/h/system_html.h deleted file mode 100644 index 1db39ad8..00000000 --- a/src/web/html/h/system_html.h +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef __SYSTEM_HTML_H__ -#define __SYSTEM_HTML_H__ -#define system_html_len 2134 -const uint8_t system_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xd5, 0x59, 0x6d, 0x6f, 0xdb, 0x38, -0x12, 0xfe, 0xde, 0x5f, 0xc1, 0x6a, 0x81, 0xb3, 0x74, 0xb5, 0x25, 0x27, 0x7d, 0xdd, 0xc4, 0xce, -0x22, 0x4d, 0xb3, 0x6d, 0x80, 0x24, 0x5b, 0x24, 0x2e, 0xba, 0x8b, 0x20, 0x30, 0x68, 0x89, 0xb6, -0x98, 0x48, 0xa2, 0x4a, 0x52, 0x4e, 0xbc, 0xbb, 0xf9, 0xef, 0x37, 0x43, 0x49, 0xb6, 0x65, 0x4b, -0x8e, 0xdb, 0x6e, 0x71, 0x77, 0xfe, 0x22, 0x8b, 0x9c, 0x19, 0x3e, 0x33, 0x9c, 0x79, 0x38, 0x92, -0x7a, 0x4f, 0x03, 0xe1, 0xeb, 0x59, 0xca, 0x48, 0xa8, 0xe3, 0xe8, 0xe0, 0x49, 0x2f, 0xbf, 0x10, -0xf8, 0xf5, 0x42, 0x46, 0x83, 0xfc, 0xaf, 0xb9, 0xd5, 0x5c, 0x47, 0xec, 0xe0, 0x72, 0xa6, 0x34, -0x8b, 0x7b, 0x5e, 0x7e, 0xb7, 0x98, 0x8d, 0x78, 0x72, 0x4b, 0x24, 0x8b, 0xfa, 0x96, 0xd2, 0xb3, -0x88, 0xa9, 0x90, 0x31, 0x6d, 0x11, 0xb4, 0xdc, 0xb7, 0x34, 0xbb, 0xd7, 0x9e, 0xaf, 0x94, 0x45, -0x42, 0xc9, 0xc6, 0x85, 0x84, 0x0b, 0x03, 0xbf, 0x4c, 0xfb, 0x5d, 0xf7, 0x8d, 0xdb, 0xed, 0x76, -0x77, 0x2c, 0x0f, 0x16, 0x8f, 0x99, 0xa6, 0x24, 0xa1, 0x31, 0xe8, 0x4c, 0x39, 0xbb, 0x4b, 0x85, -0x04, 0x1b, 0xbe, 0x48, 0x34, 0x4b, 0x74, 0xdf, 0xba, 0xe3, 0x81, 0x0e, 0xfb, 0x01, 0x9b, 0x72, -0x9f, 0x75, 0xcc, 0x4d, 0x9b, 0xf0, 0x84, 0x6b, 0x4e, 0xa3, 0x8e, 0xf2, 0x69, 0xc4, 0xfa, 0x3b, -0x56, 0x69, 0xc4, 0x0f, 0xa9, 0x54, 0x0c, 0x94, 0x3e, 0x0d, 0x7e, 0xed, 0xbc, 0xc1, 0x61, 0xe5, -0x4b, 0x9e, 0xea, 0x65, 0x44, 0x37, 0x74, 0x4a, 0xf3, 0x51, 0x8b, 0x28, 0xe9, 0xf7, 0x2d, 0x9a, -0x72, 0xf7, 0xa6, 0x02, 0xea, 0xa0, 0xe7, 0xe5, 0x12, 0x60, 0xe0, 0x6b, 0x3c, 0xf4, 0x45, 0x24, -0xa4, 0x7a, 0xc4, 0x45, 0x29, 0x46, 0x42, 0xab, 0x25, 0x07, 0x13, 0xc1, 0x93, 0x80, 0xdd, 0xb7, -0x49, 0x22, 0xc6, 0x22, 0x8a, 0xc4, 0x9d, 0x45, 0xbc, 0x62, 0x2f, 0xbc, 0xc5, 0x66, 0xf4, 0x46, -0x22, 0x98, 0x2d, 0x45, 0x3e, 0xe0, 0x53, 0xe2, 0x47, 0x54, 0x29, 0x80, 0x21, 0xd2, 0x84, 0x4e, -0xad, 0x42, 0x8e, 0x16, 0x60, 0xbc, 0x65, 0x0c, 0x73, 0x51, 0xdc, 0x3f, 0xeb, 0xe0, 0x30, 0x14, -0xb3, 0x77, 0x83, 0x4f, 0x3d, 0x8f, 0xae, 0x28, 0x2d, 0x82, 0xb3, 0x37, 0x15, 0x3c, 0xb0, 0xbb, -0xce, 0xfe, 0x5c, 0x97, 0x03, 0x62, 0x8b, 0x88, 0xc4, 0x8f, 0xb8, 0x7f, 0x5b, 0xae, 0x6a, 0x3b, -0xd6, 0x12, 0x28, 0x95, 0xd2, 0x04, 0x83, 0x87, 0x97, 0xaf, 0x1e, 0x5d, 0xa0, 0x41, 0xdf, 0x78, -0x30, 0x77, 0xac, 0x04, 0x10, 0x8b, 0x11, 0x47, 0xf4, 0x0b, 0x1b, 0xd4, 0x88, 0x81, 0xcc, 0xf3, -0xb9, 0x50, 0xc8, 0x03, 0x56, 0xee, 0x87, 0x17, 0xf1, 0x29, 0xab, 0x6c, 0xec, 0x29, 0x0c, 0xcc, -0xd7, 0xa9, 0x9a, 0x78, 0x51, 0x6f, 0x42, 0x31, 0x09, 0x99, 0x56, 0x31, 0xf2, 0x99, 0x8d, 0xf2, -0xd1, 0x06, 0x4b, 0x2f, 0x9b, 0x2c, 0xe9, 0x2c, 0xad, 0x18, 0xba, 0x64, 0x5a, 0xf3, 0x64, 0xa2, -0xaa, 0x76, 0x30, 0x22, 0xa5, 0x01, 0xc5, 0x52, 0x26, 0xa9, 0x16, 0xd2, 0x5a, 0x0f, 0xe0, 0x7c, -0xbd, 0x57, 0xf5, 0xeb, 0x65, 0x69, 0x40, 0x75, 0xd5, 0xfd, 0x4f, 0x66, 0xa8, 0x01, 0xf6, 0xeb, -0x06, 0xd8, 0xa6, 0xf4, 0xab, 0xb8, 0x0b, 0x36, 0xf8, 0x2e, 0xd4, 0x6f, 0xe6, 0x2b, 0x40, 0x01, -0x42, 0x45, 0x51, 0x39, 0xc1, 0xca, 0x1d, 0x8e, 0x22, 0x9a, 0xdc, 0x5a, 0x07, 0x17, 0xc7, 0x97, -0x03, 0x72, 0xf8, 0xf1, 0xa4, 0x01, 0xec, 0xcf, 0xa5, 0x76, 0xa8, 0x75, 0xaa, 0xf6, 0x3c, 0x8f, -0x42, 0x4a, 0x07, 0x3a, 0x73, 0x11, 0xf9, 0xaa, 0xad, 0x77, 0xc2, 0xcf, 0x62, 0xa8, 0x35, 0xaa, -0xb9, 0x48, 0x1a, 0x0c, 0xee, 0x74, 0x17, 0x78, 0x46, 0x22, 0xd3, 0x15, 0x87, 0x0f, 0x71, 0xe4, -0x3b, 0xfd, 0xed, 0x36, 0xa4, 0xa8, 0x98, 0xf0, 0x04, 0x12, 0x13, 0x2f, 0x4d, 0xd0, 0x1a, 0x35, -0x01, 0x95, 0x51, 0x5d, 0x46, 0xd7, 0xf3, 0xa0, 0x7c, 0x56, 0x0a, 0xe9, 0x8e, 0x8f, 0x79, 0x5e, -0xbe, 0x65, 0x2d, 0x27, 0x63, 0x81, 0x60, 0x8d, 0xe8, 0x92, 0x46, 0x55, 0x4b, 0xd2, 0x14, 0x1c, -0x5b, 0x2a, 0xb8, 0xca, 0x74, 0x41, 0x60, 0x2b, 0xd3, 0x15, 0x11, 0xb3, 0x4c, 0xb9, 0x26, 0xb0, -0x63, 0x47, 0xc5, 0x9d, 0x9d, 0x5d, 0x82, 0xff, 0xe2, 0xa0, 0xf3, 0x8a, 0xc4, 0xba, 0xf3, 0x7c, -0x0e, 0xa3, 0xd1, 0x0a, 0x1e, 0x4e, 0x0b, 0x12, 0x00, 0x15, 0x12, 0x8f, 0x1a, 0xf4, 0x56, 0x5d, -0x69, 0xf0, 0x6c, 0x2c, 0x84, 0xae, 0x38, 0xb6, 0x4c, 0xa7, 0x11, 0x1b, 0xeb, 0x2a, 0xc9, 0x6c, -0x9f, 0x69, 0x05, 0xb1, 0x92, 0x7f, 0xf9, 0x22, 0x9d, 0x91, 0xdd, 0xee, 0xee, 0xf3, 0xea, 0x9e, -0x66, 0xd1, 0x0a, 0xde, 0x88, 0x1f, 0xac, 0x2d, 0x10, 0x70, 0xe5, 0x0b, 0x19, 0xb8, 0x93, 0x89, -0xf7, 0xf9, 0xcf, 0xf0, 0xfe, 0xf8, 0x8f, 0x57, 0xbb, 0xf1, 0xdb, 0x9a, 0xac, 0xce, 0xc5, 0x70, -0x81, 0x1e, 0x30, 0xdd, 0x16, 0x86, 0x27, 0x5c, 0x87, 0xd9, 0xc8, 0xf5, 0x45, 0xec, 0x45, 0x59, -0x4c, 0xd3, 0xcc, 0xf8, 0xb2, 0x6e, 0xf9, 0xbd, 0x91, 0x5b, 0x37, 0xdc, 0xf3, 0x4a, 0xfc, 0xab, -0x49, 0x56, 0x84, 0x4e, 0xf2, 0x49, 0x58, 0x89, 0x5d, 0x83, 0xbf, 0x2b, 0x0b, 0x6e, 0x05, 0xd3, -0x83, 0xfb, 0x98, 0x6b, 0xe5, 0x8d, 0xc6, 0xaf, 0x5f, 0xef, 0xbe, 0x7e, 0x09, 0x30, 0x4f, 0x06, -0xe4, 0xf2, 0xc3, 0xe1, 0x1e, 0x29, 0x46, 0xc8, 0xde, 0x1e, 0x29, 0x6b, 0xb6, 0x31, 0x2a, 0x66, -0xff, 0x99, 0x4a, 0x87, 0x78, 0x84, 0x5b, 0xdb, 0x46, 0xce, 0x97, 0x0c, 0xc8, 0x63, 0xca, 0x10, -0x83, 0x48, 0x94, 0x2b, 0xe4, 0x04, 0x14, 0x7d, 0x96, 0x28, 0x06, 0x80, 0x66, 0x9d, 0xc4, 0xef, -0x28, 0xea, 0xbd, 0x70, 0xbb, 0x5e, 0xc0, 0x58, 0xb0, 0x16, 0x51, 0x72, 0x70, 0x74, 0x44, 0xde, -0xfe, 0xd1, 0x39, 0x3f, 0xea, 0x5c, 0x1e, 0x12, 0x10, 0xdb, 0x22, 0xb6, 0xab, 0xb9, 0xbb, 0xb1, -0x93, 0xa9, 0xba, 0x30, 0xce, 0x12, 0x1f, 0xa9, 0x8e, 0xa4, 0xd8, 0x0e, 0xbd, 0x67, 0x09, 0x9c, -0x56, 0xbe, 0x2d, 0x46, 0x37, 0x0e, 0xf9, 0x6b, 0xad, 0xcc, 0x8c, 0xcc, 0x39, 0x9c, 0xe4, 0x38, -0xbf, 0x5f, 0x3f, 0x7d, 0x7c, 0xf9, 0x71, 0xd3, 0xf4, 0x85, 0x52, 0xbc, 0x66, 0xfe, 0xe1, 0xc9, -0x06, 0x54, 0x70, 0x86, 0x9c, 0x00, 0x3b, 0x34, 0xa1, 0x02, 0x72, 0x51, 0x9a, 0xc0, 0x69, 0x45, -0x49, 0x9f, 0x5c, 0x59, 0x2a, 0xb8, 0xb5, 0xda, 0xc4, 0xf2, 0xd3, 0x6c, 0x38, 0x96, 0xec, 0x8b, -0xf9, 0x1f, 0xf2, 0x74, 0x28, 0xa1, 0x2d, 0x54, 0x60, 0xd3, 0x6a, 0xaf, 0x59, 0xc0, 0x5f, 0x2e, -0x14, 0x8b, 0x80, 0x45, 0x73, 0x15, 0xa8, 0x19, 0xa6, 0xf0, 0x6e, 0x9e, 0x04, 0xf0, 0x3f, 0xa6, -0x3e, 0x5e, 0x90, 0x27, 0x87, 0x12, 0xbc, 0xc1, 0x1b, 0xad, 0x86, 0x59, 0xaa, 0x79, 0xcc, 0x9a, -0x8c, 0x8f, 0x21, 0xe9, 0xc3, 0xa1, 0xe2, 0x7f, 0x1a, 0x13, 0xea, 0x96, 0x69, 0x3f, 0x1c, 0x66, -0x0a, 0xf6, 0x1f, 0x6e, 0xa1, 0x73, 0x03, 0xf3, 0x42, 0xd3, 0x68, 0x7e, 0x07, 0xc8, 0xd9, 0xd2, -0x0d, 0x9d, 0x34, 0x19, 0x8e, 0xe9, 0xbd, 0x11, 0x86, 0xec, 0x31, 0x6e, 0x4f, 0x99, 0xcc, 0x9d, -0x04, 0x17, 0x00, 0xfd, 0x70, 0xe9, 0x5e, 0xb2, 0x11, 0x70, 0x19, 0xc4, 0x81, 0x2a, 0x18, 0xb8, -0xde, 0x7f, 0xb2, 0x66, 0x11, 0x1a, 0x58, 0xa6, 0x30, 0x88, 0xd7, 0xeb, 0xbb, 0x37, 0x16, 0x92, -0xd8, 0x79, 0xa8, 0xaf, 0x6e, 0xd9, 0xac, 0x4d, 0xa6, 0x34, 0xca, 0xd8, 0x35, 0x11, 0x63, 0xf2, -0xdb, 0xe8, 0x86, 0xf9, 0xda, 0x05, 0x82, 0x97, 0x9c, 0x29, 0xb3, 0x4d, 0x75, 0xfb, 0x84, 0x3f, -0x3e, 0xb6, 0x9f, 0xe2, 0x4e, 0xb9, 0x1c, 0x7a, 0xc3, 0x2c, 0x00, 0x69, 0xb0, 0xe5, 0x90, 0xbf, -0xff, 0x26, 0x36, 0xc6, 0x17, 0x8c, 0x19, 0xb3, 0xa4, 0xdf, 0x27, 0xad, 0x0c, 0x5a, 0xdd, 0x31, -0x20, 0x0a, 0x5a, 0x60, 0x0e, 0x4f, 0x10, 0x9e, 0x64, 0x6c, 0xbf, 0xd6, 0xac, 0x01, 0xee, 0xa6, -0x99, 0x0a, 0x6d, 0x2d, 0xd1, 0xa4, 0x2b, 0x59, 0x1a, 0x51, 0x9f, 0xd9, 0xad, 0x61, 0xab, 0x4d, -0x5a, 0xa4, 0xe5, 0x14, 0x80, 0x9d, 0x9a, 0xc4, 0x7c, 0x58, 0x8f, 0x44, 0x50, 0xb4, 0x01, 0x2e, -0x94, 0xe6, 0x71, 0xc4, 0xf0, 0xef, 0xdb, 0xd9, 0x49, 0x60, 0xe7, 0xc7, 0x94, 0xe3, 0xe2, 0x69, -0x97, 0x04, 0x76, 0x2d, 0x18, 0x6c, 0xc4, 0x11, 0x90, 0x6d, 0xe5, 0xcd, 0x0f, 0xc1, 0xe4, 0x95, -0xb1, 0xe9, 0x28, 0x2c, 0xa7, 0x7e, 0x1f, 0xe3, 0xc8, 0xb6, 0x34, 0x1d, 0x45, 0xb8, 0xe9, 0x7f, -0x19, 0x86, 0xdc, 0x23, 0xc5, 0xc0, 0x43, 0xbd, 0xc6, 0x5c, 0x0b, 0x9b, 0x7d, 0xd4, 0x7a, 0x68, -0xe7, 0x61, 0x70, 0x6a, 0xc5, 0xd7, 0x47, 0xb7, 0xac, 0xc0, 0x11, 0x0d, 0x26, 0xcc, 0x56, 0x99, -0xef, 0x33, 0xa5, 0xda, 0x04, 0xd9, 0xa4, 0x4d, 0x14, 0xb0, 0x5b, 0x82, 0xe4, 0x28, 0x25, 0x74, -0x32, 0x75, 0x9b, 0x2d, 0xa1, 0x83, 0x95, 0x89, 0x41, 0x88, 0x5d, 0xce, 0xb2, 0x5b, 0xc6, 0x62, -0x6e, 0xb7, 0x63, 0x91, 0x67, 0xc4, 0x2e, 0xad, 0x3b, 0xe4, 0x17, 0xa8, 0x8d, 0xfc, 0xbf, 0x45, -0xf6, 0x8a, 0x55, 0x9c, 0x87, 0x7c, 0xd5, 0x2d, 0xf1, 0xce, 0xa3, 0x6f, 0x74, 0x36, 0x23, 0x03, -0xd6, 0x5c, 0x06, 0x86, 0xaa, 0x24, 0xed, 0xec, 0xe6, 0xbd, 0x06, 0x2c, 0x5b, 0x23, 0x23, 0xe1, -0x99, 0xab, 0x7e, 0x06, 0x3a, 0x15, 0x42, 0x3b, 0xbe, 0x55, 0xc2, 0x75, 0x9c, 0xed, 0x19, 0xee, -0x82, 0x06, 0xfc, 0x11, 0x7e, 0x4b, 0x73, 0x76, 0x3b, 0x3b, 0x39, 0x27, 0xb6, 0x34, 0x87, 0x0b, -0x24, 0x20, 0x0b, 0x1c, 0xac, 0xec, 0xd3, 0xdf, 0x3e, 0xe3, 0xe5, 0xc3, 0xc9, 0xfb, 0x0f, 0x78, -0x3d, 0x3b, 0xfc, 0xdd, 0xaa, 0xa9, 0xe0, 0x82, 0x27, 0xa5, 0xb1, 0xb3, 0x43, 0xce, 0x50, 0x74, -0xb7, 0xb8, 0xbc, 0xec, 0x92, 0x5b, 0xeb, 0x7a, 0xbd, 0x0e, 0xa0, 0x5e, 0x01, 0x95, 0x2b, 0x11, -0xdf, 0xb9, 0x1c, 0x43, 0x8d, 0x37, 0x55, 0xf6, 0x9c, 0x3b, 0x1a, 0xb3, 0x15, 0x2a, 0xd3, 0x3a, -0xbf, 0xf8, 0x75, 0xf7, 0xc5, 0x29, 0xf4, 0xc9, 0xed, 0x22, 0xb1, 0x2a, 0xd6, 0xb1, 0x4b, 0x49, -0x12, 0xe0, 0x12, 0x16, 0xb4, 0x21, 0x2d, 0x9a, 0xe6, 0x4c, 0x9e, 0x60, 0x82, 0xc0, 0xf3, 0xb0, -0x26, 0x90, 0x7e, 0xcf, 0x30, 0xfa, 0xc5, 0xa4, 0xe5, 0x38, 0xed, 0xc7, 0x21, 0x90, 0x8f, 0xe2, -0x8e, 0x49, 0x72, 0xca, 0xa6, 0x86, 0xee, 0x53, 0x7a, 0x55, 0x59, 0x2c, 0xc5, 0xd9, 0x61, 0x84, -0xb3, 0xd7, 0x5b, 0x99, 0x7b, 0x87, 0xa7, 0xcf, 0x05, 0x3c, 0x30, 0x81, 0xb1, 0x40, 0x56, 0x8d, -0x21, 0xdf, 0xe1, 0xd4, 0x35, 0xe2, 0x1c, 0xa5, 0xca, 0xaa, 0xaf, 0xd0, 0x9a, 0x1d, 0x7b, 0x20, -0x2c, 0x52, 0x6c, 0x73, 0xb8, 0x6b, 0xa3, 0x3a, 0xa6, 0xa0, 0xd7, 0xce, 0xe3, 0xc3, 0x12, 0xa4, -0x11, 0x8c, 0x4b, 0x1d, 0xe5, 0xff, 0x33, 0x44, 0x67, 0xf2, 0x97, 0x00, 0x8c, 0xff, 0x2d, 0x7e, -0x5b, 0x1b, 0xdb, 0x98, 0xdf, 0x47, 0xb1, 0xde, 0x90, 0xdf, 0x7e, 0xac, 0xcb, 0x70, 0x1f, 0x9d, -0x0d, 0x76, 0x9f, 0x77, 0xbb, 0x87, 0xeb, 0x49, 0x8c, 0x26, 0x9a, 0x92, 0x78, 0x65, 0xee, 0xb1, -0x24, 0xfe, 0xba, 0x74, 0xd8, 0x84, 0xee, 0xbf, 0x93, 0x0c, 0x00, 0xe3, 0xc7, 0x26, 0x03, 0xb8, -0xfc, 0x8d, 0x47, 0xdd, 0x5a, 0x26, 0x6c, 0xe4, 0xe6, 0xb3, 0x2f, 0x5a, 0x37, 0x51, 0x73, 0x91, -0x3e, 0x45, 0x54, 0xbf, 0x8f, 0x1a, 0x17, 0x9b, 0xbf, 0x9c, 0x56, 0x6b, 0xb9, 0x54, 0x4d, 0x20, -0x2d, 0x33, 0x66, 0x92, 0xc8, 0x6c, 0x32, 0x6c, 0xeb, 0x23, 0x6c, 0xf5, 0xd3, 0xe0, 0x77, 0x30, -0x8f, 0x76, 0xf4, 0xfd, 0xd0, 0x4f, 0xf4, 0x63, 0xe2, 0x17, 0xa5, 0xb8, 0xcc, 0xc5, 0x9b, 0x98, -0xeb, 0x5b, 0xa8, 0x0b, 0x17, 0x28, 0xf3, 0x71, 0x35, 0x57, 0x4b, 0x77, 0x7e, 0x58, 0x92, 0x9e, -0x7d, 0x19, 0x0c, 0xfe, 0xff, 0x9a, 0x31, 0x93, 0x90, 0x27, 0xf8, 0x0a, 0xf8, 0x91, 0x8c, 0x84, -0x07, 0x12, 0x95, 0x25, 0x92, 0x2b, 0x46, 0x0e, 0x48, 0xb7, 0x29, 0x31, 0xbf, 0x27, 0x94, 0x2b, -0x9d, 0x6e, 0xd6, 0xd8, 0xda, 0x7e, 0x7b, 0x44, 0xeb, 0xa2, 0x7a, 0xb5, 0x51, 0xba, 0xcc, 0xdb, -0xcb, 0xdc, 0x77, 0xd0, 0x49, 0xd8, 0x1d, 0x1e, 0xce, 0x6c, 0x35, 0x2a, 0xff, 0x26, 0x3b, 0xf0, -0xec, 0xef, 0xb8, 0x5a, 0x9c, 0x0a, 0xfc, 0x32, 0x70, 0x09, 0xcf, 0x2e, 0xc9, 0xc4, 0x6e, 0x05, -0xac, 0xf3, 0xee, 0xb8, 0xb5, 0xa9, 0x8c, 0x56, 0xd6, 0x51, 0x4c, 0xd7, 0x2f, 0x03, 0x13, 0xff, -0xd0, 0x2a, 0x47, 0xd0, 0xec, 0x65, 0x09, 0xf7, 0xcd, 0x13, 0x04, 0x51, 0x9a, 0xca, 0xca, 0x92, -0xab, 0xae, 0x75, 0x48, 0x31, 0x20, 0xc6, 0x63, 0x00, 0xe1, 0xfc, 0x20, 0x14, 0x22, 0x6d, 0x00, -0x81, 0x8e, 0x3f, 0xfb, 0x31, 0x18, 0xce, 0xf1, 0xa5, 0x11, 0x19, 0xb1, 0x90, 0x4e, 0xb9, 0xc8, -0x64, 0x85, 0x29, 0x03, 0xae, 0xcc, 0x34, 0xe2, 0x2c, 0xc9, 0x72, 0x79, 0xcc, 0xf0, 0x25, 0x9c, -0x81, 0x86, 0x2e, 0xf3, 0xf3, 0x96, 0xf8, 0x0b, 0x9f, 0x92, 0x89, 0x79, 0xaa, 0xa7, 0x32, 0xc1, -0xbf, 0x8e, 0xb3, 0x11, 0xcf, 0x75, 0xf3, 0x74, 0x43, 0xc5, 0xd7, 0x3d, 0x75, 0x6e, 0x5d, 0xf1, -0x1b, 0x8a, 0x3d, 0xc9, 0xa2, 0x88, 0x3c, 0xed, 0x93, 0x06, 0x89, 0xf9, 0x7b, 0x97, 0xa5, 0x37, -0x3b, 0x57, 0xd6, 0x24, 0xbf, 0xb1, 0xae, 0xeb, 0xf8, 0x75, 0xdd, 0xf0, 0x95, 0x25, 0xd9, 0x58, -0x32, 0x15, 0x82, 0x42, 0xc3, 0x1a, 0xf8, 0x9b, 0x52, 0x49, 0xcc, 0xc7, 0xab, 0xfe, 0x82, 0x58, -0xcc, 0xcb, 0x30, 0x56, 0x70, 0x8b, 0xdd, 0xc2, 0xe9, 0x96, 0xb3, 0xdf, 0xcc, 0x13, 0x30, 0xef, -0xe2, 0x8b, 0xb4, 0xe3, 0x2f, 0x19, 0x9f, 0x82, 0xa1, 0xf9, 0xca, 0x9b, 0x55, 0x8a, 0xf7, 0xcb, -0x64, 0x15, 0x2e, 0x6e, 0xf2, 0x3e, 0xf9, 0x74, 0x71, 0xda, 0xb7, 0xf2, 0x94, 0x9c, 0xcf, 0x0d, -0x33, 0x19, 0xd5, 0x3d, 0x24, 0x6d, 0xa0, 0x46, 0xf5, 0x76, 0x36, 0xa0, 0x93, 0x73, 0x1a, 0x33, -0xbb, 0x85, 0xcc, 0xd7, 0x72, 0xae, 0xba, 0xd7, 0x05, 0x47, 0x1e, 0x85, 0x3c, 0x0a, 0x6c, 0xc4, -0xd2, 0xe0, 0xdd, 0x43, 0xed, 0x28, 0x9e, 0x91, 0x1b, 0x22, 0x5a, 0x7d, 0x36, 0x74, 0xf3, 0xcf, -0x2b, 0x1b, 0xc2, 0x57, 0xe9, 0x57, 0x0a, 0x71, 0x37, 0x86, 0xfb, 0xc7, 0x74, 0x96, 0xde, 0xb0, -0x5d, 0x59, 0xb9, 0x9e, 0x49, 0x8e, 0x26, 0x25, 0x08, 0xca, 0xe1, 0x0d, 0xbd, 0xb7, 0x5b, 0xf8, -0x41, 0xc6, 0x33, 0xdf, 0x24, 0x5b, 0xed, 0xa5, 0xd3, 0xe9, 0xab, 0x82, 0xd0, 0x78, 0x0a, 0x99, -0x97, 0xf9, 0x8e, 0xcb, 0xa1, 0xe1, 0x91, 0x1f, 0x06, 0x67, 0xa7, 0xe5, 0xf6, 0x9a, 0xf1, 0xeb, -0xaf, 0xac, 0xa8, 0x12, 0xb2, 0xf9, 0x86, 0xe4, 0xe5, 0xdf, 0x09, 0x9e, 0x91, 0x3b, 0xc0, 0x2e, -0xee, 0xdc, 0x48, 0xe4, 0xb4, 0xe6, 0xa6, 0x54, 0x87, 0xf8, 0xed, 0xb5, 0x70, 0x66, 0xc9, 0x8f, -0xc5, 0x77, 0xde, 0xfc, 0x2e, 0xff, 0xc6, 0xda, 0xf3, 0xf2, 0xcf, 0xe1, 0xff, 0x01, 0xf7, 0x15, -0xfc, 0x5a, 0x26, 0x1f, 0x00, 0x00}; -#endif /*__SYSTEM_HTML_H__*/ diff --git a/src/web/html/h/update_html.h b/src/web/html/h/update_html.h deleted file mode 100644 index a853a186..00000000 --- a/src/web/html/h/update_html.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef __UPDATE_HTML_H__ -#define __UPDATE_HTML_H__ -#define update_html_len 1090 -const uint8_t update_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xa5, 0x57, 0x5b, 0x6f, 0xdb, 0x36, -0x14, 0x7e, 0xef, 0xaf, 0xe0, 0xf4, 0x30, 0xd8, 0x43, 0x2c, 0x3a, 0xe9, 0x25, 0x59, 0x2a, 0x7b, -0x70, 0xd2, 0xac, 0x0b, 0x30, 0x74, 0x41, 0x9d, 0xa0, 0xe8, 0x53, 0x41, 0x51, 0x47, 0x16, 0x13, -0x8a, 0x14, 0x48, 0x4a, 0x8e, 0x37, 0xec, 0xbf, 0x8f, 0xd4, 0xc5, 0x96, 0x6c, 0x29, 0x73, 0x51, -0xbf, 0x48, 0x24, 0xcf, 0xf9, 0xce, 0x77, 0xae, 0x94, 0x83, 0x9f, 0x22, 0x49, 0xcd, 0x26, 0x03, -0x94, 0x98, 0x94, 0xcf, 0x5f, 0x05, 0xd5, 0x03, 0xd9, 0x5f, 0x90, 0x00, 0x89, 0xaa, 0xd7, 0x72, -0x69, 0x98, 0xe1, 0x30, 0x7f, 0xc8, 0x22, 0x62, 0x20, 0xc0, 0xd5, 0x6a, 0x77, 0xca, 0x99, 0x78, -0x42, 0x0a, 0xf8, 0xcc, 0xd3, 0x66, 0xc3, 0x41, 0x27, 0x00, 0xc6, 0x43, 0x0e, 0x79, 0xe6, 0x19, -0x78, 0x36, 0x98, 0x6a, 0xed, 0xa1, 0x44, 0x41, 0x5c, 0x4b, 0xf8, 0x76, 0xe3, 0xb7, 0x62, 0x36, -0xf5, 0x2f, 0xfc, 0xe9, 0x74, 0x7a, 0xea, 0x61, 0x6b, 0x3c, 0x05, 0x43, 0x90, 0x20, 0xa9, 0xd5, -0x29, 0x18, 0xac, 0x33, 0xa9, 0x2c, 0x06, 0x95, 0xc2, 0x80, 0x30, 0x33, 0x6f, 0xcd, 0x22, 0x93, -0xcc, 0x22, 0x28, 0x18, 0x85, 0x49, 0xb9, 0x38, 0x41, 0x4c, 0x30, 0xc3, 0x08, 0x9f, 0x68, 0x4a, -0x38, 0xcc, 0x4e, 0xbd, 0x06, 0x84, 0x26, 0x44, 0x69, 0xb0, 0x4a, 0x0f, 0xf7, 0xbf, 0x4f, 0x2e, -0xdc, 0xb6, 0xa6, 0x8a, 0x65, 0xa6, 0xcd, 0xe8, 0x91, 0x14, 0xa4, 0xda, 0xf5, 0x90, 0x56, 0x74, -0xe6, 0x91, 0x8c, 0xf9, 0x8f, 0x1d, 0x52, 0xf3, 0x00, 0x57, 0x12, 0x16, 0xe0, 0x7b, 0x3c, 0xa4, -0x92, 0x4b, 0xa5, 0xff, 0xc7, 0x45, 0x25, 0x43, 0x69, 0x74, 0xcb, 0x41, 0x21, 0x99, 0x88, 0xe0, -0xf9, 0x04, 0x09, 0x19, 0x4b, 0xce, 0xe5, 0xda, 0x43, 0xb8, 0xce, 0x05, 0xde, 0x25, 0x23, 0x08, -0x65, 0xb4, 0x69, 0x45, 0x3e, 0x62, 0x05, 0xa2, 0x9c, 0x68, 0x6d, 0x69, 0xc8, 0x4c, 0x90, 0xc2, -0xab, 0xe5, 0x48, 0x4d, 0x06, 0xb7, 0x39, 0x6c, 0x45, 0x5d, 0xfe, 0xbc, 0xf9, 0x22, 0x91, 0x9b, -0x0f, 0xf7, 0x0f, 0x01, 0x26, 0x7b, 0x4a, 0xbb, 0xe0, 0x5c, 0x16, 0x92, 0x45, 0xa3, 0xe9, 0xf8, -0xfd, 0x56, 0x97, 0x59, 0xc6, 0x1e, 0x92, 0x82, 0x72, 0x46, 0x9f, 0x1a, 0xab, 0xa3, 0xb1, 0xd7, -0x22, 0xa5, 0x33, 0x22, 0x5c, 0xf0, 0xdc, 0xe3, 0xbb, 0x77, 0x77, 0x6c, 0x9c, 0x6f, 0x2c, 0xda, -0x3a, 0xd6, 0x10, 0x48, 0x65, 0xc8, 0x1c, 0xfb, 0x1d, 0x06, 0x29, 0xc5, 0xac, 0xcc, 0xeb, 0xad, -0x50, 0xc2, 0x22, 0x68, 0xf2, 0x81, 0x39, 0x2b, 0xa0, 0x93, 0xd8, 0x3f, 0xed, 0xc6, 0xd6, 0x4e, -0x17, 0xe2, 0x4d, 0x3f, 0x84, 0x06, 0x65, 0x2b, 0xad, 0x03, 0xf2, 0x05, 0xc2, 0x6a, 0x77, 0x00, -0xe9, 0xed, 0x10, 0x92, 0xc9, 0xb3, 0x0e, 0xd0, 0x12, 0x8c, 0x61, 0x62, 0xa5, 0xbb, 0x38, 0x2e, -0x22, 0x0d, 0x80, 0x86, 0x0c, 0x14, 0x31, 0x52, 0x79, 0x87, 0x01, 0xdc, 0xda, 0x7b, 0xd7, 0x6f, -0x2f, 0x2f, 0x7b, 0xb6, 0x63, 0xb0, 0x69, 0xe3, 0x5e, 0xda, 0xe7, 0x03, 0xb4, 0x37, 0xda, 0x40, -0xda, 0xe5, 0x5d, 0x6e, 0xfd, 0x20, 0xeb, 0x8b, 0xad, 0x05, 0xdb, 0x80, 0xb6, 0xa3, 0x88, 0x5a, -0xb9, 0xce, 0xfd, 0x16, 0x72, 0x22, 0x9e, 0xbc, 0xf9, 0xe7, 0x9b, 0xe5, 0x3d, 0x5a, 0xdc, 0xdd, -0x0e, 0x90, 0xfd, 0xb5, 0xd1, 0x4e, 0x8c, 0xc9, 0xf4, 0x25, 0xc6, 0xc4, 0x96, 0x74, 0x64, 0x72, -0xdf, 0x31, 0xdf, 0xc7, 0xfa, 0x20, 0x69, 0x9e, 0xda, 0x5e, 0x23, 0x86, 0x49, 0x31, 0x00, 0x78, -0x3a, 0xdd, 0xf1, 0x09, 0x65, 0x6e, 0x3a, 0x0e, 0x2f, 0xdc, 0xce, 0x0f, 0xfa, 0x3b, 0x1d, 0x28, -0x51, 0xb9, 0x62, 0xc2, 0x16, 0xa6, 0x7b, 0x0c, 0x51, 0x1b, 0xd4, 0xb4, 0xac, 0x4a, 0xd5, 0x36, -0xbb, 0x00, 0xdb, 0xf6, 0xd9, 0x6b, 0xa4, 0x35, 0x8b, 0x59, 0xd5, 0xbe, 0x4d, 0x2f, 0x8b, 0x58, -0x3a, 0xb2, 0xa5, 0x68, 0x4b, 0xa3, 0xab, 0xa5, 0x48, 0x66, 0x1d, 0x6b, 0x35, 0x5c, 0xe7, 0xb8, -0x1e, 0x60, 0x7b, 0xc7, 0xa5, 0x48, 0xcc, 0x80, 0x47, 0xb6, 0xde, 0x0f, 0x8f, 0xaa, 0x5b, 0x03, -0x56, 0x20, 0xa2, 0x86, 0x4b, 0x04, 0xda, 0xb5, 0x02, 0x07, 0x6a, 0x50, 0xcc, 0x54, 0xba, 0x26, -0x0a, 0xec, 0x0b, 0x07, 0x34, 0xfa, 0xc5, 0x0f, 0x99, 0x18, 0x07, 0xb8, 0x52, 0x18, 0x40, 0x8b, -0xa5, 0x4a, 0x4b, 0x42, 0xee, 0xc5, 0x43, 0x76, 0xd4, 0x26, 0xd2, 0xae, 0xee, 0xfe, 0x5a, 0xde, -0x7b, 0x88, 0x50, 0x97, 0xf3, 0x6d, 0x37, 0x78, 0x08, 0x04, 0xad, 0x86, 0x77, 0x9a, 0x73, 0xc3, -0x32, 0xa2, 0x0c, 0x76, 0x7a, 0x13, 0x7b, 0x4a, 0x9c, 0x38, 0x85, 0xcc, 0x4c, 0xb6, 0xf7, 0x48, -0x6e, 0xe2, 0xf2, 0x1e, 0x41, 0x03, 0xbf, 0x80, 0x89, 0x2c, 0x6f, 0xae, 0x17, 0xc7, 0xd9, 0xab, -0xa7, 0x7c, 0x6d, 0xee, 0x48, 0xcd, 0x30, 0x37, 0xa6, 0x95, 0x9d, 0xd0, 0xd8, 0xf7, 0x82, 0xf0, -0xdc, 0x1e, 0x3d, 0xd4, 0xbc, 0xb7, 0x73, 0xd7, 0xd5, 0x40, 0x67, 0xea, 0x76, 0x50, 0x4b, 0x67, -0x7a, 0x32, 0x82, 0xfb, 0x53, 0xb2, 0x9f, 0xfa, 0x81, 0x4a, 0x88, 0xa5, 0x34, 0x9d, 0x42, 0x68, -0x5f, 0x3f, 0x1c, 0x62, 0xd3, 0x1d, 0xca, 0xc7, 0x77, 0x66, 0x7d, 0x11, 0xa1, 0x9f, 0xa9, 0xcc, -0x36, 0xe8, 0x6c, 0x7a, 0xf6, 0xba, 0xdb, 0x03, 0x39, 0xdf, 0xe3, 0xcb, 0xd9, 0xfc, 0xc0, 0x40, -0xc4, 0x34, 0x95, 0x2a, 0xf2, 0x57, 0x2b, 0xfc, 0xe5, 0xef, 0xe4, 0xf9, 0xe6, 0xeb, 0xbb, 0xb3, -0xf4, 0xaa, 0x67, 0x0a, 0x54, 0x62, 0xce, 0x80, 0xad, 0x28, 0x76, 0x04, 0xf0, 0x8a, 0x99, 0x24, -0x0f, 0x7d, 0x2a, 0x53, 0xcc, 0xf3, 0x94, 0x64, 0x79, 0xe9, 0xcb, 0x21, 0xf2, 0xc7, 0x52, 0xee, -0x10, 0x38, 0xc0, 0x0d, 0xff, 0xfd, 0xa6, 0xac, 0x43, 0xa7, 0xd8, 0x2a, 0xe9, 0xc4, 0x6e, 0xc0, -0xdf, 0x3d, 0x83, 0x47, 0xd1, 0xc4, 0x76, 0x9d, 0x32, 0xa3, 0x71, 0x18, 0x9f, 0x9f, 0x9f, 0x9d, -0xbf, 0xb5, 0x34, 0x6f, 0xef, 0xd1, 0xf2, 0x8f, 0xc5, 0x25, 0xaa, 0x77, 0xd0, 0xe5, 0x25, 0x6a, -0x66, 0xdc, 0x60, 0x54, 0xca, 0xfc, 0x83, 0xce, 0xbe, 0xb9, 0x4a, 0xf5, 0x8e, 0x8d, 0x1c, 0x55, -0x60, 0x87, 0x6d, 0x01, 0x8e, 0x83, 0x14, 0xda, 0x97, 0x6a, 0x65, 0x15, 0x29, 0x08, 0x0d, 0x96, -0xd0, 0x66, 0x22, 0xe8, 0x44, 0x13, 0xfc, 0xc6, 0x9f, 0xe2, 0x08, 0x20, 0x3a, 0x88, 0x28, 0x9a, -0x5f, 0x5f, 0xa3, 0xab, 0xaf, 0x93, 0x4f, 0xd7, 0x93, 0xe5, 0x02, 0x59, 0xb1, 0x23, 0x62, 0xbb, -0x5f, 0xbb, 0x2f, 0x7e, 0xf9, 0x75, 0x5d, 0x88, 0x73, 0x51, 0x8e, 0x09, 0x94, 0xb9, 0xb6, 0xff, -0x08, 0xc2, 0xde, 0xee, 0x74, 0x24, 0xc3, 0xc7, 0x31, 0xfa, 0xe7, 0xa0, 0x95, 0x4a, 0x99, 0x4f, -0xf6, 0xcb, 0xc7, 0x9d, 0xbf, 0xef, 0x3f, 0xbe, 0x59, 0xde, 0xbd, 0x74, 0xfc, 0x59, 0x6b, 0xd6, -0x73, 0xfe, 0xef, 0xab, 0x7e, 0x56, 0x55, 0xc7, 0xf7, 0x50, 0x89, 0xea, 0x7b, 0xcd, 0xb7, 0xb1, -0xbb, 0xe1, 0xe0, 0x5e, 0xaf, 0x36, 0xb7, 0xd1, 0xa8, 0x9a, 0x84, 0x63, 0x5f, 0xe7, 0xa1, 0xad, -0x80, 0x51, 0x0f, 0x8d, 0x82, 0x28, 0x04, 0x68, 0x36, 0x8c, 0xd0, 0x0c, 0xf7, 0x1e, 0x5d, 0xf0, -0x15, 0x64, 0x9c, 0x50, 0xb8, 0x4e, 0x18, 0x8f, 0x14, 0x88, 0x91, 0xbb, 0xf2, 0x46, 0xf5, 0xc8, -0x43, 0xda, 0xe6, 0xd2, 0xd8, 0x9c, 0x8e, 0x5f, 0xf6, 0xce, 0x1a, 0x5c, 0x3c, 0x92, 0xe7, 0x51, -0x79, 0xfd, 0xe3, 0x55, 0x15, 0x73, 0xef, 0xa4, 0x93, 0x82, 0x16, 0xc2, 0xee, 0x8b, 0xbc, 0x5a, -0x55, 0x5f, 0xc3, 0xf6, 0x03, 0xb9, 0xfc, 0xe3, 0xf2, 0x1f, 0x6f, 0x3a, 0xe4, 0xb0, 0xd0, 0x0c, -0x00, 0x00}; -#endif /*__UPDATE_HTML_H__*/ diff --git a/src/web/html/h/visualization_html.h b/src/web/html/h/visualization_html.h deleted file mode 100644 index 4fdaad5d..00000000 --- a/src/web/html/h/visualization_html.h +++ /dev/null @@ -1,275 +0,0 @@ -#ifndef __VISUALIZATION_HTML_H__ -#define __VISUALIZATION_HTML_H__ -#define visualization_html_len 4311 -const uint8_t visualization_html[] PROGMEM = { -0x1f, 0x8b, 0x08, 0x00, 0x81, 0xb3, 0x2f, 0x65, 0x02, 0xff, 0xed, 0x1c, 0x6b, 0x73, 0xdb, 0x38, -0xee, 0x7b, 0x7f, 0x05, 0xab, 0x99, 0xed, 0xda, 0x5b, 0x3f, 0xf3, 0x6a, 0x37, 0xaf, 0x4e, 0x9a, -0xa6, 0xdb, 0xdc, 0xb5, 0x69, 0xaf, 0xc9, 0x6e, 0x6f, 0x27, 0x93, 0xc9, 0xd0, 0x12, 0x6d, 0xb1, -0x91, 0x25, 0x9d, 0x48, 0xdb, 0xf1, 0xee, 0xe4, 0xbf, 0x1f, 0x40, 0x4a, 0xb2, 0x6c, 0x8b, 0xb2, -0xe4, 0xb8, 0xdd, 0xbd, 0x99, 0xcb, 0x87, 0x24, 0x92, 0x08, 0x10, 0x00, 0x01, 0x10, 0x00, 0x21, -0x1d, 0x3e, 0x75, 0x02, 0x5b, 0x4e, 0x43, 0x46, 0x5c, 0x39, 0xf4, 0x8e, 0x9f, 0x1c, 0xea, 0x3f, -0x04, 0x7e, 0x0e, 0x5d, 0x46, 0x1d, 0xfd, 0xaf, 0xba, 0x94, 0x5c, 0x7a, 0xec, 0xf8, 0x3d, 0x1f, -0xb3, 0xc3, 0xb6, 0xfe, 0x7f, 0xf6, 0xcc, 0xe3, 0xfe, 0x1d, 0x89, 0x98, 0x77, 0x64, 0x09, 0x39, -0xf5, 0x98, 0x70, 0x19, 0x93, 0x16, 0x41, 0xbc, 0x47, 0x96, 0x64, 0xf7, 0xb2, 0x6d, 0x0b, 0x61, -0x11, 0x37, 0x62, 0xfd, 0x78, 0x44, 0x0b, 0x6e, 0xbc, 0x1a, 0x1f, 0x75, 0x5a, 0x2f, 0x5b, 0x9d, -0x4e, 0xa7, 0x6b, 0xb5, 0x61, 0xea, 0x21, 0x93, 0x94, 0xf8, 0x74, 0x08, 0x30, 0x63, 0xce, 0x26, -0x61, 0x10, 0x01, 0x0e, 0x3b, 0xf0, 0x25, 0xf3, 0xe5, 0x91, 0x35, 0xe1, 0x8e, 0x74, 0x8f, 0x1c, -0x36, 0xe6, 0x36, 0x6b, 0xaa, 0x8b, 0x06, 0xe1, 0x3e, 0x97, 0x9c, 0x7a, 0x4d, 0x61, 0x53, 0x8f, -0x1d, 0x75, 0xad, 0x04, 0x89, 0xed, 0xd2, 0x48, 0x30, 0x00, 0xfa, 0xf5, 0xea, 0x6d, 0xf3, 0x25, -0xde, 0x16, 0x76, 0xc4, 0x43, 0x99, 0xa5, 0xe8, 0x2b, 0x1d, 0x53, 0x7d, 0xd7, 0x22, 0x22, 0xb2, -0x8f, 0x2c, 0x1a, 0xf2, 0xd6, 0xd7, 0x39, 0xa2, 0x8e, 0x0f, 0xdb, 0x7a, 0x04, 0x20, 0xa8, 0xc2, -0xa1, 0x1d, 0x78, 0x41, 0x24, 0x56, 0xb0, 0x18, 0x05, 0xbd, 0x40, 0x8a, 0x0c, 0x83, 0x7e, 0xc0, -0x7d, 0x87, 0xdd, 0x37, 0x88, 0x1f, 0xf4, 0x03, 0xcf, 0x0b, 0x26, 0x16, 0x69, 0x67, 0x44, 0x9c, -0x01, 0xa5, 0x61, 0xe8, 0xb1, 0xe6, 0x30, 0xe8, 0x71, 0xf8, 0x33, 0x61, 0xbd, 0x26, 0xdc, 0x68, -0xda, 0x34, 0xa4, 0x3d, 0x8f, 0x65, 0x10, 0x4e, 0x99, 0xb0, 0xe2, 0xa5, 0x6c, 0xcf, 0xd6, 0xf2, -0xb0, 0x17, 0x38, 0xd3, 0x0c, 0x5e, 0x87, 0x8f, 0x89, 0xed, 0x51, 0x21, 0x80, 0x8f, 0x20, 0xf4, -0xe9, 0x38, 0x81, 0xa1, 0x31, 0x37, 0xed, 0x2c, 0x13, 0xe9, 0x50, 0x54, 0x00, 0xeb, 0xf8, 0xc4, -0x0d, 0xa6, 0x6f, 0xae, 0x7e, 0x3d, 0x6c, 0xd3, 0x05, 0xa0, 0x99, 0x74, 0xf7, 0xc7, 0x01, 0x77, -0x6a, 0x9d, 0xfa, 0x41, 0x0a, 0xcb, 0x81, 0x42, 0x8b, 0x04, 0xbe, 0xed, 0x71, 0xfb, 0x2e, 0x99, -0xb5, 0x56, 0xb7, 0x32, 0x44, 0x89, 0x90, 0xfa, 0x28, 0x7d, 0xfc, 0x53, 0xf9, 0xee, 0x8c, 0x1a, -0xe4, 0x8d, 0x3b, 0x29, 0x63, 0x09, 0x01, 0x5a, 0x72, 0xd9, 0xf9, 0xa8, 0x1a, 0x06, 0x63, 0xb6, -0xd3, 0x41, 0x2e, 0x77, 0x58, 0xb2, 0xa0, 0x6d, 0x0f, 0xb4, 0x7e, 0x4e, 0x33, 0xb4, 0x19, 0xd0, -0x3c, 0x14, 0x3b, 0xf9, 0x28, 0x04, 0x8b, 0x40, 0x55, 0xe7, 0x90, 0x7c, 0x61, 0x3d, 0x7d, 0xd7, -0x80, 0x69, 0xd7, 0x84, 0x49, 0x8e, 0xc2, 0x39, 0x44, 0x97, 0x4c, 0x4a, 0xee, 0x0f, 0xc4, 0x3c, -0x1e, 0x94, 0x48, 0x82, 0x40, 0xb0, 0x90, 0x45, 0x54, 0x06, 0x91, 0xb5, 0x2c, 0xc0, 0x74, 0xbe, -0xbd, 0xfc, 0xf9, 0x46, 0xa1, 0x43, 0xe5, 0x3c, 0xfb, 0xbf, 0xaa, 0x5b, 0x06, 0xb2, 0x5f, 0x18, -0xc8, 0x9e, 0x0a, 0xc9, 0x86, 0xf3, 0x74, 0xab, 0x5b, 0x8f, 0xa4, 0xfa, 0x65, 0x3a, 0x03, 0x58, -0x30, 0x98, 0x24, 0x8d, 0x06, 0x68, 0xfa, 0xb7, 0x3d, 0x8f, 0xfa, 0x77, 0xd6, 0xf1, 0xe7, 0xb3, -0xcb, 0x2b, 0x72, 0xf2, 0xe9, 0xdc, 0x40, 0xec, 0xcf, 0x09, 0xb4, 0x2b, 0x65, 0x28, 0xf6, 0xdb, -0x6d, 0x0a, 0x2a, 0xed, 0xc8, 0x51, 0x0b, 0x29, 0x5f, 0xc4, 0xf5, 0x26, 0xb0, 0x47, 0x43, 0xb0, -0x2d, 0x2a, 0x79, 0xe0, 0x1b, 0x10, 0x76, 0x3b, 0x33, 0x7a, 0x7a, 0xc1, 0x48, 0xce, 0x31, 0x7c, -0x82, 0x77, 0x1e, 0xc9, 0x6f, 0xc7, 0xa0, 0xa2, 0xc1, 0x80, 0xfb, 0xa0, 0x98, 0xf8, 0xc7, 0x44, -0x9a, 0x11, 0x12, 0xa8, 0x52, 0xa0, 0x59, 0xea, 0x0e, 0xdb, 0x60, 0x3e, 0x0b, 0x86, 0x34, 0xe1, -0x7d, 0xae, 0xcd, 0x37, 0xb1, 0x65, 0xbf, 0x1f, 0x20, 0xb1, 0x6a, 0x68, 0x06, 0x62, 0x1e, 0x2a, -0x02, 0x07, 0xc5, 0xa2, 0x8c, 0xc1, 0xcd, 0x3d, 0x8e, 0x1d, 0xd6, 0xc2, 0xe3, 0xb9, 0x21, 0x68, -0x7f, 0xe9, 0x34, 0x4b, 0xa3, 0xc2, 0xe3, 0xb3, 0x31, 0x8b, 0xa6, 0xb1, 0x2c, 0x71, 0x3c, 0x30, -0x16, 0x81, 0x8f, 0x4e, 0xc5, 0x48, 0x04, 0x83, 0x59, 0x1c, 0x41, 0xa4, 0xcb, 0xc8, 0x98, 0x7a, -0x23, 0x26, 0x08, 0x8d, 0x18, 0xd1, 0xaa, 0xed, 0x1c, 0xb6, 0xc3, 0x05, 0xda, 0x16, 0x38, 0x31, -0x30, 0xd6, 0x0f, 0x02, 0x39, 0xc7, 0x57, 0xd6, 0x9b, 0x7a, 0xac, 0x2f, 0xe7, 0x7d, 0x4c, 0x79, -0x45, 0x8b, 0xfd, 0x2a, 0x79, 0x66, 0x07, 0xe1, 0x94, 0x6c, 0x75, 0xb6, 0xb6, 0xe7, 0x97, 0x74, -0xe4, 0x2d, 0xd0, 0xeb, 0xf1, 0xe3, 0xa5, 0x09, 0x1c, 0x2e, 0xec, 0x20, 0x72, 0x5a, 0x83, 0x41, -0xfb, 0xcb, 0x1f, 0xee, 0xfd, 0xd9, 0xef, 0x7b, 0x5b, 0xc3, 0xd7, 0x39, 0x4a, 0xad, 0x87, 0xe1, -0x04, 0x87, 0xe0, 0xe8, 0x4a, 0x20, 0x1e, 0x70, 0xe9, 0x8e, 0x7a, 0x2d, 0x3b, 0x18, 0xb6, 0xbd, -0xd1, 0x90, 0x86, 0x23, 0xc5, 0xcb, 0x32, 0xe6, 0x5f, 0xd4, 0xb8, 0x65, 0xc4, 0x87, 0xed, 0x84, -0xfe, 0x45, 0x1d, 0x8b, 0x45, 0x17, 0xf1, 0x81, 0x3b, 0x27, 0x3b, 0x03, 0xbf, 0x0b, 0x13, 0x96, -0x22, 0xb3, 0x0d, 0xd7, 0x43, 0x2e, 0x45, 0xbb, 0xd7, 0x7f, 0xf1, 0x62, 0xeb, 0xc5, 0x2e, 0x90, -0x79, 0x7e, 0x45, 0x2e, 0xdf, 0x9d, 0xec, 0x93, 0xf8, 0x0e, 0xd9, 0xdf, 0x27, 0x89, 0xc9, 0x1a, -0xa5, 0xa2, 0xd6, 0x9f, 0x89, 0xf0, 0x16, 0x43, 0x00, 0xab, 0xac, 0xe4, 0xec, 0x88, 0x81, 0xef, -0x18, 0x33, 0xa4, 0x21, 0xf0, 0x45, 0x2b, 0x88, 0x06, 0x00, 0x68, 0x33, 0x5f, 0x30, 0x20, 0x68, -0xda, 0xf4, 0xed, 0xa6, 0xa0, 0xed, 0x9d, 0x56, 0xa7, 0xed, 0x30, 0xe6, 0x2c, 0x49, 0x94, 0x1c, -0x9f, 0x9e, 0x92, 0xd7, 0xbf, 0x37, 0x2f, 0x4e, 0x9b, 0x97, 0x27, 0x04, 0x86, 0x95, 0x90, 0xed, -0xa2, 0xee, 0x16, 0x46, 0x42, 0xf3, 0x2c, 0x8c, 0x69, 0x44, 0xd8, 0x3d, 0xfb, 0xe8, 0xdb, 0x8c, -0x1c, 0x11, 0x19, 0x8d, 0xd8, 0xc1, 0xd2, 0xf3, 0x11, 0x84, 0x60, 0x02, 0x22, 0xb1, 0xf1, 0x99, -0xbf, 0xfc, 0x70, 0x78, 0x3e, 0x7e, 0x07, 0xf1, 0x24, 0x00, 0x5f, 0xdf, 0xe4, 0x3c, 0xbd, 0x18, -0x0d, 0xe1, 0x51, 0x67, 0xf9, 0x89, 0x0c, 0x24, 0x45, 0xa8, 0x93, 0x28, 0xa2, 0xd3, 0xda, 0x6e, -0xbd, 0xd5, 0xe7, 0x9e, 0x87, 0x31, 0xc4, 0xf2, 0xc8, 0x4f, 0x93, 0xe8, 0xc4, 0xbe, 0x3b, 0x78, -0x32, 0xf7, 0xa4, 0x3f, 0xf2, 0x6d, 0x74, 0xd1, 0x24, 0xc4, 0x38, 0xf0, 0x17, 0xe6, 0xc3, 0x2e, -0x6b, 0xd7, 0x82, 0xde, 0xd7, 0x3a, 0xf9, 0x73, 0xc9, 0x7d, 0xf0, 0x7e, 0x0d, 0x59, 0x23, 0x47, -0x47, 0x09, 0xb3, 0xf5, 0xe5, 0x41, 0xf8, 0xa3, 0x90, 0x5d, 0x40, 0xa8, 0x82, 0x88, 0x0e, 0xcc, -0x43, 0xce, 0x2e, 0x3f, 0x19, 0x86, 0x3c, 0x3c, 0xc9, 0x05, 0xf8, 0x2c, 0x04, 0xcf, 0x81, 0x78, -0x30, 0x30, 0xe5, 0x8f, 0x86, 0xaf, 0xf9, 0xa0, 0x06, 0x6e, 0xac, 0xa1, 0xc4, 0xdf, 0x20, 0x0e, -0x13, 0x79, 0x9c, 0x45, 0x10, 0x28, 0x44, 0x3e, 0x19, 0x7a, 0x35, 0x0b, 0x74, 0xc0, 0x6a, 0x90, -0x3f, 0x95, 0x7d, 0xed, 0x13, 0x8c, 0x50, 0x9b, 0x7b, 0x04, 0x7f, 0x8b, 0x61, 0x73, 0x87, 0xd0, -0xa6, 0x6d, 0x3d, 0x34, 0xc8, 0x75, 0x2e, 0x4f, 0x39, 0xe0, 0x11, 0x04, 0xa7, 0x0f, 0x8d, 0xdc, -0xd1, 0x06, 0x08, 0x98, 0xca, 0x3c, 0x43, 0x16, 0x0e, 0xdd, 0x75, 0x16, 0xb0, 0x2f, 0x9a, 0xbb, -0x04, 0x7e, 0x0d, 0x9d, 0xe6, 0x0e, 0x62, 0xb8, 0x94, 0x11, 0x44, 0x3a, 0xb5, 0x0f, 0x54, 0xba, -0xad, 0x28, 0x18, 0xf9, 0x0e, 0xca, 0x81, 0xfc, 0x44, 0xba, 0x9d, 0x4e, 0x9d, 0xb4, 0xd5, 0x9f, -0x7a, 0x63, 0x9d, 0x59, 0xf6, 0xe2, 0x59, 0x5e, 0x90, 0xe1, 0x7d, 0xb3, 0x8b, 0x53, 0xa1, 0x6c, -0xeb, 0x46, 0x54, 0x37, 0xa6, 0x79, 0x36, 0x28, 0xaf, 0x75, 0xf8, 0xf8, 0x99, 0x84, 0x31, 0xfd, -0xa8, 0x15, 0x46, 0x0c, 0xf9, 0x4f, 0x96, 0xef, 0xde, 0x94, 0x57, 0xca, 0x0f, 0xdc, 0xd9, 0xa4, -0x52, 0xe2, 0x3f, 0xb0, 0x1e, 0xdb, 0x64, 0xd8, 0x6b, 0x6e, 0xfd, 0x8d, 0xd5, 0x73, 0xef, 0x9b, -0xaa, 0xe5, 0xcb, 0xff, 0x75, 0x75, 0xfc, 0xee, 0x9a, 0xa8, 0x36, 0x0f, 0x51, 0xcb, 0xd3, 0xbd, -0x7e, 0x10, 0xd5, 0x70, 0xd7, 0xe0, 0x6a, 0xdb, 0x81, 0x3f, 0x87, 0x64, 0x17, 0xfe, 0x3c, 0x7f, -0x9e, 0x37, 0x18, 0x7f, 0x14, 0xae, 0x6b, 0x7e, 0x03, 0xe3, 0x33, 0x4b, 0x9b, 0xde, 0xcd, 0xae, -0x6f, 0x9e, 0xb7, 0xaf, 0xa0, 0xfc, 0xb0, 0x26, 0x64, 0x28, 0xb5, 0xb6, 0xef, 0x9a, 0x64, 0xbd, -0x8e, 0xe6, 0xe6, 0xc0, 0x84, 0xcd, 0x2d, 0xcd, 0x59, 0xd3, 0x2d, 0xb3, 0xaa, 0xd5, 0xb4, 0xa7, -0x98, 0x56, 0xd4, 0xe6, 0x2d, 0xfc, 0x05, 0x96, 0xad, 0xb4, 0xda, 0xba, 0xfa, 0x78, 0x75, 0xf2, -0xde, 0xaa, 0x17, 0xe2, 0x2b, 0x30, 0x9d, 0x7a, 0x63, 0x3d, 0xce, 0x7b, 0x83, 0x72, 0x06, 0x9f, -0xcb, 0xfc, 0x0a, 0x38, 0xfc, 0x89, 0x37, 0x69, 0xad, 0x2a, 0x9d, 0x1b, 0x60, 0xf4, 0x0b, 0xe0, -0xb1, 0x4e, 0x4e, 0xc9, 0xa7, 0x60, 0x02, 0x39, 0x43, 0xbd, 0x51, 0x0d, 0x45, 0x57, 0xa1, 0x70, -0x11, 0xc7, 0xef, 0x9c, 0x79, 0x0e, 0x79, 0x43, 0xa7, 0x95, 0x91, 0x6c, 0x21, 0x92, 0xbb, 0x2c, -0x96, 0x2b, 0xbc, 0xbf, 0x42, 0xfa, 0x37, 0xf5, 0xca, 0x3a, 0xe2, 0x46, 0xd6, 0x43, 0xbd, 0xf1, -0x2d, 0x85, 0x8b, 0x9b, 0x8d, 0x66, 0x6a, 0x3b, 0x15, 0xee, 0x9b, 0x6a, 0xc2, 0x9d, 0xa1, 0xd8, -0x41, 0x14, 0xe0, 0x18, 0x10, 0xc9, 0x67, 0x46, 0x6d, 0x0c, 0xd1, 0x13, 0x54, 0x2b, 0x44, 0xf3, -0xa4, 0xe2, 0xa3, 0x9c, 0xdb, 0x4b, 0x7e, 0x2d, 0xd7, 0xad, 0xf1, 0xf1, 0x3b, 0x46, 0x9d, 0x82, -0x20, 0xb6, 0x43, 0x9e, 0x1e, 0x11, 0x78, 0xdc, 0x12, 0x92, 0xca, 0x11, 0xee, 0xbd, 0xa4, 0xdd, -0x26, 0x81, 0xef, 0x4d, 0x09, 0x75, 0x9c, 0xd8, 0x2d, 0xc2, 0x40, 0xc2, 0x7d, 0xc8, 0x96, 0x21, -0x6f, 0x25, 0x5c, 0xe0, 0x63, 0xee, 0xb3, 0x02, 0xdf, 0xd7, 0xb9, 0x21, 0xcf, 0x35, 0x5a, 0xdb, -0x85, 0x0b, 0x50, 0xa1, 0x03, 0x44, 0xfb, 0xe9, 0xf6, 0xe4, 0xb4, 0x00, 0x6a, 0x7b, 0x01, 0xea, -0x65, 0x02, 0xf5, 0xa6, 0x08, 0x6a, 0x67, 0x01, 0xaa, 0xdb, 0xd1, 0x60, 0xff, 0xca, 0x9b, 0x6c, -0x39, 0x96, 0x4e, 0x0c, 0x65, 0x1e, 0xc9, 0x0b, 0x8d, 0x43, 0xa9, 0x3b, 0xd8, 0x8c, 0x01, 0x6a, -0x6b, 0x01, 0x6a, 0x2f, 0x03, 0xa5, 0x6c, 0x64, 0xd9, 0x97, 0xab, 0xf4, 0x03, 0x36, 0x06, 0xdc, -0xf4, 0x6a, 0xd6, 0x33, 0xbf, 0x27, 0xc2, 0x83, 0x67, 0x0e, 0x1b, 0x1c, 0x9c, 0x5a, 0x39, 0xa1, -0x3f, 0x8e, 0xb6, 0x3d, 0x97, 0x00, 0x00, 0xac, 0xd4, 0xd1, 0xfc, 0x4a, 0xbd, 0x22, 0x16, 0x1f, -0x37, 0xdd, 0x26, 0x64, 0xec, 0x16, 0xd9, 0xd7, 0x17, 0x96, 0x09, 0x47, 0x6f, 0x50, 0x80, 0xa3, -0x37, 0xc8, 0x22, 0x01, 0x27, 0x97, 0x8f, 0x25, 0x9c, 0x44, 0xef, 0x39, 0x64, 0xc1, 0x80, 0xc9, -0xf2, 0xdb, 0xd4, 0x3a, 0x78, 0x92, 0xa7, 0x51, 0x7b, 0xbb, 0xbb, 0xdb, 0xbb, 0x89, 0x56, 0x85, -0x68, 0x0e, 0xb7, 0x1e, 0x42, 0xdd, 0x42, 0x16, 0xeb, 0x98, 0xb6, 0xcc, 0x0c, 0xea, 0x3c, 0x30, -0xf2, 0x9c, 0xc4, 0xb2, 0xfa, 0xc1, 0xca, 0xcf, 0xa1, 0xb2, 0xaa, 0x3c, 0xa4, 0xf7, 0xb7, 0x80, -0xd0, 0x6c, 0x65, 0xe9, 0x6c, 0xb0, 0x7a, 0x68, 0xbd, 0x80, 0x3e, 0xb3, 0x51, 0x67, 0x50, 0xc0, -0x5e, 0x9d, 0x4b, 0x8e, 0x8e, 0xcd, 0x90, 0xaa, 0x2f, 0xd6, 0x66, 0xb6, 0xf0, 0xad, 0xef, 0xb0, -0x7b, 0x23, 0x9f, 0xa0, 0x4d, 0x0f, 0xdf, 0xce, 0xc5, 0x96, 0xdc, 0xbe, 0xb3, 0x51, 0x1f, 0x49, -0x29, 0x0c, 0xb8, 0x8f, 0x75, 0xb1, 0x46, 0x52, 0xe4, 0xdf, 0x4f, 0xdd, 0x58, 0xcd, 0xa4, 0x36, -0x8b, 0x3f, 0x03, 0x26, 0x4f, 0xbe, 0xd2, 0xfb, 0x9a, 0xaa, 0xea, 0xb6, 0x13, 0x97, 0xd5, 0x86, -0x3f, 0x02, 0xd0, 0xb4, 0x51, 0x00, 0xb8, 0x9e, 0xdc, 0x69, 0xe8, 0x1c, 0xfa, 0x7c, 0xfc, 0x9b, -0x7e, 0x64, 0xc8, 0xcc, 0xe7, 0x56, 0x15, 0x08, 0x47, 0x60, 0x3c, 0x4d, 0xa9, 0xd7, 0xd7, 0x0e, -0x65, 0x30, 0x6b, 0x36, 0xb0, 0xa8, 0x14, 0xec, 0x43, 0xe0, 0x50, 0x4f, 0x39, 0xec, 0x87, 0x52, -0x22, 0x37, 0x45, 0xd1, 0x4e, 0xd3, 0x0f, 0x7c, 0x46, 0x1c, 0x4c, 0x8b, 0x7a, 0x5e, 0x60, 0xdf, -0x91, 0x44, 0xc0, 0x18, 0x3f, 0x9d, 0x64, 0x76, 0x2b, 0x72, 0x1a, 0xf8, 0x32, 0x0a, 0xbc, 0x7d, -0xa5, 0x20, 0x89, 0x6d, 0x94, 0xe0, 0xd0, 0x3c, 0xb5, 0x9e, 0x50, 0xcd, 0xad, 0xa8, 0x98, 0x9b, -0xfa, 0xd3, 0xe9, 0xc2, 0x4c, 0x2b, 0x27, 0xba, 0x79, 0x9c, 0xb8, 0xff, 0x02, 0x8d, 0xa3, 0x1e, -0x8d, 0x86, 0x79, 0xfa, 0x76, 0x82, 0x0f, 0x4a, 0x6a, 0x5b, 0xcd, 0x52, 0xa3, 0x85, 0x16, 0x17, -0x22, 0x52, 0x68, 0x6f, 0x6d, 0x5f, 0xd6, 0x1f, 0xa5, 0x81, 0xd1, 0x92, 0x45, 0xc6, 0x99, 0xe8, -0x6c, 0x2b, 0xdb, 0xbd, 0x41, 0xf7, 0x26, 0x5b, 0xdc, 0xf7, 0x59, 0x74, 0xc5, 0xee, 0xe5, 0xda, -0x21, 0x4d, 0xf5, 0x58, 0x5b, 0xfb, 0xa9, 0xde, 0x60, 0xfd, 0x50, 0xbb, 0x74, 0xa4, 0x9d, 0x0d, -0x51, 0x1e, 0x11, 0x6d, 0x67, 0x03, 0x87, 0x47, 0x45, 0xdc, 0xd9, 0x58, 0xe2, 0xef, 0x1e, 0x75, -0x27, 0xdb, 0x56, 0xe9, 0xc8, 0x3b, 0x13, 0xa3, 0x75, 0x53, 0x69, 0x7f, 0xa0, 0xf7, 0xe4, 0xa4, -0x7a, 0x08, 0x9e, 0x8d, 0x12, 0x1f, 0x11, 0xc9, 0xcf, 0xd0, 0xa8, 0x6c, 0xeb, 0xb7, 0x78, 0xfd, -0x7f, 0x0b, 0x3c, 0x49, 0x07, 0x6c, 0x2d, 0x44, 0x8a, 0xb5, 0x93, 0x18, 0xd1, 0xe9, 0x28, 0x8a, -0xf0, 0x94, 0x6a, 0x1d, 0x44, 0x2a, 0x45, 0x79, 0xf7, 0x07, 0x62, 0x7a, 0x1b, 0xb1, 0xff, 0x8c, -0x98, 0x6f, 0x4f, 0xd7, 0x42, 0xf4, 0x33, 0x22, 0xfa, 0x01, 0xf1, 0x9c, 0xf5, 0xfb, 0xdc, 0xe6, -0x6b, 0x23, 0xea, 0x76, 0x0a, 0x52, 0x9e, 0x35, 0xf0, 0xa9, 0x0c, 0x0a, 0x71, 0xe9, 0x7d, 0xe8, -0x2d, 0x20, 0x0c, 0xfe, 0x9a, 0xe4, 0xc9, 0x58, 0x9e, 0x3c, 0x75, 0x1f, 0x5d, 0x9d, 0xec, 0x6e, -0x25, 0xe5, 0xc9, 0xbd, 0xa4, 0x3c, 0x09, 0xb7, 0xfe, 0xee, 0xf5, 0xc9, 0xa4, 0xb0, 0xfd, 0xed, -0xeb, 0x94, 0x5b, 0xff, 0xaf, 0x53, 0x96, 0xaf, 0x53, 0xda, 0x6e, 0x4d, 0xe7, 0x6e, 0x0d, 0xd5, -0xd6, 0xd3, 0xc0, 0x73, 0xe9, 0x5c, 0x9d, 0x5c, 0x4a, 0x1d, 0x4d, 0x69, 0xa3, 0xed, 0x96, 0x4b, -0x1b, 0x8d, 0x29, 0x23, 0x20, 0xc8, 0x4d, 0x19, 0xcb, 0xd4, 0xec, 0x75, 0xa9, 0x5e, 0x56, 0x34, -0x05, 0x0c, 0x12, 0x20, 0xb0, 0x9b, 0x25, 0x34, 0x4a, 0x16, 0xe5, 0x55, 0xa4, 0x74, 0x90, 0xb1, -0x6e, 0x2e, 0x94, 0x3a, 0x0e, 0xa1, 0xe2, 0x0a, 0x75, 0xdc, 0xa9, 0x23, 0x8c, 0xb2, 0x7b, 0x54, -0x06, 0xc3, 0xde, 0x3c, 0x06, 0xdc, 0x30, 0xab, 0xa2, 0xd8, 0x4d, 0x51, 0xe0, 0x7f, 0xd6, 0x79, -0x14, 0x51, 0x87, 0xab, 0x7e, 0x94, 0x0a, 0x48, 0xb6, 0x53, 0x24, 0x6a, 0x67, 0x2a, 0x1d, 0xde, -0x64, 0x50, 0xec, 0xa4, 0x28, 0x76, 0x6e, 0x16, 0xe3, 0x9a, 0xd2, 0x48, 0x3a, 0x29, 0x92, 0x4e, -0x2c, 0xd1, 0x92, 0xdb, 0x75, 0x06, 0x47, 0x37, 0xc5, 0xd1, 0x8d, 0x71, 0xa4, 0x3b, 0xf5, 0x06, -0xb6, 0x97, 0xd2, 0x87, 0x0e, 0xe2, 0xdc, 0xef, 0x07, 0xa6, 0xea, 0x1c, 0x5a, 0x20, 0x70, 0x85, -0x43, 0xb0, 0xe2, 0xf2, 0x9e, 0x0a, 0x09, 0x36, 0x65, 0x33, 0xd8, 0x73, 0x1d, 0xe2, 0x50, 0x49, -0x89, 0x8a, 0x0a, 0x84, 0x84, 0x4b, 0x2a, 0x41, 0x35, 0x0f, 0xf2, 0xca, 0x31, 0xb8, 0xdb, 0x4a, -0x71, 0x0b, 0xda, 0x2b, 0x6f, 0xc5, 0xc8, 0xb6, 0x99, 0x10, 0xe4, 0x98, 0x74, 0x4c, 0xf9, 0x0d, -0x4e, 0x8a, 0xdd, 0x2d, 0x30, 0xa3, 0xcf, 0x26, 0xb0, 0xbc, 0x92, 0xe5, 0xa2, 0x50, 0xce, 0xbf, -0x63, 0x48, 0x64, 0x12, 0xaa, 0x9f, 0x1f, 0x11, 0x19, 0x9c, 0x8b, 0x00, 0xb1, 0xc0, 0x1e, 0x52, -0x43, 0xc4, 0xa5, 0x0e, 0xb8, 0x99, 0x27, 0xd8, 0x2a, 0xcc, 0x96, 0x1f, 0x48, 0x17, 0xb6, 0xa5, -0x54, 0x26, 0x86, 0x7a, 0x14, 0x52, 0x1f, 0x09, 0xc1, 0x81, 0x6b, 0xd8, 0x77, 0x5f, 0x98, 0x18, -0x8f, 0x47, 0x0e, 0xf0, 0xd8, 0x5f, 0x59, 0x06, 0x39, 0x24, 0x5b, 0x66, 0x65, 0xc8, 0x12, 0x42, -0x6a, 0x9f, 0x2f, 0x2f, 0xcf, 0x75, 0x96, 0x56, 0x9b, 0xcd, 0x07, 0x3e, 0xb3, 0xb9, 0xb7, 0xa3, -0x1c, 0xe6, 0xf1, 0x91, 0xf2, 0x94, 0x87, 0x96, 0xaa, 0x19, 0xe1, 0x6d, 0xe7, 0xf5, 0xb0, 0x6e, -0x28, 0x65, 0x19, 0x99, 0x2f, 0x9a, 0x37, 0x9d, 0x15, 0xf0, 0x1b, 0x70, 0x57, 0x2a, 0x4b, 0xc5, -0x07, 0x4a, 0x95, 0xc2, 0x13, 0x12, 0x36, 0xbb, 0xa0, 0xd3, 0x4d, 0x37, 0xd9, 0xd5, 0xd7, 0x08, -0x56, 0x2c, 0x83, 0x01, 0x56, 0xda, 0xff, 0x89, 0x3a, 0xb1, 0x11, 0xb0, 0x2d, 0x55, 0xa1, 0x64, -0xb1, 0x2e, 0x40, 0x92, 0xd2, 0xd5, 0x5a, 0x05, 0x02, 0x43, 0x61, 0x00, 0x1d, 0x6f, 0x80, 0x5b, -0x69, 0x5e, 0x71, 0xe0, 0x33, 0x3e, 0xbc, 0x84, 0x87, 0xa2, 0xa0, 0x42, 0x80, 0x95, 0x81, 0x58, -0x0b, 0x36, 0x1d, 0x5c, 0xc4, 0x64, 0x98, 0x1c, 0x12, 0xb6, 0xde, 0x3c, 0x7f, 0x7e, 0x90, 0x5f, -0xd4, 0xb6, 0x5d, 0x3f, 0xa7, 0x63, 0x67, 0xf1, 0xfc, 0xb4, 0xab, 0xcf, 0x4f, 0x75, 0x0a, 0xd0, -0xf2, 0x98, 0x3f, 0x90, 0x6e, 0xe1, 0x59, 0x2a, 0x02, 0xe2, 0xe6, 0x4e, 0x92, 0x3a, 0xfb, 0x2d, -0x5e, 0x5d, 0xf3, 0x1b, 0x63, 0x19, 0x18, 0x9f, 0xc7, 0x98, 0xd1, 0x04, 0x3b, 0x66, 0x1b, 0x8e, -0xf1, 0x5a, 0xa7, 0xef, 0x4e, 0x2e, 0x2e, 0xce, 0xde, 0x2b, 0x3b, 0xe2, 0x07, 0x45, 0xde, 0x01, -0xa6, 0x8f, 0x2b, 0xc3, 0x78, 0x90, 0xab, 0xdc, 0x68, 0xbb, 0x4d, 0x84, 0x0b, 0x2a, 0x67, 0xbb, -0xd4, 0xf7, 0x99, 0xa7, 0x8f, 0x4e, 0x78, 0x9f, 0xc0, 0x38, 0x32, 0x0c, 0x1c, 0xac, 0x72, 0x19, -0x09, 0x00, 0x99, 0xb5, 0xc2, 0x91, 0x70, 0x6b, 0x10, 0xd5, 0xcd, 0xaa, 0xf2, 0x49, 0x64, 0x17, -0xe7, 0x49, 0x1c, 0x82, 0xdf, 0x32, 0x3e, 0x33, 0x6e, 0x9b, 0xd2, 0x08, 0x57, 0x19, 0x4b, 0x61, -0x04, 0x93, 0x39, 0x34, 0x6a, 0x54, 0x0c, 0x8d, 0xd2, 0xb4, 0x06, 0x58, 0x2b, 0x00, 0xce, 0x6c, -0x7c, 0x15, 0x52, 0xb6, 0x7c, 0xc5, 0xc3, 0x6d, 0x29, 0xb7, 0xd1, 0x6c, 0x51, 0xf7, 0xb4, 0xb1, -0xc1, 0x1a, 0xc7, 0x4a, 0x88, 0xdd, 0x67, 0x65, 0x54, 0x10, 0xd6, 0xbe, 0xc6, 0xf1, 0x6c, 0x21, -0x03, 0x50, 0x27, 0xcf, 0x9e, 0xa9, 0x6b, 0x5c, 0x9e, 0x02, 0x4f, 0x10, 0x13, 0xd7, 0x87, 0x98, -0x83, 0x99, 0x4d, 0xda, 0xe0, 0x2b, 0xb8, 0xa3, 0x9c, 0x04, 0x4f, 0xfd, 0x43, 0x81, 0x57, 0xe8, -0x45, 0x8c, 0xde, 0xe5, 0x3f, 0x7e, 0x28, 0xa1, 0x3c, 0xc0, 0x23, 0x92, 0x5a, 0x20, 0x02, 0xd5, -0x77, 0x77, 0x4c, 0xba, 0x66, 0x73, 0x4a, 0x14, 0x70, 0xe4, 0x0b, 0x97, 0xf7, 0x65, 0x2d, 0x69, -0xa9, 0x30, 0x50, 0xed, 0xc4, 0x6d, 0xd1, 0xb0, 0xe5, 0xca, 0x33, 0x8f, 0xe1, 0xbf, 0xaf, 0xa7, -0xe7, 0x4e, 0x4d, 0xb7, 0xed, 0xd6, 0x5b, 0x11, 0x0b, 0x3d, 0x6a, 0xb3, 0x53, 0x97, 0x7b, 0x0e, -0x44, 0x66, 0xb5, 0x56, 0xab, 0x15, 0xcf, 0xb0, 0xd2, 0x1c, 0x56, 0xf8, 0x37, 0x55, 0x55, 0x2d, -0x8a, 0xba, 0xdc, 0xfc, 0xf6, 0xc3, 0xe4, 0x71, 0xd0, 0xef, 0x8b, 0x6c, 0x7c, 0x54, 0x47, 0x16, -0xae, 0xf8, 0x90, 0xfd, 0x11, 0xf8, 0xec, 0x23, 0x3c, 0x64, 0x12, 0xb6, 0x87, 0x9f, 0x60, 0x9b, -0xcf, 0xe9, 0xef, 0x70, 0x4b, 0xdb, 0x68, 0xe9, 0x8c, 0xc3, 0xbc, 0x9b, 0xaa, 0xb4, 0x55, 0x46, -0x81, 0x3f, 0x88, 0x8d, 0xde, 0x3a, 0x1b, 0xab, 0x20, 0xb7, 0xde, 0xd8, 0x08, 0xb6, 0xf3, 0x37, -0x1b, 0x43, 0x05, 0xdb, 0x5e, 0xb4, 0x39, 0xc2, 0xce, 0x7c, 0x07, 0x70, 0x55, 0xf1, 0x2d, 0x79, -0x9e, 0x83, 0xc2, 0x52, 0xcf, 0xea, 0xee, 0x05, 0xc6, 0x41, 0x5b, 0x76, 0xe0, 0x30, 0xf4, 0x11, -0x9d, 0x22, 0x6f, 0xb0, 0x62, 0xed, 0xbf, 0xe5, 0x09, 0x9c, 0x6c, 0x6e, 0x67, 0x2a, 0x39, 0x14, -0xb6, 0x9a, 0xe8, 0x11, 0x47, 0x08, 0x4b, 0xe8, 0x90, 0xfd, 0xcd, 0xe1, 0x53, 0x49, 0x03, 0x1a, -0x14, 0x26, 0x0d, 0xa9, 0x99, 0x29, 0xaa, 0x41, 0x49, 0x30, 0x6e, 0x02, 0x23, 0xab, 0x27, 0x39, -0x48, 0xfd, 0x3b, 0x4c, 0xcc, 0x7c, 0x27, 0x67, 0xda, 0xb5, 0x8f, 0x44, 0xd6, 0x77, 0xd4, 0x43, -0x75, 0x3c, 0x18, 0x1f, 0x0c, 0xa1, 0x7a, 0xa6, 0x7d, 0x19, 0x69, 0x3c, 0x39, 0xbe, 0xd5, 0xf1, -0xc3, 0xfc, 0x76, 0x8f, 0xba, 0x57, 0xaf, 0x16, 0x07, 0xc6, 0x67, 0xa3, 0x45, 0x9e, 0x12, 0xc8, -0x61, 0xde, 0x32, 0x37, 0x62, 0xc2, 0x65, 0x1c, 0xd3, 0xcc, 0x12, 0x2a, 0x93, 0x65, 0xd8, 0x54, -0x30, 0xd2, 0xd9, 0xd7, 0xb8, 0x30, 0x1e, 0xfb, 0x70, 0xde, 0xb4, 0x0e, 0x8a, 0x76, 0x34, 0x05, -0xd1, 0xcd, 0x40, 0xbc, 0xfb, 0x50, 0x06, 0x62, 0x6b, 0x0e, 0xe2, 0xb2, 0x0c, 0xc8, 0xf6, 0x1c, -0xc8, 0xd5, 0x0a, 0x10, 0x87, 0xf5, 0xe9, 0xc8, 0x93, 0x19, 0x98, 0x57, 0xaf, 0x5e, 0x15, 0xc0, -0xe4, 0x2e, 0x2f, 0x00, 0x42, 0x72, 0x97, 0x39, 0x90, 0x4b, 0xda, 0x19, 0x54, 0xea, 0x58, 0xbb, -0x54, 0xef, 0x7e, 0xcd, 0x92, 0x3e, 0xfd, 0x2e, 0x18, 0x3e, 0xc3, 0x9c, 0xef, 0x49, 0xd1, 0x7e, -0x86, 0x0a, 0x21, 0xd5, 0xeb, 0x7e, 0x19, 0x2b, 0xd0, 0x37, 0x0a, 0x33, 0x3d, 0x89, 0x2f, 0xff, -0xad, 0x8c, 0x1a, 0xc1, 0x62, 0xac, 0x0f, 0x48, 0x3e, 0x8c, 0x54, 0x6c, 0x14, 0xc5, 0x7f, 0x30, -0xf6, 0x2d, 0x8f, 0x86, 0x13, 0x7c, 0x9d, 0x26, 0x56, 0x33, 0xd2, 0x26, 0xaf, 0x47, 0xb0, 0xd7, -0x5b, 0x73, 0xa7, 0x91, 0xfd, 0xc9, 0x2d, 0xe8, 0x77, 0xcc, 0x7b, 0x0f, 0x9f, 0x6b, 0xd6, 0xe7, -0x87, 0xa8, 0xc2, 0x82, 0x1a, 0xb3, 0xfc, 0x4c, 0x82, 0x39, 0xd7, 0xb5, 0x7c, 0x56, 0x50, 0xf4, -0x8e, 0x46, 0x8e, 0x81, 0x22, 0x85, 0xcc, 0x55, 0xb4, 0xb4, 0xb1, 0xdc, 0xdd, 0x92, 0xc1, 0x5b, -0x7e, 0xcf, 0x9c, 0xda, 0x56, 0x21, 0x69, 0x61, 0x14, 0x38, 0xb7, 0xf6, 0x44, 0x8d, 0x69, 0xe7, -0x3d, 0x9b, 0x32, 0x1a, 0x55, 0x24, 0x0e, 0xe2, 0xb0, 0x9e, 0x3e, 0xb4, 0x46, 0x24, 0xe0, 0x0f, -0x6f, 0xfd, 0xd1, 0x10, 0xe8, 0x89, 0x51, 0x77, 0xf7, 0xea, 0x2b, 0x30, 0xbd, 0x0e, 0x02, 0xe9, -0x05, 0xd4, 0x01, 0x9f, 0x11, 0x33, 0x9a, 0x30, 0xd8, 0x83, 0x27, 0x79, 0x2c, 0xae, 0x5d, 0xf8, -0xca, 0x78, 0x2c, 0x55, 0xb5, 0x80, 0x4d, 0x75, 0xd9, 0x61, 0x6d, 0xc8, 0x5b, 0xcd, 0x92, 0xe7, -0x12, 0xa1, 0xdd, 0xb7, 0x37, 0x85, 0xab, 0x7f, 0x13, 0x3b, 0x18, 0x41, 0xac, 0xa5, 0x17, 0x4a, -0xde, 0xab, 0x63, 0xfb, 0xe2, 0x95, 0xf9, 0xfc, 0x6f, 0x12, 0xd7, 0xd7, 0x62, 0xa8, 0xe8, 0x3e, -0x29, 0xb8, 0xad, 0x86, 0xec, 0x53, 0xee, 0xcd, 0xc0, 0xf0, 0x6a, 0x35, 0x8c, 0x1f, 0x10, 0xea, -0x8b, 0x49, 0xaa, 0x4e, 0x31, 0xe0, 0xad, 0xbe, 0x59, 0x62, 0xce, 0x88, 0x0e, 0x30, 0x70, 0x4f, -0xe8, 0x85, 0xeb, 0x21, 0x2b, 0xc1, 0x28, 0x08, 0x27, 0x62, 0x32, 0x82, 0x69, 0xf0, 0xa5, 0xaa, -0x64, 0xf2, 0xd9, 0x9d, 0x4d, 0x28, 0x9c, 0xd2, 0x07, 0x75, 0x6a, 0xc1, 0x85, 0xe4, 0xb6, 0xf8, -0x36, 0xca, 0xb7, 0xd0, 0xb3, 0x63, 0xd0, 0xba, 0x20, 0xc4, 0x2c, 0xf0, 0xfa, 0xda, 0x0a, 0x6d, -0x54, 0x08, 0xeb, 0x07, 0xeb, 0x06, 0xf4, 0xc7, 0x9a, 0x50, 0xa9, 0x2e, 0xbf, 0x58, 0x37, 0x86, -0x54, 0x23, 0xa3, 0xae, 0xab, 0x32, 0x77, 0x73, 0x42, 0xbe, 0xbd, 0x4e, 0xfa, 0x90, 0x39, 0xb6, -0xdc, 0x25, 0xc3, 0xa9, 0xce, 0xea, 0x2d, 0xdd, 0x36, 0xf7, 0x1b, 0xbe, 0x0b, 0x69, 0x55, 0x0e, -0xd5, 0x9b, 0x2f, 0x53, 0x8c, 0x49, 0xd4, 0xce, 0xfd, 0x70, 0x84, 0x22, 0xf8, 0x13, 0xd7, 0x01, -0x46, 0x29, 0x71, 0xc2, 0x35, 0xbe, 0x68, 0x06, 0x97, 0xbe, 0xf6, 0x75, 0xba, 0x2e, 0x58, 0x7d, -0xbe, 0x9d, 0x64, 0x3e, 0x45, 0xbc, 0x60, 0x68, 0xc0, 0xf8, 0xe2, 0x5d, 0x03, 0x17, 0x04, 0x70, -0xe2, 0x6a, 0x18, 0x9d, 0x5b, 0xe3, 0xbb, 0x48, 0x79, 0x5e, 0x24, 0xd6, 0x3f, 0x19, 0x0b, 0xb5, -0x4e, 0x91, 0x60, 0xcc, 0x32, 0xfa, 0x1a, 0x31, 0xa1, 0x13, 0xa4, 0xf5, 0x85, 0xf0, 0x62, 0x49, -0xe8, 0xb1, 0x94, 0x6d, 0x97, 0xd9, 0x77, 0xbd, 0xe0, 0xde, 0xd2, 0x95, 0x27, 0xb8, 0x73, 0x07, -0x64, 0x58, 0x0f, 0x1b, 0x12, 0xcd, 0x54, 0x89, 0xa6, 0x22, 0xd9, 0xd8, 0xa5, 0x64, 0xa2, 0xb7, -0x37, 0x92, 0x52, 0x6d, 0x5a, 0xea, 0x9d, 0x5c, 0xb8, 0x71, 0x12, 0x86, 0x1e, 0x7a, 0xe5, 0x04, -0xbe, 0x27, 0xfd, 0xb5, 0x6a, 0xb6, 0xf8, 0x89, 0x84, 0xa9, 0x52, 0xf1, 0x9a, 0x2e, 0x16, 0xad, -0x28, 0xc3, 0xfa, 0x23, 0xcf, 0xab, 0x6f, 0xa2, 0x5e, 0x0d, 0x32, 0xda, 0xd9, 0x9c, 0x91, 0xc6, -0xfd, 0x7c, 0xd5, 0x75, 0x25, 0xd5, 0x94, 0x44, 0xfa, 0xab, 0x5b, 0x07, 0x56, 0xae, 0x4d, 0xa2, -0xb8, 0x8f, 0x5f, 0x9d, 0x74, 0x85, 0x4e, 0x65, 0xe4, 0xd5, 0x92, 0xd2, 0x79, 0x3a, 0xc1, 0x8a, -0xa6, 0xba, 0x74, 0xbd, 0x1a, 0x8f, 0xe7, 0x49, 0x1d, 0x9a, 0x40, 0x32, 0x38, 0xcf, 0x94, 0x7e, -0xe7, 0x6a, 0x83, 0x9c, 0xa9, 0xb6, 0x63, 0x40, 0xd8, 0xf9, 0xee, 0xac, 0xf9, 0xdf, 0x6e, 0xb9, -0x12, 0xa6, 0xba, 0x65, 0x99, 0xaa, 0x7e, 0x1e, 0x5b, 0xcd, 0xf4, 0xa4, 0xee, 0x80, 0xdc, 0x8c, -0xe9, 0x7d, 0x66, 0x02, 0x12, 0xc0, 0x35, 0xbc, 0xb4, 0xb2, 0xba, 0x04, 0x4d, 0xb6, 0xdb, 0x24, -0xf6, 0xc8, 0x90, 0x00, 0x82, 0xa2, 0xab, 0x39, 0x9a, 0xd6, 0x46, 0x02, 0xf2, 0xbc, 0x16, 0xe0, -0xa2, 0x18, 0xc9, 0x5d, 0xae, 0xbc, 0x9a, 0x82, 0xa2, 0x8c, 0x1f, 0xe5, 0x8e, 0xb1, 0x39, 0x65, -0xe8, 0x60, 0x86, 0xac, 0xbb, 0xea, 0xf3, 0xcf, 0xae, 0x9f, 0xe6, 0xd4, 0x88, 0xc5, 0xeb, 0xe9, -0x05, 0xd0, 0x53, 0xd3, 0x7b, 0x54, 0xfd, 0xba, 0x73, 0xd3, 0x52, 0xfb, 0x17, 0x73, 0xf2, 0x85, -0x82, 0xd3, 0xe8, 0xd3, 0x62, 0x3f, 0x67, 0x92, 0xe4, 0x69, 0x88, 0x89, 0x90, 0xc0, 0x0f, 0x4a, -0x18, 0x48, 0x29, 0xa2, 0x44, 0xc5, 0x14, 0x8a, 0x12, 0x65, 0x45, 0x78, 0xea, 0xa4, 0x43, 0x8b, -0x42, 0x82, 0x22, 0xe6, 0xa9, 0xb7, 0xfa, 0x73, 0xe6, 0x33, 0x9e, 0x00, 0x27, 0xb0, 0xb4, 0x27, -0x02, 0x6f, 0x24, 0x99, 0x65, 0x38, 0x8c, 0x1b, 0xab, 0x17, 0xe1, 0x8b, 0x68, 0xd6, 0x81, 0xd6, -0x8c, 0xe8, 0x5c, 0xa6, 0xb9, 0xb8, 0xa0, 0x17, 0xd8, 0x30, 0x61, 0x50, 0x38, 0x3d, 0x8d, 0x7a, -0x8d, 0x31, 0x3f, 0xec, 0xed, 0x7d, 0x8d, 0xeb, 0xe4, 0x1f, 0x7b, 0x5f, 0x99, 0x2d, 0x6b, 0x39, -0xda, 0x18, 0x9f, 0xca, 0x1c, 0x11, 0xee, 0xe4, 0x3f, 0xd4, 0x7a, 0x02, 0xbf, 0xf3, 0x1f, 0x6b, -0x1a, 0xe0, 0xf7, 0xf2, 0xe3, 0xf9, 0x63, 0x15, 0x1b, 0xdc, 0x10, 0xba, 0x35, 0xf8, 0x73, 0xda, -0xc3, 0x9e, 0xc3, 0x8f, 0x97, 0x57, 0x70, 0xfd, 0x8f, 0xcb, 0x8f, 0x17, 0x58, 0x0d, 0x85, 0xdc, -0x99, 0xf7, 0xa7, 0x2a, 0x88, 0xaf, 0xa2, 0xe5, 0xca, 0xb9, 0xa1, 0x63, 0x03, 0x02, 0x95, 0x17, -0x3d, 0xea, 0x18, 0x93, 0x80, 0xf2, 0xd2, 0xf8, 0xde, 0xe2, 0xd8, 0xda, 0x84, 0x3c, 0x34, 0xaa, -0xa2, 0x34, 0x88, 0xad, 0x50, 0xca, 0xd8, 0xc9, 0xa1, 0x56, 0x1a, 0x7b, 0x59, 0x92, 0x7c, 0xd8, -0xb0, 0xfb, 0x30, 0xdd, 0xb1, 0xfe, 0xee, 0xea, 0xc3, 0x7b, 0xa2, 0x8c, 0x2c, 0xee, 0x97, 0xc1, -0x6f, 0x67, 0x50, 0x1f, 0x96, 0x68, 0x42, 0x39, 0x7e, 0xf5, 0x68, 0xde, 0xd3, 0x51, 0xfb, 0xce, -0x0f, 0x26, 0x1e, 0x73, 0x06, 0x8c, 0xb4, 0x5a, 0x2d, 0x43, 0x63, 0x46, 0xfc, 0xd9, 0x08, 0xc0, -0x3b, 0xe1, 0xbe, 0x13, 0x4c, 0x5a, 0x82, 0xc9, 0x73, 0xec, 0x14, 0x18, 0xa3, 0x3f, 0x4d, 0xc4, -0xfb, 0xe3, 0xfc, 0x21, 0x1e, 0xf0, 0x04, 0xd8, 0x33, 0xa7, 0xfd, 0x58, 0xed, 0xf9, 0xb1, 0x11, -0x7f, 0x44, 0x46, 0x63, 0xac, 0xe3, 0x7e, 0x98, 0xdf, 0x4e, 0x53, 0xa1, 0x37, 0x66, 0x81, 0xf5, -0xb3, 0x28, 0x0a, 0xa2, 0xb4, 0x4e, 0x78, 0x6d, 0x31, 0xbc, 0xb6, 0x6e, 0xaa, 0xac, 0xe5, 0xd6, -0xf7, 0x5a, 0xcc, 0x32, 0xfc, 0xc4, 0x2b, 0x98, 0x6d, 0xf7, 0xf9, 0x4b, 0x44, 0x93, 0x5d, 0xb8, -0x82, 0x17, 0x2b, 0x9f, 0xaa, 0x73, 0x23, 0x58, 0xdb, 0x5c, 0x82, 0x74, 0xe3, 0xcd, 0xc1, 0xe6, -0x05, 0x6b, 0x7b, 0x8c, 0x46, 0xa9, 0x52, 0xc6, 0x1a, 0x5b, 0xcf, 0x5d, 0x00, 0x8c, 0xae, 0xd4, -0xf7, 0x4b, 0xaa, 0x91, 0xb8, 0x20, 0xcb, 0x3c, 0x1b, 0x72, 0x48, 0xdc, 0x1a, 0xae, 0x82, 0x3d, -0xf5, 0x6d, 0xb9, 0x48, 0x65, 0x17, 0x6a, 0x05, 0xad, 0x0a, 0x65, 0xbd, 0x02, 0x01, 0x2b, 0xf2, -0xf5, 0x1b, 0x7f, 0xc6, 0xb7, 0x0a, 0x17, 0x3e, 0xe4, 0x72, 0x6d, 0x0d, 0xf4, 0x85, 0x75, 0x63, -0x88, 0x3e, 0x55, 0x4f, 0x20, 0xb0, 0xa5, 0x3d, 0x74, 0x0b, 0xe2, 0x33, 0x3e, 0xf0, 0x6b, 0x7f, -0xea, 0x57, 0xbf, 0xae, 0xad, 0xbe, 0xe7, 0xdc, 0xaa, 0x21, 0x46, 0x04, 0xd8, 0x13, 0x30, 0x83, -0xd7, 0x1f, 0x8d, 0xaa, 0x19, 0xb0, 0x41, 0x14, 0x78, 0x63, 0x3a, 0x1d, 0x37, 0x7f, 0x04, 0x27, -0xdb, 0x8d, 0xb3, 0xfc, 0x21, 0x9c, 0xd4, 0x57, 0xe1, 0xe1, 0x7b, 0xfe, 0x17, 0x70, 0xf2, 0x7a, -0x23, 0x3a, 0xb3, 0xbe, 0x1c, 0x3e, 0x2e, 0xd3, 0x14, 0x91, 0x31, 0x62, 0x3e, 0x5e, 0xd1, 0x04, -0xb1, 0xa1, 0x16, 0x87, 0x15, 0x6d, 0x0e, 0xf9, 0xde, 0xd2, 0x7c, 0x37, 0x69, 0x0d, 0xd4, 0x1f, -0xfd, 0xc2, 0x8f, 0x3a, 0x98, 0x53, 0x8d, 0xec, 0xc0, 0x23, 0xb2, 0x5b, 0xb1, 0xa1, 0x21, 0xf9, -0xae, 0x58, 0x7d, 0xce, 0x72, 0x32, 0x38, 0x8d, 0x3d, 0x47, 0x8b, 0x9f, 0x18, 0x2a, 0x10, 0xf2, -0xea, 0x2d, 0x09, 0xfb, 0x2a, 0x7e, 0x8c, 0x05, 0x5d, 0x4f, 0x6b, 0xae, 0x9a, 0xa9, 0xc2, 0x76, -0x4e, 0x65, 0xf5, 0xe9, 0x17, 0x9d, 0x0a, 0x7a, 0x59, 0x1e, 0x1e, 0xb3, 0x7d, 0x55, 0x14, 0x5f, -0xfc, 0x06, 0x72, 0x81, 0x27, 0x99, 0x57, 0x39, 0xd5, 0x55, 0x92, 0x70, 0x7f, 0x90, 0xf9, 0xf2, -0x55, 0xf2, 0xb1, 0x4e, 0x7d, 0xa5, 0xbf, 0x73, 0x79, 0xd8, 0xd6, 0x5f, 0x34, 0xfd, 0x2f, 0xe6, -0xde, 0x0e, 0x11, 0xe9, 0x54, 0x00, 0x00}; -#endif /*__VISUALIZATION_HTML_H__*/ diff --git a/src/web/html/tmp/about.html b/src/web/html/tmp/about.html deleted file mode 100644 index 820fd356..00000000 --- a/src/web/html/tmp/about.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - About - - - - - - - - - -
-
-

About AhoyDTU

-
-
-
Used Libraries
-
- - - - - - - - -
-
Contact Information
-
-
-
Github Repository
- -
-
-
Discord Chat
- -
-
-
E-Mail
- -
-
-
-
- - - - diff --git a/src/web/html/tmp/index.html b/src/web/html/tmp/index.html deleted file mode 100644 index a2da0653..00000000 --- a/src/web/html/tmp/index.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - Index - - - - - - - - - -
-
-

- Uptime:
- ESP-Time: -

-

- System Infos: -

-
-
-

- -
-

Support this project:

- -

- This project was started from this discussion. (Mikrocontroller.net) -

-
-
-
- - - - diff --git a/src/web/html/tmp/login.html b/src/web/html/tmp/login.html deleted file mode 100644 index 81c4051d..00000000 --- a/src/web/html/tmp/login.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - Login - - - - - - - - -
-
-
-
-

AhoyDTU

-
-
-
-
-
-
-
-
- - - diff --git a/src/web/html/tmp/save.html b/src/web/html/tmp/save.html deleted file mode 100644 index 1b85d690..00000000 --- a/src/web/html/tmp/save.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Save - - - - - - - - - -
-
-
Saving settings...
-
-
- - - - diff --git a/src/web/html/tmp/serial.html b/src/web/html/tmp/serial.html deleted file mode 100644 index 28d56965..00000000 --- a/src/web/html/tmp/serial.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - Serial Console - - - - - - - - - -
-
-
- -
-
-
console active:
-
Uptime:
-
- - -
-
-
-
- - - - diff --git a/src/web/html/tmp/setup.html b/src/web/html/tmp/setup.html deleted file mode 100644 index bebdaab9..00000000 --- a/src/web/html/tmp/setup.html +++ /dev/null @@ -1,1000 +0,0 @@ - - - - Setup - - - - - - - - - -
-
-
-
- -
-
- Device Host Name -
-
Device Name
-
-
-
-
Reboot Ahoy at midnight
-
-
-
-
Dark Mode
-
-
(empty browser cache or use CTRL + F5 after reboot to apply this setting)
-
-
-
- System Config -

Status LEDs

-
- -

Radio (NRF24L01+)

-
- -

Radio (CMT2300A)

-
(ESP32 only)
- -

Serial Console

-
-
print inverter data
-
-
-
-
Serial Debug
-
-
-
-
Interval [s]
-
-
-
-
- - -
-
- WiFi - -
-
AP Password (min. length: 8)
-
-
- -

Enter the credentials to your preferred WiFi station. After rebooting the device tries to connect with this information.

- -
-
Search Networks
-
-
- -
-
Avail Networks
-
- -
-
-
-
SSID
-
-
-
-
SSID is hidden
-
-
-
-
Password
-
-
-
-
- Static IP (optional) -

- Leave fields blank for DHCP
- The following fields are parsed in this format: 192.168.4.1 -

-
-
IP Address
-
-
-
-
Submask
-
-
-
-
DNS 1
-
-
-
-
DNS 2
-
-
-
-
Gateway
-
-
-
-
- - -
-
- Protection -
-
Admin Password
-
-
-

Select pages which should be protected by password

-
-
-
- - -
-
- Inverter -
-
-
-
-
-
-

Note

-

A 'max module power' value of '0' disables the channel in 'live' view

-
-
-

General

-
-
-
-
Interval [s]
-
-
-
-
Max retries per Payload
-
-
-
-
Reset values and YieldDay at midnight
-
-
-
-
Reset values when inverter polling pauses at sunset
-
-
-
-
Reset values when inverter status is 'not available'
-
-
-
-
Reset 'max' values at midnight
-
-
-
-
Start without time sync (useful in AP-Only-Mode)
-
-
-
-
Yield Efficiency (should be between 0.95 and 0.96)
-
-
-
-
- - -
-
- NTP Server -
-
NTP Server / IP
-
-
-
-
NTP Port
-
-
-
-
NTP Interval (in Minutes, min. 5 Minutes)
-
-
-
-
set System time
-
- -
- -
-
-
-
System Time
-
-
-
-
- - -
-
- Sunrise & Sunset -
-
Latitude (decimal)
-
-
-
-
Longitude (decimal)
-
-
-
-
Offset (pre sunrise, post sunset)
-
-
-
-
Pause polling inverters during night
-
-
-
-
- - -
-
- MQTT -
-
Broker / Server IP
-
-
-
-
Port
-
-
-
-
Client Id (optional)
-
-
-
-
Username (optional)
-
-
-
-
Password (optional)
-
-
-
-
Topic
-
-
-

Send Inverter data in a fixed interval, even if there is no change. A value of '0' disables the fixed interval. The data is published once it was successfully received from inverter. (default: 0)

-
-
Interval [s]
-
-
-
-
Discovery Config (homeassistant)
-
- - -
-
-
-
- - -
-
- Display Config -
-
-
-
Turn off while inverters are offline
-
-
-
-
Enable Screensaver (pixel shifting, OLED only)
-
-
-
-
Luminance
-
-
-

Pinout

-
-
-
- -
-
Reboot device after successful save
-
- - -
-
- -
-
- ERASE SETTINGS (not WiFi) -
- Import / Export JSON Settings -
-
Import
-
-
-
-
-
-
-
-
-
-
-
Export
-
- Export settings (JSON file) (only values, passwords will be removed!) -
-
-
-
-
-
- - - - diff --git a/src/web/html/tmp/style.css b/src/web/html/tmp/style.css deleted file mode 100644 index 95cbff3b..00000000 --- a/src/web/html/tmp/style.css +++ /dev/null @@ -1,781 +0,0 @@ -html, body { - font-family: Arial; - margin: 0; - padding: 0; - height: 100%; - min-height: 100%; - background-color: var(--bg); - color: var(--fg); -} - -h2 { - padding-left: 10px; -} - -span, li, h3, label, fieldset { - color: var(--fg); -} - -fieldset, input[type=submit], .btn { - border-radius: 4px; -} - -input[type=file] { - width: 100%; -} - -textarea { - color: var(--fg); - background-color: var(--bg); -} - -#live span { - color: var(--fg2); -} - -.topnav { - background-color: var(--nav-bg); - position: fixed; - top: 0; - width: 100%; -} - -.topnav a { - color: var(--fg2); - padding: 14px 14px; - text-decoration: none; - font-size: 17px; - display: block; -} - -#topnav a { - color: #fff; -} - -.topnav a.icon { - top: 0; - left: 0; - background: var(--nav-bg); - display: block; - position: absolute; -} - -.topnav a:hover { - background-color: var(--primary-hover) !important; -} - -.topnav .info { - color: var(--fg2); - position: absolute; - right: 24px; - top: 5px; -} - -.topnav .mobile { - display: none; -} - -svg.icon { - vertical-align: middle; - display: inline-block; - margin-top:-4x; - padding: 5px 7px 5px 0px; -} - -.icon-info { - fill: var(--info); -} - -.icon-warn { - fill: var(--warn); -} - -.icon-success { - fill: var(--success); -} - -.wifi { - fill: var(--fg2); -} - -.title { - background-color: var(--primary); - color: #fff !important; - padding: 15px 14px 16px 80px !important -} - -.topnav .icon span { - display: block; - width: 30px; - height: 3px; - margin-bottom: 5px; - position: relative; - background: #fff; - border-radius: 2px; -} - -.topnav .active { - background-color: var(--nav-active); -} - -span.seperator { - width: 100%; - height: 1px; - margin: 5px 0px 5px; - background-color: #494949; - display: block; -} - -#content { - max-width: 1140px; -} - -.total-h { - background-color: var(--total-head-title); - color: var(--fg2); -} - -.total-bg { - background-color: var(--total-bg); - color: var(--fg2); -} - -.iv-h { - background-color: var(--iv-head-title); - color: var(--fg2); -} - -.iv-bg { - background-color: var(--iv-head-bg); - color: var(--fg2); -} - -.iv-h-dis { - background-color: var(--iv-dis-title); - color: var(--fg2); -} - -.iv-bg-dis { - background-color: var(--iv-dis); - color: var(--fg2); -} - -.ch-h { - background-color: var(--ch-head-title); - color: var(--fg2); -} - -.ch-bg { - background-color: var(--ch-head-bg); - color: var(--fg2); -} - -.ts-h { - background-color: var(--ts-head); - color: var(--fg2); -} - -.ts-bg { - background-color: var(--ts-bg); - color: var(--fg2); -} - -.hr { - border-top: 1px solid var(--iv-head-title); - margin: 1rem 0 1rem; -} - -p { - text-align: justify; - font-size: 13pt; - color: var(--fg); -} - -#footer { - background-color: var(--footer-bg); -} - -.row { display: flex; max-width: 100%; flex-wrap: wrap; } -.col { flex: 1 0 0%; } - -.col-1, .col-2, .col-3, .col-4, -.col-5, .col-6, .col-7, .col-8, -.col-9, .col-10, .col-11, .col-12 { flex: 0 0 auto; } - -.col-1 { width: 8.333333333%; } -.col-2 { width: 16.66666667%; } -.col-3 { width: 25%; } -.col-4 { width: 33.33333333%; } -.col-5 { width: 41.66666667%; } -.col-6 { width: 50%; } -.col-7 { width: 58.33333333%; } -.col-8 { width: 66.66666667%; } -.col-9 { width: 75%; } -.col-10 { width: 83.33333333%; } -.col-11 { width: 91.66666667%; } -.col-12 { width: 100%; } - -.p-1 { padding: 0.25rem; } -.p-2 { padding: 0.5rem; } -.p-3 { padding: 1rem; } -.p-4 { padding: 1.5rem; } -.p-5 { padding: 3rem; } - -.px-1 { padding: 0 0.25rem 0 0.25rem; } -.px-2 { padding: 0 0.5rem 0 0.5rem; } -.px-3 { padding: 0 1rem 0 1rem; } -.px-4 { padding: 0 1.5rem 0 1.5rem; } -.px-5 { padding: 0 3rem 0 3rem; } - -.py-1 { padding: 0.25rem 0 0.25rem; } -.py-2 { padding: 0.5rem 0 0.5rem; } -.py-3 { padding: 1rem 0 1rem; } -.py-4 { padding: 1.5rem 0 1.5rem; } -.py-5 { padding: 3rem 0 3rem; } - -.mx-1 { margin: 0 0.25rem 0 0.25rem; } -.mx-2 { margin: 0 0.5rem 0 0.5rem; } -.mx-3 { margin: 0 1rem 0 1rem; } -.mx-4 { margin: 0 1.5rem 0 1.5rem; } -.mx-5 { margin: 0 3rem 0 3rem; } - -.my-1 { margin: 0.25rem 0 0.25rem; } -.my-2 { margin: 0.5rem 0 0.5rem; } -.my-3 { margin: 1rem 0 1rem; } -.my-4 { margin: 1.5rem 0 1.5rem; } -.my-5 { margin: 3rem 0 3rem; } - -.mt-1 { margin-top: 0.25rem } -.mt-2 { margin-top: 0.5rem } -.mt-3 { margin-top: 1rem } -.mt-4 { margin-top: 1.5rem } -.mt-5 { margin-top: 3rem } - -.mb-1 { margin-bottom: 0.25rem } -.mb-2 { margin-bottom: 0.5rem } -.mb-3 { margin-bottom: 1rem } -.mb-4 { margin-bottom: 1.5rem } -.mb-5 { margin-bottom: 3rem } - -.fs-1 { font-size: 3.5rem; } -.fs-2 { font-size: 3rem; } -.fs-3 { font-size: 2.5rem; } -.fs-4 { font-size: 2rem; } -.fs-5 { font-size: 1.75rem; } -.fs-6 { font-size: 1.5rem; } -.fs-7 { font-size: 1.25rem; } -.fs-8 { font-size: 1rem; } -.fs-9 { font-size: 0.75rem; } -.fs-10 { font-size: 0.5rem; } - -.a-r { text-align: right; } -.a-c { text-align: center; } - -.d-none { display: none !important; } -.d-block { display: block !important; } - -.row > * { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -*, ::after, ::before { - box-sizing: border-box; -} - -/* sm */ -@media(min-width: 768px) { - .col-sm-1 { width: 8.333333333%; } - .col-sm-2 { width: 16.66666667%; } - .col-sm-3 { width: 25%; } - .col-sm-4 { width: 33.33333333%; } - .col-sm-5 { width: 41.66666667%; } - .col-sm-6 { width: 50%; } - .col-sm-7 { width: 58.33333333%; } - .col-sm-8 { width: 66.66666667%; } - .col-sm-9 { width: 75%; } - .col-sm-10 { width: 83.33333333%; } - .col-sm-11 { width: 91.66666667%; } - .col-sm-12 { width: 100%; } - - .mb-sm-1 { margin-bottom: 0.25rem } - .mb-sm-2 { margin-bottom: 0.5rem } - .mb-sm-3 { margin-bottom: 1rem } - .mb-sm-4 { margin-bottom: 1.5rem } - .mb-sm-5 { margin-bottom: 3rem } - - .fs-sm-1 { font-size: 3.5rem; } - .fs-sm-2 { font-size: 3rem; } - .fs-sm-3 { font-size: 2.5rem; } - .fs-sm-4 { font-size: 2rem; } - .fs-sm-5 { font-size: 1.75rem; } - .fs-sm-6 { font-size: 1.5rem; } - .fs-sm-7 { font-size: 1.25rem; } - .fs-sm-8 { font-size: 1rem; } - - .d-sm-block { display: block !important;} - .d-sm-none { display: none !important; } -} - -/* md */ -@media(min-width: 992px) { - .col-md-1 { width: 8.333333333%; } - .col-md-2 { width: 16.66666667%; } - .col-md-3 { width: 25%; } - .col-md-4 { width: 33.33333333%; } - .col-md-5 { width: 41.66666667%; } - .col-md-6 { width: 50%; } - .col-md-7 { width: 58.33333333%; } - .col-md-8 { width: 66.66666667%; } - .col-md-9 { width: 75%; } - .col-md-10 { width: 83.33333333%; } - .col-md-11 { width: 91.66666667%; } - .col-md-12 { width: 100%; } -} - -table { - border-collapse: collapse; - width: 100%; -} - -th { - text-align: inherit; -} - -.table td, .table th { - padding: .75rem; - border-bottom: 1px solid var(--table-border); -} - -#wrapper { - min-height: 100%; -} - -#content { - padding: 50px 20px 120px 20px; - overflow: auto; -} - -#footer { - height: 121px; - margin-top: -121px; - width: 100%; - font-size: 13px; -} - -#footer .right { - color: #bbb; - margin: 6px 25px; - text-align: right; -} - -#footer .left { - color: #bbb; - margin: 23px 0px 0px 25px; -} - -#footer ul { - list-style-type: none; - margin: 20px auto; - padding: 0; -} - -#footer ul li, #footer a { - color: #bbb; - margin-bottom: 10px; - padding-left: 5px; - font-size: 13px; -} - -#footer a:hover { - color: #fff; -} - -.hide { - display: none !important; -} - -@media only screen and (min-width: 992px) { - .topnav { - width: 230px !important; - height: 100%; - } - - .topnav a.icon { - display: none !important; - } - - .topnav a { - padding: 14px 24px; - } - - .topnav .title { - padding-left: 24px !important; - } - - .topnav .mobile { - display: block; - } - - .topnav .info { - top: auto !important; - right: auto !important; - bottom: 14px; - left: 24px; - } - - #content { - padding: 15px 15px 120px 250px; - } - - #footer .left { - margin-left: 250px !important; - } -} - -p.lic, p.lic a { - font-size: 8pt; - color: #999; -} - -.des { - margin-top: 20px; - font-size: 13pt; - color: var(--secondary); -} - -.s_active, .s_collapsible:hover { - background-color: var(--primary-hover); - color: #fff; -} - -.s_content { - display: none; - overflow: hidden; -} - -.s_collapsible { - background-color: var(--primary); - color: white; - cursor: pointer; - padding: 12px; - width: 100%; - border: none; - text-align: left; - outline: none; - font-size: 15px; - margin-bottom: 5px; -} - -.subdes { - font-size: 12pt; - color: var(--secondary); - margin-left: 7px; -} - -.subsubdes { - font-size:12pt; - color:var(--secondary); - margin: 0 0 7px 12px; -} - -a:link, a:visited { - text-decoration: none; - font-size: 13pt; - color: var(--secondary); -} - -a:hover, a:focus { - color: #f00; -} - -a.btn { - background-color: var(--primary); - color: #fff; - padding: 7px 15px 7px 15px; - display: inline-block; -} - -a.btn:hover { - background-color: var(--primary-hover) !important; -} - -input, select { - padding: 7px; - font-size: 13pt; -} - -input[type=text], input[type=password], select, input[type=number] { - width: 100%; - box-sizing: border-box; - border: 1px solid #ccc; - border-radius: 4px; - background-color: var(--input-bg); - color: var(--fg); -} - -input:invalid { - border: 2px solid #f00 !important; - background-color: var(--invalid-bg) !important; -} - -input.sh { - max-width: 150px !important; - margin-right: 10px; -} - -input.btnDel { - background-color: #c00 !important; -} - -input.btn { - background-color: var(--primary); - color: #fff; - border: 0px; - padding: 7px 20px 7px 20px; - margin-bottom: 10px; - text-transform: uppercase; - cursor: pointer; -} - -input.btn:hover { - background-color: #044e86; -} - -input.cb { - margin-bottom: 15px; - margin-top: 10px; -} - -label { - width: 20%; - display: inline-block; - font-size: 12pt; - padding-right: 10px; - margin: 10px 0px 0px 15px; - vertical-align: top; -} - -pre { - white-space: pre-wrap; -} - -.left { - float: left; -} - -.right { - float: right; -} - -.subgrp { - float: left; - width: 220px; -} - -div.ModPwr, div.ModName, div.YieldCor { - width:70%; - display: inline-block; -} - -div.hr { - height: 1px; - border-top: 1px solid #ccc; - margin: 10px 0px 10px; -} - -#note { - margin: 10px 10px 10px 10px; - padding-top: 10px; - width: 100%; -} - -#login { - width: 450px; - height: 200px; - border: 1px solid #ccc; - background-color: var(--input-bg); - position: absolute; - top: 50%; - left: 50%; - margin-top: -160px; - margin-left: -225px; -} - -@media(max-width: 500px) { - div.ch .unit, div.ch-iv .unit { - font-size: 18px; - } - - div.ch { - width: 170px; - min-height: 100px - } - - .subgrp { - width: 180px; - } - - #login { - margin-left: -150px; - width: 300px; - } -} - -#serial { - width: 100%; -} - -#content .serial { - max-width: 1000px; -} - -.dot { - height: 15px; - width: 15px; - background-color: #f00; - border-radius: 50%; - display: inline-block; - margin-top: 15px; -} - - -.head { - background-color: var(--primary); - color: #fff; -} - - -.css-tooltip{ - position: relative; -} -.css-tooltip:hover:after{ - content:attr(data-tooltip); - background:#000; - padding:5px; - border-radius:3px; - display: inline-block; - position: absolute; - transform: translate(-50%,-100%); - margin:0 auto; - color:#FFF; - min-width:100px; - min-width:150px; - top:-5px; - left: 50%; - text-align:center; -} -.css-tooltip:hover:before { - top:-5px; - left: 50%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-color: rgba(0, 0, 0, 0); - border-top-color: #000; - border-width: 5px; - margin-left: -5px; - transform: translate(0,0px); -} - -#modal { - max-width: 700px; - margin: 1.75rem auto; -} - -.modal { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1072; - display: block; -} - -#modal-wrapper { - background-color: #000; - opacity: 0.5; - bottom: 0; -} - -.modal-content { - border-radius: .3rem; - position: relative; - display: flex; - width: 100%; - background-color: var(--modal-bg); - background-clip: padding-box; - border: 1px solid rgba(0,0,0,.2); - flex-direction: column; -} - -.modal-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - padding: 1rem; - border-bottom: 1px solid #e9ecef; -} - -.modal-header .close { - padding: 0.7rem; - margin: -1rem -1rem -1rem auto; -} - -.modal-body { - padding: 1rem 1rem 2rem 1rem; -} - -.close { - font-size: 2rem; - opacity: 0.5; - font-family: inherit; - cursor: pointer; - padding: 0; -} - -button.close { - background-color: transparent; - border: 0; -} - -h5 { - font-size: 1.25rem; - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; -} - -.pointer { - cursor: pointer; -} - -.badge-success { - color: #fff; - background-color: #28a745; -} - -.badge-warning { - color: #212529; - background-color: #ffc107; -} - -.badge-error { - color: #fff; - background-color: #dc3545; -} - -.badge { - display: inline-block; - padding: .25em .4em; - font-size: 85%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25rem; -} diff --git a/src/web/html/tmp/system.html b/src/web/html/tmp/system.html deleted file mode 100644 index b7221966..00000000 --- a/src/web/html/tmp/system.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - System - - - - - - - - - -
-
-
-
-
-
- - - - diff --git a/src/web/html/tmp/update.html b/src/web/html/tmp/update.html deleted file mode 100644 index 883afac5..00000000 --- a/src/web/html/tmp/update.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Update - - - - - - - - - -
-
-
- Select firmware file (*.bin) -
- - -
-
-
-
- - - - diff --git a/src/web/html/tmp/visualization.html b/src/web/html/tmp/visualization.html deleted file mode 100644 index 545a1555..00000000 --- a/src/web/html/tmp/visualization.html +++ /dev/null @@ -1,479 +0,0 @@ - - - - Live - - - - - - - - - - -
-
-
-

Every seconds the values are updated

-
-
- - - - From 92855a7f0ccc2d5b4742e7e5d787b06357e8f455 Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 29 Oct 2023 17:17:05 +0100 Subject: [PATCH 25/42] started to add heuristics as an extra class (for now global not inverter independent) --- src/app.cpp | 4 +- src/hm/Heuristic.h | 147 +++++++++++++++++++++++++++++++++++++++++++++ src/hm/hmRadio.h | 27 +++++++-- 3 files changed, 170 insertions(+), 8 deletions(-) create mode 100644 src/hm/Heuristic.h diff --git a/src/app.cpp b/src/app.cpp index 9cbe06a1..5570af54 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -205,8 +205,8 @@ void app::onNetwork(bool gotIp) { every(std::bind(&app::tickSend, this), mConfig->nrf.sendInterval, "tSend"); mMqttReconnect = true; mSunrise = 0; // needs to be set to 0, to reinstall sunrise and ivComm tickers! - //once(std::bind(&app::tickNtpUpdate, this), 2, "ntp2"); - tickNtpUpdate(); + once(std::bind(&app::tickNtpUpdate, this), 2, "ntp2"); + //tickNtpUpdate(); #if !defined(ETHERNET) if (WIFI_AP == WiFi.getMode()) { mMqttEnabled = false; diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h new file mode 100644 index 00000000..3080e8df --- /dev/null +++ b/src/hm/Heuristic.h @@ -0,0 +1,147 @@ +//----------------------------------------------------------------------------- +// 2023 Ahoy, https://github.com/lumpapu/ahoy +// Creative Commons - http://creativecommons.org/licenses/by-nc-sa/4.0/deed +//----------------------------------------------------------------------------- + +#ifndef __HEURISTIC_H__ +#define __HEURISTIC_H__ + +#include "../utils/dbg.h" + +#define RF_MAX_CHANNEL_ID 5 +#define RF_MAX_QUALITY 4 +#define RF_MIN_QUALTIY -6 + +class Heuristic { + public: + void setup() { + uint8_t j; + for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { + mTxQuality[i] = -6; // worst + for(j = 0; j < 10; j++) { + mRxCh[i][j] = 3; + } + } + } + + /*uint8_t getRxCh(void) { + + }*/ + + uint8_t getTxCh(void) { + if(++mCycleCnt > RF_MAX_CHANNEL_ID) { + bool ok = false; + for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { + if(mTxQuality[i] > -4) { + ok = true; + mState = States::RUNNING; + } + } + if(!ok) { // restart + mCycleCnt = 0; + mState = States::TRAINING; + } + } + + if(States::TRAINING == mState) { + mTxChId = (mTxChId + 1) % RF_MAX_CHANNEL_ID; + return id2Ch(mTxChId); + } else { + int8_t bestQuality = -6; + uint8_t id = 0; + for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { + if((mCycleCnt % 50) == 0) { + if(mTxQuality[(i + mTxChId) % RF_MAX_CHANNEL_ID] != -6) { + id = i; + break; + } + + } + if(mTxQuality[(i + mTxChId) % RF_MAX_CHANNEL_ID] == 4) { + id = i; + break; + } + if(mTxQuality[i] > bestQuality) { + bestQuality = mTxQuality[i]; + id = i; + } + } + mTxChId = id; + return id2Ch(mTxChId); + } + } + + void setGotAll(void) { + updateQuality(2); // GOOD + } + + void setGotFragment(void) { + updateQuality(1); // OK + } + + void setGotNothing(void) { + updateQuality(-2); // BAD + } + + void printStatus(void) { + DPRINT(DBG_INFO, F("Status: #")); + DBGPRINT(String(mCycleCnt)); + DBGPRINT(F(" |")); + for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { + DBGPRINT(F(" ")); + DBGPRINT(String(mTxQuality[i])); + } + DBGPRINTLN(""); + } + + private: + void updateQuality(uint8_t quality) { + mTxQuality[mTxChId] += quality; + if(mTxQuality[mTxChId] > RF_MAX_QUALITY) + mTxQuality[mTxChId] = RF_MAX_QUALITY; + else if(mTxQuality[mTxChId] < RF_MIN_QUALTIY) + mTxQuality[mTxChId] = RF_MIN_QUALTIY; + } + + uint8_t ch2Id(uint8_t ch) { + switch(ch) { + case 3: return 0; + case 23: return 1; + case 40: return 2; + case 61: return 3; + case 75: return 4; + } + return 0; // standard + } + + uint8_t id2Ch(uint8_t id) { + switch(id) { + case 0: return 3; + case 1: return 23; + case 2: return 40; + case 3: return 61; + case 4: return 75; + } + return 0; // standard + } + + private: + enum class States : uint8_t { + TRAINING, RUNNING + }; + + private: + uint8_t mChList[5] = {03, 23, 40, 61, 75}; + + int8_t mTxQuality[RF_MAX_CHANNEL_ID]; + uint8_t mTxChId = 0; + + uint8_t mRxCh[RF_MAX_CHANNEL_ID][10]; + uint8_t mRxChId = 0; + + uint32_t mCycleCnt = 0; + States mState = States::TRAINING; +}; + + +#endif /*__HEURISTIC_H__*/ diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index 3d74222d..fc4f2069 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -9,6 +9,7 @@ #include #include "SPI.h" #include "radio.h" +#include "heuristic.h" #define SPI_SPEED 1000000 @@ -76,6 +77,9 @@ class HmRadio : public Radio { mSpi = new SPIClass(); mSpi->begin(); #endif + + mHeu.setup(); + mNrf24.begin(mSpi, ce, cs); mNrf24.setRetries(3, 15); // 3*250us + 250us and 15 loops -> 15ms @@ -114,6 +118,8 @@ class HmRadio : public Radio { mNrf24.flush_tx(); // empty TX FIFO // start listening + //mNrf24.setChannel(23); + //mRxChIdx = 0; mNrf24.setChannel(mRfChLst[mRxChIdx]); mNrf24.startListening(); @@ -124,8 +130,11 @@ class HmRadio : public Radio { if (mIrqRcvd) { mIrqRcvd = false; - if (getReceived()) // everything received + if (getReceived()) { // everything received + mHeu.setGotAll(); return; + } else + mHeu.setGotFragment(); } yield(); @@ -134,9 +143,15 @@ class HmRadio : public Radio { if(++mRxChIdx >= RF_CHANNELS) mRxChIdx = 0; mNrf24.setChannel(mRfChLst[mRxChIdx]); - startMicros = micros() + 5000; + startMicros = micros() + 5110; } // not finished but time is over + if(++mRxChIdx >= RF_CHANNELS) + mRxChIdx = 0; + if(mBufCtrl.empty()) + mHeu.setGotNothing(); + + mHeu.printStatus(); return; } @@ -275,21 +290,20 @@ class HmRadio : public Radio { updateCrcs(&len, appendCrc16); // set TX and RX channels - mTxChIdx = (mTxChIdx + 1) % RF_CHANNELS; - mRxChIdx = (mTxChIdx + 2) % RF_CHANNELS; + mTxChIdx = mHeu.getTxCh(); if(mSerialDebug) { DPRINT_IVID(DBG_INFO, iv->id); DBGPRINT(F("TX ")); DBGPRINT(String(len)); DBGPRINT(" CH"); - DBGPRINT(String(mRfChLst[mTxChIdx])); + DBGPRINT(String(mTxChIdx)); DBGPRINT(F(" | ")); ah::dumpBuf(mTxBuf, len); } mNrf24.stopListening(); - mNrf24.setChannel(mRfChLst[mTxChIdx]); + mNrf24.setChannel(mTxChIdx); mNrf24.openWritingPipe(reinterpret_cast(&iv->radioId.u64)); mNrf24.startWrite(mTxBuf, len, false); // false = request ACK response mMillis = millis(); @@ -311,6 +325,7 @@ class HmRadio : public Radio { SPIClass* mSpi; RF24 mNrf24; + Heuristic mHeu; }; #endif /*__HM_RADIO_H__*/ From f1dfd328cce569a25069db4b74f79c22f41356ef Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 1 Nov 2023 00:11:38 +0100 Subject: [PATCH 26/42] 0.8.1 * added tx channel heuristics (per inverter) * fix statistics counter --- src/CHANGES.md | 7 + src/app.cpp | 122 +----- src/app.h | 13 - src/appInterface.h | 2 - src/defines.h | 4 +- src/hm/CommQueue.h | 20 - src/hm/Communication.h | 49 +-- src/hm/Heuristic.h | 117 ++---- src/hm/hmInverter.h | 98 +---- src/hm/hmPayload.h | 494 ------------------------ src/hm/hmRadio.h | 40 +- src/hm/miPayload.h | 844 ----------------------------------------- src/web/RestApi.h | 11 +- 13 files changed, 97 insertions(+), 1724 deletions(-) delete mode 100644 src/hm/hmPayload.h delete mode 100644 src/hm/miPayload.h diff --git a/src/CHANGES.md b/src/CHANGES.md index 2afb1ece..435379e9 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,12 @@ # Development Changes +## 0.8.1 - 2023-10-31 +* added tx channel heuristics (per inverter) +* fix statistics counter + +## 0.8.0 - 2023-10-?? +* switched to new communication scheme + ## 0.7.66 - 2023-10-04 * prepared PA-Level for CMT * removed settings for number of retransmits, its fixed to `5` now diff --git a/src/app.cpp b/src/app.cpp index 5570af54..afe17132 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -74,15 +74,6 @@ void app::setup() { }); } - /*mPayload.setup(this, &mSys, &mTimestamp); - mPayload.enableSerialDebug(mConfig->serial.debug); - mPayload.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); - if (mConfig->nrf.enabled) { - mMiPayload.setup(this, &mSys, &mTimestamp); - mMiPayload.enableSerialDebug(mConfig->serial.debug); - mMiPayload.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); - }*/ - if(mConfig->nrf.enabled) { if (!mNrfRadio.isChipConnected()) DPRINTLN(DBG_WARN, F("WARNING! your NRF24 module can't be reached, check the wiring")); @@ -95,8 +86,6 @@ void app::setup() { mMqtt.setup(&mConfig->mqtt, mConfig->sys.deviceName, mVersion, &mSys, &mTimestamp, &mUptime); mMqtt.setSubscriptionCb(std::bind(&app::mqttSubRxCb, this, std::placeholders::_1)); mCommunication.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); - //mPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); - //mMiPayload.addAlarmListener([this](Inverter<> *iv) { mMqtt.alarmEvent(iv); }); } #endif setupLed(); @@ -124,7 +113,6 @@ void app::setup() { //----------------------------------------------------------------------------- void app::loop(void) { ah::Scheduler::loop(); - //bool processPayload = false; mNrfRadio.loop(); #if defined(ESP32) @@ -132,66 +120,6 @@ void app::loop(void) { #endif mCommunication.loop(); - /*if (mNrfRadio.loop() && mConfig->nrf.enabled) { - while (!mNrfRadio.mBufCtrl.empty()) { - packet_t *p = &mNrfRadio.mBufCtrl.front(); - if (mConfig->serial.debug) { - DPRINT(DBG_INFO, F("RX ")); - DBGPRINT(String(p->len)); - DBGPRINT(F(" CH")); - DBGPRINT(String(p->ch)); - DBGPRINT(F(", ")); - DBGPRINT(String(p->rssi)); - DBGPRINT(F("dBm | ")); - ah::dumpBuf(p->packet, p->len); - } - - Inverter<> *iv = mSys.findInverter(&p->packet[1]); - if (NULL != iv) { - iv->radioStatistics.frmCnt++; - if (IV_MI == iv->ivGen) - mMiPayload.add(iv, p); - else - mPayload.add(iv, p); - } - mNrfRadio.mBufCtrl.pop(); - processPayload = true; - yield(); - } - mMiPayload.process(true); - } - #if defined(ESP32) - if (mCmtRadio.loop() && mConfig->cmt.enabled) { - while (!mCmtRadio.mBufCtrl.empty()) { - packet_t *p = &mCmtRadio.mBufCtrl.front(); - if (mConfig->serial.debug) { - DPRINT(DBG_INFO, F("RX ")); - DBGPRINT(String(p->len)); - DBGPRINT(F(", ")); - DBGPRINT(String(p->rssi)); - DBGPRINT(F("dBm | ")); - ah::dumpBuf(p->packet, p->len); - } - - Inverter<> *iv = mSys.findInverter(&p->packet[1]); - if(NULL != iv) { - iv->radioStatistics.frmCnt++; - if((iv->ivGen == IV_HMS) || (iv->ivGen == IV_HMT)) - mPayload.add(iv, p); - } - mCmtRadio.mBufCtrl.pop(); - processPayload = true; - yield(); - } - } - #endif - - if(processPayload) - mPayload.process(true); - - mPayload.loop(); - mMiPayload.loop();*/ - if (mMqttEnabled && mNetworkConnected) mMqtt.loop(); } @@ -293,7 +221,7 @@ void app::tickNtpUpdate(void) { // immediately start communicating if (isOK && mSendFirst) { mSendFirst = false; - //once(std::bind(&app::tickSend, this), 2, "senOn"); + once(std::bind(&app::tickSend, this), 1, "senOn"); } mMqttReconnect = false; @@ -424,54 +352,6 @@ void app::tickSend(void) { } } - /*if(mConfig->nrf.enabled) { - if(!mNrfRadio.isChipConnected()) { - DPRINTLN(DBG_WARN, F("NRF24 not connected!")); - } - } - - if (mIVCommunicationOn) { - if (!mNrfRadio.mBufCtrl.empty()) { - if (mConfig->serial.debug) { - DPRINT(DBG_DEBUG, F("recbuf not empty! #")); - DBGPRINTLN(String(mNrfRadio.mBufCtrl.size())); - } - } - #if defined(ESP32) - if (!mCmtRadio.mBufCtrl.empty()) { - if (mConfig->serial.debug) { - DPRINT(DBG_INFO, F("recbuf not empty! #")); - DBGPRINTLN(String(mCmtRadio.mBufCtrl.size())); - } - } - #endif - - int8_t maxLoop = MAX_NUM_INVERTERS; - Inverter<> *iv = mSys.getInverterByPos(mSendLastIvId); - while(maxLoop > 0) { - do { - mSendLastIvId = ((MAX_NUM_INVERTERS - 1) == mSendLastIvId) ? 0 : mSendLastIvId + 1; - iv = mSys.getInverterByPos(mSendLastIvId); - } while ((NULL == iv) && ((maxLoop--) > 0)); - if(NULL != iv) - if(iv->config->enabled) - break; - } - - if (NULL != iv) { - if (iv->config->enabled) { - if((iv->ivGen == IV_MI) && mConfig->nrf.enabled) - mMiPayload.ivSend(iv); - else - mPayload.ivSend(iv); - } - } - } else { - if (mConfig->serial.debug) - DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); - } - yield();*/ - updateLed(); } diff --git a/src/app.h b/src/app.h index d28c3bf6..c257d83d 100644 --- a/src/app.h +++ b/src/app.h @@ -15,8 +15,6 @@ #include "hm/hmSystem.h" #include "hm/hmRadio.h" #include "hms/hmsRadio.h" -//#include "hm/hmPayload.h" -//#include "hm/miPayload.h" #include "publisher/pubMqtt.h" #include "publisher/pubSerial.h" #include "utils/crc.h" @@ -41,8 +39,6 @@ #define ACOS(x) (degrees(acos(x))) typedef HmSystem HmSystemType; -//typedef HmPayload PayloadType; -//typedef MiPayload MiPayloadType; #ifdef ESP32 typedef CmtRadio CmtRadioType; #endif @@ -171,15 +167,6 @@ class app : public IApp, public ah::Scheduler { mMqtt.setPowerLimitAck(iv); } - void ivSendHighPrio(Inverter<> *iv) { - if(mIVCommunicationOn) { // only send commands if communication is enabled - //if (iv->ivGen == IV_MI) - // mMiPayload.ivSendHighPrio(iv); - //else - // mPayload.ivSendHighPrio(iv); - } - } - bool getMqttIsConnected() { return mMqtt.isConnected(); } diff --git a/src/appInterface.h b/src/appInterface.h index d3bc8346..4bfc3b0c 100644 --- a/src/appInterface.h +++ b/src/appInterface.h @@ -53,8 +53,6 @@ class IApp { virtual void setMqttDiscoveryFlag() = 0; virtual void setMqttPowerLimitAck(Inverter<> *iv) = 0; - virtual void ivSendHighPrio(Inverter<> *iv) = 0; - virtual bool getMqttIsConnected() = 0; virtual uint32_t getMqttRxCnt() = 0; virtual uint32_t getMqttTxCnt() = 0; diff --git a/src/defines.h b/src/defines.h index be59fb4f..1a865fa7 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 0 +#define VERSION_PATCH 1 //------------------------------------- typedef struct { @@ -94,6 +94,8 @@ enum {MQTT_STATUS_OFFLINE = 0, MQTT_STATUS_PARTIAL, MQTT_STATUS_ONLINE}; #define MQTT_MAX_PACKET_SIZE 384 +#define PLUGIN_DISPLAY + typedef struct { uint32_t rxFail; uint32_t rxFailNoAnser; diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index 4042935d..8d0bb0f8 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -22,10 +22,6 @@ class CommQueue { void add(Inverter<> *iv, uint8_t cmd, bool delOnPop = true) { mQueue[mWrPtr] = queue_s(iv, cmd, delOnPop, false); - /*mQueue[mRdPtr].firstTry = false; - if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { - mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); - }*/ inc(&mWrPtr); } @@ -41,7 +37,6 @@ class CommQueue { uint32_t ts; bool delOnPop; bool isDevControl; - //bool firstTry; queue_s() {} queue_s(Inverter<> *i, uint8_t c, bool d, bool dev) : iv(i), cmd(c), attempts(5), ts(0), delOnPop(d), isDevControl(dev) {} @@ -50,10 +45,6 @@ class CommQueue { protected: void add(queue_s q) { mQueue[mWrPtr] = q; - /*mQueue[mRdPtr].firstTry = false; - if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { - mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); - }*/ inc(&mWrPtr); } @@ -61,10 +52,6 @@ class CommQueue { mQueue[mWrPtr] = *q; if(rstAttempts) mQueue[mWrPtr].attempts = 5; - /*mQueue[mRdPtr].firstTry = false; - if((IV_HM == mQueue[mRdPtr].iv->ivGen) || (IV_MI == mQueue[mRdPtr].iv->ivGen)) { - mQueue[mRdPtr].firstTry = ((mQueue[mRdPtr].iv->isAvailable()) || (millis() < 120000)); - }*/ inc(&mWrPtr); } @@ -89,13 +76,6 @@ class CommQueue { inc(&mRdPtr); } - /*bool isFirstTry(void) { - if(!mQueue[mRdPtr].firstTry) - return false; - mQueue[mRdPtr].firstTry = false; - return true; - }*/ - void setTs(uint32_t *ts) { mQueue[mRdPtr].ts = *ts; } diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 8a7a9e7a..b2a82e89 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -9,6 +9,7 @@ #include "CommQueue.h" #include #include "../utils/crc.h" +#include "heuristic.h" #define MI_TIMEOUT 250 #define DEFAULT_TIMEOUT 500 @@ -52,6 +53,9 @@ class Communication : public CommQueue<> { for(uint8_t i = 0; i < MAX_PAYLOAD_ENTRIES; i++) { mLocalBuf[i].len = 0; } + + mHeu.printStatus(q->iv); + mHeu.getTxCh(q->iv); mState = States::START; break; @@ -84,6 +88,7 @@ class Communication : public CommQueue<> { DBGPRINTLN(F("ms")); q->iv->radioStatistics.rxFailNoAnser++; // got nothing + mHeu.setGotNothing(q->iv); if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); mWaitTimeout = millis() + 1000; @@ -135,7 +140,8 @@ class Communication : public CommQueue<> { yield(); } if(0 == q->attempts) { - //cmdDone(q); + mHeu.setGotFragment(q->iv); + q->iv->radioStatistics.rxFail++; // got no complete payload cmdDone(true); mState = States::RESET; } else @@ -160,17 +166,7 @@ class Communication : public CommQueue<> { i++; } - if(q->attempts) { - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); - q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + SINGLEFR_TIMEOUT; // timeout - mState = States::WAIT; - } else { - add(q, true); - //cmdDone(q); - cmdDone(true); - mState = States::RESET; - } + sendRetransmit(q, i); return; } @@ -185,21 +181,12 @@ class Communication : public CommQueue<> { DBGPRINT(String(q->attempts)); DBGPRINTLN(F(" attempts left)")); - if(q->attempts) { - q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); - q->iv->radioStatistics.retransmits++; - mWaitTimeout = millis() + SINGLEFR_TIMEOUT; // timeout; - mState = States::WAIT; - } else { - add(q, true); - //cmdDone(q); - cmdDone(true); - mState = States::RESET; - } + sendRetransmit(q, i); return; } } + mHeu.setGotAll(q->iv); compilePayload(q); if(NULL != mCbPayload) @@ -376,6 +363,21 @@ class Communication : public CommQueue<> { } } + void sendRetransmit(const queue_s *q, uint8_t i) { + if(q->attempts) { + q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); + q->iv->radioStatistics.retransmits++; + mWaitTimeout = millis() + SINGLEFR_TIMEOUT; // timeout + mState = States::WAIT; + } else { + mHeu.setGotFragment(q->iv); + q->iv->radioStatistics.rxFail++; // got no complete payload + add(q, true); + cmdDone(true); + mState = States::RESET; + } + } + private: inline void miHwDecode(packet_t *p, const queue_s *q) { record_t<> *rec = q->iv->getRecordStruct(InverterDevInform_All); // choose the record structure @@ -714,6 +716,7 @@ class Communication : public CommQueue<> { uint8_t mPayload[MAX_BUFFER]; payloadListenerType mCbPayload = NULL; alarmListenerType mCbAlarm = NULL; + Heuristic mHeu; }; #endif /*__COMMUNICATION_H__*/ diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h index 3080e8df..7364f472 100644 --- a/src/hm/Heuristic.h +++ b/src/hm/Heuristic.h @@ -7,6 +7,7 @@ #define __HEURISTIC_H__ #include "../utils/dbg.h" +#include "hmInverter.h" #define RF_MAX_CHANNEL_ID 5 #define RF_MAX_QUALITY 4 @@ -14,96 +15,58 @@ class Heuristic { public: - void setup() { - uint8_t j; - for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { - mTxQuality[i] = -6; // worst - for(j = 0; j < 10; j++) { - mRxCh[i][j] = 3; - } - } - } - - /*uint8_t getRxCh(void) { + uint8_t getTxCh(Inverter<> *iv) { + if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) + return 0; // not used for these inverter types - }*/ - - uint8_t getTxCh(void) { - if(++mCycleCnt > RF_MAX_CHANNEL_ID) { - bool ok = false; - for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { - if(mTxQuality[i] > -4) { - ok = true; - mState = States::RUNNING; - } - } - if(!ok) { // restart - mCycleCnt = 0; - mState = States::TRAINING; + uint8_t id = 0; + int8_t bestQuality = -6; + for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { + if(iv->txRfQuality[i] > bestQuality) { + bestQuality = iv->txRfQuality[i]; + id = i; } } + if(bestQuality > -6) + iv->txRfChId = (iv->txRfChId + 1) % RF_MAX_CHANNEL_ID; // next channel + else + iv->txRfChId = id; // best quality channel - if(States::TRAINING == mState) { - mTxChId = (mTxChId + 1) % RF_MAX_CHANNEL_ID; - return id2Ch(mTxChId); - } else { - int8_t bestQuality = -6; - uint8_t id = 0; - for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { - if((mCycleCnt % 50) == 0) { - if(mTxQuality[(i + mTxChId) % RF_MAX_CHANNEL_ID] != -6) { - id = i; - break; - } - - } - if(mTxQuality[(i + mTxChId) % RF_MAX_CHANNEL_ID] == 4) { - id = i; - break; - } - if(mTxQuality[i] > bestQuality) { - bestQuality = mTxQuality[i]; - id = i; - } - } - mTxChId = id; - return id2Ch(mTxChId); - } + return id2Ch(iv->txRfChId); } - void setGotAll(void) { - updateQuality(2); // GOOD + void setGotAll(Inverter<> *iv) { + updateQuality(iv, 2); // GOOD } - void setGotFragment(void) { - updateQuality(1); // OK + void setGotFragment(Inverter<> *iv) { + updateQuality(iv, 1); // OK } - void setGotNothing(void) { - updateQuality(-2); // BAD + void setGotNothing(Inverter<> *iv) { + updateQuality(iv, -2); // BAD } - void printStatus(void) { - DPRINT(DBG_INFO, F("Status: #")); - DBGPRINT(String(mCycleCnt)); + void printStatus(Inverter<> *iv) { + DPRINT(DBG_INFO, F("Status:")); DBGPRINT(F(" |")); for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { DBGPRINT(F(" ")); - DBGPRINT(String(mTxQuality[i])); + DBGPRINT(String(iv->txRfQuality[i])); } DBGPRINTLN(""); } private: - void updateQuality(uint8_t quality) { - mTxQuality[mTxChId] += quality; - if(mTxQuality[mTxChId] > RF_MAX_QUALITY) - mTxQuality[mTxChId] = RF_MAX_QUALITY; - else if(mTxQuality[mTxChId] < RF_MIN_QUALTIY) - mTxQuality[mTxChId] = RF_MIN_QUALTIY; + void updateQuality(Inverter<> *iv, uint8_t quality) { + iv->txRfQuality[iv->txRfChId] += quality; + if(iv->txRfQuality[iv->txRfChId] > RF_MAX_QUALITY) + iv->txRfQuality[iv->txRfChId] = RF_MAX_QUALITY; + else if(iv->txRfQuality[iv->txRfChId] < RF_MIN_QUALTIY) + iv->txRfQuality[iv->txRfChId] = RF_MIN_QUALTIY; } - uint8_t ch2Id(uint8_t ch) { + /*uint8_t ch2Id(uint8_t ch) { switch(ch) { case 3: return 0; case 23: return 1; @@ -112,9 +75,9 @@ class Heuristic { case 75: return 4; } return 0; // standard - } + }*/ - uint8_t id2Ch(uint8_t id) { + inline uint8_t id2Ch(uint8_t id) { switch(id) { case 0: return 3; case 1: return 23; @@ -125,22 +88,8 @@ class Heuristic { return 0; // standard } - private: - enum class States : uint8_t { - TRAINING, RUNNING - }; - private: uint8_t mChList[5] = {03, 23, 40, 61, 75}; - - int8_t mTxQuality[RF_MAX_CHANNEL_ID]; - uint8_t mTxChId = 0; - - uint8_t mRxCh[RF_MAX_CHANNEL_ID][10]; - uint8_t mRxChId = 0; - - uint32_t mCycleCnt = 0; - States mState = States::TRAINING; }; diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index d1a1e43a..6cb2567e 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -78,31 +78,6 @@ struct alarm_t { alarm_t() : code(0), start(0), end(0) {} }; -class CommandAbstract { - public: - CommandAbstract(uint8_t txType = 0, uint8_t cmd = 0) { - _TxType = txType; - _Cmd = cmd; - }; - virtual ~CommandAbstract() {}; - - uint8_t getCmd() const { - return _Cmd; - } - - protected: - uint8_t _TxType; - uint8_t _Cmd; -}; - -class InfoCommand : public CommandAbstract { - public: - InfoCommand(uint8_t cmd){ - _TxType = 0x15; - _Cmd = cmd; - } -}; - // list of all available functions, mapped in hmDefines.h template const calcFunc_t calcFunctions[] = { @@ -153,7 +128,8 @@ class Inverter { int8_t rssi; // RSSI Radio *radio; // pointer to associated radio class statistics_t radioStatistics; // information about transmitted, failed, ... packets - + int8_t txRfQuality[5]; // heuristics tx quality (check 'Heuristics.h') + uint8_t txRfChId; // RF TX channel id static uint32_t *timestamp; // system timestamp static cfgInst_t *generalConfig; // general inverter configuration from setup @@ -175,10 +151,7 @@ class Inverter { alarmLastId = 0; rssi = -127; memset(&radioStatistics, 0, sizeof(statistics_t)); - } - - ~Inverter() { - // TODO: cleanup + memset(txRfQuality, -6, 5); } void tickSend(std::function cb) { @@ -194,7 +167,10 @@ class Inverter { cb(InverterDevInform_Simple, false); // get hardware version else if(actPowerLimit == 0xffff) cb(SystemConfigPara, false); // power limit info - else + else if(InitDataState != devControlCmd) { + cb(devControlCmd, false); // custom command which was received by API + devControlCmd = InitDataState; + } else cb(RealTimeRunData_Debug, false); // get live data } else { if(0 == getFwVersion()) @@ -209,57 +185,6 @@ class Inverter { } } - /*template - void enqueCommand(uint8_t cmd) { - _commandQueue.push(std::make_shared(cmd)); - DPRINT_IVID(DBG_INFO, id); - DBGPRINT(F("enqueCommand: 0x")); - DBGHEXLN(cmd); - } - - void setQueuedCmdFinished() { - if (!_commandQueue.empty()) { - _commandQueue.pop(); - } - } - - void clearCmdQueue() { - DPRINTLN(DBG_INFO, F("clearCmdQueue")); - while (!_commandQueue.empty()) { - _commandQueue.pop(); - } - } - - uint8_t getQueuedCmd() { - if (_commandQueue.empty()) { - if (ivGen != IV_MI) { - if (getFwVersion() == 0) - enqueCommand(InverterDevInform_All); // firmware version - else if (getHwVersion() == 0) - enqueCommand(InverterDevInform_Simple); // hardware version - else if((alarmLastId != alarmMesIndex) && (alarmMesIndex != 0)) - enqueCommand(AlarmData); // alarm not answered - enqueCommand(RealTimeRunData_Debug); // live data - } else { // if (ivGen == IV_MI){ - if (getFwVersion() == 0) { - enqueCommand(InverterDevInform_All); // hard- and firmware version - } else { - record_t<> *rec = getRecordStruct(InverterDevInform_Simple); - if (getChannelFieldValue(CH0, FLD_PART_NUM, rec) == 0) { - enqueCommand(InverterDevInform_All); // hard- and firmware version for missing HW part nr, delivered by frame 1 - } else { - enqueCommand( type == INV_TYPE_4CH ? 0x36 : 0x09 ); - } - } - } - - if ((actPowerLimit == 0xffff) && isConnected) - enqueCommand(SystemConfigPara); // power limit info - } - return _commandQueue.front().get()->getCmd(); - }*/ - - void init(void) { DPRINTLN(DBG_VERBOSE, F("hmInverter.h:init")); initAssignment(&recordMeas, RealTimeRunData_Debug); @@ -318,8 +243,10 @@ class Inverter { return isConnected; } - void clearDevControlRequest() { - mDevControlRequest = false; + bool setDevCommand(uint8_t cmd) { + if(isConnected) + devControlCmd = cmd; + return isConnected; } void addValue(uint8_t pos, uint8_t buf[], record_t<> *rec) { @@ -359,11 +286,9 @@ class Inverter { if (getPosByChFld(0, FLD_EVT, rec) == pos) { if (alarmMesIndex < rec->record[pos]) { alarmMesIndex = rec->record[pos]; - //enqueCommand(AlarmUpdate); // What is the function of AlarmUpdate? DPRINT(DBG_INFO, "alarm ID incremented to "); DBGPRINTLN(String(alarmMesIndex)); - //enqueCommand(AlarmData); } } } @@ -740,7 +665,6 @@ class Inverter { radioId.b[0] = 0x01; } - //std::queue> _commandQueue; bool mDevControlRequest; // true if change needed }; diff --git a/src/hm/hmPayload.h b/src/hm/hmPayload.h deleted file mode 100644 index 1f4ef550..00000000 --- a/src/hm/hmPayload.h +++ /dev/null @@ -1,494 +0,0 @@ -//----------------------------------------------------------------------------- -// 2023 Ahoy, https://ahoydtu.de -// Creative Commons - https://creativecommons.org/licenses/by-nc-sa/4.0/deed -//----------------------------------------------------------------------------- - -#ifndef __HM_PAYLOAD_H__ -#define __HM_PAYLOAD_H__ - -#include "../utils/dbg.h" -#include "../utils/crc.h" -#include "../config/config.h" -#include "hmRadio.h" -#if defined(ESP32) -#include "../hms/cmt2300a.h" -#endif -#include - -#define HMS_TIMEOUT_SEC 30 - -typedef struct { - uint8_t txCmd; - uint8_t txId; - uint32_t ts; - uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE]; - int8_t rssi[MAX_PAYLOAD_ENTRIES]; - uint8_t len[MAX_PAYLOAD_ENTRIES]; - bool complete; - uint8_t maxPackId; - bool lastFound; - uint8_t retransmits; - bool requested; - bool gotFragment; - bool rxTmo; - uint32_t sendMillis; -} invPayload_t; - - -typedef std::function *)> payloadListenerType; -typedef std::function *)> alarmListenerType; - - -template -class HmPayload { - public: - HmPayload() {} - - void setup(IApp *app, HMSYSTEM *sys, uint32_t *timestamp) { - mApp = app; - mSys = sys; - mMaxRetrans = 5; - mTimestamp = timestamp; - for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { - reset(i); - mIvCmd56Cnt[i] = 0; - } - mSerialDebug = false; - mHighPrioIv = NULL; - mCbAlarm = NULL; - mCbPayload = NULL; - } - - void enableSerialDebug(bool enable) { - mSerialDebug = enable; - } - - void addPayloadListener(payloadListenerType cb) { - mCbPayload = cb; - } - - void addAlarmListener(alarmListenerType cb) { - mCbAlarm = cb; - } - - void loop() { - if (NULL != mHighPrioIv) { - ivSend(mHighPrioIv, true); // for e.g. devcontrol commands - mHighPrioIv = NULL; - } - } - - /*void simulation() { - uint8_t pay[] = { - 0x00, 0x01, 0x01, 0x24, 0x02, 0x28, 0x02, 0x33, - 0x06, 0x49, 0x06, 0x6a, 0x00, 0x05, 0x5f, 0x1b, - 0x00, 0x06, 0x66, 0x9a, 0x03, 0xfd, 0x04, 0x0b, - 0x01, 0x23, 0x02, 0x28, 0x02, 0x28, 0x06, 0x41, - 0x06, 0x43, 0x00, 0x05, 0xdc, 0x2c, 0x00, 0x06, - 0x2e, 0x3f, 0x04, 0x01, 0x03, 0xfb, 0x09, 0x78, - 0x13, 0x86, 0x18, 0x15, 0x00, 0xcf, 0x00, 0xfe, - 0x03, 0xe7, 0x01, 0x42, 0x00, 0x03 - }; - - Inverter<> *iv = mSys->getInverterByPos(0); - record_t<> *rec = iv->getRecordStruct(0x0b); - rec->ts = *mTimestamp; - for (uint8_t i = 0; i < rec->length; i++) { - iv->addValue(i, pay, rec); - yield(); - } - iv->doCalculations(); - notify(0x0b, iv); - }*/ - - void ivSendHighPrio(Inverter<> *iv) { - mHighPrioIv = iv; - } - - void ivSend(Inverter<> *iv, bool highPrio = false) { - if(!highPrio) { - if (mPayload[iv->id].requested) { - if (!mPayload[iv->id].complete) - process(false); // no retransmit - - if (!mPayload[iv->id].complete) { - if (mSerialDebug) - DPRINT_IVID(DBG_INFO, iv->id); - if (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId) { - iv->radioStatistics.rxFailNoAnser++; // got nothing - if (mSerialDebug) - DBGPRINTLN(F("enqueued cmd failed/timeout")); - } else { - iv->radioStatistics.rxFail++; // got fragments but not complete response - if (mSerialDebug) { - DBGPRINT(F("no complete Payload received! (retransmits: ")); - DBGPRINT(String(mPayload[iv->id].retransmits)); - DBGPRINTLN(F(")")); - } - } - iv->setQueuedCmdFinished(); // command failed - } - } - } - - reset(iv->id, !iv->isAvailable()); - mPayload[iv->id].requested = true; - - yield(); - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("Requesting Inv SN ")); - DBGPRINTLN(String(iv->config->serial.u64, HEX)); - } - - if (iv->getDevControlRequest()) { - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("Devcontrol request 0x")); - DHEX(iv->devControlCmd); - DBGPRINT(F(" power limit ")); - DBGPRINTLN(String(iv->powerLimit[0])); - } - iv->powerLimitAck = false; - iv->radio->sendControlPacket(iv, iv->devControlCmd, iv->powerLimit, false); - mPayload[iv->id].txCmd = iv->devControlCmd; - //iv->clearCmdQueue(); - //iv->enqueCommand(SystemConfigPara); // read back power limit - } else { - #if defined(ESP32) - if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) { - record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); - if(((rec->ts + HMS_TIMEOUT_SEC) < *mTimestamp) && (mIvCmd56Cnt[iv->id] < 3)) { - iv->radio->switchFrequency(iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); - mIvCmd56Cnt[iv->id]++; - return; - } else if(++mIvCmd56Cnt[iv->id] == 10) - mIvCmd56Cnt[iv->id] = 0; - } - #endif - uint8_t cmd = iv->getQueuedCmd(); - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("prepareDevInformCmd 0x")); - DBGHEXLN(cmd); - } - iv->radio->prepareDevInformCmd(iv, cmd, mPayload[iv->id].ts, iv->alarmLastId, false); - mPayload[iv->id].txCmd = cmd; - } - } - - void add(Inverter<> *iv, packet_t *p) { - if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command - mPayload[iv->id].txId = p->packet[0]; - DPRINTLN(DBG_DEBUG, F("Response from info request received")); - uint8_t *pid = &p->packet[9]; - if (*pid == 0x00) { - DPRINTLN(DBG_DEBUG, F("fragment number zero received and ignored")); - } else { - DPRINT(DBG_DEBUG, F("PID: 0x")); - DPRINTLN(DBG_DEBUG, String(*pid, HEX)); - if ((*pid & 0x7F) < MAX_PAYLOAD_ENTRIES) { - memcpy(mPayload[iv->id].data[(*pid & 0x7F) - 1], &p->packet[10], p->len - 11); - mPayload[iv->id].len[(*pid & 0x7F) - 1] = p->len - 11; - mPayload[iv->id].gotFragment = true; - mPayload[iv->id].rssi[(*pid & 0x7F) - 1] = p->rssi; - } - - if ((*pid & ALL_FRAMES) == ALL_FRAMES) { - // Last packet - if (((*pid & 0x7f) > mPayload[iv->id].maxPackId) || (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId)) { - mPayload[iv->id].maxPackId = (*pid & 0x7f); - if (*pid > 0x81) - mPayload[iv->id].lastFound = true; - } - } - } - } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) { // response from dev control command - DPRINTLN(DBG_DEBUG, F("Response from devcontrol request received")); - - mPayload[iv->id].txId = p->packet[0]; - iv->clearDevControlRequest(); - - if ((p->packet[12] == ActivePowerContr) && (p->packet[13] == 0x00)) { - bool ok = true; - if((p->packet[10] == 0x00) && (p->packet[11] == 0x00)) { - mApp->setMqttPowerLimitAck(iv); - iv->powerLimitAck = true; - } else - ok = false; - - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F(" has ")); - if(!ok) DBGPRINT(F("not ")); - DBGPRINT(F("accepted power limit set point ")); - DBGPRINT(String(iv->powerLimit[0])); - DBGPRINT(F(" with PowerLimitControl ")); - DBGPRINTLN(String(iv->powerLimit[1])); - } - - iv->clearCmdQueue(); - iv->enqueCommand(SystemConfigPara); // read back power limit - if(mHighPrioIv == NULL) // do it immediately if possible - mHighPrioIv = iv; - } - iv->devControlCmd = Init; - } - } - - void process(bool retransmit) { - for (uint8_t id = 0; id < mSys->getNumInverters(); id++) { - Inverter<> *iv = mSys->getInverterByPos(id); - if (NULL == iv) - continue; // skip to next inverter - - if ((mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && (0 != mPayload[iv->id].txId)) { - // no processing needed if txId is not 0x95 - mPayload[iv->id].complete = true; - continue; // skip to next inverter - } - - if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) { - if((mPayload[iv->id].sendMillis + 400) > millis()) - return; // to fast, wait until packets are received! - } - - if (!mPayload[iv->id].complete) { - bool crcPass, pyldComplete, fastNext; - - crcPass = build(iv, &pyldComplete, &fastNext); - if (!crcPass && !pyldComplete) { // payload not complete - if ((mPayload[iv->id].requested) && (retransmit)) { - if (mPayload[iv->id].retransmits < mMaxRetrans) { - mPayload[iv->id].retransmits++; - if (iv->devControlCmd == Restart || iv->devControlCmd == CleanState_LockAndAlarm) { - // This is required to prevent retransmissions without answer. - DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm...")); - mPayload[iv->id].retransmits = mMaxRetrans; - } else if(iv->devControlCmd == ActivePowerContr) { - DPRINT_IVID(DBG_INFO, iv->id); - DPRINTLN(DBG_INFO, F("retransmit power limit")); - iv->radio->sendControlPacket(iv, iv->devControlCmd, iv->powerLimit, true); - } else { - if(false == mPayload[iv->id].gotFragment) { - DPRINT_IVID(DBG_WARN, iv->id); - if (mPayload[iv->id].rxTmo) { - DBGPRINTLN(F("nothing received")); - mPayload[iv->id].retransmits = mMaxRetrans; - } else { - DBGPRINTLN(F("nothing received: complete retransmit")); - mPayload[iv->id].txCmd = iv->getQueuedCmd(); - DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") prepareDevInformCmd 0x") + String(mPayload[iv->id].txCmd, HEX)); - iv->radio->prepareDevInformCmd(iv, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true); - } - } else { - for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId - 1); i++) { - if (mPayload[iv->id].len[i] == 0) { - if (mSerialDebug) { - DPRINT_IVID(DBG_WARN, iv->id); - DBGPRINT(F("Frame ")); - DBGPRINT(String(i + 1)); - DBGPRINTLN(F(" missing: Request Retransmit")); - } - iv->radio->sendCmdPacket(iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); - break; // only request retransmit one frame per loop - } - yield(); - } - } - } - } - } else if (false == mPayload[iv->id].gotFragment) { - // only if there is no sign of life - mPayload[iv->id].rxTmo = true; // inv might be down, no complete retransmit anymore - } - } else if(!crcPass && pyldComplete) { // crc error on complete Payload - if (mPayload[iv->id].retransmits < mMaxRetrans) { - mPayload[iv->id].retransmits++; - mPayload[iv->id].txCmd = iv->getQueuedCmd(); - if (mSerialDebug) { - DPRINT_IVID(DBG_WARN, iv->id); - DBGPRINTLN(F("CRC Error: Request Complete Retransmit")); - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("prepareDevInformCmd 0x")); - DBGHEXLN(mPayload[iv->id].txCmd); - } - iv->radio->prepareDevInformCmd(iv, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmLastId, true); - } - } else { // payload complete - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("procPyld: cmd: 0x")); - DBGHEXLN(mPayload[iv->id].txCmd); - //DPRINT(DBG_DEBUG, F("procPyld: txid: 0x")); - //DBGHEXLN(mPayload[iv->id].txId); - DPRINT(DBG_DEBUG, F("procPyld: max: ")); - DPRINTLN(DBG_DEBUG, String(mPayload[iv->id].maxPackId)); - } - record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser - mPayload[iv->id].complete = true; - mPayload[iv->id].requested = false; - mPayload[iv->id].rxTmo = false; - - uint8_t payload[MAX_BUFFER]; - uint8_t payloadLen = 0; - - memset(payload, 0, MAX_BUFFER); - - int8_t rssi = -127; - - for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { - if((mPayload[iv->id].len[i] + payloadLen) > MAX_BUFFER) { - DPRINTLN(DBG_ERROR, F("payload buffer to small!")); - break; - } - memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); - payloadLen += (mPayload[iv->id].len[i]); - // get worst RSSI - if(mPayload[iv->id].rssi[i] > rssi) - rssi = mPayload[iv->id].rssi[i]; - yield(); - } - payloadLen -= 2; - - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("Payload (")); - DBGPRINT(String(payloadLen)); - DBGPRINT(F("): ")); - ah::dumpBuf(payload, payloadLen); - } - - if (NULL == rec) { - DPRINTLN(DBG_ERROR, F("record is NULL!")); - } else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { - if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) - iv->radioStatistics.rxSuccess++; - - rec->ts = mPayload[iv->id].ts; - for (uint8_t i = 0; i < rec->length; i++) { - iv->addValue(i, payload, rec); - yield(); - } - iv->rssi = rssi; - iv->doCalculations(); - notify(mPayload[iv->id].txCmd, iv); - - if(AlarmData == mPayload[iv->id].txCmd) { - uint8_t i = 0; - while(1) { - if(0 == iv->parseAlarmLog(i++, payload, payloadLen)) - break; - if (NULL != mCbAlarm) - (mCbAlarm)(iv); - yield(); - } - } - if (fastNext && (mHighPrioIv == NULL)) { - /*iv->setQueuedCmdFinished(); - uint8_t cmd = iv->getQueuedCmd(); - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("fast mode ")); - DBGPRINT(F("prepareDevInformCmd 0x")); - DBGHEXLN(cmd); - } - iv->radioStatistics.rxSuccess++; - iv->radio->prepareDevInformCmd(iv, cmd, mPayload[iv->id].ts, iv->alarmLastId, false); - mPayload[iv->id].txCmd = cmd; - */ - mHighPrioIv = iv; - } - - } else { - if (mSerialDebug) { - DPRINT(DBG_ERROR, F("plausibility check failed, expected ")); - DBGPRINT(String(rec->pyldLen)); - DBGPRINTLN(F(" bytes")); - } - iv->radioStatistics.rxFail++; - } - - iv->setQueuedCmdFinished(); - } - } - yield(); - } - } - - private: - void notify(uint8_t val, Inverter<> *iv) { - if(NULL != mCbPayload) - (mCbPayload)(val, iv); - } - - bool build(Inverter<> *iv, bool *complete, bool *fastNext ) { - DPRINTLN(DBG_VERBOSE, F("build")); - uint16_t crc = 0xffff, crcRcv = 0x0000; - if (mPayload[iv->id].maxPackId > MAX_PAYLOAD_ENTRIES) - mPayload[iv->id].maxPackId = MAX_PAYLOAD_ENTRIES; - - // check if all fragments are there - *complete = true; - *fastNext = false; - for (uint8_t i = 0; i < mPayload[iv->id].maxPackId; i++) { - if(mPayload[iv->id].len[i] == 0) { - *complete = false; - } - } - if(!*complete) - return false; - - for (uint8_t i = 0; i < mPayload[iv->id].maxPackId; i++) { - if (mPayload[iv->id].len[i] > 0) { - if (i == (mPayload[iv->id].maxPackId - 1)) { - crc = ah::crc16(mPayload[iv->id].data[i], mPayload[iv->id].len[i] - 2, crc); - crcRcv = (mPayload[iv->id].data[i][mPayload[iv->id].len[i] - 2] << 8) | (mPayload[iv->id].data[i][mPayload[iv->id].len[i] - 1]); - } else - crc = ah::crc16(mPayload[iv->id].data[i], mPayload[iv->id].len[i], crc); - } - yield(); - } - - //return (crc == crcRcv) ? true : false; - if (crc != crcRcv) - return false; - - //requests to cause the next request to be executed immediately - if (mPayload[iv->id].gotFragment && ((mPayload[iv->id].txCmd < RealTimeRunData_Debug) || (mPayload[iv->id].txCmd >= AlarmData))) { - *fastNext = true; - } - - return true; - } - - void reset(uint8_t id, bool setTxTmo = true) { - //DPRINT_IVID(DBG_INFO, id); - //DBGPRINTLN(F("resetPayload")); - memset(mPayload[id].len, 0, MAX_PAYLOAD_ENTRIES); - mPayload[id].txCmd = 0; - mPayload[id].gotFragment = false; - mPayload[id].retransmits = 0; - mPayload[id].maxPackId = MAX_PAYLOAD_ENTRIES; - mPayload[id].lastFound = false; - mPayload[id].complete = false; - mPayload[id].requested = false; - mPayload[id].ts = *mTimestamp; - mPayload[id].rxTmo = setTxTmo; // design: don't start with complete retransmit - mPayload[id].sendMillis = millis(); - } - - IApp *mApp; - HMSYSTEM *mSys; - uint8_t mMaxRetrans; - uint32_t *mTimestamp; - invPayload_t mPayload[MAX_NUM_INVERTERS]; - uint8_t mIvCmd56Cnt[MAX_NUM_INVERTERS]; - bool mSerialDebug; - Inverter<> *mHighPrioIv; - - alarmListenerType mCbAlarm; - payloadListenerType mCbPayload; -}; - -#endif /*__HM_PAYLOAD_H__*/ diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index fc4f2069..203f39aa 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -9,7 +9,6 @@ #include #include "SPI.h" #include "radio.h" -#include "heuristic.h" #define SPI_SPEED 1000000 @@ -41,18 +40,6 @@ class HmRadio : public Radio { } mDtuSn = DTU_SN; - // Depending on the program, the module can work on 2403, 2423, 2440, 2461 or 2475MHz. - // Channel List 2403, 2423, 2440, 2461, 2475MHz - mRfChLst[0] = 03; - mRfChLst[1] = 23; - mRfChLst[2] = 40; - mRfChLst[3] = 61; - mRfChLst[4] = 75; - - // default channels - mTxChIdx = 2; // Start TX with 40 - mRxChIdx = 0; // Start RX with 03 - mSerialDebug = false; mIrqRcvd = false; } @@ -78,8 +65,6 @@ class HmRadio : public Radio { mSpi->begin(); #endif - mHeu.setup(); - mNrf24.begin(mSpi, ce, cs); mNrf24.setRetries(3, 15); // 3*250us + 250us and 15 loops -> 15ms @@ -123,6 +108,9 @@ class HmRadio : public Radio { mNrf24.setChannel(mRfChLst[mRxChIdx]); mNrf24.startListening(); + if(NULL == mLastIv) // prevent reading on NULL object! + return; + uint32_t startMicros = micros() + 5110; uint32_t loopMillis = millis() + 400; while (millis() < loopMillis) { @@ -130,12 +118,9 @@ class HmRadio : public Radio { if (mIrqRcvd) { mIrqRcvd = false; - if (getReceived()) { // everything received - mHeu.setGotAll(); + if (getReceived()) { // everything received return; - } else - mHeu.setGotFragment(); - + } } yield(); } @@ -148,10 +133,7 @@ class HmRadio : public Radio { // not finished but time is over if(++mRxChIdx >= RF_CHANNELS) mRxChIdx = 0; - if(mBufCtrl.empty()) - mHeu.setGotNothing(); - mHeu.printStatus(); return; } @@ -290,7 +272,7 @@ class HmRadio : public Radio { updateCrcs(&len, appendCrc16); // set TX and RX channels - mTxChIdx = mHeu.getTxCh(); + mTxChIdx = mRfChLst[iv->txRfChId]; if(mSerialDebug) { DPRINT_IVID(DBG_INFO, iv->id); @@ -307,6 +289,8 @@ class HmRadio : public Radio { mNrf24.openWritingPipe(reinterpret_cast(&iv->radioId.u64)); mNrf24.startWrite(mTxBuf, len, false); // false = request ACK response mMillis = millis(); + + mLastIv = iv; } uint64_t getIvId(Inverter<> *iv) { @@ -318,14 +302,14 @@ class HmRadio : public Radio { } uint64_t DTU_RADIO_ID; - uint8_t mRfChLst[RF_CHANNELS]; - uint8_t mTxChIdx; - uint8_t mRxChIdx; + uint8_t mRfChLst[RF_CHANNELS] = {03, 23, 40, 61, 75}; // channel List:2403, 2423, 2440, 2461, 2475MHz + uint8_t mTxChIdx = 0; + uint8_t mRxChIdx = 0; uint32_t mMillis; SPIClass* mSpi; RF24 mNrf24; - Heuristic mHeu; + Inverter<> *mLastIv = NULL; }; #endif /*__HM_RADIO_H__*/ diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h deleted file mode 100644 index 94f7a9b3..00000000 --- a/src/hm/miPayload.h +++ /dev/null @@ -1,844 +0,0 @@ -//----------------------------------------------------------------------------- -// 2023 Ahoy, https://ahoydtu.de -// Creative Commons - https://creativecommons.org/licenses/by-nc-sa/4.0/deed -//----------------------------------------------------------------------------- - -#ifndef __MI_PAYLOAD_H__ -#define __MI_PAYLOAD_H__ -#include "../utils/dbg.h" -#include "../utils/crc.h" -#include "../config/config.h" -#include - -#define MI_REQ_CH1 0x09 -#define MI_REQ_CH2 0x11 -#define MI_REQ_4CH 0x36 - -typedef struct { - uint32_t ts; - bool requested; - bool limitrequested; - uint8_t txCmd; - uint8_t len[MAX_PAYLOAD_ENTRIES]; - int8_t rssi[4]; - bool complete; - bool dataAB[3]; - bool stsAB[3]; - uint16_t sts[5]; - uint8_t txId; - uint8_t invId; - uint8_t retransmits; - bool gotFragment; - bool gotGPF; - uint8_t rtrRes; // for limiting resets - uint8_t multi_parts; // for quality - bool rxTmo; -} miPayload_t; - - -typedef std::function *)> miPayloadListenerType; - - -template -class MiPayload { - public: - MiPayload() {} - - void setup(IApp *app, HMSYSTEM *sys, uint32_t *timestamp) { - mApp = app; - mSys = sys; - mMaxRetrans = 5; - mTimestamp = timestamp; - for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { - reset(i, false, true); - mPayload[i].limitrequested = false; - mPayload[i].gotGPF = false; - } - mSerialDebug = false; - mHighPrioIv = NULL; - mCbPayload = NULL; - } - - void enableSerialDebug(bool enable) { - mSerialDebug = enable; - } - - void addPayloadListener(miPayloadListenerType cb) { - mCbPayload = cb; - } - - void addAlarmListener(alarmListenerType cb) { - mCbAlarm = cb; - } - - void loop() { - if (NULL != mHighPrioIv) { - ivSend(mHighPrioIv, true); // for e.g. devcontrol commands - mHighPrioIv = NULL; - } - } - - void ivSendHighPrio(Inverter<> *iv) { - mHighPrioIv = iv; - } - - void ivSend(Inverter<> *iv, bool highPrio = false) { - if(!highPrio) { - if (mPayload[iv->id].requested) { - if (!mPayload[iv->id].complete) - process(false); // no retransmit - - if (!mPayload[iv->id].complete && mPayload[iv->id].rxTmo) { - if (mSerialDebug) - DPRINT_IVID(DBG_INFO, iv->id); - if (!mPayload[iv->id].gotFragment) { - iv->radioStatistics.rxFailNoAnser++; // got nothing - if (mSerialDebug) - DBGPRINTLN(F("enqueued cmd failed/timeout")); - } else { - iv->radioStatistics.rxFail++; // got "fragments" (part of the required messages) - // but no complete set of responses - if (mSerialDebug) { - DBGPRINT(F("no complete Payload received! (retransmits: ")); - DBGPRINT(String(mPayload[iv->id].retransmits)); - DBGPRINTLN(F(")")); - } - } - mPayload[iv->id].rxTmo = true; - mPayload[iv->id].complete = true; - iv->setQueuedCmdFinished(); // command failed - } - } - } - - reset(iv->id, !iv->isAvailable()); - mPayload[iv->id].requested = true; - - yield(); - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("Requesting Inv SN ")); - DBGPRINTLN(String(iv->config->serial.u64, HEX)); - } - - if (iv->getDevControlRequest()) { - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("Devcontrol request 0x")); - DHEX(iv->devControlCmd); - DBGPRINT(F(" power limit ")); - DBGPRINT(String(iv->powerLimit[0])); - DBGPRINT(F(" with PowerLimitControl ")); - DBGPRINTLN(String(iv->powerLimit[1])); - } - iv->powerLimitAck = false; - iv->radio->sendControlPacket(iv, iv->devControlCmd, iv->powerLimit, false, false, (iv->powerLimit[1] == RelativNonPersistent) ? 0 : iv->getMaxPower()); - mPayload[iv->id].txCmd = iv->devControlCmd; - mPayload[iv->id].limitrequested = true; - - iv->clearCmdQueue(); - } else { - uint8_t cmd = iv->getQueuedCmd(); - uint8_t cmd2 = cmd; - if ( cmd == SystemConfigPara ) { //0x05 for HM-types - if (!mPayload[iv->id].gotGPF) { - iv->setQueuedCmdFinished(); - cmd = iv->getQueuedCmd(); - } - } - - if (cmd == 0x01) { //0x1 for HM-types - cmd2 = 0x00; - cmd = 0x0f; // for MI, these seem to make part of polling the device software and hardware version number command - } else if (cmd == SystemConfigPara ) { // 0x05 for HM-types - cmd2 = 0x00; - cmd = 0x10; // legacy GPF request - } - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("legacy cmd 0x")); - DBGHEXLN(cmd); - } - iv->radio->sendCmdPacket(iv, cmd, cmd2, false, false); - - mPayload[iv->id].txCmd = cmd; - if (iv->type == INV_TYPE_1CH || iv->type == INV_TYPE_2CH) { - mPayload[iv->id].dataAB[CH1] = false; - mPayload[iv->id].stsAB[CH1] = false; - mPayload[iv->id].dataAB[CH0] = false; - mPayload[iv->id].stsAB[CH0] = false; - if (iv->type == INV_TYPE_2CH) { - mPayload[iv->id].dataAB[CH2] = false; - mPayload[iv->id].stsAB[CH2] = false; - } - } - } - } - - void add(Inverter<> *iv, packet_t *p) { - //DPRINTLN(DBG_INFO, F("MI got data [0]=") + String(p->packet[0], HEX)); - if (p->packet[0] == (0x88)) { // 0x88 is MI status response to 0x09 - miStsDecode(iv, p); - } - - else if (p->packet[0] == (MI_REQ_CH2 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11 - miStsDecode(iv, p, CH2); - - } else if ( p->packet[0] == MI_REQ_CH1 + ALL_FRAMES || - p->packet[0] == MI_REQ_CH2 + ALL_FRAMES || - ( p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) - && mPayload[iv->id].txCmd != 0x0f) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39 - mPayload[iv->id].txId = p->packet[0]; - miDataDecode(iv,p); - - } else if (p->packet[0] == ( 0x0f + ALL_FRAMES)) { - // MI response from get hardware information request - miHwDecode(iv, p); - mPayload[iv->id].txId = p->packet[0]; - - } else if (p->packet[0] == ( 0x10 + ALL_FRAMES)) { - // MI response from get Grid Profile information request - miGPFDecode(iv, p); - mPayload[iv->id].txId = p->packet[0]; - - } else if ( p->packet[0] == (TX_REQ_INFO + ALL_FRAMES) // response from get information command - || (p->packet[0] == 0xB6 && mPayload[iv->id].txCmd != MI_REQ_4CH)) { // strange short response from MI-1500 3rd gen; might be misleading! - // atm, we just do nothing else than print out what we got... - // for decoding see xls- Data collection instructions - #147ff - //mPayload[iv->id].txId = p->packet[0]; - DPRINTLN(DBG_DEBUG, F("Response from info request received")); - uint8_t *pid = &p->packet[9]; - if (*pid == 0x00) { - DPRINT(DBG_DEBUG, F("fragment number zero received")); - iv->setQueuedCmdFinished(); - } else if (p->packet[9] == 0x81) { // might need some additional check, as this is only meant for short answers! - DPRINT_IVID(DBG_WARN, iv->id); - DBGPRINTLN(F("seems to use 3rd gen. protocol - switching ivGen!")); - iv->ivGen = IV_HM; - iv->setQueuedCmdFinished(); - iv->clearCmdQueue(); - } - } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES ) // response from dev control command - || p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES -1)) { // response from DRED instruction -#if DEBUG_LEVEL >= DBG_DEBUG - if (mSerialDebug) { - DPRINT_IVID(DBG_DEBUG, iv->id); - DBGPRINTLN(F("Response from devcontrol request received")); - } -#endif - mPayload[iv->id].txId = p->packet[0]; - iv->clearDevControlRequest(); - - if ((p->packet[9] == 0x5a) && (p->packet[10] == 0x5a)) { - mApp->setMqttPowerLimitAck(iv); - iv->powerLimitAck = true; - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("has accepted power limit set point ")); - DBGPRINT(String(iv->powerLimit[0])); - DBGPRINT(F(" with PowerLimitControl ")); - DBGPRINTLN(String(iv->powerLimit[1])); - } - iv->clearCmdQueue(); - //does not work for MI - //iv->enqueCommand(SystemConfigPara); // read back power limit - } - iv->devControlCmd = Init; - } else { // some other response; copied from hmPayload:process; might not be correct to do that here!!! - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO,iv->id); - DBGPRINT(F("procPyld: cmd: 0x")); - DBGHEXLN(mPayload[iv->id].txCmd); - DPRINT_IVID(DBG_INFO,iv->id); - DBGPRINT(F("procPyld: txid: 0x")); - DBGHEXLN(mPayload[iv->id].txId); - } - - record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser - mPayload[iv->id].complete = true; - - uint8_t payload[128]; - uint8_t payloadLen = 0; - - memset(payload, 0, 128); - - payloadLen -= 2; - - if (mSerialDebug) { - DPRINT(DBG_INFO, F("Payload (")); - DBGPRINT(String(payloadLen)); - DBGPRINT("): "); - ah::dumpBuf(payload, payloadLen); - } - - if (NULL == rec) { - DPRINTLN(DBG_ERROR, F("record is NULL!")); - } else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { - if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) - iv->radioStatistics.rxSuccess++; - - rec->ts = mPayload[iv->id].ts; - for (uint8_t i = 0; i < rec->length; i++) { - iv->addValue(i, payload, rec); - yield(); - } - iv->doCalculations(); - notify(mPayload[iv->id].txCmd, iv); - - if(AlarmData == mPayload[iv->id].txCmd) { - uint8_t i = 0; - while(1) { - if(0 == iv->parseAlarmLog(i++, payload, payloadLen)) - break; - if (NULL != mCbAlarm) - (mCbAlarm)(iv); - yield(); - } - } - } else { - DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); - iv->radioStatistics.rxFail++; - } - - iv->setQueuedCmdFinished(); - } - } - - void process(bool retransmit) { - for (uint8_t id = 0; id < mSys->getNumInverters(); id++) { - Inverter<> *iv = mSys->getInverterByPos(id); - if (NULL == iv) - continue; // skip to next inverter - - if (IV_MI != iv->ivGen) // only process MI inverters - continue; // skip to next inverter - - if ( !mPayload[iv->id].complete && - (mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && - (mPayload[iv->id].txId < (MI_REQ_4CH + ALL_FRAMES)) && - (mPayload[iv->id].txId > (0x39 + ALL_FRAMES)) && - (mPayload[iv->id].txId != (MI_REQ_CH1 + ALL_FRAMES)) && - (mPayload[iv->id].txId != (MI_REQ_CH2 + ALL_FRAMES)) && - (mPayload[iv->id].txId != (0x88)) && - (mPayload[iv->id].txId != (0x92)) && - (mPayload[iv->id].txId != 0) && - mPayload[iv->id].txCmd != 0x0f && - !iv->getDevControlRequest()) { - // no processing needed if txId is not one of 0x95, 0x88, 0x89, 0x91, 0x92 or response to 0x36ff - mPayload[iv->id].complete = true; - mPayload[iv->id].rxTmo = true; - continue; // skip to next inverter - } - - if (!mPayload[iv->id].complete) { - bool gotAllMsgParts, pyldComplete, fastNext; - gotAllMsgParts = build(iv, &pyldComplete, &fastNext); - if (!gotAllMsgParts && !pyldComplete) { // payload not complete - if ((mPayload[iv->id].requested) && (retransmit)) { - if (iv->devControlCmd == Restart || iv->devControlCmd == CleanState_LockAndAlarm) { - // This is required to prevent retransmissions without answer. - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINTLN(F("Prevent retransmit on Restart / CleanState_LockAndAlarm...")); - mPayload[iv->id].retransmits = mMaxRetrans; - mPayload[iv->id].rxTmo = true; - } else if(iv->devControlCmd == ActivePowerContr) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINTLN(F("retransmit power limit")); - iv->radio->sendControlPacket(iv, iv->devControlCmd, iv->powerLimit, true, false, (iv->powerLimit[1] == RelativNonPersistent) ? 0 : iv->getMaxPower()); - } else { - uint8_t cmd = mPayload[iv->id].txCmd; - if (mPayload[iv->id].retransmits < mMaxRetrans) { - mPayload[iv->id].retransmits++; - if( !mPayload[iv->id].gotFragment && mPayload[iv->id].rxTmo ) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINTLN(F("nothing received")); - mPayload[iv->id].retransmits = mMaxRetrans; - mPayload[iv->id].requested = false; //close failed request - } else if( !mPayload[iv->id].gotFragment && !mPayload[iv->id].rxTmo ) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINTLN(F("retransmit on failed first request")); - mPayload[iv->id].rxTmo = true; - iv->radio->sendCmdPacket(iv, cmd, cmd, true, false); - } else if ( cmd == 0x0f ) { - //hard/firmware request - iv->radio->sendCmdPacket(iv, 0x0f, 0x00, true, false); - mPayload[id].multi_parts = 0; - } else { - bool change = false; - if ( cmd >= MI_REQ_4CH && cmd < 0x39 ) { // MI-1500 Data command - if (cmd > MI_REQ_4CH && mPayload[iv->id].retransmits==1) // first request for the upper channels - change = true; - } else if ( cmd == MI_REQ_CH1 ) {//MI single or dual channel device - if ( mPayload[iv->id].dataAB[CH1] && iv->type == INV_TYPE_2CH ) { - if (!mPayload[iv->id].stsAB[CH1] && mPayload[iv->id].retransmits<2) {} - //first try to get missing sts for first channel a second time - else if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] ) { - cmd = MI_REQ_CH2; - change = true; - if (mPayload[iv->id].rtrRes < 3) //only get back to first channel twice - mPayload[iv->id].retransmits = 0; //reset counter - } - } - } else if ( cmd == MI_REQ_CH2) { - if ( mPayload[iv->id].dataAB[CH2] ) { // data + status ch2 are there? - if (mPayload[iv->id].stsAB[CH2] && (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1])) { - cmd = MI_REQ_CH1; - change = true; - } - } - } - DPRINT_IVID(DBG_INFO, iv->id); - if (change) { - DBGPRINT(F("next request is")); - mPayload[iv->id].txCmd = cmd; - mPayload[iv->id].rtrRes++; - } else { - DBGPRINT(F("sth.")); - DBGPRINT(F(" missing: Request Retransmit")); - } - DBGPRINT(F(" 0x")); - DBGHEXLN(cmd); - mPayload[id].multi_parts = 0; - iv->radio->sendCmdPacket(iv, cmd, cmd, true, false); - yield(); - } - } else { - mPayload[iv->id].rxTmo = true; - } - } - } - } else if(!gotAllMsgParts && pyldComplete) { // crc error on complete Payload - if (mPayload[iv->id].retransmits < mMaxRetrans) { - mPayload[iv->id].retransmits++; - mPayload[iv->id].txCmd = iv->getQueuedCmd(); - mPayload[id].multi_parts = 0; - if (mSerialDebug) { - DPRINT_IVID(DBG_WARN, iv->id); - DBGPRINTLN(F("CRC Error: Request Complete Retransmit")); - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("prepareDevInformCmd 0x")); - DBGHEXLN(mPayload[iv->id].txCmd); - } - iv->radio->sendCmdPacket(iv, mPayload[iv->id].txCmd, mPayload[iv->id].txCmd, false, false); - } else { - mPayload[iv->id].rxTmo = true; - } - } else { - if (!fastNext) { - mPayload[iv->id].rxTmo = true; - } else { - if (mHighPrioIv == NULL) - mHighPrioIv = iv; - } - } - } else { - mPayload[iv->id].rxTmo = true; - } - yield(); - } - } - - private: - void notify(uint8_t val, Inverter<> *iv) { - if(NULL != mCbPayload) - (mCbPayload)(val, iv); - } - - void miStsDecode(Inverter<> *iv, packet_t *p, uint8_t stschan = CH1) { - record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure - rec->ts = mPayload[iv->id].ts; - mPayload[iv->id].gotFragment = true; - mPayload[iv->id].multi_parts += 3; - mPayload[iv->id].txId = p->packet[0]; - miStsConsolidate(iv, stschan, rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); - mPayload[iv->id].stsAB[stschan] = true; - if (mPayload[iv->id].stsAB[CH1] && mPayload[iv->id].stsAB[CH2]) - mPayload[iv->id].stsAB[CH0] = true; - } - - void miStsConsolidate(Inverter<> *iv, uint8_t stschan, record_t<> *rec, uint8_t uState, uint8_t uEnum, uint8_t lState = 0, uint8_t lEnum = 0) { - //uint8_t status = (p->packet[11] << 8) + p->packet[12]; - uint16_t statusMi = 3; // regular status for MI, change to 1 later? - if ( uState == 2 ) { - statusMi = 5050 + stschan; //first approach, needs review! - if (lState) - statusMi += lState*10; - } else if ( uState > 3 ) { - statusMi = uState*1000 + uEnum*10; - if (lState) - statusMi += lState*100; //needs review, esp. for 4ch-8310 state! - //if (lEnum) - statusMi += lEnum; - if (uEnum < 6) { - statusMi += stschan; - } - if (statusMi == 8000) - statusMi = 8310; //trick? - } - - uint16_t prntsts = statusMi == 3 ? 1 : statusMi; - bool stsok = true; - if ( statusMi != mPayload[iv->id].sts[stschan] ) { //sth.'s changed? - iv->alarmCnt = 1; // minimum... - //sth is or was wrong? - if ( (iv->type != INV_TYPE_1CH) && ( (statusMi != 3) - || ((mPayload[iv->id].sts[stschan]) && (statusMi == 3) && (mPayload[iv->id].sts[stschan] != 3))) - ) { - iv->lastAlarm[stschan] = alarm_t(prntsts, mPayload[iv->id].ts,0); - iv->alarmCnt = iv->type == INV_TYPE_2CH ? 3 : 5; - } - - iv->alarmLastId = prntsts; //iv->alarmMesIndex; - - mPayload[iv->id].sts[stschan] = statusMi; - stsok = false; - if (iv->alarmCnt > 1) { //more than one channel - for (uint8_t ch = 0; ch < (iv->alarmCnt); ++ch) { //start with 1 - if (mPayload[iv->id].sts[ch] == 3) { - stsok = true; - break; - } - } - } - if (mSerialDebug) { - DPRINT(DBG_WARN, F("New state on CH")); - DBGPRINT(String(stschan)); DBGPRINT(F(" (")); - DBGPRINT(String(prntsts)); DBGPRINT(F("): ")); - DBGPRINTLN(iv->getAlarmStr(prntsts)); - } - } - - if (!stsok) { - iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, prntsts); - iv->lastAlarm[0] = alarm_t(prntsts, mPayload[iv->id].ts, 0); - } - - if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]) { - iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!? - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINT(F("alarm ID incremented to ")); - DBGPRINTLN(String(iv->alarmMesIndex)); - } - } - } - - void miDataDecode(Inverter<> *iv, packet_t *p) { - record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser - rec->ts = mPayload[iv->id].ts; - mPayload[iv->id].gotFragment = true; - mPayload[iv->id].multi_parts += 4; - - uint8_t datachan = ( p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES) || p->packet[0] == (MI_REQ_4CH + ALL_FRAMES) ) ? CH1 : - ( p->packet[0] == (MI_REQ_CH2 + ALL_FRAMES) || p->packet[0] == (0x37 + ALL_FRAMES) ) ? CH2 : - p->packet[0] == (0x38 + ALL_FRAMES) ? CH3 : - CH4; - // count in RF_communication_protocol.xlsx is with offset = -1 - iv->setValue(iv->getPosByChFld(datachan, FLD_UDC, rec), rec, (float)((p->packet[9] << 8) + p->packet[10])/10); - yield(); - iv->setValue(iv->getPosByChFld(datachan, FLD_IDC, rec), rec, (float)((p->packet[11] << 8) + p->packet[12])/10); - yield(); - iv->setValue(iv->getPosByChFld(0, FLD_UAC, rec), rec, (float)((p->packet[13] << 8) + p->packet[14])/10); - yield(); - iv->setValue(iv->getPosByChFld(0, FLD_F, rec), rec, (float) ((p->packet[15] << 8) + p->packet[16])/100); - iv->setValue(iv->getPosByChFld(datachan, FLD_PDC, rec), rec, (float)((p->packet[17] << 8) + p->packet[18])/10); - yield(); - iv->setValue(iv->getPosByChFld(datachan, FLD_YD, rec), rec, (float)((p->packet[19] << 8) + p->packet[20])/1); - yield(); - iv->setValue(iv->getPosByChFld(0, FLD_T, rec), rec, (float) ((int16_t)(p->packet[21] << 8) + p->packet[22])/10); - iv->setValue(iv->getPosByChFld(0, FLD_IRR, rec), rec, (float) (calcIrradiation(iv, datachan))); - mPayload[iv->id].rssi[(datachan-1)] = p->rssi; - - if ( datachan < 3 ) { - mPayload[iv->id].dataAB[datachan] = true; - } - if ( !mPayload[iv->id].dataAB[CH0] && mPayload[iv->id].dataAB[CH1] && mPayload[iv->id].dataAB[CH2] ) { - mPayload[iv->id].dataAB[CH0] = true; - } - - if (p->packet[0] >= (MI_REQ_4CH + ALL_FRAMES) ) { - /*For MI1500: - if (MI1500) { - STAT = (uint8_t)(p->packet[25] ); - FCNT = (uint8_t)(p->packet[26]); - FCODE = (uint8_t)(p->packet[27]); - }*/ - miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]); - - if (p->packet[0] < (0x39 + ALL_FRAMES) ) { - mPayload[iv->id].txCmd++; - mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response - mPayload[iv->id].complete = false; - } else { - miComplete(iv); - } - } - - } - - void miComplete(Inverter<> *iv) { - if ( mPayload[iv->id].complete ) - return; //if we got second message as well in repreated attempt - mPayload[iv->id].complete = true; - if (mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINTLN(F("got all msgs")); - } - record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); - iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); - - //preliminary AC calculation... - float ac_pow = 0; - for(uint8_t i = 1; i <= iv->channels; i++) { - if (mPayload[iv->id].sts[i] == 3) { - uint8_t pos = iv->getPosByChFld(i, FLD_PDC, rec); - ac_pow += iv->getValue(pos, rec); - } - } - ac_pow = (int) (ac_pow*9.5); - iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) ac_pow/10); - int8_t rssi = -127; - for (uint8_t i = 0; i < 4; i++) { - // get best RSSI - if(mPayload[iv->id].rssi[i] > rssi) - rssi = mPayload[iv->id].rssi[i]; - yield(); - } - iv->rssi = rssi; - - iv->doCalculations(); - // update status state-machine, - iv->isProducing(); - - iv->setQueuedCmdFinished(); - iv->radioStatistics.rxSuccess++; - yield(); - notify(RealTimeRunData_Debug, iv); - } - - bool build(Inverter<> *iv, bool *complete, bool *fastNext ) { - DPRINTLN(DBG_VERBOSE, F("build")); - // check if all messages are there - - *complete = mPayload[iv->id].complete; - *fastNext = false; - uint8_t txCmd = mPayload[iv->id].txCmd; - - if(!*complete) { - DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); - //we got some delayed status msgs?!? - if ((txCmd == MI_REQ_CH1) || (txCmd == MI_REQ_CH2)) { - if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0]) { - miComplete(iv); - return true; - } - return false; - } - if (txCmd >= MI_REQ_4CH && txCmd <= 0x39) { - return false; - } - if (txCmd == 0x0f) { //hw info request, at least hw part nr. and version have to be there... - bool gotRelevant = iv->getFwVersion() - && iv->getChannelFieldValue(CH0, FLD_PART_NUM, iv->getRecordStruct(InverterDevInform_Simple)); - if (gotRelevant) - *fastNext = true; - return gotRelevant; - } - } - - //check if we want the next request to be executed faster - if (mPayload[iv->id].gotFragment && txCmd == 0x0f) - *fastNext = true; - return true; - } - - void miHwDecode(Inverter<> *iv, packet_t *p ) { - record_t<> *rec = iv->getRecordStruct(InverterDevInform_All); // choose the record structure - rec->ts = mPayload[iv->id].ts; - mPayload[iv->id].gotFragment = true; - -/* -Polling the device software and hardware version number command -start byte Command word routing address target address User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] -0x7e 0x0f xx xx xx xx YY YY YY YY 0x00 CRC 0x7f -Command Receipt - First Frame -start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] -0x7e 0x8f YY YY YY YY xx xx xx xx 0x00 USFWBuild_VER APPFWBuild_VER APPFWBuild_YYYY APPFWBuild_MMDD APPFWBuild_HHMM APPFW_PN HW_VER CRC 0x7f -Command Receipt - Second Frame -start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[17] byte[18] byte[19] byte[20] byte[21] byte[22] byte[23] byte[24] byte[25] byte[26] byte[27] byte[28] -0x7e 0x8f YY YY YY YY xx xx xx xx 0x01 HW_PN HW_FB_TLmValue HW_FB_ReSPRT HW_GridSamp_ResValule HW_ECapValue Matching_APPFW_PN CRC 0x7f -Command receipt - third frame -start byte Command word target address routing address Multi-frame marking User data User data User data User data User data User data User data User data check end byte -byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8] byte[9] byte[10] byte[11] byte[12] byte[13] byte[14] byte[15] byte[16] byte[15] byte[16] byte[17] byte[18] -0x7e 0x8f YY YY YY YY xx xx xx xx 0x12 APPFW_MINVER HWInfoAddr PNInfoCRC_gusv PNInfoCRC_gusv CRC 0x7f -*/ - -/* -case InverterDevInform_All: - rec->length = (uint8_t)(HMINFO_LIST_LEN); - rec->assign = (byteAssign_t *)InfoAssignment; - rec->pyldLen = HMINFO_PAYLOAD_LEN; - break; - -const byteAssign_t InfoAssignment[] = { -{ FLD_FW_VERSION, UNIT_NONE, CH0, 0, 2, 1 }, -{ FLD_FW_BUILD_YEAR, UNIT_NONE, CH0, 2, 2, 1 }, -{ FLD_FW_BUILD_MONTH_DAY, UNIT_NONE, CH0, 4, 2, 1 }, -{ FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE, CH0, 6, 2, 1 }, -{ FLD_BOOTLOADER_VER, UNIT_NONE, CH0, 8, 2, 1 } -}; -*/ - - if ( p->packet[9] == 0x00 ) {//first frame - //FLD_FW_VERSION - for (uint8_t i = 0; i < 5; i++) { - iv->setValue(i, rec, (float) ((p->packet[(12+2*i)] << 8) + p->packet[(13+2*i)])/1); - } - iv->isConnected = true; - if(mSerialDebug) { - DPRINT_IVID(DBG_INFO, iv->id); - DPRINT(DBG_INFO,F("HW_VER is ")); - DBGPRINTLN(String((p->packet[24] << 8) + p->packet[25])); - } - record_t<> *rec = iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure - rec->ts = mPayload[iv->id].ts; - iv->setValue(1, rec, (uint32_t) ((p->packet[24] << 8) + p->packet[25])/1); - mPayload[iv->id].multi_parts +=4; - } else if ( p->packet[9] == 0x01 || p->packet[9] == 0x10 ) {//second frame for MI, 3rd gen. answers in 0x10 - DPRINT_IVID(DBG_INFO, iv->id); - if ( p->packet[9] == 0x01 ) { - DBGPRINTLN(F("got 2nd frame (hw info)")); - /* according to xlsx (different start byte -1!) - byte[11] to byte[14] HW_PN - byte[15] byte[16] HW_FB_TLmValue - byte[17] byte[18] HW_FB_ReSPRT - byte[19] byte[20] HW_GridSamp_ResValule - byte[21] byte[22] HW_ECapValue - byte[23] to byte[26] Matching_APPFW_PN*/ - DPRINT(DBG_INFO,F("HW_PartNo ")); - DBGPRINTLN(String((uint32_t) (((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13])); - record_t<> *rec = iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure - rec->ts = mPayload[iv->id].ts; - iv->setValue(0, rec, (uint32_t) ((((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13])/1); - - if(mSerialDebug) { - DPRINT(DBG_INFO,F("HW_FB_TLmValue ")); - DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15])); - DPRINT(DBG_INFO,F("HW_FB_ReSPRT ")); - DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17])); - DPRINT(DBG_INFO,F("HW_GridSamp_ResValule ")); - DBGPRINTLN(String((p->packet[18] << 8) + p->packet[19])); - DPRINT(DBG_INFO,F("HW_ECapValue ")); - DBGPRINTLN(String((p->packet[20] << 8) + p->packet[21])); - DPRINT(DBG_INFO,F("Matching_APPFW_PN ")); - DBGPRINTLN(String((uint32_t) (((p->packet[22] << 8) | p->packet[23]) << 8 | p->packet[24]) << 8 | p->packet[25])); - } - //notify(InverterDevInform_Simple, iv); - mPayload[iv->id].multi_parts +=2; - notify(InverterDevInform_All, iv); - } else { - DBGPRINTLN(F("3rd gen. inverter!")); - } - - } else if ( p->packet[9] == 0x12 ) {//3rd frame - DPRINT_IVID(DBG_INFO, iv->id); - DBGPRINTLN(F("got 3rd frame (hw info)")); - /* according to xlsx (different start byte -1!) - byte[11] byte[12] APPFW_MINVER - byte[13] byte[14] HWInfoAddr - byte[15] byte[16] PNInfoCRC_gusv - byte[15] byte[16] PNInfoCRC_gusv (this really is double mentionned in xlsx...) - */ - if(mSerialDebug) { - DPRINT(DBG_INFO,F("APPFW_MINVER ")); - DBGPRINTLN(String((p->packet[10] << 8) + p->packet[11])); - DPRINT(DBG_INFO,F("HWInfoAddr ")); - DBGPRINTLN(String((p->packet[12] << 8) + p->packet[13])); - DPRINT(DBG_INFO,F("PNInfoCRC_gusv ")); - DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15])); - } - mPayload[iv->id].multi_parts++; - } - if (mPayload[iv->id].multi_parts > 5) { - iv->setQueuedCmdFinished(); - mPayload[iv->id].complete = true; - mPayload[iv->id].rxTmo = true; - mPayload[iv->id].requested= false; - iv->radioStatistics.rxSuccess++; - } - if (mHighPrioIv == NULL) - mHighPrioIv = iv; - } - - void miGPFDecode(Inverter<> *iv, packet_t *p ) { - mPayload[iv->id].gotFragment = true; - mPayload[iv->id].gotGPF = true; - - record_t<> *rec = iv->getRecordStruct(InverterDevInform_Simple); // choose the record structure - rec->ts = mPayload[iv->id].ts; - iv->setValue(2, rec, (uint32_t) (((p->packet[10] << 8) | p->packet[11]))); //FLD_GRID_PROFILE_CODE - iv->setValue(3, rec, (uint32_t) (((p->packet[12] << 8) | p->packet[13]))); //FLD_GRID_PROFILE_VERSION - iv->setQueuedCmdFinished(); - iv->radioStatistics.rxSuccess++; - -/* according to xlsx (different start byte -1!) - Polling Grid-connected Protection Parameter File Command - Receipt - byte[10] ST1 indicates the status of the grid-connected protection file. ST1=1 indicates the default grid-connected protection file, ST=2 indicates that the grid-connected protection file is configured and normal, ST=3 indicates that the grid-connected protection file cannot be recognized, ST=4 indicates that the grid-connected protection file is damaged - byte[11] byte[12] CountryStd variable indicates the national standard code of the grid-connected protection file - byte[13] byte[14] Version indicates the version of the grid-connected protection file - byte[15] byte[16] -*/ - if(mSerialDebug) { - DPRINT(DBG_INFO,F("ST1 ")); - DBGPRINTLN(String(p->packet[9])); - DPRINT(DBG_INFO,F("CountryStd ")); - DBGPRINTLN(String((p->packet[10] << 8) + p->packet[11])); - DPRINT(DBG_INFO,F("Version ")); - DBGPRINTLN(String((p->packet[12] << 8) + p->packet[13])); - } - if (mHighPrioIv == NULL) - mHighPrioIv = iv; - } - - void reset(uint8_t id, bool setTxTmo = true, bool clrSts = false) { - memset(mPayload[id].len, 0, MAX_PAYLOAD_ENTRIES); - mPayload[id].gotFragment = false; - mPayload[id].rxTmo = setTxTmo;// design: don't start with complete retransmit - mPayload[id].rtrRes = 0; - mPayload[id].multi_parts = 0; - mPayload[id].retransmits = 0; - mPayload[id].complete = false; - mPayload[id].dataAB[CH0] = true; //required for 1CH and 2CH devices - mPayload[id].dataAB[CH1] = true; //required for 1CH and 2CH devices - mPayload[id].dataAB[CH2] = true; //only required for 2CH devices - mPayload[id].stsAB[CH0] = true; //required for 1CH and 2CH devices - mPayload[id].stsAB[CH1] = true; //required for 1CH and 2CH devices - mPayload[id].stsAB[CH2] = true; //only required for 2CH devices - mPayload[id].txCmd = 0; - mPayload[id].requested = false; - mPayload[id].ts = *mTimestamp; - if (clrSts) { // only clear channel states at startup - mPayload[id].sts[0] = 0; - mPayload[id].sts[CH1] = 0; - mPayload[id].sts[CH2] = 0; - mPayload[id].sts[CH3] = 0; - mPayload[id].sts[CH4] = 0; - } - } - - IApp *mApp; - HMSYSTEM *mSys; - uint8_t mMaxRetrans; - uint32_t *mTimestamp; - miPayload_t mPayload[MAX_NUM_INVERTERS]; - bool mSerialDebug; - Inverter<> *mHighPrioIv; - - alarmListenerType mCbAlarm; - payloadListenerType mCbPayload; -}; - -#endif /*__MI_PAYLOAD_H__*/ diff --git a/src/web/RestApi.h b/src/web/RestApi.h index e53c91da..071030ba 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -680,12 +680,10 @@ class RestApi { iv->powerLimit[1] = AbsolutNonPersistent; accepted = iv->setDevControlRequest(ActivePowerContr); - } - else if(F("dev") == jsonIn[F("cmd")]) { + } else if(F("dev") == jsonIn[F("cmd")]) { DPRINTLN(DBG_INFO, F("dev cmd")); - //iv->enqueCommand(jsonIn[F("val")].as()); - } - else { + iv->setDevCommand(jsonIn[F("val")].as()); + } else { jsonOut[F("error")] = F("unknown cmd: '") + jsonIn["cmd"].as() + "'"; return false; } @@ -693,8 +691,7 @@ class RestApi { if(!accepted) { jsonOut[F("error")] = F("inverter does not accept dev control request at this moment"); return false; - } else - mApp->ivSendHighPrio(iv); + } return true; } From 179c51302b42e2985e6a36ebb1f8cf5c5a3aa750 Mon Sep 17 00:00:00 2001 From: lumapu Date: Wed, 1 Nov 2023 09:51:34 +0100 Subject: [PATCH 27/42] small Heuristic fix --- src/hm/Heuristic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h index 7364f472..1675eda4 100644 --- a/src/hm/Heuristic.h +++ b/src/hm/Heuristic.h @@ -27,7 +27,7 @@ class Heuristic { id = i; } } - if(bestQuality > -6) + if(bestQuality == -6) iv->txRfChId = (iv->txRfChId + 1) % RF_MAX_CHANNEL_ID; // next channel else iv->txRfChId = id; // best quality channel From ac246bb7634a892e57a90cd32fa7a7475df40ce6 Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 5 Nov 2023 13:58:16 +0100 Subject: [PATCH 28/42] fixed radio statistics --- src/hm/Communication.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index b2a82e89..baf912d2 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -56,6 +56,7 @@ class Communication : public CommQueue<> { mHeu.printStatus(q->iv); mHeu.getTxCh(q->iv); + mGotFragment = false; mState = States::START; break; @@ -87,16 +88,20 @@ class Communication : public CommQueue<> { DBGPRINT(String(millis() - mWaitTimeout + timeout)); DBGPRINTLN(F("ms")); - q->iv->radioStatistics.rxFailNoAnser++; // got nothing - mHeu.setGotNothing(q->iv); - if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { - q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); - mWaitTimeout = millis() + 1000; - } + if(!mGotFragment) { + q->iv->radioStatistics.rxFailNoAnser++; // got nothing + mHeu.setGotNothing(q->iv); + if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { + q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); + mWaitTimeout = millis() + 1000; + } + } else + q->iv->radioStatistics.rxFail++; mState = States::RESET; break; } + mGotFragment = true; States nextState = States::RESET; while(!q->iv->radio->mBufCtrl.empty()) { packet_t *p = &q->iv->radio->mBufCtrl.front(); @@ -132,6 +137,7 @@ class Communication : public CommQueue<> { parseMiFrame(p, q); } } else { + q->iv->radioStatistics.rxFail++; // got no complete payload DPRINTLN(DBG_WARN, F("Inverter serial does not match")); mWaitTimeout = millis() + timeout; } @@ -712,6 +718,7 @@ class Communication : public CommQueue<> { uint32_t *mTimestamp; uint32_t mWaitTimeout = 0; std::array mLocalBuf; + bool mGotFragment = false; uint8_t mMaxFrameId; uint8_t mPayload[MAX_BUFFER]; payloadListenerType mCbPayload = NULL; From 37d773eaa030c8860dfc9d4f6f5a75f052f9832b Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 5 Nov 2023 13:59:53 +0100 Subject: [PATCH 29/42] 0.8.1 * added tx channel heuristics (per inverter) * fix statistics counter --- src/CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 435379e9..a610cf59 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,6 +1,6 @@ # Development Changes -## 0.8.1 - 2023-10-31 +## 0.8.1 - 2023-11-05 * added tx channel heuristics (per inverter) * fix statistics counter From e582cb71d0164b71d632b5b198a20f9e24671acc Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 5 Nov 2023 14:13:39 +0100 Subject: [PATCH 30/42] 0.8.1 fix github actions --- .github/workflows/compile_development.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile_development.yml b/.github/workflows/compile_development.yml index 65a22730..af81492f 100644 --- a/.github/workflows/compile_development.yml +++ b/.github/workflows/compile_development.yml @@ -39,7 +39,7 @@ jobs: - name: Install PlatformIO run: | - python -m pip install --upgrade pip + python -m pip install setuptools --upgrade pip pip install --upgrade platformio - name: Run PlatformIO From e550111f9510d81004fae2edec888ca973953c92 Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 5 Nov 2023 14:16:50 +0100 Subject: [PATCH 31/42] 0.8.1 fix github actions (include error) --- .github/workflows/compile_release.yml | 2 +- src/hm/Communication.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile_release.yml b/.github/workflows/compile_release.yml index cb4979b4..70eb5f29 100644 --- a/.github/workflows/compile_release.yml +++ b/.github/workflows/compile_release.yml @@ -43,7 +43,7 @@ jobs: - name: Install PlatformIO run: | - python -m pip install --upgrade pip + python -m pip install setuptools --upgrade pip pip install --upgrade platformio - name: Run PlatformIO diff --git a/src/hm/Communication.h b/src/hm/Communication.h index baf912d2..95f438d5 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -9,7 +9,7 @@ #include "CommQueue.h" #include #include "../utils/crc.h" -#include "heuristic.h" +#include "Heuristic.h" #define MI_TIMEOUT 250 #define DEFAULT_TIMEOUT 500 From b84391df893ea60395ab5c01d3112e8318048061 Mon Sep 17 00:00:00 2001 From: Wusaweki Date: Sun, 5 Nov 2023 16:19:13 +0100 Subject: [PATCH 32/42] fix null pointer access in display.h --- src/plugins/Display/Display.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/Display/Display.h b/src/plugins/Display/Display.h index c4853bab..932c1a8f 100644 --- a/src/plugins/Display/Display.h +++ b/src/plugins/Display/Display.h @@ -91,12 +91,14 @@ class Display { Inverter<> *iv; record_t<> *rec; bool allOff = true; - for (uint8_t i = 0; i < mSys->getNumInverters(); i++) { + uint8_t nInv = mSys->getNumInverters(); + for (uint8_t i = 0; i < nInv; i++) { iv = mSys->getInverterByPos(i); - rec = iv->getRecordStruct(RealTimeRunData_Debug); if (iv == NULL) continue; + rec = iv->getRecordStruct(RealTimeRunData_Debug); + if (iv->isProducing()) nrprod++; else From 975f6923d304715d32fdc28ee18b6f0e9133e8d4 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 9 Nov 2023 00:08:42 +0100 Subject: [PATCH 33/42] 0.8.2 * beautified inverter settings in `setup` (preperation for future, settings become more inverter dependent) --- src/CHANGES.md | 3 + src/config/config.h | 2 +- src/defines.h | 2 +- src/hm/hmInverter.h | 3 - src/hm/hmSystem.h | 2 +- src/web/RestApi.h | 31 ++++- src/web/html/api.js | 19 ++- src/web/html/colorDark.css | 2 +- src/web/html/setup.html | 277 ++++++++++++++++++++++--------------- src/web/html/style.css | 6 +- src/web/html/system.html | 4 - src/web/web.h | 38 ----- 12 files changed, 223 insertions(+), 166 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index a610cf59..3c3c553a 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,8 @@ # Development Changes +## 0.8.2 - 2023-11-08 +* beautified inverter settings in `setup` (preperation for future, settings become more inverter dependent) + ## 0.8.1 - 2023-11-05 * added tx channel heuristics (per inverter) * fix statistics counter diff --git a/src/config/config.h b/src/config/config.h index da027fd6..f03ac702 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -158,7 +158,7 @@ #define MAX_RF_PAYLOAD_SIZE 32 // maximum total payload buffers (must be greater than the number of received frame fragments) -#define MAX_PAYLOAD_ENTRIES 10 +#define MAX_PAYLOAD_ENTRIES 20 // number of seconds since last successful response, before inverter is marked inactive #define INVERTER_INACT_THRES_SEC 5*60 diff --git a/src/defines.h b/src/defines.h index 1a865fa7..8e8b1f61 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 1 +#define VERSION_PATCH 2 //------------------------------------- typedef struct { diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 6cb2567e..023ae772 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -118,7 +118,6 @@ class Inverter { record_t recordHwInfo; // structure for simple (hardware) info values record_t recordConfig; // structure for system config values record_t recordAlarm; // structure for alarm values - bool initialized; // needed to check if the inverter was correctly added (ESP32 specific - union types are never null) bool isConnected; // shows if inverter was successfully identified (fw version and hardware info) InverterStatus status; // indicates the current inverter status std::array lastAlarm; // holds last 10 alarms @@ -142,7 +141,6 @@ class Inverter { actPowerLimit = 0xffff; // init feedback from inverter to -1 mDevControlRequest = false; devControlCmd = InitDataState; - initialized = false; alarmMesIndex = 0; isConnected = false; status = InverterStatus::OFF; @@ -193,7 +191,6 @@ class Inverter { initAssignment(&recordConfig, SystemConfigPara); initAssignment(&recordAlarm, AlarmData); toRadioId(); - initialized = true; } uint8_t getPosByChFld(uint8_t channel, uint8_t fieldId, record_t<> *rec) { diff --git a/src/hm/hmSystem.h b/src/hm/hmSystem.h index a8ca2371..de0d5911 100644 --- a/src/hm/hmSystem.h +++ b/src/hm/hmSystem.h @@ -114,7 +114,7 @@ class HmSystem { DPRINTLN(DBG_VERBOSE, F("hmSystem.h:getInverterByPos")); if(pos >= MAX_INVERTER) return NULL; - else if((mInverter[pos].initialized && mInverter[pos].config->serial.u64 != 0ULL) || false == check) + else if((mInverter[pos].config->serial.u64 != 0ULL) || (false == check)) return &mInverter[pos]; else return NULL; diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 071030ba..2267661e 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -124,7 +124,7 @@ class RestApi { void onApiPostBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { DPRINTLN(DBG_VERBOSE, "onApiPostBody"); - DynamicJsonDocument json(200); + DynamicJsonDocument json(800); AsyncJsonResponse* response = new AsyncJsonResponse(false, 200); JsonObject root = response->getRoot(); @@ -708,8 +708,35 @@ class RestApi { mApp->setTimestamp(0); // 0: update ntp flag else if(F("serial_utc_offset") == jsonIn[F("cmd")]) mTimezoneOffset = jsonIn[F("val")]; - else if(F("discovery_cfg") == jsonIn[F("cmd")]) { + else if(F("discovery_cfg") == jsonIn[F("cmd")]) mApp->setMqttDiscoveryFlag(); // for homeassistant + else if(F("save_iv") == jsonIn[F("cmd")]) { + Inverter<> *iv = mSys->getInverterByPos(jsonIn[F("id")], false); + iv->config->enabled = jsonIn[F("en")]; + iv->config->serial.u64 = jsonIn[F("ser")]; + snprintf(iv->config->name, MAX_NAME_LENGTH, "%s", jsonIn[F("name")].as()); + + for(uint8_t i = 0; i < 6; i++) { + iv->config->chMaxPwr[i] = jsonIn[F("ch")][i][F("pwr")]; + iv->config->yieldCor[i] = jsonIn[F("ch")][i][F("yld")]; + snprintf(iv->config->chName[i], MAX_NAME_LENGTH, "%s", jsonIn[F("ch")][i][F("name")].as()); + } + + switch(iv->config->serial.b[4]) { + case 0x24: + case 0x22: + case 0x21: iv->type = INV_TYPE_1CH; iv->channels = 1; break; + + case 0x44: + case 0x42: + case 0x41: iv->type = INV_TYPE_2CH; iv->channels = 2; break; + + case 0x64: + case 0x62: + case 0x61: iv->type = INV_TYPE_4CH; iv->channels = 4; break; + default: break; + } + mApp->saveSettings(false); // without reboot } else { jsonOut[F("error")] = F("unknown cmd"); return false; diff --git a/src/web/html/api.js b/src/web/html/api.js index c9590d89..8c0ba54e 100644 --- a/src/web/html/api.js +++ b/src/web/html/api.js @@ -1,6 +1,4 @@ -/** - * SVG ICONS - */ +/* SVG ICONS - https://icons.getbootstrap.com */ iconWifi1 = [ "M11.046 10.454c.226-.226.185-.605-.1-.75A6.473 6.473 0 0 0 8 9c-1.06 0-2.062.254-2.946.704-.285.145-.326.524-.1.75l.015.015c.16.16.407.19.611.09A5.478 5.478 0 0 1 8 10c.868 0 1.69.201 2.42.56.203.1.45.07.611-.091l.015-.015zM9.06 12.44c.196-.196.198-.52-.04-.66A1.99 1.99 0 0 0 8 11.5a1.99 1.99 0 0 0-1.02.28c-.238.14-.236.464-.04.66l.706.706a.5.5 0 0 0 .707 0l.708-.707z" @@ -34,6 +32,15 @@ iconSuccessFull = [ "M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z" ]; +iconGear = [ + "M9.405 1.05c-.413-1.4-2.397-1.4-2.81 0l-.1.34a1.464 1.464 0 0 1-2.105.872l-.31-.17c-1.283-.698-2.686.705-1.987 1.987l.169.311c.446.82.023 1.841-.872 2.105l-.34.1c-1.4.413-1.4 2.397 0 2.81l.34.1a1.464 1.464 0 0 1 .872 2.105l-.17.31c-.698 1.283.705 2.686 1.987 1.987l.311-.169a1.464 1.464 0 0 1 2.105.872l.1.34c.413 1.4 2.397 1.4 2.81 0l.1-.34a1.464 1.464 0 0 1 2.105-.872l.31.17c1.283.698 2.686-.705 1.987-1.987l-.169-.311a1.464 1.464 0 0 1 .872-2.105l.34-.1c1.4-.413 1.4-2.397 0-2.81l-.34-.1a1.464 1.464 0 0 1-.872-2.105l.17-.31c.698-1.283-.705-2.686-1.987-1.987l-.311.169a1.464 1.464 0 0 1-2.105-.872l-.1-.34zM8 10.93a2.929 2.929 0 1 1 0-5.86 2.929 2.929 0 0 1 0 5.858z" +]; + +iconDel = [ + "M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z", + "M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z" +]; + /** * GENERIC FUNCTIONS */ @@ -119,7 +126,7 @@ function parseRssi(obj) { icon = iconWifi1; else if(obj["wifi_rssi"] <= -70) icon = iconWifi2; - document.getElementById("wifiicon").replaceChildren(svg(icon, 32, 32, "wifi", obj["wifi_rssi"])); + document.getElementById("wifiicon").replaceChildren(svg(icon, 32, 32, "icon-fg", obj["wifi_rssi"])); } function toIsoDateStr(d) { @@ -181,6 +188,10 @@ function tr(val1, val2) { ]); } +function badge(success, text, second="error") { + return ml("span", {class: "badge badge-" + ((success) ? "success" : second)}, text); +} + function des(val) { e = document.createElement('p'); e.classList.add("subdes"); diff --git a/src/web/html/colorDark.css b/src/web/html/colorDark.css index 3d9d167a..65100721 100644 --- a/src/web/html/colorDark.css +++ b/src/web/html/colorDark.css @@ -16,7 +16,7 @@ --secondary: #0072c8; --nav-active: #555; --footer-bg: #282828; - --modal-bg: #666; + --modal-bg: #282828; --invalid-bg: #400; diff --git a/src/web/html/setup.html b/src/web/html/setup.html index b9697141..2ec5d2b5 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -140,14 +140,7 @@
Inverter
-
-
-
-
-
-

Note

-

A 'max module power' value of '0' disables the channel in 'live' view

-
+

General

@@ -451,8 +444,6 @@ [1, "high active"], ]; - const re = /1[0,1,3][2,4,6,8][1,2,4].*/; - window.onload = function() { for(it of document.getElementsByClassName("s_collapsible")) { it.addEventListener("click", function() { @@ -471,10 +462,6 @@ }); } - document.getElementById("btnAdd").addEventListener("click", function() { - ivHtml(JSON.parse('{"enabled":true,"name":"","serial":"","channels":6,"ch_max_pwr":[0,0,0,0,0,0],"ch_name":["","","","","",""],"ch_yield_cor":[0,0,0,0,0,0]}')); - }); - function apiCbWifi(obj) { var e = document.getElementById("networks"); selDelAllOpt(e); @@ -573,98 +560,6 @@ return null; } - function ivHtml(obj) { - var id = getFreeId(); - if(null == id) { - setHide("btnAdd", true); - return; - } - - var iv = ml("div", {id: "inv" + id}, null); - document.getElementById("inverter").appendChild(iv); - iv.appendChild(des("Inverter " + id)); - id = "inv" + id; - - var addr = ml("input", {name: id + "Addr", class: "text", type: "number", max: 138999999999, value: obj["serial"]}, null); - - iv.append( - mlCb(id + "Enable", "Communication Enable", obj["enabled"]), - mlE("Serial Number (12 digits)*", addr) - ); - - ['keyup', 'change'].forEach(function(evt) { - addr.addEventListener(evt, (e) => { - var serial = addr.value.substring(0,4); - var max = 0; - for(var i=0;i<6;i++) { - setHide(id+"ModPwr"+i, true); - setHide(id+"ModName"+i, true); - setHide(id+"YieldCor"+i, true); - } - setHide("row"+id+"ModPwr", true); - setHide("row"+id+"ModName", true); - setHide("row"+id+"YieldCor", true); - - if(serial.charAt(0) == 1) { - if((serial.charAt(1) == 0) || (serial.charAt(1) == 1) || (serial.charAt(1) == 3)) { - if((serial.charAt(3) == 1) || (serial.charAt(3) == 2) || (serial.charAt(3) == 4)) { - switch(serial.charAt(2)) { - default: - case "2": max = 1; break; - case "4": max = 2; break; - case "6": max = 4; break; - case "8": max = 6; break; - } - } - } - } - - if(max != 0) { - for(var i=0;i { + var serial = ser.value.substring(0,4); + var max = 1; + for(var i = 0; i < 6; i++) { + setHide("ch"+i, true); + } + + if(serial.charAt(0) == 1) { + if((serial.charAt(1) == 0) || (serial.charAt(1) == 1) || (serial.charAt(1) == 3)) { + if((serial.charAt(3) == 1) || (serial.charAt(3) == 2) || (serial.charAt(3) == 4)) { + switch(serial.charAt(2)) { + default: + case "2": max = 1; break; + case "4": max = 2; break; + case "6": max = 4; break; + case "8": max = 6; break; + } + } + } + } + for(var i = 0; i < max; i++) { + setHide("ch"+i, false); + } + }) + }); + + modal("Edit inverter", html); + ser.dispatchEvent(new Event('change')); + + function ivSave() { + var o = new Object(); + o.cmd = "save_iv"; + o.id = obj.id; + o.ser = parseInt(document.getElementsByName("ser")[0].value, 16); + o.name = document.getElementsByName("name")[0].value; + o.en = document.getElementsByName("enable")[0].checked; + o.ch = []; + for(let i = 0; i < 6; i++) { + var q = new Object(); + q.pwr = document.getElementsByName("ch_p"+i)[0].value; + q.name = document.getElementsByName("ch_n"+i)[0].value; + q.yld = document.getElementsByName("yld_c"+i)[0].value; + o.ch.push(q); + } + getAjax("/api/setup", cb, "POST", JSON.stringify(o)); + } + + function cb(obj) { + var e = document.getElementById("res"); + if(!obj.success) + e.innerHTML = "error while saving"; + else { + modalClose(); + getAjax("/api/inverter/list", parseIv); + } + } + } + + function ivDel(obj) { + var html = ml("div", {class: "row"}, [ + ml("div", {class: "col-9"}, "do you realy want to delete inverter " + obj.name + "?"), + ml("div", {class: "col-3 a-r"}, ml("div", {class: "col-4 a-r"}, ml("input", {type: "button", value: "yes", class: "btn", onclick: function() { del(); }}, null))) + ]); + modal("Delete inverter " + obj.name, html); + + function del() { + var o = new Object(); + o.cmd = "save_iv"; + o.id = obj.id; + o.ser = 0; + o.name = ""; + o.en = false; + o.ch = []; + for(let i = 0; i < 6; i++) { + var q = new Object(); + q.pwr = 0; + q.name = ""; + q.yld = 0; + o.ch.push(q); + } + getAjax("/api/setup", cb, "POST", JSON.stringify(o)); + } + + function cb(obj) { + if(obj.success) { + modalClose(); + getAjax("/api/inverter/list", parseIv); + } + } + } + function parseMqtt(obj) { for(var i of [["Addr", "broker"], ["Port", "port"], ["ClientId", "clientId"], ["User", "user"], ["Pwd", "pwd"], ["Topic", "topic"], ["Interval", "interval"]]) document.getElementsByName("mqtt"+i[0])[0].value = obj[i[1]]; diff --git a/src/web/html/style.css b/src/web/html/style.css index 95cbff3b..8c40c780 100644 --- a/src/web/html/style.css +++ b/src/web/html/style.css @@ -94,8 +94,8 @@ svg.icon { fill: var(--success); } -.wifi { - fill: var(--fg2); +.icon-fg { + fill: var(--fg); } .title { @@ -708,7 +708,7 @@ div.hr { width: 100%; background-color: var(--modal-bg); background-clip: padding-box; - border: 1px solid rgba(0,0,0,.2); + border: 1px solid var(--fg); flex-direction: column; } diff --git a/src/web/html/system.html b/src/web/html/system.html index 27ad1801..7eddd7b0 100644 --- a/src/web/html/system.html +++ b/src/web/html/system.html @@ -40,10 +40,6 @@ ); } - function badge(success, text, second="error") { - return ml("span", {class: "badge badge-" + ((success) ? "success" : second)}, text); - } - function headline(text) { return ml("div", {class: "head p-2 mt-3"}, ml("div", {class: "row"}, ml("div", {class: "col a-c"}, text))) } diff --git a/src/web/web.h b/src/web/web.h index fabbd604..002c3cbc 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -487,44 +487,6 @@ class Web { request->arg("ipGateway").toCharArray(buf, 20); ah::ip2Arr(mConfig->sys.ip.gateway, buf); - // inverter - Inverter<> *iv; - for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { - iv = mSys->getInverterByPos(i, false); - // enable communication - iv->config->enabled = (request->arg("inv" + String(i) + "Enable") == "on"); - // address - request->arg("inv" + String(i) + "Addr").toCharArray(buf, 20); - if (strlen(buf) == 0) - memset(buf, 0, 20); - iv->config->serial.u64 = ah::Serial2u64(buf); - switch(iv->config->serial.b[4]) { - case 0x24: - case 0x22: - case 0x21: iv->type = INV_TYPE_1CH; iv->channels = 1; break; - - case 0x44: - case 0x42: - case 0x41: iv->type = INV_TYPE_2CH; iv->channels = 2; break; - - case 0x64: - case 0x62: - case 0x61: iv->type = INV_TYPE_4CH; iv->channels = 4; break; - default: break; - } - - // name - request->arg("inv" + String(i) + "Name").toCharArray(iv->config->name, MAX_NAME_LENGTH); - - // max channel power / name - for (uint8_t j = 0; j < 6; j++) { - iv->config->yieldCor[j] = request->arg("inv" + String(i) + "YieldCor" + String(j)).toDouble(); - iv->config->chMaxPwr[j] = request->arg("inv" + String(i) + "ModPwr" + String(j)).toInt() & 0xffff; - request->arg("inv" + String(i) + "ModName" + String(j)).toCharArray(iv->config->chName[j], MAX_NAME_LENGTH); - } - iv->initialized = true; - } - if (request->arg("invInterval") != "") mConfig->nrf.sendInterval = request->arg("invInterval").toInt(); mConfig->inst.rstYieldMidNight = (request->arg("invRstMid") == "on"); From 56a1f3beafba574de270ad2dc17eb48fbd86b13b Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 9 Nov 2023 22:58:48 +0100 Subject: [PATCH 34/42] 0.8.3 * fix yield day reset during day #848 * add total AC Max Power to WebUI * fix opendtufusion build (GxEPD patch) --- patches/GxEPD2_SW_SPI.patch | 11 +++++------ src/CHANGES.md | 5 +++++ src/defines.h | 2 +- src/hm/hmInverter.h | 17 +++++++++++++++-- src/platformio.ini | 4 ++-- src/web/html/visualization.html | 14 ++++++++------ 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/patches/GxEPD2_SW_SPI.patch b/patches/GxEPD2_SW_SPI.patch index 3eb6a32c..9697eec8 100644 --- a/patches/GxEPD2_SW_SPI.patch +++ b/patches/GxEPD2_SW_SPI.patch @@ -14,7 +14,7 @@ index 1588444..592869b 100644 { _initial_write = true; _initial_refresh = true; -@@ -67,27 +67,30 @@ void GxEPD2_EPD::init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset +@@ -71,27 +71,30 @@ void GxEPD2_EPD::init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset { pinMode(_busy, INPUT); } @@ -58,7 +58,7 @@ index 1588444..592869b 100644 } void GxEPD2_EPD::setBusyCallback(void (*busyCallback)(const void*), const void* busy_callback_parameter) -@@ -96,12 +99,6 @@ void GxEPD2_EPD::setBusyCallback(void (*busyCallback)(const void*), const void* +@@ -100,12 +103,6 @@ void GxEPD2_EPD::setBusyCallback(void (*busyCallback)(const void*), const void* _busy_callback_parameter = busy_callback_parameter; } @@ -71,7 +71,7 @@ index 1588444..592869b 100644 void GxEPD2_EPD::_reset() { if (_rst >= 0) -@@ -168,115 +165,201 @@ void GxEPD2_EPD::_waitWhileBusy(const char* comment, uint16_t busy_time) +@@ -174,115 +169,201 @@ void GxEPD2_EPD::_waitWhileBusy(const char* comment, uint16_t busy_time) void GxEPD2_EPD::_writeCommand(uint8_t c) { @@ -334,7 +334,7 @@ index ef2318f..50aa961 100644 protected: void _reset(); void _waitWhileBusy(const char* comment = 0, uint16_t busy_time = 5000); -@@ -111,16 +115,21 @@ class GxEPD2_EPD +@@ -111,9 +115,14 @@ class GxEPD2_EPD void _startTransfer(); void _transfer(uint8_t value); void _endTransfer(); @@ -351,8 +351,7 @@ index ef2318f..50aa961 100644 bool _diag_enabled, _pulldown_rst_mode; - SPIClass* _pSPIx; SPISettings _spi_settings; - bool _initial_write, _initial_refresh; - bool _power_is_on, _using_partial_mode, _hibernating; +@@ -123,5 +124,5 @@ class GxEPD2_EPD uint16_t _reset_duration; - void (*_busy_callback)(const void*); + void (*_busy_callback)(const void*); diff --git a/src/CHANGES.md b/src/CHANGES.md index 3c3c553a..f24c77fc 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,10 @@ # Development Changes +## 0.8.3 - 2023-11-09 +* fix yield day reset during day #848 +* add total AC Max Power to WebUI +* fix opendtufusion build (GxEPD patch) + ## 0.8.2 - 2023-11-08 * beautified inverter settings in `setup` (preperation for future, settings become more inverter dependent) diff --git a/src/defines.h b/src/defines.h index 8e8b1f61..327b7f7e 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 2 +#define VERSION_PATCH 3 //------------------------------------- typedef struct { diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 023ae772..9bfe28b6 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -150,6 +150,9 @@ class Inverter { rssi = -127; memset(&radioStatistics, 0, sizeof(statistics_t)); memset(txRfQuality, -6, 5); + + memset(mOffYD, 0, sizeof(float) * 6); + memset(mLastYD, 0, sizeof(float) * 6); } void tickSend(std::function cb) { @@ -266,7 +269,12 @@ class Inverter { } else if (FLD_YT == rec->assign[pos].fieldId) { rec->record[pos] = ((REC_TYP)(val) / (REC_TYP)(div) * generalConfig->yieldEffiency) + ((REC_TYP)config->yieldCor[rec->assign[pos].ch-1]); } else if (FLD_YD == rec->assign[pos].fieldId) { - rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div) * generalConfig->yieldEffiency; + float actYD = (REC_TYP)(val) / (REC_TYP)(div) * generalConfig->yieldEffiency; + uint8_t idx = rec->assign[pos].ch - 1; + if (mLastYD[idx] > actYD) + mOffYD[idx] += mLastYD[idx]; + mLastYD[idx] = actYD; + rec->record[pos] = mOffYD[idx] + actYD; } else { if ((REC_TYP)(div) > 1) rec->record[pos] = (REC_TYP)(val) / (REC_TYP)(div); @@ -540,6 +548,9 @@ class Inverter { alarmNxtWrPos = 0; alarmCnt = 0; alarmLastId = 0; + + memset(mOffYD, 0, sizeof(float) * 6); + memset(mLastYD, 0, sizeof(float) * 6); } uint16_t parseAlarmLog(uint8_t id, uint8_t pyld[], uint8_t len) { @@ -662,7 +673,9 @@ class Inverter { radioId.b[0] = 0x01; } - bool mDevControlRequest; // true if change needed + private: + float mOffYD[6], mLastYD[6]; + bool mDevControlRequest; // true if change needed }; template diff --git a/src/platformio.ini b/src/platformio.ini index 942d2e15..d3c3c43c 100644 --- a/src/platformio.ini +++ b/src/platformio.ini @@ -30,7 +30,7 @@ lib_deps = https://github.com/bertmelis/espMqttClient#v1.4.5 bblanchon/ArduinoJson @ ^6.21.3 https://github.com/JChristensen/Timezone @ ^1.2.4 - olikraus/U8g2 @ ^2.34.17 + olikraus/U8g2 @ ^2.35.7 https://github.com/zinggjm/GxEPD2 @ ^1.5.2 build_flags = -std=c++17 @@ -98,7 +98,7 @@ lib_deps = https://github.com/bertmelis/espMqttClient#v1.4.4 bblanchon/ArduinoJson @ ^6.21.3 https://github.com/JChristensen/Timezone @ ^1.2.4 - olikraus/U8g2 @ ^2.34.17 + olikraus/U8g2 @ ^2.35.7 zinggjm/GxEPD2 @ ^1.5.2 build_flags = ${env.build_flags} -D ETHERNET diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html index 24153389..aa05e414 100644 --- a/src/web/html/visualization.html +++ b/src/web/html/visualization.html @@ -19,7 +19,7 @@ var units, ivEn; var mIvHtml = []; var mNum = 0; - var total = Array(5).fill(0); + var total = Array(6).fill(0); var tPwrAck; function parseGeneric(obj) { @@ -61,7 +61,7 @@ } function totals() { - for(var i = 0; i < 5; i++) { + for(var i = 0; i < 6; i++) { total[i] = Math.round(total[i] * 100) / 100; } @@ -80,8 +80,9 @@ ]), ml("div", {class: "hr"}), ml("div", {class: "row"}, [ - numMid(total[3], "W", "DC Power"), - numMid(total[4], "var", "Reactive Power") + numMid(total[3], "W", "Max Power"), + numMid(total[4], "W", "DC Power"), + numMid(total[5], "var", "Reactive Power") ]) ]) ]) @@ -90,8 +91,9 @@ function ivHead(obj) { if(0 != obj.status) { // only add totals if inverter is online total[0] += obj.ch[0][2]; // P_AC - total[3] += obj.ch[0][8]; // P_DC - total[4] += obj.ch[0][10]; // Q_AC + total[3] += obj.ch[0][11]; // MAX P_AC + total[4] += obj.ch[0][8]; // P_DC + total[5] += obj.ch[0][10]; // Q_AC } total[1] += obj.ch[0][7]; // YieldDay total[2] += obj.ch[0][6]; // YieldTotal From 4e9a09f33fe1a38a36fd48ab7f6831c3a2e38314 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 9 Nov 2023 23:01:08 +0100 Subject: [PATCH 35/42] 0.8.3 * fix null ptr PR #1222 --- src/CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CHANGES.md b/src/CHANGES.md index f24c77fc..4547d6ed 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -4,6 +4,7 @@ * fix yield day reset during day #848 * add total AC Max Power to WebUI * fix opendtufusion build (GxEPD patch) +* fix null ptr PR #1222 ## 0.8.2 - 2023-11-08 * beautified inverter settings in `setup` (preperation for future, settings become more inverter dependent) From c98d35d7c4204bc0d8d1c18eb63633e47854addf Mon Sep 17 00:00:00 2001 From: lumapu Date: Fri, 10 Nov 2023 23:08:51 +0100 Subject: [PATCH 36/42] 0.8.4 * changed MqTT alarm topic, removed retained flag #1212 * reduce last_success MQTT messages (#1124) --- src/CHANGES.md | 4 ++++ src/defines.h | 2 +- src/publisher/pubMqtt.h | 26 +++++++++----------------- src/publisher/pubMqttIvData.h | 5 +---- 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 4547d6ed..cb9d8deb 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,9 @@ # Development Changes +## 0.8.4 - 2023-11-10 +* changed MqTT alarm topic, removed retained flag #1212 +* reduce last_success MQTT messages (#1124) + ## 0.8.3 - 2023-11-09 * fix yield day reset during day #848 * add total AC Max Power to WebUI diff --git a/src/defines.h b/src/defines.h index 327b7f7e..add9623d 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 3 +#define VERSION_PATCH 4 //------------------------------------- typedef struct { diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index a65a6b61..48dbe150 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -516,25 +516,17 @@ class PubMqtt { snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/alarm/cnt", iv->config->name); snprintf(mVal, 40, "%d", iv->alarmCnt); - publish(mSubTopic, mVal, true); + publish(mSubTopic, mVal, false); for(uint8_t j = 0; j < 10; j++) { if(0 != iv->lastAlarm[j].code) { - snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/alarm/%d/code", iv->config->name, j); - snprintf(mVal, 40, "%d", iv->lastAlarm[j].code); - publish(mSubTopic, mVal, true); - - snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/alarm/%d/str", iv->config->name, j); - snprintf(mVal, 40, "%s", iv->getAlarmStr(iv->lastAlarm[j].code).c_str()); - publish(mSubTopic, mVal, true); - - snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/alarm/%d/start", iv->config->name, j); - snprintf(mVal, 40, "%d", iv->lastAlarm[j].start + lastMidnight); - publish(mSubTopic, mVal, true); - - snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/alarm/%d/end", iv->config->name, j); - snprintf(mVal, 40, "%d", iv->lastAlarm[j].end + lastMidnight); - publish(mSubTopic, mVal, true); + snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/alarm/%d", iv->config->name, j); + snprintf(mVal, 100, "{\"code\":%d,\"str\":\"%s\",\"start\":%d,\"end\":%d}", + iv->lastAlarm[j].code, + iv->getAlarmStr(iv->lastAlarm[j].code).c_str(), + iv->lastAlarm[j].start + lastMidnight, + iv->lastAlarm[j].end + lastMidnight); + publish(mSubTopic, mVal, false); yield(); } } @@ -613,7 +605,7 @@ class PubMqtt { // global buffer for mqtt topic. Used when publishing mqtt messages. char mTopic[MQTT_TOPIC_LEN + 32 + MAX_NAME_LENGTH + 1]; char mSubTopic[32 + MAX_NAME_LENGTH + 1]; - char mVal[40]; + char mVal[100]; discovery_t mDiscovery; }; diff --git a/src/publisher/pubMqttIvData.h b/src/publisher/pubMqttIvData.h index a1c03c86..053e359e 100644 --- a/src/publisher/pubMqttIvData.h +++ b/src/publisher/pubMqttIvData.h @@ -29,7 +29,6 @@ class PubMqttIvData { mZeroValues = false; memset(mIvLastRTRpub, 0, MAX_NUM_INVERTERS * sizeof(uint32_t)); - memset(mIvLastPublish, 0, MAX_NUM_INVERTERS * sizeof(uint32_t)); mRTRDataHasBeenSent = false; mTable[IDLE] = &PubMqttIvData::stateIdle; @@ -103,7 +102,7 @@ class PubMqttIvData { mPos = 0; if(found) { record_t<> *rec = mIv->getRecordStruct(mCmd); - if((mIv->getLastTs(rec) != mIvLastPublish[mIv->id]) && mIv->getLastTs(rec) != 0 ) { //workaround for startup. Suspect, mCmd might cause to much messages.... + if((RealTimeRunData_Debug == mCmd) && mIv->getLastTs(rec) != 0 ) { //workaround for startup. Suspect, mCmd might cause to much messages.... snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/last_success", mIv->config->name); snprintf(mVal, 40, "%d", mIv->getLastTs(rec)); mPublish(mSubTopic, mVal, true, QOS_0); @@ -134,7 +133,6 @@ class PubMqttIvData { pubData &= (lastTs != mIvLastRTRpub[mIv->id]); if (pubData) { - mIvLastPublish[mIv->id] = lastTs; if(mPos < rec->length) { bool retained = false; if (mCmd == RealTimeRunData_Debug) { @@ -241,7 +239,6 @@ class PubMqttIvData { Inverter<> *mIv, *mIvSend; uint8_t mPos; uint32_t mIvLastRTRpub[MAX_NUM_INVERTERS]; - uint32_t mIvLastPublish[MAX_NUM_INVERTERS]; bool mRTRDataHasBeenSent; char mSubTopic[32 + MAX_NAME_LENGTH + 1]; From efdac9634ff50febae4f395eeaf63311ca401875 Mon Sep 17 00:00:00 2001 From: lumapu Date: Sat, 11 Nov 2023 03:12:14 +0100 Subject: [PATCH 37/42] 0.8.4 * introduced tabs in WebGUI (inverter settings) * added inverter-wise power level and frequency --- src/CHANGES.md | 2 + src/app.cpp | 2 +- src/config/config.h | 3 - src/config/settings.h | 43 ++++++++++--- src/hm/Communication.h | 2 +- src/hm/hmInverter.h | 2 + src/hm/hmRadio.h | 7 +-- src/hms/cmt2300a.h | 4 ++ src/hms/hmsRadio.h | 16 ++++- src/web/RestApi.h | 12 +++- src/web/html/api.js | 42 ++++++++++--- src/web/html/setup.html | 129 ++++++++++++++++++++++++++------------- src/web/html/style.css | 51 +++++++++++++++- src/web/html/system.html | 2 - src/web/web.h | 2 - 15 files changed, 240 insertions(+), 79 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index cb9d8deb..3dc4a723 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -3,6 +3,8 @@ ## 0.8.4 - 2023-11-10 * changed MqTT alarm topic, removed retained flag #1212 * reduce last_success MQTT messages (#1124) +* introduced tabs in WebGUI (inverter settings) +* added inverter-wise power level and frequency ## 0.8.3 - 2023-11-09 * fix yield day reset during day #848 diff --git a/src/app.cpp b/src/app.cpp index afe17132..38f31e07 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -34,7 +34,7 @@ void app::setup() { DBGPRINTLN(F("false")); if(mConfig->nrf.enabled) { - mNrfRadio.setup(mConfig->nrf.amplifierPower, mConfig->nrf.pinIrq, mConfig->nrf.pinCe, mConfig->nrf.pinCs, mConfig->nrf.pinSclk, mConfig->nrf.pinMosi, mConfig->nrf.pinMiso); + mNrfRadio.setup(mConfig->nrf.pinIrq, mConfig->nrf.pinCe, mConfig->nrf.pinCs, mConfig->nrf.pinSclk, mConfig->nrf.pinMosi, mConfig->nrf.pinMiso); mNrfRadio.enableDebug(); } #if defined(ESP32) diff --git a/src/config/config.h b/src/config/config.h index f03ac702..e9d3adec 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -132,9 +132,6 @@ #define LED_HIGH_ACTIVE false #endif -// default NRF24 power, possible values (0 - 3) -#define DEF_AMPLIFIERPOWER 1 - // number of packets hold in buffer #define PACKET_BUFFER_SIZE 30 diff --git a/src/config/settings.h b/src/config/settings.h index 0771c148..d46e5687 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -30,6 +30,8 @@ * https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html#flash-layout * */ +#define CONFIG_VERSION 1 + #define PROT_MASK_INDEX 0x0001 #define PROT_MASK_LIVE 0x0002 @@ -88,7 +90,6 @@ typedef struct { uint8_t pinMiso; uint8_t pinMosi; uint8_t pinSclk; - uint8_t amplifierPower; } cfgNrf24_t; typedef struct { @@ -142,6 +143,8 @@ typedef struct { uint16_t chMaxPwr[6]; double yieldCor[6]; // YieldTotal correction value char chName[6][MAX_NAME_LENGTH]; + uint8_t frequency; + uint8_t powerLevel; } cfgIv_t; typedef struct { @@ -188,6 +191,7 @@ typedef struct { cfgInst_t inst; plugins_t plugin; bool valid; + uint16_t configVersion; } settings_t; class settings { @@ -284,6 +288,7 @@ class settings { if(root.containsKey(F("led"))) jsonLed(root[F("led")]); if(root.containsKey(F("plugin"))) jsonPlugin(root[F("plugin")]); if(root.containsKey(F("inst"))) jsonInst(root[F("inst")]); + getConfigVersion(root.as()); } else { Serial.println(F("failed to parse json, using default config")); @@ -299,6 +304,7 @@ class settings { DynamicJsonDocument json(MAX_ALLOWED_BUF_SIZE); JsonObject root = json.to(); + json[F("version")] = CONFIG_VERSION; jsonNetwork(root.createNestedObject(F("wifi")), true); jsonNrf(root.createNestedObject(F("nrf")), true); #if defined(ESP32) @@ -391,7 +397,6 @@ class settings { mCfg.nrf.pinMosi = DEF_NRF_MOSI_PIN; mCfg.nrf.pinSclk = DEF_NRF_SCLK_PIN; - mCfg.nrf.amplifierPower = DEF_AMPLIFIERPOWER & 0x03; mCfg.nrf.enabled = true; #if defined(ESP32) @@ -436,6 +441,11 @@ class settings { mCfg.inst.rstMaxValsMidNight = false; mCfg.inst.yieldEffiency = 0.955f; + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { + mCfg.inst.iv[i].powerLevel = 0xff; // impossible high value + mCfg.inst.iv[i].frequency = 0x12; // 863MHz (minimum allowed frequency) + } + mCfg.led.led0 = DEF_LED0; mCfg.led.led1 = DEF_LED1; mCfg.led.led_high_active = LED_HIGH_ACTIVE; @@ -446,13 +456,30 @@ class settings { mCfg.plugin.display.contrast = 60; mCfg.plugin.display.pxShift = true; mCfg.plugin.display.rot = 0; - mCfg.plugin.display.disp_data = DEF_PIN_OFF; // SDA - mCfg.plugin.display.disp_clk = DEF_PIN_OFF; // SCL + mCfg.plugin.display.disp_data = DEF_PIN_OFF; // SDA + mCfg.plugin.display.disp_clk = DEF_PIN_OFF; // SCL mCfg.plugin.display.disp_cs = DEF_PIN_OFF; mCfg.plugin.display.disp_reset = DEF_PIN_OFF; mCfg.plugin.display.disp_busy = DEF_PIN_OFF; mCfg.plugin.display.disp_dc = DEF_PIN_OFF; - } + } + + void loadAddedDefaults() { + if(0 == mCfg.configVersion) { + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { + mCfg.inst.iv[i].powerLevel = 0xff; // impossible high value + mCfg.inst.iv[i].frequency = 0x12; // 863MHz (minimum allowed frequency) + } + } + } + + void getConfigVersion(JsonObject obj) { + getVal(obj, F("version"), &mCfg.configVersion); + DPRINT(DBG_INFO, F("Config Version: ")); + DBGPRINTLN(String(mCfg.configVersion)); + if(CONFIG_VERSION != mCfg.configVersion) + loadAddedDefaults(); + } void jsonNetwork(JsonObject obj, bool set = false) { if(set) { @@ -506,7 +533,6 @@ class settings { obj[F("sclk")] = mCfg.nrf.pinSclk; obj[F("mosi")] = mCfg.nrf.pinMosi; obj[F("miso")] = mCfg.nrf.pinMiso; - obj[F("pwr")] = mCfg.nrf.amplifierPower; obj[F("en")] = (bool) mCfg.nrf.enabled; } else { getVal(obj, F("intvl"), &mCfg.nrf.sendInterval); @@ -516,7 +542,6 @@ class settings { getVal(obj, F("sclk"), &mCfg.nrf.pinSclk); getVal(obj, F("mosi"), &mCfg.nrf.pinMosi); getVal(obj, F("miso"), &mCfg.nrf.pinMiso); - getVal(obj, F("pwr"), &mCfg.nrf.amplifierPower); #if !defined(ESP32) mCfg.nrf.enabled = true; // ESP8266, read always as enabled #else @@ -707,6 +732,8 @@ class settings { obj[F("en")] = (bool)cfg->enabled; obj[F("name")] = cfg->name; obj[F("sn")] = cfg->serial.u64; + obj[F("freq")] = cfg->frequency; + obj[F("pa")] = cfg->powerLevel; for(uint8_t i = 0; i < 6; i++) { obj[F("yield")][i] = cfg->yieldCor[i]; obj[F("pwr")][i] = cfg->chMaxPwr[i]; @@ -716,6 +743,8 @@ class settings { getVal(obj, F("en"), &cfg->enabled); getChar(obj, F("name"), cfg->name, MAX_NAME_LENGTH); getVal(obj, F("sn"), &cfg->serial.u64); + getVal(obj, F("freq"), &cfg->frequency); + getVal(obj, F("pa"), &cfg->powerLevel); uint8_t size = 4; if(obj.containsKey(F("pwr"))) size = obj[F("pwr")].size(); diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 95f438d5..2675d1a2 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -92,7 +92,7 @@ class Communication : public CommQueue<> { q->iv->radioStatistics.rxFailNoAnser++; // got nothing mHeu.setGotNothing(q->iv); if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { - q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); + q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, (q->iv->config->frequency*FREQ_STEP_KHZ + HOY_BASE_FREQ_KHZ)); mWaitTimeout = millis() + 1000; } } else diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 9bfe28b6..52b7c5dd 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -129,6 +129,7 @@ class Inverter { statistics_t radioStatistics; // information about transmitted, failed, ... packets int8_t txRfQuality[5]; // heuristics tx quality (check 'Heuristics.h') uint8_t txRfChId; // RF TX channel id + uint8_t curCmtFreq; // current used CMT frequency, used to check if freq. was changed during runtime static uint32_t *timestamp; // system timestamp static cfgInst_t *generalConfig; // general inverter configuration from setup @@ -194,6 +195,7 @@ class Inverter { initAssignment(&recordConfig, SystemConfigPara); initAssignment(&recordAlarm, AlarmData); toRadioId(); + curCmtFreq = this->config->frequency; // update to frequency read from settings } uint8_t getPosByChFld(uint8_t channel, uint8_t fieldId, record_t<> *rec) { diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index 203f39aa..a55c7d3c 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -45,7 +45,7 @@ class HmRadio : public Radio { } ~HmRadio() {} - void setup(uint8_t ampPwr = RF24_PA_LOW, uint8_t irq = IRQ_PIN, uint8_t ce = CE_PIN, uint8_t cs = CS_PIN, uint8_t sclk = SCLK_PIN, uint8_t mosi = MOSI_PIN, uint8_t miso = MISO_PIN) { + void setup(uint8_t irq = IRQ_PIN, uint8_t ce = CE_PIN, uint8_t cs = CS_PIN, uint8_t sclk = SCLK_PIN, uint8_t mosi = MOSI_PIN, uint8_t miso = MISO_PIN) { DPRINTLN(DBG_VERBOSE, F("hmRadio.h:setup")); pinMode(irq, INPUT_PULLUP); @@ -81,9 +81,7 @@ class HmRadio : public Radio { // enable all receiving interrupts mNrf24.maskIRQ(false, false, false); - DPRINT(DBG_INFO, F("RF24 Amp Pwr: RF24_PA_")); - DPRINTLN(DBG_INFO, String(rf24AmpPowerNames[ampPwr])); - mNrf24.setPALevel(ampPwr & 0x03); + mNrf24.setPALevel(1); // low is default if(mNrf24.isChipConnected()) { DPRINTLN(DBG_INFO, F("Radio Config:")); @@ -269,6 +267,7 @@ class HmRadio : public Radio { } void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) { + mNrf24.setPALevel(iv->config->powerLevel & 0x03); updateCrcs(&len, appendCrc16); // set TX and RX channels diff --git a/src/hms/cmt2300a.h b/src/hms/cmt2300a.h index ab54617d..75d2ce5c 100644 --- a/src/hms/cmt2300a.h +++ b/src/hms/cmt2300a.h @@ -422,6 +422,10 @@ class Cmt2300a { return HOY_BASE_FREQ_KHZ + (mCurCh * FREQ_STEP_KHZ); } + uint8_t getCurrentChannel(void) { + return mCurCh; + } + void setPaLevel(int8_t level) { if(level < -10) level = -10; diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index 097a3f03..811c60d2 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -66,6 +66,11 @@ class CmtRadio : public Radio { uint8_t fromCh = mCmt.freq2Chan(fromkHz); uint8_t toCh = mCmt.freq2Chan(tokHz); + return switchFrequencyCh(iv, fromCh, toCh); + } + + private: + bool switchFrequencyCh(Inverter<> *iv, uint8_t fromCh, uint8_t toCh) { if((0xff == fromCh) || (0xff == toCh)) return false; @@ -75,8 +80,17 @@ class CmtRadio : public Radio { return true; } - private: void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) { + // frequency was changed during runtime + if(iv->curCmtFreq != iv->config->frequency) { + if(switchFrequencyCh(iv, iv->curCmtFreq, iv->config->frequency)) + iv->curCmtFreq = iv->config->frequency; + } else { + // inverters have maybe different settings regarding frequency + if(mCmt.getCurrentChannel() != iv->config->frequency) + mCmt.switchChannel(iv->config->frequency); + } + updateCrcs(&len, appendCrc16); if(mSerialDebug) { diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 2267661e..6e977309 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -346,7 +346,14 @@ class RestApi { obj2[F("name")] = String(iv->config->name); obj2[F("serial")] = String(iv->config->serial.u64, HEX); obj2[F("channels")] = iv->channels; - obj2[F("version")] = String(iv->getFwVersion()); + obj2[F("freq")] = iv->config->frequency; + if(0xff == iv->config->powerLevel) { + if((IV_HMT == iv->ivGen) || (IV_HMS == iv->ivGen)) + obj2[F("pa")] = 30; // 20dBm + else + obj2[F("pa")] = 1; // low + } else + obj2[F("pa")] = iv->config->powerLevel; for(uint8_t j = 0; j < iv->channels; j ++) { obj2[F("ch_yield_cor")][j] = (double)iv->config->yieldCor[j]; @@ -529,7 +536,6 @@ class RestApi { void getRadioNrf(JsonObject obj) { obj[F("en")] = (bool) mConfig->nrf.enabled; obj[F("isconnected")] = mRadioNrf->isChipConnected(); - obj[F("power_level")] = mConfig->nrf.amplifierPower; obj[F("dataRate")] = mRadioNrf->getDataRate(); //obj[F("isPVariant")] = mRadioNrf->isPVariant(); } @@ -736,6 +742,8 @@ class RestApi { case 0x61: iv->type = INV_TYPE_4CH; iv->channels = 4; break; default: break; } + iv->config->frequency = jsonIn[F("freq")]; + iv->config->powerLevel = jsonIn[F("pa")]; mApp->saveSettings(false); // without reboot } else { jsonOut[F("error")] = F("unknown cmd"); diff --git a/src/web/html/api.js b/src/web/html/api.js index 8c0ba54e..11db6c45 100644 --- a/src/web/html/api.js +++ b/src/web/html/api.js @@ -192,6 +192,34 @@ function badge(success, text, second="error") { return ml("span", {class: "badge badge-" + ((success) ? "success" : second)}, text); } +function tabChange(id) { + var els = document.getElementsByClassName("nav-link"); + [].forEach.call(els, function(e) { + if(e.id != id) + e.classList.remove('active'); + else + e.classList.add('active'); + }); + + els = document.getElementsByClassName("tab-content"); + [].forEach.call(els, function(e) { + if(e.id == ("div"+id.substring(3))) + e.classList.remove('hide'); + else + e.classList.add('hide'); + }); +} + +function tabs(items) { + var li = []; + var cl = " active"; + for(it of items) { + li.push(ml("li", {class: "nav-item"},ml("a", {id: "tab"+it, class: "nav-link" + cl, href: "#", onclick: function(){tabChange(this.id)}}, it))) + cl = ""; + } + return ml("ul", {class: "nav nav-tabs mb-4"}, li); +} + function des(val) { e = document.createElement('p'); e.classList.add("subdes"); @@ -223,13 +251,11 @@ function inp(name, val, max=32, cl=["text"], id=null, type=null, pattern=null, t } function sel(name, options, selId) { - e = document.createElement('select'); - e.name = name; + var o = []; for(it of options) { - o = opt(it[0], it[1], (it[0] == selId)); - e.appendChild(o); + o.push(opt(it[0], it[1], (it[0] == selId))); } - return e; + return ml("select", {name: name}, o); } function selDelAllOpt(sel) { @@ -240,9 +266,7 @@ function selDelAllOpt(sel) { } function opt(val, html, sel=false) { - o = document.createElement('option'); - o.value = val; - o.innerHTML = html; + var o = ml("option", {value: val}, html); if(sel) o.selected = true; return o; @@ -301,7 +325,7 @@ function svg(data=null, w=24, h=24, cl=null, tooltip=null) { function modal(title, body) { if(null == document.getElementById("modal")) { document.getElementById("wrapper").append( - ml("div", {id: "modal-wrapper", class: "modal", onclick: modalClose}), + ml("div", {id: "modal-wrapper", onclick: modalClose}), ml("div", {id: "modal", class: "modal"}, ml("div", {class: "modal-content"}, [ ml("div", {class: "modal-header"}, [ diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 2ec5d2b5..1ca46ced 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -438,6 +438,23 @@ [47, "GPIO47"], [48, "GPIO48"], ]; + var nrfPa = [ + [0, "MIN (recommended)"], + [1, "LOW"], + [2, "HIGH"], + [3, "MAX (experimental)"] + ]; + var esp32cmtPa = []; + var esp32cmtFreq = []; + var freqFmt = new Intl.NumberFormat('en-US', { + minimumIntegerDigits: 3, + minimumFractionDigits: 2 + }); + for(var i = 0; i < 31; i++) { + esp32cmtPa.push([i, String(i-10) + " dBm"]); + if(i < 29) + esp32cmtFreq.push([i, freqFmt.format(860 + i*0.25) + " MHz"]); + } /*ENDIF_ESP32*/ var led_high_active = [ [0, "low active"], @@ -647,6 +664,7 @@ ml("th", {}, "Name (optional)"), ml("th", {}, "Yield Correction [kWh] (optional)") ])); + for(let i = 0; i < 6; i++) { lines.push(ml("tr", {id: "ch"+i}, [ ml("td", {}, String(i+1)), @@ -655,29 +673,54 @@ ml("td", {}, ml("input", {name: "yld_c"+i, class: "text", type: "number", max: 999999, value: obj.ch_yield_cor[i]}, null)) ])); } + var cbEn = ml("input", {name: "enable", type: "checkbox"}, null); if(obj.enabled) cbEn.checked = true; var ser = ml("input", {name: "ser", class: "text", type: "number", max: 138999999999, value: obj.serial}, null); var html = ml("div", {}, [ - ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4"}, "Serial"), - ml("div", {class: "col-8"}, ser) + tabs(["General", "Inputs", "Radio"]), + ml("div", {id: "divGeneral", class: "tab-content"}, [ + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-4"}, "Enable"), + ml("div", {class: "col-8"}, cbEn) + ]), + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-4 mt-2"}, "Serial"), + ml("div", {class: "col-8"}, ser) + ]), + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-4 mt-2"}, "Name"), + ml("div", {class: "col-8"}, ml("input", {name: "name", class: "text", type: "text", value: obj.name}, null)) + ]) ]), - ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4"}, "Name"), - ml("div", {class: "col-8"}, ml("input", {name: "name", class: "text", type: "text", value: obj.name}, null)) + ml("div", {id: "divInputs", class: "tab-content hide"}, [ + ml("div", {class: "row mb-3"}, + ml("table", {class: "table"}, + ml("tbody", {}, lines) + ) + ) ]), - ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4"}, "Enable"), - ml("div", {class: "col-8"}, cbEn) + ml("div", {id: "divRadio", class: "tab-content hide"}, [ + ml("input", {type: "hidden", name: "isnrf"}, null), + ml("div", {id: "setcmt"}, [ + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-4 mt-2"}, "Frequency"), + ml("div", {class: "col-8"}, sel("freq", esp32cmtFreq, obj.freq)) + ]), + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-4 mt-2"}, "Power Level"), + ml("div", {class: "col-8"}, sel("cmtpa", esp32cmtPa, obj.pa)) + ]), + ]), + ml("div", {id: "setnrf"}, + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-4 mt-2"}, "Power Level"), + ml("div", {class: "col-8"}, sel("nrfpa", nrfPa, obj.pa)) + ]), + ), ]), - ml("div", {class: "row mb-3"}, - ml("table", {class: "table"}, - ml("tbody", {}, lines) - ) - ), - ml("div", {class: "row mb-3"}, [ + ml("div", {class: "row mt-5"}, [ ml("div", {class: "col-8", id: "res"}, ""), ml("div", {class: "col-4 a-r"}, ml("input", {type: "button", value: "save", class: "btn", onclick: function() { ivSave(); }}, null)) ]) @@ -685,28 +728,34 @@ ['keyup', 'change'].forEach(function(evt) { ser.addEventListener(evt, (e) => { - var serial = ser.value.substring(0,4); + var sn = parseInt(ser.value, 16); + sn = Math.floor(sn / Math.pow(2, 32)); + var max = 1; + switch(sn & 0x00f0) { + case 0x0010: max = 1; break; + case 0x0040: max = 2; break; + case 0x0060: max = 4; break; + case 0x0080: max = 6; break; + } for(var i = 0; i < 6; i++) { - setHide("ch"+i, true); + setHide("ch"+i, (i >= max)); } - if(serial.charAt(0) == 1) { - if((serial.charAt(1) == 0) || (serial.charAt(1) == 1) || (serial.charAt(1) == 3)) { - if((serial.charAt(3) == 1) || (serial.charAt(3) == 2) || (serial.charAt(3) == 4)) { - switch(serial.charAt(2)) { - default: - case "2": max = 1; break; - case "4": max = 2; break; - case "6": max = 4; break; - case "8": max = 6; break; - } + var nrf = true; + switch(sn & 0xff00) { + case 0x1000: nrf = true; break; + case 0x1100: + switch(sn & 0x000f) { + case 0x0004: nrf = false; break; + default: nrf = true; break; } - } - } - for(var i = 0; i < max; i++) { - setHide("ch"+i, false); + break; + case 0x1300: nrf = false; break; } + setHide("setcmt", nrf); + setHide("setnrf", !nrf); + document.getElementsByName("isnrf")[0].value = nrf; }) }); @@ -728,6 +777,11 @@ q.yld = document.getElementsByName("yld_c"+i)[0].value; o.ch.push(q); } + if("true" == document.getElementsByName("isnrf")[0].value) + o.pa = document.getElementsByName("nrfpa")[0].value; + else + o.pa = document.getElementsByName("cmtpa")[0].value; + o.freq = document.getElementsByName("freq")[0].value; getAjax("/api/setup", cb, "POST", JSON.stringify(o)); } @@ -845,19 +899,6 @@ ]) ); } - e.append( - ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-12 col-sm-3 my-2"}, "Power Level"), - ml("div", {class: "col-12 col-sm-9"}, - sel("rf24Power", [ - [0, "MIN (recommended)"], - [1, "LOW"], - [2, "HIGH"], - [3, "MAX (experimental)"] - ], obj["power_level"]) - ) - ]) - ); } /*IF_ESP32*/ diff --git a/src/web/html/style.css b/src/web/html/style.css index 8c40c780..064819f5 100644 --- a/src/web/html/style.css +++ b/src/web/html/style.css @@ -686,7 +686,7 @@ div.hr { margin: 1.75rem auto; } -.modal { +.modal, #modal-wrapper { position: fixed; top: 0; right: 0; @@ -695,6 +695,10 @@ div.hr { display: block; } +.modal { + height: calc(100% - 3.5rem); +} + #modal-wrapper { background-color: #000; opacity: 0.5; @@ -710,6 +714,8 @@ div.hr { background-clip: padding-box; border: 1px solid var(--fg); flex-direction: column; + max-height: 100%; + overflow: hidden; } .modal-header { @@ -717,7 +723,7 @@ div.hr { align-items: flex-start; justify-content: space-between; padding: 1rem; - border-bottom: 1px solid #e9ecef; + border-bottom: 1px solid var(--table-border); } .modal-header .close { @@ -726,7 +732,8 @@ div.hr { } .modal-body { - padding: 1rem 1rem 2rem 1rem; + padding: 1rem; + overflow-y: auto; } .close { @@ -779,3 +786,41 @@ h5 { vertical-align: baseline; border-radius: .25rem; } + +ul { + margin-top: 0; +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + list-style: none; +} + +.nav-tabs { + border-bottom: 1px solid var(--fg); +} + +.nav-tabs .nav-link { + margin-bottom: -1px; + border: 1px solid transparent; + border-top-left-radius: .25rem; + border-top-right-radius: .25rem; +} + +.nav-link { + display: block; + padding: .5rem 1rem; + text-decoration: none; + color: var(--fg); +} + +.nav-tabs .nav-link.active { + border-color: var(--fg) var(--fg) var(--bg); +} + +.nav-link:hover, .nav-link:visited { + background-color: var(--input-bg); + color: var(--fg); +} diff --git a/src/web/html/system.html b/src/web/html/system.html index 7eddd7b0..a310890d 100644 --- a/src/web/html/system.html +++ b/src/web/html/system.html @@ -45,13 +45,11 @@ } function parseRadio(obj) { - const pa = ["MIN (recommended)", "LOW", "HIGH", "MAX"]; const dr = ["1 M", "2 M", "250 k"] if(obj.radioNrf.en) { lines = [ tr("NRF24L01", badge(obj.radioNrf.isconnected, ((obj.radioNrf.isconnected) ? "" : "not ") + "connected")), - tr("NRF24 Power Level", pa[obj.radioNrf.power_level]), tr("NRF24 Data Rate", dr[obj.radioNrf.dataRate] + "bps") ]; } else diff --git a/src/web/web.h b/src/web/web.h index 002c3cbc..c37db811 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -519,8 +519,6 @@ class Web { } } - // nrf24 amplifier power - mConfig->nrf.amplifierPower = request->arg("rf24Power").toInt() & 0x03; mConfig->nrf.enabled = (request->arg("nrfEnable") == "on"); // cmt From 8ac895f50a372fbe3ad861725bd5ad7e8d08b20d Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 12 Nov 2023 12:02:11 +0100 Subject: [PATCH 38/42] 0.8.5 * fixed endless loop while switching CMT frequency * removed obsolete "retries" field from settings #1224 * fixed crash while defining new invertes #1224 * fixed default frequency settings * added default input power to `400` while adding new inverters * fixed color of wifi RSSI icon #1224 --- src/CHANGES.md | 8 ++++++++ src/app.cpp | 10 +--------- src/app.h | 11 +++++++++++ src/appInterface.h | 1 + src/config/settings.h | 4 ++-- src/defines.h | 2 +- src/hm/Communication.h | 10 ++++++++++ src/hm/hmInverter.h | 1 + src/hm/hmSystem.h | 13 +++---------- src/hm/radio.h | 1 + src/hms/hmsRadio.h | 15 +++++---------- src/web/RestApi.h | 15 +-------------- src/web/html/api.js | 2 +- src/web/html/setup.html | 13 ++++++------- src/web/html/style.css | 7 ++++++- 15 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 3dc4a723..6c4f0a6d 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,13 @@ # Development Changes +## 0.8.5 - 2023-11-12 +* fixed endless loop while switching CMT frequency +* removed obsolete "retries" field from settings #1224 +* fixed crash while defining new invertes #1224 +* fixed default frequency settings +* added default input power to `400` while adding new inverters +* fixed color of wifi RSSI icon #1224 + ## 0.8.4 - 2023-11-10 * changed MqTT alarm topic, removed retained flag #1212 * reduce last_success MQTT messages (#1124) diff --git a/src/app.cpp b/src/app.cpp index 38f31e07..838c375f 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -63,15 +63,7 @@ void app::setup() { mCommunication.addPayloadListener(std::bind(&app::payloadEventListener, this, std::placeholders::_1, std::placeholders::_2)); mSys.setup(&mTimestamp, &mConfig->inst); for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { - mSys.addInverter(i, [this](Inverter<> *iv) { - // will be only called for valid inverters - if((IV_MI == iv->ivGen) || (IV_HM == iv->ivGen)) - iv->radio = &mNrfRadio; - #if defined(ESP32) - else if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) - iv->radio = &mCmtRadio; - #endif - }); + initInverter(i); } if(mConfig->nrf.enabled) { diff --git a/src/app.h b/src/app.h index c257d83d..0bb1c170 100644 --- a/src/app.h +++ b/src/app.h @@ -104,6 +104,17 @@ class app : public IApp, public ah::Scheduler { return true; } + void initInverter(uint8_t id) { + mSys.addInverter(id, [this](Inverter<> *iv) { + if((IV_MI == iv->ivGen) || (IV_HM == iv->ivGen)) + iv->radio = &mNrfRadio; + #if defined(ESP32) + else if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) + iv->radio = &mCmtRadio; + #endif + }); + } + bool readSettings(const char *path) { return mSettings.readSettings(path); } diff --git a/src/appInterface.h b/src/appInterface.h index 4bfc3b0c..802f21e6 100644 --- a/src/appInterface.h +++ b/src/appInterface.h @@ -25,6 +25,7 @@ class IApp { public: virtual ~IApp() {} virtual bool saveSettings(bool stopFs) = 0; + virtual void initInverter(uint8_t id) = 0; virtual bool readSettings(const char *path) = 0; virtual bool eraseSettings(bool eraseWifi) = 0; virtual bool getSavePending() = 0; diff --git a/src/config/settings.h b/src/config/settings.h index d46e5687..27aaf953 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -465,10 +465,10 @@ class settings { } void loadAddedDefaults() { - if(0 == mCfg.configVersion) { + if(0 < mCfg.configVersion) { for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { mCfg.inst.iv[i].powerLevel = 0xff; // impossible high value - mCfg.inst.iv[i].frequency = 0x12; // 863MHz (minimum allowed frequency) + mCfg.inst.iv[i].frequency = 0x0; // 860MHz (backward compatibility) } } } diff --git a/src/defines.h b/src/defines.h index add9623d..eeee3574 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 4 +#define VERSION_PATCH 5 //------------------------------------- typedef struct { diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 2675d1a2..ea760200 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -57,11 +57,21 @@ class Communication : public CommQueue<> { mHeu.printStatus(q->iv); mHeu.getTxCh(q->iv); mGotFragment = false; + if(NULL == q->iv->radio) + cmdDone(true); // can't communicate while radio is not defined! mState = States::START; break; case States::START: setTs(mTimestamp); + if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { + // frequency was changed during runtime + if(q->iv->curCmtFreq != q->iv->config->frequency) { + if(q->iv->radio->switchFrequencyCh(q->iv, q->iv->curCmtFreq, q->iv->config->frequency)) + q->iv->curCmtFreq = q->iv->config->frequency; + } + } + if(q->isDevControl) { if(ActivePowerContr == q->cmd) q->iv->powerLimitAck = false; diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index 52b7c5dd..f52bafe9 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -149,6 +149,7 @@ class Inverter { alarmCnt = 0; alarmLastId = 0; rssi = -127; + radio = NULL; memset(&radioStatistics, 0, sizeof(statistics_t)); memset(txRfQuality, -6, 5); diff --git a/src/hm/hmSystem.h b/src/hm/hmSystem.h index de0d5911..b86f8d08 100644 --- a/src/hm/hmSystem.h +++ b/src/hm/hmSystem.h @@ -17,17 +17,12 @@ class HmSystem { void setup(uint32_t *timestamp, cfgInst_t *config) { mInverter[0].timestamp = timestamp; mInverter[0].generalConfig = config; - mNumInv = 0; } void addInverter(uint8_t id, std::function *iv)> cb) { DPRINTLN(DBG_VERBOSE, F("hmSystem.h:addInverter")); - if(MAX_INVERTER <= mNumInv) { - DPRINT(DBG_WARN, F("max number of inverters reached!")); - return; - } - INVERTERTYPE *iv = &mInverter[mNumInv]; - iv->id = mNumInv; + INVERTERTYPE *iv = &mInverter[id]; + iv->id = id; iv->config = &mInverter[0].generalConfig->iv[id]; DPRINT(DBG_VERBOSE, "SERIAL: " + String(iv->config->serial.b[5], HEX)); DPRINTLN(DBG_VERBOSE, " " + String(iv->config->serial.b[4], HEX)); @@ -73,7 +68,6 @@ class HmSystem { iv->ivGen = IV_UNKNOWN; iv->init(); - mNumInv ++; if(IV_UNKNOWN == iv->ivGen) return; // serial is 0 @@ -99,7 +93,7 @@ class HmSystem { INVERTERTYPE *findInverter(uint8_t buf[]) { DPRINTLN(DBG_VERBOSE, F("hmSystem.h:findInverter")); INVERTERTYPE *p; - for(uint8_t i = 0; i < mNumInv; i++) { + for(uint8_t i = 0; i < MAX_INVERTER; i++) { p = &mInverter[i]; if((p->config->serial.b[3] == buf[0]) && (p->config->serial.b[2] == buf[1]) @@ -134,7 +128,6 @@ class HmSystem { private: INVERTERTYPE mInverter[MAX_INVERTER]; - uint8_t mNumInv; }; #endif /*__HM_SYSTEM_H__*/ diff --git a/src/hm/radio.h b/src/hm/radio.h index 79239022..07317e8c 100644 --- a/src/hm/radio.h +++ b/src/hm/radio.h @@ -23,6 +23,7 @@ class Radio { public: virtual void sendControlPacket(Inverter<> *iv, uint8_t cmd, uint16_t *data, bool isRetransmit) = 0; virtual bool switchFrequency(Inverter<> *iv, uint32_t fromkHz, uint32_t tokHz) { return true; } + virtual bool switchFrequencyCh(Inverter<> *iv, uint8_t fromCh, uint8_t toCh) { return true; } virtual void loop(void) {}; bool get() { diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h index 811c60d2..bcb08c3f 100644 --- a/src/hms/hmsRadio.h +++ b/src/hms/hmsRadio.h @@ -69,7 +69,6 @@ class CmtRadio : public Radio { return switchFrequencyCh(iv, fromCh, toCh); } - private: bool switchFrequencyCh(Inverter<> *iv, uint8_t fromCh, uint8_t toCh) { if((0xff == fromCh) || (0xff == toCh)) return false; @@ -80,16 +79,12 @@ class CmtRadio : public Radio { return true; } + private: + void sendPacket(Inverter<> *iv, uint8_t len, bool isRetransmit, bool appendCrc16=true) { - // frequency was changed during runtime - if(iv->curCmtFreq != iv->config->frequency) { - if(switchFrequencyCh(iv, iv->curCmtFreq, iv->config->frequency)) - iv->curCmtFreq = iv->config->frequency; - } else { - // inverters have maybe different settings regarding frequency - if(mCmt.getCurrentChannel() != iv->config->frequency) - mCmt.switchChannel(iv->config->frequency); - } + // inverters have maybe different settings regarding frequency + if(mCmt.getCurrentChannel() != iv->config->frequency) + mCmt.switchChannel(iv->config->frequency); updateCrcs(&len, appendCrc16); diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 6e977309..53adb23f 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -728,20 +728,7 @@ class RestApi { snprintf(iv->config->chName[i], MAX_NAME_LENGTH, "%s", jsonIn[F("ch")][i][F("name")].as()); } - switch(iv->config->serial.b[4]) { - case 0x24: - case 0x22: - case 0x21: iv->type = INV_TYPE_1CH; iv->channels = 1; break; - - case 0x44: - case 0x42: - case 0x41: iv->type = INV_TYPE_2CH; iv->channels = 2; break; - - case 0x64: - case 0x62: - case 0x61: iv->type = INV_TYPE_4CH; iv->channels = 4; break; - default: break; - } + mApp->initInverter(jsonIn[F("id")]); iv->config->frequency = jsonIn[F("freq")]; iv->config->powerLevel = jsonIn[F("pa")]; mApp->saveSettings(false); // without reboot diff --git a/src/web/html/api.js b/src/web/html/api.js index 11db6c45..2eea8d94 100644 --- a/src/web/html/api.js +++ b/src/web/html/api.js @@ -126,7 +126,7 @@ function parseRssi(obj) { icon = iconWifi1; else if(obj["wifi_rssi"] <= -70) icon = iconWifi2; - document.getElementById("wifiicon").replaceChildren(svg(icon, 32, 32, "icon-fg", obj["wifi_rssi"])); + document.getElementById("wifiicon").replaceChildren(svg(icon, 32, 32, "icon-fg2", obj["wifi_rssi"])); } function toIsoDateStr(d) { diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 1ca46ced..a21aa073 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -149,10 +149,6 @@
Interval [s]
-
-
Max retries per Payload
-
-
Reset values and YieldDay at midnight
@@ -578,7 +574,7 @@ } function ivGlob(obj) { - for(var i of [["invInterval", "interval"], ["invRetry", "retries"], ["yldEff", "yldEff"]]) + for(var i of [["invInterval", "interval"], ["yldEff", "yldEff"]]) document.getElementsByName(i[0])[0].value = obj[i[1]]; for(var i of ["Mid", "ComStop", "NotAvail", "MaxMid"]) document.getElementsByName("invRst"+i)[0].checked = obj["rst" + i]; @@ -644,14 +640,17 @@ add.id = obj.inverter.length; add.name = ""; add.enabled = true; - add.ch_max_pwr = []; + add.ch_max_pwr = [400,400,400,400,400,400]; add.ch_name = []; add.ch_yield_cor = []; + add.freq = 12; + add.pa = 30; var e = document.getElementById("inverter"); e.innerHTML = ""; // remove all childs e.append(ml("table", {class: "table"}, ml("tbody", {}, lines))); - e.append(ml("div", {class: "row my-3"}, ml("div", {class: "col a-r"}, ml("input", {type: "button", value: "add Inverter", class: "btn", onclick: function() { ivModal(add); }}, null)))); + if(obj.max_num_inverters > obj.inverter.length) + e.append(ml("div", {class: "row my-3"}, ml("div", {class: "col a-r"}, ml("input", {type: "button", value: "add Inverter", class: "btn", onclick: function() { ivModal(add); }}, null)))); ivGlob(obj); } diff --git a/src/web/html/style.css b/src/web/html/style.css index 064819f5..b31ae7c9 100644 --- a/src/web/html/style.css +++ b/src/web/html/style.css @@ -98,6 +98,10 @@ svg.icon { fill: var(--fg); } +.icon-fg2 { + fill: var(--fg2); +} + .title { background-color: var(--primary); color: #fff !important; @@ -817,7 +821,8 @@ ul { } .nav-tabs .nav-link.active { - border-color: var(--fg) var(--fg) var(--bg); + border-color: var(--primary) var(--fg) var(--bg); + border-top-width: 4px; } .nav-link:hover, .nav-link:visited { From e8dbe02e4f3672b20d53177c9bf423de4b92b6c6 Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 12 Nov 2023 12:05:58 +0100 Subject: [PATCH 39/42] merged --- src/hm/Communication.h | 16 +++++++++++++++- src/hm/Heuristic.h | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/hm/Communication.h b/src/hm/Communication.h index ea760200..fb1709c5 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -57,6 +57,7 @@ class Communication : public CommQueue<> { mHeu.printStatus(q->iv); mHeu.getTxCh(q->iv); mGotFragment = false; + mFirstTry = mFirstTry ? false : ( (IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen) ) && (q->iv->isAvailable()); //) || (millis() < 120000));} if(NULL == q->iv->radio) cmdDone(true); // can't communicate while radio is not defined! mState = States::START; @@ -98,7 +99,7 @@ class Communication : public CommQueue<> { DBGPRINT(String(millis() - mWaitTimeout + timeout)); DBGPRINTLN(F("ms")); - if(!mGotFragment) { + if(!mGotFragment && !mFirstTry) { q->iv->radioStatistics.rxFailNoAnser++; // got nothing mHeu.setGotNothing(q->iv); if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { @@ -112,6 +113,7 @@ class Communication : public CommQueue<> { } mGotFragment = true; + mFirstTry = false; // for correct reset States nextState = States::RESET; while(!q->iv->radio->mBufCtrl.empty()) { packet_t *p = &q->iv->radio->mBufCtrl.front(); @@ -270,6 +272,7 @@ class Communication : public CommQueue<> { record_t<> *rec = q->iv->getRecordStruct(RealTimeRunData_Debug); // choose the record structure rec->ts = q->ts; miStsConsolidate(q, ((p->packet[0] == 0x88) ? 1 : 2), rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]); + mHeu.setGotFragment(q->iv); } } @@ -512,6 +515,9 @@ class Communication : public CommQueue<> { cmdDone(true); mState = States::RESET; q->iv->radioStatistics.rxSuccess++; + mHeu.setGotAll(q->iv); + } else { + mHeu.setGotFragment(q->iv); } /*if (mPayload[iv->id].multi_parts > 5) { @@ -572,12 +578,14 @@ class Communication : public CommQueue<> { //mPayload[iv->id].retransmits = 0; // reserve retransmissions for each response //mPayload[iv->id].complete = false; miNextRequest((p->packet[0] - ALL_FRAMES + 1), q); + mHeu.setGotFragment(q->iv); } else { miComplete(q->iv); } } else if((p->packet[0] == (MI_REQ_CH1 + ALL_FRAMES)) && (q->iv->type == INV_TYPE_2CH)) { //addImportant(q->iv, MI_REQ_CH2); miNextRequest(MI_REQ_CH2, q); + mHeu.setGotFragment(q->iv); } else { // first data msg for 1ch, 2nd for 2ch miComplete(q->iv); } @@ -709,7 +717,12 @@ class Communication : public CommQueue<> { // update status state-machine, if (ac_pow) iv->isProducing(); + mHeu.setGotAll(iv); cmdDone(true); + if(NULL != mCbPayload) + (mCbPayload)(RealTimeRunData_Debug, iv); + + mState = States::RESET; // everything ok, next request } private: @@ -729,6 +742,7 @@ class Communication : public CommQueue<> { uint32_t mWaitTimeout = 0; std::array mLocalBuf; bool mGotFragment = false; + bool mFirstTry = false; uint8_t mMaxFrameId; uint8_t mPayload[MAX_BUFFER]; payloadListenerType mCbPayload = NULL; diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h index 1675eda4..b9f6ab4f 100644 --- a/src/hm/Heuristic.h +++ b/src/hm/Heuristic.h @@ -48,8 +48,8 @@ class Heuristic { } void printStatus(Inverter<> *iv) { - DPRINT(DBG_INFO, F("Status:")); - DBGPRINT(F(" |")); + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINT(F("CH qualities:")); for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { DBGPRINT(F(" ")); DBGPRINT(String(iv->txRfQuality[i])); From a82777b2a1dff3f3a0fae36839040c31b3f10a3f Mon Sep 17 00:00:00 2001 From: lumapu Date: Sun, 12 Nov 2023 13:32:00 +0100 Subject: [PATCH 40/42] 0.8.6 * merged PR #1225 * improved heuristics (prevent update of statitistic during testing) --- src/CHANGES.md | 4 ++++ src/hm/Communication.h | 36 +++++++++++++++++++---------- src/hm/Heuristic.h | 41 ++++++++++++++++++++++----------- src/web/html/api.js | 13 +++++++++++ src/web/html/visualization.html | 14 ++++++----- 5 files changed, 77 insertions(+), 31 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 6c4f0a6d..bbe0bbc3 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,9 @@ # Development Changes +## 0.8.6 - 2023-11-12 +* merged PR #1225 +* improved heuristics (prevent update of statitistic during testing) + ## 0.8.5 - 2023-11-12 * fixed endless loop while switching CMT frequency * removed obsolete "retries" field from settings #1224 diff --git a/src/hm/Communication.h b/src/hm/Communication.h index fb1709c5..a4eb43eb 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -44,6 +44,7 @@ class Communication : public CommQueue<> { return; // empty uint16_t timeout = q->iv->ivGen != IV_MI ? DEFAULT_TIMEOUT : MI_TIMEOUT; + bool testMode = false; switch(mState) { case States::RESET: @@ -56,6 +57,7 @@ class Communication : public CommQueue<> { mHeu.printStatus(q->iv); mHeu.getTxCh(q->iv); + testMode = mHeu.getTestModeEnabled(); mGotFragment = false; mFirstTry = mFirstTry ? false : ( (IV_HM == q->iv->ivGen) || (IV_MI == q->iv->ivGen) ) && (q->iv->isAvailable()); //) || (millis() < 120000));} if(NULL == q->iv->radio) @@ -79,7 +81,8 @@ class Communication : public CommQueue<> { q->iv->radio->sendControlPacket(q->iv, q->cmd, q->iv->powerLimit, false); } else q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); - q->iv->radioStatistics.txCnt++; + if(!testMode) + q->iv->radioStatistics.txCnt++; mWaitTimeout = millis() + timeout; setAttempt(); mState = States::WAIT; @@ -100,14 +103,17 @@ class Communication : public CommQueue<> { DBGPRINTLN(F("ms")); if(!mGotFragment && !mFirstTry) { - q->iv->radioStatistics.rxFailNoAnser++; // got nothing + if(!testMode) + q->iv->radioStatistics.rxFailNoAnser++; // got nothing mHeu.setGotNothing(q->iv); if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, (q->iv->config->frequency*FREQ_STEP_KHZ + HOY_BASE_FREQ_KHZ)); mWaitTimeout = millis() + 1000; } - } else - q->iv->radioStatistics.rxFail++; + } else { + if(!testMode) + q->iv->radioStatistics.rxFail++; + } mState = States::RESET; break; } @@ -137,7 +143,8 @@ class Communication : public CommQueue<> { ah::dumpBuf(p->packet, p->len); if(checkIvSerial(&p->packet[1], q->iv)) { - q->iv->radioStatistics.frmCnt++; + if(!testMode) + q->iv->radioStatistics.frmCnt++; if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) { // response from get information command parseFrame(p); @@ -149,7 +156,8 @@ class Communication : public CommQueue<> { parseMiFrame(p, q); } } else { - q->iv->radioStatistics.rxFail++; // got no complete payload + if(!testMode) + q->iv->radioStatistics.rxFail++; // got no complete payload DPRINTLN(DBG_WARN, F("Inverter serial does not match")); mWaitTimeout = millis() + timeout; } @@ -158,8 +166,9 @@ class Communication : public CommQueue<> { yield(); } if(0 == q->attempts) { + if(!testMode) + q->iv->radioStatistics.rxFail++; // got no complete payload mHeu.setGotFragment(q->iv); - q->iv->radioStatistics.rxFail++; // got no complete payload cmdDone(true); mState = States::RESET; } else @@ -205,7 +214,7 @@ class Communication : public CommQueue<> { } mHeu.setGotAll(q->iv); - compilePayload(q); + compilePayload(q, testMode); if(NULL != mCbPayload) (mCbPayload)(q->cmd, q->iv); @@ -295,7 +304,7 @@ class Communication : public CommQueue<> { q->iv->actPowerLimit = 0xffff; // unknown, readback current value } - inline void compilePayload(const queue_s *q) { + inline void compilePayload(const queue_s *q, bool testMode) { uint16_t crc = 0xffff, crcRcv = 0x0000; for(uint8_t i = 0; i < mMaxFrameId; i++) { if(i == (mMaxFrameId - 1)) { @@ -311,7 +320,8 @@ class Communication : public CommQueue<> { DBGPRINT(F("CRC Error ")); if(q->attempts == 0) { DBGPRINTLN(F("-> Fail")); - q->iv->radioStatistics.rxFail++; // got fragments but not complete response + if(!testMode) + q->iv->radioStatistics.rxFail++; // got fragments but not complete response cmdDone(); } else DBGPRINTLN(F("-> complete retransmit")); @@ -356,11 +366,13 @@ class Communication : public CommQueue<> { DPRINT(DBG_ERROR, F("plausibility check failed, expected ")); DBGPRINT(String(rec->pyldLen)); DBGPRINTLN(F(" bytes")); - q->iv->radioStatistics.rxFail++; + if(!testMode) + q->iv->radioStatistics.rxFail++; return; } - q->iv->radioStatistics.rxSuccess++; + if(!testMode) + q->iv->radioStatistics.rxSuccess++; rec->ts = q->ts; for (uint8_t i = 0; i < rec->length; i++) { diff --git a/src/hm/Heuristic.h b/src/hm/Heuristic.h index b9f6ab4f..7bf9f4a9 100644 --- a/src/hm/Heuristic.h +++ b/src/hm/Heuristic.h @@ -19,6 +19,13 @@ class Heuristic { if((IV_HMS == iv->ivGen) || (IV_HMT == iv->ivGen)) return 0; // not used for these inverter types + mCycle++; // intended to overflow from time to time + if(mTestEn) { + iv->txRfChId = mCycle % RF_MAX_CHANNEL_ID; + DPRINTLN(DBG_INFO, F("heuristic test mode")); + return id2Ch(iv->txRfChId); + } + uint8_t id = 0; int8_t bestQuality = -6; for(uint8_t i = 0; i < RF_MAX_CHANNEL_ID; i++) { @@ -37,14 +44,20 @@ class Heuristic { void setGotAll(Inverter<> *iv) { updateQuality(iv, 2); // GOOD + mTestEn = false; } void setGotFragment(Inverter<> *iv) { updateQuality(iv, 1); // OK + mTestEn = false; } void setGotNothing(Inverter<> *iv) { - updateQuality(iv, -2); // BAD + if(!mTestEn) { + updateQuality(iv, -2); // BAD + mTestEn = true; + iv->txRfChId = (iv->txRfChId + 1) % RF_MAX_CHANNEL_ID; + } } void printStatus(Inverter<> *iv) { @@ -54,7 +67,18 @@ class Heuristic { DBGPRINT(F(" ")); DBGPRINT(String(iv->txRfQuality[i])); } - DBGPRINTLN(""); + DBGPRINT(F(" | t: ")); + DBGPRINT(String(iv->radioStatistics.txCnt)); + DBGPRINT(F(", s: ")); + DBGPRINT(String(iv->radioStatistics.rxSuccess)); + DBGPRINT(F(", f: ")); + DBGPRINT(String(iv->radioStatistics.rxFail)); + DBGPRINT(F(", n: ")); + DBGPRINTLN(String(iv->radioStatistics.rxFailNoAnser)); + } + + bool getTestModeEnabled(void) { + return mTestEn; } private: @@ -66,17 +90,6 @@ class Heuristic { iv->txRfQuality[iv->txRfChId] = RF_MIN_QUALTIY; } - /*uint8_t ch2Id(uint8_t ch) { - switch(ch) { - case 3: return 0; - case 23: return 1; - case 40: return 2; - case 61: return 3; - case 75: return 4; - } - return 0; // standard - }*/ - inline uint8_t id2Ch(uint8_t id) { switch(id) { case 0: return 3; @@ -90,6 +103,8 @@ class Heuristic { private: uint8_t mChList[5] = {03, 23, 40, 61, 75}; + bool mTestEn = false; + uint8_t mCycle = 0; }; diff --git a/src/web/html/api.js b/src/web/html/api.js index 2eea8d94..e76aab2c 100644 --- a/src/web/html/api.js +++ b/src/web/html/api.js @@ -188,6 +188,19 @@ function tr(val1, val2) { ]); } +function tr2(cols) { + var t = []; + for(val of cols) { + if(typeof val == "number") + val = String(val); + if(t.length == 0) + t.push(ml("th", {}, val)); + else + t.push(ml("td", {}, val)); + } + return ml("tr", {}, t); +} + function badge(success, text, second="error") { return ml("span", {class: "badge badge-" + ((success) ? "success" : second)}, text); } diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html index aa05e414..d4ac1557 100644 --- a/src/web/html/visualization.html +++ b/src/web/html/visualization.html @@ -296,15 +296,17 @@ modal("Info for inverter " + obj.name, ml("div", {}, html)); } + + function parseIvRadioStats(obj) { var html = ml("table", {class: "table"}, [ ml("tbody", {}, [ - tr("TX count", obj.tx_cnt), - tr("RX success", obj.rx_success), - tr("RX fail", obj.rx_fail), - tr("RX no answer", obj.rx_fail_answer), - tr("RX fragments", obj.frame_cnt), - tr("TX retransmits", obj.retransmits) + tr2(["TX count", obj.tx_cnt, ""]), + tr2(["RX success", obj.rx_success, String(Math.round(obj.rx_success / obj.tx_cnt * 10000) / 100) + "%"]), + tr2(["RX fail", obj.rx_fail, String(Math.round(obj.rx_fail / obj.tx_cnt * 10000) / 100) + "%"]), + tr2(["RX no answer", obj.rx_fail_answer, String(Math.round(obj.rx_fail_answer / obj.tx_cnt * 10000) / 100) + "%"]), + tr2(["RX fragments", obj.frame_cnt, ""]), + tr2(["TX retransmits", obj.retransmits, ""]) ]) ]); modal("Radio statistics for inverter " + obj.name, ml("div", {}, html)); From 1bc3a0f06f5a6e3fd5b0ad87c703110751b63afa Mon Sep 17 00:00:00 2001 From: lumapu Date: Mon, 13 Nov 2023 23:54:55 +0100 Subject: [PATCH 41/42] 0.8.7 * fix ESP8266 inverter settings #1226 * send radio statistics via MqTT #1227 * made night communication inverter depended * added option to prevent adding values of inverter to total values (MqTT only) #1199 --- src/CHANGES.md | 6 +++ src/app.cpp | 92 +++++++++++++++++++---------------- src/app.h | 1 - src/config/settings.h | 26 ++++++---- src/defines.h | 2 +- src/hm/hmInverter.h | 2 + src/publisher/pubMqtt.h | 13 ++++- src/publisher/pubMqttDefs.h | 2 - src/publisher/pubMqttIvData.h | 68 ++++++++++++++++---------- src/web/RestApi.h | 80 ++++++++++++++++-------------- src/web/html/setup.html | 90 +++++++++++++++++++--------------- src/web/web.h | 2 - 12 files changed, 223 insertions(+), 161 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index bbe0bbc3..4fb9bf7e 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,11 @@ # Development Changes +## 0.8.7 - 2023-11-13 +* fix ESP8266 inverter settings #1226 +* send radio statistics via MqTT #1227 +* made night communication inverter depended +* added option to prevent adding values of inverter to total values (MqTT only) #1199 + ## 0.8.6 - 2023-11-12 * merged PR #1225 * improved heuristics (prevent update of statitistic during testing) diff --git a/src/app.cpp b/src/app.cpp index 838c375f..edd58306 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -4,9 +4,7 @@ //----------------------------------------------------------------------------- #include - #include "app.h" - #include "utils/sun.h" @@ -239,43 +237,50 @@ void app::tickCalcSunrise(void) { //----------------------------------------------------------------------------- void app::tickIVCommunication(void) { - mIVCommunicationOn = !mConfig->sun.disNightCom; // if sun.disNightCom is false, communication is always on - if (!mIVCommunicationOn) { // inverter communication only during the day - uint32_t nxtTrig; - if (mTimestamp < (mSunrise - mConfig->sun.offsetSec)) { // current time is before communication start, set next trigger to communication start - nxtTrig = mSunrise - mConfig->sun.offsetSec; - } else { - if (mTimestamp >= (mSunset + mConfig->sun.offsetSec)) { // current time is past communication stop, nothing to do. Next update will be done at midnight by tickCalcSunrise - nxtTrig = 0; - } else { // current time lies within communication start/stop time, set next trigger to communication stop - mIVCommunicationOn = true; - nxtTrig = mSunset + mConfig->sun.offsetSec; + bool restartTick = false; + bool zeroValues = false; + uint32_t nxtTrig = 0; + + Inverter<> *iv; + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { + iv = mSys.getInverterByPos(i); + if(NULL == iv) + continue; + + iv->commEnabled = !iv->config->disNightCom; // if sun.disNightCom is false, communication is always on + if (!iv->commEnabled) { // inverter communication only during the day + if (mTimestamp < (mSunrise - mConfig->sun.offsetSec)) { // current time is before communication start, set next trigger to communication start + nxtTrig = mSunrise - mConfig->sun.offsetSec; + } else { + if (mTimestamp >= (mSunset + mConfig->sun.offsetSec)) { // current time is past communication stop, nothing to do. Next update will be done at midnight by tickCalcSunrise + nxtTrig = 0; + } else { // current time lies within communication start/stop time, set next trigger to communication stop + iv->commEnabled = true; + nxtTrig = mSunset + mConfig->sun.offsetSec; + } } + if (nxtTrig != 0) + restartTick = true; } - if (nxtTrig != 0) - onceAt(std::bind(&app::tickIVCommunication, this), nxtTrig, "ivCom"); + + if ((!iv->commEnabled) && (mConfig->inst.rstValsCommStop)) + zeroValues = true; } - tickComm(); + + if(restartTick) // at least one inverter + onceAt(std::bind(&app::tickIVCommunication, this), nxtTrig, "ivCom"); + + if (zeroValues) // at least one inverter + once(std::bind(&app::tickZeroValues, this), mConfig->nrf.sendInterval, "tZero"); } //----------------------------------------------------------------------------- void app::tickSun(void) { // only used and enabled by MQTT (see setup()) - if (!mMqtt.tickerSun(mSunrise, mSunset, mConfig->sun.offsetSec, mConfig->sun.disNightCom)) + if (!mMqtt.tickerSun(mSunrise, mSunset, mConfig->sun.offsetSec)) once(std::bind(&app::tickSun, this), 1, "mqSun"); // MQTT not connected, retry } -//----------------------------------------------------------------------------- -void app::tickComm(void) { - if ((!mIVCommunicationOn) && (mConfig->inst.rstValsCommStop)) - once(std::bind(&app::tickZeroValues, this), mConfig->nrf.sendInterval, "tZero"); - - if (mMqttEnabled) { - if (!mMqtt.tickerComm(!mIVCommunicationOn)) - once(std::bind(&app::tickComm, this), 5, "mqCom"); // MQTT not connected, retry after 5s - } -} - //----------------------------------------------------------------------------- void app::tickZeroValues(void) { zeroIvValues(!CHECK_AVAIL, SKIP_YIELD_DAY); @@ -325,22 +330,24 @@ void app::tickMidnight(void) { //----------------------------------------------------------------------------- void app::tickSend(void) { - if(!mIVCommunicationOn) { - DPRINTLN(DBG_WARN, F("Time not set or it is night time, therefore no communication to the inverter!")); - return; - } - for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { Inverter<> *iv = mSys.getInverterByPos(i); - if(NULL != iv) { - if(iv->config->enabled) { - iv->tickSend([this, iv](uint8_t cmd, bool isDevControl) { - if(isDevControl) - mCommunication.addImportant(iv, cmd); - else - mCommunication.add(iv, cmd); - }); + if(NULL == iv) + continue; + + if(iv->config->enabled) { + if(!iv->commEnabled) { + DPRINT_IVID(DBG_INFO, iv->id); + DBGPRINTLN(F("no communication to the inverter (night time)")); + continue; } + + iv->tickSend([this, iv](uint8_t cmd, bool isDevControl) { + if(isDevControl) + mCommunication.addImportant(iv, cmd); + else + mCommunication.add(iv, cmd); + }); } } @@ -358,6 +365,8 @@ void app:: zeroIvValues(bool checkAvail, bool skipYieldDay) { continue; // skip to next inverter if (!iv->config->enabled) continue; // skip to next inverter + if (iv->commEnabled) + continue; // skip to next inverter if (checkAvail) { if (!iv->isAvailable()) @@ -415,7 +424,6 @@ void app::resetSystem(void) { mSendLastIvId = 0; mShowRebootRequest = false; - mIVCommunicationOn = true; mSavePending = false; mSaveReboot = false; diff --git a/src/app.h b/src/app.h index 0bb1c170..0098c417 100644 --- a/src/app.h +++ b/src/app.h @@ -307,7 +307,6 @@ class app : public IApp, public ah::Scheduler { Communication mCommunication; bool mShowRebootRequest; - bool mIVCommunicationOn; #if defined(ETHERNET) ahoyeth mEth; diff --git a/src/config/settings.h b/src/config/settings.h index 27aaf953..76a42e23 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -30,7 +30,7 @@ * https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html#flash-layout * */ -#define CONFIG_VERSION 1 +#define CONFIG_VERSION 2 #define PROT_MASK_INDEX 0x0001 @@ -110,7 +110,6 @@ typedef struct { typedef struct { float lat; float lon; - bool disNightCom; // disable night communication uint16_t offsetSec; } cfgSun_t; @@ -145,6 +144,8 @@ typedef struct { char chName[6][MAX_NAME_LENGTH]; uint8_t frequency; uint8_t powerLevel; + bool disNightCom; // disable night communication + bool add2Total; // add values to total values - useful if one inverter is on battery to turn off } cfgIv_t; typedef struct { @@ -420,7 +421,6 @@ class settings { mCfg.sun.lat = 0.0; mCfg.sun.lon = 0.0; - mCfg.sun.disNightCom = false; mCfg.sun.offsetSec = 0; mCfg.serial.interval = SERIAL_INTERVAL; @@ -442,8 +442,10 @@ class settings { mCfg.inst.yieldEffiency = 0.955f; for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { - mCfg.inst.iv[i].powerLevel = 0xff; // impossible high value - mCfg.inst.iv[i].frequency = 0x12; // 863MHz (minimum allowed frequency) + mCfg.inst.iv[i].powerLevel = 0xff; // impossible high value + mCfg.inst.iv[i].frequency = 0x12; // 863MHz (minimum allowed frequency) + mCfg.inst.iv[i].disNightCom = false; + mCfg.inst.iv[i].add2Total = true; } mCfg.led.led0 = DEF_LED0; @@ -465,11 +467,15 @@ class settings { } void loadAddedDefaults() { - if(0 < mCfg.configVersion) { - for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { + if(mCfg.configVersion < 1) { mCfg.inst.iv[i].powerLevel = 0xff; // impossible high value mCfg.inst.iv[i].frequency = 0x0; // 860MHz (backward compatibility) } + if(mCfg.configVersion < 2) { + mCfg.inst.iv[i].disNightCom = false; + mCfg.inst.iv[i].add2Total = true; + } } } @@ -601,12 +607,10 @@ class settings { if(set) { obj[F("lat")] = mCfg.sun.lat; obj[F("lon")] = mCfg.sun.lon; - obj[F("dis")] = mCfg.sun.disNightCom; obj[F("offs")] = mCfg.sun.offsetSec; } else { getVal(obj, F("lat"), &mCfg.sun.lat); getVal(obj, F("lon"), &mCfg.sun.lon); - getVal(obj, F("dis"), &mCfg.sun.disNightCom); getVal(obj, F("offs"), &mCfg.sun.offsetSec); } } @@ -734,6 +738,8 @@ class settings { obj[F("sn")] = cfg->serial.u64; obj[F("freq")] = cfg->frequency; obj[F("pa")] = cfg->powerLevel; + obj[F("dis")] = cfg->disNightCom; + obj[F("add")] = cfg->add2Total; for(uint8_t i = 0; i < 6; i++) { obj[F("yield")][i] = cfg->yieldCor[i]; obj[F("pwr")][i] = cfg->chMaxPwr[i]; @@ -745,6 +751,8 @@ class settings { getVal(obj, F("sn"), &cfg->serial.u64); getVal(obj, F("freq"), &cfg->frequency); getVal(obj, F("pa"), &cfg->powerLevel); + getVal(obj, F("dis"), &cfg->disNightCom); + getVal(obj, F("add"), &cfg->add2Total); uint8_t size = 4; if(obj.containsKey(F("pwr"))) size = obj[F("pwr")].size(); diff --git a/src/defines.h b/src/defines.h index eeee3574..fe9acf95 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 5 +#define VERSION_PATCH 7 //------------------------------------- typedef struct { diff --git a/src/hm/hmInverter.h b/src/hm/hmInverter.h index f52bafe9..f3d149c4 100644 --- a/src/hm/hmInverter.h +++ b/src/hm/hmInverter.h @@ -130,6 +130,7 @@ class Inverter { int8_t txRfQuality[5]; // heuristics tx quality (check 'Heuristics.h') uint8_t txRfChId; // RF TX channel id uint8_t curCmtFreq; // current used CMT frequency, used to check if freq. was changed during runtime + bool commEnabled; // 'pause night communication' sets this field to false static uint32_t *timestamp; // system timestamp static cfgInst_t *generalConfig; // general inverter configuration from setup @@ -150,6 +151,7 @@ class Inverter { alarmLastId = 0; rssi = -127; radio = NULL; + commEnabled = true; memset(&radioStatistics, 0, sizeof(statistics_t)); memset(txRfQuality, -6, 5); diff --git a/src/publisher/pubMqtt.h b/src/publisher/pubMqtt.h index 48dbe150..2c23c719 100644 --- a/src/publisher/pubMqtt.h +++ b/src/publisher/pubMqtt.h @@ -134,7 +134,7 @@ class PubMqtt { #endif } - bool tickerSun(uint32_t sunrise, uint32_t sunset, uint32_t offs, bool disNightCom) { + bool tickerSun(uint32_t sunrise, uint32_t sunset, uint32_t offs) { if (!mClient.connected()) return false; @@ -142,7 +142,16 @@ class PubMqtt { publish(subtopics[MQTT_SUNSET], String(sunset).c_str(), true); publish(subtopics[MQTT_COMM_START], String(sunrise - offs).c_str(), true); publish(subtopics[MQTT_COMM_STOP], String(sunset + offs).c_str(), true); - publish(subtopics[MQTT_DIS_NIGHT_COMM], ((disNightCom) ? dict[STR_TRUE] : dict[STR_FALSE]), true); + + Inverter<> *iv; + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { + iv = mSys->getInverterByPos(i); + if(NULL == iv) + continue; + + snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/dis_night_comm", iv->config->name); + publish(mSubTopic, ((iv->commEnabled) ? dict[STR_TRUE] : dict[STR_FALSE]), true); + } return true; } diff --git a/src/publisher/pubMqttDefs.h b/src/publisher/pubMqttDefs.h index ca8bf01e..c97daa78 100644 --- a/src/publisher/pubMqttDefs.h +++ b/src/publisher/pubMqttDefs.h @@ -48,7 +48,6 @@ enum { MQTT_SUNSET, MQTT_COMM_START, MQTT_COMM_STOP, - MQTT_DIS_NIGHT_COMM, MQTT_COMM_DISABLED, MQTT_COMM_DIS_TS, MQTT_VERSION, @@ -69,7 +68,6 @@ const char* const subtopics[] PROGMEM = { "sunset", "comm_start", "comm_stop", - "dis_night_comm", "comm_disabled", "comm_dis_ts", "version", diff --git a/src/publisher/pubMqttIvData.h b/src/publisher/pubMqttIvData.h index 053e359e..0ac6d306 100644 --- a/src/publisher/pubMqttIvData.h +++ b/src/publisher/pubMqttIvData.h @@ -31,11 +31,11 @@ class PubMqttIvData { memset(mIvLastRTRpub, 0, MAX_NUM_INVERTERS * sizeof(uint32_t)); mRTRDataHasBeenSent = false; - mTable[IDLE] = &PubMqttIvData::stateIdle; - mTable[START] = &PubMqttIvData::stateStart; - mTable[FIND_NXT_IV] = &PubMqttIvData::stateFindNxtIv; - mTable[SEND_DATA] = &PubMqttIvData::stateSend; - mTable[SEND_TOTALS] = &PubMqttIvData::stateSendTotals; + mTable[IDLE] = &PubMqttIvData::stateIdle; + mTable[START] = &PubMqttIvData::stateStart; + mTable[FIND_NXT_IV] = &PubMqttIvData::stateFindNxtIv; + mTable[SEND_DATA] = &PubMqttIvData::stateSend; + mTable[SEND_TOTALS] = &PubMqttIvData::stateSendTotals; } void loop() { @@ -142,25 +142,27 @@ class PubMqttIvData { // calculate total values for RealTimeRunData_Debug if (CH0 == rec->assign[mPos].ch) { if(mIv->status > InverterStatus::STARTING) { - mTotalFound = true; - switch (rec->assign[mPos].fieldId) { - case FLD_PAC: - mTotal[0] += mIv->getValue(mPos, rec); - break; - case FLD_YT: - mTotal[1] += mIv->getValue(mPos, rec); - break; - case FLD_YD: { - float val = mIv->getValue(mPos, rec); - if(0 == val) // inverter restarted during day - mSendTotalYd = false; - else - mTotal[2] += val; - break; + if(mIv->config->add2Total) { + mTotalFound = true; + switch (rec->assign[mPos].fieldId) { + case FLD_PAC: + mTotal[0] += mIv->getValue(mPos, rec); + break; + case FLD_YT: + mTotal[1] += mIv->getValue(mPos, rec); + break; + case FLD_YD: { + float val = mIv->getValue(mPos, rec); + if(0 == val) // inverter restarted during day + mSendTotalYd = false; + else + mTotal[2] += val; + break; + } + case FLD_PDC: + mTotal[3] += mIv->getValue(mPos, rec); + break; } - case FLD_PDC: - mTotal[3] += mIv->getValue(mPos, rec); - break; } } else mAllTotalFound = false; @@ -178,12 +180,25 @@ class PubMqttIvData { mPublish(mSubTopic, mVal, retained, qos); } mPos++; - } else + } else { + sendRadioStat(rec->length); mState = FIND_NXT_IV; + } } else mState = FIND_NXT_IV; } + inline void sendRadioStat(uint8_t start) { + snprintf(mSubTopic, 32 + MAX_NAME_LENGTH, "%s/radio_stat", mIv->config->name); + snprintf(mVal, 100, "{\"tx\":%d,\"success\":%d,\"fail\":%d,\"no_answer\":%d,\"retransmits\":%d}", + mIv->radioStatistics.txCnt, + mIv->radioStatistics.rxSuccess, + mIv->radioStatistics.rxFail, + mIv->radioStatistics.rxFailNoAnser, + mIv->radioStatistics.retransmits); + mPublish(mSubTopic, mVal, false, QOS_0); + } + void stateSendTotals() { uint8_t fieldId; mRTRDataHasBeenSent = true; @@ -221,7 +236,8 @@ class PubMqttIvData { } else { mSendList->pop(); mZeroValues = false; - mState = START; + mPos = 0; + mState = IDLE; } } @@ -242,7 +258,7 @@ class PubMqttIvData { bool mRTRDataHasBeenSent; char mSubTopic[32 + MAX_NAME_LENGTH + 1]; - char mVal[40]; + char mVal[100]; bool mZeroValues; // makes sure that yield day is sent even if no inverter is online std::queue *mSendList; diff --git a/src/web/RestApi.h b/src/web/RestApi.h index 53adb23f..fa2aaf22 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -339,27 +339,30 @@ class RestApi { Inverter<> *iv; for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { iv = mSys->getInverterByPos(i); - if(NULL != iv) { - JsonObject obj2 = invArr.createNestedObject(); - obj2[F("enabled")] = (bool)iv->config->enabled; - obj2[F("id")] = i; - obj2[F("name")] = String(iv->config->name); - obj2[F("serial")] = String(iv->config->serial.u64, HEX); - obj2[F("channels")] = iv->channels; - obj2[F("freq")] = iv->config->frequency; - if(0xff == iv->config->powerLevel) { - if((IV_HMT == iv->ivGen) || (IV_HMS == iv->ivGen)) - obj2[F("pa")] = 30; // 20dBm - else - obj2[F("pa")] = 1; // low - } else - obj2[F("pa")] = iv->config->powerLevel; - - for(uint8_t j = 0; j < iv->channels; j ++) { - obj2[F("ch_yield_cor")][j] = (double)iv->config->yieldCor[j]; - obj2[F("ch_name")][j] = iv->config->chName[j]; - obj2[F("ch_max_pwr")][j] = iv->config->chMaxPwr[j]; - } + if(NULL == iv) + continue; + + JsonObject obj2 = invArr.createNestedObject(); + obj2[F("enabled")] = (bool)iv->config->enabled; + obj2[F("id")] = i; + obj2[F("name")] = String(iv->config->name); + obj2[F("serial")] = String(iv->config->serial.u64, HEX); + obj2[F("channels")] = iv->channels; + obj2[F("freq")] = iv->config->frequency; + obj2[F("disnightcom")] = (bool)iv->config->disNightCom; + obj2[F("add2total")] = (bool)iv->config->add2Total; + if(0xff == iv->config->powerLevel) { + if((IV_HMT == iv->ivGen) || (IV_HMS == iv->ivGen)) + obj2[F("pa")] = 30; // 20dBm + else + obj2[F("pa")] = 1; // low + } else + obj2[F("pa")] = iv->config->powerLevel; + + for(uint8_t j = 0; j < iv->channels; j ++) { + obj2[F("ch_yield_cor")][j] = (double)iv->config->yieldCor[j]; + obj2[F("ch_name")][j] = iv->config->chName[j]; + obj2[F("ch_max_pwr")][j] = iv->config->chMaxPwr[j]; } } obj[F("interval")] = String(mConfig->nrf.sendInterval); @@ -501,7 +504,6 @@ class RestApi { void getSun(JsonObject obj) { obj[F("lat")] = mConfig->sun.lat ? String(mConfig->sun.lat, 5) : ""; obj[F("lon")] = mConfig->sun.lat ? String(mConfig->sun.lon, 5) : ""; - obj[F("disnightcom")] = mConfig->sun.disNightCom; obj[F("offs")] = mConfig->sun.offsetSec; } @@ -583,24 +585,28 @@ class RestApi { obj[F("ts_sunrise")] = mApp->getSunrise(); obj[F("ts_sunset")] = mApp->getSunset(); obj[F("ts_offset")] = mConfig->sun.offsetSec; - obj[F("disNightComm")] = mConfig->sun.disNightCom; JsonArray inv = obj.createNestedArray(F("inverter")); Inverter<> *iv; + bool disNightCom = false; for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { iv = mSys->getInverterByPos(i); - if(NULL != iv) { - record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); - JsonObject invObj = inv.createNestedObject(); - invObj[F("enabled")] = (bool)iv->config->enabled; - invObj[F("id")] = i; - invObj[F("name")] = String(iv->config->name); - invObj[F("cur_pwr")] = ah::round3(iv->getChannelFieldValue(CH0, FLD_PAC, rec)); - invObj[F("is_avail")] = iv->isAvailable(); - invObj[F("is_producing")] = iv->isProducing(); - invObj[F("ts_last_success")] = iv->getLastTs(rec); - } + if(NULL == iv) + continue; + + record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); + JsonObject invObj = inv.createNestedObject(); + invObj[F("enabled")] = (bool)iv->config->enabled; + invObj[F("id")] = i; + invObj[F("name")] = String(iv->config->name); + invObj[F("cur_pwr")] = ah::round3(iv->getChannelFieldValue(CH0, FLD_PAC, rec)); + invObj[F("is_avail")] = iv->isAvailable(); + invObj[F("is_producing")] = iv->isProducing(); + invObj[F("ts_last_success")] = iv->getLastTs(rec); + if(iv->config->disNightCom) + disNightCom = true; } + obj[F("disNightComm")] = disNightCom; JsonArray warn = obj.createNestedArray(F("warnings")); if(!mRadioNrf->isChipConnected() && mConfig->nrf.enabled) @@ -729,8 +735,10 @@ class RestApi { } mApp->initInverter(jsonIn[F("id")]); - iv->config->frequency = jsonIn[F("freq")]; - iv->config->powerLevel = jsonIn[F("pa")]; + iv->config->frequency = jsonIn[F("freq")]; + iv->config->powerLevel = jsonIn[F("pa")]; + iv->config->disNightCom = jsonIn[F("disnightcom")]; + iv->config->add2Total = jsonIn[F("add2total")]; mApp->saveSettings(false); // without reboot } else { jsonOut[F("error")] = F("unknown cmd"); diff --git a/src/web/html/setup.html b/src/web/html/setup.html index a21aa073..b9933cea 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -140,38 +140,33 @@
Inverter
- -
-

General

-
-
-
Interval [s]
-
+
Interval [s]
+
-
Reset values and YieldDay at midnight
-
+
Reset values and YieldDay at midnight
+
-
Reset values when inverter polling pauses at sunset
-
+
Reset values when inverter polling pauses at sunset
+
-
Reset values when inverter status is 'not available'
-
+
Reset values when inverter status is 'not available'
+
-
Reset 'max' values at midnight
-
+
Reset 'max' values at midnight
+
-
Start without time sync (useful in AP-Only-Mode)
-
+
Start without time sync (useful in AP-Only-Mode)
+
-
Yield Efficiency (should be between 0.95 and 0.96)
-
+
Yield Efficiency (should be between 0.95 and 0.96)
+
@@ -223,10 +218,6 @@
Offset (pre sunrise, post sunset)
-
-
Pause polling inverters during night
-
-
@@ -434,6 +425,7 @@ [47, "GPIO47"], [48, "GPIO48"], ]; + /*ENDIF_ESP32*/ var nrfPa = [ [0, "MIN (recommended)"], [1, "LOW"], @@ -442,6 +434,8 @@ ]; var esp32cmtPa = []; var esp32cmtFreq = []; + + /*IF_ESP32*/ var freqFmt = new Intl.NumberFormat('en-US', { minimumIntegerDigits: 3, minimumFractionDigits: 2 @@ -645,6 +639,7 @@ add.ch_yield_cor = []; add.freq = 12; add.pa = 30; + add.add2total = true; var e = document.getElementById("inverter"); e.innerHTML = ""; // remove all childs @@ -674,23 +669,27 @@ } var cbEn = ml("input", {name: "enable", type: "checkbox"}, null); - if(obj.enabled) - cbEn.checked = true; + var cbDisNightCom = ml("input", {name: "disnightcom", type: "checkbox"}, null); + var cbAddTotal = ml("input", {name: "add2total", type: "checkbox"}, null); + cbEn.checked = (obj.enabled); + cbDisNightCom.checked = (obj.disnightcom); + cbAddTotal.checked = (obj.add2total); + var ser = ml("input", {name: "ser", class: "text", type: "number", max: 138999999999, value: obj.serial}, null); var html = ml("div", {}, [ - tabs(["General", "Inputs", "Radio"]), + tabs(["General", "Inputs", "Radio", "Advanced"]), ml("div", {id: "divGeneral", class: "tab-content"}, [ ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4"}, "Enable"), - ml("div", {class: "col-8"}, cbEn) + ml("div", {class: "col-2"}, "Enable"), + ml("div", {class: "col-10"}, cbEn) ]), ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4 mt-2"}, "Serial"), - ml("div", {class: "col-8"}, ser) + ml("div", {class: "col-2 mt-2"}, "Serial"), + ml("div", {class: "col-10"}, ser) ]), ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4 mt-2"}, "Name"), - ml("div", {class: "col-8"}, ml("input", {name: "name", class: "text", type: "text", value: obj.name}, null)) + ml("div", {class: "col-2 mt-2"}, "Name"), + ml("div", {class: "col-10"}, ml("input", {name: "name", class: "text", type: "text", value: obj.name}, null)) ]) ]), ml("div", {id: "divInputs", class: "tab-content hide"}, [ @@ -704,21 +703,31 @@ ml("input", {type: "hidden", name: "isnrf"}, null), ml("div", {id: "setcmt"}, [ ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4 mt-2"}, "Frequency"), - ml("div", {class: "col-8"}, sel("freq", esp32cmtFreq, obj.freq)) + ml("div", {class: "col-3 mt-2"}, "Frequency"), + ml("div", {class: "col-9"}, sel("freq", esp32cmtFreq, obj.freq)) ]), ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4 mt-2"}, "Power Level"), - ml("div", {class: "col-8"}, sel("cmtpa", esp32cmtPa, obj.pa)) + ml("div", {class: "col-3 mt-2"}, "Power Level"), + ml("div", {class: "col-9"}, sel("cmtpa", esp32cmtPa, obj.pa)) ]), ]), ml("div", {id: "setnrf"}, ml("div", {class: "row mb-3"}, [ - ml("div", {class: "col-4 mt-2"}, "Power Level"), - ml("div", {class: "col-8"}, sel("nrfpa", nrfPa, obj.pa)) + ml("div", {class: "col-3 mt-2"}, "Power Level"), + ml("div", {class: "col-9"}, sel("nrfpa", nrfPa, obj.pa)) ]), ), ]), + ml("div", {id: "divAdvanced", class: "tab-content hide"}, [ + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-10"}, "Pause communication during night (lat. and lon. need to be set)"), + ml("div", {class: "col-2"}, cbDisNightCom) + ]), + ml("div", {class: "row mb-3"}, [ + ml("div", {class: "col-10"}, "Include inverter to sum of total (should be checked by default)"), + ml("div", {class: "col-2"}, cbAddTotal) + ]) + ]), ml("div", {class: "row mt-5"}, [ ml("div", {class: "col-8", id: "res"}, ""), ml("div", {class: "col-4 a-r"}, ml("input", {type: "button", value: "save", class: "btn", onclick: function() { ivSave(); }}, null)) @@ -758,7 +767,7 @@ }) }); - modal("Edit inverter", html); + modal("Edit inverter " + obj.name, html); ser.dispatchEvent(new Event('change')); function ivSave() { @@ -781,6 +790,8 @@ else o.pa = document.getElementsByName("cmtpa")[0].value; o.freq = document.getElementsByName("freq")[0].value; + o.disnightcom = document.getElementsByName("disnightcom")[0].checked; + o.add2total = document.getElementsByName("add2total")[0].checked; getAjax("/api/setup", cb, "POST", JSON.stringify(o)); } @@ -841,7 +852,6 @@ function parseSun(obj) { document.getElementsByName("sunLat")[0].value = obj["lat"]; document.getElementsByName("sunLon")[0].value = obj["lon"]; - document.getElementsByName("sunDisNightCom")[0].checked = obj["disnightcom"]; const sel = document.getElementsByName("sunOffs")[0]; for(var i = 0; i <= 60; i++) { sel.appendChild(opt(i, i + " minutes", (i == (obj["offs"] / 60)))); diff --git a/src/web/web.h b/src/web/web.h index c37db811..ae2fc091 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -535,12 +535,10 @@ class Web { if (request->arg("sunLat") == "" || (request->arg("sunLon") == "")) { mConfig->sun.lat = 0.0; mConfig->sun.lon = 0.0; - mConfig->sun.disNightCom = false; mConfig->sun.offsetSec = 0; } else { mConfig->sun.lat = request->arg("sunLat").toFloat(); mConfig->sun.lon = request->arg("sunLon").toFloat(); - mConfig->sun.disNightCom = (request->arg("sunDisNightCom") == "on"); mConfig->sun.offsetSec = request->arg("sunOffs").toInt() * 60; } From 972b03376b255358226920a86637ff9447e3d2a2 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 16 Nov 2023 23:59:05 +0100 Subject: [PATCH 42/42] 0.8.8 * fix ESP8266 save inverter #1232 --- src/CHANGES.md | 3 +++ src/defines.h | 2 +- src/web/RestApi.h | 36 +++++++++++++++++++++++++++--------- src/web/html/setup.html | 2 +- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 4fb9bf7e..380458fc 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,8 @@ # Development Changes +## 0.8.8 - 2023-11-16 +* fix ESP8266 save inverter #1232 + ## 0.8.7 - 2023-11-13 * fix ESP8266 inverter settings #1226 * send radio statistics via MqTT #1227 diff --git a/src/defines.h b/src/defines.h index fe9acf95..4d95b022 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 7 +#define VERSION_PATCH 8 //------------------------------------- typedef struct { diff --git a/src/web/RestApi.h b/src/web/RestApi.h index fa2aaf22..d44e0f1e 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -124,12 +124,26 @@ class RestApi { void onApiPostBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { DPRINTLN(DBG_VERBOSE, "onApiPostBody"); - DynamicJsonDocument json(800); - AsyncJsonResponse* response = new AsyncJsonResponse(false, 200); - JsonObject root = response->getRoot(); - DeserializationError err = deserializeJson(json, (const char *)data, len); + if(0 == index) { + if(NULL != mTmpBuf) + delete[] mTmpBuf; + mTmpBuf = new uint8_t[total+1]; + mTmpSize = total; + } + if(mTmpSize >= (len + index)) + memcpy(&mTmpBuf[index], data, len); + + if((len + index) != total) + return; // not last frame - nothing to do + + DynamicJsonDocument json(1000); + + DeserializationError err = deserializeJson(json, (const char *)mTmpBuf, mTmpSize); JsonObject obj = json.as(); + + AsyncJsonResponse* response = new AsyncJsonResponse(false, 200); + JsonObject root = response->getRoot(); root[F("success")] = (err) ? false : true; if(!err) { String path = request->url().substring(5); @@ -141,18 +155,20 @@ class RestApi { root[F("success")] = false; root[F("error")] = "Path not found: " + path; } - } - else { + } else { switch (err.code()) { case DeserializationError::Ok: break; - case DeserializationError::InvalidInput: root[F("error")] = F("Invalid input"); break; - case DeserializationError::NoMemory: root[F("error")] = F("Not enough memory"); break; - default: root[F("error")] = F("Deserialization failed"); break; + case DeserializationError::IncompleteInput: root[F("error")] = F("Incomplete input"); break; + case DeserializationError::InvalidInput: root[F("error")] = F("Invalid input"); break; + case DeserializationError::NoMemory: root[F("error")] = F("Not enough memory"); break; + default: root[F("error")] = F("Deserialization failed"); break; } } response->setLength(); request->send(response); + delete[] mTmpBuf; + mTmpBuf = NULL; } void getNotFound(JsonObject obj, String url) { @@ -760,6 +776,8 @@ class RestApi { uint32_t mTimezoneOffset; uint32_t mHeapFree, mHeapFreeBlk; uint8_t mHeapFrag; + uint8_t *mTmpBuf = NULL; + uint32_t mTmpSize; }; #endif /*__WEB_API_H__*/ diff --git a/src/web/html/setup.html b/src/web/html/setup.html index b9933cea..c1c1c841 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -798,7 +798,7 @@ function cb(obj) { var e = document.getElementById("res"); if(!obj.success) - e.innerHTML = "error while saving"; + e.innerHTML = "error: " + obj.error; else { modalClose(); getAjax("/api/inverter/list", parseIv);