Compare commits

...

9 Commits

Author SHA1 Message Date
Wang Beihong
81da463124 feat: 添加独立状态网页服务,提供设备状态实时监控和API接口 2026-03-07 14:14:23 +08:00
Wang Beihong
981dc2b47c feat: 添加土壤和光照阈值控制,优化状态上报逻辑 2026-03-07 02:54:45 +08:00
Wang Beihong
7accf1279e feat: 添加传感器配置和MQTT控制功能,优化自动控制逻辑 2026-03-07 02:48:58 +08:00
Wang Beihong
5980e171c4 feat:新增MQTT控制组件和自动告警系统
- 实现MQTT控制功能,处理水泵和灯光控制指令
- 新增土壤湿度和光照强度自动告警系统,阈值可配置
- 新建MQTT控制、自动告警和阈值管理相关文件
- 更新主应用,集成MQTT和自动控制功能
- 新增传感器数据与控制状态遥测上报
- 引入NVS和应用存储分区配置
2026-03-07 02:43:30 +08:00
Wang Beihong
cf3634bebb feat:重构空气温度处理并改进UI屏幕切换
- 从vars.c和vars.h中移除了空气温度整型变量及其相关的获取/设置函数
- 更新了FlowGlobalVariables枚举,移除了空气温度整型常量
- 修改了main.c中的UI任务,实现了每3秒切换屏幕的机制
- 清理了app_main函数,移除了空气温度整型的设置,仅保留字符串表示形式
2026-03-06 22:54:22 +08:00
Wang Beihong
d532d037ab feat: 添加 UI 组件支持,整合界面元素和全局变量管理 2026-03-06 20:03:31 +08:00
Wang Beihong
b8f33364d7 feat: 更新 README 和主程序,修正 GPIO 控制接口并优化 LCD 显示文本 2026-03-06 15:57:25 +08:00
Wang Beihong
f2bfe65f8e feat: 更新 README,添加智能盆栽管理系统需求描述 2026-03-06 14:18:01 +08:00
Wang Beihong
4c8d40ab2f feat: 添加电容式土壤湿度传感器支持,更新相关命令和初始化逻辑 2026-03-06 14:12:10 +08:00
42 changed files with 12350 additions and 107 deletions

243
README.md
View File

@@ -1,81 +1,198 @@
# BotanicalBuddy
基于 ESP-IDF 的植物助手项目,当前已集成:
基于 ESP-IDF 的智能盆栽系统固件项目ESP32-C3
- **Wi-Fi 配网组件wifi-connect**:手机连接设备热点后通过网页完成路由器配置
- **LCD 显示组件lvgl_st7735s_use**:基于 LVGL 驱动 ST77xx SPI 屏并显示界面
- **I2C 传感器组件i2c_master_messager**:统一读取 BH1750 / AHT30 数据
- **IO 外设控制组件io_device_control**:控制水泵与光照开关(高电平有效)
当前结论:单片机端核心功能已完成,可直接联调 App/小程序侧。
## 功能特性
## 固件完成度
- 长按按键进入配网模式
- 支持两种配网策略:按键触发 / 常驻配网
- 设备开启 SoftAP`ESP32-xxxxxx`+ Captive Portal
- 手机访问 `http://192.168.4.1` 完成 Wi-Fi 配置
- 支持清除已保存 Wi-Fi 参数并重新配网
- 串口中文状态日志,便于调试和现场维护
- 支持 ST77xx SPI LCD 显示LVGL
- 支持方向/偏移参数化配置,便于后续适配不同屏幕
- 支持水泵GPIO1与光照GPIO0控制接口
- 环境采集:土壤湿度、空气温湿度、光照强度
- 本地显示LCD + LVGL 多页面轮播
- 设备控制:水泵、补光灯(高电平有效)
- 自动控制:阈值 + 回差控制
- 手动控制MQTT 远程开关泵/灯
- 模式切换:`auto` / `manual`
- 告警推送:超阈值边沿事件上报
- 状态上报:周期性遥测(含模式与执行器状态)
- Wi-Fi 配网SoftAP + Captive Portal
- 状态网页:独立 HTTP 状态看板与 JSON API端口 8080
## 目录结
## 系统架
- `main/`应用入口(`app_main`
- `components/wifi-connect/`:配网组件实现与文档
- `README.md`:组件说明
- `USER_GUIDE.md`:用户操作手册
- `QUICK_POSTER.md`:张贴版快速指引
- `BLOG.md`:博客草稿
- `components/lvgl_st7735s_use/`LCD 显示组件LVGL + ST77xx
- `README.md`:组件说明与调参指南
- `components/i2c_master_messager/`I2C 传感器管理组件
- `README.md`:传感器采集与配置说明
- `components/io_device_control/`IO 外设控制组件
- `README.md`:水泵/光照控制接口说明
- `main/`业务编排、控制循环、MQTT 回调对接
- `components/wifi-connect/`:配网与路由连接
- `components/lvgl_st7735s_use/`LCD 与 LVGL 端口
- `components/ui/`:界面对象与变量绑定
- `components/i2c_master_messager/`AHT30、BH1750 采集
- `components/capactive_soil_moisture_sensor_V2.0/`:土壤湿度采集
- `components/io_device_control/`:水泵/补光灯 GPIO 控制
- `components/mqtt_control/`MQTT 连接、发布、控制指令解析
- `main/auto_ctrl_thresholds.*`:阈值存取与校验
- `main/auto_alerts.*`:告警判定与回调分发
- `main/status_web.*`独立状态网页服务HTTP 8080
## 状态网页(独立于配网页)
- 配网页面:`http://192.168.4.1`(仅 SoftAP 配网阶段)
- 状态页面:`http://<设备STA_IP>:8080/`
- 状态 API`http://<设备STA_IP>:8080/api/status`
说明:
- 两个网页服务独立运行,端口不同、职责不同。
- 状态页用于运行态观测,不承载 Wi-Fi 配网流程。
`/api/status` 当前主要字段:
- `temp``hum``soil``lux`:传感器字符串值
- `pump``light`:执行器状态(`on/off`
- `mode`:控制模式(`auto/manual`
- `soil_on``soil_off``light_on``light_off`:自动控制阈值
- `wifi_status`Wi-Fi 状态(`idle/provisioning/connecting/connected/failed/timeout`
- `sta_ip`STA 当前 IP
- `mqtt_connected`MQTT 连接状态(布尔)
- `i2c_ready``soil_sensor_ready`:关键外设初始化状态(布尔)
- `loop_counter`:主循环计数
- `uptime_ms`:设备运行时长(毫秒)
- `free_heap``min_free_heap``largest_block`:堆内存指标
- `app_version`:固件版本字符串
- `snapshot_update_ms``snapshot_update_count``snapshot_age_ms`:状态快照时间与更新统计
## 运行逻辑
1. 上电初始化 Wi-Fi、LCD、传感器、IO。
2. Wi-Fi 连通后启动 MQTT 与 Console。
3. 主循环每 1s 执行:
- 采集传感器并刷新 UI 数据。
-`mode=auto`,按阈值进行泵灯自动控制。
- 进行告警边沿判定并发布告警消息。
- 每 5s 发布一次状态遥测消息。
4. 收到 MQTT 控制消息时:
- 可切模式(`auto/manual`)。
- 可更新阈值(四个阈值需同条下发)。
- 可手动控制泵灯开关。
## 开发环境
- Linux
- ESP-IDF `v5.5.2`(建议)
- Python 与 ESP-IDF 工具链按官方方式安装
- ESP-IDF `v5.5.2`
- 目标芯片:`esp32c3`
## 快速开始
## 编译与烧录
1. 配置并编译
- `idf.py set-target esp32`
- `idf.py build`
2. 烧录并查看日志
- `idf.py -p /dev/ttyUSB0 flash monitor`
3. 显示初始化
-`app_main` 中调用:`ESP_ERROR_CHECK(start_lvgl_demo());`
- 可选:`ESP_ERROR_CHECK(lvgl_st7735s_set_center_text("BotanicalBuddy"));`
4. 配网
- 按键触发模式:长按设备按键进入配网模式
- 常驻配网模式:上电自动进入配网模式
- 手机连接 `ESP32-xxxxxx`
- 打开 `http://192.168.4.1`
- 选择路由器并输入密码提交
1. 配置环境变量
```bash
export IDF_PATH=/home/beihong/esp/v5.5.2/esp-idf
source $IDF_PATH/export.sh
```
## 调试建议
2. 构建
```bash
idf.py set-target esp32c3
idf.py build
```
- 若出现“按键未按下却进入配网”,通常是按键引脚与 LCD/外设复用导致电平抖动。
- 可在 `WiFi Connect` 配置中调大:
- `WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS`(建议 8000~10000
- `WIFI_CONNECT_BUTTON_RELEASE_ARM_MS`(建议 300~500
- 若硬件允许,优先给配网按键使用独立 GPIO避免与屏幕复位脚复用。
- 若使用常驻配网模式,可不依赖按键触发(适合按键与 LCD 复位脚复用场景)。
3. 烧录并监视日志
```bash
idf.py -p /dev/ttyACM0 flash monitor
```
## 当前状态
## MQTT 协议
项目已完成第一版配网闭环:
- 配网入口
- 路由连接
- 状态显示
- 清除配置
- 中文日志与文档
### ESP32 -> WEX
1. 告警消息主题:`topic/alert/esp32_iothome_001`
```json
{
"metric": "light",
"state": "alarm"
}
```
字段:
- `metric``soil``light`
- `state``normal``alarm`
2. 状态消息主题:`topic/sensor/esp32_BotanicalBuddy_001`
```json
{
"temp": "34.3",
"hum": "30.5",
"soil": "0",
"lux": "40",
"pump": "on",
"light": "off",
"mode": "auto",
"soil_on": 35.0,
"soil_off": 45.0,
"light_on": 100.0,
"light_off": 350.0
}
```
字段:
- `pump``on/off`
- `light``on/off`
- `mode``auto/manual`
- `soil_on`:土壤湿度低阈值(低于该值自动开泵)
- `soil_off`:土壤湿度高阈值(高于该值自动关泵)
- `light_on`:光照低阈值(低于该值自动开灯)
- `light_off`:光照高阈值(高于该值自动关灯)
### WEX -> ESP32
控制主题:`topic/control/esp32_BotanicalBuddy_001`
1. 切换模式
```json
{ "mode": "manual" }
```
```json
{ "mode": "auto" }
```
2. 手动控制(建议先切到 `manual`
```json
{ "pump": "on", "light": "off" }
```
3. 更新自动阈值(四个字段需同时下发)
```json
{
"soil_on": 35,
"soil_off": 45,
"light_on": 100,
"light_off": 350
}
```
4. 混合下发(同一条消息可同时包含模式、阈值、手动开关)
```json
{
"mode": "auto",
"soil_on": 35,
"soil_off": 45,
"light_on": 100,
"light_off": 350,
"pump": "off",
"light": "on"
}
```
兼容输入:
- `pump/light` 支持 `on/off``true/false``1/0`
- `mode` 支持 `auto/manual`,也兼容 `true/false``1/0``true/1=auto`
## 联调建议
1. 先下发 `{"mode":"manual"}`,验证手动泵灯控制。
2. 再下发阈值并切 `{"mode":"auto"}`,观察自动控制接管。
3. 注意阈值含回差:
- 土壤:`soil_on` 开泵,`soil_off` 关泵
- 光照:`light_on` 开灯,`light_off` 关灯
## 说明
- 当前 README 聚焦单片机固件能力与联调协议。
- App/小程序页面与云端业务可按本协议直接对接。
并完成 LCD 显示链路:
- SPI 屏初始化
- LVGL 显示注册
- 方向/偏移可配置

View File

@@ -0,0 +1,3 @@
idf_component_register(SRCS "capactive_soil_moisture_sensor_V2.0.c"
INCLUDE_DIRS "include"
REQUIRES esp_adc)

View File

@@ -0,0 +1,172 @@
#include <stdbool.h>
#include <stdio.h>
#include "esp_adc/adc_cali.h"
#include "esp_adc/adc_cali_scheme.h"
#include "esp_check.h"
#include "esp_log.h"
#include "capactive_soil_moisture_sensor_V2.0.h"
static const char *TAG = "cap_soil_v2";
static adc_oneshot_unit_handle_t s_adc_handle = NULL;
static adc_cali_handle_t s_cali_handle = NULL;
static bool s_cali_enabled = false;
static bool s_inited = false;
static cap_soil_sensor_config_t s_cfg = {
.unit = CAP_SOIL_SENSOR_DEFAULT_UNIT,
.channel = CAP_SOIL_SENSOR_DEFAULT_CHANNEL,
.atten = ADC_ATTEN_DB_12,
.bitwidth = ADC_BITWIDTH_DEFAULT,
.air_raw = 620,
.water_raw = 308,
};
static float map_raw_to_percent(int raw)
{
// 教程经验湿度与输出值成反比air_raw(干) > water_raw(湿)。
int span = s_cfg.air_raw - s_cfg.water_raw;
if (span <= 0) {
return 0.0f;
}
float percent = ((float)(s_cfg.air_raw - raw) * 100.0f) / (float)span;
if (percent < 0.0f) {
percent = 0.0f;
}
if (percent > 100.0f) {
percent = 100.0f;
}
return percent;
}
static cap_soil_level_t map_percent_to_level(float percent)
{
// 三段划分0~33 干燥34~66 湿润67~100 非常潮湿。
if (percent < 33.34f) {
return CAP_SOIL_LEVEL_DRY;
}
if (percent < 66.67f) {
return CAP_SOIL_LEVEL_MOIST;
}
return CAP_SOIL_LEVEL_WET;
}
static esp_err_t try_create_adc_calibration(const cap_soil_sensor_config_t *cfg)
{
#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
adc_cali_curve_fitting_config_t cali_cfg = {
.unit_id = cfg->unit,
.chan = cfg->channel,
.atten = cfg->atten,
.bitwidth = cfg->bitwidth,
};
esp_err_t ret = adc_cali_create_scheme_curve_fitting(&cali_cfg, &s_cali_handle);
if (ret == ESP_OK) {
s_cali_enabled = true;
ESP_LOGI(TAG, "ADC calibration enabled");
return ESP_OK;
}
ESP_LOGW(TAG, "ADC calibration unavailable: %s", esp_err_to_name(ret));
return ret;
#else
(void)cfg;
ESP_LOGW(TAG, "ADC calibration scheme not supported on this target");
return ESP_ERR_NOT_SUPPORTED;
#endif
}
esp_err_t cap_soil_sensor_init(const cap_soil_sensor_config_t *config)
{
if (s_inited) {
return ESP_OK;
}
if (config != NULL) {
s_cfg = *config;
}
adc_oneshot_unit_init_cfg_t unit_cfg = {
.unit_id = s_cfg.unit,
.ulp_mode = ADC_ULP_MODE_DISABLE,
};
ESP_RETURN_ON_ERROR(adc_oneshot_new_unit(&unit_cfg, &s_adc_handle), TAG, "adc unit init failed");
adc_oneshot_chan_cfg_t chan_cfg = {
.atten = s_cfg.atten,
.bitwidth = s_cfg.bitwidth,
};
esp_err_t ret = adc_oneshot_config_channel(s_adc_handle, s_cfg.channel, &chan_cfg);
if (ret != ESP_OK) {
adc_oneshot_del_unit(s_adc_handle);
s_adc_handle = NULL;
return ret;
}
(void)try_create_adc_calibration(&s_cfg);
s_inited = true;
ESP_LOGI(TAG,
"sensor init ok (unit=%d, ch=%d, air_raw=%d, water_raw=%d)",
(int)s_cfg.unit,
(int)s_cfg.channel,
s_cfg.air_raw,
s_cfg.water_raw);
return ESP_OK;
}
esp_err_t cap_soil_sensor_read(cap_soil_sensor_data_t *out_data)
{
ESP_RETURN_ON_FALSE(out_data != NULL, ESP_ERR_INVALID_ARG, TAG, "out_data is null");
ESP_RETURN_ON_FALSE(s_inited && s_adc_handle != NULL, ESP_ERR_INVALID_STATE, TAG, "sensor not initialized");
int raw = 0;
ESP_RETURN_ON_ERROR(adc_oneshot_read(s_adc_handle, s_cfg.channel, &raw), TAG, "adc read failed");
int mv = -1;
if (s_cali_enabled && s_cali_handle != NULL) {
if (adc_cali_raw_to_voltage(s_cali_handle, raw, &mv) != ESP_OK) {
mv = -1;
}
}
float moisture = map_raw_to_percent(raw);
out_data->raw = raw;
out_data->voltage_mv = mv;
out_data->moisture_percent = moisture;
out_data->level = map_percent_to_level(moisture);
return ESP_OK;
}
esp_err_t cap_soil_sensor_set_calibration(int air_raw, int water_raw)
{
ESP_RETURN_ON_FALSE(air_raw > water_raw, ESP_ERR_INVALID_ARG, TAG, "need air_raw > water_raw");
s_cfg.air_raw = air_raw;
s_cfg.water_raw = water_raw;
return ESP_OK;
}
esp_err_t cap_soil_sensor_deinit(void)
{
if (!s_inited) {
return ESP_OK;
}
if (s_cali_enabled && s_cali_handle != NULL) {
#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
adc_cali_delete_scheme_curve_fitting(s_cali_handle);
#endif
s_cali_handle = NULL;
s_cali_enabled = false;
}
if (s_adc_handle != NULL) {
ESP_RETURN_ON_ERROR(adc_oneshot_del_unit(s_adc_handle), TAG, "adc unit delete failed");
s_adc_handle = NULL;
}
s_inited = false;
return ESP_OK;
}

View File

@@ -0,0 +1,48 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "esp_adc/adc_oneshot.h"
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
// 你当前接在 GPIO0ESP32-C3 对应 ADC1_CH0这里作为默认值。
#define CAP_SOIL_SENSOR_DEFAULT_UNIT ADC_UNIT_1
#define CAP_SOIL_SENSOR_DEFAULT_CHANNEL ADC_CHANNEL_0
typedef enum {
CAP_SOIL_LEVEL_DRY = 0,
CAP_SOIL_LEVEL_MOIST,
CAP_SOIL_LEVEL_WET,
} cap_soil_level_t;
typedef struct {
adc_unit_t unit;
adc_channel_t channel;
adc_atten_t atten;
adc_bitwidth_t bitwidth;
// 标定值:空气中读数(干)通常更大,水中读数(湿)通常更小。
int air_raw;
int water_raw;
} cap_soil_sensor_config_t;
typedef struct {
int raw;
int voltage_mv;
float moisture_percent;
cap_soil_level_t level;
} cap_soil_sensor_data_t;
esp_err_t cap_soil_sensor_init(const cap_soil_sensor_config_t *config);
esp_err_t cap_soil_sensor_read(cap_soil_sensor_data_t *out_data);
esp_err_t cap_soil_sensor_set_calibration(int air_raw, int water_raw);
esp_err_t cap_soil_sensor_deinit(void);
#ifdef __cplusplus
}
#endif

View File

@@ -1,3 +1,3 @@
idf_component_register(SRCS "console_user_cmds.c"
INCLUDE_DIRS "include"
REQUIRES console_simple_init console i2c_master_messager io_device_control wifi-connect)
REQUIRES console_simple_init console i2c_master_messager io_device_control wifi-connect capactive_soil_moisture_sensor_V2.0)

View File

@@ -1,9 +1,11 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "esp_check.h"
#include "console_simple_init.h"
#include "console_user_cmds.h"
#include "capactive_soil_moisture_sensor_V2.0.h"
#include "i2c_master_messager.h"
#include "io_device_control.h"
#include "wifi-connect.h"
@@ -28,6 +30,20 @@ static const char *wifi_status_to_str(wifi_connect_status_t status)
}
}
static const char *soil_level_to_str(cap_soil_level_t level)
{
switch (level) {
case CAP_SOIL_LEVEL_DRY:
return "dry";
case CAP_SOIL_LEVEL_MOIST:
return "moist";
case CAP_SOIL_LEVEL_WET:
return "wet";
default:
return "unknown";
}
}
// hello: 最小可用命令,用于验证 console 链路是否正常。
static int cmd_hello(int argc, char **argv)
{
@@ -182,6 +198,48 @@ static int cmd_wifi(int argc, char **argv)
return 1;
}
// soil: 查询土壤湿度,或动态更新空气/水中标定值。
static int cmd_soil(int argc, char **argv)
{
if (argc < 2 || strcmp(argv[1], "read") == 0) {
cap_soil_sensor_data_t data = {0};
esp_err_t ret = cap_soil_sensor_read(&data);
if (ret != ESP_OK) {
printf("soil read failed: %s\n", esp_err_to_name(ret));
return 1;
}
printf("soil raw=%d, mv=%d, moisture=%.1f%%, level=%s\n",
data.raw,
data.voltage_mv,
data.moisture_percent,
soil_level_to_str(data.level));
return 0;
}
if (strcmp(argv[1], "cal") == 0) {
if (argc < 4) {
printf("usage: soil cal <air_raw> <water_raw>\n");
return 1;
}
int air_raw = (int)strtol(argv[2], NULL, 10);
int water_raw = (int)strtol(argv[3], NULL, 10);
esp_err_t ret = cap_soil_sensor_set_calibration(air_raw, water_raw);
if (ret != ESP_OK) {
printf("soil cal failed: %s\n", esp_err_to_name(ret));
printf("hint: air_raw should be greater than water_raw\n");
return 1;
}
printf("soil calibration updated: air=%d, water=%d\n", air_raw, water_raw);
return 0;
}
printf("usage: soil <read|cal <air_raw> <water_raw>>\n");
return 1;
}
esp_err_t console_user_cmds_register(void)
{
const esp_console_cmd_t hello_cmd = {
@@ -222,5 +280,13 @@ esp_err_t console_user_cmds_register(void)
};
ESP_RETURN_ON_ERROR(esp_console_cmd_register(&wifi_cmd), "console_user_cmds", "register wifi failed");
const esp_console_cmd_t soil_cmd = {
.command = "soil",
.help = "土壤湿度读取与标定。用法: soil <read|cal <air_raw> <water_raw>>",
.hint = "<read|cal>",
.func = cmd_soil,
};
ESP_RETURN_ON_ERROR(esp_console_cmd_register(&soil_cmd), "console_user_cmds", "register soil failed");
return ESP_OK;
}

View File

@@ -200,9 +200,14 @@ static void app_main_display(void)
lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0);
s_center_label = lv_label_create(scr);
lv_label_set_text(s_center_label, "ESP32C3-LVGL1");
lv_label_set_text(s_center_label, "BotanicalBuddy\nloading...");
lv_label_set_recolor(s_center_label, false);
lv_label_set_long_mode(s_center_label, LV_LABEL_LONG_WRAP);
lv_obj_set_size(s_center_label, EXAMPLE_LCD_H_RES - 6, EXAMPLE_LCD_V_RES - 6);
lv_obj_set_style_text_color(s_center_label, lv_color_black(), 0);
lv_obj_set_style_text_font(s_center_label, &lv_font_unscii_8, 0);
lv_obj_set_style_text_font(s_center_label, &lv_font_montserrat_14, 0);
lv_obj_set_style_text_align(s_center_label, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_set_style_pad_all(s_center_label, 0, 0);
lv_obj_align(s_center_label, LV_ALIGN_CENTER, 0, 0);
lvgl_port_unlock();

View File

@@ -0,0 +1,3 @@
idf_component_register(SRCS "mqtt_control.c"
INCLUDE_DIRS "include"
REQUIRES mqtt cjson)

View File

@@ -0,0 +1,49 @@
#pragma once
#include <stdbool.h>
#include "esp_err.h"
#include "mqtt_client.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
bool has_mode;
bool auto_mode;
bool has_thresholds;
float soil_on_pct;
float soil_off_pct;
float light_on_lux;
float light_off_lux;
bool has_pump;
bool pump_on;
bool has_light;
bool light_on;
} mqtt_control_command_t;
typedef esp_err_t (*mqtt_control_command_handler_t)(const mqtt_control_command_t *cmd, void *user_ctx);
esp_err_t mqtt_control_start(void);
esp_err_t mqtt_control_stop(void);
esp_err_t mqtt_control_register_command_handler(mqtt_control_command_handler_t handler, void *user_ctx);
bool mqtt_control_is_connected(void);
// Generic publish API for any topic.
esp_err_t mqtt_control_publish(const char *topic,
const char *payload,
int qos,
int retain);
// Publish telemetry payload to default sensor topic.
esp_err_t mqtt_control_publish_sensor(const char *payload, int qos, int retain);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,377 @@
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include "cJSON.h"
#include "esp_check.h"
#include "esp_log.h"
#include "esp_mac.h"
#include "mqtt_control.h"
// MQTT 服务器地址(协议+域名+端口)
#define MQTT_BROKER_URL "mqtt://beihong.wang:1883"
// MQTT 用户名
#define MQTT_USERNAME "BotanicalBuddy"
// MQTT 密码
#define MQTT_PASSWORD "YTGui8979HI"
// 传感器数据发布主题
#define MQTT_SENSOR_TOPIC "topic/sensor/esp32_BotanicalBuddy_001"
// 控制指令订阅主题
#define MQTT_CONTROL_TOPIC "topic/control/esp32_BotanicalBuddy_001"
static const char *TAG = "mqtt_control"; // 日志标签
static esp_mqtt_client_handle_t g_mqtt_client = NULL; // 全局 MQTT 客户端句柄
static bool g_mqtt_connected = false; // MQTT 连接状态标志
static mqtt_control_command_handler_t g_cmd_handler = NULL;
static void *g_cmd_user_ctx = NULL;
static bool json_read_bool(cJSON *root, const char *key, bool *out)
{
cJSON *item = cJSON_GetObjectItemCaseSensitive(root, key);
if (item == NULL)
{
return false;
}
if (cJSON_IsBool(item))
{
*out = cJSON_IsTrue(item);
return true;
}
if (cJSON_IsNumber(item))
{
*out = (item->valuedouble != 0.0);
return true;
}
if (cJSON_IsString(item) && item->valuestring != NULL)
{
if (strcasecmp(item->valuestring, "on") == 0 ||
strcasecmp(item->valuestring, "true") == 0 ||
strcmp(item->valuestring, "1") == 0)
{
*out = true;
return true;
}
if (strcasecmp(item->valuestring, "off") == 0 ||
strcasecmp(item->valuestring, "false") == 0 ||
strcmp(item->valuestring, "0") == 0)
{
*out = false;
return true;
}
}
return false;
}
static bool json_read_float(cJSON *root, const char *key, float *out)
{
cJSON *item = cJSON_GetObjectItemCaseSensitive(root, key);
if (!cJSON_IsNumber(item))
{
return false;
}
*out = (float)item->valuedouble;
return true;
}
static bool json_read_mode_auto(cJSON *root, const char *key, bool *out_auto)
{
cJSON *item = cJSON_GetObjectItemCaseSensitive(root, key);
if (item == NULL)
{
return false;
}
if (cJSON_IsString(item) && item->valuestring != NULL)
{
if (strcasecmp(item->valuestring, "auto") == 0)
{
*out_auto = true;
return true;
}
if (strcasecmp(item->valuestring, "manual") == 0)
{
*out_auto = false;
return true;
}
}
if (cJSON_IsBool(item))
{
*out_auto = cJSON_IsTrue(item);
return true;
}
if (cJSON_IsNumber(item))
{
*out_auto = (item->valuedouble != 0.0);
return true;
}
return false;
}
static esp_err_t mqtt_parse_control_command(const char *data, int data_len, mqtt_control_command_t *out_cmd)
{
ESP_RETURN_ON_FALSE(data != NULL && data_len > 0, ESP_ERR_INVALID_ARG, TAG, "invalid mqtt data");
ESP_RETURN_ON_FALSE(out_cmd != NULL, ESP_ERR_INVALID_ARG, TAG, "out_cmd is null");
memset(out_cmd, 0, sizeof(*out_cmd));
cJSON *root = cJSON_ParseWithLength(data, (size_t)data_len);
ESP_RETURN_ON_FALSE(root != NULL, ESP_ERR_INVALID_ARG, TAG, "control json parse failed");
float soil_on = 0.0f;
float soil_off = 0.0f;
float light_on_lux = 0.0f;
float light_off_lux = 0.0f;
bool has_soil_on = json_read_float(root, "soil_on", &soil_on);
bool has_soil_off = json_read_float(root, "soil_off", &soil_off);
bool has_light_on = json_read_float(root, "light_on", &light_on_lux);
bool has_light_off = json_read_float(root, "light_off", &light_off_lux);
out_cmd->has_mode = json_read_mode_auto(root, "mode", &out_cmd->auto_mode);
if (has_soil_on && has_soil_off && has_light_on && has_light_off)
{
out_cmd->has_thresholds = true;
out_cmd->soil_on_pct = soil_on;
out_cmd->soil_off_pct = soil_off;
out_cmd->light_on_lux = light_on_lux;
out_cmd->light_off_lux = light_off_lux;
}
out_cmd->has_pump = json_read_bool(root, "pump", &out_cmd->pump_on);
out_cmd->has_light = json_read_bool(root, "light", &out_cmd->light_on);
cJSON_Delete(root);
ESP_RETURN_ON_FALSE(out_cmd->has_mode || out_cmd->has_thresholds || out_cmd->has_pump || out_cmd->has_light,
ESP_ERR_INVALID_ARG,
TAG,
"no valid control fields in payload");
return ESP_OK;
}
/**
* @brief 判断接收到的 MQTT 主题是否与预期主题匹配
*
* @param event_topic 事件中的主题字符串
* @param event_topic_len 事件中主题的长度
* @param expected 预期的主题字符串
* @return true 匹配成功false 匹配失败
*/
static bool mqtt_topic_match(const char *event_topic, int event_topic_len, const char *expected)
{
size_t expected_len = strlen(expected);
return expected_len == (size_t)event_topic_len && strncmp(event_topic, expected, expected_len) == 0;
}
/**
* @brief MQTT 事件处理回调函数
*
* 处理连接、断开、订阅、数据接收等事件。
*
* @param handler_args 用户传入的参数(未使用)
* @param base 事件基类型ESP-MQTT
* @param event_id 具体事件 ID
* @param event_data 事件数据指针
*/
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
(void)handler_args;
ESP_LOGD(TAG, "event base=%s id=%" PRIi32, base, event_id);
esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data;
esp_mqtt_client_handle_t client = event->client;
switch ((esp_mqtt_event_id_t)event_id)
{
case MQTT_EVENT_CONNECTED: {
g_mqtt_connected = true;
ESP_LOGI(TAG, "MQTT connected");
// 连接成功后订阅控制主题
int msg_id = esp_mqtt_client_subscribe(client, MQTT_CONTROL_TOPIC, 1);
ESP_LOGI(TAG, "subscribe topic=%s msg_id=%d", MQTT_CONTROL_TOPIC, msg_id);
break;
}
case MQTT_EVENT_DISCONNECTED:
g_mqtt_connected = false;
ESP_LOGW(TAG, "MQTT disconnected");
break;
case MQTT_EVENT_SUBSCRIBED:
ESP_LOGI(TAG, "MQTT subscribed msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_DATA:
ESP_LOGI(TAG, "MQTT data topic=%.*s data=%.*s",
event->topic_len,
event->topic,
event->data_len,
event->data);
// 如果是控制主题的数据,则解析控制命令(待实现)
if (mqtt_topic_match(event->topic, event->topic_len, MQTT_CONTROL_TOPIC))
{
mqtt_control_command_t cmd = {0};
esp_err_t parse_ret = mqtt_parse_control_command(event->data, event->data_len, &cmd);
if (parse_ret != ESP_OK)
{
ESP_LOGW(TAG, "控制命令解析失败: %s", esp_err_to_name(parse_ret));
break;
}
if (g_cmd_handler != NULL)
{
esp_err_t handle_ret = g_cmd_handler(&cmd, g_cmd_user_ctx);
if (handle_ret != ESP_OK)
{
ESP_LOGW(TAG, "控制命令处理失败: %s", esp_err_to_name(handle_ret));
}
}
else
{
ESP_LOGW(TAG, "未注册控制命令处理器,忽略控制消息");
}
}
break;
case MQTT_EVENT_ERROR:
ESP_LOGE(TAG, "MQTT error type=%d", event->error_handle ? event->error_handle->error_type : -1);
break;
default:
break;
}
}
/**
* @brief 启动 MQTT 客户端
*
* 初始化客户端、注册事件回调、启动连接。
*
* @return esp_err_t 启动结果ESP_OK 表示成功
*/
esp_err_t mqtt_control_start(void)
{
if (g_mqtt_client != NULL)
{
return ESP_OK;
}
// 生成基于 MAC 地址后三字节的唯一客户端 ID
char client_id[32] = {0};
uint8_t mac[6] = {0};
ESP_RETURN_ON_ERROR(esp_read_mac(mac, ESP_MAC_WIFI_STA), TAG, "read mac failed");
snprintf(client_id, sizeof(client_id), "esp32_%02x%02x%02x", mac[3], mac[4], mac[5]);
// 配置 MQTT 客户端参数
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = MQTT_BROKER_URL,
.credentials.username = MQTT_USERNAME,
.credentials.client_id = client_id,
.credentials.authentication.password = MQTT_PASSWORD,
};
g_mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
ESP_RETURN_ON_FALSE(g_mqtt_client != NULL, ESP_FAIL, TAG, "mqtt client init failed");
ESP_RETURN_ON_ERROR(esp_mqtt_client_register_event(g_mqtt_client,
ESP_EVENT_ANY_ID,
mqtt_event_handler,
NULL),
TAG,
"register event failed");
ESP_RETURN_ON_ERROR(esp_mqtt_client_start(g_mqtt_client), TAG, "start mqtt client failed");
ESP_LOGI(TAG, "MQTT started with client_id=%s", client_id);
return ESP_OK;
}
esp_err_t mqtt_control_register_command_handler(mqtt_control_command_handler_t handler, void *user_ctx)
{
g_cmd_handler = handler;
g_cmd_user_ctx = user_ctx;
return ESP_OK;
}
/**
* @brief 停止并销毁 MQTT 客户端
*
* @return esp_err_t 停止结果ESP_OK 表示成功
*/
esp_err_t mqtt_control_stop(void)
{
if (g_mqtt_client == NULL)
{
return ESP_OK;
}
esp_err_t ret = esp_mqtt_client_stop(g_mqtt_client);
if (ret != ESP_OK)
{
return ret;
}
ret = esp_mqtt_client_destroy(g_mqtt_client);
if (ret != ESP_OK)
{
return ret;
}
g_mqtt_client = NULL;
g_mqtt_connected = false;
return ESP_OK;
}
/**
* @brief 查询 MQTT 当前连接状态
*
* @return true 已连接false 未连接
*/
bool mqtt_control_is_connected(void)
{
return g_mqtt_connected;
}
/**
* @brief 发布 MQTT 消息到指定主题
*
* @param topic 目标主题
* @param payload 消息载荷
* @param qos 服务质量等级0,1,2
* @param retain 是否保留消息
* @return esp_err_t 发布结果
*/
esp_err_t mqtt_control_publish(const char *topic,
const char *payload,
int qos,
int retain)
{
ESP_RETURN_ON_FALSE(topic != NULL, ESP_ERR_INVALID_ARG, TAG, "topic is null");
ESP_RETURN_ON_FALSE(payload != NULL, ESP_ERR_INVALID_ARG, TAG, "payload is null");
ESP_RETURN_ON_FALSE(g_mqtt_client != NULL, ESP_ERR_INVALID_STATE, TAG, "mqtt not started");
int msg_id = esp_mqtt_client_publish(g_mqtt_client, topic, payload, 0, qos, retain);
ESP_RETURN_ON_FALSE(msg_id >= 0, ESP_FAIL, TAG, "publish failed");
return ESP_OK;
}
/**
* @brief 发布传感器数据到预定义的传感器主题
*
* @param payload 传感器数据字符串
* @param qos 服务质量
* @param retain 是否保留消息
* @return esp_err_t 发布结果
*/
esp_err_t mqtt_control_publish_sensor(const char *payload, int qos, int retain)
{
return mqtt_control_publish(MQTT_SENSOR_TOPIC, payload, qos, retain);
}

View File

@@ -0,0 +1,22 @@
{
"files": [
"actions.h",
"fonts.h",
"images.c",
"images.h",
"screens.c",
"screens.h",
"structs.h",
"styles.c",
"styles.h",
"ui.c",
"ui.h",
"ui_font_source_han_sans_sc_medium_22.c",
"ui_font_source_han_sans_sc_medium_36.c",
"ui_image_humi.c",
"ui_image_light.c",
"ui_image_mois.c",
"ui_image_temp.c",
"vars.h"
]
}

View File

@@ -0,0 +1,5 @@
idf_component_register(
SRC_DIRS "."
INCLUDE_DIRS "."
REQUIRES lvgl esp_lvgl_port
)

14
components/ui/actions.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef EEZ_LVGL_UI_EVENTS_H
#define EEZ_LVGL_UI_EVENTS_H
#include <lvgl.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif /*EEZ_LVGL_UI_EVENTS_H*/

27
components/ui/fonts.h Normal file
View File

@@ -0,0 +1,27 @@
#ifndef EEZ_LVGL_UI_FONTS_H
#define EEZ_LVGL_UI_FONTS_H
#include <lvgl.h>
#ifdef __cplusplus
extern "C" {
#endif
extern const lv_font_t ui_font_source_han_sans_sc_medium_22;
extern const lv_font_t ui_font_source_han_sans_sc_medium_36;
#ifndef EXT_FONT_DESC_T
#define EXT_FONT_DESC_T
typedef struct _ext_font_desc_t {
const char *name;
const void *font_ptr;
} ext_font_desc_t;
#endif
extern ext_font_desc_t fonts[];
#ifdef __cplusplus
}
#endif
#endif /*EEZ_LVGL_UI_FONTS_H*/

8
components/ui/images.c Normal file
View File

@@ -0,0 +1,8 @@
#include "images.h"
const ext_img_desc_t images[4] = {
{ "temp", &img_temp },
{ "humi", &img_humi },
{ "mois", &img_mois },
{ "light", &img_light },
};

29
components/ui/images.h Normal file
View File

@@ -0,0 +1,29 @@
#ifndef EEZ_LVGL_UI_IMAGES_H
#define EEZ_LVGL_UI_IMAGES_H
#include <lvgl.h>
#ifdef __cplusplus
extern "C" {
#endif
extern const lv_img_dsc_t img_temp;
extern const lv_img_dsc_t img_humi;
extern const lv_img_dsc_t img_mois;
extern const lv_img_dsc_t img_light;
#ifndef EXT_IMG_DESC_T
#define EXT_IMG_DESC_T
typedef struct _ext_img_desc_t {
const char *name;
const lv_img_dsc_t *img_dsc;
} ext_img_desc_t;
#endif
extern const ext_img_desc_t images[4];
#ifdef __cplusplus
}
#endif
#endif /*EEZ_LVGL_UI_IMAGES_H*/

342
components/ui/screens.c Normal file
View File

@@ -0,0 +1,342 @@
#include <string.h>
#include "screens.h"
#include "images.h"
#include "fonts.h"
#include "actions.h"
#include "vars.h"
#include "styles.h"
#include "ui.h"
#include <string.h>
objects_t objects;
//
// Event handlers
//
lv_obj_t *tick_value_change_obj;
//
// Screens
//
void create_screen_temperature() {
lv_obj_t *obj = lv_obj_create(0);
objects.temperature = obj;
lv_obj_set_pos(obj, 0, 0);
lv_obj_set_size(obj, 160, 80);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
{
lv_obj_t *parent_obj = obj;
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj0 = obj;
lv_obj_set_pos(obj, 36, 0);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "空气温度");
}
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj1 = obj;
lv_obj_set_pos(obj, 7, 30);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff00ff48), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_36, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "");
}
{
lv_obj_t *obj = lv_image_create(parent_obj);
objects.obj2 = obj;
lv_obj_set_pos(obj, 105, 23);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_image_set_src(obj, &img_temp);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(obj, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
}
}
tick_screen_temperature();
}
void tick_screen_temperature() {
{
const char *new_val = get_var_air_temperature();
const char *cur_val = lv_label_get_text(objects.obj1);
if (strcmp(new_val, cur_val) != 0) {
tick_value_change_obj = objects.obj1;
lv_label_set_text(objects.obj1, new_val);
tick_value_change_obj = NULL;
}
}
}
void create_screen_humidity() {
lv_obj_t *obj = lv_obj_create(0);
objects.humidity = obj;
lv_obj_set_pos(obj, 0, 0);
lv_obj_set_size(obj, 160, 80);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(obj, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
{
lv_obj_t *parent_obj = obj;
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj3 = obj;
lv_obj_set_pos(obj, 36, 0);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "空气湿度");
}
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj4 = obj;
lv_obj_set_pos(obj, 7, 30);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xffd81e06), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_36, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "");
}
{
lv_obj_t *obj = lv_image_create(parent_obj);
objects.obj5 = obj;
lv_obj_set_pos(obj, 105, 23);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_image_set_src(obj, &img_humi);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
}
}
tick_screen_humidity();
}
void tick_screen_humidity() {
{
const char *new_val = get_var_air_humidity();
const char *cur_val = lv_label_get_text(objects.obj4);
if (strcmp(new_val, cur_val) != 0) {
tick_value_change_obj = objects.obj4;
lv_label_set_text(objects.obj4, new_val);
tick_value_change_obj = NULL;
}
}
}
void create_screen_moisture() {
lv_obj_t *obj = lv_obj_create(0);
objects.moisture = obj;
lv_obj_set_pos(obj, 0, 0);
lv_obj_set_size(obj, 160, 80);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(obj, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
{
lv_obj_t *parent_obj = obj;
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj6 = obj;
lv_obj_set_pos(obj, 36, 0);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "土壤湿度");
}
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj7 = obj;
lv_obj_set_pos(obj, 7, 30);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff1296db), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_36, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "");
}
{
lv_obj_t *obj = lv_image_create(parent_obj);
objects.obj8 = obj;
lv_obj_set_pos(obj, 105, 23);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_image_set_src(obj, &img_mois);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
}
}
tick_screen_moisture();
}
void tick_screen_moisture() {
{
const char *new_val = get_var_soil_moisture();
const char *cur_val = lv_label_get_text(objects.obj7);
if (strcmp(new_val, cur_val) != 0) {
tick_value_change_obj = objects.obj7;
lv_label_set_text(objects.obj7, new_val);
tick_value_change_obj = NULL;
}
}
}
void create_screen_intensity() {
lv_obj_t *obj = lv_obj_create(0);
objects.intensity = obj;
lv_obj_set_pos(obj, 0, 0);
lv_obj_set_size(obj, 160, 80);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(obj, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
{
lv_obj_t *parent_obj = obj;
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj9 = obj;
lv_obj_set_pos(obj, 36, 0);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "光照强度");
}
{
lv_obj_t *obj = lv_label_create(parent_obj);
objects.obj10 = obj;
lv_obj_set_pos(obj, 7, 30);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_text_color(obj, lv_color_hex(0xff13227a), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(obj, &ui_font_source_han_sans_sc_medium_36, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_label_set_text(obj, "");
}
{
lv_obj_t *obj = lv_image_create(parent_obj);
objects.obj11 = obj;
lv_obj_set_pos(obj, 105, 23);
lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_image_set_src(obj, &img_light);
lv_obj_set_style_bg_color(obj, lv_color_hex(0xffffffff), LV_PART_MAIN | LV_STATE_DEFAULT);
}
}
tick_screen_intensity();
}
void tick_screen_intensity() {
{
const char *new_val = get_var_light_intensity();
const char *cur_val = lv_label_get_text(objects.obj10);
if (strcmp(new_val, cur_val) != 0) {
tick_value_change_obj = objects.obj10;
lv_label_set_text(objects.obj10, new_val);
tick_value_change_obj = NULL;
}
}
}
typedef void (*tick_screen_func_t)();
tick_screen_func_t tick_screen_funcs[] = {
tick_screen_temperature,
tick_screen_humidity,
tick_screen_moisture,
tick_screen_intensity,
};
void tick_screen(int screen_index) {
tick_screen_funcs[screen_index]();
}
void tick_screen_by_id(enum ScreensEnum screenId) {
tick_screen_funcs[screenId - 1]();
}
//
// Fonts
//
ext_font_desc_t fonts[] = {
{ "SourceHanSansSC-Medium_22", &ui_font_source_han_sans_sc_medium_22 },
{ "SourceHanSansSC-Medium_36", &ui_font_source_han_sans_sc_medium_36 },
#if LV_FONT_MONTSERRAT_8
{ "MONTSERRAT_8", &lv_font_montserrat_8 },
#endif
#if LV_FONT_MONTSERRAT_10
{ "MONTSERRAT_10", &lv_font_montserrat_10 },
#endif
#if LV_FONT_MONTSERRAT_12
{ "MONTSERRAT_12", &lv_font_montserrat_12 },
#endif
#if LV_FONT_MONTSERRAT_14
{ "MONTSERRAT_14", &lv_font_montserrat_14 },
#endif
#if LV_FONT_MONTSERRAT_16
{ "MONTSERRAT_16", &lv_font_montserrat_16 },
#endif
#if LV_FONT_MONTSERRAT_18
{ "MONTSERRAT_18", &lv_font_montserrat_18 },
#endif
#if LV_FONT_MONTSERRAT_20
{ "MONTSERRAT_20", &lv_font_montserrat_20 },
#endif
#if LV_FONT_MONTSERRAT_22
{ "MONTSERRAT_22", &lv_font_montserrat_22 },
#endif
#if LV_FONT_MONTSERRAT_24
{ "MONTSERRAT_24", &lv_font_montserrat_24 },
#endif
#if LV_FONT_MONTSERRAT_26
{ "MONTSERRAT_26", &lv_font_montserrat_26 },
#endif
#if LV_FONT_MONTSERRAT_28
{ "MONTSERRAT_28", &lv_font_montserrat_28 },
#endif
#if LV_FONT_MONTSERRAT_30
{ "MONTSERRAT_30", &lv_font_montserrat_30 },
#endif
#if LV_FONT_MONTSERRAT_32
{ "MONTSERRAT_32", &lv_font_montserrat_32 },
#endif
#if LV_FONT_MONTSERRAT_34
{ "MONTSERRAT_34", &lv_font_montserrat_34 },
#endif
#if LV_FONT_MONTSERRAT_36
{ "MONTSERRAT_36", &lv_font_montserrat_36 },
#endif
#if LV_FONT_MONTSERRAT_38
{ "MONTSERRAT_38", &lv_font_montserrat_38 },
#endif
#if LV_FONT_MONTSERRAT_40
{ "MONTSERRAT_40", &lv_font_montserrat_40 },
#endif
#if LV_FONT_MONTSERRAT_42
{ "MONTSERRAT_42", &lv_font_montserrat_42 },
#endif
#if LV_FONT_MONTSERRAT_44
{ "MONTSERRAT_44", &lv_font_montserrat_44 },
#endif
#if LV_FONT_MONTSERRAT_46
{ "MONTSERRAT_46", &lv_font_montserrat_46 },
#endif
#if LV_FONT_MONTSERRAT_48
{ "MONTSERRAT_48", &lv_font_montserrat_48 },
#endif
};
//
// Color themes
//
uint32_t active_theme_index = 0;
//
//
//
void create_screens() {
// Set default LVGL theme
lv_display_t *dispp = lv_display_get_default();
lv_theme_t *theme = lv_theme_default_init(dispp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), false, LV_FONT_DEFAULT);
lv_display_set_theme(dispp, theme);
// Initialize screens
// Create screens
create_screen_temperature();
create_screen_humidity();
create_screen_moisture();
create_screen_intensity();
}

63
components/ui/screens.h Normal file
View File

@@ -0,0 +1,63 @@
#ifndef EEZ_LVGL_UI_SCREENS_H
#define EEZ_LVGL_UI_SCREENS_H
#include <lvgl.h>
#ifdef __cplusplus
extern "C" {
#endif
// Screens
enum ScreensEnum {
_SCREEN_ID_FIRST = 1,
SCREEN_ID_TEMPERATURE = 1,
SCREEN_ID_HUMIDITY = 2,
SCREEN_ID_MOISTURE = 3,
SCREEN_ID_INTENSITY = 4,
_SCREEN_ID_LAST = 4
};
typedef struct _objects_t {
lv_obj_t *temperature;
lv_obj_t *humidity;
lv_obj_t *moisture;
lv_obj_t *intensity;
lv_obj_t *obj0;
lv_obj_t *obj1;
lv_obj_t *obj2;
lv_obj_t *obj3;
lv_obj_t *obj4;
lv_obj_t *obj5;
lv_obj_t *obj6;
lv_obj_t *obj7;
lv_obj_t *obj8;
lv_obj_t *obj9;
lv_obj_t *obj10;
lv_obj_t *obj11;
} objects_t;
extern objects_t objects;
void create_screen_temperature();
void tick_screen_temperature();
void create_screen_humidity();
void tick_screen_humidity();
void create_screen_moisture();
void tick_screen_moisture();
void create_screen_intensity();
void tick_screen_intensity();
void tick_screen_by_id(enum ScreensEnum screenId);
void tick_screen(int screen_index);
void create_screens();
#ifdef __cplusplus
}
#endif
#endif /*EEZ_LVGL_UI_SCREENS_H*/

4
components/ui/structs.h Normal file
View File

@@ -0,0 +1,4 @@
#ifndef EEZ_LVGL_UI_STRUCTS_H
#define EEZ_LVGL_UI_STRUCTS_H
#endif /*EEZ_LVGL_UI_STRUCTS_H*/

6
components/ui/styles.c Normal file
View File

@@ -0,0 +1,6 @@
#include "styles.h"
#include "images.h"
#include "fonts.h"
#include "ui.h"
#include "screens.h"

14
components/ui/styles.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef EEZ_LVGL_UI_STYLES_H
#define EEZ_LVGL_UI_STYLES_H
#include <lvgl.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif /*EEZ_LVGL_UI_STYLES_H*/

32
components/ui/ui.c Normal file
View File

@@ -0,0 +1,32 @@
#include "ui.h"
#include "screens.h"
#include "images.h"
#include "actions.h"
#include "vars.h"
#include <string.h>
static int16_t currentScreen = -1;
static lv_obj_t *getLvglObjectFromIndex(int32_t index) {
if (index == -1) {
return 0;
}
return ((lv_obj_t **)&objects)[index];
}
void loadScreen(enum ScreensEnum screenId) {
currentScreen = screenId - 1;
lv_obj_t *screen = getLvglObjectFromIndex(currentScreen);
lv_scr_load_anim(screen, LV_SCR_LOAD_ANIM_FADE_IN, 200, 0, false);
}
void ui_init() {
create_screens();
loadScreen(SCREEN_ID_TEMPERATURE);
}
void ui_tick() {
tick_screen(currentScreen);
}

21
components/ui/ui.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef EEZ_LVGL_UI_GUI_H
#define EEZ_LVGL_UI_GUI_H
#include <lvgl.h>
#include "screens.h"
#ifdef __cplusplus
extern "C" {
#endif
void ui_init();
void ui_tick();
void loadScreen(enum ScreensEnum screenId);
#ifdef __cplusplus
}
#endif
#endif // EEZ_LVGL_UI_GUI_H

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,119 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#elif defined(LV_LVGL_H_INCLUDE_SYSTEM)
#include <lvgl.h>
#elif defined(LV_BUILD_TEST)
#include "../lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_HUMI
#define LV_ATTRIBUTE_IMG_HUMI
#endif
static const
LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_HUMI
uint8_t img_humi_map[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd0,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xd1,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xd0,0xe0,0xd0,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd8,0xe0,0xd0,0x01,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x40,0x9f,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xbf,0x00,0x20,0xdf,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0x40,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0x60,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xbf,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x60,0x20,0xbf,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x20,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xbf,0x00,0x00,0x40,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x7f,0x00,0x00,0x40,0xff,0xff,0xdf,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0x7f,0x00,0x00,0x20,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0x9f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xdf,0x60,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xdf,0xdf,0xbf,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x20,0x60,0x9f,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xbf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xbf,0x7f,0x20,0x00,0x00,0x00,0x00,0x20,0x7f,0x9f,0xbf,0xff,0xff,0xdf,0xdf,0x9f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf,0x7f,0x60,0x60,0x7f,0x9f,0xdf,0xff,0xff,0xff,0x9f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x9f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x7f,0xbf,0xdf,0xbf,0x9f,0x7f,0x60,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const lv_image_dsc_t img_humi = {
.header = {
.magic = LV_IMAGE_HEADER_MAGIC,
.cf = LV_COLOR_FORMAT_RGB565A8,
.flags = 0,
.w = 48,
.h = 48,
.stride = 100,
.reserved_2 = 0,
},
.data_size = sizeof(img_humi_map),
.data = img_humi_map,
.reserved = NULL,
};

View File

@@ -0,0 +1,119 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#elif defined(LV_LVGL_H_INCLUDE_SYSTEM)
#include <lvgl.h>
#elif defined(LV_BUILD_TEST)
#include "../lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_LIGHT
#define LV_ATTRIBUTE_IMG_LIGHT
#endif
static const
LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LIGHT
uint8_t img_light_map[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0xee,0x10,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x2f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x7f,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7f,0x9f,0x9f,0x9f,0x9f,0x7f,0x9f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0xaf,0x9f,0x7f,0x7f,0x7f,0x9f,0x40,0x9f,0x9f,0x9f,0x9f,0x7f,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x88,0x88,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x9f,0x9f,0x9f,0x9f,0x9f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7f,0xbf,0xbf,0xbf,0xbf,0x60,0x9f,0x7f,0x60,0x60,0x74,0x9c,0x60,0x60,0x60,0x60,0x60,0x60,0x7f,0x9f,0x7f,0xbf,0xbf,0xbf,0x9f,0x7f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x7f,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x7f,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xdf,0x20,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0x7f,0x00,0x00,0x00,0xbf,0xff,0x7f,0xff,0xff,0x7f,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xbf,0x40,0x00,0x00,0x7f,0xff,0xdf,0x00,0xff,0xff,0x20,0xbf,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0x40,0x00,0xff,0xff,0x20,0x20,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0x9f,0x00,0x00,0x00,0x9f,0xff,0x9f,0x00,0x00,0xff,0xff,0x20,0x00,0x9f,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0x9f,0x00,0x00,0xbf,0xff,0xdf,0x20,0x00,0xff,0xff,0x20,0x00,0x20,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0x9f,0x00,0x20,0xbf,0xff,0xdf,0x20,0xff,0xff,0x20,0x00,0x00,0xbf,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0x9f,0x00,0x20,0xbf,0xff,0xdf,0xff,0xff,0x20,0x00,0x7f,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0x9f,0x00,0x20,0xdf,0xff,0xff,0xff,0x20,0x40,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x7f,0x00,0x60,0xff,0xff,0x9f,0x00,0x20,0xdf,0xff,0xff,0x60,0xff,0xff,0x7f,0xbf,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0x9f,0x00,0x20,0xff,0xff,0xff,0xff,0xbf,0x00,0xdf,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0x7f,0x00,0x60,0xff,0xbf,0x00,0x00,0xff,0xff,0xff,0xdf,0x00,0x00,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0x7f,0x00,0x20,0x00,0x00,0x00,0xff,0xff,0xdf,0x20,0x00,0x7f,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x00,0x40,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0x7f,0x00,0x00,0x00,0xff,0xff,0x20,0x7f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0x60,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x9f,0x00,0x00,0xdf,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7f,0x7f,0x7f,0x7f,0x60,0x20,0x20,0x20,0x20,0x3c,0x20,0x74,0x74,0x74,0x74,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7f,0xbf,0xbf,0xbf,0xbf,0x9f,0x9f,0x7f,0x60,0x60,0x60,0x60,0x60,0x60,0x9c,0x74,0x60,0x60,0x60,0x9f,0x60,0xbf,0xbf,0xbf,0xbf,0x7f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9f,0x9f,0x9f,0x9f,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x88,0x88,0x88,0x88,0x88,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7f,0x9f,0x9f,0x9f,0x9f,0x60,0x9f,0x7f,0x7f,0x7f,0x9f,0xaf,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x9f,0x9f,0x40,0x9f,0x9f,0x9f,0x7f,0x7f,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x7f,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7f,0x7f,0x7f,0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const lv_image_dsc_t img_light = {
.header = {
.magic = LV_IMAGE_HEADER_MAGIC,
.cf = LV_COLOR_FORMAT_RGB565A8,
.flags = 0,
.w = 48,
.h = 48,
.stride = 100,
.reserved_2 = 0,
},
.data_size = sizeof(img_light_map),
.data = img_light_map,
.reserved = NULL,
};

View File

@@ -0,0 +1,119 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#elif defined(LV_LVGL_H_INCLUDE_SYSTEM)
#include <lvgl.h>
#elif defined(LV_BUILD_TEST)
#include "../lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_MOIS
#define LV_ATTRIBUTE_IMG_MOIS
#endif
static const
LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MOIS
uint8_t img_mois_map[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0x0c,0xbb,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,
0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,
0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,
0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xba,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x40,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x60,0x9f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xdf,0xff,0xff,0x9f,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0x7f,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xdf,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7f,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0x60,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0x60,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0x9f,0x00,0x00,0x20,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xdf,0xbf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0x20,0x00,0x00,0x00,0x40,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xbf,0x7f,0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x20,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x16,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0x7f,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xdf,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xa3,0xff,0xff,0xba,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x7f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7f,0x60,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9f,0xdf,0xff,0xff,0xff,0xdf,0x9f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x51,0xff,0xff,0xff,0xff,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xff,0xff,0xff,0xff,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x50,0xa6,0xab,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7f,0xdf,0xdf,0xbf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xbf,0xff,0xff,0xdf,0x9f,0x40,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xdf,0x9f,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x7f,0xbf,0xff,0xff,0xff,0xff,0xff,0xdf,0xbf,0x9f,0x60,0x40,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,
0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xdf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,
0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x7f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x9f,0xbf,0xdf,0xdf,0xff,0xdf,0xdf,0xdf,0xbf,0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const lv_image_dsc_t img_mois = {
.header = {
.magic = LV_IMAGE_HEADER_MAGIC,
.cf = LV_COLOR_FORMAT_RGB565A8,
.flags = 0,
.w = 48,
.h = 48,
.stride = 100,
.reserved_2 = 0,
},
.data_size = sizeof(img_mois_map),
.data = img_mois_map,
.reserved = NULL,
};

View File

@@ -0,0 +1,119 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#elif defined(LV_LVGL_H_INCLUDE_SYSTEM)
#include <lvgl.h>
#elif defined(LV_BUILD_TEST)
#include "../lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_TEMP
#define LV_ATTRIBUTE_IMG_TEMP
#endif
static const
LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_TEMP
uint8_t img_temp_map[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xa5,0x1f,0xa5,0x1f,0xa5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xc5,0x1f,0xa5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x9f,0xff,0xdf,0xbf,0x9f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x20,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xbf,0x7f,0x60,0x7f,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x60,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xdf,0xdf,0x9f,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x60,0x60,0x60,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x9f,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x7f,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x60,0x00,0x00,0x00,0x20,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x7f,0x40,0x00,0x20,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xbf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x7f,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0x7f,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xdf,0x40,0x00,0x60,0xff,0xff,0xdf,0x00,0x20,0xbf,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x60,0xff,0xff,0xdf,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xdf,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x40,0xdf,0xff,0xff,0xdf,0x7f,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xdf,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0xdf,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x20,0x00,0x00,0x40,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0x9f,0x20,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0x20,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xbf,0xff,0xff,0xbf,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0xdf,0x7f,0x00,0x00,0x60,0xff,0xff,0xff,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x7f,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0x20,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x7f,0xff,0xff,0xbf,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x40,0xff,0xff,0xdf,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xdf,0x20,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x7f,0xff,0xff,0xbf,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x60,0xff,0xff,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x60,0xdf,0xff,0xff,0xbf,0x00,0x00,0x7f,0xff,0xff,0xdf,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x60,0xff,0xff,0xdf,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x9f,0xdf,0x00,0x00,0x40,0xff,0xff,0xff,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x9f,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0x60,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0xff,0xff,0xff,0x60,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xdf,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x20,0x60,0x7f,0x40,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xdf,0x9f,0x60,0x40,0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x60,0x9f,0xbf,0xff,0xff,0xdf,0xbf,0x7f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const lv_image_dsc_t img_temp = {
.header = {
.magic = LV_IMAGE_HEADER_MAGIC,
.cf = LV_COLOR_FORMAT_RGB565A8,
.flags = 0,
.w = 48,
.h = 48,
.stride = 100,
.reserved_2 = 0,
},
.data_size = sizeof(img_temp_map),
.data = img_temp_map,
.reserved = NULL,
};

48
components/ui/vars.c Normal file
View File

@@ -0,0 +1,48 @@
#include <string.h>
#include "vars.h"
char air_temperature[100] = { 0 };
const char *get_var_air_temperature() {
return air_temperature;
}
void set_var_air_temperature(const char *value) {
strncpy(air_temperature, value, sizeof(air_temperature) / sizeof(char));
air_temperature[sizeof(air_temperature) / sizeof(char) - 1] = 0;
}
char air_humidity[100] = { 0 };
const char *get_var_air_humidity() {
return air_humidity;
}
void set_var_air_humidity(const char *value) {
strncpy(air_humidity, value, sizeof(air_humidity) / sizeof(char));
air_humidity[sizeof(air_humidity) / sizeof(char) - 1] = 0;
}
char soil_moisture[100] = { 0 };
const char *get_var_soil_moisture() {
return soil_moisture;
}
void set_var_soil_moisture(const char *value) {
strncpy(soil_moisture, value, sizeof(soil_moisture) / sizeof(char));
soil_moisture[sizeof(soil_moisture) / sizeof(char) - 1] = 0;
}
char light_intensity[100] = { 0 };
const char *get_var_light_intensity() {
return light_intensity;
}
void set_var_light_intensity(const char *value) {
strncpy(light_intensity, value, sizeof(light_intensity) / sizeof(char));
light_intensity[sizeof(light_intensity) / sizeof(char) - 1] = 0;
}

37
components/ui/vars.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef EEZ_LVGL_UI_VARS_H
#define EEZ_LVGL_UI_VARS_H
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
// enum declarations
// Flow global variables
enum FlowGlobalVariables {
FLOW_GLOBAL_VARIABLE_AIR_TEMPERATURE = 0,
FLOW_GLOBAL_VARIABLE_AIR_HUMIDITY = 1,
FLOW_GLOBAL_VARIABLE_SOIL_MOISTURE = 2,
FLOW_GLOBAL_VARIABLE_LIGHT_INTENSITY = 3
};
// Native global variables
extern const char *get_var_air_temperature();
extern void set_var_air_temperature(const char *value);
extern const char *get_var_air_humidity();
extern void set_var_air_humidity(const char *value);
extern const char *get_var_soil_moisture();
extern void set_var_soil_moisture(const char *value);
extern const char *get_var_light_intensity();
extern void set_var_light_intensity(const char *value);
#ifdef __cplusplus
}
#endif
#endif /*EEZ_LVGL_UI_VARS_H*/

View File

@@ -9,6 +9,16 @@ dependencies:
registry_url: https://components.espressif.com/
type: service
version: 2.0.0
espressif/cjson:
component_hash: 002c6d1872ee4c97d333938ebe107a29841cc847f9de89e676714bd2844057ea
dependencies:
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com/
type: service
version: 1.7.19~1
espressif/console_simple_init:
component_hash: b488b12318f3cb6e0b55b034bd12956926d45f0e1396442e820f8ece4776c306
dependencies:
@@ -33,6 +43,16 @@ dependencies:
registry_url: https://components.espressif.com/
type: service
version: 2.7.2
espressif/mqtt:
component_hash: ffdad5659706b4dc14bc63f8eb73ef765efa015bf7e9adf71c813d52a2dc9342
dependencies:
- name: idf
require: private
version: '>=5.3'
source:
registry_url: https://components.espressif.com/
type: service
version: 1.0.0
idf:
source:
type: idf
@@ -70,10 +90,12 @@ dependencies:
version: 9.5.0
direct_dependencies:
- espressif/bh1750
- espressif/cjson
- espressif/console_simple_init
- espressif/esp_lvgl_port
- espressif/mqtt
- idf
- k0i05/esp_ahtxx
manifest_hash: 876b8b787041413cd7d3f71227f1618dceac35f343e17a5874d56c77837d0705
manifest_hash: 718977b7c70d2e199530b4f98a537ecc03c07999f59c844987823a832f51b9b0
target: esp32c3
version: 2.0.0

View File

@@ -1,4 +1,4 @@
idf_component_register(SRCS "main.c"
idf_component_register(SRCS "main.c" "auto_ctrl_thresholds.c" "auto_alerts.c" "status_web.c"
INCLUDE_DIRS "."
REQUIRES wifi-connect esp_lvgl_port lvgl_st7735s_use i2c_master_messager io_device_control console_simple_init console console_user_cmds
REQUIRES wifi-connect mqtt_control esp_lvgl_port lvgl_st7735s_use i2c_master_messager io_device_control console_simple_init console console_user_cmds capactive_soil_moisture_sensor_V2.0 ui esp_app_format
)

188
main/auto_alerts.c Normal file
View File

@@ -0,0 +1,188 @@
#include "auto_alerts.h"
#include "esp_check.h"
#include "esp_log.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
static const char *TAG = "auto_alerts"; // 日志标签
// 用于保护全局状态的自旋锁(临界区)
static portMUX_TYPE s_alerts_lock = portMUX_INITIALIZER_UNLOCKED;
// 用户注册的回调函数
static auto_alert_callback_t s_callback = NULL;
// 回调函数的用户上下文指针
static void *s_user_ctx = NULL;
// 土壤湿度告警是否已激活
static bool s_soil_alarm_active = false;
// 光照强度告警是否已激活
static bool s_light_alarm_active = false;
/**
* @brief 发送自动告警事件
*
* @param metric 告警指标类型(如土壤湿度、光照强度)
* @param state 告警状态(告警或恢复正常)
* @param value 当前测量值
* @param threshold 触发告警的阈值
*/
static void auto_alerts_emit(auto_alert_metric_t metric,
auto_alert_state_t state,
float value,
float threshold)
{
auto_alert_event_t event = {
.metric = metric,
.state = state,
.value = value,
.threshold = threshold,
.timestamp_ms = esp_timer_get_time() / 1000, // 转换为毫秒时间戳
};
auto_alert_callback_t callback = NULL;
void *user_ctx = NULL;
// 进入临界区,安全读取回调和上下文
taskENTER_CRITICAL(&s_alerts_lock);
callback = s_callback;
user_ctx = s_user_ctx;
taskEXIT_CRITICAL(&s_alerts_lock);
if (callback != NULL)
{
callback(&event, user_ctx); // 调用用户注册的回调函数
}
// 打印日志信息
ESP_LOGI(TAG,
"alert metric=%d state=%d value=%.1f threshold=%.1f",
(int)event.metric,
(int)event.state,
event.value,
event.threshold);
}
/**
* @brief 初始化自动告警模块
*
* 将所有告警状态重置为未激活。
*/
void auto_alerts_init(void)
{
taskENTER_CRITICAL(&s_alerts_lock);
s_soil_alarm_active = false;
s_light_alarm_active = false;
taskEXIT_CRITICAL(&s_alerts_lock);
}
/**
* @brief 注册自动告警回调函数
*
* @param callback 用户定义的回调函数
* @param user_ctx 用户上下文指针
* @return esp_err_t 总是返回 ESP_OK
*/
esp_err_t auto_alerts_register_callback(auto_alert_callback_t callback, void *user_ctx)
{
taskENTER_CRITICAL(&s_alerts_lock);
s_callback = callback;
s_user_ctx = user_ctx;
taskEXIT_CRITICAL(&s_alerts_lock);
return ESP_OK;
}
/**
* @brief 根据当前传感器数据和阈值评估是否触发或解除告警
*
* @param soil_valid 土壤湿度数据是否有效
* @param soil_moisture_pct 当前土壤湿度百分比
* @param light_valid 光照数据是否有效
* @param light_lux 当前光照强度单位lux
* @param thresholds 自动控制阈值配置结构体指针
*/
void auto_alerts_evaluate(bool soil_valid,
float soil_moisture_pct,
bool light_valid,
float light_lux,
const auto_ctrl_thresholds_t *thresholds)
{
if (thresholds == NULL)
{
return; // 阈值为空,直接返回
}
// 处理土壤湿度告警逻辑
if (soil_valid)
{
bool emit_alarm = false; // 是否需要触发告警
bool emit_recover = false; // 是否需要恢复通知
taskENTER_CRITICAL(&s_alerts_lock);
// 如果当前未告警,且土壤湿度低于启动水泵的阈值,则触发告警
if (!s_soil_alarm_active && soil_moisture_pct < thresholds->pump_on_soil_below_pct)
{
s_soil_alarm_active = true;
emit_alarm = true;
}
// 如果当前处于告警状态,且土壤湿度高于关闭水泵的阈值,则恢复
else if (s_soil_alarm_active && soil_moisture_pct > thresholds->pump_off_soil_above_pct)
{
s_soil_alarm_active = false;
emit_recover = true;
}
taskEXIT_CRITICAL(&s_alerts_lock);
if (emit_alarm)
{
auto_alerts_emit(AUTO_ALERT_METRIC_SOIL_MOISTURE,
AUTO_ALERT_STATE_ALARM,
soil_moisture_pct,
thresholds->pump_on_soil_below_pct);
}
if (emit_recover)
{
auto_alerts_emit(AUTO_ALERT_METRIC_SOIL_MOISTURE,
AUTO_ALERT_STATE_NORMAL,
soil_moisture_pct,
thresholds->pump_off_soil_above_pct);
}
}
// 处理光照强度告警逻辑
if (light_valid)
{
bool emit_alarm = false; // 是否需要触发告警
bool emit_recover = false; // 是否需要恢复通知
taskENTER_CRITICAL(&s_alerts_lock);
// 如果当前未告警,且光照强度低于开启补光灯的阈值,则触发告警
if (!s_light_alarm_active && light_lux < thresholds->light_on_lux_below)
{
s_light_alarm_active = true;
emit_alarm = true;
}
// 如果当前处于告警状态,且光照强度高于关闭补光灯的阈值,则恢复
else if (s_light_alarm_active && light_lux > thresholds->light_off_lux_above)
{
s_light_alarm_active = false;
emit_recover = true;
}
taskEXIT_CRITICAL(&s_alerts_lock);
if (emit_alarm)
{
auto_alerts_emit(AUTO_ALERT_METRIC_LIGHT_INTENSITY,
AUTO_ALERT_STATE_ALARM,
light_lux,
thresholds->light_on_lux_below);
}
if (emit_recover)
{
auto_alerts_emit(AUTO_ALERT_METRIC_LIGHT_INTENSITY,
AUTO_ALERT_STATE_NORMAL,
light_lux,
thresholds->light_off_lux_above);
}
}
}

48
main/auto_alerts.h Normal file
View File

@@ -0,0 +1,48 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "auto_ctrl_thresholds.h"
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
AUTO_ALERT_METRIC_SOIL_MOISTURE = 1,
AUTO_ALERT_METRIC_LIGHT_INTENSITY = 2,
} auto_alert_metric_t;
typedef enum {
AUTO_ALERT_STATE_NORMAL = 0,
AUTO_ALERT_STATE_ALARM = 1,
} auto_alert_state_t;
typedef struct {
auto_alert_metric_t metric;
auto_alert_state_t state;
float value;
float threshold;
int64_t timestamp_ms;
} auto_alert_event_t;
typedef void (*auto_alert_callback_t)(const auto_alert_event_t *event, void *user_ctx);
// Reset internal state at boot.
void auto_alerts_init(void);
// Register callback sink (e.g. MQTT publisher). Passing NULL clears callback.
esp_err_t auto_alerts_register_callback(auto_alert_callback_t callback, void *user_ctx);
// Evaluate current sensor values and emit edge-triggered alert events.
void auto_alerts_evaluate(bool soil_valid,
float soil_moisture_pct,
bool light_valid,
float light_lux,
const auto_ctrl_thresholds_t *thresholds);
#ifdef __cplusplus
}
#endif

146
main/auto_ctrl_thresholds.c Normal file
View File

@@ -0,0 +1,146 @@
#include "auto_ctrl_thresholds.h"
#include "freertos/FreeRTOS.h"
#include "esp_check.h"
// 默认土壤湿度低于此百分比时启动水泵(单位:%
#define DEFAULT_PUMP_ON_SOIL_BELOW_PCT 35.0f
// 默认土壤湿度高于此百分比时关闭水泵(单位:%
#define DEFAULT_PUMP_OFF_SOIL_ABOVE_PCT 45.0f
// 默认光照强度低于此值时开启补光灯单位lux
#define DEFAULT_LIGHT_ON_LUX_BELOW 200.0f
// 默认光照强度高于此值时关闭补光灯单位lux
#define DEFAULT_LIGHT_OFF_LUX_ABOVE 350.0f
// 用于保护阈值数据的自旋锁(临界区)
static portMUX_TYPE s_thresholds_lock = portMUX_INITIALIZER_UNLOCKED;
// 全局阈值配置结构体,初始化为默认值
static auto_ctrl_thresholds_t s_thresholds = {
.pump_on_soil_below_pct = DEFAULT_PUMP_ON_SOIL_BELOW_PCT,
.pump_off_soil_above_pct = DEFAULT_PUMP_OFF_SOIL_ABOVE_PCT,
.light_on_lux_below = DEFAULT_LIGHT_ON_LUX_BELOW,
.light_off_lux_above = DEFAULT_LIGHT_OFF_LUX_ABOVE,
};
/**
* @brief 验证自动控制阈值配置的有效性
*
* 检查指针非空、数值范围合法、启停阈值满足 on < off 等条件。
*
* @param cfg 待验证的阈值配置指针
* @return esp_err_t 验证结果ESP_OK 表示有效
*/
static esp_err_t auto_ctrl_thresholds_validate(const auto_ctrl_thresholds_t *cfg)
{
ESP_RETURN_ON_FALSE(cfg != NULL, ESP_ERR_INVALID_ARG, "auto_ctrl_thresholds", "cfg is null");
ESP_RETURN_ON_FALSE(cfg->pump_on_soil_below_pct >= 0.0f && cfg->pump_on_soil_below_pct <= 100.0f,
ESP_ERR_INVALID_ARG,
"auto_ctrl_thresholds",
"pump_on_soil_below_pct out of range");
ESP_RETURN_ON_FALSE(cfg->pump_off_soil_above_pct >= 0.0f && cfg->pump_off_soil_above_pct <= 100.0f,
ESP_ERR_INVALID_ARG,
"auto_ctrl_thresholds",
"pump_off_soil_above_pct out of range");
ESP_RETURN_ON_FALSE(cfg->pump_on_soil_below_pct < cfg->pump_off_soil_above_pct,
ESP_ERR_INVALID_ARG,
"auto_ctrl_thresholds",
"pump thresholds must satisfy on < off");
ESP_RETURN_ON_FALSE(cfg->light_on_lux_below >= 0.0f,
ESP_ERR_INVALID_ARG,
"auto_ctrl_thresholds",
"light_on_lux_below out of range");
ESP_RETURN_ON_FALSE(cfg->light_off_lux_above >= 0.0f,
ESP_ERR_INVALID_ARG,
"auto_ctrl_thresholds",
"light_off_lux_above out of range");
ESP_RETURN_ON_FALSE(cfg->light_on_lux_below < cfg->light_off_lux_above,
ESP_ERR_INVALID_ARG,
"auto_ctrl_thresholds",
"light thresholds must satisfy on < off");
return ESP_OK;
}
/**
* @brief 初始化阈值为默认值
*
* 将全局阈值结构体重置为预设的默认配置。
*/
void auto_ctrl_thresholds_init_defaults(void)
{
const auto_ctrl_thresholds_t defaults = {
.pump_on_soil_below_pct = DEFAULT_PUMP_ON_SOIL_BELOW_PCT,
.pump_off_soil_above_pct = DEFAULT_PUMP_OFF_SOIL_ABOVE_PCT,
.light_on_lux_below = DEFAULT_LIGHT_ON_LUX_BELOW,
.light_off_lux_above = DEFAULT_LIGHT_OFF_LUX_ABOVE,
};
taskENTER_CRITICAL(&s_thresholds_lock);
s_thresholds = defaults;
taskEXIT_CRITICAL(&s_thresholds_lock);
}
/**
* @brief 获取当前阈值配置
*
* 安全地复制当前阈值到输出参数中。
*
* @param out 输出参数,指向接收阈值的结构体
*/
void auto_ctrl_thresholds_get(auto_ctrl_thresholds_t *out)
{
if (out == NULL) {
return;
}
taskENTER_CRITICAL(&s_thresholds_lock);
*out = s_thresholds;
taskEXIT_CRITICAL(&s_thresholds_lock);
}
/**
* @brief 设置新的阈值配置
*
* 验证输入配置有效性后,安全更新全局阈值。
*
* @param cfg 新的阈值配置指针
* @return esp_err_t 设置结果ESP_OK 表示成功
*/
esp_err_t auto_ctrl_thresholds_set(const auto_ctrl_thresholds_t *cfg)
{
ESP_RETURN_ON_ERROR(auto_ctrl_thresholds_validate(cfg), "auto_ctrl_thresholds", "invalid thresholds");
taskENTER_CRITICAL(&s_thresholds_lock);
s_thresholds = *cfg;
taskEXIT_CRITICAL(&s_thresholds_lock);
return ESP_OK;
}
/**
* @brief 通过独立参数设置阈值
*
* 提供一种更便捷的阈值设置方式,内部封装为结构体后调用 set 接口。
*
* @param pump_on_soil_below_pct 水泵启动土壤湿度阈值(%
* @param pump_off_soil_above_pct 水泵关闭土壤湿度阈值(%
* @param light_on_lux_below 补光灯开启光照阈值lux
* @param light_off_lux_above 补光灯关闭光照阈值lux
* @return esp_err_t 设置结果
*/
esp_err_t auto_ctrl_thresholds_set_values(float pump_on_soil_below_pct,
float pump_off_soil_above_pct,
float light_on_lux_below,
float light_off_lux_above)
{
const auto_ctrl_thresholds_t cfg = {
.pump_on_soil_below_pct = pump_on_soil_below_pct,
.pump_off_soil_above_pct = pump_off_soil_above_pct,
.light_on_lux_below = light_on_lux_below,
.light_off_lux_above = light_off_lux_above,
};
return auto_ctrl_thresholds_set(&cfg);
}

View File

@@ -0,0 +1,33 @@
#pragma once
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
float pump_on_soil_below_pct;
float pump_off_soil_above_pct;
float light_on_lux_below;
float light_off_lux_above;
} auto_ctrl_thresholds_t;
// Initializes default thresholds once at boot.
void auto_ctrl_thresholds_init_defaults(void);
// Thread-safe snapshot read, intended for control loop usage.
void auto_ctrl_thresholds_get(auto_ctrl_thresholds_t *out);
// Thread-safe full update with range/order validation.
esp_err_t auto_ctrl_thresholds_set(const auto_ctrl_thresholds_t *cfg);
// Convenience API for MQTT callback usage.
esp_err_t auto_ctrl_thresholds_set_values(float pump_on_soil_below_pct,
float pump_off_soil_above_pct,
float light_on_lux_below,
float light_off_lux_above);
#ifdef __cplusplus
}
#endif

View File

@@ -18,3 +18,6 @@ dependencies:
espressif/bh1750: ^2.0.0
k0i05/esp_ahtxx: ^1.2.7
espressif/console_simple_init: ^1.1.0
espressif/mqtt: ^1.0.0
espressif/cjson: ^1.7.19

View File

@@ -11,38 +11,451 @@
#include "io_device_control.h"
#include "console_simple_init.h" // 提供 console_cmd_user_register 和 console_cmd_all_register
#include "console_user_cmds.h"
#include "capactive_soil_moisture_sensor_V2.0.h"
#include "ui.h" // 使用EEZStudio提供的ui组件便于后续扩展
#include "esp_lvgl_port.h"
#include "vars.h" // 定义全局变量接口
#include "auto_ctrl_thresholds.h"
#include "auto_alerts.h"
#include "mqtt_control.h" // MQTT 控制接口
#include "status_web.h"
// 配置宏定义BH1750 光照传感器是否启用(默认禁用)
#ifndef CONFIG_I2C_MASTER_MESSAGER_BH1750_ENABLE
#define CONFIG_I2C_MASTER_MESSAGER_BH1750_ENABLE 0
#endif
// 配置宏定义AHT30 温湿度传感器是否启用(默认禁用)
#ifndef CONFIG_I2C_MASTER_MESSAGER_AHT30_ENABLE
#define CONFIG_I2C_MASTER_MESSAGER_AHT30_ENABLE 0
#endif
// 配置宏定义BH1750 读取周期毫秒默认500ms
#ifndef CONFIG_I2C_MASTER_MESSAGER_BH1750_READ_PERIOD_MS
#define CONFIG_I2C_MASTER_MESSAGER_BH1750_READ_PERIOD_MS 500
#endif
// 配置宏定义AHT30 读取周期毫秒默认2000ms
#ifndef CONFIG_I2C_MASTER_MESSAGER_AHT30_READ_PERIOD_MS
#define CONFIG_I2C_MASTER_MESSAGER_AHT30_READ_PERIOD_MS 2000
#endif
// 配置宏定义I2C 是否启用内部上拉电阻(默认启用)
#ifndef CONFIG_I2C_MASTER_MESSAGER_ENABLE_INTERNAL_PULLUP
#define CONFIG_I2C_MASTER_MESSAGER_ENABLE_INTERNAL_PULLUP 1
#endif
// I2C 端口配置
#define BOTANY_I2C_PORT I2C_NUM_0
// I2C SCL 引脚
#define BOTANY_I2C_SCL_GPIO GPIO_NUM_5
// I2C SDA 引脚
#define BOTANY_I2C_SDA_GPIO GPIO_NUM_4
// BH1750 使能标志
#define BOTANY_BH1750_ENABLE CONFIG_I2C_MASTER_MESSAGER_BH1750_ENABLE
// AHT30 使能标志
#define BOTANY_AHT30_ENABLE CONFIG_I2C_MASTER_MESSAGER_AHT30_ENABLE
// BH1750 读取周期
#define BOTANY_BH1750_PERIOD_MS CONFIG_I2C_MASTER_MESSAGER_BH1750_READ_PERIOD_MS
// AHT30 读取周期
#define BOTANY_AHT30_PERIOD_MS CONFIG_I2C_MASTER_MESSAGER_AHT30_READ_PERIOD_MS
// I2C 内部上拉使能
#define BOTANY_I2C_INTERNAL_PULLUP CONFIG_I2C_MASTER_MESSAGER_ENABLE_INTERNAL_PULLUP
// MQTT 告警主题
#define BOTANY_MQTT_ALERT_TOPIC "topic/alert/esp32_iothome_001"
// MQTT 遥测数据上报周期(毫秒)
#define BOTANY_MQTT_TELEMETRY_PERIOD_MS 5000
#define BOTANY_STATUS_WEB_PORT 8080
// 日志标签
static const char *TAG = "main";
// 全局变量:存储空气温度字符串
static char s_air_temp[16];
// 全局变量:存储空气湿度字符串
static char s_air_hum[16];
// 全局变量:存储土壤湿度字符串
static char s_soil[16];
// 全局变量:存储光照强度字符串
static char s_lux[16];
// 全局变量水泵状态true=开启false=关闭)
static bool s_pump_on = false;
// 全局变量补光灯状态true=开启false=关闭)
static bool s_light_on = false;
// 全局变量自动控制模式使能true=自动false=手动)
static bool s_auto_control_enabled = true;
static bool s_i2c_ready = false;
static bool s_soil_sensor_ready = false;
static uint32_t s_main_loop_counter = 0;
/**
* @brief 发布当前完整状态快照(含阈值)到传感器主题
*/
static esp_err_t publish_telemetry_snapshot(void)
{
if (!mqtt_control_is_connected())
{
return ESP_ERR_INVALID_STATE;
}
auto_ctrl_thresholds_t thresholds = {0};
auto_ctrl_thresholds_get(&thresholds);
char telemetry_payload[256] = {0};
int len = snprintf(telemetry_payload,
sizeof(telemetry_payload),
"{\"temp\":\"%s\",\"hum\":\"%s\",\"soil\":\"%s\",\"lux\":\"%s\",\"pump\":\"%s\",\"light\":\"%s\",\"mode\":\"%s\",\"soil_on\":%.1f,\"soil_off\":%.1f,\"light_on\":%.1f,\"light_off\":%.1f}",
s_air_temp,
s_air_hum,
s_soil,
s_lux,
s_pump_on ? "on" : "off",
s_light_on ? "on" : "off",
s_auto_control_enabled ? "auto" : "manual",
thresholds.pump_on_soil_below_pct,
thresholds.pump_off_soil_above_pct,
thresholds.light_on_lux_below,
thresholds.light_off_lux_above);
if (len <= 0 || len >= (int)sizeof(telemetry_payload))
{
return ESP_ERR_INVALID_SIZE;
}
return mqtt_control_publish_sensor(telemetry_payload, 0, 0);
}
static void update_status_web_snapshot(void)
{
status_web_snapshot_t snap = {0};
snprintf(snap.temp, sizeof(snap.temp), "%s", s_air_temp[0] ? s_air_temp : "--");
snprintf(snap.hum, sizeof(snap.hum), "%s", s_air_hum[0] ? s_air_hum : "--");
snprintf(snap.soil, sizeof(snap.soil), "%s", s_soil[0] ? s_soil : "--");
snprintf(snap.lux, sizeof(snap.lux), "%s", s_lux[0] ? s_lux : "--");
snap.pump_on = s_pump_on;
snap.light_on = s_light_on;
snap.auto_mode = s_auto_control_enabled;
auto_ctrl_thresholds_t thresholds = {0};
auto_ctrl_thresholds_get(&thresholds);
snap.soil_on_threshold = thresholds.pump_on_soil_below_pct;
snap.soil_off_threshold = thresholds.pump_off_soil_above_pct;
snap.light_on_threshold = thresholds.light_on_lux_below;
snap.light_off_threshold = thresholds.light_off_lux_above;
snap.i2c_ready = s_i2c_ready;
snap.soil_sensor_ready = s_soil_sensor_ready;
snap.loop_counter = s_main_loop_counter;
esp_err_t ret = status_web_update(&snap);
if (ret != ESP_OK && ret != ESP_ERR_INVALID_STATE)
{
ESP_LOGW(TAG, "status web update failed: %s", esp_err_to_name(ret));
}
}
/**
* @brief MQTT 控制命令处理函数
*
* 处理来自 MQTT 的控制命令,包括模式切换、阈值更新、水泵和补光灯控制。
*
* @param cmd 指向 MQTT 控制命令结构体的指针
* @param user_ctx 用户上下文(未使用)
* @return esp_err_t 处理结果
*/
static esp_err_t mqtt_control_command_handler(const mqtt_control_command_t *cmd, void *user_ctx)
{
(void)user_ctx;
ESP_RETURN_ON_FALSE(cmd != NULL, ESP_ERR_INVALID_ARG, TAG, "cmd is null");
esp_err_t final_ret = ESP_OK;
bool has_any_control = cmd->has_mode || cmd->has_thresholds || cmd->has_pump || cmd->has_light;
// 处理模式切换命令
if (cmd->has_mode)
{
s_auto_control_enabled = cmd->auto_mode;
ESP_LOGI(TAG, "MQTT 控制模式切换: %s", s_auto_control_enabled ? "auto" : "manual");
}
// 处理阈值更新命令
if (cmd->has_thresholds)
{
esp_err_t ret = auto_ctrl_thresholds_set_values(cmd->soil_on_pct,
cmd->soil_off_pct,
cmd->light_on_lux,
cmd->light_off_lux);
if (ret == ESP_OK)
{
ESP_LOGI(TAG,
"MQTT 更新阈值: soil_on=%.1f soil_off=%.1f light_on=%.1f light_off=%.1f",
cmd->soil_on_pct,
cmd->soil_off_pct,
cmd->light_on_lux,
cmd->light_off_lux);
}
else
{
ESP_LOGE(TAG, "设置阈值失败: %s", esp_err_to_name(ret));
final_ret = ret;
}
}
// 处理水泵控制命令
if (cmd->has_pump)
{
esp_err_t ret = io_device_control_set_pump(cmd->pump_on);
if (ret == ESP_OK)
{
s_pump_on = cmd->pump_on;
ESP_LOGI(TAG, "MQTT 控制水泵: %s", cmd->pump_on ? "on" : "off");
}
else
{
ESP_LOGE(TAG, "MQTT 控制水泵失败: %s", esp_err_to_name(ret));
final_ret = ret;
}
}
// 处理补光灯控制命令
if (cmd->has_light)
{
esp_err_t ret = io_device_control_set_light(cmd->light_on);
if (ret == ESP_OK)
{
s_light_on = cmd->light_on;
ESP_LOGI(TAG, "MQTT 控制补光灯: %s", cmd->light_on ? "on" : "off");
}
else
{
ESP_LOGE(TAG, "MQTT 控制补光灯失败: %s", esp_err_to_name(ret));
final_ret = ret;
}
}
// 任何控制指令处理后都立即上报最新状态(含阈值)作为回复。
if (has_any_control)
{
esp_err_t pub_ret = publish_telemetry_snapshot();
if (pub_ret != ESP_OK)
{
ESP_LOGW(TAG, "控制后立即上报失败: %s", esp_err_to_name(pub_ret));
if (final_ret == ESP_OK)
{
final_ret = pub_ret;
}
}
}
return final_ret;
}
/**
* @brief 将告警指标类型转换为字符串
*
* @param metric 告警指标类型
* @return const char* 对应的字符串表示
*/
static const char *alert_metric_text(auto_alert_metric_t metric)
{
switch (metric)
{
case AUTO_ALERT_METRIC_SOIL_MOISTURE:
return "soil";
case AUTO_ALERT_METRIC_LIGHT_INTENSITY:
return "light";
default:
return "unknown";
}
}
/**
* @brief 将告警状态转换为字符串
*
* @param state 告警状态
* @return const char* 对应的字符串表示
*/
static const char *alert_state_text(auto_alert_state_t state)
{
switch (state)
{
case AUTO_ALERT_STATE_NORMAL:
return "normal";
case AUTO_ALERT_STATE_ALARM:
return "alarm";
default:
return "unknown";
}
}
/**
* @brief 自动告警 MQTT 回调函数
*
* 当自动告警模块触发事件时,通过此函数将告警信息以 JSON 格式发布到 MQTT。
*
* @param event 指向告警事件结构体的指针
* @param user_ctx 用户上下文(未使用)
*/
static void auto_alert_mqtt_callback(const auto_alert_event_t *event, void *user_ctx)
{
(void)user_ctx;
if (event == NULL)
{
return;
}
// 使用明文发送报警简单的 JSON 字符串,格式示例:{"metric":"soil","state":"alarm"}
char payload[64] = {0};
int len = snprintf(payload,
sizeof(payload),
"{\"metric\":\"%s\",\"state\":\"%s\"}",
alert_metric_text(event->metric),
alert_state_text(event->state));
if (len <= 0 || len >= (int)sizeof(payload))
{
return;
}
if (!mqtt_control_is_connected())
{
return;
}
esp_err_t ret = mqtt_control_publish(BOTANY_MQTT_ALERT_TOPIC, payload, 1, 0);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "告警 MQTT 发布失败: %s", esp_err_to_name(ret));
}
}
/**
* @brief 自动控制逻辑更新函数
*
* 根据当前传感器数据和阈值,决定是否需要开启或关闭水泵和补光灯。
*
* @param soil_valid 土壤湿度数据是否有效
* @param soil_moisture_pct 当前土壤湿度百分比
* @param light_valid 光照数据是否有效
* @param light_lux 当前光照强度lux
* @param thresholds 指向阈值配置结构体的指针
* @param pump_on 指向当前水泵状态的指针(输入/输出)
* @param light_on 指向当前补光灯状态的指针(输入/输出)
*/
static void auto_control_update(bool soil_valid,
float soil_moisture_pct,
bool light_valid,
float light_lux,
const auto_ctrl_thresholds_t *thresholds,
bool *pump_on,
bool *light_on)
{
bool desired_pump = *pump_on;
bool desired_light = *light_on;
// 根据土壤湿度决定水泵状态
if (soil_valid)
{
if (!desired_pump && soil_moisture_pct < thresholds->pump_on_soil_below_pct)
{
desired_pump = true;
}
else if (desired_pump && soil_moisture_pct > thresholds->pump_off_soil_above_pct)
{
desired_pump = false;
}
}
// 根据光照强度决定补光灯状态
if (light_valid)
{
if (!desired_light && light_lux < thresholds->light_on_lux_below)
{
desired_light = true;
}
else if (desired_light && light_lux > thresholds->light_off_lux_above)
{
desired_light = false;
}
}
// 如果水泵状态需要改变,则执行控制
if (desired_pump != *pump_on)
{
esp_err_t ret = io_device_control_set_pump(desired_pump);
if (ret == ESP_OK)
{
*pump_on = desired_pump;
ESP_LOGI(TAG,
"自动控制: 水泵%s (土壤湿度=%.1f%%)",
desired_pump ? "开启" : "关闭",
soil_moisture_pct);
}
else
{
ESP_LOGE(TAG, "自动控制: 水泵控制失败: %s", esp_err_to_name(ret));
}
}
// 如果补光灯状态需要改变,则执行控制
if (desired_light != *light_on)
{
esp_err_t ret = io_device_control_set_light(desired_light);
if (ret == ESP_OK)
{
*light_on = desired_light;
ESP_LOGI(TAG,
"自动控制: 补光灯%s (光照=%.1f lux)",
desired_light ? "开启" : "关闭",
light_lux);
}
else
{
ESP_LOGE(TAG, "自动控制: 补光灯控制失败: %s", esp_err_to_name(ret));
}
}
}
/**
* @brief UI 任务函数
*
* 负责定期切换显示页面每3秒切换一次
*
* @param arg 任务参数(未使用)
*/
static void ui_task(void *arg)
{
(void)arg;
uint32_t elapsed_ms = 0;
enum ScreensEnum current = SCREEN_ID_TEMPERATURE;
const uint32_t switch_period_ms = 3000; // 每3秒切一次
for (;;)
{
lvgl_port_lock(0);
ui_tick();
elapsed_ms += 20;
if (elapsed_ms >= switch_period_ms) {
elapsed_ms = 0;
// 下一个页面1->2->3->4->1
if (current >= _SCREEN_ID_LAST) {
current = _SCREEN_ID_FIRST;
} else {
current = (enum ScreensEnum)(current + 1);
}
loadScreen(current);
}
lvgl_port_unlock();
vTaskDelay(pdMS_TO_TICKS(20));
}
}
/**
* @brief 等待 Wi-Fi 连接成功
*
* 在初始化 console 之前,确保 Wi-Fi 已连接成功最多等待120秒。
*/
static void wait_for_wifi_connected(void)
{
const uint32_t timeout_s = 120;
@@ -70,6 +483,11 @@ static void wait_for_wifi_connected(void)
ESP_LOGI(TAG, "Wi-Fi 已连接,开始初始化 console");
}
/**
* @brief 主函数
*
* 系统启动入口,初始化所有组件并进入主循环。
*/
void app_main(void)
{
// 初始化 Wi-Fi 配网组件,支持长按按键进入配网
@@ -79,7 +497,15 @@ void app_main(void)
// 启动 LVGL 演示程序,显示简单的界面
ESP_ERROR_CHECK(start_lvgl_demo());
// 初始化 IO 设备控制组件GPIO1 水泵GPIO0 光照,高电平有效
// 初始化 UI 组件(需在 LVGL 锁内进行对象创建
lvgl_port_lock(0);
ui_init();
lvgl_port_unlock();
BaseType_t ui_task_ok = xTaskCreate(ui_task, "ui_task", 4096, NULL, 5, NULL);
ESP_ERROR_CHECK(ui_task_ok == pdPASS ? ESP_OK : ESP_FAIL);
// 初始化 IO 设备控制组件GPIO1 水泵GPIO10 光照,高电平有效)
ESP_ERROR_CHECK(io_device_control_init());
i2c_master_messager_config_t i2c_cfg = {
@@ -111,62 +537,134 @@ void app_main(void)
else
{
i2c_ready = true;
s_i2c_ready = true;
}
// 按需求:仅在 Wi-Fi 确认连通后再初始化 console
// 初始化电容式土壤湿度传感器GPIO0 / ADC1_CH0
bool soil_ready = false;
cap_soil_sensor_config_t soil_cfg = {
.unit = CAP_SOIL_SENSOR_DEFAULT_UNIT,
.channel = CAP_SOIL_SENSOR_DEFAULT_CHANNEL,
.atten = ADC_ATTEN_DB_12,
.bitwidth = ADC_BITWIDTH_DEFAULT,
// 标定值来自当前实测:空气中约 3824水中约 1463。
.air_raw = 3824,
.water_raw = 1463,
};
ret = cap_soil_sensor_init(&soil_cfg);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "土壤湿度传感器初始化失败: %s", esp_err_to_name(ret));
}
else
{
soil_ready = true;
s_soil_sensor_ready = true;
}
// 按需求:仅在 Wi-Fi 确认连通后再初始化 MQTT和console。
wait_for_wifi_connected();
// 独立状态网页(端口 8080与配网页面端口 80互不干扰。
ESP_ERROR_CHECK(status_web_start(BOTANY_STATUS_WEB_PORT));
ESP_ERROR_CHECK(mqtt_control_register_command_handler(mqtt_control_command_handler, NULL));
ESP_ERROR_CHECK(mqtt_control_start()); // 启动 MQTT 客户端
ESP_ERROR_CHECK(console_cmd_init());
ESP_ERROR_CHECK(console_user_cmds_register());
ESP_ERROR_CHECK(console_cmd_all_register()); // 可选:自动注册插件命令
ESP_ERROR_CHECK(console_cmd_start());
auto_ctrl_thresholds_init_defaults();
auto_alerts_init();
ESP_ERROR_CHECK(auto_alerts_register_callback(auto_alert_mqtt_callback, NULL));
auto_ctrl_thresholds_t thresholds = {0};
auto_ctrl_thresholds_get(&thresholds);
uint32_t telemetry_elapsed_ms = 0;
ESP_LOGI(TAG,
"自动控制阈值: pump_on<%.1f%%, pump_off>%.1f%%, light_on<%.1flux, light_off>%.1flux",
thresholds.pump_on_soil_below_pct,
thresholds.pump_off_soil_above_pct,
thresholds.light_on_lux_below,
thresholds.light_off_lux_above);
for (;;)
{
s_main_loop_counter++;
// 预留给 MQTT 回调动态更新阈值:每个周期读取最新配置。
auto_ctrl_thresholds_get(&thresholds);
bool soil_valid = false;
float soil_moisture_pct = 0.0f;
cap_soil_sensor_data_t soil_data = {0};
if (soil_ready && cap_soil_sensor_read(&soil_data) == ESP_OK)
{
// 读取成功
soil_valid = true;
soil_moisture_pct = soil_data.moisture_percent;
snprintf(s_soil, sizeof(s_soil), "%.0f", soil_data.moisture_percent);
set_var_soil_moisture(s_soil);
}
bool light_valid = false;
float light_lux = 0.0f;
i2c_master_messager_data_t sensor_data = {0};
if (i2c_ready && i2c_master_messager_get_data(&sensor_data) == ESP_OK)
{
char text[64] = {0};
// 读取成功
if (sensor_data.aht30.valid)
{
snprintf(s_air_temp, sizeof(s_air_temp), "%.1f", sensor_data.aht30.temperature_c);
set_var_air_temperature(s_air_temp);
snprintf(s_air_hum, sizeof(s_air_hum), "%.1f", sensor_data.aht30.humidity_rh);
set_var_air_humidity(s_air_hum);
}
if (sensor_data.bh1750.valid)
{
light_valid = true;
light_lux = sensor_data.bh1750.lux;
snprintf(s_lux, sizeof(s_lux), "%.0f", sensor_data.bh1750.lux);
set_var_light_intensity(s_lux);
}
}
if (BOTANY_BH1750_ENABLE && BOTANY_AHT30_ENABLE &&
sensor_data.bh1750.valid && sensor_data.aht30.valid)
{
snprintf(text,
sizeof(text),
"L:%.0f T:%.1fC\nH:%.1f%%",
sensor_data.bh1750.lux,
sensor_data.aht30.temperature_c,
sensor_data.aht30.humidity_rh);
ESP_ERROR_CHECK(lvgl_st7735s_set_center_text(text));
}
else if (BOTANY_BH1750_ENABLE && sensor_data.bh1750.valid)
{
snprintf(text, sizeof(text), "Light: %.1f lx", sensor_data.bh1750.lux);
ESP_ERROR_CHECK(lvgl_st7735s_set_center_text(text));
}
else if (BOTANY_AHT30_ENABLE && sensor_data.aht30.valid)
{
snprintf(text,
sizeof(text),
"T:%.1fC\nH:%.1f%%",
sensor_data.aht30.temperature_c,
sensor_data.aht30.humidity_rh);
ESP_ERROR_CHECK(lvgl_st7735s_set_center_text(text));
}
else
{
ESP_ERROR_CHECK(lvgl_st7735s_set_center_text("Sensor waiting..."));
}
}
else if (i2c_ready)
if (s_auto_control_enabled)
{
ESP_ERROR_CHECK(lvgl_st7735s_set_center_text("Sensor read fail"));
auto_control_update(soil_valid,
soil_moisture_pct,
light_valid,
light_lux,
&thresholds,
&s_pump_on,
&s_light_on);
}
else
// 预留给 MQTT回调注册后可在此处收到边沿告警事件并发布。
auto_alerts_evaluate(soil_valid,
soil_moisture_pct,
light_valid,
light_lux,
&thresholds);
update_status_web_snapshot();
telemetry_elapsed_ms += 1000;
if (telemetry_elapsed_ms >= BOTANY_MQTT_TELEMETRY_PERIOD_MS)
{
vTaskDelay(pdMS_TO_TICKS(2000));
telemetry_elapsed_ms = 0;
esp_err_t pub_ret = publish_telemetry_snapshot();
if (pub_ret != ESP_OK && pub_ret != ESP_ERR_INVALID_STATE)
{
ESP_LOGW(TAG, "周期状态上报失败: %s", esp_err_to_name(pub_ret));
}
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
}

256
main/status_web.c Normal file
View File

@@ -0,0 +1,256 @@
#include "status_web.h"
#include <stdio.h>
#include <string.h>
#include "esp_app_desc.h"
#include "esp_check.h"
#include "esp_heap_caps.h"
#include "esp_http_server.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_netif_ip_addr.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "mqtt_control.h"
#include "wifi-connect.h"
static const char *TAG = "status_web";
static httpd_handle_t s_server = NULL;
static SemaphoreHandle_t s_lock = NULL;
static uint64_t s_snapshot_update_ms = 0;
static uint32_t s_snapshot_update_count = 0;
static status_web_snapshot_t s_snapshot = {
.temp = "--",
.hum = "--",
.soil = "--",
.lux = "--",
.pump_on = false,
.light_on = false,
.auto_mode = true,
.soil_on_threshold = 35.0f,
.soil_off_threshold = 45.0f,
.light_on_threshold = 100.0f,
.light_off_threshold = 350.0f,
.i2c_ready = false,
.soil_sensor_ready = false,
.loop_counter = 0,
};
static const char *wifi_status_text(wifi_connect_status_t status)
{
switch (status) {
case WIFI_CONNECT_STATUS_IDLE: return "idle";
case WIFI_CONNECT_STATUS_PROVISIONING: return "provisioning";
case WIFI_CONNECT_STATUS_CONNECTING: return "connecting";
case WIFI_CONNECT_STATUS_CONNECTED: return "connected";
case WIFI_CONNECT_STATUS_FAILED: return "failed";
case WIFI_CONNECT_STATUS_TIMEOUT: return "timeout";
default: return "unknown";
}
}
static void get_sta_ip_text(char *out, size_t out_size)
{
if (out == NULL || out_size == 0) {
return;
}
snprintf(out, out_size, "--");
esp_netif_t *sta = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
if (sta == NULL) {
return;
}
esp_netif_ip_info_t ip_info;
if (esp_netif_get_ip_info(sta, &ip_info) == ESP_OK) {
snprintf(out,
out_size,
IPSTR,
IP2STR(&ip_info.ip));
}
}
static const char *s_page_html =
"<!doctype html><html><head><meta charset='utf-8'/>"
"<meta name='viewport' content='width=device-width, initial-scale=1'/>"
"<title>BotanicalBuddy Status</title>"
"<style>"
"body{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#eef2f7;margin:0;padding:14px;color:#111827;}"
".wrap{max-width:1080px;margin:0 auto;background:#fff;border-radius:14px;padding:14px;box-shadow:0 8px 24px rgba(0,0,0,.08);}"
"h1{font-size:20px;margin:0 0 10px;}"
".meta{font-size:12px;color:#6b7280;margin-bottom:10px;}"
".sec{margin-top:10px;}"
".sec h2{font-size:14px;margin:0 0 6px;color:#374151;}"
".grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;}"
"@media(max-width:900px){.grid{grid-template-columns:1fr 1fr;}}"
"@media(max-width:560px){.grid{grid-template-columns:1fr;}}"
".card{padding:10px;border:1px solid #e5e7eb;border-radius:10px;background:#fafafa;}"
".k{font-size:12px;color:#6b7280;}"
".v{font-size:17px;font-weight:600;margin-top:2px;word-break:break-all;}"
"#raw{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;background:#0f172a;color:#e2e8f0;padding:10px;border-radius:10px;overflow:auto;max-height:260px;}"
"button{margin-top:10px;border:none;border-radius:8px;background:#1d4ed8;color:#fff;padding:8px 12px;cursor:pointer;}"
"</style></head><body><div class='wrap'>"
"<h1>BotanicalBuddy 设备状态总览</h1>"
"<div class='meta'>独立状态服务port 8080每2秒自动刷新</div>"
"<div class='sec'><h2>传感与控制</h2><div class='grid'>"
"<div class='card'><div class='k'>空气温度</div><div id='temp' class='v'>--</div></div>"
"<div class='card'><div class='k'>空气湿度</div><div id='hum' class='v'>--</div></div>"
"<div class='card'><div class='k'>土壤湿度</div><div id='soil' class='v'>--</div></div>"
"<div class='card'><div class='k'>光照强度</div><div id='lux' class='v'>--</div></div>"
"<div class='card'><div class='k'>水泵</div><div id='pump' class='v'>--</div></div>"
"<div class='card'><div class='k'>补光灯</div><div id='light' class='v'>--</div></div>"
"<div class='card'><div class='k'>控制模式</div><div id='mode' class='v'>--</div></div>"
"<div class='card'><div class='k'>soil_on/off</div><div id='soil_th' class='v'>--</div></div>"
"<div class='card'><div class='k'>light_on/off</div><div id='light_th' class='v'>--</div></div>"
"</div></div>"
"<div class='sec'><h2>连接与系统</h2><div class='grid'>"
"<div class='card'><div class='k'>Wi-Fi 状态</div><div id='wifi' class='v'>--</div></div>"
"<div class='card'><div class='k'>STA IP</div><div id='ip' class='v'>--</div></div>"
"<div class='card'><div class='k'>MQTT 连接</div><div id='mqtt' class='v'>--</div></div>"
"<div class='card'><div class='k'>I2C Ready</div><div id='i2c' class='v'>--</div></div>"
"<div class='card'><div class='k'>Soil Sensor Ready</div><div id='soil_ready' class='v'>--</div></div>"
"<div class='card'><div class='k'>主循环计数</div><div id='loop' class='v'>--</div></div>"
"<div class='card'><div class='k'>运行时长</div><div id='uptime' class='v'>--</div></div>"
"<div class='card'><div class='k'>空闲堆/最小堆</div><div id='heap' class='v'>--</div></div>"
"<div class='card'><div class='k'>固件版本</div><div id='ver' class='v'>--</div></div>"
"<div class='card'><div class='k'>快照更新时间</div><div id='snap' class='v'>--</div></div>"
"<div class='card'><div class='k'>快照序号</div><div id='seq' class='v'>--</div></div>"
"<div class='card'><div class='k'>快照年龄</div><div id='age' class='v'>--</div></div>"
"</div></div>"
"<div class='sec'><h2>原始 JSON</h2><pre id='raw'>{}</pre></div>"
"<button onclick='loadStatus()'>立即刷新</button>"
"</div><script>"
"function onoff(v){return v?'on':'off';}"
"function yn(v){return v?'yes':'no';}"
"function fmtMs(ms){if(ms<1000)return ms+' ms';const s=Math.floor(ms/1000);if(s<60)return s+' s';const m=Math.floor(s/60);const rs=s%60;if(m<60)return m+'m '+rs+'s';const h=Math.floor(m/60);return h+'h '+(m%60)+'m';}"
"async function loadStatus(){try{const r=await fetch('/api/status');const d=await r.json();"
"temp.textContent=d.temp;hum.textContent=d.hum;soil.textContent=d.soil;lux.textContent=d.lux;"
"pump.textContent=d.pump;light.textContent=d.light;mode.textContent=d.mode;"
"soil_th.textContent=`${d.soil_on}/${d.soil_off}`;light_th.textContent=`${d.light_on}/${d.light_off}`;"
"wifi.textContent=d.wifi_status;ip.textContent=d.sta_ip;mqtt.textContent=onoff(d.mqtt_connected);"
"i2c.textContent=yn(d.i2c_ready);soil_ready.textContent=yn(d.soil_sensor_ready);"
"loop.textContent=d.loop_counter;uptime.textContent=fmtMs(d.uptime_ms);"
"heap.textContent=`${d.free_heap}/${d.min_free_heap}`;ver.textContent=d.app_version;"
"snap.textContent=d.snapshot_update_ms;seq.textContent=d.snapshot_update_count;age.textContent=fmtMs(d.snapshot_age_ms);"
"raw.textContent=JSON.stringify(d,null,2);"
"}catch(e){raw.textContent='读取失败: '+e;}}"
"setInterval(loadStatus,2000);loadStatus();"
"</script></body></html>";
static esp_err_t status_root_handler(httpd_req_t *req)
{
httpd_resp_set_type(req, "text/html");
return httpd_resp_send(req, s_page_html, HTTPD_RESP_USE_STRLEN);
}
static esp_err_t status_api_handler(httpd_req_t *req)
{
status_web_snapshot_t snap;
uint64_t snapshot_update_ms = 0;
uint32_t snapshot_update_count = 0;
xSemaphoreTake(s_lock, portMAX_DELAY);
snap = s_snapshot;
snapshot_update_ms = s_snapshot_update_ms;
snapshot_update_count = s_snapshot_update_count;
xSemaphoreGive(s_lock);
const esp_app_desc_t *app_desc = esp_app_get_description();
uint64_t now_ms = (uint64_t)(esp_timer_get_time() / 1000);
uint64_t snapshot_age_ms = (snapshot_update_ms > 0 && now_ms >= snapshot_update_ms) ? (now_ms - snapshot_update_ms) : 0;
const uint32_t free_heap = esp_get_free_heap_size();
const uint32_t min_free_heap = esp_get_minimum_free_heap_size();
const uint32_t largest_block = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
const bool mqtt_connected = mqtt_control_is_connected();
const wifi_connect_status_t wifi_status = wifi_connect_get_status();
char ip_text[16] = {0};
get_sta_ip_text(ip_text, sizeof(ip_text));
char json[640];
int len = snprintf(json,
sizeof(json),
"{\"temp\":\"%s\",\"hum\":\"%s\",\"soil\":\"%s\",\"lux\":\"%s\",\"pump\":\"%s\",\"light\":\"%s\",\"mode\":\"%s\",\"soil_on\":%.1f,\"soil_off\":%.1f,\"light_on\":%.1f,\"light_off\":%.1f,\"wifi_status\":\"%s\",\"sta_ip\":\"%s\",\"mqtt_connected\":%s,\"i2c_ready\":%s,\"soil_sensor_ready\":%s,\"loop_counter\":%lu,\"uptime_ms\":%llu,\"free_heap\":%lu,\"min_free_heap\":%lu,\"largest_block\":%lu,\"app_version\":\"%s\",\"snapshot_update_ms\":%llu,\"snapshot_update_count\":%lu,\"snapshot_age_ms\":%llu}",
snap.temp,
snap.hum,
snap.soil,
snap.lux,
snap.pump_on ? "on" : "off",
snap.light_on ? "on" : "off",
snap.auto_mode ? "auto" : "manual",
snap.soil_on_threshold,
snap.soil_off_threshold,
snap.light_on_threshold,
snap.light_off_threshold,
wifi_status_text(wifi_status),
ip_text,
mqtt_connected ? "true" : "false",
snap.i2c_ready ? "true" : "false",
snap.soil_sensor_ready ? "true" : "false",
(unsigned long)snap.loop_counter,
(unsigned long long)now_ms,
(unsigned long)free_heap,
(unsigned long)min_free_heap,
(unsigned long)largest_block,
app_desc ? app_desc->version : "unknown",
(unsigned long long)snapshot_update_ms,
(unsigned long)snapshot_update_count,
(unsigned long long)snapshot_age_ms);
if (len <= 0 || len >= (int)sizeof(json)) {
return ESP_FAIL;
}
httpd_resp_set_type(req, "application/json");
return httpd_resp_sendstr(req, json);
}
esp_err_t status_web_start(uint16_t port)
{
if (s_server != NULL) {
return ESP_OK;
}
if (s_lock == NULL) {
s_lock = xSemaphoreCreateMutex();
ESP_RETURN_ON_FALSE(s_lock != NULL, ESP_ERR_NO_MEM, TAG, "create mutex failed");
}
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.server_port = port;
config.ctrl_port = (uint16_t)(port + 1);
ESP_RETURN_ON_ERROR(httpd_start(&s_server, &config), TAG, "httpd_start failed");
const httpd_uri_t root = {
.uri = "/",
.method = HTTP_GET,
.handler = status_root_handler,
.user_ctx = NULL,
};
const httpd_uri_t api = {
.uri = "/api/status",
.method = HTTP_GET,
.handler = status_api_handler,
.user_ctx = NULL,
};
ESP_RETURN_ON_ERROR(httpd_register_uri_handler(s_server, &root), TAG, "register root failed");
ESP_RETURN_ON_ERROR(httpd_register_uri_handler(s_server, &api), TAG, "register api failed");
ESP_LOGI(TAG, "status web started at port %u", (unsigned)port);
return ESP_OK;
}
esp_err_t status_web_update(const status_web_snapshot_t *snapshot)
{
ESP_RETURN_ON_FALSE(snapshot != NULL, ESP_ERR_INVALID_ARG, TAG, "snapshot is null");
ESP_RETURN_ON_FALSE(s_lock != NULL, ESP_ERR_INVALID_STATE, TAG, "status web not started");
xSemaphoreTake(s_lock, portMAX_DELAY);
s_snapshot = *snapshot;
s_snapshot_update_ms = (uint64_t)(esp_timer_get_time() / 1000);
s_snapshot_update_count++;
xSemaphoreGive(s_lock);
return ESP_OK;
}

34
main/status_web.h Normal file
View File

@@ -0,0 +1,34 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
char temp[16];
char hum[16];
char soil[16];
char lux[16];
bool pump_on;
bool light_on;
bool auto_mode;
float soil_on_threshold;
float soil_off_threshold;
float light_on_threshold;
float light_off_threshold;
bool i2c_ready;
bool soil_sensor_ready;
uint32_t loop_counter;
} status_web_snapshot_t;
esp_err_t status_web_start(uint16_t port);
esp_err_t status_web_update(const status_web_snapshot_t *snapshot);
#ifdef __cplusplus
}
#endif

4
partitions.csv Normal file
View File

@@ -0,0 +1,4 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 0x200000,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 0x9000 0x6000
3 phy_init data phy 0xf000 0x1000
4 factory app factory 0x10000 0x200000